diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index fa05339..f6d823b 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -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 firstDeptItems = taskItemMapper.selectList( - new LambdaQueryWrapper() - .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 itemsToUpdate; + + if ("sequential".equals(pipelineMode)) { + // 顺序模式:只更新第一个部门的子任务(status='pending' 且 isLocked=0) + itemsToUpdate = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + .eq(TaskItem::getStatus, "pending") + .eq(TaskItem::getIsLocked, 0) + ); + log.info("顺序模式:更新第一个部门的子任务状态"); + } else { + // 并行模式:更新所有部门的子任务(status='pending' 且 isLocked=0) + itemsToUpdate = taskItemMapper.selectList( + new LambdaQueryWrapper() + .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); } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index dfbf387..b85d6a3 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -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()); + } // 🔥 设置子任务的接单部门 // 优先使用用户选择的部门,否则尝试从任务类型配置获取