feat(commerce): 新增打赏任务中心与签到发奖
backend-ci / test (push) Failing after 4m53s

This commit is contained in:
Zhou Weidong committed 2026-11-09 10:32:53 +08:00
1 parent 2fee329002
commit 64eadf1446
52 files changed
+2590 -4

No files matched your search

+60
View File
@@ -586,6 +586,53 @@ app.register.max-per-device-per-day
解锁后播放入口与下载入口会同时放行 —— 权益判定由交易模块的 `EntitlementPort` 实现提供,
播放域与下载域都不需要改代码。金币变动一律带幂等键并写 `coin_ledger`,钱包余额与流水同事务。
### 1.8.1 奖励中心(已实现)
奖励中心复用钱包和金币流水,首发时区固定为 `Asia/Jakarta`。任务配置、奖励金币、任务文案、动作、周期和上下线状态均由后台维护;客户端不能直接提交任务进度,观看进度由服务端在 `/app/watch/progress` 校验成功后累计。
| 方法 | 路径 | 鉴权 | 说明 |
| --- | --- | --- | --- |
| GET | `/app/rewards/overview` | 匿名 | 返回任务配置、任务分组、签到规则和活动卡片;未登录时余额为 `0`、用户进度为 `0`、签到状态为未签到;登录后补充用户数据;`locale` 可选 `id/en/zh` |
| GET | `/app/rewards/activities` | 匿名 | 返回当前生效活动卡片,活动一期只展示和跳转 |
| GET | `/app/rewards/check-in` | 登录 | 返回今日是否签到、连续天数、7 天规则 |
| POST | `/app/rewards/check-in` | 登录 | 按服务端日期和连续签到规则发放金币;同用户同日期幂等 |
| POST | `/app/rewards/tasks/{taskId}/claim` | 登录 | 领取已完成任务;同任务同周期幂等 |
总览响应核心字段:
```json
{
"serverDate": "2026-11-05",
"timezone": "Asia/Jakarta",
"coinBalance": "135",
"checkin": {
"taskId": "202611050001",
"checkedInToday": false,
"streak": 2,
"currentDay": 3,
"days": [{"dayIndex": 1, "rewardCoin": "35", "checked": true, "current": false}]
},
"sections": [{
"code": "DAILY",
"title": "Tugas harian",
"tasks": [{
"id": "202611050002",
"code": "watch_5_minutes",
"type": "WATCH_DURATION",
"progressValue": "120",
"targetValue": "300",
"rewardCoin": "20",
"status": "IN_PROGRESS"
}]
}],
"activities": []
}
```
一期任务类型为 `DAILY_CHECK_IN`、`WATCH_DURATION`、`WATCH_EPISODES`、`COMPLETE_PROFILE`、`FIRST_PURCHASE`;`FIRST_LOGIN` 预留给登录事件接入。任务状态为 `IN_PROGRESS`、`COMPLETED`、`CLAIMED`。奖励发放使用 `coin_ledger.biz_type=REWARD`,任务领取幂等键为 `reward:{taskCode}:{userId}:{cycleKey}`,签到幂等键为 `reward:checkin:{userId}:{date}`。重复请求返回既有发放结果,不重复增加钱包余额。
失败场景:任务未完成或已停用返回 `200003`;任务、签到规则不存在返回 `200002`;奖励金币为 0 或请求参数非法返回 `400`;钱包余额和发放单不一致时整笔事务回滚。
**`POST /app/orders/verify`(B1-1:Google Play 票据校验闭环)**
请求体:
@@ -1233,6 +1280,19 @@ commentSummary,createdAt`。游客的 userId 为空、anonymous 为 true;评
> `id` 以字符串下发:见 **§0「ID 字段一律以字符串下发」**(本节不再单独规定)。
### 2.11.1 奖励中心管理(已实现)
| 方法 | 路径 | 权限点 | 说明 |
| --- | --- | --- | --- |
| GET | `/admin/rewards/tasks/page` · `/tasks/{id}` | `reward:list` | 奖励任务分页与详情 |
| POST | `/admin/rewards/tasks` | `reward:update` | 新建任务,默认下线 |
| PUT | `/admin/rewards/tasks/{id}` · `/{id}/status` | `reward:update` | 编辑、上线 / 下线;编辑会递增版本 |
| GET · PUT | `/admin/rewards/check-in/rules` | `reward:checkin` | 查看 / 保存签到每日奖励规则,天数不能重复 |
| GET | `/admin/rewards/grants/page` | `reward:grant` | 用户、任务、来源、状态筛选发放记录 |
| POST | `/admin/rewards/grants/manual` | `reward:grant` | 人工补发;仍写 `REWARD` 钱包流水并要求幂等键 |
后台任务保存字段包括 `code`、`sectionCode`、`type`、`verifyMode`、`targetValue`、`rewardCoin`、`cycleType`、`cycleLimit`、三语言文案、动作、排序和生效时间。任务配置不允许后台写任意脚本,扩展字段只能放在 `configJson`。
**校验与错误码**:
| 场景 | 结果 |