From 7f60c484a0bfc86d934d19db2480b01bab633597 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 28 Mar 2026 15:54:59 +0800 Subject: [PATCH] fix: persist receiving dept during approval routing --- .../service/TaskApprovalService.java | 91 ++++++++++++------- .../com/designhub/service/TaskService.java | 12 ++- 2 files changed, 67 insertions(+), 36 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index e56fc3f..6df575b 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -274,8 +274,15 @@ public class TaskApprovalService { // 3. 所有任务都需要接单部门负责人审核(无论是否预先指定了设计师) String releaseType = task.getReleaseType(); - // 确定接单部门负责人 - Long receivingLeaderId = determineReceivingLeader(task); + // 确定接单部门和负责人,并把部门落库,避免后续部门调整时出现待审核任务无法追溯归属 + Long receivingDeptId = determineReceivingDeptId(task); + Long receivingLeaderId = null; + if (receivingDeptId != null) { + Department receivingDept = departmentMapper.selectById(receivingDeptId); + if (receivingDept != null) { + receivingLeaderId = receivingDept.getLeaderId(); + } + } if (receivingLeaderId == null) { throw new BusinessException(ResultCode.PARAM_ERROR, "无法确定接单部门负责人,请在系统设置中为接单部门配置负责人"); } @@ -283,6 +290,7 @@ public class TaskApprovalService { // 更新任务状态为待接单部门审核 task.setApprovalStatus("pending_receiving_approval"); task.setDemandApprovalTime(LocalDateTime.now()); + task.setReceiverDeptId(receivingDeptId); task.setCurrentApproverId(receivingLeaderId); task.setCurrentApproverRole("receiving_leader"); taskMapper.updateById(task); @@ -476,12 +484,18 @@ public class TaskApprovalService { throw new BusinessException(ResultCode.PARAM_ERROR, "指定的接收人不存在"); } task.setReceiverId(assignedReceiverId); - task.setReceiverDeptId(receiver.getDeptId()); task.setReleaseType("assigned"); // 设置为指定模式 finalReceiverId = assignedReceiverId; log.info("任务【{}】已指定给设计师【{}】", task.getTitle(), receiver.getRealName()); } + if (finalReceiverId != null) { + com.designhub.entity.User receiver = userMapper.selectById(finalReceiverId); + if (receiver != null && receiver.getDeptId() != null) { + task.setReceiverDeptId(receiver.getDeptId()); + } + } + // 判断是否为流水线任务 if (task.getIsPipeline() != null && task.getIsPipeline() == 1) { // 流水线任务:先保存主任务的receiverId(如果已设置),确保updatePipelineSubTasksForAssigned能读取到 @@ -495,14 +509,6 @@ public class TaskApprovalService { } else { // 普通任务:根据是否有接收人设置状态 if (finalReceiverId != null) { - // 如果接收人部门ID还没设置,需要设置 - if (task.getReceiverDeptId() == null) { - com.designhub.entity.User receiver = userMapper.selectById(finalReceiverId); - if (receiver != null) { - task.setReceiverDeptId(receiver.getDeptId()); - } - } - task.setStatus("in_progress"); // 指定接单直接进入进行中状态 LocalDateTime now = LocalDateTime.now(); task.setStartTime(now); @@ -952,12 +958,12 @@ public class TaskApprovalService { } /** - * 确定接单部门负责人(支持三级分类继承二级分类的配置) - * 🔥 优先使用子任务上设置的接单部门 + * 确定接单部门(支持三级分类继承二级分类的配置) + * 优先使用子任务上设置的接单部门,其次使用主任务已存在的接单部门,最后根据任务类型兜底。 */ - public Long determineReceivingLeader(Task task) { - // 🔥 步骤1:优先从子任务获取接单部门 - // 流水线任务:查找第一个子任务的 receiver_dept_id + public Long determineReceivingDeptId(Task task) { + // 步骤1:优先从子任务获取接单部门 + // 流水线任务:查找第一个有 receiver_dept_id 的子任务 if (task.getIsPipeline() != null && task.getIsPipeline() == 1) { List taskItems = taskItemMapper.selectList( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() @@ -966,32 +972,29 @@ public class TaskApprovalService { ); if (taskItems != null && !taskItems.isEmpty()) { - // 查找第一个有 receiver_dept_id 的子任务 for (TaskItem item : taskItems) { if (item.getReceiverDeptId() != null) { Department dept = departmentMapper.selectById(item.getReceiverDeptId()); - if (dept != null && dept.getLeaderId() != null) { - log.info("从子任务 {} 获取接单部门负责人: 部门={}, 负责人ID={}", - item.getItemNo(), dept.getDeptName(), dept.getLeaderId()); - return dept.getLeaderId(); + if (dept != null) { + log.info("从子任务 {} 获取接单部门: 部门ID={}, 部门={}", + item.getItemNo(), dept.getId(), dept.getDeptName()); + return dept.getId(); } } } } } - - // 🔥 步骤2:如果主任务有 receiver_dept_id,使用它 + + // 步骤2:如果主任务有 receiver_dept_id,直接复用 if (task.getReceiverDeptId() != null) { Department dept = departmentMapper.selectById(task.getReceiverDeptId()); - if (dept != null && dept.getLeaderId() != null) { - log.info("从主任务获取接单部门负责人: 部门={}, 负责人ID={}", - dept.getDeptName(), dept.getLeaderId()); - return dept.getLeaderId(); + if (dept != null) { + log.info("从主任务获取接单部门: 部门ID={}, 部门={}", dept.getId(), dept.getDeptName()); + return dept.getId(); } } - - // 🔥 步骤3:降级方案 - 根据任务类型的allowedDeptIds确定接单部门 - // 取第一个任务类型的第一个允许部门 + + // 步骤3:降级方案 - 根据任务类型的 allowedDeptIds 确定接单部门 String taskTypeIds = task.getTaskTypeIds(); if (taskTypeIds == null || taskTypeIds.isEmpty()) { return null; @@ -1017,10 +1020,12 @@ public class TaskApprovalService { List expandedDeptIds = departmentService.expandDeptIdsWithChildren(allowedDeptIds); for (Long deptId : expandedDeptIds) { Department dept = departmentMapper.selectById(deptId); - if (dept != null && dept.getLeaderId() != null) { - log.info("从任务类型配置获取接单部门负责人(降级方案): 部门={}, 负责人ID={}", - dept.getDeptName(), dept.getLeaderId()); - return dept.getLeaderId(); + if (dept != null && "receiving".equals(dept.getDeptType()) + && Integer.valueOf(1).equals(dept.getStatus()) + && !Integer.valueOf(1).equals(dept.getDeleted())) { + log.info("从任务类型配置获取接单部门(降级方案): 部门ID={}, 部门={}", + dept.getId(), dept.getDeptName()); + return dept.getId(); } } } @@ -1032,6 +1037,24 @@ public class TaskApprovalService { return null; } + /** + * 确定接单部门负责人(支持三级分类继承二级分类的配置) + */ + public Long determineReceivingLeader(Task task) { + Long receivingDeptId = determineReceivingDeptId(task); + if (receivingDeptId == null) { + return null; + } + + Department dept = departmentMapper.selectById(receivingDeptId); + if (dept == null || dept.getLeaderId() == null) { + return null; + } + + log.info("确定接单部门负责人: 部门={}, 负责人ID={}", dept.getDeptName(), dept.getLeaderId()); + return dept.getLeaderId(); + } + /** * 应用任务更新 */ diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 49c227e..4d9672a 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -3834,13 +3834,21 @@ public class TaskService { // 记录审核日志 (level=0 表示明细完善阶段) taskApprovalService.logApproval(task.getId(), completerId, 0, "complete_detail", "已完善任务明细"); - // 确定接单部门负责人 - Long receivingLeaderId = taskApprovalService.determineReceivingLeader(task); + // 确定接单部门负责人,并把部门归属同步写入任务,避免后续组织架构调整时待审核任务失联 + Long receivingDeptId = taskApprovalService.determineReceivingDeptId(task); + Long receivingLeaderId = null; + if (receivingDeptId != null) { + Department receivingDept = departmentService.getDepartmentById(receivingDeptId); + if (receivingDept != null) { + receivingLeaderId = receivingDept.getLeaderId(); + } + } if (receivingLeaderId != null) { // 更新任务状态为待接单部门审核 task.setApprovalStatus("pending_receiving_approval"); task.setStatus("pending_audit"); task.setDemandApprovalTime(LocalDateTime.now()); + task.setReceiverDeptId(receivingDeptId); task.setCurrentApproverId(receivingLeaderId); task.setCurrentApproverRole("receiving_leader"); log.info("一级需求任务明细完善后,等待接单部门负责人审核:leaderId={}", receivingLeaderId);