bindbox-game/.trae/documents/头衔表DDL(含字段备注与事务).md
邹方成 8141a47690
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(称号系统): 新增称号管理功能与抽奖效果集成
- 新增系统称号模板与效果配置表及相关CRUD接口
- 实现用户称号分配与抽奖效果应用逻辑
- 优化抽奖接口支持用户ID参数以应用称号效果
- 新增称号管理前端页面与分配功能
- 修复Windows时区错误与JSON字段初始化问题
- 移除无用管理接口代码并更新文档说明
2025-11-16 11:37:40 +08:00

7.7 KiB
Raw Blame History

头衔权益系统设计与开发方案

目标与范围

  • 目标:构建“用户头衔”体系,使用户可拥有多个头衔,并在签到、抽奖、领取等事件中触发对应权益。
  • 权益范围:
    1. 领取优惠券
    2. 抽奖折扣(票价优惠)
    3. 签到双倍积分
    4. 领取道具卡
    5. 抽奖概率加成
    6. 奖品双倍概率(命中后按概率倍增奖励)
  • 管理端:支持头衔模板与效果配置、用户分配与启停;用户端:展示头衔、领取入口、页面显示加成提示。

现有能力复用

  • 优惠券:system_coupons/user_coupons 与管理端发券接口。
  • 积分与流水:user_points/user_points_ledger,新增“签到”服务即可接入倍数规则。
  • 抽奖:activity_issues/activity_reward_settings 与执行流程,按设计接入概率加成与双倍概率试验。
  • 道具卡:system_item_cards/user_item_cards 与相关服务。

数据模型已提供DDL

  • system_titles:头衔模板主表,定义名称、状态、获得规则与作用范围。
  • system_title_effects:头衔-效果配置,一条记录代表一个效果项(含类型、参数、叠加策略与封顶)。
  • user_titles:用户持有头衔资产,含激活状态、有效期与来源。
  • user_title_effect_claims:领取型权益的周期限流与防重(如每日领券一次)。
  • 注:不改动 activity_draw_effects 结构;抽奖效果的来源审计通过“效果应用层”记录到日志或 Remark 字段,保持表结构不变。

效果类型与参数约定

  • effect_type(整型枚举):
    • 1=COUPON_CLAIM领取优惠券
    • 2=DRAW_DISCOUNT抽奖折扣
    • 3=SIGNIN_MULTIPLIER签到积分倍数
    • 4=ITEM_CARD_CLAIM领取道具卡
    • 5=DRAW_PROBABILITY_BONUS抽奖概率加成
    • 6=DRAW_REWARD_DOUBLE_CHANCE奖品双倍概率
  • params_json 约定:
    • COUPON_CLAIM{template_id, frequency: 'once|daily|weekly|monthly', max_per_period}
    • DRAW_DISCOUNT{discount_type: 'percent|fixed', value, max_cap, applicable_activities, applicable_issues}
    • SIGNIN_MULTIPLIER{multiplier_x1000: 2000, cap_value_x1000: 3000}
    • ITEM_CARD_CLAIM{template_id, frequency, max_per_period}
    • DRAW_PROBABILITY_BONUS{probability_delta_x1000, cap_value_x1000, applicable_activities, applicable_issues}
    • DRAW_REWARD_DOUBLE_CHANCE{multiplier_x1000: 2000, chance_x1000: 150, max_multiplier_cap_x1000: 3000, limit_per_day: null, applicable_activities, applicable_issues}
  • stacking_strategy0=取最大MAX1=累加并封顶STACK_CAPPED2=按排序首个FIRST_MATCH

叠加与封顶规则

  • 抽奖折扣同类折扣按策略默认MAX合并STACK_CAPPED则累加至max_cap
  • 签到倍数乘法叠加但有总封顶如≤3x
  • 概率加成相加叠加后按上限封顶如≤500‰
  • 奖品双倍概率:
    • 概率合并:p_total = 1 - ∏(1 - p_i)并设置上限如≤50%)。
    • 倍数合并:与其他奖励倍数(如道具卡)做乘法,但最终乘积受max_multiplier_cap_x1000封顶如≤3x

