feat: 在任务详情中显示进行中任务的完成截止时间

- 在任务详情抽屉的基本信息部分添加完成截止时间字段
- 添加getTaskDeadline函数计算任务的完成截止时间
  - 流水线任务:从接单时间开始 + 所有子任务预估工时总和
  - 普通任务:从接单时间开始 + 任务预估工时
- 添加isTaskDeadlineOverdue函数判断截止时间是否过期
- 优先使用后端返回的deadline字段,如果没有则前端计算
This commit is contained in:
Your Name 2026-01-14 13:11:02 +08:00
parent b589b8d77c
commit 01d9468e6f

View File

@ -2096,6 +2096,11 @@
<a-descriptions-item label="预估积分">{{ selectedTask.score }} 分</a-descriptions-item>
<a-descriptions-item label="时效要求">{{ formatEstimatedTime(selectedTask.estimatedHours) }}</a-descriptions-item>
<a-descriptions-item v-if="!selectedTask.isSubTask" label="数量">{{ selectedTask.quantity || '--' }} 个</a-descriptions-item>
<a-descriptions-item v-if="selectedTask.status === 'in_progress' && getTaskDeadline(selectedTask)" label="完成截止时间">
<span :class="{ 'text-error': isTaskDeadlineOverdue(selectedTask) }">
{{ formatTime(getTaskDeadline(selectedTask) || undefined) }}
</span>
</a-descriptions-item>
</a-descriptions>
</div>
@ -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<Record<number, boolean>>({})
const toggleTaskSubtasks = (taskId: number) => {