bindbox-game/.trae/documents/设计“活动中心”任务型奖励系统.md
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

76 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 目标与边界
- 建立“任务中心”独立域(不改动现有`Activities`抽奖域)。
- 支持任务类型首日下单、订单里程碑完成N单阶梯、邀请有效好友人数N。
- 奖励类型:积分、优惠券、道具卡、称号;统一走发奖服务,库存安全与幂等。
## 域与架构
- 新域:`TaskCenter`(目录建议:`internal/api/task_center``internal/service/task_center``internal/repository/mysql/task_center`)。
- 模式:事件驱动 + 调度补偿;与抽奖域并行、互不侵入。
- 统一发奖:复用`internal/service/user/reward_grant.go`;任务域自有进度与日志。
## 核心数据模型(新表)
- `Tasks`:任务基础信息(`id/name/description/status/start_time/end_time/visibility`)。
- `TaskTiers`:任务档位(`task_id/tier_id/threshold/operator(metric: first_order|order_count|invite_count)/repeatable/priority`)。
- `TaskRewards`:档位奖励映射(`task_id/tier_id/reward_type(points|coupon|item_card|title)/reward_payload/quantity`)。
- `UserTaskProgress`:用户进度(`user_id/task_id/metrics{order_count,invite_count,first_order}``claimed_tiers[]`)。
- `TaskEventLogs`:事件与发放日志(`event_id/source(order_id|invite_id)/user_id/task_id/tier_id/status/result/enforced_idempotency_key`)。
- `UserTitles`(如无现表):用户称号(`user_id/title_id/source(task_id/tier_id)`)。若已有虚拟`Inventory`可用则复用。
## 任务规则与判定
- 首日下单:事件`OrderPaid`且为用户首次有效订单;档位一次性发放(`repeatable=false`)。
- 订单里程碑:累计`order_count>=[1,3,5,10]`,每档一次(`repeatable=true_once_per_tier`)。
- 邀请有效好友:`InviteSuccess`(有效:注册+首单),累计`invite_count>=[1,5,10]`
- 规则DSL存于`Tasks.conditions_schema`或按`TaskTiers`结构硬编码字段,支持窗口(活动期/注册日起)。
## 事件处理流程
- 实时:
- 订阅`OrderPaid``InviteSuccess`→更新`UserTaskProgress`→匹配达标档位→查`TaskEventLogs`幂等→`user.GrantReward(...)`→记日志与`claimed_tiers`
- 幂等:`idempotency_key=user_id + task_id + tier_id + event_id`
- 逆向事件:`OrderRefunded/Cancelled`→回滚进度(不回收已发奖励,策略可配置,默认不回收)。
## 奖励发放映射
- 积分:安全增加余额;入账日志。
- 优惠券:派发券码(有效期/叠加规则从券系统读取)。
- 道具卡:发卡入用户`Inventory`;与抽奖加成逻辑无耦合,仅作为奖励资产。
- 称号:新建`Titles`/`UserTitles`或复用`Inventory`虚拟类型;展示端读取用户当前称号。
## 管理端接口(新路由前缀`/api/admin/task-center`
- `POST /tasks` 创建任务
- `PUT /tasks/:id` 修改、`DELETE /tasks/:id` 删除
- `POST /tasks/:id/tiers` 批量配置档位与奖励
- `GET /tasks/:id/progress` 任务进度与发放统计
- 复用券/卡管理:`/api/admin/system_coupons``/api/admin/system_item_cards`
## APP端接口新路由前缀`/api/app/task-center`
- `GET /tasks` 任务列表与规则说明
- `GET /tasks/:id/progress` 我的进度与已领奖档位
- `POST /tasks/:id/claim`(可选手动领取,默认自动发放)
- `GET /rewards` 统一查看已获奖励(或复用现有奖励中心)
## 调度与补偿
- 新增任务域调度器:周期对账`UserTaskProgress`与事件流,补漏发奖,生成统计报表。
- 指标快照:每日汇总订单/邀请指标与发奖结果,便于风控与运营复盘。
## 风控与限制
- 邀请有效性:设备指纹、手机号/实名校验、首单达成才计数。
- 刷单检测:黑名单、频次限制、风控评分;达到阈值的用户不触发发奖。
- 限制每日发奖上限、IP/设备限流、防重入保护。
## 集成与兼容
- 与抽奖域零耦合:不读写`Activities`/`ActivityRewardSettings/DrawLogs`
- 统一发奖:仅调用`internal/service/user/reward_grant.go`;券/卡系统复用现有接口。
- 路由与权限:参考`internal/router/router.go`风格新增task-center分组。
## 验收标准
- 三类任务均可正确识别达标并一次性/阶梯发奖;幂等无重复。
- 奖励入账正确,库存扣减准确;日志完备可追溯。
- 调度能补漏风控能拦截异常性能P95<200ms
## 实施里程碑
- M1 新域目录/数据模型/管理端CRUD不影响现有抽奖)。
- M2 接入`OrderPaid`实现订单里程碑任务与APP进度查询
- M3 首日下单与邀请N任务称号奖励落地
- M4 调度补偿/对账与统一奖励查看页面
- M5 风控与监控报警完善压测与性能优化
确认后我将按6A工作流在`docs/任务中心/`生成对齐/设计/任务分解文档并开始增量实现新域