From 12de982dacaebd741ca77ef9b470de4116f60247 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 3 Oct 2026 13:28:23 +0800 Subject: [PATCH] feat(dispatch): show original and remaining handover quantities --- src/api/trip-handover.js | 4 +++- src/components/DispatchHandoverStatus.vue | 2 +- tests/trip-handover.test.mjs | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/api/trip-handover.js b/src/api/trip-handover.js index 3e0a3b3..558286f 100644 --- a/src/api/trip-handover.js +++ b/src/api/trip-handover.js @@ -11,7 +11,9 @@ export function normalizeHandoverStatus(value) { deliveries: value.deliveries.map(row => { const packages = Number(row.packages) if (!row.deliveryNo || row.packages == null || String(row.packages).trim() === '' || !Number.isSafeInteger(packages) || packages <= 0) throw new Error('交接状态中的派送箱数无效') - return { deliveryNo: text(row.deliveryNo), status: text(row.status), packages, terminalAt: text(row.terminalAt), transport: transport(row.transport) } + const remainingPackages = Number(row.remainingPackages) + if (row.remainingPackages == null || String(row.remainingPackages).trim() === '' || !Number.isSafeInteger(remainingPackages) || remainingPackages < 0 || remainingPackages > packages) throw new Error('交接状态中的剩余箱数无效') + return { deliveryNo: text(row.deliveryNo), status: text(row.status), packages, remainingPackages, terminalAt: text(row.terminalAt), transport: transport(row.transport) } }), latestHandover: value.latestHandover ? { handoverNo: text(value.latestHandover.handoverNo), handedOverAt: text(value.latestHandover.handedOverAt), location: text(value.latestHandover.location), previous: transport(value.latestHandover.previous), replacement: transport(value.latestHandover.replacement) } : null diff --git a/src/components/DispatchHandoverStatus.vue b/src/components/DispatchHandoverStatus.vue index 7990a9d..39f2589 100644 --- a/src/components/DispatchHandoverStatus.vue +++ b/src/components/DispatchHandoverStatus.vue @@ -17,7 +17,7 @@ 本排车暂无在途交接记录。 - {{ delivery.deliveryNo }} · {{ delivery.packages }} 箱 · {{ label(delivery) }} + {{ delivery.deliveryNo }} · 原实发 {{ delivery.packages }} 箱 · 剩余 {{ delivery.remainingPackages }} 箱 · {{ label(delivery) }} {{ delivery.terminalAt ? '完成时承运' : '当前承运' }}:{{ delivery.transport.vehiclePlate || '—' }} · {{ delivery.transport.driverName || '—' }} 联系电话 {{ delivery.transport.driverPhone }} diff --git a/tests/trip-handover.test.mjs b/tests/trip-handover.test.mjs index 3587bef..20f9b44 100644 --- a/tests/trip-handover.test.mjs +++ b/tests/trip-handover.test.mjs @@ -7,8 +7,8 @@ import { session } from '../src/stores/session.js' const wire = () => ({ dispatchNo: 'PC-ONE', tripNo: 'TR-ONE', tripStatus: 'IN_TRANSIT', tripRecordVersion: '90071992547409931', originalDeparture: { vehiclePlate: 'ORIGINAL', driverName: '原司机' }, - deliveries: [{ deliveryNo: 'DL-DONE', status: 'DELIVERED', packages: '10', terminalAt: '2026-10-03T01:00:00Z', transport: { vehiclePlate: 'ORIGINAL', driverName: '原司机' } }, - { deliveryNo: 'DL-PENDING', status: 'WAIT_DELIVERY', packages: 20, terminalAt: null, transport: { vehiclePlate: 'NEW', driverName: '接替司机' } }], latestHandover: null }) + deliveries: [{ deliveryNo: 'DL-DONE', status: 'DELIVERED', packages: '10', remainingPackages: 0, terminalAt: '2026-10-03T01:00:00Z', transport: { vehiclePlate: 'ORIGINAL', driverName: '原司机' } }, + { deliveryNo: 'DL-PENDING', status: 'WAIT_DELIVERY', packages: 20, remainingPackages: 16, terminalAt: null, transport: { vehiclePlate: 'NEW', driverName: '接替司机' } }], latestHandover: null }) test('PDA query stays a GET in the dedicated namespace and never supplies customer or warehouse', async () => { const calls = []; session.apiBase = '/gateway-api'; session.token = 'test-token' @@ -23,6 +23,8 @@ test('normalization exposes only business references and does not replace missin const value = normalizeHandoverStatus(data) assert.doesNotMatch(JSON.stringify(value), /secret-/); assert.equal(value.originalDeparture.vehiclePlate, '') assert.equal(value.deliveries[0].packages, 10) + assert.equal(value.deliveries[1].remainingPackages, 16) + for (const remainingPackages of [null, '', -1, 21, '1.5']) assert.throws(() => normalizeHandoverStatus({ ...data, deliveries: [{ ...data.deliveries[1], remainingPackages }] }), /剩余箱数无效/) for (const packages of [null, '', -1, 0, '1.5']) assert.throws(() => normalizeHandoverStatus({ ...data, deliveries: [{ ...data.deliveries[0], packages }] }), /箱数无效/) }) test('a response for another dispatch is rejected', async () => {