5.9 KiB
5.9 KiB
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) ActivityClient → slot-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_wagering:WalletService::register()仅拼type/fee/bonus+ base payload,bonus_wagering被丢弃,导致钱包侧RegisterService::resolveRegisterBonusRequiredWager始终按默认 1 倍。需补传。 - 幂等归属转移:钱包
register无biz_id去重,原幂等靠活动服 Redis NX 锁。解耦后由 slot-user 持有 Redis NX 锁(沿用biz_id = register:bonus:{uid}),避免同步路径与EventRegisterMQ 兜底重复发放。
改动清单
1. slot-user:新增赠金配置(config 文件)
- 新建
slot-user/config/register_bonus.php:从 env 读默认开关/金额(大单位)/打码倍数,并支持按source覆盖;如enabled、default => ['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-open:catch
Throwable仅LoggerService::error,不抛出(不阻断注册);失败时删除锁以便 MQ 兜底重试。 - 日志含
uid/source/currency/bonus/biz_id。
- 按
- 删除
slot-user/app/service/activity/RegisterBonusGatewayService.php。
3. slot-user:切换调用方
AbstractRegisterService::grantRegisterBonusAfterNewUserRegistered改调新RegisterBonusService(影响 6 个 RegisterService 子类,无需逐个改)。EventRegister::triggerRegisterBonus同步改为新服务(保留 MQ 兜底语义)。
4. slot_sdk:补传 bonus_wagering
WalletService::register()的WalletUpdateEntitypayload 增加'bonus_wagering' => $entity->bonus_wagering(WalletUpdateEntity/钱包 DTO 已支持该字段)。
5. slot-activity:下线注册赠金入口(清理,确认无其他调用方后执行)
- 删除
slot-activity/app/innerapi/{controller/RegisterBonusController, logic/RegisterBonusLogic, dto/RegisterBonusTriggerDto, validate/RegisterBonusValidate}.php及其路由。 - 删除 slot_sdk
ActivityService::triggerRegisterBonus与RegisterBonusTriggerEntity/响应实体(grep 确认仅 slot-user 旧网关使用)。 activity_type=7 注册赠送活动数据保留与否由运营决定,本次不动表结构。
待确认 / 决策
- 是否对每个新用户都调一次 register 以确保钱包账户必建(即便赠金为 0):当前钱包账户由 register 调用创建,建议赠金=0 时仍调用
register(bonus=0)兜底建账户;若钱包账户另有创建入口则无需。实现时按现状默认「仅金额>0 才发」,此点单独标注。 - 按
source区分金额的具体取值由运营提供;config 先给default。
验收
- 注册(各 RegisterService)+ MQ 兜底各跑一次,确认:赠金按配置入账一次(幂等不重复)、
bonus_wagering生效(钱包 fund lotrequired_wager正确)、活动服关停不影响注册与发放。 - 收尾执行
slot-backend-completion-report门禁(verify +php -l)。