Files
admin-web/src/modules/container-loading/smartLoadingItems.ts
T
2026-09-04 14:04:57 +08:00

54 lines
2.7 KiB
TypeScript

import type { SmartLoadingItem } from './types'
export interface SmartLoadingInboundItem extends SmartLoadingItem {
sourceItems: SmartLoadingItem[]
detailCount: number
}
function sumNullable(items: SmartLoadingItem[], value: (item: SmartLoadingItem) => number | null) {
const values = items.map(value).filter((item): item is number => item != null)
return values.length ? values.reduce((sum, item) => sum + Number(item || 0), 0) : null
}
function joinDistinct(items: SmartLoadingItem[], value: (item: SmartLoadingItem) => string | null) {
const values = [...new Set(items.map(value).map((item) => String(item || '').trim()).filter(Boolean))]
return values.length ? values.join('、') : null
}
/**
* 后端按规格保存装柜明细以保证重量、体积计算准确;作业页面按入仓码汇总展示。
*/
export function groupSmartLoadingItems(items: SmartLoadingItem[]): SmartLoadingInboundItem[] {
const groups = new Map<string, SmartLoadingItem[]>()
for (const item of items) {
const key = `${item.accountId}:${item.inboundId}`
groups.set(key, [...(groups.get(key) || []), item])
}
return [...groups.values()].map((sourceItems) => {
const first = sourceItems[0]
const pickedPackageCount = sourceItems.reduce((sum, item) => sum + Number(item.pickedPackageCount || 0), 0)
const loadSequences = sourceItems.map((item) => item.loadSequence).filter((item): item is number => item != null)
return {
...first,
id: sourceItems.length === 1 ? first.id : `inbound:${first.accountId}:${first.inboundId}`,
inboundDetailId: sourceItems.length === 1 ? first.inboundDetailId : '',
skuCode: joinDistinct(sourceItems, (item) => item.skuCode),
productNameZh: joinDistinct(sourceItems, (item) => item.productNameZh),
packageCount: sourceItems.reduce((sum, item) => sum + Number(item.packageCount || 0), 0),
productQuantity: sumNullable(sourceItems, (item) => item.productQuantity),
grossWeightKg: sumNullable(sourceItems, (item) => item.grossWeightKg),
volumeCbm: sumNullable(sourceItems, (item) => item.volumeCbm),
loadSequence: loadSequences.length ? Math.min(...loadSequences) : null,
pickedPackageCount,
minPackageCount: sourceItems.reduce((sum, item) => sum + Number(item.minPackageCount || 0), 0),
totalPackageCount: sourceItems.reduce((sum, item) => sum + Number(item.totalPackageCount || item.packageCount || 0), 0),
remainingPackageCount: sourceItems.reduce((sum, item) => sum + Number(item.remainingPackageCount || 0), 0),
canAdjust: sourceItems.length === 1 && first.canAdjust,
canRemove: sourceItems.every((item) => item.canRemove),
sourceItems,
detailCount: sourceItems.length,
}
})
}