优化
This commit is contained in:
@@ -7,15 +7,28 @@ export interface DiscardDocument extends DiscardCandidate {
|
||||
/** 下拉按来源单据和操作仓汇总;原始库存身份保留给选箱与提交。 */
|
||||
export function groupDiscardDocuments(candidates: DiscardCandidate[]): DiscardDocument[] {
|
||||
const groups = new Map<string, DiscardDocument>()
|
||||
const identities = new Set<string>()
|
||||
const identities = new Map<string, DiscardCandidate>()
|
||||
for (const candidate of candidates) {
|
||||
const available = Number(candidate.availablePackages)
|
||||
if (candidate.availablePackages == null || !Number.isFinite(available) || available <= 0) continue
|
||||
// 按真实来源身份去重;缺身份的旧接口行仍独立保留,不合并不同库存。
|
||||
const identity = candidate.sourceType === 'RETURN_CARTON' ? candidate.returnCartonId : candidate.inventoryPositionId || candidate.orderId
|
||||
const sourceKey = identity ? JSON.stringify([candidate.overseasWarehouseId, candidate.sourceType, identity]) : null
|
||||
if (sourceKey && identities.has(sourceKey)) continue
|
||||
if (sourceKey) identities.add(sourceKey)
|
||||
const existing = sourceKey ? identities.get(sourceKey) : undefined
|
||||
if (existing) {
|
||||
// 同一仓位的分片响应合并 SKU 和箱,重复关联不会丢掉箱内商品。
|
||||
existing.skus = [...new Map([...existing.skus, ...candidate.skus].map(sku => [sku.skuCode, sku])).values()]
|
||||
const cartons = new Map((existing.cartons || []).map(box => [box.cartonId, box]))
|
||||
for (const box of candidate.cartons || []) {
|
||||
const old = cartons.get(box.cartonId)
|
||||
cartons.set(box.cartonId, old ? { ...old, skus: [...new Map([...old.skus, ...box.skus].map(sku => [sku.skuCode, sku])).values()] } : { ...box })
|
||||
}
|
||||
existing.cartons = [...cartons.values()]
|
||||
existing.availablePackages = Math.max(Number(existing.availablePackages), available)
|
||||
continue
|
||||
}
|
||||
const source = { ...candidate, skus: [...candidate.skus], cartons: candidate.cartons?.map(box => ({ ...box, skus: [...box.skus] })) }
|
||||
if (sourceKey) identities.set(sourceKey, source)
|
||||
const documentNo = candidate.inboundOrderNo || candidate.inboundCode
|
||||
const key = JSON.stringify([candidate.overseasWarehouseId, candidate.sourceType, documentNo || candidate.orderId])
|
||||
let document = groups.get(key)
|
||||
@@ -23,7 +36,7 @@ export function groupDiscardDocuments(candidates: DiscardCandidate[]): DiscardDo
|
||||
document = { ...candidate, orderId: key, sources: [], availablePackages: 0 }
|
||||
groups.set(key, document)
|
||||
}
|
||||
document.sources.push(candidate)
|
||||
document.sources.push(source)
|
||||
}
|
||||
for (const document of groups.values()) {
|
||||
const boxes = new Set<string>()
|
||||
|
||||
Reference in New Issue
Block a user