feat: configure daily check-in rewards

This commit is contained in:
Codex
2026-06-30 14:52:10 +08:00
parent 7d2b8fd610
commit a5a2caa2e9
12 changed files with 610 additions and 94 deletions

View File

@@ -1171,10 +1171,41 @@ POST /api/profile/check-in
"item": {
"checkedIn": true,
"alreadyCheckedIn": false,
"pointsAdded": 10,
"pointsAdded": 17,
"streak": 1,
"score": 10,
"score": 17,
"lastCheckInDate": "2026-06-29",
"rewardMode": "configured_tasks",
"rewardBreakdown": [
{
"taskId": "<daily-check-in-task-id>",
"taskCode": "daily-check-in",
"title": "每日签到基础奖励",
"points": 12,
"periodKey": "2026-06-29"
},
{
"taskId": "<streak-task-id>",
"taskCode": "check-in-streak-day-one",
"title": "连续签到首日奖励",
"points": 5,
"periodKey": "2026-06-29"
}
],
"ledgers": [
{
"eventType": "check_in",
"sourceType": "point_activity_tasks",
"sourceId": "<daily-check-in-task-id>"
}
],
"claims": [
{
"taskId": "<daily-check-in-task-id>",
"periodKey": "2026-06-29",
"sourceType": "student_profiles"
}
],
"autoBadges": [
{
"badgeId": "...",
@@ -1194,6 +1225,8 @@ POST /api/profile/check-in
- `alreadyCheckedIn=true` 时展示今日已签到,不要本地再加分。
- 积分明细调用 `GET /api/profile/score-events`
- 积分最终余额以后端 `score` 和流水为准,前端只做展示。
- 租户如配置了 `taskType=daily_check_in` 的积分任务,签到会返回 `rewardMode=configured_tasks``rewardBreakdown`;前端可展示每项奖励,但不要重新计算连续签到奖励。
- 租户未配置每日签到任务时,后端会使用兼容旧逻辑的固定积分公式,并返回 `rewardMode=legacy_formula`
- 如响应包含 `autoBadges`,可展示获得勋章弹层;不要在前端根据连续天数或积分自行判断勋章是否解锁。
积分活动任务和积分兑换入口:
@@ -1229,7 +1262,7 @@ POST /api/profile/exchange-items/redeem
- 积分任务领取、积分扣减、库存扣减、个人限购、优惠券兑换履约都由后端事务处理。
- `practice_complete``mock_exam_submit``vocabulary_review` 等任务需要传 `sourceId`,后端会校验证据属于当前学生当前租户。
- `feedback_resolved` 等系统流程任务禁止学生自领,前端应展示为“系统发放”或不展示领取按钮。
- `daily_check_in``feedback_resolved` 等系统流程任务禁止学生自领,前端应展示为“系统发放”或不展示领取按钮;签到只调用 `POST /api/profile/check-in`
- 兑换返回 `order` 和最新积分余额后,再刷新 `profile/me``score-events` 和兑换列表;不要在本地先扣积分。
- 如果响应包含 `autoBadges`,按获得勋章提示处理;重复领取、库存不足、积分不足、限购等错误按后端 `code` 展示业务提示。
@@ -1248,6 +1281,32 @@ GET /api/tenant-admin/point-exchange-orders?itemId=<item-id>&status=pending_fulf
当前 Taro 第一版已经把租户积分运营嵌入 `apps/taro/src/pages/tenant-admin/marketing/index.tsx`,支持任务配置、兑换商品配置、任务领取记录和兑换订单查看。前端只提交配置和筛选条件,权限、优惠券/资源归属、库存、限购、积分扣减和审计仍由后端处理。
每日签到奖励配置复用同一组积分任务接口:
```json
{
"code": "daily-check-in",
"title": "每日签到基础奖励",
"taskType": "daily_check_in",
"rewardPoints": 12,
"periodType": "daily",
"metadata": {}
}
```
连续签到规则写在 `metadata`,后端按当前连续签到天数匹配,命中后自动写 `user_score_events``user_point_activity_claims`。常用字段:
```json
{
"requiredStreak": 7,
"minStreak": 3,
"maxStreak": 30,
"streakMultipleOf": 7
}
```
规则说明:`requiredStreak` 表示仅第 N 天命中,`minStreak/maxStreak` 表示连续天数区间,`streakMultipleOf` 表示连续天数为 N 的倍数时命中。多个 `daily_check_in` 任务可同时生效,后端会逐项发放并返回 `rewardBreakdown`
题目页、资料页或视频页可提交反馈:
```json