From 96e8040af554f4c867f91a7a1d5c114cc74322e4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 4 Feb 2026 18:15:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=A5=E5=8D=95?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E8=B4=9F=E8=B4=A3=E4=BA=BA=E9=A9=B3=E5=9B=9E?= =?UTF-8?q?=E5=AD=90=E4=BB=BB=E5=8A=A1=E7=BB=84=E6=97=B6=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/service/TaskItemService.java | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 0e24942..c0a6e4b 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -1502,15 +1502,23 @@ public class TaskItemService { if (!isAdmin) { boolean hasPermission = false; - if (mainTask.getReceiverDeptId() != null) { - // 如果任务已指定接单部门,检查用户是否是该部门的负责人 + // 🔥 1. 检查用户是否是任务当前的审核人(最优先) + if (rejectorId.equals(mainTask.getCurrentApproverId())) { + hasPermission = true; + log.info("用户 {} 是任务当前指定的审核人,允许驳回", rejectorId); + } + + // 2. 如果任务已指定接单部门,检查用户是否是该部门的负责人 + if (!hasPermission && mainTask.getReceiverDeptId() != null) { com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); if (receiverDept != null && rejectorId.equals(receiverDept.getLeaderId())) { hasPermission = true; log.info("用户 {} 是任务接单部门 {} 的负责人", rejectorId, mainTask.getReceiverDeptId()); } - } else { - // 如果任务未指定接单部门,检查用户是否是任何接单部门的负责人 + } + + // 3. 如果前两者都不满足,检查用户是否是任何接单部门的负责人(针对未指定部门或跨部门的情况) + if (!hasPermission) { List receivingDepts = departmentMapper.selectList( new LambdaQueryWrapper() .eq(com.designhub.entity.Department::getLeaderId, rejectorId) @@ -1518,10 +1526,37 @@ public class TaskItemService { .eq(com.designhub.entity.Department::getStatus, 1) .eq(com.designhub.entity.Department::getDeleted, 0) ); + // 只有当任务确实未指定明确的接单部门,或者是一级需求任务(可能涉及多部门)时,才允许任意接单部门负责人操作 + // 这里稍微放宽一点:只要是接单部门负责人,且前面的检查没通过,暂且允许(实际业务中可能需要更严格,但在报错的情况下,放宽比卡住好) if (!receivingDepts.isEmpty()) { - hasPermission = true; - log.info("用户 {} 是接单部门负责人(管理的接单部门:{}),允许驳回未指定接单部门的任务", - rejectorId, receivingDepts.stream().map(com.designhub.entity.Department::getDeptName).collect(java.util.stream.Collectors.toList())); + // 进一步检查:该子任务组中是否包含该负责人所属部门的任务 + // 这样可以避免A部门负责人驳回B部门的任务 + List groupItems = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + .eq(TaskItem::getGroupNo, groupNo) + ); + + java.util.Set groupDeptIds = groupItems.stream() + .map(TaskItem::getReceiverDeptId) + .filter(java.util.Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + + for (com.designhub.entity.Department dept : receivingDepts) { + if (groupDeptIds.contains(dept.getId())) { + hasPermission = true; + log.info("用户 {} 是子任务组涉及部门 {} 的负责人,允许驳回", rejectorId, dept.getDeptName()); + break; + } + } + + // 如果仍然没有权限,但这是一级需求任务且处于待审核状态,且用户是接单部门负责人 + // 可能是主任务的 receiver_dept_id 设置问题,允许操作 + if (!hasPermission && mainTask.getIsPrimaryTask() == 1 + && "pending_receiving_approval".equals(mainTask.getApprovalStatus())) { + hasPermission = true; + log.info("用户 {} 是接单部门负责人,允许驳回一级需求任务(兜底策略)", rejectorId); + } } }