import type { LocalTransportDetail, LocalTransportStatus } from './types' export const truckStatusLabels: Record = { PENDING_REVIEW: '待审核', WAITING_INBOUND: '待入仓', RECEIVING: '收货中', WAITING_CONSOLIDATION: '待合托', PALLET_OVERAGE_REVIEW: '超托待审', PARTIALLY_ALLOCATED: '部分分配', ALLOCATED: '已分配', PENDING_DISPATCH: '待派车', DISPATCHED: '已派车', IN_TRANSIT: '运输中', COMPLETED: '已完成', REJECTED: '已拒绝', CANCELLED: '已取消', } export const truckCommandLabels = { review: '审核', 'receive-pallets': '登记实收', 'review-pallet-overage': '超托审核', 'allocate-pallets': '分配托盘', 'prepare-dispatch': '确认待派车', dispatch: '确认已派车', 'start-transit': '确认发运', complete: '确认完成', cancel: '取消订单', } as const export type TruckCommand = keyof typeof truckCommandLabels export interface TruckCommandBase { version: number; idempotencyKey: string; remark?: string } export type TruckOperation = | { command: 'review' | 'review-pallet-overage'; payload: TruckCommandBase & { decision: 'APPROVE' | 'REJECT' } } | { command: 'receive-pallets'; payload: TruckCommandBase & { actualPalletCount: number; packageCount?: number; palletPackageCounts?: number[] } } | { command: 'allocate-pallets'; payload: TruckCommandBase & { palletIds: string[] } } | { command: 'prepare-dispatch' | 'dispatch' | 'start-transit' | 'complete'; payload: TruckCommandBase } | { command: 'cancel'; payload: TruckCommandBase & { status: 'CANCELLED' } } const nextCommands: Partial> = { PENDING_REVIEW: 'review', WAITING_INBOUND: 'receive-pallets', RECEIVING: 'receive-pallets', PALLET_OVERAGE_REVIEW: 'review-pallet-overage', WAITING_CONSOLIDATION: 'allocate-pallets', PARTIALLY_ALLOCATED: 'allocate-pallets', ALLOCATED: 'prepare-dispatch', PENDING_DISPATCH: 'dispatch', DISPATCHED: 'start-transit', IN_TRANSIT: 'complete', } const cancellable = new Set(['PENDING_REVIEW', 'WAITING_INBOUND', 'RECEIVING', 'PALLET_OVERAGE_REVIEW', 'WAITING_CONSOLIDATION', 'PARTIALLY_ALLOCATED', 'ALLOCATED', 'PENDING_DISPATCH']) /** 拼车来源只读,独立单据只能执行当前状态对应的具名命令。 */ export function availableTruckCommands(order: Pick): TruckCommand[] { if (order.fleetArrangement) return [] const next = nextCommands[order.status] return [...(next ? [next] : []), ...(cancellable.has(order.status) ? ['cancel' as const] : [])] } export const truckCommandHints: Record = { review: '请核对车型、路线、两端联系信息、取送时间和货物资料。通过后进入待入仓,拒绝后结束本次申请。', 'receive-pallets': '按实际收货填写截至本次的累计实收托数。首次实收确定本单托数,后续超出已确认托数需要超托审核。', 'review-pallet-overage': '通过后将超收托盘纳入本单;拒绝后将超收托盘标记为拒收,按原已确认托数继续。', 'allocate-pallets': '选择本单已实收且未分配的托盘,可分批分配;全部已接收托盘分配完成后才能进入待派车。', 'prepare-dispatch': '确认全部已接收托盘已分配完成,将本单交由调度安排车辆。', dispatch: '请在车辆安排已实际完成后确认,本单将进入已派车。', 'start-transit': '请在车辆已实际发运后确认,本单将进入运输中。', complete: '请在运输及交付已实际完成后确认。确认完成后不能撤回。', cancel: '取消后本单不能继续履约,请填写取消原因并核对已有收货和托盘记录。', }