yml2213
d90c066888
feat(cost-center): 成本异常 60 天归档
cost_exceptions 只增不减:本地快照 260,253 行(resolved 151,939 / open 108,314),
已处理的行只是审计痕迹,留在热表会拖慢「状态 + 时间」分页,并让唯一索引持续膨胀。
- 迁移 108:新增 cost_exceptions_archive(保留原 id 与时间字段,加 archived_at),
热表补部分索引 idx_cost_exceptions_archivable
(COALESCE(resolved_at, created_at)) WHERE status <> 'open',让每日任务不扫全表;
- cost-exception-archive-service:只归档 status <> 'open' 且超期的行,每批 1000 行,
DELETE ... RETURNING + INSERT 在同一语句内完成,单批原子,不存在「删了没归档」;
- data-retention 每日任务接入;保留期走 COST_EXCEPTION_RETENTION_DAYS(默认 60);
- 新增 npm run cost-exceptions:archive(--dry-run / --days / --batch-size)。
为什么 open 行不归档:open 是待办队列,超期不等于已解决,归档等于把问题藏起来。
验证:
- 3 条 resolved 回拨到 90 天前 → 归档 3 条,热表 resolved 151,939 → 151,936;
- 1 条 open 回拨到 90 天前 → 仍在热表,未被归档;
- 归档表保留原 id 与时间,archived_at 记录归档时刻;
- 恢复测试数据后计数回到 151,939 / 108,314。
2026-10-25 12:09:20 +08:00
..
2026-10-22 15:07:29 +08:00
2026-10-25 12:09:20 +08:00
2026-10-25 11:38:12 +08:00
2026-10-25 12:02:26 +08:00
2026-10-25 11:38:12 +08:00
2026-08-16 17:27:12 +08:00
2026-07-10 12:36:36 +08:00
2026-08-16 17:27:12 +08:00
2026-10-09 15:07:03 +08:00
2026-10-10 20:12:33 +08:00
2026-10-11 14:53:56 +08:00
2026-08-16 18:04:55 +08:00
2026-08-23 12:54:38 +08:00
2026-08-16 17:27:12 +08:00
2026-08-16 17:27:12 +08:00
2026-05-25 21:46:39 +08:00
2026-10-23 16:06:25 +08:00
2026-10-22 16:41:03 +08:00
2026-08-16 18:04:55 +08:00
2026-08-16 17:27:12 +08:00
2026-08-16 17:27:12 +08:00