feat(cost-center): 人工 SKU 配置自动同步商品与订单

This commit is contained in:
yml2213
2026-11-03 15:37:14 +08:00
parent eeb9fada63
commit efe706e601
7 changed files with 189 additions and 26 deletions
@@ -28,6 +28,8 @@ test(
switchChannelForOrderItems,
upsertChannelRule,
} = await import('./channel-assign-service.js')
const { saveManualFulfillmentConfig } =
await import('../cost-center/manual-fulfillment-config-service.js')
const { runAffiliateFallback } = await import('./affiliate-fallback-service.js')
const {
deleteInternalSkuMapping,
@@ -44,6 +46,7 @@ test(
const voucherSku = `集成测试卡券-${suffix}`
const triggerSku = `集成测试规范-${suffix}`
const fallbackSku = `集成测试兜底-${suffix}`
const autoManualSku = `集成测试自动人工-${suffix}`
const orderIds: number[] = []
const orderItemIds: number[] = []
const crossShopSku = `集成测试跨店-${suffix}`
@@ -54,8 +57,10 @@ test(
crossShopSku,
triggerSku,
fallbackSku,
autoManualSku,
]
let generatedVoucherProductId: number | null = null
let autoManualProductId: number | null = null
let fallbackProfileId: number | null = null
async function createPendingOrderItem(
@@ -248,6 +253,39 @@ test(
assert.equal(pendingItem.rows[0]?.fulfillment_channel, null)
assert.equal(pendingItem.rows[0]?.fulfillment_pending_reason, 'no_carrier')
const autoManualItemId = await createPendingOrderItem(autoManualSku)
const missingManual = await assignChannelByInternalSku({
internalSku: autoManualSku,
channel: 'manual',
adminUserId: null,
note: '集成测试缺人工配置',
})
assert.equal(missingManual.updated, 0)
assert.equal(missingManual.carrierFailed, 1)
const savedManual = await saveManualFulfillmentConfig({
skuKey: autoManualSku,
platformKey: 'fund_cash',
creditQuantity: 69,
note: '集成测试一次配置',
})
autoManualProductId = Number(savedManual.canonicalProductId || 0) || null
assert.ok(autoManualProductId)
assert.ok(savedManual.syncSummary.pendingAssigned >= 1)
const autoManualItem = await query<{
fulfillment_status: string
fulfillment_channel: string
fulfillment_config_id: number | null
canonical_product_id: number | null
}>(
`SELECT fulfillment_status, fulfillment_channel, fulfillment_config_id, canonical_product_id
FROM order_items WHERE id = $1`,
[autoManualItemId],
)
assert.equal(autoManualItem.rows[0]?.fulfillment_status, 'assigned')
assert.equal(autoManualItem.rows[0]?.fulfillment_channel, 'manual')
assert.ok(Number(autoManualItem.rows[0]?.fulfillment_config_id) > 0)
assert.equal(Number(autoManualItem.rows[0]?.canonical_product_id), autoManualProductId)
const crossShopA = `it-routing-a-${suffix}`
const crossShopB = `it-routing-b-${suffix}`
await createPendingOrderItem(crossShopSku, { shopId: crossShopA })
@@ -460,6 +498,15 @@ test(
`tpv:${manualSku}`,
])
}
if (autoManualProductId) {
await query(`DELETE FROM sales_daily_facts WHERE canonical_product_id = $1`, [
autoManualProductId,
])
await query(`DELETE FROM cost_versions WHERE canonical_product_id = $1`, [
autoManualProductId,
])
await query(`DELETE FROM product_catalog WHERE id = $1`, [autoManualProductId])
}
if (fallbackProfileId) {
await query(`DELETE FROM fulfillment_profiles WHERE id = $1`, [fallbackProfileId])
}