接入V4房型信息展示模型

This commit is contained in:
andy committed 2026-07-21 09:04:13 +07:00
1 parent 1d593f05fd
commit 8d181ee8ad
21 files changed
+1390 -77

No files matched your search

+32 -1
View File
@@ -18,7 +18,8 @@ const reviewWriteTargets = new Set([
'FIELD_OVERRIDES',
])
const readonlyControlTypes = new Set(['READONLY', 'FILE', 'WORKFLOW_STATE', 'STRUCTURED_TABLE'])
const reviewWritablePointerPrefixes = ['/basic_information/', '/business_fields/']
const reviewWritablePointerPrefixes = ['/basic_information/', '/room_information/final_values/', '/business_fields/']
const roomInformationFieldPrefix = '/room_information/final_values/'
const hiddenDisplayValue = Symbol('reservation-v4-hidden-display-value')
export type ReservationV4FieldErrorMap = Record<string, string>
@@ -37,6 +38,11 @@ export function buildReservationV4InitialFieldValues(
}, {})
}
export function isReservationV4RoomInformationSafeField(field: ReservationV4TaskCardFieldResult): boolean {
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
return pointer.startsWith(roomInformationFieldPrefix) && !isForbiddenRoomInformationPointer(pointer)
}
export function buildReservationV4ConfirmedPayload(
fields: ReservationV4TaskCardFieldResult[],
values: ReservationRecord,
@@ -78,6 +84,9 @@ export function isReservationV4ConfirmWritableField(field: ReservationV4TaskCard
if (!isReservationV4EditableField(field)) {
return false
}
if (isRoomInformationReadOnlyDerivedField(field)) {
return false
}
if (isUnsafeV4Field(field)) {
return false
}
@@ -92,6 +101,9 @@ export function isReservationV4ReviewWritableField(field: ReservationV4TaskCardF
if (!isReservationV4EditableField(field)) {
return false
}
if (isRoomInformationReadOnlyDerivedField(field)) {
return false
}
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
if (!reviewWritablePointerPrefixes.some((prefix) => pointer.startsWith(prefix))) {
return false
@@ -352,6 +364,25 @@ function isUnsafeV4Field(field: ReservationV4TaskCardFieldResult): boolean {
return isReservationV4UnsafeDisplayKey(field.field_path) || isReservationV4UnsafeDisplayKey(field.field_pointer)
}
function isRoomInformationReadOnlyDerivedField(field: ReservationV4TaskCardFieldResult): boolean {
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
if (!pointer.startsWith(roomInformationFieldPrefix)) {
return false
}
return isForbiddenRoomInformationPointer(pointer)
}
function isForbiddenRoomInformationPointer(pointer: string): boolean {
const normalizedPointer = pointer.toLowerCase()
return normalizedPointer.endsWith('/nights') ||
normalizedPointer.endsWith('/adult') ||
normalizedPointer.endsWith('/adults') ||
normalizedPointer.endsWith('/block_id') ||
normalizedPointer.endsWith('/confirmation_number') ||
normalizedPointer.includes('/target_order') ||
normalizedPointer.includes('/locator_value')
}
function isUnsafeUrlLikeValue(value: string): boolean {
const trimmedValue = value.trim()
return /^(https?:\/\/|oss:\/\/|s3:\/\/)/i.test(trimmedValue)