适配 M002 V3 字段矩阵前端交互
This commit is contained in:
1 parent
db95aece20
commit
9bd6bc1cd0
11 files changed
+515
-66
No files matched your search
@@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest'
|
||||
|
||||
import type { ReservationTaskFieldResult } from '@/types/reservation'
|
||||
import {
|
||||
buildInitialFieldValues,
|
||||
buildEditableFieldValues,
|
||||
groupReservationFields,
|
||||
validateReservationFieldValues,
|
||||
@@ -147,4 +148,156 @@ describe('validateReservationFieldValues', () => {
|
||||
'case_keys.group_code': 'GRP-001',
|
||||
})
|
||||
})
|
||||
|
||||
it('hydrates P0 room_items fields from field_values and submits main field_path keys', () => {
|
||||
const roomTypeField = createField({
|
||||
field_path: 'extracted_fields.room_items.0.room_type_raw',
|
||||
field_pointer: '/extracted_fields/room_items/0/room_type_raw',
|
||||
legacy_field_path: 'extracted_fields.room_type',
|
||||
display_name: '房型原文',
|
||||
})
|
||||
const pmsCodeField = createField({
|
||||
field_path: 'extracted_fields.room_items.0.pms_room_type_code',
|
||||
field_pointer: '/extracted_fields/room_items/0/pms_room_type_code',
|
||||
legacy_field_path: 'extracted_fields.pms_room_type_code',
|
||||
display_name: 'PMS 房型代码',
|
||||
})
|
||||
|
||||
const values = buildInitialFieldValues(
|
||||
[roomTypeField, pmsCodeField],
|
||||
{
|
||||
field_values: {
|
||||
'extracted_fields.room_items.0.room_type_raw': 'Deluxe Q1A',
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'Q1A',
|
||||
},
|
||||
},
|
||||
'20260711-p0',
|
||||
)
|
||||
const payload = buildEditableFieldValues([roomTypeField, pmsCodeField], values, false)
|
||||
|
||||
expect(values).toMatchObject({
|
||||
'extracted_fields.room_items.0.room_type_raw': 'Deluxe Q1A',
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'Q1A',
|
||||
})
|
||||
expect(payload).toEqual({
|
||||
'extracted_fields.room_items.0.room_type_raw': 'Deluxe Q1A',
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'Q1A',
|
||||
})
|
||||
expect(payload).not.toHaveProperty('extracted_fields.room_type')
|
||||
expect(payload).not.toHaveProperty('extracted_fields.pms_room_type_code')
|
||||
})
|
||||
|
||||
it('hydrates P0 fields from nested field_values as a defensive fallback', () => {
|
||||
const values = buildInitialFieldValues(
|
||||
[
|
||||
createField({
|
||||
field_path: 'extracted_fields.room_items.0.room_quantity',
|
||||
field_pointer: '/extracted_fields/room_items/0/room_quantity',
|
||||
legacy_field_path: 'extracted_fields.room_quantity',
|
||||
display_name: '房间数量',
|
||||
}),
|
||||
],
|
||||
{
|
||||
field_values: {
|
||||
extracted_fields: {
|
||||
room_items: [
|
||||
{
|
||||
room_quantity: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
'20260711-p0',
|
||||
)
|
||||
|
||||
expect(values).toEqual({
|
||||
'extracted_fields.room_items.0.room_quantity': 2,
|
||||
})
|
||||
})
|
||||
|
||||
it('hydrates code-v1 historical fields from legacy_field_values into P0 main keys', () => {
|
||||
const values = buildInitialFieldValues(
|
||||
[
|
||||
createField({
|
||||
field_path: 'extracted_fields.room_items.0.pms_room_type_code',
|
||||
field_pointer: '/extracted_fields/room_items/0/pms_room_type_code',
|
||||
legacy_field_path: 'extracted_fields.pms_room_type_code',
|
||||
display_name: 'PMS 房型代码',
|
||||
}),
|
||||
],
|
||||
{
|
||||
field_values: {
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'NEW',
|
||||
},
|
||||
legacy_field_values: {
|
||||
'extracted_fields.pms_room_type_code': 'LEGACY',
|
||||
},
|
||||
},
|
||||
'code-v1',
|
||||
)
|
||||
|
||||
expect(values).toEqual({
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'LEGACY',
|
||||
})
|
||||
})
|
||||
|
||||
it('hydrates code-v1 historical fields from legacy effective_payload when legacy_field_values is absent', () => {
|
||||
const values = buildInitialFieldValues(
|
||||
[
|
||||
createField({
|
||||
field_path: 'extracted_fields.room_items.0.pms_room_type_code',
|
||||
field_pointer: '/extracted_fields/room_items/0/pms_room_type_code',
|
||||
legacy_field_path: 'extracted_fields.pms_room_type_code',
|
||||
display_name: 'PMS 房型代码',
|
||||
}),
|
||||
],
|
||||
{
|
||||
effective_payload: {
|
||||
extracted_fields: {
|
||||
pms_room_type_code: 'LEGACY-NESTED',
|
||||
},
|
||||
},
|
||||
},
|
||||
'code-v1',
|
||||
)
|
||||
|
||||
expect(values).toEqual({
|
||||
'extracted_fields.room_items.0.pms_room_type_code': 'LEGACY-NESTED',
|
||||
})
|
||||
})
|
||||
|
||||
it('does not create frontend required errors for readonly evidence fields missing in V3 payloads', () => {
|
||||
const errors = validateReservationFieldValues(
|
||||
[
|
||||
createField({
|
||||
field_path: 'visible_reason',
|
||||
display_name: '生成原因',
|
||||
editable: 'N',
|
||||
input_editable: 'N',
|
||||
required_rule: 'Y',
|
||||
value: null,
|
||||
}),
|
||||
createField({
|
||||
field_path: 'extracted_fields.room_items.0.pms_room_type_code',
|
||||
display_name: 'PMS 房型代码',
|
||||
field_pointer: '/extracted_fields/room_items/0/pms_room_type_code',
|
||||
legacy_field_path: 'extracted_fields.pms_room_type_code',
|
||||
required_rule: 'Y',
|
||||
value: '',
|
||||
}),
|
||||
],
|
||||
{
|
||||
relevant_message_excerpt: 'Please book a Deluxe Q1A room.',
|
||||
'extracted_fields.room_items.0.pms_room_type_code': '',
|
||||
},
|
||||
)
|
||||
|
||||
expect(errors).toEqual({
|
||||
'extracted_fields.room_items.0.pms_room_type_code': {
|
||||
code: 'required',
|
||||
field_name: 'PMS 房型代码',
|
||||
},
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user