diff --git a/backend/src/main/java/com/designhub/controller/TaskItemController.java b/backend/src/main/java/com/designhub/controller/TaskItemController.java index b0a08ac..fe54e1c 100644 --- a/backend/src/main/java/com/designhub/controller/TaskItemController.java +++ b/backend/src/main/java/com/designhub/controller/TaskItemController.java @@ -16,6 +16,12 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.Set; +import java.util.HashSet; +import com.designhub.mapper.TaskMapper; +import com.designhub.mapper.TaskItemMapper; +import com.designhub.entity.Task; /** * 任务子项控制器(流水线任务) @@ -30,6 +36,8 @@ public class TaskItemController { private final TaskItemService taskItemService; private final UserMapper userMapper; private final DepartmentMapper departmentMapper; + private final TaskMapper taskMapper; + private final TaskItemMapper taskItemMapper; private final JwtUtil jwtUtil; /** @@ -126,8 +134,69 @@ public class TaskItemController { } log.info("返回结果: 总数={}, 当前页记录数={}", items.getTotal(), items.getRecords().size()); + + // 填充子任务列表信息(用于前端显示流水线任务的子任务进度) + enrichTaskItemsWithSubTasks(items.getRecords()); + return Result.success(items); } + + /** + * 为子任务列表填充同一主任务的所有子任务信息 + * 这样前端可以显示流水线任务的子任务进度时间线 + */ + private void enrichTaskItemsWithSubTasks(List items) { + if (items == null || items.isEmpty()) { + return; + } + + // 收集所有主任务ID + Set taskIds = items.stream() + .map(TaskItem::getTaskId) + .filter(id -> id != null) + .collect(Collectors.toSet()); + + if (taskIds.isEmpty()) { + return; + } + + // 批量查询主任务信息 + List tasks = taskMapper.selectBatchIds(taskIds); + Map taskMap = tasks.stream() + .collect(Collectors.toMap(Task::getId, t -> t)); + + // 批量查询所有相关子任务 + List allSubTasks = taskItemMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .in(TaskItem::getTaskId, taskIds) + .orderByAsc(TaskItem::getSortOrder) + ); + + // 按主任务ID分组 + Map> subTasksMap = allSubTasks.stream() + .collect(Collectors.groupingBy(TaskItem::getTaskId)); + + // 为每个子任务填充信息 + for (TaskItem item : items) { + Long taskId = item.getTaskId(); + if (taskId == null) { + continue; + } + + // 填充主任务信息 + Task mainTask = taskMap.get(taskId); + if (mainTask != null) { + item.setIsPipeline(mainTask.getIsPipeline()); + } + + // 填充同一主任务的所有子任务列表 + List subTasks = subTasksMap.get(taskId); + if (subTasks != null && !subTasks.isEmpty()) { + item.setSubTasks(subTasks); + item.setSubTaskTotal(subTasks.size()); + } + } + } /** * 获取已完成的子任务列表 diff --git a/backend/src/main/java/com/designhub/entity/TaskItem.java b/backend/src/main/java/com/designhub/entity/TaskItem.java index 233d647..ff1b1ce 100644 --- a/backend/src/main/java/com/designhub/entity/TaskItem.java +++ b/backend/src/main/java/com/designhub/entity/TaskItem.java @@ -225,4 +225,22 @@ public class TaskItem implements Serializable { */ @TableField(exist = false) private String previewImage; + + /** + * 是否流水线任务(非数据库字段,从主任务关联) + */ + @TableField(exist = false) + private Integer isPipeline; + + /** + * 同一主任务的所有子任务列表(非数据库字段) + */ + @TableField(exist = false) + private java.util.List subTasks; + + /** + * 主任务的子任务总数(非数据库字段) + */ + @TableField(exist = false) + private Integer subTaskTotal; } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index fa9ddd2..b015e02 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1046,8 +1046,6 @@ public class TaskService { // 填充关联信息 fillTaskRelatedInfo(task); - // 填充子任务统计信息(包含子任务列表) - fillSubTaskStats(task); return task; } diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 59f7c6e..b7c64ff 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -4403,7 +4403,10 @@ const mapTaskItemToTask = (item: any) => ({ status: 'in_progress', receiverName: item.receiverName, // 接单人姓名(部门负责人查看时显示) deadline: item.deadline, // 子任务截止时间(接单时计算) - startTime: item.createTime // 使用创建时间作为开始时间 + startTime: item.createTime, // 使用创建时间作为开始时间 + isPipeline: item.isPipeline, // 是否流水线任务(从主任务获取) + subTasks: item.subTasks, // 同一主任务的所有子任务列表 + subTaskTotal: item.subTaskTotal || (item.subTasks ? item.subTasks.length : 0) // 子任务总数 }) // 加载待审核任务(所有处于审批流程中的任务 + 部门负责人的子任务组)