调整 M002 V3 任务列表筛选项
This commit is contained in:
@@ -268,7 +268,6 @@ export default {
|
|||||||
viewTask: 'View task',
|
viewTask: 'View task',
|
||||||
viewOrder: 'View order',
|
viewOrder: 'View order',
|
||||||
viewConversation: 'View email conversation',
|
viewConversation: 'View email conversation',
|
||||||
legacyMessageNotification: 'Message notification (legacy)',
|
|
||||||
sourceOnlyOrderLabel: 'Source message only',
|
sourceOnlyOrderLabel: 'Source message only',
|
||||||
hiddenTechnicalOrder: 'No visible order',
|
hiddenTechnicalOrder: 'No visible order',
|
||||||
columns: {
|
columns: {
|
||||||
|
|||||||
@@ -268,7 +268,6 @@ export default {
|
|||||||
viewTask: 'ดูงาน',
|
viewTask: 'ดูงาน',
|
||||||
viewOrder: 'ดูออเดอร์',
|
viewOrder: 'ดูออเดอร์',
|
||||||
viewConversation: 'ดูเธรดอีเมล',
|
viewConversation: 'ดูเธรดอีเมล',
|
||||||
legacyMessageNotification: 'การแจ้งเตือนข้อความ (เดิม)',
|
|
||||||
sourceOnlyOrderLabel: 'ข้อความต้นทางแบบอ่านอย่างเดียว',
|
sourceOnlyOrderLabel: 'ข้อความต้นทางแบบอ่านอย่างเดียว',
|
||||||
hiddenTechnicalOrder: 'ไม่มีออเดอร์ที่แสดงได้',
|
hiddenTechnicalOrder: 'ไม่มีออเดอร์ที่แสดงได้',
|
||||||
columns: {
|
columns: {
|
||||||
|
|||||||
@@ -268,7 +268,6 @@ export default {
|
|||||||
viewTask: '查看任务',
|
viewTask: '查看任务',
|
||||||
viewOrder: '查看订单',
|
viewOrder: '查看订单',
|
||||||
viewConversation: '查看邮件会话',
|
viewConversation: '查看邮件会话',
|
||||||
legacyMessageNotification: '消息通知(历史 Message Notification)',
|
|
||||||
sourceOnlyOrderLabel: '来源消息只读',
|
sourceOnlyOrderLabel: '来源消息只读',
|
||||||
hiddenTechnicalOrder: '不关联可见订单',
|
hiddenTechnicalOrder: '不关联可见订单',
|
||||||
columns: {
|
columns: {
|
||||||
|
|||||||
@@ -93,12 +93,12 @@ function createTaskListResult(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSourceMessageOnlyTaskListResult(taskSubtype: 'S10' | 'S99' | 'S000' | 'S999' = 'S10') {
|
function createSourceMessageOnlyTaskListResult(taskSubtype: 'S10' | 'S99' = 'S10') {
|
||||||
return {
|
return {
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
task_id: taskSubtype === 'S10' || taskSubtype === 'S000' ? '19990' : '19999',
|
task_id: taskSubtype === 'S10' ? '19990' : '19999',
|
||||||
order_id: taskSubtype === 'S10' || taskSubtype === 'S000' ? '29990' : '29999',
|
order_id: taskSubtype === 'S10' ? '29990' : '29999',
|
||||||
hotel_id: 'HOTEL-TEST',
|
hotel_id: 'HOTEL-TEST',
|
||||||
display_order_key: null,
|
display_order_key: null,
|
||||||
temporary_order_no: null,
|
temporary_order_no: null,
|
||||||
@@ -114,8 +114,8 @@ function createSourceMessageOnlyTaskListResult(taskSubtype: 'S10' | 'S99' | 'S00
|
|||||||
queue_participation: false,
|
queue_participation: false,
|
||||||
can_process: false,
|
can_process: false,
|
||||||
readonly_reason_code: 'QUEUE_EXCLUDED',
|
readonly_reason_code: 'QUEUE_EXCLUDED',
|
||||||
source_message_id: taskSubtype === 'S10' || taskSubtype === 'S000' ? '39990' : '39999',
|
source_message_id: taskSubtype === 'S10' ? '39990' : '39999',
|
||||||
source_subject: taskSubtype === 'S10' || taskSubtype === 'S000' ? 'FYI only' : 'Unclear email',
|
source_subject: taskSubtype === 'S10' ? 'FYI only' : 'Unclear email',
|
||||||
source_sender_summary: 'guest@example.test',
|
source_sender_summary: 'guest@example.test',
|
||||||
source_received_at: '2026-07-08T03:00:00Z',
|
source_received_at: '2026-07-08T03:00:00Z',
|
||||||
external_conversation_id: 'thread-source-only',
|
external_conversation_id: 'thread-source-only',
|
||||||
@@ -485,12 +485,40 @@ describe('reservation P0 views', () => {
|
|||||||
const wrapper = await mountWithPlugins(ReservationTaskListView)
|
const wrapper = await mountWithPlugins(ReservationTaskListView)
|
||||||
await vi.dynamicImportSettled()
|
await vi.dynamicImportSettled()
|
||||||
|
|
||||||
|
const taskTypeOptions = wrapper.find('select[name="task_type"]').findAll('option')
|
||||||
|
.map((option) => option.attributes('value'))
|
||||||
|
const taskSubtypeOptions = wrapper.find('select[name="task_subtype"]').findAll('option')
|
||||||
|
.map((option) => option.attributes('value'))
|
||||||
|
|
||||||
|
expect(taskTypeOptions).toEqual([
|
||||||
|
'',
|
||||||
|
'NEW_BOOKING',
|
||||||
|
'UPDATE_BOOKING',
|
||||||
|
'CANCEL_BOOKING',
|
||||||
|
'MANUAL_REVIEW',
|
||||||
|
'SOURCE_MESSAGE_ONLY',
|
||||||
|
])
|
||||||
|
expect(taskTypeOptions).not.toContain('INFORMATIONAL_MESSAGE')
|
||||||
|
expect(taskSubtypeOptions).toEqual([
|
||||||
|
'',
|
||||||
|
'NEW_BOOKING',
|
||||||
|
'UPDATE_BOOKING',
|
||||||
|
'CANCEL_BOOKING',
|
||||||
|
'RATE_CHANGE',
|
||||||
|
'UPDATE_STAY_DATES',
|
||||||
|
'UPDATE_ROOM_TYPE',
|
||||||
|
'UPDATE_FIX_CHARGE',
|
||||||
|
'NEW_GROUP_BLOCK',
|
||||||
|
'NEW_FIT_RESERVATION',
|
||||||
|
'MANUAL_REVIEW',
|
||||||
|
'S10',
|
||||||
|
'S99',
|
||||||
|
])
|
||||||
|
expect(taskSubtypeOptions).not.toContain('S000')
|
||||||
|
expect(taskSubtypeOptions).not.toContain('S999')
|
||||||
expect(wrapper.find('select[name="task_type"]').text()).toContain('来源消息只读')
|
expect(wrapper.find('select[name="task_type"]').text()).toContain('来源消息只读')
|
||||||
expect(wrapper.find('select[name="task_type"]').text()).toContain('历史 Message Notification')
|
|
||||||
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('纯信息类邮件(S10)')
|
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('纯信息类邮件(S10)')
|
||||||
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('无法形成业务素材包(S99)')
|
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('无法形成业务素材包(S99)')
|
||||||
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('纯信息类邮件')
|
|
||||||
expect(wrapper.find('select[name="task_subtype"]').text()).toContain('无法形成业务素材包')
|
|
||||||
|
|
||||||
await wrapper.find('select[name="task_type"]').setValue('SOURCE_MESSAGE_ONLY')
|
await wrapper.find('select[name="task_type"]').setValue('SOURCE_MESSAGE_ONLY')
|
||||||
await vi.dynamicImportSettled()
|
await vi.dynamicImportSettled()
|
||||||
@@ -504,6 +532,22 @@ describe('reservation P0 views', () => {
|
|||||||
page_num: 1,
|
page_num: 1,
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
const lastTaskRequest = vi.mocked(service.fetchReservationTaskList).mock.calls[
|
||||||
|
vi.mocked(service.fetchReservationTaskList).mock.calls.length - 1
|
||||||
|
]?.[0] ?? {}
|
||||||
|
expect(Object.keys(lastTaskRequest).sort()).toEqual([
|
||||||
|
'keyword',
|
||||||
|
'order_status',
|
||||||
|
'page_num',
|
||||||
|
'page_size',
|
||||||
|
'queue_participation',
|
||||||
|
'task_status',
|
||||||
|
'task_subtype',
|
||||||
|
'task_type',
|
||||||
|
])
|
||||||
|
expect(lastTaskRequest).not.toHaveProperty('result_type')
|
||||||
|
expect(lastTaskRequest).not.toHaveProperty('route_code')
|
||||||
|
expect(lastTaskRequest).not.toHaveProperty('system_process_category')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('renders source-message-only task rows without a visible order action', async () => {
|
it('renders source-message-only task rows without a visible order action', async () => {
|
||||||
|
|||||||
@@ -77,11 +77,34 @@ export interface ReservationOrderListResult {
|
|||||||
page: ReservationPageResult
|
page: ReservationPageResult
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type ReservationTaskListTaskTypeFilter =
|
||||||
|
| ''
|
||||||
|
| 'NEW_BOOKING'
|
||||||
|
| 'UPDATE_BOOKING'
|
||||||
|
| 'CANCEL_BOOKING'
|
||||||
|
| 'MANUAL_REVIEW'
|
||||||
|
| 'SOURCE_MESSAGE_ONLY'
|
||||||
|
|
||||||
|
export type ReservationTaskListTaskSubtypeFilter =
|
||||||
|
| ''
|
||||||
|
| 'NEW_BOOKING'
|
||||||
|
| 'UPDATE_BOOKING'
|
||||||
|
| 'CANCEL_BOOKING'
|
||||||
|
| 'RATE_CHANGE'
|
||||||
|
| 'UPDATE_STAY_DATES'
|
||||||
|
| 'UPDATE_ROOM_TYPE'
|
||||||
|
| 'UPDATE_FIX_CHARGE'
|
||||||
|
| 'NEW_GROUP_BLOCK'
|
||||||
|
| 'NEW_FIT_RESERVATION'
|
||||||
|
| 'MANUAL_REVIEW'
|
||||||
|
| 'S10'
|
||||||
|
| 'S99'
|
||||||
|
|
||||||
export interface ReservationTaskListFilters {
|
export interface ReservationTaskListFilters {
|
||||||
hotel_id?: string
|
hotel_id?: string
|
||||||
order_id?: string
|
order_id?: string
|
||||||
task_type?: string
|
task_type?: ReservationTaskListTaskTypeFilter
|
||||||
task_subtype?: string
|
task_subtype?: ReservationTaskListTaskSubtypeFilter
|
||||||
task_status?: string
|
task_status?: string
|
||||||
order_status?: string
|
order_status?: string
|
||||||
queue_participation?: boolean
|
queue_participation?: boolean
|
||||||
|
|||||||
@@ -44,7 +44,6 @@
|
|||||||
<option value="CANCEL_BOOKING">{{ t('cardType.CANCEL_BOOKING') }}</option>
|
<option value="CANCEL_BOOKING">{{ t('cardType.CANCEL_BOOKING') }}</option>
|
||||||
<option value="MANUAL_REVIEW">{{ t('cardType.MANUAL_REVIEW') }}</option>
|
<option value="MANUAL_REVIEW">{{ t('cardType.MANUAL_REVIEW') }}</option>
|
||||||
<option value="SOURCE_MESSAGE_ONLY">{{ t('cardType.SOURCE_MESSAGE_ONLY') }}</option>
|
<option value="SOURCE_MESSAGE_ONLY">{{ t('cardType.SOURCE_MESSAGE_ONLY') }}</option>
|
||||||
<option value="INFORMATIONAL_MESSAGE">{{ t('taskList.legacyMessageNotification') }}</option>
|
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
@@ -67,8 +66,6 @@
|
|||||||
<option value="MANUAL_REVIEW">{{ t('taskSubtype.MANUAL_REVIEW') }}</option>
|
<option value="MANUAL_REVIEW">{{ t('taskSubtype.MANUAL_REVIEW') }}</option>
|
||||||
<option value="S10">{{ t('taskSubtype.S10') }}</option>
|
<option value="S10">{{ t('taskSubtype.S10') }}</option>
|
||||||
<option value="S99">{{ t('taskSubtype.S99') }}</option>
|
<option value="S99">{{ t('taskSubtype.S99') }}</option>
|
||||||
<option value="S000">{{ t('taskSubtype.S000') }}</option>
|
|
||||||
<option value="S999">{{ t('taskSubtype.S999') }}</option>
|
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ GET /api/reservation/tasks
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `hotel_id` | 否 | 酒店 ID。单酒店阶段默认可为空,由后端按当前用户上下文或平台酒店表唯一 `ACTIVE` 酒店解析;显式传值时后端会校验访问权限。 |
|
| `hotel_id` | 否 | 酒店 ID。单酒店阶段默认可为空,由后端按当前用户上下文或平台酒店表唯一 `ACTIVE` 酒店解析;显式传值时后端会校验访问权限。 |
|
||||||
| `order_id` | 否 | 按订单过滤。 |
|
| `order_id` | 否 | 按订单过滤。 |
|
||||||
| `task_type` | 否 | `NEW_BOOKING`、`UPDATE_BOOKING`、`CANCEL_BOOKING`、`MANUAL_REVIEW`、`INFORMATIONAL_MESSAGE`、`SOURCE_MESSAGE_ONLY`。其中 `INFORMATIONAL_MESSAGE` 仅历史兼容;旧入口 S000/S999 和 0711 P0 结构化 S10/S99 均复用 `SOURCE_MESSAGE_ONLY` 只读源邮件通知卡。 |
|
| `task_type` | 否 | 当前任务列表筛选只提供 `NEW_BOOKING`、`UPDATE_BOOKING`、`CANCEL_BOOKING`、`MANUAL_REVIEW`、`SOURCE_MESSAGE_ONLY`;不再提供历史 `INFORMATIONAL_MESSAGE` 筛选项。0711 P0 结构化 S10/S99 复用 `SOURCE_MESSAGE_ONLY` 只读源邮件通知卡。 |
|
||||||
| `task_status` | 否 | 任务状态过滤。 |
|
| `task_status` | 否 | 任务状态过滤。 |
|
||||||
| `task_subtype` | 否 | 任务卡 subtype 过滤。 |
|
| `task_subtype` | 否 | 任务卡 subtype 过滤。 |
|
||||||
| `order_status` | 否 | 按任务所属订单状态过滤,支持 `TEMPORARY`、`ACTIVE`、`ENDED`、`LOGIC_DELETED`;不传时保持当前行为。 |
|
| `order_status` | 否 | 按任务所属订单状态过滤,支持 `TEMPORARY`、`ACTIVE`、`ENDED`、`LOGIC_DELETED`;不传时保持当前行为。 |
|
||||||
@@ -645,7 +645,7 @@ Content-Type: application/json
|
|||||||
|
|
||||||
## 9. S10/S99 源邮件只读通知卡与历史兼容
|
## 9. S10/S99 源邮件只读通知卡与历史兼容
|
||||||
|
|
||||||
当前状态:后端不提供独立 Message Notification 列表 / 详情接口。旧 SuperAgent 入口返回 `S000,source_message_id` 或 `S999,source_message_id` 时,后端会创建 `SOURCE_MESSAGE_ONLY` 只读特殊任务;0711 P0 结构化 `S10/S99` 也复用同一只读任务模型。前端已通过 `GET /api/reservation/tasks?task_type=SOURCE_MESSAGE_ONLY` 和 `GET /api/reservation/tasks/{taskId}` 展示,并在任务列表筛选中支持 `SOURCE_MESSAGE_ONLY`、`S000`、`S999`、`S10`、`S99`。
|
当前状态:后端不提供独立 Message Notification 列表 / 详情接口。旧 SuperAgent 入口返回 `S000,source_message_id` 或 `S999,source_message_id` 时,后端会创建 `SOURCE_MESSAGE_ONLY` 只读特殊任务;0711 P0 结构化 `S10/S99` 也复用同一只读任务模型。前端已通过 `GET /api/reservation/tasks?task_type=SOURCE_MESSAGE_ONLY` 和 `GET /api/reservation/tasks/{taskId}` 展示;任务列表筛选只保留 `SOURCE_MESSAGE_ONLY`、`S10`、`S99`,不再提供 `S000`、`S999` 历史筛选项。
|
||||||
|
|
||||||
0711 P0 新入口已迁移为结构化 `S10/S99`:
|
0711 P0 新入口已迁移为结构化 `S10/S99`:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user