From a646ade658ae51372e838c04775e51487e8ccd0d Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Mon, 28 Sep 2026 17:26:50 +0800 Subject: [PATCH 01/21] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/fulfillment.js | 32 ++++++++++++++ src/data/overseas-workbench.js | 2 +- src/pages/outbound/outbound.vue | 33 ++++++++++---- .../warehouse-transfer/warehouse-transfer.vue | 43 +++++++++++++++---- tests/warehouse-transfer-api.test.mjs | 10 +++++ 5 files changed, 102 insertions(+), 18 deletions(-) diff --git a/src/api/fulfillment.js b/src/api/fulfillment.js index 0a82511..729bb73 100644 --- a/src/api/fulfillment.js +++ b/src/api/fulfillment.js @@ -2,6 +2,7 @@ import { overseasRequest } from './overseas.js' const DISPATCH_BASE = '/pda/v1/last-leg/dispatches' const OUTBOUND_BASE = '/pda/v1/last-leg/outbound-tasks' +const CARGO_DISCARD_BASE = '/pda/v1/last-leg/cargo-discards' const encoded = (value) => encodeURIComponent(String(value || '').trim()) @@ -128,3 +129,34 @@ export function outboundPickPayload(item, position, packages) { export function completeOutboundTask(taskNo, request) { return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/complete`, request) } + +export function normalizeCargoDiscardTask(value) { + const task = value || {} + return { + ...task, + discardNo: String(task?.discardNo || ''), + palletNo: String(task?.palletNo || ''), + status: String(task?.status || 'PENDING'), + skus: asList(task?.skus).map((sku) => ({ + ...sku, + itemId: String(sku?.itemId || ''), + skuCode: String(sku?.skuCode || ''), + productName: String(sku?.productName || ''), + plannedPackages: count(sku?.plannedPackages), + actualPackages: sku?.actualPackages == null ? null : count(sku.actualPackages), + status: String(sku?.status || 'PENDING') + })) + } +} + +export async function listCargoDiscardTasks() { + return asList(await overseasRequest('GET', CARGO_DISCARD_BASE)).map(normalizeCargoDiscardTask) +} + +export async function resolveCargoDiscardPallet(palletNo) { + return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/resolve`, { palletNo })) +} + +export async function confirmCargoDiscard(discardNo, palletNo, lines) { + return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/${encoded(discardNo)}/pallets/${encoded(palletNo)}/confirm`, { lines })) +} diff --git a/src/data/overseas-workbench.js b/src/data/overseas-workbench.js index 60b9292..d99c613 100644 --- a/src/data/overseas-workbench.js +++ b/src/data/overseas-workbench.js @@ -8,7 +8,7 @@ export const MODULES = [ ] }, { key: 'outbound', name: '出库履约', nameKey: 'modules.outbound.name', icon: '出', description: '排车拣货、出库任务与发车闭环', descriptionKey: 'modules.outbound.description', operations: [ { key: 'dispatchPicking', name: '排车拣货', nameKey: 'modules.dispatchPicking.name', icon: '车', iconType: 'paperplane', description: '按排车任务扫描托盘拣货,完成门禁后执行发车', descriptionKey: 'modules.dispatchPicking.description', available: true, route: '/pages/dispatch/dispatch' }, - { key: 'outboundPicking', name: '出库作业', nameKey: 'modules.outboundPicking.name', icon: '拣', iconType: 'checkbox', description: '处理出库与一件代发任务,扫码核平后完成', descriptionKey: 'modules.outboundPicking.description', available: true, route: '/pages/outbound/outbound' } + { key: 'outboundPicking', name: '出库作业', nameKey: 'modules.outboundPicking.name', icon: '拣', iconType: 'checkbox', description: '处理普通出库、一件代发和废弃订单,按托盘扫码完成', descriptionKey: 'modules.outboundPicking.description', available: true, route: '/pages/outbound/outbound' } ] }, { key: 'inventory', name: '库内作业', nameKey: 'modules.inventory.name', icon: '库', description: '商品移库与托盘管理', descriptionKey: 'modules.inventory.description', operations: [ { key: 'move', name: '商品移库', nameKey: 'modules.move.name', icon: '移', iconType: 'loop', description: '扫描来源与目标库位完成移库', descriptionKey: 'modules.move.description', available: true, route: '/pages/move/move' }, diff --git a/src/pages/outbound/outbound.vue b/src/pages/outbound/outbound.vue index b1dd1c8..63bf4a5 100644 --- a/src/pages/outbound/outbound.vue +++ b/src/pages/outbound/outbound.vue @@ -6,8 +6,8 @@ 出库任务一件代发扫描托盘码可整托出库;扫描排车业务号会转入“排车拣货” 当前任务出库作业详情 - - + + 任务号直接恢复;进入任务后扫描 DP 托盘码,将一次拣取该托全部未拣箱件。 @@ -19,7 +19,8 @@ - 暂无出库任务可刷新列表,或扫描任务号恢复未完成作业。 + 暂无出库任务可刷新列表,或扫描任务号恢复未完成作业。 + 废弃订单{{ discardOrderCount }} 个订单 + + {{ successMessage }} @@ -50,7 +57,7 @@ diff --git a/src/pages/return-packing/return-packing.vue b/src/pages/return-packing/return-packing.vue index 835c67b..c237bff 100644 --- a/src/pages/return-packing/return-packing.vue +++ b/src/pages/return-packing/return-packing.vue @@ -2,7 +2,12 @@ - 添加退货单 + + + 没有匹配的已完成退货单或可用库存 @@ -13,7 +18,7 @@ - 退货合箱成功{{ result.label.cartonMark || result.cartonMark }}来源退货单:{{ result.label.sourceReturnNo || '—' }}箱规:{{ sizeText(result.label) }}{{ item.skuCode }}{{ item.quantity }} 件{{ item.productNameZh || '商品名称未填写' }} + 退货合箱成功,共 {{ (result.labels || [result.label]).length }} 箱{{ label.cartonMark }}来源退货单:{{ label.sourceReturnNo || '—' }}箱规:{{ sizeText(label) }}{{ item.skuCode }}{{ item.quantity }} 件 {{ error.message }}错误码:{{ error.code }}requestId:{{ error.requestId }}traceId:{{ error.traceId }} @@ -22,7 +27,7 @@ + diff --git a/src/pages/dispatch/dispatch.vue b/src/pages/dispatch/dispatch.vue index 31dbb60..ba9b125 100644 --- a/src/pages/dispatch/dispatch.vue +++ b/src/pages/dispatch/dispatch.vue @@ -30,7 +30,7 @@ @@ -38,9 +38,10 @@