diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index aa4e712..650c113 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -843,8 +843,23 @@ public class TaskApprovalService { // recruitment模式:发布到任务大厅 task.setStatus("pending"); } else if ("assigned".equals(task.getReleaseType()) && task.getReceiverId() != null) { - // assigned模式:如果指定了接收人,状态已经是in_progress(在approveDemandLevel中已设置) - // 这里不需要再次设置 + // assigned模式:如果指定了接收人,主任务直接进入进行中状态 + task.setStatus("in_progress"); + LocalDateTime now = LocalDateTime.now(); + task.setStartTime(now); + task.setActualStartTime(now); + + // 重新计算deadline:从接单时间开始计算 + if (task.getEstimatedHours() != null) { + int hours = task.getEstimatedHours().intValue(); + if (hours > 0) { + task.setDeadline(now.plusHours(hours)); + } + } + + // 更新子任务状态为in_progress(第一组或全部,取决于流水线模式) + taskService.updatePipelineSubTasksForAssigned(task.getId(), dto.getPipelineMode()); + log.info("指派流水线任务已设置为进行中:taskId={}, receiverId={}", task.getId(), task.getReceiverId()); } else { // default模式或其他模式:流水线任务的主任务状态设置为pending // 子任务会根据is_locked字段控制可见性 diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 2972beb..cdda9cb 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -2422,5 +2422,50 @@ public class TaskService { // TODO: 实现流水线子任务拆分逻辑 // 可以参考createPipelineTask方法中的实现 } + + /** + * 更新指派模式流水线任务的子任务状态为in_progress + * @param taskId 主任务ID + * @param pipelineMode 流水线模式:sequential(顺序)或 parallel(并行) + */ + public void updatePipelineSubTasksForAssigned(Long taskId, String pipelineMode) { + log.info("更新指派流水线任务的子任务状态:taskId={}, mode={}", taskId, pipelineMode); + + List taskItems = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + .orderByAsc(TaskItem::getGroupNo) + ); + + if (taskItems.isEmpty()) { + log.warn("未找到任务的子任务:taskId={}", taskId); + return; + } + + LocalDateTime now = LocalDateTime.now(); + + if ("parallel".equals(pipelineMode)) { + // 并行模式:所有子任务都进入in_progress状态 + for (TaskItem item : taskItems) { + item.setStatus("in_progress"); + item.setIsLocked(0); + item.setActualStartTime(now); + taskItemMapper.updateById(item); + } + log.info("并行流水线任务的所有子任务已更新为in_progress:count={}", taskItems.size()); + } else { + // 顺序模式:只有第一组进入in_progress状态 + Integer firstGroupNo = taskItems.get(0).getGroupNo(); + for (TaskItem item : taskItems) { + if (item.getGroupNo().equals(firstGroupNo)) { + item.setStatus("in_progress"); + item.setIsLocked(0); + item.setActualStartTime(now); + taskItemMapper.updateById(item); + log.info("顺序流水线任务第一组子任务已更新为in_progress:itemId={}", item.getId()); + } + } + } + } }