Files
cursor/plans/VIP-740abbc4.plan.md
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

80 lines
4.1 KiB
Markdown
Raw Permalink 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.

<!-- 740abbc4-5a59-41be-9318-5927550e6875 -->
---
todos:
- id: "sql"
content: "新建 slot_console/db/migrate_vip_bet_bonus_rate.sqlALTER 加列 bet_bonus_rate decimal(5,2) + UPDATE 写入 VIP1-15 初始值"
status: pending
- id: "console-logic"
content: "改 UserGameStatistics::switchBonus() 按 VIP 等级取 bet_bonus_rateVIP0/空配置不转换,补日志上下文"
status: pending
- id: "console-model"
content: "slot_console UserVipConfigModel 补 @property bet_bonus_rate"
status: pending
- id: "admin-model-validate"
content: "slot_admin UserVipConfigModel @property + UserVipConfigValidate rule/message/scene 增加 bet_bonus_rate"
status: pending
- id: "vue"
content: "slot_admin_vue edit.vue 与 index.vue 增加解锁流速字段与列"
status: pending
- id: "verify"
content: "按门禁跑 verify-slot-backend.sh 与 docker php -l输出检测报告"
status: pending
isProject: false
---
## 背景
`slot_console` 每日统计在用户亏损时把冻结金额转为可领取金额,当前用全局固定费率:
```147:148:slot_console/app/command/UserGameStatistics.php
$gameBaseInfo = ConfigService::getInstance()->getGroupData('game_base');
$bonus = intval($gameBaseInfo['bet_bonus_rate'] * $lose/100);
```
需求:解锁流速按 VIP 等级阶梯VIP1=0.5% … VIP15=2.0%),后台可配置。`user_vip_config` 现无此字段(已有的 `lose_rate` 是「亏损奖励」另一活动,不复用)。
## 决策(已确认)
- 全栈实现DB 列 + slot_admin/vue 后台可配 + slot_console 按等级取值。
- 新列 `bet_bonus_rate``decimal(5,2)`,单位 %。
- VIP0 比例为 0不再转换冻结金额
## 改动点
### 1. DB 迁移(新建 SQL
新建 [slot_console/db/migrate_vip_bet_bonus_rate.sql](slot_console/db/migrate_vip_bet_bonus_rate.sql)
- `ALTER TABLE s_common.user_vip_config ADD COLUMN bet_bonus_rate decimal(5,2) NOT NULL DEFAULT 0 COMMENT '冻结金额解锁流速(%)按VIP等级' AFTER lose_rate;`
- 按需求 `UPDATE` 写入 VIP1-15 初始值0.5/0.6/.../1.8/2.0VIP15=2.0)。
### 2. slot_console 取值逻辑
改 `switchBonus()`[slot_console/app/command/UserGameStatistics.php](slot_console/app/command/UserGameStatistics.php)
- 用 `VipService::getVipLevelConfig($userInfoEntity->vip_level)` 取 VIP 配置(已有 Redis 缓存)。
- VIP0 / 配置为空 / 费率<=0 直接 return不转换
- `$bonus = intval($vipConfig->bet_bonus_rate * $lose / 100);` 取代 game_base 读取。
- 日志补 `vip_level`、`bet_bonus_rate`。
模型 PHPDoc 加 `@property` 字段:[slot_console/app/model/UserVipConfigModel.php](slot_console/app/model/UserVipConfigModel.php)。
### 3. slot_admin 后台
- [model/UserVipConfigModel.php](backend/slot_admin/app/model/UserVipConfigModel.php)`@property` 增加 `bet_bonus_rate`。
- [validate/UserVipConfigValidate.php](backend/slot_admin/app/game/validate/UserVipConfigValidate.php)`rule`/`message`/`scene(save,update)` 增加 `bet_bonus_rate => require`。
- 该字段为百分比小数,直接存储,不走 `setNumberFormat`(控制器 `format()` 无需改)。
### 4. slot_admin_vue 前端
- [edit.vue](backend/slot_admin_vue/src/views/game/userVipConfig/edit.vue)`formData` + `rules` + 新增「解锁流速(%)」`a-form-item field="bet_bonus_rate"`。
- [index.vue](backend/slot_admin_vue/src/views/game/userVipConfig/index.vue)`columns` 增加「解锁流速」列。
## 数据流
```mermaid
flowchart LR
admin[slot_admin 配置bet_bonus_rate] --> db[(s_common.user_vip_config)]
admin --> cache[(redis vip:config:level:*)]
console[slot_console switchBonus] --> vipsvc[VipService.getVipLevelConfig]
vipsvc --> cache
vipsvc --> db
console --> wallet[switchBonus 转可领取]
```
## 注意
- `game_base.bet_bonus_rate` 配置改为不再被 `switchBonus` 使用(保留配置项,不删除)。
- Redis 缓存存 `model->toArray()`新列自动随后台保存刷新TTL 600s
- 完成前按门禁跑 `verify-slot-backend.sh` 与 docker `php -l`,并对照 php-clean-code 输出检测报告。