From 53d1caf3278250b1fbe9361c546cea985d5b7bce Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 14 Jan 2026 15:09:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=BA=E4=B8=BB=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=AE=A1=E7=AE=97deadline=20-=20=E5=9C=A8TaskService.?= =?UTF-8?q?fillSubTaskStats=E4=B8=AD=E4=B8=BA=E8=BF=9B=E8=A1=8C=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E4=BB=BB=E5=8A=A1=E5=8A=A8=E6=80=81=E8=AE=A1?= =?UTF-8?q?=E7=AE=97deadline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/designhub/service/TaskService.java | 19 ++++- frontend/src/types/components.d.ts | 1 + frontend/src/views/TaskHall.vue | 83 ++++++++++++------- 3 files changed, 73 insertions(+), 30 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index b015e02..424531c 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -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,从子任务中获取接单人 diff --git a/frontend/src/types/components.d.ts b/frontend/src/types/components.d.ts index 1cd9a30..b9f0977 100644 --- a/frontend/src/types/components.d.ts +++ b/frontend/src/types/components.d.ts @@ -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'] diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 97a5150..f526388 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -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 () => {