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() 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, } }) }