From 95fb17c5aaaef909cfe6b952ce311d31e1214213 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Tue, 3 Nov 2026 11:43:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/cross-border/PROTOTYPE_MATRIX.md | 8 ++++ .../cross-border/api/businessOrders.ts | 5 +++ .../cross-border/businessOrders.test.mjs | 28 ++++++++++++ .../components/BusinessOrdersView.vue | 44 ++++++++++++++++--- .../components/TransportDemandForm.vue | 2 +- src/modules/cross-border/fleetArrangement.ts | 1 + .../cross-border/transportDemandForm.test.mjs | 15 ++++++- .../cross-border/transportDemandForm.ts | 1 + src/modules/overseas-warehouse/routes.ts | 2 +- .../views/ReturnOrdersView.vue | 3 +- .../views/WarehouseServiceView.vue | 9 ++-- 11 files changed, 102 insertions(+), 16 deletions(-) diff --git a/src/modules/cross-border/PROTOTYPE_MATRIX.md b/src/modules/cross-border/PROTOTYPE_MATRIX.md index 17d7eb1..42d8ecc 100644 --- a/src/modules/cross-border/PROTOTYPE_MATRIX.md +++ b/src/modules/cross-border/PROTOTYPE_MATRIX.md @@ -1,5 +1,13 @@ # 本土卡车字段调整核对 +## 2026-11-02 用户截图问题修复 + +| 页面 | 操作及承载 | 截图依据与调整 | 验收 | +|---|---|---|---| +| 美本土散板 | 既有独立详情页 | 本轮第1张截图:地址跨两列时由网格紧密填补空位,备注占满一行,保留所有字段 | 定向测试与类型检查通过;待人工1920×1080、100%截图确认 | +| 美国本土卡车 | 既有独立新增页 | 本轮第6、10张截图与文字确认:双地址必填;标题右侧补返回列表,沿用Client新增页按钮外观 | 定向测试与类型检查通过;待人工截图确认 | +| 美国本土卡车 | 列表、详情及状态筛选 | 本轮第7、11张截图:补齐当前正式状态中文文案,DISPATCHED显示待取货 | 当前全部正式状态的定向测试通过 | + 依据:用户提供的下单页截图 `codex-clipboard-c458c2e1-e9a8-4726-a8cd-4581e5e7102f.png` 及本轮字段、必填和时分确认。当前需求规则见 `docs/海外仓业务/README.md`“美国本土卡独立下单”。 | 页面 | 操作 | 依据及承载 | 当前调整 | 验收 | diff --git a/src/modules/cross-border/api/businessOrders.ts b/src/modules/cross-border/api/businessOrders.ts index f0af740..8c6240c 100644 --- a/src/modules/cross-border/api/businessOrders.ts +++ b/src/modules/cross-border/api/businessOrders.ts @@ -165,3 +165,8 @@ export function updateTransport(kind: CrossBorderBusinessKind, orderNo: string, data: payload, }) } + +/** 客户按当前版本取消待审核本土卡车订单。 */ +export function cancelTruckOrder(orderNo: string, payload: { version: number; status: 'CANCELLED'; idempotencyKey: string; remark: string }) { + return apiRequest({ method: 'PATCH', url: endpointByKind.trucking + '/' + encodeURIComponent(orderNo) + '/status', data: payload }) +} diff --git a/src/modules/cross-border/businessOrders.test.mjs b/src/modules/cross-border/businessOrders.test.mjs index 049de81..6a6759a 100644 --- a/src/modules/cross-border/businessOrders.test.mjs +++ b/src/modules/cross-border/businessOrders.test.mjs @@ -13,6 +13,19 @@ const demandHelpers = runInNewContext(`${demandLogic}\n({ createTransportDemandF const procurementApi = readFileSync(new URL('./api/procurement.ts', import.meta.url), 'utf8') const procurementView = readFileSync(new URL('./views/ProcurementView.vue', import.meta.url), 'utf8') +test('all current truck statuses display Chinese labels in lists and details', () => { + const labelsCode = ts.transpileModule(readFileSync(new URL('./fleetArrangement.ts', import.meta.url), 'utf8'), { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext } }).outputText.replace(/^export /gm, '') + const { poolOrderStatusLabels } = runInNewContext(`${labelsCode}\n({ poolOrderStatusLabels })`) + const helpers = view.slice(view.indexOf('function read('), view.indexOf('function idempotencyKey(')) + const compiled = ts.transpileModule(helpers, { compilerOptions: { target: ts.ScriptTarget.ES2022 } }).outputText + const { statusLabel, displayCell } = runInNewContext(`${compiled}\n({ statusLabel, displayCell })`, { poolOrderStatusLabels }) + for (const status of ['PENDING_REVIEW', 'FUNDING_PENDING', 'FUNDING_FAILED', 'WAITING_INBOUND', 'RECEIVING', 'WAITING_CONSOLIDATION', 'PALLET_OVERAGE_REVIEW', 'PARTIALLY_ALLOCATED', 'ALLOCATED', 'PENDING_DISPATCH', 'DISPATCHED', 'IN_TRANSIT', 'COMPLETED', 'REJECTED', 'CANCELLED']) { + assert.match(statusLabel(status), /[\u4e00-\u9fff]/, status) + assert.equal(displayCell({ status }, 'status'), statusLabel(status)) + } + assert.equal(statusLabel('DISPATCHED'), '待取货') +}) + test('renders unknown pallet service and container type as dashes while preserving explicit values', () => { const helpers = view.slice(view.indexOf('function read('), view.indexOf('function idempotencyKey(')) const compiled = ts.transpileModule(helpers, { compilerOptions: { target: ts.ScriptTarget.ES2022 } }).outputText @@ -136,6 +149,7 @@ function transportHarness(kind = 'trucking', failFirst = false, budgetCheck = as ElMessage: { success: () => {}, error: () => {} }, createTransport: async (business, payload) => { calls.push({ business, payload: { ...payload } }); if (failFirst && calls.length === 1) throw new Error('retry'); }, }) + Object.assign(harness.form, { deliveryMode: 'WAREHOUSE_PICKUP', operatingWarehouseId: '9', destinationType: 'FBA', originAddress: '123 Pickup Road', destinationAddress: '456 Delivery Road' }) harness.formRef.value = { validate: async () => true, clearValidate: () => {} } return { ...harness, calls, rules: { get value() { return demandHelpers.transportDemandRules(kind === 'trucking' ? 'truck' : 'looseboard', harness.form) } } } } @@ -230,3 +244,17 @@ test('truck creation does not block on a separate budget reservation', async () await current.submit() assert.equal(current.calls.length, 1) }) + + +test('customer truck cancellation uses encoded order identity and current version without client scope', async () => { + const compiled = ts.transpileModule(api.replace(/^import .*$/gm, ''), { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext } }).outputText.replace(/^export /gm, '') + let sent + const { cancelTruckOrder } = runInNewContext(compiled + '\n({ cancelTruckOrder })', { apiRequest: input => { sent = input; return Promise.resolve({}) } }) + const payload = { version: 3, status: 'CANCELLED', idempotencyKey: 'cancel-1', remark: '客户取消' } + await cancelTruckOrder('TR/1', payload) + assert.equal(sent.method, 'PATCH') + assert.equal(sent.url, '/merchant/v1/last-leg/us-truck-orders/TR%2F1/status') + assert.equal(sent.data, payload) + assert.match(view, /summary.status === 'PENDING_REVIEW'/) + assert.match(view, /merchant:cross-border:domestic-trucking:edit/) +}) diff --git a/src/modules/cross-border/components/BusinessOrdersView.vue b/src/modules/cross-border/components/BusinessOrdersView.vue index 7fdf816..3092bfa 100644 --- a/src/modules/cross-border/components/BusinessOrdersView.vue +++ b/src/modules/cross-border/components/BusinessOrdersView.vue @@ -1,7 +1,7 @@