From eb6f0c28b128624e4f4b3c69cdf98645ca5003c2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 28 Mar 2026 16:22:23 +0800 Subject: [PATCH] fix: honor secondary demand memberships in member queries --- .../com/designhub/service/TaskService.java | 16 ++--- .../com/designhub/service/UserService.java | 70 +++++++++++++++---- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 4d9672a..1990db9 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1818,14 +1818,14 @@ public class TaskService { boolean isDemandDeptMemberForPrimaryTask = false; if (existTask.getIsPrimaryTask() != null && existTask.getIsPrimaryTask() == 1 && "pending_detail_completion".equals(existTask.getApprovalStatus())) { - // 获取当前用户的部门类型 - User currentUser = userMapper.selectById(userId); - if (currentUser != null && currentUser.getDeptId() != null) { - Department userDept = departmentMapper.selectById(currentUser.getDeptId()); - if (userDept != null && "demand".equals(userDept.getDeptType())) { - isDemandDeptMemberForPrimaryTask = true; - log.info("需求部门成员 {} 编辑一级需求任务 {}", userId, id); - } + List userDepartments = userService.getUserDepartments(userId); + isDemandDeptMemberForPrimaryTask = userDepartments.stream() + .filter(java.util.Objects::nonNull) + .anyMatch(dept -> "demand".equals(dept.getDeptType()) + && dept.getStatus() != null && dept.getStatus() == 1 + && dept.getDeleted() != null && dept.getDeleted() == 0); + if (isDemandDeptMemberForPrimaryTask) { + log.info("需求部门成员 {} 编辑一级需求任务 {}", userId, id); } } diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index 629c788..f2d682d 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -101,16 +101,15 @@ public class UserService { ); } if (deptId != null) { - if (includeChildren != null && includeChildren) { - // 包含子部门:获取当前部门及所有子部门的ID列表 - List deptIds = departmentService.getAllChildDeptIds(deptId); - deptIds.add(deptId); // 包含当前部门 - queryWrapper.in(User::getDeptId, deptIds); - log.info("查询用户列表,包含子部门: deptId={}, 所有部门IDs={}", deptId, deptIds); + List deptIds = resolveScopedDeptIds(deptId, includeChildren); + Set userIds = resolveUserIdsByDeptIds(deptIds); + if (userIds.isEmpty()) { + queryWrapper.eq(User::getId, -1L); } else { - // 只查询当前部门 - queryWrapper.eq(User::getDeptId, deptId); + queryWrapper.in(User::getId, userIds); } + log.info("查询用户列表按部门成员过滤: deptId={}, includeChildren={}, deptIds={}, userCount={}", + deptId, includeChildren, deptIds, userIds.size()); } if (status != null) { queryWrapper.eq(User::getStatus, status); @@ -416,12 +415,18 @@ public class UserService { log.info("查询需求部门成员,部门IDs: {}", demandDeptIds); - // 2. 查询这些部门下的所有成员 + // 2. 查询这些部门下的所有成员(兼容多部门归属) + Set userIds = resolveUserIdsByDeptIds(demandDeptIds); + if (userIds.isEmpty()) { + log.info("需求部门成员为空"); + return new java.util.ArrayList<>(); + } + List users = userMapper.selectList( new LambdaQueryWrapper() - .in(User::getDeptId, demandDeptIds) - .eq(User::getStatus, 1) // 只查询启用状态的用户 - .eq(User::getDeleted, 0) // 只查询未删除的用户 + .in(User::getId, userIds) + .eq(User::getStatus, 1) + .eq(User::getDeleted, 0) .orderByAsc(User::getDeptId) .orderByAsc(User::getRealName) ); @@ -440,6 +445,47 @@ public class UserService { return users; } + private List resolveScopedDeptIds(Long deptId, Boolean includeChildren) { + List deptIds = new ArrayList<>(); + deptIds.add(deptId); + if (includeChildren != null && includeChildren) { + deptIds.addAll(departmentService.getAllChildDeptIds(deptId)); + } + return deptIds.stream().distinct().toList(); + } + + private Set resolveUserIdsByDeptIds(List deptIds) { + if (deptIds == null || deptIds.isEmpty()) { + return Collections.emptySet(); + } + + Set userIds = new LinkedHashSet<>(); + + // 多部门归属是当前组织调整后的主数据来源。 + List userDepartments = userDepartmentMapper.selectList( + new LambdaQueryWrapper() + .in(UserDepartment::getDeptId, deptIds) + ); + for (UserDepartment relation : userDepartments) { + if (relation.getUserId() != null) { + userIds.add(relation.getUserId()); + } + } + + // 兼容旧数据:保留对 sys_user.dept_id 的兜底。 + List primaryDeptUsers = userMapper.selectList( + new LambdaQueryWrapper() + .in(User::getDeptId, deptIds) + ); + for (User user : primaryDeptUsers) { + if (user.getId() != null) { + userIds.add(user.getId()); + } + } + + return userIds; + } + /** * 调整用户所属部门 */