diff --git a/furniture-3d-system/src/server/repositories/supply-chain-product-archive-replacement.repository.ts b/furniture-3d-system/src/server/repositories/supply-chain-product-archive-replacement.repository.ts index 4b9f8ef6..bea826ca 100644 --- a/furniture-3d-system/src/server/repositories/supply-chain-product-archive-replacement.repository.ts +++ b/furniture-3d-system/src/server/repositories/supply-chain-product-archive-replacement.repository.ts @@ -3,13 +3,15 @@ import { prisma } from '@/lib/prisma' export type ProductArchiveReplacementRule = { sku: string replaceSku: string + sourceCreatedAt: string | null + sourceId: number } // 简尚「替换款管理」换货规则:sku = 原编码(老),replaceSku = 替换编码(新)。 export async function listProductArchiveReplacementRules(): Promise { try { return await prisma.$queryRaw` - SELECT sku, "replaceSku" + SELECT sku, "replaceSku", "sourceCreatedAt"::text AS "sourceCreatedAt", "sourceId" FROM "SupplyChainProductArchiveReplacementRule" WHERE "replaceSku" <> '' ORDER BY "sourceCreatedAt" ASC NULLS LAST, "sourceId" ASC diff --git a/furniture-3d-system/src/server/services/supply-chain-product-sabc.service.ts b/furniture-3d-system/src/server/services/supply-chain-product-sabc.service.ts index 37703109..0e159b20 100644 --- a/furniture-3d-system/src/server/services/supply-chain-product-sabc.service.ts +++ b/furniture-3d-system/src/server/services/supply-chain-product-sabc.service.ts @@ -135,21 +135,24 @@ function normalizeCode(value: string) { return String(value ?? '').trim().toUpperCase() } -// 同款商品编码(业绩&费比合并计算)规则:新编码承接老编码业绩;一个老编码对应多个新编码或形成替换链时暂不合并。 -function buildReplacementIndex(rules: Array<{ sku: string; replaceSku: string }>): ReplacementIndex { - const oldToNews = new Map>() +// 同款商品编码(业绩&费比合并计算)规则:新编码承接老编码业绩; +// 同一老编码有多条规则时取创建时间(sourceCreatedAt)最新的一条;替换链(A→B 且 B→C)暂不合并。 +function buildReplacementIndex(rules: Array<{ sku: string; replaceSku: string; sourceCreatedAt?: string | null; sourceId?: number }>): ReplacementIndex { + const latestByOld = new Map() for (const rule of rules) { const oldCode = normalizeCode(rule.sku) const newCode = normalizeCode(rule.replaceSku) if (!oldCode || !newCode || oldCode === newCode) continue - const set = oldToNews.get(oldCode) ?? new Set() - set.add(newCode) - oldToNews.set(oldCode, set) - } - const oldToNew = new Map() - for (const [oldCode, news] of oldToNews) { - if (news.size === 1) oldToNew.set(oldCode, [...news][0]) + const at = String(rule.sourceCreatedAt ?? '') + const sourceId = Number(rule.sourceId ?? 0) + const current = latestByOld.get(oldCode) + if (!current || at > current.at || (at === current.at && sourceId >= current.sourceId)) { + latestByOld.set(oldCode, { newCode, at, sourceId }) + } } + const oldToNew = new Map( + [...latestByOld.entries()].map(([oldCode, value]) => [oldCode, value.newCode]), + ) for (const [oldCode, newCode] of [...oldToNew]) { if (oldToNew.has(newCode)) oldToNew.delete(oldCode) }