diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 4053857..c56964b 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -682,11 +682,42 @@ public class TaskItemService { boolean isAdmin = approver != null && Integer.valueOf(1).equals(approver.getIsAdmin()); if (!isAdmin) { - if (mainTask.getReceiverDeptId() == null) { - throw new BusinessException(ResultCode.FORBIDDEN, "任务未指定接单部门"); + // 获取该组的子任务,检查审核人是否是对应部门的负责人 + List checkItems = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + .eq(TaskItem::getGroupNo, groupNo) + .eq(TaskItem::getStatus, "pending_approval") + .last("LIMIT 1") + ); + + if (checkItems.isEmpty()) { + throw new BusinessException(ResultCode.PARAM_ERROR, "该组没有待审核的子任务"); } - com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); - if (receiverDept == null || !approverId.equals(receiverDept.getLeaderId())) { + + // 从子任务的任务类型配置获取接单部门 + TaskItem firstItem = checkItems.get(0); + Long targetDeptId = getTargetDeptIdFromTaskType(firstItem.getTaskTypeId()); + + boolean hasPermission = false; + + // 检查任务类型配置的接单部门 + if (targetDeptId != null) { + com.designhub.entity.Department receiverDept = departmentMapper.selectById(targetDeptId); + if (receiverDept != null && approverId.equals(receiverDept.getLeaderId())) { + hasPermission = true; + } + } + + // 兼容:也检查主任务的 receiver_dept_id + if (!hasPermission && mainTask.getReceiverDeptId() != null) { + com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); + if (receiverDept != null && approverId.equals(receiverDept.getLeaderId())) { + hasPermission = true; + } + } + + if (!hasPermission) { throw new BusinessException(ResultCode.FORBIDDEN, "只有接单部门负责人可以审核子任务组"); } } else { @@ -991,8 +1022,27 @@ public class TaskItemService { Map> groupMap = new HashMap<>(); for (TaskItem item : pendingItems) { Task mainTask = taskMapper.selectById(item.getTaskId()); - // receiverDeptId为null表示管理员,可以看到所有任务 - if (mainTask != null && (receiverDeptId == null || receiverDeptId.equals(mainTask.getReceiverDeptId()))) { + if (mainTask == null) continue; + + // 判断是否有权限查看该子任务 + boolean hasPermission = false; + if (receiverDeptId == null) { + // 管理员可以看到所有任务 + hasPermission = true; + } else { + // 部门负责人:检查子任务的任务类型配置的 allowed_dept_ids 是否包含该部门 + Long targetDeptId = getTargetDeptIdFromTaskType(item.getTaskTypeId()); + if (targetDeptId != null && targetDeptId.equals(receiverDeptId)) { + hasPermission = true; + } + // 兼容:也检查主任务的 receiver_dept_id + if (!hasPermission && mainTask.getReceiverDeptId() != null + && mainTask.getReceiverDeptId().equals(receiverDeptId)) { + hasPermission = true; + } + } + + if (hasPermission) { String key = item.getTaskId() + "-" + item.getGroupNo(); if (!groupMap.containsKey(key)) { Map groupInfo = new HashMap<>();