重构:硬切履约状态唯一真源

This commit is contained in:
yml2213
2026-11-08 19:44:27 +08:00
parent 6bff1971dd
commit bae9a5ae5e
54 changed files with 2096 additions and 437 deletions
+16 -15
View File
@@ -93,7 +93,7 @@ async function loadRecentDuplicateAttempts(): Promise<CountRow[]> {
return result.rows
}
async function loadShadowModelDiffs(): Promise<CountRow[]> {
async function loadTruthIntegrityChecks(): Promise<CountRow[]> {
const result = await query<{
missing_fulfillments: number
fulfillment_state_diffs: number
@@ -116,7 +116,7 @@ async function loadShadowModelDiffs(): Promise<CountRow[]> {
fulfillment.issue_category
) IS DISTINCT FROM ROW(
CASE WHEN state.route_status = 'configured' THEN 'configured' ELSE 'unrouted' END,
state.intended_channel,
state.stored_channel,
state.carrier_status,
state.current_attempt_type,
NULLIF(state.current_attempt_id, 0),
@@ -162,8 +162,6 @@ async function loadShadowModelDiffs(): Promise<CountRow[]> {
(
SELECT COUNT(*)::int
FROM fulfillment_state_events event
JOIN v_fulfillment_item_state active_state
ON active_state.order_item_id = event.order_item_id
WHERE event.fulfillment_id IS NULL
) AS unlinked_events
FROM v_fulfillment_item_state state
@@ -173,20 +171,20 @@ async function loadShadowModelDiffs(): Promise<CountRow[]> {
)
const row = result.rows[0]
return [
{ label: '影子履约缺失', count: Number(row?.missing_fulfillments || 0) },
{ label: '影子履约状态差异', count: Number(row?.fulfillment_state_diffs || 0) },
{ label: '影子执行尝试缺失', count: Number(row?.missing_attempts || 0) },
{ label: '影子开放异常缺失', count: Number(row?.missing_open_issues || 0) },
{ label: '履约事件未关联影子记录', count: Number(row?.unlinked_events || 0) },
{ label: '正式履约缺失', count: Number(row?.missing_fulfillments || 0) },
{ label: '正式履约状态差异', count: Number(row?.fulfillment_state_diffs || 0) },
{ label: '执行尝试缺失', count: Number(row?.missing_attempts || 0) },
{ label: '开放异常缺失', count: Number(row?.missing_open_issues || 0) },
{ label: '履约事件未关联正式记录', count: Number(row?.unlinked_events || 0) },
]
}
async function main(): Promise<void> {
const [counts, issues, duplicates, shadowDiffs] = await Promise.all([
const [counts, issues, duplicates, integrityChecks] = await Promise.all([
loadCounts(),
loadIssueBreakdown(),
loadRecentDuplicateAttempts(),
loadShadowModelDiffs(),
loadTruthIntegrityChecks(),
])
console.info('[fulfillment-audit] 总览')
@@ -208,20 +206,23 @@ async function main(): Promise<void> {
console.info(` ${row.label}: ${row.count}`)
}
console.info('[fulfillment-audit] 影子模型差异')
for (const row of shadowDiffs) {
console.info('[fulfillment-audit] 正式履约完整性')
for (const row of integrityChecks) {
console.info(` ${row.label}: ${row.count}`)
}
const critical = new Map(counts.map((row) => [row.label, Number(row.count || 0)]))
const duplicateCount = Number(duplicates[0]?.count || 0)
const shadowDiffCount = shadowDiffs.reduce((sum, row) => sum + Number(row.count || 0), 0)
const integrityDifferenceCount = integrityChecks.reduce(
(sum, row) => sum + Number(row.count || 0),
0,
)
const hasCritical =
(critical.get('状态不一致') || 0) > 0 ||
(critical.get('售后关闭仍进入履约队列') || 0) > 0 ||
(critical.get('已分配但无有效载体') || 0) > 0 ||
duplicateCount > 0 ||
shadowDiffCount > 0
integrityDifferenceCount > 0
if (strict && hasCritical) {
process.exitCode = 1