From 07d07c8f5f3c6ab29c774cb5f67c7283df75fae1 Mon Sep 17 00:00:00 2001 From: dk <1260500659@qq.com> Date: Tue, 14 Apr 2026 16:32:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(UserManagementRelationxxx.java):=20?= =?UTF-8?q?=E6=94=B9=E9=80=A0=E5=B8=A6=E4=BA=BA=E5=85=B3=E7=B3=BB=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E6=9E=84=E9=80=A0=E4=BB=A3=E7=A0=81=E3=80=82=20feat(U?= =?UTF-8?q?serController.java):=20=E6=96=B0=E5=A2=9E/list-by-dept-id?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=A0=B9=E6=8D=AE=E9=83=A8=E9=97=A8?= =?UTF-8?q?ID=E8=8E=B7=E5=8F=96=E8=AF=A5=E9=83=A8=E9=97=A8=E5=92=8C?= =?UTF-8?q?=E4=B8=8B=E5=B1=9E=E9=83=A8=E9=97=A8=E7=9A=84=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=B2=BE=E7=AE=80=E4=BF=A1=E6=81=AF=E5=88=97=E8=A1=A8=E3=80=82?= =?UTF-8?q?=20fix(AdminUserServiceImpl.java):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=9F=90=E7=94=A8=E6=88=B7=EF=BC=88=E5=90=AB?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=EF=BC=89=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=B8=A6=E4=BA=BA=E5=85=B3=E7=B3=BB=E6=A0=91=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E9=94=99=E4=B9=B1=E3=80=81=E5=8A=A0=E8=BD=BD=E4=B8=8D=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 1 + .../controller/admin/user/UserController.java | 9 ++++ .../UserManagementRelationController.java | 4 +- .../UserManagementRelationQueryReqVO.java | 5 ++ .../system/service/user/AdminUserService.java | 7 +++ .../service/user/AdminUserServiceImpl.java | 50 +++++++++---------- .../user/UserManagementRelationService.java | 12 ++++- .../UserManagementRelationServiceImpl.java | 46 +++++++++++++++-- 8 files changed, 101 insertions(+), 33 deletions(-) diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java index ec2c205..fbb78c3 100644 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java +++ b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java @@ -57,6 +57,7 @@ public interface ErrorCodeConstants { // ========== 用户带人关系模块 1-002-003-100 ========== ErrorCode USER_MANAGEMENT_RELATION_NOT_FOUND = new ErrorCode(1_002_003_100, "用户带人关系不存在"); ErrorCode USER_MANAGEMENT_RELATION_MANAGER_EXISTS = new ErrorCode(1_002_003_101, "该用户已有直属上级,不能重复添加"); + ErrorCode USER_MANAGEMENT_RELATION_EXISTS = new ErrorCode(1_002_003_102, "该用户在带人关系中还在使用,不可删除!"); // ========== 部门模块 1-002-004-000 ========== ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserController.java index 902ca0b..a68586a 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserController.java @@ -141,6 +141,15 @@ public class UserController { return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); } + @GetMapping("/list-by-dept-id") + @Operation(summary = "根据部门ID获取该部门和下属部门的用户精简信息列表") + @Parameter(name = "deptId", description = "部门ID", required = true) + public CommonResult> getUserListByDeptId(@RequestParam("deptId") Long deptId) { + List list = userService.getAllUserByDeptId(deptId); + Map deptMap = deptService.getDeptMap(convertList(list, AdminUserDO::getDeptId)); + return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); + } + @GetMapping("/get") @Operation(summary = "获得用户详情") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserManagementRelationController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserManagementRelationController.java index 59c239f..603a03f 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserManagementRelationController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/UserManagementRelationController.java @@ -163,8 +163,8 @@ public class UserManagementRelationController { @GetMapping("/tree") @Operation(summary = "获取用户带人关系树形结构", description = "用于前端树形控件展示,包含用户的上下级层级关系") @PreAuthorize("@ss.hasPermission('system:user-management-relation:query')") - public CommonResult> getUserManagementRelationTree() { - return success(userManagementRelationService.getRelationTree()); + public CommonResult> getUserManagementRelationTree(@Validated UserManagementRelationQueryReqVO reqVO) { + return success(userManagementRelationService.getRelationTree(reqVO)); } diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/vo/userManagementRelation/UserManagementRelationQueryReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/vo/userManagementRelation/UserManagementRelationQueryReqVO.java index a15b85d..aaef318 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/vo/userManagementRelation/UserManagementRelationQueryReqVO.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/user/vo/userManagementRelation/UserManagementRelationQueryReqVO.java @@ -13,4 +13,9 @@ public class UserManagementRelationQueryReqVO { @Schema(description = "被管理用户ID", example = "2") private Long subordinateUserId; + @Schema(description = "访问是否来自user/index组件", example = "true/false") + private Boolean fromUserIndex; + + @Schema(description = "所选中的部门id", example = "100(灿能电力的部门id)") + private Long deptId; } diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserService.java index effaeaf..4d1bf31 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserService.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserService.java @@ -235,4 +235,11 @@ public interface AdminUserService { */ boolean isUserAvailable(AdminUserDO user); + /** + * 通过部门ID查询该部门及以下部门的所有用户 + * + * @param deptId 部门ID + * @return 用户列表 + */ + List getAllUserByDeptId(Long deptId); } diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserServiceImpl.java index b6ec4ab..ebd29ad 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserServiceImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/AdminUserServiceImpl.java @@ -39,36 +39,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.singleton; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_EMAIL_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IMPORT_INIT_PASSWORD; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IS_DISABLE; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IS_RESIGNED; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_MOBILE_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_PASSWORD_FAILED; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_REGISTER_DISABLED; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUB_TYPE; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUCCESS; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUB_TYPE; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUCCESS; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_TYPE; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUCCESS; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUB_TYPE; -import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUCCESS; +import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.*; +import static com.njcn.rdms.module.system.enums.LogRecordConstants.*; /** * 后台用户 Service 实现类 @@ -97,6 +74,8 @@ public class AdminUserServiceImpl implements AdminUserService { private OAuth2TokenService oauth2TokenService; @Resource private ConfigService configService; + @Resource + private UserManagementRelationService userManagementRelationService; @Override @Transactional(rollbackFor = Exception.class) @@ -218,6 +197,12 @@ public class AdminUserServiceImpl implements AdminUserService { // 1. 校验用户存在 AdminUserDO user = validateUserExists(id); // 2. 删除用户及其关联数据 + // 2.1 删除前判断带人关系表是否还在用该用户 + Boolean res = userManagementRelationService.hasRelation(id); + if (res) { + throw exception(USER_MANAGEMENT_RELATION_EXISTS); + } + // 2.2 确认用户关系表中没使用该用户可继续往下执行 userMapper.deleteById(id); permissionService.processUserDeleted(id); oauth2TokenService.removeAccessToken(id, UserTypeEnum.ADMIN.getValue()); @@ -228,6 +213,13 @@ public class AdminUserServiceImpl implements AdminUserService { @Override @Transactional(rollbackFor = Exception.class) public void deleteUserList(List ids) { + //批量删除前查看是否带人关系表还在使用该用户 + for (Long id : ids){ + Boolean res = userManagementRelationService.hasRelation(id); + if (res) { + throw exception(USER_MANAGEMENT_RELATION_EXISTS); + } + } // 1. 批量删除用户 userMapper.deleteByIds(ids); // 2. 批量删除用户关联数据 @@ -504,6 +496,12 @@ public class AdminUserServiceImpl implements AdminUserService { && !isUserResigned(user); } + @Override + public List getAllUserByDeptId(Long deptId) { + Set deptCondition = getDeptCondition(deptId); + return getUserListByDeptIds(deptCondition); + } + /** * 对密码进行加密 * diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationService.java index e3b4540..ef1bf42 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationService.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationService.java @@ -97,7 +97,7 @@ public interface UserManagementRelationService { * * @return 用户带人关系树形列表 */ - List getRelationTree(); + List getRelationTree(UserManagementRelationQueryReqVO reqVO); /** * 获得用户带人关系 Map @@ -112,4 +112,14 @@ public interface UserManagementRelationService { return CollectionUtils.convertMap(getRelationList(ids), UserManagementRelationDO::getId); } + /** + * 通过某个用户的id,判断带人关系表中是否有该用户的记录 + * 判断原则: + * --管理者ID或被管理者ID有一个字段的值等于用户id,且该记录没有被逻辑删除 + * --则认为带人关系表中还在使用该用户 + * + * @param userId 用户id + * @return true:有该用户的记录,false:没有该用户的记录 + */ + Boolean hasRelation(Long userId); } diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationServiceImpl.java index 7d4db40..27f80d4 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationServiceImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/user/UserManagementRelationServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.annotations.VisibleForTesting; import com.njcn.rdms.framework.common.exception.ServiceException; import com.njcn.rdms.framework.common.util.object.BeanUtils; +import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationQueryReqVO; import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationSaveReqVO; import com.njcn.rdms.module.system.controller.admin.user.vo.userManagementRelation.UserManagementRelationTreeRespVO; @@ -46,6 +47,9 @@ public class UserManagementRelationServiceImpl implements UserManagementRelation @Resource private AdminUserMapper adminUserMapper; + @Resource + private AdminUserService adminUserService; + /** * 树形结构构建上下文 * 包含构建树形结构所需的所有基础数据 @@ -232,7 +236,7 @@ public class UserManagementRelationServiceImpl implements UserManagementRelation */ @Override public List getRelationQuery(UserManagementRelationQueryReqVO reqVO) { - TreeBuildContext context = buildTreeContext(); + TreeBuildContext context = buildTreeContext(reqVO); if (context == null) { return Collections.emptyList(); } @@ -284,26 +288,60 @@ public class UserManagementRelationServiceImpl implements UserManagementRelation * @return 用户带人关系树形结构列表 */ @Override - public List getRelationTree() { - TreeBuildContext context = buildTreeContext(); + public List getRelationTree(UserManagementRelationQueryReqVO reqVO) { + TreeBuildContext context = buildTreeContext(reqVO); if (context == null) { return Collections.emptyList(); } return buildFullTree(context); } + /** + * 通过某个用户的id,判断带人关系表中是否有该用户的记录 + * 判断原则: + * --管理者ID或被管理者ID有一个字段的值等于用户id,且该记录没有被逻辑删除 + * --则认为带人关系表中还在使用该用户 + * + * @param userId 用户id + * @return true:有该用户的记录,false:没有该用户的记录 + */ + @Override + public Boolean hasRelation(Long userId) { + if (userId == null) { + return false; + } + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + wrapper.eq(UserManagementRelationDO::getManagerUserId, userId) + .or() + .eq(UserManagementRelationDO::getSubordinateUserId, userId); + return userManagementRelationMapper.selectCount(wrapper) > 0; + } + /** * 构建树形结构上下文 * 查询并组装构建树形结构所需的所有基础数据 * + * @param reqVO 查询条件VO,包含fromUserIndex和deptId * @return 树形结构上下文,如果没有数据则返回null */ - private TreeBuildContext buildTreeContext() { + private TreeBuildContext buildTreeContext(UserManagementRelationQueryReqVO reqVO) { List allRelations = userManagementRelationMapper.selectList(new UserManagementRelationQueryReqVO()); if (CollUtil.isEmpty(allRelations)) { return null; } + if (Boolean.TRUE.equals(reqVO.getFromUserIndex()) && reqVO.getDeptId() != null && reqVO.getDeptId() != 100L) { + List deptUsers = adminUserService.getAllUserByDeptId(reqVO.getDeptId()); + Set deptUserIds = deptUsers.stream().map(AdminUserDO::getId).collect(Collectors.toSet()); + allRelations = allRelations.stream() + .filter(relation -> deptUserIds.contains(relation.getManagerUserId()) + && deptUserIds.contains(relation.getSubordinateUserId())) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(allRelations)) { + return null; + } + } + Set allUserIds = new HashSet<>(); for (UserManagementRelationDO relation : allRelations) { allUserIds.add(relation.getManagerUserId());