54 lines
2.7 KiB
TypeScript
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,
|
|
}
|
|
})
|
|
}
|