fix: persist receiving dept during approval routing

This commit is contained in:
Your Name 2026-03-28 15:54:59 +08:00
parent 462e1a4e88
commit 7f60c484a0
2 changed files with 67 additions and 36 deletions

View File

@ -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<TaskItem> taskItems = taskItemMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TaskItem>()
@ -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<Long> 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();
}
/**
* 应用任务更新
*/

View File

@ -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);