Files
shaguabijia-app-server/docs/database/user_task.md
T
marco 4ee6de2548 feat(cps): 活动支持编辑(PATCH /activities/{id})
- CpsActivityUpdate schema + repo update_activity(部分更新,非 None 覆盖)
- router 按「合并后最终值」校验平台必填项(同新建口径),写审计 cps.activity.update
- 可改名/平台/对应字段/落地页图/备注/状态

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 22:13:35 +08:00

2.8 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: 750},运营后台 app_config.task_rewards 可改)。

⚠️ 当前 TASK_REWARDS 里唯一的 enable_notification(打开消息提醒)已改为可重复领取任务(每次减半,见 rewards.notification_reward),它不写本表——领取次数靠数 coin_transaction 的正向流水条数(biz_type='task_enable_notification'),ref_id 带序号 task_key:N。因此本表目前实际没有被任何已定义任务写入;待新增真正的一次性任务后才会落行。

用在哪 / 增删改查

  • 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)。可重复任务(enable_notification)在 claim_task 里走另一分支:不写本表,只发币(ref_id=task_key:N),减半到底(notification_max_claims)后再领抛 AlreadyClaimedError
  • 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 是可重复任务,不落本表)。一次性任务领取时其 task_key = 配套 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_iduser.id(多对一)。
  • 配套写 coin_account(U)+ coin_transaction(C,biz_type=f"task_{task_key}"ref_id=task_key)。

索引与约束

  • PK id;index user_id;UNIQUE(user_id, task_key) = uq_task_user_key(防重复领)。

注意

  • 比价里程碑虽也是"领一次"模型但不复用本表,另有 comparison_milestone_claim(task_key 是固定字典,里程碑是按成功次数解锁的序号)。