Files
cursor/plans/register-bonus-decouple-254c9e72.plan.md
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

5.9 KiB
Raw Blame History


todos:

  • id: "config" content: "新建 slot-user/config/register_bonus.php从 env 读默认开关/金额(大单位)/打码倍数,支持按 source 覆盖" status: pending
  • id: "service" content: "新建 slot-user/app/service/wallet/RegisterBonusService.php读配置+Redis NX 幂等+slot_sdk WalletClient->register+fail-open删除旧 activity 网关" status: pending
  • id: "callers" content: "AbstractRegisterService::grantRegisterBonusAfterNewUserRegistered 与 EventRegister::triggerRegisterBonus 切换到新服务" status: pending
  • id: "sdk-wagering" content: "修复 slot_sdk WalletService::register() 补传 bonus_wagering" status: pending
  • id: "activity-cleanup" content: "确认无其他调用方后,下线 slot-activity 注册赠金 innerapi 与 slot_sdk ActivityService::triggerRegisterBonus 相关代码" status: pending
  • id: "verify" content: "注册各入口+MQ 兜底验证幂等与 wagering跑后端门禁脚本" status: pending isProject: false

注册赠金从活动服解耦到用户服

背景与现状

当前链路:slot-user 注册 → RegisterBonusGatewayService → (slot_sdk) ActivityClientslot-activity RegisterBonusLogic(查活动配置 + Redis 幂等锁 + 调钱包 register

问题:注册赠金强依赖活动服;活动服不可用时新用户拿不到赠金(且 register 类型钱包调用是钱包账户创建入口,间接影响)。

目标(已确认):完全解耦,赠金配置放 slot-user 的 config 文件,由用户服直接调钱包,不再依赖 slot-activity。

flowchart LR
  reg["slot-user 注册 / EventRegister MQ"] --> svc["新 RegisterBonusService(读 config + Redis 幂等)"]
  svc -->|slot_sdk WalletClient->register| wallet["slot-wallet RegisterService 入账+建账户"]

关键修复点(必须)

  • slot_sdk 漏传 bonus_wageringWalletService::register() 仅拼 type/fee/bonus + base payloadbonus_wagering 被丢弃,导致钱包侧 RegisterService::resolveRegisterBonusRequiredWager 始终按默认 1 倍。需补传。
  • 幂等归属转移:钱包 registerbiz_id 去重,原幂等靠活动服 Redis NX 锁。解耦后由 slot-user 持有 Redis NX 锁(沿用 biz_id = register:bonus:{uid}),避免同步路径与 EventRegister MQ 兜底重复发放。

改动清单

1. slot-user新增赠金配置config 文件)

  • 新建 slot-user/config/register_bonus.php:从 env 读默认开关/金额(大单位)/打码倍数,并支持按 source 覆盖;如 enableddefault => ['amount' => env('REGISTER_BONUS_AMOUNT',0), 'wagering' => env('REGISTER_BONUS_WAGERING',1)]sources => ['pwa_a' => [...]]
  • 金额大单位经 slot\foundation\Tools\MoneyTool::bigUnitToSmallUnit 转最小单位;币种取自 UserShardModel->currency

2. slot-user新增直连钱包的赠金服务替换活动网关

  • 新建 slot-user/app/service/wallet/RegisterBonusService.php(公共能力:读配置 + 跨服务调钱包):
    • source 解析金额/倍数金额≤0 或未启用 → 记日志跳过。
    • Redis SET NX EX 幂等锁key 含 uid命中重复直接返回。
    • 经 slot_sdk WalletClient->register(WalletRegisterEntity{uid,source,currency,organization,biz_id,bonus,bonus_wagering}) 入账。
    • fail-opencatch ThrowableLoggerService::error,不抛出(不阻断注册);失败时删除锁以便 MQ 兜底重试。
    • 日志含 uid/source/currency/bonus/biz_id
  • 删除 slot-user/app/service/activity/RegisterBonusGatewayService.php

3. slot-user切换调用方

4. slot_sdk补传 bonus_wagering

  • WalletService::register()WalletUpdateEntity payload 增加 'bonus_wagering' => $entity->bonus_wageringWalletUpdateEntity/钱包 DTO 已支持该字段)。

5. slot-activity下线注册赠金入口清理确认无其他调用方后执行

  • 删除 slot-activity/app/innerapi/{controller/RegisterBonusController, logic/RegisterBonusLogic, dto/RegisterBonusTriggerDto, validate/RegisterBonusValidate}.php 及其路由。
  • 删除 slot_sdk ActivityService::triggerRegisterBonusRegisterBonusTriggerEntity/响应实体grep 确认仅 slot-user 旧网关使用)。
  • activity_type=7 注册赠送 活动数据保留与否由运营决定,本次不动表结构。

待确认 / 决策

  • 是否对每个新用户都调一次 register 以确保钱包账户必建(即便赠金为 0当前钱包账户由 register 调用创建,建议赠金=0 时仍调用 register(bonus=0) 兜底建账户;若钱包账户另有创建入口则无需。实现时按现状默认「仅金额>0 才发」,此点单独标注。
  • source 区分金额的具体取值由运营提供config 先给 default

验收

  • 注册(各 RegisterService+ MQ 兜底各跑一次,确认:赠金按配置入账一次(幂等不重复)、bonus_wagering 生效(钱包 fund lot required_wager 正确)、活动服关停不影响注册与发放。
  • 收尾执行 slot-backend-completion-report 门禁verify + php -l)。