3921c496cba6727585ab94f39234ff060d6108ef
rescanAchievement 只插 user_achievement、加 unlock_count,不重算 achievement_unlocked_count,也不做元成就的第二轮判定(旧 rescan_achievement 原样如此)。判题结算只在「这次有新解锁」时才重算,所以被补发的人计数会一直停在 旧值。2026-09-07 一次补发之后 269 人少算,其中 10 人实际够 15 个却没拿到 「奖杯收藏家」。 - 新增 refreshUnlockedCount:一条 SQL 按 user_achievement 重算,只 jsonb_set 这一个键、只写值变了的行。rescanAchievement 补发非白金成就后调用它,再补发元成就。 - recount 同时核对已解锁数与元成就漏发,--apply 先改计数再补发,复核同一份口径。 用 09-14 生产备份实跑:recount 订正 269 人、补发 10 条,复核通过、重跑无差异, 其余指标 0 行被动;模拟调低阈值补发 1504 条,「奖杯收藏家」随之 65 → 95, 与预先算出的跨线人数一致。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K1d8B3f4SXJwDvUY625eQd
Description
No description provided
Languages
TypeScript
58.5%
Vue
39.6%
Shell
1.3%
Dockerfile
0.5%