fix(finance): 收敛内部 SKU 履约路由与载体状态

统一内部 SKU 与渠道主/兜底解析,禁止并列主渠道。

运营指定渠道改为先创建真实载体,失败保持明确 pending。

历史缺载体、多载体冲突和自动发货兜底统一由管道修复。

迁移人工配置与旧 sku_code 规则,补充严格预检和集成测试。
This commit is contained in:
yml2213
2026-11-02 15:02:49 +08:00
parent 5fe33b0b46
commit 2f87445ed9
33 changed files with 2199 additions and 446 deletions
@@ -100,7 +100,13 @@ function PendingPanel() {
channel: selections[rowKey(row)] || '',
}),
onSuccess: (result) => {
message.success(`已指定 ${result.data.updated} 个订单项`)
if (result.data.carrierFailed > 0) {
message.warning(
`已指定 ${result.data.updated} 个订单项,${result.data.carrierFailed} 个因载体创建失败仍待处理`,
)
} else {
message.success(`已指定 ${result.data.updated} 个订单项`)
}
void queryClient.invalidateQueries({ queryKey: ['fulfillment-pending'] })
},
onError: () => message.error('指定渠道失败'),
@@ -135,6 +141,7 @@ function PendingPanel() {
no_internal_sku: '无内部SKU',
no_channel_capability: '无渠道能力',
no_carrier: '无履约载体',
routing_conflict: '渠道冲突',
}
return value?.length ? value.map((reason) => labels[reason] || reason).join(' / ') : '-'
},
@@ -100,7 +100,10 @@ export function assignChannelBySku(payload: {
channel: string
note?: string
}) {
return apiPost<{ updated: number }>('/api/v1/admin/fulfillment/assign', payload)
return apiPost<{ updated: number; carrierFailed: number; ruleCreated: boolean }>(
'/api/v1/admin/fulfillment/assign',
payload,
)
}
export function assignChannelToItems(payload: {
@@ -108,7 +111,10 @@ export function assignChannelToItems(payload: {
channel: string
note?: string
}) {
return apiPost<{ updated: number }>('/api/v1/admin/fulfillment/assign', payload)
return apiPost<{ updated: number; carrierFailed: number }>(
'/api/v1/admin/fulfillment/assign',
payload,
)
}
export function fetchChannelRules(params: { channel?: string } = {}) {