fix: 修复一级需求部门任务子任务状态设置,支持顺序和并行流水线模式

This commit is contained in:
Your Name 2026-01-22 18:36:28 +08:00
parent 781d3f66f5
commit e2feece96b
2 changed files with 61 additions and 15 deletions

View File

@ -281,28 +281,49 @@ public class TaskApprovalService {
task.setCurrentApproverRole("receiving_leader");
taskMapper.updateById(task);
// 🔥 如果是一级需求部门任务且是流水线任务,将第一个部门的子任务状态更新为pending_approval
// 🔥 如果是一级需求部门任务且是流水线任务,将子任务状态更新为pending_approval
// 这样接单部门负责人才能看到子任务组进行审核
if (task.getIsPrimaryTask() != null && task.getIsPrimaryTask() == 1
&& task.getIsPipeline() != null && task.getIsPipeline() == 1) {
// 查询第一个部门的子任务(status='pending' 且 isLocked=0)
List<TaskItem> firstDeptItems = taskItemMapper.selectList(
new LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getTaskId, taskId)
.eq(TaskItem::getStatus, "pending")
.eq(TaskItem::getIsLocked, 0)
);
// 将第一个部门的子任务状态更新为pending_approval(待审核)
for (TaskItem item : firstDeptItems) {
String pipelineMode = task.getPipelineMode();
if (pipelineMode == null || pipelineMode.isEmpty()) {
pipelineMode = "sequential"; // 默认顺序模式
}
List<TaskItem> itemsToUpdate;
if ("sequential".equals(pipelineMode)) {
// 顺序模式:只更新第一个部门的子任务(status='pending' 且 isLocked=0)
itemsToUpdate = taskItemMapper.selectList(
new LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getTaskId, taskId)
.eq(TaskItem::getStatus, "pending")
.eq(TaskItem::getIsLocked, 0)
);
log.info("顺序模式:更新第一个部门的子任务状态");
} else {
// 并行模式:更新所有部门的子任务(status='pending' 且 isLocked=0)
itemsToUpdate = taskItemMapper.selectList(
new LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getTaskId, taskId)
.eq(TaskItem::getStatus, "pending")
.eq(TaskItem::getIsLocked, 0)
);
log.info("并行模式:更新所有部门的子任务状态");
}
// 将子任务状态更新为pending_approval(待审核)
for (TaskItem item : itemsToUpdate) {
item.setStatus("pending_approval");
item.setUpdateTime(LocalDateTime.now());
taskItemMapper.updateById(item);
log.info("一级需求任务第一个部门子任务 {} 状态已更新为pending_approval", item.getItemNo());
log.info("一级需求任务子任务 {} 状态已更新为pending_approval", item.getItemNo());
}
if (!firstDeptItems.isEmpty()) {
log.info("一级需求任务 {} 的第一个部门共 {} 个子任务已设置为待审核状态", taskId, firstDeptItems.size());
if (!itemsToUpdate.isEmpty()) {
log.info("一级需求任务 {} 共 {} 个子任务已设置为待审核状态(模式:{})",
taskId, itemsToUpdate.size(), pipelineMode);
}
}

View File

@ -4306,8 +4306,33 @@ public class TaskService {
item.setEstimatedHours(groupTotalHours);
item.setSortOrder(itemIndex);
item.setProgress(0);
item.setStatus("pending");
item.setIsLocked(itemIndex == 1 ? 0 : 1); // 第一个子任务解锁,其他锁定
// 🔥 根据流水线模式和部门序号设置子任务状态
// 获取主任务的流水线模式(一级需求部门任务默认为sequential)
String pipelineMode = task.getPipelineMode();
if (pipelineMode == null || pipelineMode.isEmpty()) {
pipelineMode = "sequential"; // 默认顺序模式
}
if ("sequential".equals(pipelineMode)) {
// 顺序流水线:第一个部门的所有子任务可接单(部门内并行)
// 只有当第一个部门的所有子任务完成后,才解锁下一个部门的子任务
if (currentDeptIndex == 1) {
item.setStatus("pending");
item.setIsLocked(0);
log.info("子任务 {} 属于第一个部门,设置为待接单状态", item.getItemNo());
} else {
// 其他部门的子任务都是 locked(锁定),等待前一个部门完成后解锁
item.setStatus("locked");
item.setIsLocked(1);
log.info("子任务 {} 属于第{}个部门,设置为锁定状态", item.getItemNo(), currentDeptIndex);
}
} else {
// 并行流水线:全部待接单
item.setStatus("pending");
item.setIsLocked(0);
log.info("子任务 {} 并行模式,设置为待接单状态", item.getItemNo());
}
// 🔥 设置子任务的接单部门
// 优先使用用户选择的部门,否则尝试从任务类型配置获取