diff --git a/script/sql/zfjd-refactoring-v1/011-1-重建虚拟单位树.sql b/script/sql/zfjd-refactoring-v1/011-1-重建虚拟单位树.sql index 27d7475a..f9199e45 100644 --- a/script/sql/zfjd-refactoring-v1/011-1-重建虚拟单位树.sql +++ b/script/sql/zfjd-refactoring-v1/011-1-重建虚拟单位树.sql @@ -27,6 +27,7 @@ create table efcode_virtual_unit create table efcode_virtual_unit_user ( vir_user_id varchar(100) not null comment '主键ID' primary key, + vir_unit_id varchar(100) null comment '虚拟单位ID,关联efcode_virtual_unit.vir_id', sys_user_id varchar(100) null comment '真实用户id,关联sys_user.user_id', remark varchar(200) null comment '备注', order_num int default 0 null comment '显示顺序', diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/EfcodeVirtualUnitUser.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/EfcodeVirtualUnitUser.java index e29a4e2c..e6cbf45a 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/EfcodeVirtualUnitUser.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/EfcodeVirtualUnitUser.java @@ -27,6 +27,11 @@ public class EfcodeVirtualUnitUser extends BaseEntity { @TableId(value = "vir_user_id") private String virUserId; + /** + * 虚拟单位ID,关联efcode_virtual_unit.vir_id + */ + private String virUnitId; + /** * 真实用户id,关联sys_user.user_id */ diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeVirtualUnitUserBo.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeVirtualUnitUserBo.java index 40fd5f5d..3ed1612a 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeVirtualUnitUserBo.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeVirtualUnitUserBo.java @@ -26,6 +26,11 @@ public class EfcodeVirtualUnitUserBo extends BaseEntity { @NotBlank(message = "主键ID不能为空", groups = { EditGroup.class }) private String virUserId; + /** + * 虚拟单位ID,关联efcode_virtual_unit.vir_id + */ + private String virUnitId; + /** * 真实用户id,关联sys_user.user_id */ diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserBo.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserBo.java new file mode 100644 index 00000000..53bdb018 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserBo.java @@ -0,0 +1,31 @@ +package com.zdxt.enforcementcode.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 虚拟单位引用人员BO + */ +@Data +public class RefUserBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 虚拟单位ID + */ + @NotBlank(message = "虚拟单位ID不能为空") + private String virUnitId; + + /** + * 真实用户ID集合 + */ + @NotEmpty(message = "请选择人员") + private List sysUserIds; +} diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserRemarkBo.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserRemarkBo.java new file mode 100644 index 00000000..51b89dc7 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/bo/RefUserRemarkBo.java @@ -0,0 +1,35 @@ +package com.zdxt.enforcementcode.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 虚拟单位引用人员备注BO + */ +@Data +public class RefUserRemarkBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 虚拟单位ID + */ + @NotBlank(message = "虚拟单位ID不能为空") + private String virUnitId; + + /** + * 真实用户ID + */ + @NotNull(message = "用户ID不能为空") + private Long sysUserId; + + /** + * 备注 + */ + private String remark; +} diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeVirtualUnitUserVo.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeVirtualUnitUserVo.java index 9ffee653..030b77b9 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeVirtualUnitUserVo.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeVirtualUnitUserVo.java @@ -34,6 +34,12 @@ public class EfcodeVirtualUnitUserVo implements Serializable { @ExcelProperty(value = "主键ID") private String virUserId; + /** + * 虚拟单位ID,关联efcode_virtual_unit.vir_id + */ + @ExcelProperty(value = "虚拟单位ID,关联efcode_virtual_unit.vir_id") + private String virUnitId; + /** * 真实用户id,关联sys_user.user_id */ diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/UnitUserVo.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/UnitUserVo.java index f93493b9..40011195 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/UnitUserVo.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/domain/vo/UnitUserVo.java @@ -58,4 +58,9 @@ public class UnitUserVo implements Serializable { * 人员来源(10=本系统新增) */ private Integer userSource; + + /** + * 引用备注(仅引用人员列表使用,来自efcode_virtual_unit_user.remark) + */ + private String remark; } diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitMapper.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitMapper.java index 5efd88b4..6c0d1e22 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitMapper.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitMapper.java @@ -33,6 +33,17 @@ public interface EfcodeVirtualUnitMapper extends BaseMapperPlus selectReferencedUsers(Page page, + @Param("virUnitId") String virUnitId, + @Param("keyword") String keyword); + /** * 查询指定节点的子孙级虚拟单位(按查询/统计/业务条件过滤) * diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitUserMapper.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitUserMapper.java index 8f453cd6..0511cb8c 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitUserMapper.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeVirtualUnitUserMapper.java @@ -2,6 +2,7 @@ package com.zdxt.enforcementcode.mapper; import com.zdxt.enforcementcode.domain.EfcodeVirtualUnitUser; import com.zdxt.enforcementcode.domain.vo.EfcodeVirtualUnitUserVo; +import org.apache.ibatis.annotations.Mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** @@ -10,6 +11,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; * @author Lion Li * @date 2026-07-07 */ +@Mapper public interface EfcodeVirtualUnitUserMapper extends BaseMapperPlus { } diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java index b7a8e810..c825a467 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java @@ -105,6 +105,41 @@ public interface IEfcodeVirtualUnitService { */ TableDataInfo queryUsersBySysDeptId(String sysDeptId, String keyword, boolean globalSearch, PageQuery pageQuery); + /** + * 分页查询虚拟单位引用的人员列表 + * + * @param virUnitId 虚拟单位ID + * @param keyword 搜索关键字(可选) + * @param pageQuery 分页参数 + * @return 人员分页列表 + */ + TableDataInfo queryReferencedUsers(String virUnitId, String keyword, PageQuery pageQuery); + + /** + * 新增虚拟单位引用人员(批量,已存在的自动跳过) + * + * @param virUnitId 虚拟单位ID + * @param sysUserIds 真实用户ID集合 + */ + void addReferencedUsers(String virUnitId, List sysUserIds); + + /** + * 移除虚拟单位引用人员 + * + * @param virUnitId 虚拟单位ID + * @param sysUserIds 真实用户ID集合 + */ + void deleteReferencedUsers(String virUnitId, List sysUserIds); + + /** + * 修改虚拟单位引用人员的备注 + * + * @param virUnitId 虚拟单位ID + * @param sysUserId 真实用户ID + * @param remark 备注 + */ + void updateReferencedUserRemark(String virUnitId, Long sysUserId, String remark); + /** * 是否存在子节点 * diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java index 1781c39b..b7fbf81e 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java @@ -23,7 +23,9 @@ import com.zdxt.enforcementcode.domain.vo.EfcodeVirtualUnitVo; import com.zdxt.enforcementcode.domain.vo.UnitUserVo; import com.zdxt.enforcementcode.domain.vo.VirtualUnitDeptTreeVo; import com.zdxt.enforcementcode.domain.EfcodeVirtualUnit; +import com.zdxt.enforcementcode.domain.EfcodeVirtualUnitUser; import com.zdxt.enforcementcode.mapper.EfcodeVirtualUnitMapper; +import com.zdxt.enforcementcode.mapper.EfcodeVirtualUnitUserMapper; import com.zdxt.enforcementcode.service.IEfcodeVirtualUnitService; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysUser; @@ -48,6 +50,7 @@ import java.util.stream.Collectors; public class EfcodeVirtualUnitServiceImpl implements IEfcodeVirtualUnitService { private final EfcodeVirtualUnitMapper baseMapper; + private final EfcodeVirtualUnitUserMapper virtualUnitUserMapper; private final SysDeptMapper sysDeptMapper; private final SrzDeptMapper srzDeptMapper; private final SysUserMapper sysUserMapper; @@ -264,6 +267,89 @@ public class EfcodeVirtualUnitServiceImpl implements IEfcodeVirtualUnitService { return TableDataInfo.build(page); } + /** + * 分页查询虚拟单位引用的人员列表 + * SQL实现参见 EfcodeVirtualUnitMapper.xml#selectReferencedUsers + */ + @Override + public TableDataInfo queryReferencedUsers(String virUnitId, String keyword, PageQuery pageQuery) { + if (StringUtils.isBlank(virUnitId)) { + return TableDataInfo.build(new Page<>()); + } + IPage page = baseMapper.selectReferencedUsers(pageQuery.build(), virUnitId, keyword); + return TableDataInfo.build(page); + } + + /** + * 新增虚拟单位引用人员(批量,已存在的自动跳过) + */ + @Override + public void addReferencedUsers(String virUnitId, List sysUserIds) { + if (StringUtils.isBlank(virUnitId)) { + throw new ServiceException("虚拟单位ID不能为空"); + } + if (sysUserIds == null || sysUserIds.isEmpty()) { + throw new ServiceException("请选择要引用的人员"); + } + // 查询该单位已引用的用户,过滤重复 + List existList = virtualUnitUserMapper.selectList( + Wrappers.lambdaQuery() + .eq(EfcodeVirtualUnitUser::getVirUnitId, virUnitId) + ); + Set existUserIds = existList.stream() + .map(EfcodeVirtualUnitUser::getSysUserId) + .collect(Collectors.toSet()); + for (Long sysUserId : sysUserIds) { + if (sysUserId == null || existUserIds.contains(String.valueOf(sysUserId))) { + continue; + } + EfcodeVirtualUnitUser entity = new EfcodeVirtualUnitUser(); + entity.setVirUserId(UUID.randomUUID().toString().replace("-", "")); + entity.setVirUnitId(virUnitId); + entity.setSysUserId(String.valueOf(sysUserId)); + entity.setOrderNum(0L); + virtualUnitUserMapper.insert(entity); + } + } + + /** + * 移除虚拟单位引用人员 + */ + @Override + public void deleteReferencedUsers(String virUnitId, List sysUserIds) { + if (StringUtils.isBlank(virUnitId)) { + throw new ServiceException("虚拟单位ID不能为空"); + } + if (sysUserIds == null || sysUserIds.isEmpty()) { + throw new ServiceException("请选择要移除的人员"); + } + List ids = sysUserIds.stream() + .filter(Objects::nonNull) + .map(String::valueOf) + .collect(Collectors.toList()); + virtualUnitUserMapper.delete( + Wrappers.lambdaQuery() + .eq(EfcodeVirtualUnitUser::getVirUnitId, virUnitId) + .in(EfcodeVirtualUnitUser::getSysUserId, ids) + ); + } + + /** + * 修改虚拟单位引用人员的备注 + */ + @Override + public void updateReferencedUserRemark(String virUnitId, Long sysUserId, String remark) { + if (StringUtils.isBlank(virUnitId) || sysUserId == null) { + throw new ServiceException("参数不能为空"); + } + virtualUnitUserMapper.update(null, + Wrappers.lambdaUpdate() + .set(EfcodeVirtualUnitUser::getRemark, remark) + .eq(EfcodeVirtualUnitUser::getVirUnitId, virUnitId) + .eq(EfcodeVirtualUnitUser::getSysUserId, String.valueOf(sysUserId)) + ); + } + /** * 是否存在子节点 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java index dd6621f4..03d9d648 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java @@ -22,6 +22,8 @@ import com.zdxt.enforcementcode.domain.vo.UnitUserVo; import com.zdxt.enforcementcode.domain.vo.VirtualUnitDeptTreeVo; import com.zdxt.enforcementcode.domain.bo.EfcodeVirtualUnitBo; import com.zdxt.enforcementcode.domain.bo.UnitUserBo; +import com.zdxt.enforcementcode.domain.bo.RefUserBo; +import com.zdxt.enforcementcode.domain.bo.RefUserRemarkBo; import com.zdxt.enforcementcode.service.IEfcodeVirtualUnitService; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.core.exception.ServiceException; @@ -96,6 +98,51 @@ public class EfcodeVirtualUnitController extends BaseController { return efcodeVirtualUnitService.queryUsersBySysDeptId(sysDeptId, keyword, globalSearch, pageQuery); } + /** + * 分页查询虚拟单位引用的人员列表 + * + * @param virUnitId 虚拟单位ID + * @param keyword 搜索关键字 + */ + @GetMapping("/refUsers") + public TableDataInfo queryReferencedUsers( + @RequestParam String virUnitId, + @RequestParam(required = false) String keyword, + PageQuery pageQuery) { + return efcodeVirtualUnitService.queryReferencedUsers(virUnitId, keyword, pageQuery); + } + + /** + * 新增虚拟单位引用人员 + */ + @Log(title = "引用人员", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/refUser") + public R addReferencedUsers(@Validated @RequestBody RefUserBo bo) { + efcodeVirtualUnitService.addReferencedUsers(bo.getVirUnitId(), bo.getSysUserIds()); + return R.ok(); + } + + /** + * 移除虚拟单位引用人员 + */ + @Log(title = "引用人员", businessType = BusinessType.DELETE) + @DeleteMapping("/refUser") + public R deleteReferencedUsers(@Validated @RequestBody RefUserBo bo) { + efcodeVirtualUnitService.deleteReferencedUsers(bo.getVirUnitId(), bo.getSysUserIds()); + return R.ok(); + } + + /** + * 修改虚拟单位引用人员备注 + */ + @Log(title = "引用人员", businessType = BusinessType.UPDATE) + @PutMapping("/refUser/remark") + public R updateReferencedUserRemark(@Validated @RequestBody RefUserRemarkBo bo) { + efcodeVirtualUnitService.updateReferencedUserRemark(bo.getVirUnitId(), bo.getSysUserId(), bo.getRemark()); + return R.ok(); + } + /** * 导出虚拟单位树列表 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeVirtualUnitMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeVirtualUnitMapper.xml index e949f0e8..3eb779ea 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeVirtualUnitMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeVirtualUnitMapper.xml @@ -40,6 +40,33 @@ ORDER BY u.dept_id ASC, u.user_id ASC + + +