diff --git a/src/modules/overseas-warehouse/api/returnInventory.ts b/src/modules/overseas-warehouse/api/returnInventory.ts index f0d9415..8daf616 100644 --- a/src/modules/overseas-warehouse/api/returnInventory.ts +++ b/src/modules/overseas-warehouse/api/returnInventory.ts @@ -14,7 +14,7 @@ export interface ReturnInventorySummaryItem { export interface ReturnInventoryCartonItem { skuCode: string; productNameZh?: string; quantity: number } export interface ReturnInventoryCartonSummary { - cartonMark: string; overseasWarehouseId: string; sourceBatchNo?: string; sourceReturnNo?: string; status: string + cartonMark: string; overseasWarehouseId: string; sourceBatchNo?: string; sourceReturnNo?: string; relabelStatus?: string; relabelledQuantity?: number; relabelReservedQuantity?: number; status: string skuTypes: number; totalQuantity: number; length?: number; width?: number; height?: number; weight?: number; createdAt: string } @@ -23,7 +23,7 @@ export function listReturnInventoryCartons(params: Record) { } export interface ReturnInventoryCartonDetail { - cartonMark: string; overseasWarehouseId: string; sourceBatchNo?: string; sourceReturnNo?: string; status: string + cartonMark: string; overseasWarehouseId: string; sourceBatchNo?: string; sourceReturnNo?: string; relabelStatus?: string; relabelledQuantity?: number; relabelReservedQuantity?: number; status: string skuTypes: number; totalQuantity: number; length?: number; width?: number; height?: number; weight?: number; receivedAt: string; items: ReturnInventoryCartonItem[] } diff --git a/src/modules/overseas-warehouse/api/warehouseServices.ts b/src/modules/overseas-warehouse/api/warehouseServices.ts index 16c3bb7..081a4bd 100644 --- a/src/modules/overseas-warehouse/api/warehouseServices.ts +++ b/src/modules/overseas-warehouse/api/warehouseServices.ts @@ -34,7 +34,7 @@ export interface RelabelInventoryCandidate { availablePackages: number | string; version: number positions: Array<{ positionId: string; palletNo?: string; batchNo?: string; warehouseLocationCode?: string; availablePackages: number }> sourceType?: 'INBOUND' | 'RETURN_CARTON' | 'RETURN_PARCEL'; returnCartonId?: string; cartonMark?: string - skuItems?: Array<{ skuCode: string; newSkuCode?: string; quantity: number; remark?: string }>; relabelledPackages?: number + skuItems?: Array<{ skuCode: string; newSkuCode?: string; quantity: number; remark?: string }>; relabelledPackages?: number; relabelledQuantity?: number; relabelReservedQuantity?: number; relabelStatus?: string } export interface TransferCreate { diff --git a/src/modules/overseas-warehouse/utils/returnReceiptDisplay.test.mjs b/src/modules/overseas-warehouse/utils/returnReceiptDisplay.test.mjs index 3643b8e..34d1957 100644 --- a/src/modules/overseas-warehouse/utils/returnReceiptDisplay.test.mjs +++ b/src/modules/overseas-warehouse/utils/returnReceiptDisplay.test.mjs @@ -8,6 +8,13 @@ const compiled = ts.transpileModule(source, { compilerOptions: { target: ts.Scri const exports = {} new Function('exports', compiled)(exports) +test('签收箱号只包含箱子和托盘签收,包裹实物记录不重复展示为箱子', () => { + const receipts = [{ receiptNo: 'PARCEL-1', unitType: 'PARCEL' }, { receiptNo: 'BOX-1', unitType: 'BOX' }, { receiptNo: 'PALLET-1', unitType: 'PALLET' }] + const cartons = [{ receiptNo: 'PARCEL-1', cartonMark: 'RP-1' }, { receiptNo: 'BOX-1', cartonMark: 'RC-1' }, { receiptNo: 'PALLET-1', cartonMark: 'RC-2' }, { receiptNo: 'UNKNOWN', cartonMark: 'RP-UNKNOWN' }] + assert.deepEqual(exports.receiptBoxDetails(receipts, cartons).map(item => item.cartonMark), ['RC-1', 'RC-2']) + assert.deepEqual(exports.receiptBoxDetails(receipts.slice(0, 1), cartons), []) +}) + test('volume rounds upward to exactly three decimal places without increasing exact thousandths', () => { for (const [input, expected] of [[0.186624, '0.187'], [0.15, '0.150'], [1.001, '1.001'], [1.00100001, '1.002'], [0.0000001, '0.001'], [0, '0.000'], [null, '—'], [NaN, '—']]) { assert.equal(exports.formatReturnVolume(input), expected) diff --git a/src/modules/overseas-warehouse/utils/returnReceiptDisplay.ts b/src/modules/overseas-warehouse/utils/returnReceiptDisplay.ts index 57e1087..4dcddc2 100644 --- a/src/modules/overseas-warehouse/utils/returnReceiptDisplay.ts +++ b/src/modules/overseas-warehouse/utils/returnReceiptDisplay.ts @@ -1,4 +1,9 @@ -import type { ReturnReceipt } from '../api/returnOrders' +import type { ReturnReceipt, ReturnReceiptCarton } from '../api/returnOrders' + +export function receiptBoxDetails(receipts: Pick[], cartons: ReturnReceiptCarton[]) { + const boxReceiptNos = new Set(receipts.filter(receipt => receipt.unitType === 'BOX' || receipt.unitType === 'PALLET').map(receipt => receipt.receiptNo)) + return cartons.filter(carton => boxReceiptNos.has(carton.receiptNo)) +} export function receiptTrackingNo(receipt: Pick | Record) { const trackingNo = typeof receipt.trackingNo === 'string' ? receipt.trackingNo.trim() : '' diff --git a/src/modules/overseas-warehouse/utils/returnRelabelProgress.ts b/src/modules/overseas-warehouse/utils/returnRelabelProgress.ts new file mode 100644 index 0000000..8289882 --- /dev/null +++ b/src/modules/overseas-warehouse/utils/returnRelabelProgress.ts @@ -0,0 +1,4 @@ +export function returnRelabelStatusLabel(status?: string) { + const labels: Record = { UNLABELLED: '未换标', BOUND: '处理中', PROCESSING: '处理中', PARTIALLY_COMPLETED: '部分完成', COMPLETED: '全部完成' } + return status ? labels[status] || '—' : '—' +} diff --git a/src/modules/overseas-warehouse/views/ReturnInventoryView.vue b/src/modules/overseas-warehouse/views/ReturnInventoryView.vue index b76a16f..7a936de 100644 --- a/src/modules/overseas-warehouse/views/ReturnInventoryView.vue +++ b/src/modules/overseas-warehouse/views/ReturnInventoryView.vue @@ -1,4 +1,5 @@ ')) + const compiledBinding = ts.transpileModule(binding, { compilerOptions: { target: ts.ScriptTarget.ES2022 } }).outputText + const cargoRows = { value: [] } + const bind = new Function('labelingMode', 'cartonDetailRows', 'cargoRows', 'selectedReturnOrderNo', 'addReturnSkuBinding', 'let cargoSequence = 0; ' + compiledBinding + '; return addReturnBoxBinding')({ value: 'carton' }, { value: cargoRows.value }, cargoRows, { value: 'RETURN-1' }, () => assert.fail('箱唛模式不添加SKU行')) + const parcel = { returnCartonId: 'PARCEL-ID', sourceType: 'RETURN_PARCEL', cartonMark: 'RP-1', skuItems: [{ skuCode: 'SKU-A', quantity: 80 }] } + bind(parcel) + bind(parcel) + assert.equal(cargoRows.value.length, 1) + assert.equal(cargoRows.value[0].returnCartonId, 'PARCEL-ID') + assert.equal(cargoRows.value[0].quantity, 1) + assert.doesNotMatch(view, /returnSkuOnly|散件库存只能贴 SKU/) + assert.match(view, /labelingMode === 'sku' \? addReturnSkuBinding\(source, sku.skuCode\) : addReturnBoxBinding\(source\)/) +})