事件与规则引擎EffectEngine

  • 统一事件:
    • SIGNIN:加载用户激活头衔,应用SIGNIN_MULTIPLIER,写积分与流水。
    • COUPON_CLAIM/ITEM_CARD_CLAIM:校验user_title_effect_claims限流后发放。
    • DRAW_PURCHASE:计算DRAW_DISCOUNT,作用于抽奖票价。
    • DRAW_EXECUTE:在“中奖项选择”后进行概率加成与“双倍概率”试验,计算最终奖励倍数;将结果影响在发奖/展示层体现,同时保留来源信息到日志或回执扩展结构(不改表)。
  • 引擎职责:读取user_titles → system_title_effects,按叠加策略合并同类项并输出结算指令;保障并发可重入与审计信息完备(在不改动抽奖效果表前提下记录来源)。

接口设计

  • 管理端
    • POST /api/admin/system_titles 头衔模板创建
    • PUT /api/admin/system_titles/:id 头衔模板修改
    • GET /api/admin/system_titles 列表检索
    • DELETE /api/admin/system_titles/:id 删除(级联效果)
    • POST /api/admin/system_titles/:id/effects 效果创建含JSON校验
    • PUT /api/admin/system_titles/:id/effects/:effect_id 效果修改
    • DELETE /api/admin/system_titles/:id/effects/:effect_id 效果删除
    • POST /api/admin/users/:user_id/titles/:title_id/assign 分配头衔
    • PUT /api/admin/users/:user_id/titles/:title_id/toggle 激活/停用
  • 用户端
    • GET /api/app/users/:user_id/titles 我的头衔与效果摘要(含可领取提示)
    • POST /api/app/users/:user_id/titles/:title_id/effects/coupon/claim 领券
    • POST /api/app/users/:user_id/titles/:title_id/effects/item_card/claim 领卡
    • POST /api/app/users/:user_id/signin 签到(生成流水,应用倍数)
    • 抽奖购票与执行在现有接口内接入EffectEngine不改外部路由签名。

业务流程

  • 领取型权益:校验user_title_effect_claims唯一键(周期),通过则发券/发卡并写入计数;拒绝则返回已达上限。
  • 签到:读取倍数并写入user_points_ledger(action=signin);倍数叠加与封顶在引擎完成。
  • 抽奖购票:计算折扣并返回应付价;可在订单侧抵扣。
  • 抽奖执行:
    1. 按现有算法选中奖励项
    2. 计算概率加成后的总概率与“双倍概率”的p_total
    3. 使用受控RNG进行一次试验命中则将奖励倍数乘以multiplier_x1000
    4. 将来源信息title/effect参数记录到日志或回执扩展结构不改动表用于运营分析和复核

风控与审计

  • 限流与防重:依赖user_title_effect_claims唯一键与事务保证。
  • 并发安全:接口层加幂等键(如period_key)与事务处理,避免重复发放。
  • 来源审计:在不改表的前提下,将来源写入日志/回执的备注域或独立运营日志表(后续若需要可扩展)。

开发方案与里程碑

  • M1 数据层与代码生成
    • 执行DDL事务+先删后建),新增四张表
    • 更新cmd/gormgen配置并生成DAO/Model
    • 管理端头衔模板与效果CRUD接口与页面
  • M2 规则引擎与签到
    • 实现EffectEngine加载、合并、封顶、指令输出
    • 新增POST /api/app/users/:user_id/signin服务,应用签到倍数
    • 领取型权益限流服务与接口(领券/领卡)
  • M3 抽奖集成
    • 在购票结算接入DRAW_DISCOUNT
    • 在抽奖执行接入DRAW_PROBABILITY_BONUSDRAW_REWARD_DOUBLE_CHANCE
    • 在不改表前提下,于日志/回执的备注域记录来源参数
  • M4 前端联动与运营
    • 管理端:头衔与效果配置表单、分配头衔入口
    • 用户端:我的头衔页、领取入口、抽奖页加成展示
  • M5 测试与验收
    • 单元/集成测试:限流、叠加、封顶、并发
    • 压测与随机性验证:抽奖公平性与概率准确性
    • 文档与Swagger更新

测试用例要点

  • 单头衔15%双倍抽样命中率约等于15%倍数为2x
  • 多头衔概率合并10%与20% → 总概率≈28%
  • 倍数合并与道具卡1.5x叠加,最终乘积≤封顶
  • 领取限流:同周期重复领取被拒绝,计数与时间正确更新
  • 并发:高并发领取与抽奖下无重复发放与越界叠加

验收标准

  • 多头衔并存下,五类权益+双倍概率在对应事件正确触发与叠加、封顶生效
  • 管理端与用户端流程完整、接口稳定、文档齐备
  • 概率与倍数验证通过,随机性与公平性符合预期
  • 审计信息可追踪(在现有表结构前提下)

请确认以上“设计方案与开发计划”,确认后我将按里程碑开始实现。