diff --git a/client/src/i18n/locales/en-US.ts b/client/src/i18n/locales/en-US.ts index 939466e..24fa967 100644 --- a/client/src/i18n/locales/en-US.ts +++ b/client/src/i18n/locales/en-US.ts @@ -259,6 +259,7 @@ export default { tableTitle: 'Task data', totalSuffix: 'tasks', noSourceSubject: 'No source subject', + sourceReceivedAt: 'Source time', canProcess: 'Processable', cannotProcess: 'Not processable', queueParticipation: 'Queue participation', diff --git a/client/src/i18n/locales/th-TH.ts b/client/src/i18n/locales/th-TH.ts index 3520db3..9036eed 100644 --- a/client/src/i18n/locales/th-TH.ts +++ b/client/src/i18n/locales/th-TH.ts @@ -259,6 +259,7 @@ export default { tableTitle: 'ข้อมูลงาน', totalSuffix: 'งาน', noSourceSubject: 'ไม่มีหัวข้ออีเมลต้นทาง', + sourceReceivedAt: 'เวลารับอีเมล', canProcess: 'ประมวลผลได้', cannotProcess: 'ประมวลผลไม่ได้', queueParticipation: 'อยู่ในคิวหรือไม่', diff --git a/client/src/i18n/locales/zh-CN.ts b/client/src/i18n/locales/zh-CN.ts index 83bb21d..58946f3 100644 --- a/client/src/i18n/locales/zh-CN.ts +++ b/client/src/i18n/locales/zh-CN.ts @@ -259,6 +259,7 @@ export default { tableTitle: '任务数据', totalSuffix: '条任务', noSourceSubject: '暂无来源主题', + sourceReceivedAt: '来源时间', canProcess: '可处理', cannotProcess: '不可处理', queueParticipation: '是否参与队列', diff --git a/client/src/tests/reservationViews.spec.ts b/client/src/tests/reservationViews.spec.ts index b4d1091..10c1bbb 100644 --- a/client/src/tests/reservationViews.spec.ts +++ b/client/src/tests/reservationViews.spec.ts @@ -494,6 +494,22 @@ describe('reservation P0 views', () => { expect(wrapper.text()).not.toContain('NEW_BOOKING / NEW_BOOKING') }) + it('renders task source received time in the source email column', async () => { + const taskListResult = createTaskListResult('GRP-001', 'Booking Request') + taskListResult.items[0] = { + ...taskListResult.items[0]!, + source_sender_summary: 'guest@example.test', + source_received_at: '2026-07-08T03:00:00Z', + } + vi.mocked(service.fetchReservationTaskList).mockResolvedValue(taskListResult) + + const wrapper = await mountWithPlugins(ReservationTaskListView) + await vi.dynamicImportSettled() + + expect(wrapper.text()).toContain('来源时间') + expect(wrapper.text()).toContain('2026-07-08 10:00:00') + }) + it('filters source-message-only tasks with S10 and S99 subtypes', async () => { vi.mocked(service.fetchReservationTaskList).mockResolvedValue(createSourceMessageOnlyTaskListResult('S10')) diff --git a/client/src/views/reservation/ReservationTaskListView.vue b/client/src/views/reservation/ReservationTaskListView.vue index 8f9955e..c200893 100644 --- a/client/src/views/reservation/ReservationTaskListView.vue +++ b/client/src/views/reservation/ReservationTaskListView.vue @@ -187,6 +187,7 @@ {{ task.source_subject ?? t('taskList.noSourceSubject') }} {{ task.source_sender_summary ?? task.source_message_id ?? '-' }} + {{ t('taskList.sourceReceivedAt') }}: {{ formatReservationDateTime(task.source_received_at) }} {{ task.queue_sequence ?? '-' }} @@ -279,6 +280,7 @@ import { formatReservationTaskRouteSummary, isReservationReadonlyDiagnosticTask, } from '@/utils/reservationDisplay' +import { formatReservationDateTime } from '@/utils/reservationFormat' const { t } = useI18n() const authStore = useAuthStore()