From 07ce2e5613cf9095ae70e85b13a2885fb5d3a2b8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 4 Jan 2026 08:36:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AE=A1=E7=90=86=E5=91=98=E4=BA=AB?= =?UTF-8?q?=E5=8F=97=E6=89=80=E6=9C=89=E8=A7=92=E8=89=B2=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 管理员可以代审核所有任务(主任务和子任务组) - 管理员可以发起任务(不受部门类型限制) - isAdminUser同时检查isAdmin字段和角色 --- .../service/TaskApprovalService.java | 8 ++++ .../designhub/service/TaskItemService.java | 42 ++++++++++++------- .../com/designhub/service/TaskService.java | 7 ++++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index df58fd7..4c66fbc 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -608,8 +608,16 @@ public class TaskApprovalService { /** * 验证审核人权限 + * 管理员可以代审核所有任务 */ private void validateApprover(Task task, Long approverId, String expectedRole) { + // 检查是否是管理员,管理员可以代审核所有任务 + User approver = userMapper.selectById(approverId); + if (approver != null && Integer.valueOf(1).equals(approver.getIsAdmin())) { + log.info("管理员 {} 代审核任务 {}", approver.getRealName(), task.getId()); + return; // 管理员绕过权限验证 + } + if (!approverId.equals(task.getCurrentApproverId())) { throw new BusinessException(ResultCode.FORBIDDEN, "您无权审核此任务"); } diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 9e67b87..518d1d9 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -454,13 +454,20 @@ public class TaskItemService { throw new BusinessException(ResultCode.NOT_FOUND, "主任务不存在"); } - // 2. 验证审核人权限(必须是接单部门负责人) - if (mainTask.getReceiverDeptId() == null) { - throw new BusinessException(ResultCode.FORBIDDEN, "任务未指定接单部门"); - } - com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); - if (receiverDept == null || !approverId.equals(receiverDept.getLeaderId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "只有接单部门负责人可以审核子任务组"); + // 2. 验证审核人权限(必须是接单部门负责人或管理员) + com.designhub.entity.User approver = userService.getUserById(approverId); + boolean isAdmin = approver != null && Integer.valueOf(1).equals(approver.getIsAdmin()); + + if (!isAdmin) { + if (mainTask.getReceiverDeptId() == null) { + throw new BusinessException(ResultCode.FORBIDDEN, "任务未指定接单部门"); + } + com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); + if (receiverDept == null || !approverId.equals(receiverDept.getLeaderId())) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有接单部门负责人可以审核子任务组"); + } + } else { + log.info("管理员 {} 代审核子任务组", approver.getRealName()); } // 3. 获取该组的所有待审核子任务 @@ -649,13 +656,20 @@ public class TaskItemService { throw new BusinessException(ResultCode.NOT_FOUND, "主任务不存在"); } - // 2. 验证审核人权限(必须是接单部门负责人) - if (mainTask.getReceiverDeptId() == null) { - throw new BusinessException(ResultCode.FORBIDDEN, "任务未指定接单部门"); - } - com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); - if (receiverDept == null || !rejectorId.equals(receiverDept.getLeaderId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "只有接单部门负责人可以驳回子任务组"); + // 2. 验证审核人权限(必须是接单部门负责人或管理员) + com.designhub.entity.User rejector = userService.getUserById(rejectorId); + boolean isAdmin = rejector != null && Integer.valueOf(1).equals(rejector.getIsAdmin()); + + if (!isAdmin) { + if (mainTask.getReceiverDeptId() == null) { + throw new BusinessException(ResultCode.FORBIDDEN, "任务未指定接单部门"); + } + com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); + if (receiverDept == null || !rejectorId.equals(receiverDept.getLeaderId())) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有接单部门负责人可以驳回子任务组"); + } + } else { + log.info("管理员 {} 代驳回子任务组", rejector.getRealName()); } // 3. 更新主任务状态为 rejected diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index a960a9c..8a2cd17 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -976,6 +976,13 @@ public class TaskService { */ private boolean isAdminUser(Long userId) { try { + // 首先检查用户的 isAdmin 字段 + User user = userService.getUserById(userId); + if (user != null && Integer.valueOf(1).equals(user.getIsAdmin())) { + return true; + } + + // 其次检查角色 var roles = roleService.getRolesByUserId(userId); return roles.stream().anyMatch(role -> "ADMIN".equals(role.getRoleCode()) ||