refactor(utils): 修复密码哈希比较逻辑错误 feat(user): 新增按状态筛选优惠券接口 docs: 添加虚拟发货与任务中心相关文档 fix(wechat): 修正Code2Session上下文传递问题 test: 补充订单折扣与积分转换测试用例 build: 更新配置文件与构建脚本 style: 清理多余的空行与注释
4.5 KiB
4.5 KiB
现状与问题
- 当前 APP 抽奖接口:
POST /api/app/activities/:activity_id/issues/:issue_id/draw,处理函数internal/api/activity/draw_app.go:27-46,服务侧使用internal/service/activity/draw_execute.go:12-89的可验证随机抽样(HMAC-SHA256 + 拒绝采样)。 - 现有实现按期(issue)维度抽取奖励,已具备收据与随机性证明,但不同活动类型(分类/玩法)未来可能有差异化前置校验、选择规则与奖励发放流程。
- 需求:我们将有很多活动,接口到底通用还是分活动?
结论选择
- 接口保持通用(单一端点),后端采用策略模式按活动类别/配置差异化实现逻辑。这样:
- 前端保持统一调用与响应结构,降低复杂度与版本碎片。
- 后端可插拔扩展不同活动的校验、选择、奖励发放与效果管道,避免复制粘贴与接口膨胀。
- 与现有
Receipt结构兼容,保留可验证性。
技术方案
- 保留通用端点:
POST /api/app/activities/:activity_id/issues/:issue_id/draw。 - 引入“活动策略”接口(示例命名):
ActivityDrawStrategy:PreChecks(ctx, activity, issue, user) error(余额/订单/库存/状态/时间窗/限频)SelectItem(ctx, issue, baseSelector) (selectedRewardID, proof)(可复用当前 HMAC 随机选择器作为baseSelector,策略可注入权重或过滤规则)GrantReward(ctx, user, rewardID) error(扣减数量、落库收据/日志、发放道具/实物/积分/券)PostEffects(ctx, user, activity, issue, rewardID)(道具效果、称号、积分等联动)
- 策略注册与路由:
- 基于
activity.activity_category_id或活动配置选择策略;默认策略沿用当前实现(完全兼容)。
- 基于
- 效果管道:
- 抽奖前置/后置效果处理(如限时加权、Boss 限制、用户卡片效果),设计为中间件式管道,便于组合。
- 并发与一致性:
- 引入期级别乐观扣减或分布式锁(后续落地),确保高并发下数量与日志一致。
- 支持
X-Idempotency-Key防重(后续扩展),避免重复下单/重复抽取。
- 监控与审计:
- 统一埋点:抽奖尝试、成功、失败原因、库存变化、用户画像。
- 审计日志与追踪 ID 与收据关联。
API 契约
- 请求:保持不变;可新增可选头
X-Idempotency-Key。 - 响应:保持
receipt字段结构;策略仅影响内部选择/发放过程,不破坏契约。 - 错误码:标准化前置校验失败(余额不足、活动未开始、库存不足、限频)与系统错误。
数据与规则
- 数量规则:
original_qty为期初总数,quantity当前剩余;不限量为-1,选择与发放逻辑需正确处理。 - 收据:继续包含随机性证明与所选项快照,具备可验证性。
- 扣减与发放:在
GrantReward中统一实现(现阶段代码只返回收据,发放与扣减建议纳入策略实现)。
变更范围
- 新增
internal/service/activity/strategy/策略接口与默认实现;注册表按分类 ID 选择策略。 - 在
ExecuteDraw()增强:- 解析活动与用户上下文,调用策略
PreChecks→SelectItem→GrantReward→PostEffects。 - 默认策略复用当前
draw_execute.go的随机选择器。
- 解析活动与用户上下文,调用策略
draw_app.go维持统一端点,增加对用户上下文的传递(如需要),契约不变。
分阶段实施
- 引入策略接口与默认策略(不改变行为)。
- 接入活动类别路由与注册(读取
ActivityCategoryID)。 - 将扣减与发放迁移到策略中,补充事务与并发控制。
- 增强效果管道,接入道具卡、称号、积分的已有模块。
- 增加监控与限频、幂等,完善错误码。
- 编写单元测试与集成测试:
- 权重选择正确性与拒绝采样无偏。
- 不限量与零库存边界。
- 并发扣减一致性。
- 幂等与限频。
验收标准
- 单一抽奖端点适配 2+ 类活动策略,无需前端切换接口。
- 收据结构与随机性证明保持一致,验证脚本通过。
- 库存扣减与奖励发放在并发下无不一致;关键路径有审计日志。
- 测试覆盖关键流程与边界条件。
后续扩展
- 按活动类型开放“策略配置”与“玩法参数”在管理端,可动态调整权重、效果、限频。
- 如某玩法确有完全不同交互(例如合成/多次抽/队列结算),再考虑单独端点,但仍优先在通用端点层面通过参数与策略实现。