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

79 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 254c9e72-64e2-4a49-bb96-cb80c68065d7 -->
---
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-user/app/service/activity/RegisterBonusGatewayService.php) → (slot_sdk) `ActivityClient` → [`slot-activity` `RegisterBonusLogic`](slot-activity/app/innerapi/logic/RegisterBonusLogic.php)(查活动配置 + Redis 幂等锁 + 调钱包 register
问题:注册赠金强依赖活动服;活动服不可用时新用户拿不到赠金(且 register 类型钱包调用是钱包账户创建入口,间接影响)。
目标(已确认):**完全解耦**,赠金配置放 slot-user 的 **config 文件**,由用户服直接调钱包,不再依赖 slot-activity。
```mermaid
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()`](slot_sdk/src/service/wallet/WalletService.php) 仅拼 `type/fee/bonus` + base payload`bonus_wagering` 被丢弃,导致钱包侧 [`RegisterService::resolveRegisterBonusRequiredWager`](slot-wallet/app/service/wallet/RegisterService.php) 始终按默认 1 倍。需补传。
- **幂等归属转移**:钱包 `register``biz_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` 覆盖;如 `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-opencatch `Throwable``LoggerService::error`,不抛出(不阻断注册);失败时删除锁以便 MQ 兜底重试。
- 日志含 `uid/source/currency/bonus/biz_id`
- 删除 [`slot-user/app/service/activity/RegisterBonusGatewayService.php`](slot-user/app/service/activity/RegisterBonusGatewayService.php)。
### 3. slot-user切换调用方
- [`AbstractRegisterService::grantRegisterBonusAfterNewUserRegistered`](slot-user/app/service/register/AbstractRegisterService.php) 改调新 `RegisterBonusService`(影响 6 个 RegisterService 子类,无需逐个改)。
- [`EventRegister::triggerRegisterBonus`](slot-user/app/command/EventRegister.php) 同步改为新服务(保留 MQ 兜底语义)。
### 4. slot_sdk补传 bonus_wagering
- [`WalletService::register()`](slot_sdk/src/service/wallet/WalletService.php) 的 `WalletUpdateEntity` payload 增加 `'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 lot `required_wager` 正确)、活动服关停不影响注册与发放。
- 收尾执行 `slot-backend-completion-report` 门禁verify + `php -l`)。