b4780e256e
- 重写 15 张已有表文档:每张补「用在 App 哪/增删改查时机/字段取值/join key 指向」 - 新建 4 张缺失表文档:wechat_transfer_authorization / ad_watch_log / price_report / app_config - 新增 OVERVIEW.md:功能↔表映射 + 写入路径 + 表间关系(含语义 join key)+ ER + 资金模型 - README 索引补齐到 19 表 + 置顶 OVERVIEW + 通用约定补全 - 纠正过时:withdraw_order(reviewing/rejected/user_name)、savings_record(/order/report 真实写入)、coin_transaction(biz_type) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.2 KiB
2.2 KiB
user_task — 一次性任务领取去重
模型
app/models/task.py· 仓库app/repositories/task.py· 接口 tasks-list / tasks-claim · ← 索引 · 总览
像"打开消息提醒"这类只能领一次的任务,领奖后写一行,(user_id, task_key) 唯一防重复领。可循环领取的任务(签到)不走这张表,有专表 signin_record。任务字典与奖励来自 rewards.TASK_REWARDS(默认 {enable_notification: 1000},运营后台 app_config.task_rewards 可改)。
用在哪 / 增删改查
- C(插入):
POST /tasks/claim(claim_task)。task_key合法 + 未领过 → 写一行(status='completed')+grant_coins(biz_type='task_<key>', ref_id=task_key)加币,同事务。未知 key 抛UnknownTaskError(404);已领抛AlreadyClaimedError(409)。 - U / D:无。领过即终态。
- R:
GET /tasks/list(任务页:列出所有已知任务 + 是否已领),list_tasks把本表已领的task_key集合与任务字典对照。
字段
| 列 | 类型 | 约束 / 默认 | 说明(取值 / join) |
|---|---|---|---|
id |
Integer | PK, autoincrement | |
user_id |
Integer | FK→user.id, index, NOT NULL | 归属用户 |
task_key |
String(48) | NOT NULL | 任务标识,取值见 rewards.TASK_REWARDS(当前仅 enable_notification)。被 coin_transaction.ref_id 引用(biz_type=task_<key>) |
status |
String(16) | NOT NULL, default completed |
当前恒为 completed(领即完成) |
coin_awarded |
Integer | NOT NULL, default 0 | 该任务发放金币(= TASK_REWARDS[task_key]) |
completed_at |
DateTime(tz) | server_default now() | 领取时间 |
关系 / Join Key
user_id→user.id(多对一)。- 配套写
coin_account(U)+coin_transaction(C,biz_type=f"task_{task_key}"、ref_id=task_key)。
索引与约束
- PK
id;indexuser_id;UNIQUE(user_id,task_key) =uq_task_user_key(防重复领)。
注意
- 比价里程碑虽也是"领一次"模型但不复用本表,另有
comparison_milestone_claim(task_key 是固定字典,里程碑是按成功次数解锁的序号)。