feat(fulfillment): 收敛履约状态写入口并追加状态事件

This commit is contained in:
yml2213
2026-11-05 20:52:22 +08:00
parent ca214854bb
commit fcd0c137d5
16 changed files with 1386 additions and 402 deletions
@@ -17,6 +17,7 @@ import {
import { rebuildChannelSalesDailyFacts } from './sales-facts-channel-service.js'
import { syncFinanceLedgerFromFacts } from './finance-ledger-service.js'
import { scheduleVoucherConsumeForOrderItems } from '../fulfillment/voucher-consume-queue-service.js'
import { transitionFulfillmentStateWithExecutor } from '../fulfillment/fulfillment-state-service.js'
import {
calculateManualCostFen,
normalizeManualCreditQuantity,
@@ -621,19 +622,21 @@ export async function confirmManualFulfillment(payload: JsonObject, session: Adm
// 人工确认即渠道成立:写新三列,避免订单一直停在 pending。
const finalChannel = platformKey === 'on_account' ? 'on_account' : 'manual'
await client.query(
`
UPDATE order_items
SET fulfillment_channel = $3,
fulfillment_status = 'assigned',
fulfillment_source = 'manual_confirm',
fulfillment_decided_at = $2,
updated_at = $2
WHERE id = $1
AND fulfillment_status <> 'archived'
`,
[orderItemId, now, finalChannel],
)
await transitionFulfillmentStateWithExecutor(client, {
orderItemId,
patch: {
channel: finalChannel,
status: 'assigned',
source: 'manual_confirm',
decidedAt: now,
decidedBy: Number(session.userId || 0) || null,
pendingReason: null,
pendingDetail: null,
},
eventType: 'manual_fulfillment_confirmed',
actor: { type: 'finance', id: session.userId },
reason: platformKey,
})
// 人工缺成本异常立即收口,不等下一轮定时任务。
await client.query(