重构:硬切履约路由唯一真源

This commit is contained in:
yml2213
2026-11-08 19:44:27 +08:00
parent f6e193e7f6
commit 6bff1971dd
31 changed files with 1029 additions and 1022 deletions
@@ -771,9 +771,12 @@ export async function deleteManualSkuClassification(
[key],
)
const rules = await client.query(
`DELETE FROM internal_sku_channels
WHERE canonicalize_internal_sku(internal_sku) = $1 AND channel = 'manual'
RETURNING id`,
`DELETE FROM sku_channel_routes route
USING internal_skus sku
WHERE sku.id = route.internal_sku_id
AND sku.internal_sku_key = $1
AND route.channel = 'manual'
RETURNING route.id`,
[key],
)
const products = await client.query(
@@ -1332,9 +1335,7 @@ function requiredRow<T>(row: T | undefined, message: string): T {
return row
}
/**
* 人工配置 → internal_sku_channels(内部 SKU 精确匹配)。
*/
/** 人工配置 → sku_channel_routes(内部 SKU 精确匹配)。 */
async function syncManualChannelRule(
config: {
id: number
@@ -1350,10 +1351,13 @@ async function syncManualChannelRule(
const otherChannelSql = `
SELECT EXISTS (
SELECT 1 FROM internal_sku_channels
WHERE canonicalize_internal_sku(internal_sku) = $1
AND enabled = TRUE
AND channel <> 'manual'
SELECT 1
FROM sku_channel_routes route
JOIN internal_skus sku ON sku.id = route.internal_sku_id
WHERE sku.internal_sku_key = $1
AND route.enabled = TRUE
AND route.route_role = 'primary'
AND route.channel <> 'manual'
) AS exists
`
const otherChannel = client
@@ -487,14 +487,16 @@ export async function deleteAdminVoucherProduct(productId: number | string) {
await client.query(
`
UPDATE internal_sku_channels
UPDATE sku_channel_routes route
SET enabled = FALSE,
is_fallback = FALSE,
route_role = 'fallback',
updated_at = $3
WHERE channel = 'third_party_voucher'
FROM internal_skus sku
WHERE sku.id = route.internal_sku_id
AND route.channel = 'third_party_voucher'
AND (
canonical_product_id = $1
OR canonicalize_internal_sku(internal_sku) = canonicalize_internal_sku($2)
route.canonical_product_id = $1
OR sku.internal_sku_key = canonicalize_internal_sku($2)
)
`,
[id, internalSku, nowIso()],
@@ -545,11 +547,13 @@ export async function deleteAdminVoucherProduct(productId: number | string) {
)
await client.query(
`
DELETE FROM internal_sku_channels
WHERE channel = 'third_party_voucher'
DELETE FROM sku_channel_routes route
USING internal_skus sku
WHERE sku.id = route.internal_sku_id
AND route.channel = 'third_party_voucher'
AND (
canonical_product_id = $1
OR canonicalize_internal_sku(internal_sku) = canonicalize_internal_sku($2)
route.canonical_product_id = $1
OR sku.internal_sku_key = canonicalize_internal_sku($2)
)
`,
[id, internalSku],
@@ -248,7 +248,7 @@ test(
])
await query('DELETE FROM product_channel_capabilities WHERE product_id = $1', [productId])
await query(
'UPDATE internal_sku_channels SET canonical_product_id = NULL WHERE canonical_product_id = $1',
'UPDATE sku_channel_routes SET canonical_product_id = NULL WHERE canonical_product_id = $1',
[productId],
)
await query('DELETE FROM product_catalog WHERE id = $1', [productId])