fix(auto-exchange): 「当天已兑」标记持久化到 app_config,防非0点重启重复补扫 #223
Reference in New Issue
Block a user
Delete Branch "fix/auto-exchange-restart-resweep"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概览
把 0 点自动兑金币 worker 的「当天是否已兑」判定,从内存变量 last_run 改为持久化到 app_config(key auto_exchange.last_run_date)。修掉「进程重启即忘 → 每次非 0 点部署都全量补扫、把 0 点后才达标用户在非 0 点兑现金」的 bug。改 1 个实现文件 + 1 个文档 + 新增 1 个测试(+171 / −11)。
🤖 review-pr 深审结论
🟢 低风险 · 置信度 0.9 — 钱相关 bug 的修复设计稳、契约核对通过、关键场景测试全绿,可直接合。
净改动:把 0 点自动兑金币 worker 的「当天已兑」判定从内存
last_run改成持久化到app_config(keyauto_exchange.last_run_date),修「进程重启即忘 → 每次非 0 点部署都全量补扫、把 0 点后才达标用户在非 0 点兑成现金」的 bug。构建/测试状态(已实跑)
AppConfig.key是主键(db.get(AppConfig, key)成立);value是 JSON/JSONB 列(存 ISO 日期字符串会当 JSON 标量存/读回str,date.fromisoformatround-trip 正常,且_read_last_run有try/except兜脏值);updated_by_admin_id可空;rewards.cn_today()返回date(与标记比较口径一致)。内部状态 key 不进CONFIG_DEFS,与 compare_alert 水位同套路。合并origin/main干净。pytest tests/test_daily_auto_exchange.py—— 3/3 通过:first_run_converts_and_records_marker/same_day_restart_does_not_resweep(bug 核心)/new_day_runs_again(补跑)。问题
正面
daily_auto_exchange之后:中途崩则标记仍旧值 → 下次重跑,逐用户幂等_has_exchange_in_on跳过已兑、补完剩下 → 不双兑(钱安全的关键顺序)。< today仍补),且只限罕见场景,非常态。建议
只读深审 · worktree 合并 origin/main(干净)+ 实跑 venv pytest(3/3)