diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index e49ebbc..29b86f8 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -465,8 +465,41 @@ public class TaskItemService { throw new BusinessException(ResultCode.FORBIDDEN, "无权更新该子任务"); } - // 验证状态 - if (!"in_progress".equals(item.getStatus())) { + // 🔥 修复:如果子任务是预先指定给该用户的(status=pending且receiverId=userId),自动转为进行中 + if ("pending".equals(item.getStatus())) { + // 检查是否被锁定 + if (item.getIsLocked() != null && item.getIsLocked() == 1) { + throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "该子任务已被锁定,请等待前序任务完成"); + } + + log.info("子任务 {} 是预先指定任务(status=pending, receiverId={}),自动转为进行中", itemId, userId); + + // 计算deadline + LocalDateTime now = LocalDateTime.now(); + LocalDateTime deadline = null; + if (item.getEstimatedHours() != null && item.getEstimatedHours().compareTo(java.math.BigDecimal.ZERO) > 0) { + deadline = workHoursCalculator.calculateDeadline(now, item.getEstimatedHours()); + log.info("子任务deadline已计算:从当前时间 {} 开始,预估 {} 小时,截止时间 {}", + now, item.getEstimatedHours(), deadline); + } + + // 更新子任务状态为进行中 + item.setStatus("in_progress"); + item.setClaimTime(now); + if (deadline != null) { + item.setDeadline(deadline); + } + + // 同步更新主任务状态 + Task mainTask = taskMapper.selectById(item.getTaskId()); + if (mainTask != null && "pending".equals(mainTask.getStatus())) { + mainTask.setStatus("in_progress"); + mainTask.setStartTime(now); + mainTask.setActualStartTime(now); + taskMapper.updateById(mainTask); + log.info("主任务 {} 状态已更新为 in_progress", mainTask.getId()); + } + } else if (!"in_progress".equals(item.getStatus())) { throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "只能更新进行中的子任务"); }