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 () => {