diff --git a/src/modules/cross-border/PROTOTYPE_MATRIX.md b/src/modules/cross-border/PROTOTYPE_MATRIX.md new file mode 100644 index 0000000..e151aa8 --- /dev/null +++ b/src/modules/cross-border/PROTOTYPE_MATRIX.md @@ -0,0 +1,11 @@ +# 本土卡车字段调整核对 + +依据:用户提供的下单页截图 `codex-clipboard-c458c2e1-e9a8-4726-a8cd-4581e5e7102f.png` 及本轮字段、必填和时分确认。当前需求规则见 `docs/海外仓业务/README.md`“美国本土卡独立下单”。 + +| 页面 | 操作 | 依据及承载 | 当前调整 | 验收 | +|---|---|---|---|---| +| 美国本土卡 | 新增 | 用户截图:独立页面、单列表单、取消和提交按钮 | 保留容器、按钮;按确认删除字段,新增车型及两端联系人和时间 | 自动验证与人工视觉验收分开;待人工截图确认 | +| 美国本土卡 | 列表 | 现有 `BusinessOrdersView.vue` 的独立列表与左侧操作列 | 对应列展示车型和取送时间 | 待人工截图确认 | +| 美国本土卡 | 详情 | 现有独立详情路由及键值网格 | 展示保存的两端联系信息、车型和取送时间;加宽长字段标签 | 待人工截图确认 | + +不改动散板字段和承载方式。无新增审核、删除或附件操作。 diff --git a/src/modules/cross-border/api/businessOrders.ts b/src/modules/cross-border/api/businessOrders.ts index ae51b30..3961d21 100644 --- a/src/modules/cross-border/api/businessOrders.ts +++ b/src/modules/cross-border/api/businessOrders.ts @@ -18,6 +18,9 @@ export interface BusinessOrderQuery { routeKeyword?: string transportType?: string transportMode?: string + vehicleType?: 'PALLET_15' | 'PALLET_30' + pickupFrom?: string + pickupTo?: string requestedFrom?: string requestedTo?: string createdFrom?: string @@ -27,21 +30,28 @@ export interface BusinessOrderQuery { export interface TransportSummary { fleetArrangement: import('../fleetArrangement').FleetArrangement | null orderNo: string - transportType: string + transportType?: string transportMode?: string palletRequired?: string | null origin: string destination: string - containerType: string | null + containerType?: string | null palletCount?: number packageCount: number totalWeightKg: number totalVolumeCbm: number budgetAmount: number | null currency: string | null - contactName: string | null - contactInfo: string | null - requestedDate: string | null + contactName?: string | null + contactInfo?: string | null + requestedDate?: string | null + vehicleType?: 'PALLET_15' | 'PALLET_30' | null + originContactName?: string | null + originContactPhone?: string | null + destinationContactName?: string | null + destinationContactPhone?: string | null + pickupAt?: string | null + deliveryAt?: string | null status: string version: number createdAt: string @@ -64,7 +74,6 @@ export interface TransportCreate { destination: string destinationAddress?: string containerType?: string - palletCount?: number packageCount: number totalWeightKg: number totalVolumeCbm: number @@ -77,10 +86,35 @@ export interface TransportCreate { idempotencyKey: string } +export interface TruckCreate { + vehicleType: 'PALLET_15' | 'PALLET_30' + origin: string + originAddress?: string + destination: string + destinationAddress?: string + originContactName: string + originContactPhone: string + destinationContactName: string + destinationContactPhone: string + pickupAt: string + deliveryAt: string + packageCount: number + totalWeightKg: number + totalVolumeCbm: number + budgetAmount?: number + currency?: string + remark?: string + idempotencyKey: string +} + export interface TransportUpdate extends Omit { version: number } +export interface TruckUpdate extends Omit { + version: number +} + const endpointByKind: Record = { trucking: '/merchant/v1/last-leg/us-truck-orders', looseboard: '/merchant/v1/last-leg/local-looseboard-orders', @@ -98,11 +132,15 @@ export function getBusinessOrder(kind: CrossBorderBusinessKind, orderNo: stri return apiRequest({ method: 'GET', url: `${endpointByKind[kind]}/${encodeURIComponent(orderNo)}` }) } -export function createTransport(kind: 'trucking' | 'looseboard', payload: TransportCreate) { +export function createTransport(kind: 'trucking', payload: TruckCreate): Promise +export function createTransport(kind: 'looseboard', payload: TransportCreate): Promise +export function createTransport(kind: CrossBorderBusinessKind, payload: TransportCreate | TruckCreate) { return apiRequest({ method: 'POST', url: endpointByKind[kind], data: payload }) } -export function updateTransport(kind: 'trucking' | 'looseboard', orderNo: string, payload: TransportUpdate) { +export function updateTransport(kind: 'trucking', orderNo: string, payload: TruckUpdate): Promise +export function updateTransport(kind: 'looseboard', orderNo: string, payload: TransportUpdate): Promise +export function updateTransport(kind: CrossBorderBusinessKind, orderNo: string, payload: TransportUpdate | TruckUpdate) { return apiRequest({ method: kind === 'trucking' ? 'PATCH' : 'PUT', url: `${endpointByKind[kind]}/${encodeURIComponent(orderNo)}`, diff --git a/src/modules/cross-border/businessOrders.test.mjs b/src/modules/cross-border/businessOrders.test.mjs index 38830ef..b8584cb 100644 --- a/src/modules/cross-border/businessOrders.test.mjs +++ b/src/modules/cross-border/businessOrders.test.mjs @@ -115,3 +115,65 @@ test('uses the shared dense order-list and detail visual language', () => { assert.match(view, /\.detail-grid \{[^}]*grid-template-columns: repeat\(4, minmax\(0, 1fr\)\)/) assert.match(view, /\.detail-grid div \{[^}]*min-height: 34px;[^}]*grid-template-columns: 76px minmax\(0, 1fr\)/) }) + +function transportHarness(kind = 'trucking', failFirst = false) { + const calls = [] + const script = view.match(/