feat: model mixed-SKU dropship cartons

This commit is contained in:
2026-09-11 15:38:28 +08:00
parent 53c48501dc
commit 80e83a6668
7 changed files with 67 additions and 9 deletions
@@ -54,7 +54,7 @@ function validDraft() {
destinationType: 'FBA',
amazonWarehouseCode: 'ONT8',
shipmentId: 'FBA-001',
items: [{ ...createEmptyCargoItem('cargo-1'), sku: 'SKU-001', upc: '012345678905', cargoNameCn: '家居用品', pieces: 100, grossWeightKg: 1200, volumeCbm: 3.5, shipmentId: 'FBA-001', referenceId: 'REF-001' }],
items: [{ ...createEmptyCargoItem('cargo-1'), sku: 'SKU-001', upc: '012345678905', cargoNameCn: '家居用品', unitsPerPackage: 100, pieces: 100, grossWeightKg: 1200, volumeCbm: 3.5, shipmentId: 'FBA-001', referenceId: 'REF-001' }],
}
}
@@ -94,6 +94,17 @@ test('validates the confirmed minimum submission fields', () => {
assert.ok(errors.includes('第 1 条货物毛重必须大于 0'))
})
test('rejects a total quantity that does not equal units per package multiplied by package count', () => {
const draft = validDraft()
draft.items[0].unitsPerPackage = 24
draft.items[0].packageCount = 5
draft.items[0].pieces = 119
assert.ok(validateFirstLegOrderDraft(draft).includes('第 1 条货物总数量应等于每箱数量 × 箱数(120)'))
draft.items[0].pieces = 120
assert.ok(!validateFirstLegOrderDraft(draft).some((message) => message.includes('总数量应等于')))
})
test('only requires sender for pickup and receiver for a private destination', () => {
const publicDraft = validDraft()
publicDraft.shipperPartySnapshot = null
@@ -169,3 +180,15 @@ test('summarizes cargo values from line items', () => {
volumeCbm: 4.75,
})
})
test('counts one physical carton series for SKU lines in the same mixed-carton group', () => {
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)
const draft = { ...validDraft(), fulfillmentType: 'ONE_CLICK_DROPSHIP', items: [first, second] }
assert.ok(!validateFirstLegOrderDraft(draft).some((message) => message.includes('混箱组合')))
second.packageCount = 9
assert.ok(validateFirstLegOrderDraft(draft).includes('混箱组合 A 的箱数、包装类型和箱规必须一致'))
})