fix: 为主任务的子任务列表动态计算deadline - 在TaskService.fillSubTaskStats中为进行中的子任务动态计算deadline
This commit is contained in:
parent
72da0d8ffe
commit
53d1caf327
@ -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,从子任务中获取接单人
|
||||
|
||||
1
frontend/src/types/components.d.ts
vendored
1
frontend/src/types/components.d.ts
vendored
@ -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']
|
||||
|
||||
@ -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 () => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user