fix(migration): 079 建冻结幂等索引前先去重历史重复冻结并退还多冻押金
生产首跑 079 在 uniq_worker_wallet_ledgers_consignment_publish_freeze 索引上 23505:历史存在同提报单两条 consignment_publish 冻结流水 (如提报单 5),正是该索引要防的二次冻结缺陷的脏数据产物。 与 079 处理重复绑定工单同套路——先清数据再加约束: - 每组(worker+提报单)保留最早一条冻结流水,多余行仅改 payload 标记 consignment_publish_superseded(移出押金口径与索引范围,原行留审计) - 多冻的钱退还钱包:退额 = LEAST(多冻总额, 冻结池实有),绝不无中生有; 写 deposit_release 修正流水(kind=consignment_publish_dedup_refund) - 同一打手多条多余流水先按钱包聚合再退,避免 UPDATE..FROM 漏退 - 再建幂等索引 已在一次性 Postgres 完整复现生产路径验证:078+脏数据 → 079/080 迁移 成功、钱包退回多冻 ¥20、索引生效拦截第三次冻结
This commit is contained in:
@@ -128,3 +128,24 @@ test('拼单份额全部验收(母单转已验收)也必须补寄卖钩子
|
||||
'份额验收收官时必须结算供货货款(拼单母单无接单人,传 0 走供货渠道)',
|
||||
)
|
||||
})
|
||||
|
||||
test('迁移 079:建冻结幂等索引前必须先去重历史重复冻结并退还多冻押金', async () => {
|
||||
const migration = await readFile(
|
||||
new URL('../../db/migrations/079_drop_consignment_collect_links.sql', import.meta.url),
|
||||
'utf8',
|
||||
)
|
||||
// 生产曾因同提报单两条 consignment_publish 冻结流水建不起索引(23505),
|
||||
// 修复是"先清脏数据再建约束":去重退还必须在 CREATE UNIQUE INDEX 之前,顺序不能反
|
||||
const dedupPos = migration.indexOf("'consignment_publish_superseded'")
|
||||
const refundPos = migration.indexOf("'consignment_publish_dedup_refund'")
|
||||
const indexPos = migration.indexOf(
|
||||
'CREATE UNIQUE INDEX IF NOT EXISTS uniq_worker_wallet_ledgers_consignment_publish_freeze',
|
||||
)
|
||||
assert.ok(dedupPos > 0, '079 必须包含重复冻结去重(标记 superseded)')
|
||||
assert.ok(refundPos > dedupPos, '去重后必须写退还修正流水')
|
||||
assert.ok(indexPos > refundPos, '幂等索引必须建在去重退还之后,否则脏数据会 23505')
|
||||
assert.ok(
|
||||
migration.includes('LEAST(st.dup_frozen_fen, COALESCE(w.frozen_deposit_amount, 0))'),
|
||||
'退还额必须封顶冻结池实有,绝不无中生有',
|
||||
)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user