fix: 为主任务的子任务列表动态计算deadline - 在TaskService.fillSubTaskStats中为进行中的子任务动态计算deadline

This commit is contained in:
Your Name 2026-01-14 15:09:55 +08:00
parent 72da0d8ffe
commit 53d1caf327
3 changed files with 73 additions and 30 deletions

View File

@ -999,7 +999,7 @@ public class TaskService {
task.setSubTaskInProgress((int) inProgressCount);
task.setSubTaskPending((int) pendingCount);
// 填充子任务的接单人名称
// 填充子任务的接单人名称和deadline
for (TaskItem item : subTasks) {
if (item.getReceiverId() != null && (item.getReceiverName() == null || item.getReceiverName().isEmpty())) {
User receiver = userService.getUserById(item.getReceiverId());
@ -1007,9 +1007,24 @@ public class TaskService {
item.setReceiverName(receiver.getRealName());
}
}
// 为没有deadline的进行中子任务动态计算deadline
if (item.getDeadline() == null
&& "in_progress".equals(item.getStatus())
&& item.getEstimatedHours() != null
&& item.getEstimatedHours().compareTo(BigDecimal.ZERO) > 0
&& item.getUpdateTime() != null) {
// 使用updateTime作为接单时间(因为接单时会更新updateTime)
LocalDateTime deadline = workHoursCalculator.calculateDeadline(
item.getUpdateTime(),
item.getEstimatedHours()
);
item.setDeadline(deadline);
log.debug("为子任务{}动态计算deadline: {}", item.getId(), deadline);
}
}
// 设置子任务列表(包含处理人信息)
// 设置子任务列表(包含处理人信息和deadline)
task.setSubTasks(subTasks);
// 如果主任务没有receiverName,从子任务中获取接单人

View File

@ -55,6 +55,7 @@ declare module 'vue' {
ATabs: typeof import('ant-design-vue/es')['Tabs']
ATag: typeof import('ant-design-vue/es')['Tag']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
ATimePicker: typeof import('ant-design-vue/es')['TimePicker']
ATree: typeof import('ant-design-vue/es')['Tree']
ATreeSelect: typeof import('ant-design-vue/es')['TreeSelect']
AUpload: typeof import('ant-design-vue/es')['Upload']

View File

@ -4344,7 +4344,21 @@ const loadInProgressTasks = async () => {
// 处理子任务
if (itemResponse.data && itemResponse.data.records) {
const items = itemResponse.data.records.map((item: any) => mapTaskItemToTask(item))
// 调试:打印原始 API 数据中的 subTasks
console.log('=== API 原始数据调试 ===')
if (itemResponse.data.records[0] && itemResponse.data.records[0].subTasks) {
console.log('第一条记录的 subTasks[0]:', JSON.stringify(itemResponse.data.records[0].subTasks[0]))
console.log('subTasks[0].deadline:', itemResponse.data.records[0].subTasks[0].deadline)
}
const items = itemResponse.data.records.map((item: any) => {
const mapped = mapTaskItemToTask(item)
// 调试:打印映射后的 subTasks
if (mapped.subTasks && mapped.subTasks[0]) {
console.log('映射后 subTasks[0].deadline:', mapped.subTasks[0].deadline)
}
return mapped
})
console.log('=== API 原始数据调试结束 ===')
allTasks = [...allTasks, ...items]
totalCount += itemResponse.data.total || 0
}
@ -4381,33 +4395,46 @@ const loadInProgressTasks = async () => {
}
// 将子任务映射为任务格式(供显示用)
const mapTaskItemToTask = (item: any) => ({
...item,
id: item.id,
itemId: item.id,
itemNo: item.itemNo,
title: item.mainTaskTitle || item.taskTitle || item.title,
subTaskNo: item.itemNo,
isSubTask: true,
taskId: item.taskId,
groupNo: item.groupNo,
taskTypeId: item.taskTypeId,
taskTypeName: item.taskTypeName,
score: item.totalScore || item.score,
estimatedHours: item.estimatedHours,
quantity: item.quantity || 1,
previewImage: item.previewImage,
prevDownloadUrl: item.prevDownloadUrl,
description: item.description || item.taskDescription,
progress: item.progress,
status: 'in_progress',
receiverName: item.receiverName, // 接单人姓名(部门负责人查看时显示)
deadline: item.deadline, // 子任务截止时间(接单时计算)
startTime: item.createTime, // 使用创建时间作为开始时间
isPipeline: item.isPipeline, // 是否流水线任务(从主任务获取)
subTasks: item.subTasks, // 同一主任务的所有子任务列表
subTaskTotal: item.subTaskTotal || (item.subTasks ? item.subTasks.length : 0) // 子任务总数
})
const mapTaskItemToTask = (item: any) => {
// 调试:输出原始 item 中 subTasks 的 deadline 信息
if (item.subTasks && item.subTasks.length > 0) {
console.log('=== mapTaskItemToTask 调试 ===')
console.log('item.id:', item.id)
console.log('item.subTasks:', JSON.stringify(item.subTasks.map((st: any) => ({
id: st.id,
status: st.status,
deadline: st.deadline
}))))
}
return {
...item,
id: item.id,
itemId: item.id,
itemNo: item.itemNo,
title: item.mainTaskTitle || item.taskTitle || item.title,
subTaskNo: item.itemNo,
isSubTask: true,
taskId: item.taskId,
groupNo: item.groupNo,
taskTypeId: item.taskTypeId,
taskTypeName: item.taskTypeName,
score: item.totalScore || item.score,
estimatedHours: item.estimatedHours,
quantity: item.quantity || 1,
previewImage: item.previewImage,
prevDownloadUrl: item.prevDownloadUrl,
description: item.description || item.taskDescription,
progress: item.progress,
status: 'in_progress',
receiverName: item.receiverName, // 接单人姓名(部门负责人查看时显示)
deadline: item.deadline, // 子任务截止时间(接单时计算)
startTime: item.createTime, // 使用创建时间作为开始时间
isPipeline: item.isPipeline, // 是否流水线任务(从主任务获取)
subTasks: item.subTasks, // 同一主任务的所有子任务列表
subTaskTotal: item.subTaskTotal || (item.subTasks ? item.subTasks.length : 0) // 子任务总数
}
}
// 加载待审核任务(所有处于审批流程中的任务 + 部门负责人的子任务组)
const loadReviewTasks = async () => {