diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index fb16559..5c37c60 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -834,7 +834,7 @@ public class TaskApprovalService { * 确定接单部门负责人(支持三级分类继承二级分类的配置) * 🔥 优先使用子任务上设置的接单部门 */ - private Long determineReceivingLeader(Task task) { + public Long determineReceivingLeader(Task task) { // 🔥 步骤1:优先从子任务获取接单部门 // 流水线任务:查找第一个子任务的 receiver_dept_id if (task.getIsPipeline() != null && task.getIsPipeline() == 1) { diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index b2617e4..222f487 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1455,10 +1455,14 @@ public class TaskService { public void updatePipelineTask(Long id, com.designhub.dto.PipelineTaskDTO dto, Long userId) { Task existTask = getTaskById(id); - // 验证权限:只有任务发布人才能更新任务 + // 验证权限:任务发布人、一级需求任务的明细完善人可以更新任务 boolean isAdmin = isAdminUser(userId); - if (!isAdmin && !userId.equals(existTask.getPublisherId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人可以更新任务"); + boolean isPrimaryTaskDetailCompleter = "pending_detail_completion".equals(existTask.getApprovalStatus()) + && existTask.getDetailCompleterId() != null + && userId.equals(existTask.getDetailCompleterId()); + + if (!isAdmin && !userId.equals(existTask.getPublisherId()) && !isPrimaryTaskDetailCompleter) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人或指定的明细完善人可以更新任务"); } // 验证任务是否是流水线任务 @@ -1466,7 +1470,7 @@ public class TaskService { throw new BusinessException(ResultCode.PARAM_ERROR, "该任务不是流水线任务"); } - // 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回 + // 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回、待完善明细 // 不允许更新的状态:进行中(in_progress)、已完成(completed)、已取消(cancelled) String status = existTask.getStatus(); String approvalStatus = existTask.getApprovalStatus(); @@ -1477,6 +1481,7 @@ public class TaskService { "draft".equals(approvalStatus) || "pending_demand_approval".equals(approvalStatus) || "pending_receiving_approval".equals(approvalStatus) || + "pending_detail_completion".equals(approvalStatus) || // 一级需求任务待完善明细 approvalStatus.contains("rejected") )); @@ -1596,12 +1601,18 @@ public class TaskService { // 重新创建子任务(使用与createPipelineTask相同的逻辑) createPipelineTaskItemsForUpdate(existTask, dto); - // 重新初始化审核状态并发送通知 - initApprovalStatus(existTask); + // 判断是否是一级需求任务的明细完善 + if (isPrimaryTaskDetailCompleter && "pending_detail_completion".equals(approvalStatus)) { + // 一级需求任务明细完善后,进入需求部门审核流程 + handlePrimaryTaskDetailCompletion(existTask, userId); + } else { + // 普通任务:重新初始化审核状态并发送通知 + initApprovalStatus(existTask); + } - // 再次保存任务,因为initApprovalStatus修改了approvalStatus、currentApproverId等字段 + // 再次保存任务,因为审核状态可能被修改 taskMapper.updateById(existTask); - log.info("任务审核状态已重新初始化: taskId={}, approvalStatus={}, currentApproverId={}", + log.info("任务审核状态已更新: taskId={}, approvalStatus={}, currentApproverId={}", existTask.getId(), existTask.getApprovalStatus(), existTask.getCurrentApproverId()); sendApprovalNotification(existTask); @@ -3348,6 +3359,34 @@ public class TaskService { } } + /** + * 处理一级需求任务明细完善后的状态转换 + * 明细完善后,任务直接进入接单部门审核流程(因为需求部门已经审核过了) + */ + private void handlePrimaryTaskDetailCompletion(Task task, Long completerId) { + log.info("一级需求任务明细已完善: taskId={}, completerId={}", task.getId(), completerId); + + // 记录审核日志 + taskApprovalService.addApprovalLog(task.getId(), completerId, "complete_detail", "已完善任务明细", null); + + // 确定接单部门负责人 + Long receivingLeaderId = taskApprovalService.determineReceivingLeader(task); + if (receivingLeaderId != null) { + // 更新任务状态为待接单部门审核 + task.setApprovalStatus("pending_receiving_approval"); + task.setStatus("pending_audit"); + task.setDemandApprovalTime(LocalDateTime.now()); + task.setCurrentApproverId(receivingLeaderId); + task.setCurrentApproverRole("receiving_leader"); + log.info("一级需求任务明细完善后,等待接单部门负责人审核:leaderId={}", receivingLeaderId); + } else { + // 如果无法确定接单部门负责人,直接发布到任务大厅 + log.warn("无法确定接单部门负责人,任务将直接发布到任务大厅"); + task.setApprovalStatus("approved"); + task.setStatus("pending"); + } + } + /** * 初始化普通任务审核状态 */