Files
admin-web/src/modules/overseas-warehouse/appointmentForm.ts
T

30 lines
2.5 KiB
TypeScript

import type { FbaAppointmentDetailsPayload, FbaAppointmentDto } from './api/inboundOrders'
export interface AppointmentForm {
plannedDate: string; plannedAt: string; plannedEndAt: string; confirmationNo: string
appointmentAt: string; appointmentEndAt: string; appointmentStatus: FbaAppointmentDetailsPayload['appointmentStatus']
appointmentRemark: string; startOffset: string; endOffset: string
}
export function createAppointmentForm(detail?: FbaAppointmentDto): AppointmentForm {
return { plannedDate: detail?.plannedDate || '', plannedAt: detail?.plannedAt || '', plannedEndAt: detail?.plannedEndAt || '', confirmationNo: detail?.confirmationNo || '',
appointmentAt: detail?.appointmentAt || '', appointmentEndAt: detail?.appointmentEndAt || '', appointmentStatus: (detail?.appointmentStatus || 'PENDING') as AppointmentForm['appointmentStatus'],
appointmentRemark: detail?.appointmentRemark || '', startOffset: confirmedOffset(detail?.appointmentAt, detail?.appointmentStartUtc), endOffset: confirmedOffset(detail?.appointmentEndAt, detail?.appointmentEndUtc) }
}
function confirmedOffset(local?: string | null, utc?: string | null): string {
if (!local || !utc) return ''
const minutes = (Date.parse(`${local}Z`) - Date.parse(utc)) / 60000
if (!Number.isInteger(minutes) || Math.abs(minutes) > 18 * 60) return ''
return `${minutes < 0 ? '-' : '+'}${String(Math.floor(Math.abs(minutes) / 60)).padStart(2, '0')}:${String(Math.abs(minutes) % 60).padStart(2, '0')}`
}
export function appointmentPayload(form: AppointmentForm): FbaAppointmentDetailsPayload {
return { plannedDate: form.plannedDate || null, plannedAt: form.plannedAt || null, plannedEndAt: form.plannedEndAt || null, confirmationNo: form.confirmationNo.trim() || null,
appointmentAt: form.appointmentAt || null, appointmentEndAt: form.appointmentEndAt || null, appointmentStatus: form.appointmentStatus, appointmentRemark: form.appointmentRemark.trim() || null,
startOffset: form.startOffset.trim() || null, endOffset: form.endOffset.trim() || null }
}
export function appointmentFormError(form: AppointmentForm): string | null {
if (form.appointmentStatus === 'CANCELLED') return '请在预约列表使用取消预约操作,并填写实际取消原因'
if (form.appointmentStatus === 'SUCCESS' && (!form.confirmationNo.trim() || !form.appointmentAt)) return '登记对方确认时,请填写外部约号与确认时间'
if (form.appointmentStatus === 'FAILED' && !form.appointmentRemark.trim()) return '请填写未约成的原因'
return null
}