fix(finance): 人工确认后按业务日重算事实与总账
确认履约写入 manual_case 快照后,立即按该订单业务日期重算销售事实并同步总账, 避免较早订单的成本只等 3 天窗口而永远入不了报表。
This commit is contained in:
@@ -14,6 +14,8 @@ import {
|
||||
PLATFORM_CREDIT_KEYS,
|
||||
type PlatformCreditKey,
|
||||
} from '../cost-center/platform-credit-service.js'
|
||||
import { rebuildChannelSalesDailyFacts } from './sales-facts-channel-service.js'
|
||||
import { syncFinanceLedgerFromFacts } from './finance-ledger-service.js'
|
||||
|
||||
/**
|
||||
* 人工履约待办与「确认履约」。
|
||||
@@ -204,7 +206,7 @@ export async function confirmManualFulfillment(payload: JsonObject, session: Adm
|
||||
|
||||
// 钱与成本必须同一事务:先锁订单项、复查未履约,再扣款、最后写快照。
|
||||
// 任何一步失败(余额不足、成本版本缺失、重复快照)都整体回滚,不会留下「扣了钱没记成本」。
|
||||
return withTransaction(async (client) => {
|
||||
const result = await withTransaction(async (client) => {
|
||||
// 配置可能晚于订单创建:确认前按 SKU 再匹配一次(与定时 rematch 同口径),
|
||||
// 保证「配置好之后的新单」不需要人工再点一次「重新匹配」。
|
||||
await matchManualFulfillmentConfigWithClient(client, orderItemId, now)
|
||||
@@ -507,6 +509,38 @@ export async function confirmManualFulfillment(payload: JsonObject, session: Adm
|
||||
balanceAfter,
|
||||
}
|
||||
})
|
||||
|
||||
// 成本已落快照,立刻重算该业务日的事实与总账;失败不阻断确认(定时任务会兜底)。
|
||||
await refreshFactsForOrderItem(orderItemId)
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* 人工确认后按「订单业务日期」重算销售事实与总账。
|
||||
*
|
||||
* 事实任务默认只回看最近几天,确认一笔较早的订单时不会自动覆盖,
|
||||
* 所以这里按该订单自己的业务日期精确重算。
|
||||
*/
|
||||
async function refreshFactsForOrderItem(orderItemId: number): Promise<void> {
|
||||
try {
|
||||
const basis = await query<{ stat_date: string | null }>(
|
||||
`
|
||||
SELECT (COALESCE(o.paid_at, o.created_at) AT TIME ZONE 'Asia/Shanghai')::date::text
|
||||
AS stat_date
|
||||
FROM order_items oi
|
||||
JOIN orders o ON o.id = oi.order_id
|
||||
WHERE oi.id = $1
|
||||
`,
|
||||
[orderItemId],
|
||||
)
|
||||
const statDate = basis.rows[0]?.stat_date
|
||||
if (!statDate) return
|
||||
await rebuildChannelSalesDailyFacts({ dateFrom: statDate, dateTo: statDate })
|
||||
await syncFinanceLedgerFromFacts({ dateFrom: statDate, dateTo: statDate })
|
||||
} catch (error) {
|
||||
// 成本已入账,事实重算失败只影响报表时效,交给定时任务兜底。
|
||||
void error
|
||||
}
|
||||
}
|
||||
|
||||
/** 客服自己的备用金账户(管理员代录时用指定账户)。 */
|
||||
|
||||
Reference in New Issue
Block a user