From 4ceacdf3277abf28eb9747d13f57238ed289df03 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 16:51:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E7=BA=BF=E5=AD=90=E4=BB=BB=E5=8A=A1=E7=BB=84=E5=9C=A8=E5=BE=85?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E5=88=97=E8=A1=A8=E4=B8=AD=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. getPendingApprovalGroups: 使用任务类型配置的allowed_dept_ids判断权限 2. approveReceivingLevel: 支持任务类型配置的部门权限验证 3. 兼容主任务receiver_dept_id的旧逻辑 --- .../designhub/service/TaskItemService.java | 62 +++++++++++++++++-- 1 file changed, 56 insertions(+), 6 deletions(-) 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<>();