ece498876f
- spec/plan:清零范围改两桶、run_warn 逐用户隔离不阻塞清零、stats 增 warn_failed - docs/database:新增 inactivity_reset_log / inactivity_notification_log 条目 + README 索引 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.1 KiB
3.1 KiB
inactivity_notification_log — 不活跃清零前预警记录
模型
app/models/inactivity.py· 仓库app/repositories/inactivity.py· 通知器app/integrations/notifier.py· ← 索引 · 总览
清零前按可配置节奏(INACTIVITY_WARN_DAYS_BEFORE,默认清零前 7 天、2 天各一次)向用户预警"账户里的 xx 金币和 xx 现金将被清零"。每发一次预警写一行,记推送时的余额快照 + 提前天数档 + 通道 + 状态。兼作两用:预警去重依据(同 streak 内 stage==k 且 created_at > last_active 即已推过、不重推)与占位 outbox(v1 通道=log,只打日志不真推;后续接 JPush/短信同层扩展)。append-only,不更新。预警只涉及会被清的金币 + 折算现金;邀请奖励金不清、不预警(invite_cash_balance_cents 仅作账户状态快照)。
用在哪 / 增删改查
- C(插入):
inactivity.run_warn_once命中预警档、且本 streak 未推过时,调notifier.warn后写一行(status= 通知器返回,占位实现为placeholder)。 - U / D:无(append-only)。
- R:预警去重查询(
user_id + stage + created_at > last_active);未来接真实推送时作待推送 outbox。
字段
| 列 | 类型 | 约束 / 默认 | 说明(取值 / join) |
|---|---|---|---|
id |
Integer | PK, autoincrement | 主键 |
user_id |
Integer | NOT NULL, index | 预警对象;只索引不设外键(同 analytics_event) |
stage |
Integer | NOT NULL | 提前天数档(如 7 / 2,即清零前第几天推) |
inactive_days |
Integer | NOT NULL | 推送时的不活跃天数(北京自然日) |
coin_balance |
Integer | NOT NULL | 推送时金币余额快照(将被清) |
cash_balance_cents |
Integer | NOT NULL | 推送时折算现金余额快照(分,将被清) |
invite_cash_balance_cents |
Integer | NOT NULL | 推送时邀请奖励金余额快照(分,不清、不在预警额度内) |
channel |
String(16) | NOT NULL | 通道:log(占位) / jpush / sms |
status |
String(16) | NOT NULL | 状态:placeholder(占位未真推) / sent / failed |
created_at |
DateTime(tz) | server_default now(), index | 推送时刻;去重比 created_at > last_active(用户回归后 last_active 前移 → 旧行自然失效、开启新 streak) |
关系 / Join Key
user_id→user.id(无外键直连,靠user_id关联)。- 与
inactivity_reset_log无直接外键;同一 streak 内先有若干预警行,到期后有一行清零。
索引与约束
- PK
id;ix_inactivity_notification_log_user_id、ix_inactivity_notification_log_created_at。
注意
- 预警去重按 streak:判据是
created_at > last_active;用户一有活跃(home_view/比价/领券),last_active前移,旧预警行"失效",回归后可重新进入预警。 - 占位实现:v1
LogNotifier只logger.warning("[inactivity-warn] ...")、返回placeholder,不真推(参照心跳告警"本期先不接推送"先例)。 - 漏跑补发:worker 漏跑数天后某用户可能同时满足多档,只补发最紧急的未推档(最小提前天数),避免刷屏。