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