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) => {