From 23cef8e1060931a3d6b74694aaa1f24635cafc4a Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 11 Sep 2026 16:50:23 +0800 Subject: [PATCH] feat: simplify same-carton SKU editing --- .../first-leg/utils/firstLegOrder.test.mjs | 11 ++- src/modules/first-leg/utils/firstLegOrder.ts | 13 ++- .../views/FirstLegOrdersView.test.mjs | 7 ++ .../first-leg/views/FirstLegOrdersView.vue | 93 +++++++++++++++++-- 4 files changed, 106 insertions(+), 18 deletions(-) diff --git a/src/modules/first-leg/utils/firstLegOrder.test.mjs b/src/modules/first-leg/utils/firstLegOrder.test.mjs index d7d6a93..ec768bb 100644 --- a/src/modules/first-leg/utils/firstLegOrder.test.mjs +++ b/src/modules/first-leg/utils/firstLegOrder.test.mjs @@ -185,10 +185,15 @@ test('counts one physical carton series for SKU lines in the same mixed-carton g const first = { ...validDraft().items[0], packingGroupNo: 'A', packageCount: 10, pieces: 20, unitsPerPackage: 2 } const second = { ...first, id: 'cargo-2', sku: 'SKU-002', pieces: 30, unitsPerPackage: 3 } - assert.equal(summarizeFirstLegCargo([first, second]).packageCount, 10) + assert.deepEqual(summarizeFirstLegCargo([first, second]), { + pieces: 50, + packageCount: 10, + grossWeightKg: first.grossWeightKg, + volumeCbm: first.volumeCbm, + }) const draft = { ...validDraft(), fulfillmentType: 'ONE_CLICK_DROPSHIP', items: [first, second] } - assert.ok(!validateFirstLegOrderDraft(draft).some((message) => message.includes('混箱组合'))) + assert.ok(!validateFirstLegOrderDraft(draft).some((message) => message.includes('同箱 SKU'))) second.packageCount = 9 - assert.ok(validateFirstLegOrderDraft(draft).includes('混箱组合 A 的箱数、包装类型和箱规必须一致')) + assert.ok(validateFirstLegOrderDraft(draft).includes('同箱 SKU 的箱数、包装类型、箱规、重量和体积必须一致')) }) diff --git a/src/modules/first-leg/utils/firstLegOrder.ts b/src/modules/first-leg/utils/firstLegOrder.ts index 708ce27..169679c 100644 --- a/src/modules/first-leg/utils/firstLegOrder.ts +++ b/src/modules/first-leg/utils/firstLegOrder.ts @@ -150,8 +150,10 @@ export function validateFirstLegOrderDraft(draft: FirstLegOrderDraft) { const first = groups.get(group) if (!first) groups.set(group, item) else if (first.packageCount !== item.packageCount || first.packageType !== item.packageType - || first.lengthCm !== item.lengthCm || first.widthCm !== item.widthCm || first.heightCm !== item.heightCm) { - errors.push(`混箱组合 ${group} 的箱数、包装类型和箱规必须一致`) + || first.lengthCm !== item.lengthCm || first.widthCm !== item.widthCm || first.heightCm !== item.heightCm + || first.grossWeightKg !== item.grossWeightKg || first.netWeightKg !== item.netWeightKg + || first.volumeCbm !== item.volumeCbm) { + errors.push(`同箱 SKU 的箱数、包装类型、箱规、重量和体积必须一致`) } }) } @@ -164,13 +166,14 @@ export function summarizeFirstLegCargo(items: FirstLegCargoItem[]) { return items.reduce( (summary, item) => { const group = item.packingGroupNo.trim() - const packageCount = group && countedGroups.has(group) ? 0 : item.packageCount + const alreadyCounted = Boolean(group && countedGroups.has(group)) + const packageCount = alreadyCounted ? 0 : item.packageCount if (group) countedGroups.add(group) return ({ pieces: summary.pieces + item.pieces, packageCount: summary.packageCount + packageCount, - grossWeightKg: summary.grossWeightKg + item.grossWeightKg, - volumeCbm: summary.volumeCbm + item.volumeCbm, + grossWeightKg: summary.grossWeightKg + (alreadyCounted ? 0 : item.grossWeightKg), + volumeCbm: summary.volumeCbm + (alreadyCounted ? 0 : item.volumeCbm), }) }, { pieces: 0, packageCount: 0, grossWeightKg: 0, volumeCbm: 0 }, diff --git a/src/modules/first-leg/views/FirstLegOrdersView.test.mjs b/src/modules/first-leg/views/FirstLegOrdersView.test.mjs index 93336b5..eea643e 100644 --- a/src/modules/first-leg/views/FirstLegOrdersView.test.mjs +++ b/src/modules/first-leg/views/FirstLegOrdersView.test.mjs @@ -357,6 +357,13 @@ test('distills order creation into the confirmed prototype sections with server assert.doesNotMatch(source, /未填写行标识/) assert.match(source, /batchImportError[\s\S]*requestId[\s\S]*traceId/) assert.match(source, /添加行[\s\S]*删除所选行/) + assert.match(source, /添加 SKU/) + assert.match(source, /addSkuToPackingGroup/) + assert.match(source, /shared-carton-value">同箱/) + assert.match(source, /syncSkuQuantity/) + assert.match(source, /每个箱组默认装一个 SKU/) + assert.doesNotMatch(source, /v-model="item\.packingGroupNo"/) + assert.doesNotMatch(cargoTableSource, /
| # | -SKU NO.SKU必填 | 混箱组合同号为同一批箱 | 中文品名 | 图片 | 英文品名 | 报关 HS CODE | 清关 HS CODE | 包装类型 | 材质 | 危险品 | 木制品勾选后须商检 | +SKU NO.SKU必填 | 中文品名 | 图片 | 英文品名 | 报关 HS CODE | 清关 HS CODE | 包装类型 | 材质 | 危险品 | 木制品勾选后须商检 | 箱规长 cm | 箱规宽 cm | 箱规高 cm | 每箱数量 | 箱数 | 总毛重 | 总体积 | 总数量 | 总净重 | 清关申报单价 USD | 清关申报金额 USD | 用途 | 型号 | 品牌 | 产品规格 长×宽×高 | 货件编号货件编号必填 | 跟踪编号跟踪编号必填 | UPC NO. | 备注 | 操作 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ index + 1 }} | -{{ item.pieces }} |