--- todos: - id: "sql" content: "新建 slot_console/db/migrate_vip_bet_bonus_rate.sql:ALTER 加列 bet_bonus_rate decimal(5,2) + UPDATE 写入 VIP1-15 初始值" status: pending - id: "console-logic" content: "改 UserGameStatistics::switchBonus() 按 VIP 等级取 bet_bonus_rate,VIP0/空配置不转换,补日志上下文" 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.0,VIP15=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 输出检测报告。