提交代码

This commit is contained in:
andy
2026-07-22 15:30:26 +07:00
parent 1236df86cf
commit 7e2cd8969f
7 changed files with 137 additions and 9 deletions

View File

@@ -195,6 +195,7 @@ import type {
ReservationRecord,
ReservationV4OrderTaskDetailResult,
ReservationV4TaskCardResult,
ReservationV4TaskCardFieldResult,
} from '@/types/reservation'
import {
formatReservationTaskCard,
@@ -209,7 +210,9 @@ import {
isReservationV4ReviewWritableField,
isReservationV4TraceSafeField,
mapReservationV4BackendDetailsToFields,
fieldPathToPointer,
reservationV4FieldKey,
type ReservationV4FieldValidationMessageContext,
validateReservationV4Fields,
} from '@/utils/reservationV4FieldRules'
@@ -405,7 +408,11 @@ function canReviewCard(card: ReservationV4TaskCardResult): boolean {
async function submitConfirm(card: ReservationV4TaskCardResult): Promise<void> {
const submissionFields = submissionFieldsForCard(card)
const writableFields = submissionFields.filter(isReservationV4ConfirmWritableField)
const localErrors = validateReservationV4Fields(writableFields, cardValues.value[card.card_id] ?? {})
const localErrors = validateReservationV4Fields(
writableFields,
cardValues.value[card.card_id] ?? {},
{ formatMessage: (context) => formatLocalFieldValidationMessage(card, context) },
)
cardFieldErrors.value = {
...cardFieldErrors.value,
[card.card_id]: localErrors,
@@ -458,7 +465,11 @@ async function submitReview(card: ReservationV4TaskCardResult): Promise<void> {
const submissionFields = submissionFieldsForCard(card)
const writableFields = submissionFields.filter(isReservationV4ReviewWritableField)
const localErrors = validateReservationV4Fields(writableFields, cardValues.value[card.card_id] ?? {})
const localErrors = validateReservationV4Fields(
writableFields,
cardValues.value[card.card_id] ?? {},
{ formatMessage: (context) => formatLocalFieldValidationMessage(card, context) },
)
cardFieldErrors.value = {
...cardFieldErrors.value,
[card.card_id]: localErrors,
@@ -610,6 +621,39 @@ function cardTitle(card: ReservationV4TaskCardResult): string {
return formatReservationTaskCard(t, card.card_type)
}
function formatLocalFieldValidationMessage(
card: ReservationV4TaskCardResult,
context: ReservationV4FieldValidationMessageContext,
): string {
const fieldLabel = localFieldLabel(card, context.field)
if (context.type === 'positiveInteger') {
return t('taskV4.fieldValidation.positiveInteger', { field: fieldLabel })
}
return t('taskV4.fieldValidation.required', { field: fieldLabel })
}
function localFieldLabel(
card: ReservationV4TaskCardResult,
field: ReservationV4TaskCardFieldResult,
): string {
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
if (isTraceCard(card)) {
if (pointer.endsWith('/text')) {
return t('taskV4.trace.textLabel')
}
if (pointer.endsWith('/department_code')) {
return t('taskV4.trace.department')
}
if (pointer.endsWith('/target_room_type_code')) {
return t('taskV4.trace.targetRoomType')
}
if (pointer.endsWith('/extra_bed_room_count')) {
return t('taskV4.trace.extraBedRoomCount')
}
}
return field.display_name || reservationV4FieldKey(field)
}
function formatApiError(error: unknown, fallback: string): {
message: string
details: unknown