diff --git a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue index 773e3f9..21cccf8 100644 --- a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue +++ b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue @@ -305,6 +305,24 @@ async function loadTransferSourceCartons() { if (!inventoryTransfer.value) return transferSourceLoading.value = true try { + // 退货候选本身就是逐箱库存,使用与下拉一致的实物箱数据,不能按普通入仓快照回查。 + if (selectedTransferInventory.value.startsWith('RETURN_ORDER:')) { + const returnNo = selectedTransferInventory.value.slice('RETURN_ORDER:'.length) + transferSourceCartons.value = transferInventoryCandidates.value + .filter(item => (item.sourceType === 'RETURN_CARTON' || item.sourceType === 'RETURN_PARCEL') + && String(item.inboundOrderNo || '').trim() === returnNo && Number(item.cartonAvailablePackages || 0) > 0) + .filter(item => Boolean(item.cartonMark)) + .map(item => { + const contents = item.cartonSkuItems?.length ? item.cartonSkuItems : item.skuItems || [] + return { cartonMark: item.cartonMark!, productNameZh: item.productNameZh, + quantity: contents.reduce((total, sku) => total + Number(sku.quantity || 0), 0), + destinationWarehouseCode: item.destinationFbaWarehouseCode, + destinationWarehouseName: item.destinationFbaWarehouseName, + items: contents.map(sku => ({ skuCode: sku.skuCode, quantity: Number(sku.quantity || 0) })) } + }) + if (!transferSourceCartons.value.length) throw new Error('当前退货单没有可转运箱,请刷新库存后重试') + return + } const cartons = await getTransferSourceCartons(form.warehouse, selectedTransferInventory.value) if (request === transferSourceRequest) transferSourceCartons.value = cartons } catch (error) { if (request === transferSourceRequest) transferSourceError.value = error instanceof Error ? error.message : '原单箱明细加载失败' } @@ -1653,7 +1671,7 @@ function addReturnBoxBinding(source: RelabelInventoryCandidate) { - +
*入仓方式仓库上门提货客户送货到仓
@@ -1775,7 +1793,7 @@ function addReturnBoxBinding(source: RelabelInventoryCandidate) {

2换标申请

-
+
换标类型只换箱唛只换 SKU 标签SKU 和箱唛都换
@@ -1792,11 +1810,11 @@ function addReturnBoxBinding(source: RelabelInventoryCandidate) {
-
待导入绑定关系

可只勾选本次需要换标的部分,也可以全选后一次导入。

全选导入到明细
选择关系类型客户箱唛号旧 SKU新 SKU数量新 FBA 箱唛
{{ item.templateType === 'mixed' ? 'SKU 混箱换标' : item.templateType === 'carton' ? '箱号关联' : 'SKU 关联' }}{{ item.cartonMark }}{{ item.originalSku || '—' }}{{ item.newSku || '—' }}{{ item.quantity }}{{ item.fbaCartonMark || '—' }}
+
待导入绑定关系

可只勾选本次需要换标的部分,也可以全选后一次导入。

全选导入到明细
选择关系类型仓库唛头旧 SKU新 SKU数量新 FBA 箱唛
{{ item.templateType === 'mixed' ? 'SKU 混箱换标' : item.templateType === 'carton' ? '箱号关联' : 'SKU 关联' }}{{ item.cartonMark }}{{ item.originalSku || '—' }}{{ item.newSku || '—' }}{{ item.quantity }}{{ item.fbaCartonMark || '—' }}
4绑定明细
添加 SKU 明细清空
-
客户箱唛号 *旧 SKU新 FBA 箱唛 *备注操作
暂无绑定明细,请点击“添加换标明细”
-
客户箱唛号 *旧 SKU *新 SKU *换标数量(件)*备注操作
暂无绑定明细,请点击“添加 SKU 明细”
-
客户箱唛号 *旧 SKU *新 SKU *换标数量(件)*新 FBA 箱唛 *备注操作
暂无绑定明细,请点击“添加 SKU 明细”
+
仓库唛头 *旧 SKU新 FBA 箱唛 *备注操作
暂无绑定明细,请点击“添加换标明细”
+
仓库唛头 *旧 SKU *新 SKU *换标数量(件)*备注操作
暂无绑定明细,请点击“添加 SKU 明细”
+
仓库唛头 *旧 SKU *新 SKU *换标数量(件)*新 FBA 箱唛 *备注操作
暂无绑定明细,请点击“添加 SKU 明细”
重置保存草稿提交订单提交{{ config.title }}
@@ -1860,7 +1878,7 @@ function addReturnBoxBinding(source: RelabelInventoryCandidate) {

换标箱级去向

-
换标类型客户箱唛号旧 SKU新 SKU新 FBA 箱唛实际 FBA 目的仓数量备注
{{ binding.operationType === 'CARTON_AND_SKU' ? 'SKU 和箱唛都换' : binding.operationType === 'SKU_LABEL' ? '只换 SKU' : '只换箱唛' }}{{ binding.customerCartonMark || '—' }}{{ binding.originalSku || '—' }}{{ binding.newSku || '—' }}{{ binding.fbaCartonMark || '—' }}{{ binding.operationType === 'SKU_LABEL' ? '沿用原箱去向' : warehouseDisplay(binding.destinationWarehouseCode) }}{{ binding.quantity ?? '—' }}{{ binding.remark || '—' }}
暂无换标绑定明细
+
换标类型仓库唛头旧 SKU新 SKU新 FBA 箱唛实际 FBA 目的仓数量备注
{{ binding.operationType === 'CARTON_AND_SKU' ? 'SKU 和箱唛都换' : binding.operationType === 'SKU_LABEL' ? '只换 SKU' : '只换箱唛' }}{{ binding.customerCartonMark || '—' }}{{ binding.originalSku || '—' }}{{ binding.newSku || '—' }}{{ binding.fbaCartonMark || '—' }}{{ binding.operationType === 'SKU_LABEL' ? '沿用原箱去向' : warehouseDisplay(binding.destinationWarehouseCode) }}{{ binding.quantity ?? '—' }}{{ binding.remark || '—' }}
暂无换标绑定明细

换标完成与出库

diff --git a/src/modules/overseas-warehouse/views/inventoryTransferForm.test.mjs b/src/modules/overseas-warehouse/views/inventoryTransferForm.test.mjs index cf0d64a..c7220c2 100644 --- a/src/modules/overseas-warehouse/views/inventoryTransferForm.test.mjs +++ b/src/modules/overseas-warehouse/views/inventoryTransferForm.test.mjs @@ -4,6 +4,30 @@ import { readFileSync } from 'node:fs' import { transpileModule, ScriptTarget } from 'typescript' const view = readFileSync(new URL('./WarehouseServiceView.vue', import.meta.url), 'utf8') + +test('退货箱明细与来源下拉使用同一份逐箱库存,不请求普通入仓箱接口', async () => { + const body = view.slice(view.indexOf('async function loadTransferSourceCartons('), view.indexOf('// Snowflake IDs')) + const code = transpileModule(body, { compilerOptions: { target: ScriptTarget.ES2022 } }).outputText + const ctx = { transferSourceCartons: { value: [] }, transferSourceError: { value: '' }, + transferSourceLoading: { value: false }, inventoryTransfer: { value: true }, + selectedTransferInventory: { value: 'RETURN_ORDER:RET-1' }, form: { warehouse: 'WH' }, + transferInventoryCandidates: { value: [ + { sourceType: 'RETURN_CARTON', inboundOrderNo: 'RET-1', cartonMark: 'BOX-1', cartonAvailablePackages: 1, + cartonSkuItems: [{ skuCode: 'A', quantity: 3 }, { skuCode: 'B', quantity: 2 }] }, + { sourceType: 'RETURN_PARCEL', inboundOrderNo: 'RET-1', cartonMark: 'BOX-2', cartonAvailablePackages: 1, + cartonSkuItems: [{ skuCode: 'A', quantity: 1 }] }, + { sourceType: 'RETURN_CARTON', inboundOrderNo: 'OTHER', cartonMark: 'FOREIGN', cartonAvailablePackages: 1 }, + { sourceType: 'RETURN_CARTON', inboundOrderNo: 'RET-1', cartonMark: 'OCCUPIED', cartonAvailablePackages: 0 }, + ] }, getTransferSourceCartons: () => { throw Error('不应调用普通来源箱查询') } } + const load = new Function(...Object.keys(ctx), 'let transferSourceRequest=0;' + code + ';return loadTransferSourceCartons')(...Object.values(ctx)) + await load() + assert.deepEqual(ctx.transferSourceCartons.value.map(box => box.cartonMark), ['BOX-1', 'BOX-2']) + assert.equal(ctx.transferSourceCartons.value[0].quantity, 5) + assert.equal(ctx.transferSourceCartons.value[0].items.length, 2) + assert.equal(ctx.transferSourceError.value, '') + assert.equal(ctx.transferSourceLoading.value, false) +}) + function setup() { const body = view.slice(view.indexOf('async function selectTransferInventory('), view.indexOf('function selectTransferInboundMethod(')) const code = transpileModule(body, { compilerOptions: { target: ScriptTarget.ES2022 } }).outputText diff --git a/src/modules/overseas-warehouse/views/warehouseTransferForm.test.mjs b/src/modules/overseas-warehouse/views/warehouseTransferForm.test.mjs index 6892ed3..c55636f 100644 --- a/src/modules/overseas-warehouse/views/warehouseTransferForm.test.mjs +++ b/src/modules/overseas-warehouse/views/warehouseTransferForm.test.mjs @@ -79,7 +79,7 @@ test('仓储转运不要求客户填写内部入仓号和我方箱唛,但换 assert.doesNotMatch(transferConfig, /进仓编号/) assert.doesNotMatch(transferSubmit, /inboundCode|sourceLastlegOrderIds/) assert.match(view, /货物明细/) - assert.match(view, /客户箱唛号 \*/) + assert.match(view, /仓库唛头 \*/) assert.match(view, /downloadTransferCartonMarkTemplate/) assert.match(view, /importTransferCartonMarks/) assert.match(view, /SKU 关联<\/strong>/)