## 目标与范围 * 支持用户持有多个头衔,并在各类业务事件中正确生效与结算。 * 覆盖六类效果:领取优惠券、抽奖折扣、签到双倍积分、领取道具卡、概率加成、双倍奖励卡。 * 与既有四张表对齐:`system_titles`、`system_title_effects`、`user_titles`、`user_title_effect_claims`。 ## 整体架构 * 配置层:运营通过`system_titles`与`system_title_effects`完成模板与效果配置。 * 持有层:`user_titles`记录用户持有与激活状态、有效期与来源。 * 事件引擎:在`SIGNIN`、`DRAW_PURCHASE`、`DRAW_EXECUTE`与`CLAIM`类接口中查询并结算效果。 * 防重限流:`user_title_effect_claims`按周期唯一键实现并发防重与频次限制。 ```mermaid flowchart LR A[用户行为事件] --> B[查询激活头衔 user_titles] B --> C[加载效果 system_title_effects] C --> D{按scopes/effect_type过滤} D --> E[叠加/上限策略计算] E --> F[结算(积分/折扣/概率/发放)] F --> G[必要时写 user_title_effect_claims] ``` ## 效果模型与参数规范 * 统一字段:`effect_type`、`params_json`、`stacking_strategy`、`cap_value_x1000`、`scopes_json`、`status`。 * 固定小数:所有比例/倍数/折扣统一用`*_x1000`(例如 10% = 100,2倍 = 2000)。 * `params_json`建议结构: * 领取优惠券(`COUPON_CLAIM`): `{template_id, frequency:{period:'day|week|month', times:int}, start_at?, end_at?}` * 抽奖折扣(`DRAW_DISCOUNT`): `{discount_type:'percentage|fixed', value_x1000, min_price?, max_discount?}` * 签到倍数(`SIGNIN_MULTIPLIER`): `{multiplier_x1000, daily_cap_points?}` * 领取道具卡(`ITEM_CARD_CLAIM`): `{template_id, frequency:{period, times}}` * 概率加成(`PROBABILITY_BOOST`): `{target_pool_ids?:[], target_prize_ids?:[], boost_x1000, combine:'sum|max', cap_x1000?}` * 双倍奖励卡(`DOUBLE_REWARD`): `{chance_x1000, target_prize_ids?:[], period_cap_times?:int}` ## 叠加与上限策略 * `stacking_strategy`枚举: * `none`:不叠加,取单一最高优先级或最大值。 * `sum_with_cap`:求和后受`cap_value_x1000`或业务cap约束。 * `max_only`:取最大项。 * `multiply_with_cap`:倍数相乘后再cap(适用于少数特殊配置)。 * `priority_order`:按`priority`字段逐项应用,遇到冲突按优先级覆盖。 * 推荐缺省: * 抽奖折扣:`max_only`(防止过度优惠),可选`sum_with_cap`。 * 签到倍数:`sum_with_cap`(如多头衔加总倍数,上限控制)。 * 概率加成:`sum_with_cap`(保持可解释性与稳定性)。 * 领取型权益:同模板同周期`sum_with_cap`或`max_only`,按运营策略选择。 * 双倍奖励卡:多卡按`chance_x1000`合并使用`sum_with_cap`,并设`period_cap_times`。 ## 作用域与生效判定 * `scopes_json`建议:`{activity_ids?:[], phase_ids?:[], category_ids?:[], exclude?:{...}}`。 * 判定顺序:事件上下文→按`activity/phase/category`过滤→`status=active`→用户头衔`active=1`且未过期→计算叠加与cap。 * 冲突处理:包含与排除并存时优先排除;多效果同类型按`stacking_strategy`解决。 ## 事件结算流程 * 签到(`SIGNIN`): * 载入`SIGNIN_MULTIPLIER`→合并倍数→应用上限→计算积分→落账。 * 抽奖购票(`DRAW_PURCHASE`): * 载入`DRAW_DISCOUNT`→取最大或合并后cap→计算优惠→生成支付单。 * 抽奖执行(`DRAW_EXECUTE`): * 载入`PROBABILITY_BOOST`→对目标池/奖品加权(总概率归一)→进行抽取→载入`DOUBLE_REWARD`测试加倍机会→如命中,倍增奖品数量/价值并校验当期可用次数。 * 领取(`COUPON_CLAIM`/`ITEM_CARD_CLAIM`): * 解析`frequency.period`生成`period_key`(`YYYYMMDD|YYYYWW|YYYYMM`)→检查唯一键是否已存在→未存在则发放并写`user_title_effect_claims`;已存在直接返回已领取。 ## 防重与限流实现 * 唯一键:`user_id + title_id + effect_type + target_template_id + period_key`。 * 并发:使用数据库唯一约束天然防重;接口层加幂等键`Idempotency-Key`进一步防抖。 * 频次:根据`frequency.times`控制当期可用次数;若需累计多效果,按`stacking_strategy`决定合并或取最大。 ## 接口设计(示例) * 头衔管理 * `POST /titles/assign`:分配或续期;参数:`user_id, title_id, obtained_at, expires_at, source`。 * `PATCH /titles/:user_id/:title_id/activate`:激活/停用。 * `GET /titles/user/:user_id?active=1`:查询用户激活头衔与效果摘要。 * 事件接口 * `POST /events/signin`:入参`user_id, context`;出参`points, applied_effects`。 * `POST /events/draw/purchase`:入参`user_id, base_price, context`;出参`final_price, discount_breakdown`。 * `POST /events/draw/execute`:入参`user_id, context`;出参`prize, boost_detail, double_reward_applied, audit_id`。 * `POST /claims/coupon`:入参`user_id, template_id, context`;出参`claimed, period_key, remaining_times`。 * `POST /claims/item-card`:入参同上。 * 诊断/审计 * `GET /effects/preview`:给定`user_id+context`预览本次将应用的合并效果,用于运营核对。 ## 数据与索引建议 * 复用现有索引: * `user_titles`: `idx_user_titles_user`。 * `system_title_effects`: `idx_title_effects_title` + 按`effect_type/status`过滤。 * `user_title_effect_claims`: 周期唯一索引。 * 读优化: * 缓存`system_title_effects`(按`title_id`与`scopes_json`分片,TTL 5\~15 分钟)。 * 针对`DRAW_EXECUTE`的概率表做内存映射,命中后快速归一化计算。 ## 风险与边界处理 * 浮点误差:统一`*_x1000`避免精度问题。 * 过度优惠/过度概率:必须设置`cap_value_x1000`或业务cap。 * 多模板冲突:同类型不同模板时采用`priority_order`或业务白名单优先级。 * 过期与停用:事件前统一校验有效期与`status`,过期/停用不生效。 * 诊断可视化:提供`preview`接口给运营验证,防误配置上线。 ## 测试与验收标准 * 单元测试: * 每类效果的合并逻辑与cap测试;周期键生成与唯一约束;概率加成归一化与双倍卡应用顺序。 * 并发/幂等: * 高并发领取/购票/抽奖的防重与一致性测试。 * 集成测试: * 端到端场景: * 多头衔叠加签到倍数,限制生效。 * 两个折扣叠加取最大或cap限。 * 抽奖概率加成后命中率变更,双倍卡当期次数受限。 * 同模板每日领取限 1 次,多效果按策略合并。 * 验收标准: * 用户可持有多个头衔并正确生效; * 六类效果在对应事件中结算正确,含叠加与上限; * 领取型权益防重与限流稳定; * 审计日志完整,能输出`applied_effects`明细; * 性能满足并发指标(按业务要求)。 ## 交付物 * 结算引擎与效果合并模块的实现方案说明与接口契约。 * 管理/诊断接口的API说明与示例。 * 测试用例清单与通过报告。 * 运营使用指引:效果配置、叠加策略与风险提示。