From 01d9468e6f4cbf599416466b6bb9580e7911af7f Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 14 Jan 2026 13:11:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E4=BB=BB=E5=8A=A1=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E4=B8=AD=E6=98=BE=E7=A4=BA=E8=BF=9B=E8=A1=8C=E4=B8=AD?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=AE=8C=E6=88=90=E6=88=AA=E6=AD=A2?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在任务详情抽屉的基本信息部分添加完成截止时间字段 - 添加getTaskDeadline函数计算任务的完成截止时间 - 流水线任务:从接单时间开始 + 所有子任务预估工时总和 - 普通任务:从接单时间开始 + 任务预估工时 - 添加isTaskDeadlineOverdue函数判断截止时间是否过期 - 优先使用后端返回的deadline字段,如果没有则前端计算 --- frontend/src/views/TaskHall.vue | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index f50ae99..57f082e 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2096,6 +2096,11 @@ {{ selectedTask.score }} 分 {{ formatEstimatedTime(selectedTask.estimatedHours) }} {{ selectedTask.quantity || '--' }} 个 + + + {{ formatTime(getTaskDeadline(selectedTask) || undefined) }} + + @@ -2924,6 +2929,49 @@ const getSubTaskDeadline = (subTask: any) => { return dayjs(subTask.deadline).format('MM月DD日HH时') } +// 获取任务完成截止时间(用于进行中的任务) +// 计算方式:从任务接单开始 + 子任务耗时(流水线任务)或任务耗时(普通任务) +const getTaskDeadline = (task: any): string | null => { + if (!task || task.status !== 'in_progress') return null + + // 优先使用后端返回的deadline字段(如果存在且有效) + if (task.deadline) { + return task.deadline + } + + // 如果没有deadline,尝试计算(流水线任务:从接单时间开始 + 所有子任务预估工时;普通任务:从接单时间开始 + 任务预估工时) + if (task.startTime) { + let totalHours = 0 + + // 流水线任务:累加所有子任务的预估工时 + if (task.isPipeline === 1 && task.subTasks && task.subTasks.length > 0) { + totalHours = task.subTasks.reduce((sum: number, subTask: any) => { + return sum + (subTask.estimatedHours || 0) + }, 0) + } else if (task.estimatedHours) { + // 普通任务:使用任务的预估工时 + totalHours = task.estimatedHours + } + + if (totalHours > 0) { + // 简单计算:接单时间 + 预估工时(小时) + // 注意:这是简化计算,不考虑工作时间配置,最准确的应该使用后端计算的deadline + const startTime = dayjs(task.startTime) + const deadline = startTime.add(totalHours, 'hour') + return deadline.format('YYYY-MM-DD HH:mm:ss') + } + } + + return null +} + +// 判断任务截止时间是否已过期 +const isTaskDeadlineOverdue = (task: any): boolean => { + const deadline = getTaskDeadline(task) + if (!deadline) return false + return dayjs().isAfter(dayjs(deadline)) +} + // 展开/折叠任务子任务详情 const expandedTaskSubtasks = ref>({}) const toggleTaskSubtasks = (taskId: number) => {