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); + } } }