diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 4161641..845bad4 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1775,16 +1775,18 @@ public class TaskService { @Transactional(rollbackFor = Exception.class) public void updateTask(Long id, Task task, Long userId) { Task existTask = getTaskById(id); + String status = existTask.getStatus(); + boolean receivingDeptLeader = isReceivingDeptLeader(userId); + boolean leaderCanEditPending = receivingDeptLeader && "pending".equals(status); - // 验证权限:只有任务发布人才能更新任务 + // 验证权限:任务发布人、管理员,或接单部门负责人(仅待接单任务)可以更新任务 boolean isAdmin = isAdminUser(userId); - if (!isAdmin && !userId.equals(existTask.getPublisherId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人可以更新任务"); + if (!isAdmin && !userId.equals(existTask.getPublisherId()) && !leaderCanEditPending) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人或接单部门负责人(待接单任务)可以更新任务"); } // 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回 // 不允许更新的状态:进行中(in_progress)、已完成(completed)、已取消(cancelled) - String status = existTask.getStatus(); String approvalStatus = existTask.getApprovalStatus(); boolean canUpdate = "draft".equals(status) || @@ -1818,8 +1820,11 @@ public class TaskService { @Transactional(rollbackFor = Exception.class) public void updatePipelineTask(Long id, com.designhub.dto.PipelineTaskDTO dto, Long userId) { Task existTask = getTaskById(id); + String status = existTask.getStatus(); + boolean receivingDeptLeader = isReceivingDeptLeader(userId); + boolean leaderCanEditPending = receivingDeptLeader && "pending".equals(status); - // 验证权限:任务发布人、一级需求任务的明细完善人可以更新任务 + // 验证权限:任务发布人、一级需求任务的明细完善人、接单部门负责人(待接单任务)可以更新任务 boolean isAdmin = isAdminUser(userId); // 对于一级需求任务,明细完善人在任何可编辑状态下都可以更新(包括草稿状态) boolean isPrimaryTaskDetailCompleter = existTask.getIsPrimaryTask() != null @@ -1842,8 +1847,9 @@ public class TaskService { } } - if (!isAdmin && !userId.equals(existTask.getPublisherId()) && !isPrimaryTaskDetailCompleter && !isDemandDeptMemberForPrimaryTask) { - throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人或指定的明细完善人可以更新任务"); + if (!isAdmin && !userId.equals(existTask.getPublisherId()) && !isPrimaryTaskDetailCompleter + && !isDemandDeptMemberForPrimaryTask && !leaderCanEditPending) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人、指定的明细完善人或接单部门负责人(待接单任务)可以更新任务"); } // 验证任务是否是流水线任务 @@ -1859,7 +1865,6 @@ public class TaskService { // 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回、待完善明细 // 不允许更新的状态:进行中(in_progress)、已完成(completed)、已取消(cancelled) - String status = existTask.getStatus(); String approvalStatus = existTask.getApprovalStatus(); boolean canUpdate = "draft".equals(status) || @@ -2790,6 +2795,26 @@ public class TaskService { } } + /** + * 检查用户是否是任一接单部门负责人 + */ + private boolean isReceivingDeptLeader(Long userId) { + if (userId == null) { + return false; + } + try { + Long count = departmentMapper.selectCount(new LambdaQueryWrapper() + .eq(Department::getLeaderId, userId) + .eq(Department::getDeptType, "receiving") + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0)); + return count != null && count > 0; + } catch (Exception e) { + log.warn("检查接单部门负责人失败: userId={}, error={}", userId, e.getMessage()); + return false; + } + } + private void validateAllowedDemandTypes(Department department, Long demandTypeId) { if (department == null || !StringUtils.hasText(department.getAllowedDemandTypes()) || demandTypeId == null) { return; diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index d2c0f03..80422ae 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -344,6 +344,14 @@ > 查看详情 +