30 lines
2.5 KiB
TypeScript
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
|
|
}
|