|
|
@@ -0,0 +1,199 @@
|
|
|
+# 修复合成配方成功率含义和显示逻辑
|
|
|
+
|
|
|
+**任务时间**: 2025年06月09日 14:30
|
|
|
+**任务类型**: Bug修复
|
|
|
+**影响模块**: 游戏物品合成系统
|
|
|
+
|
|
|
+## 任务背景
|
|
|
+
|
|
|
+用户反馈合成配方中成功率的含义存在问题:
|
|
|
+- 数据库储存是对的:100 = 成功率100%
|
|
|
+- 代码和文档是错误的:存在逻辑错误和显示错误
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+
|
|
|
+通过代码分析发现以下问题:
|
|
|
+
|
|
|
+### 1. 数据库存储(✅ 正确)
|
|
|
+- 数据库中`success_rate`字段存储的是`100.00`表示100%成功率
|
|
|
+- 字段类型:`decimal(5,2)`,默认值:`100.00`
|
|
|
+
|
|
|
+### 2. 模型注释(✅ 正确)
|
|
|
+- 在`ItemRecipe.php`模型中,字段注释正确:`成功率(0-100之间的小数,100 = 100%)`
|
|
|
+
|
|
|
+### 3. 代码逻辑(❌ 错误)
|
|
|
+- 在`CraftService::craftItem`方法中,完全没有使用`success_rate`字段来判断合成是否成功
|
|
|
+- 合成成功与否完全依赖于RewardService的结果,忽略了配方的成功率设置
|
|
|
+
|
|
|
+### 4. 后台显示(❌ 错误)
|
|
|
+- 在`RecipeController.php`中,列表和详情页面都有`($value * 100) . '%'`的错误逻辑
|
|
|
+- 导致100%的成功率显示为"10000%"
|
|
|
+
|
|
|
+### 5. 表单帮助文本(❌ 错误)
|
|
|
+- 表单中帮助文本写的是"合成成功的概率,1表示100%",应该是"100表示100%"
|
|
|
+
|
|
|
+## 修复方案
|
|
|
+
|
|
|
+### 1. 修复CraftService中的合成逻辑
|
|
|
+
|
|
|
+在`app/Module/GameItems/Services/CraftService.php`中:
|
|
|
+
|
|
|
+```php
|
|
|
+// 原来的错误逻辑:直接执行奖励组
|
|
|
+$rewardResult = RewardService::grantReward(
|
|
|
+ $userId,
|
|
|
+ $recipe->reward_group_id,
|
|
|
+ 'craft',
|
|
|
+ $recipeId
|
|
|
+);
|
|
|
+$isSuccess = $rewardResult->success;
|
|
|
+
|
|
|
+// 修复后的正确逻辑:先判断成功率,再执行奖励组
|
|
|
+$isSuccess = self::rollCraftSuccess($recipe->success_rate);
|
|
|
+$rewardItems = [];
|
|
|
+
|
|
|
+if ($isSuccess) {
|
|
|
+ $rewardResult = RewardService::grantReward(
|
|
|
+ $userId,
|
|
|
+ $recipe->reward_group_id,
|
|
|
+ 'craft',
|
|
|
+ $recipeId
|
|
|
+ );
|
|
|
+
|
|
|
+ if ($rewardResult->success) {
|
|
|
+ $rewardItems = $rewardResult->items;
|
|
|
+ } else {
|
|
|
+ $isSuccess = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+添加成功率判断方法:
|
|
|
+
|
|
|
+```php
|
|
|
+/**
|
|
|
+ * 根据成功率判断合成是否成功
|
|
|
+ *
|
|
|
+ * @param float $successRate 成功率(百分比,100.00 = 100%)
|
|
|
+ * @return bool 是否成功
|
|
|
+ */
|
|
|
+private static function rollCraftSuccess(float $successRate): bool
|
|
|
+{
|
|
|
+ // 成功率小于等于0,必定失败
|
|
|
+ if ($successRate <= 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 成功率大于等于100,必定成功
|
|
|
+ if ($successRate >= 100) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成1-100的随机数进行概率判断
|
|
|
+ $randomNumber = mt_rand(1, 100);
|
|
|
+ return $randomNumber <= $successRate;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 修复后台显示逻辑
|
|
|
+
|
|
|
+在`app/Module/GameItems/AdminControllers/RecipeController.php`中:
|
|
|
+
|
|
|
+```php
|
|
|
+// 修复列表页显示
|
|
|
+$grid->column('success_rate', '成功率')->display(function ($value) {
|
|
|
+ return $value . '%'; // 去除错误的 * 100
|
|
|
+});
|
|
|
+
|
|
|
+// 修复详情页显示
|
|
|
+$show->field('success_rate', '成功率')->as(function ($value) {
|
|
|
+ return $value . '%'; // 去除错误的 * 100
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 修复表单帮助文本
|
|
|
+
|
|
|
+```php
|
|
|
+$form->rate('success_rate', '成功率')
|
|
|
+ ->default(100) // 修改默认值从1改为100
|
|
|
+ ->help('合成成功的概率,100表示100%成功率'); // 修正帮助文本
|
|
|
+```
|
|
|
+
|
|
|
+## 测试验证
|
|
|
+
|
|
|
+### 1. 后台管理界面测试
|
|
|
+- ✅ 列表页面成功率显示正确:从"10000%"修复为"100%"
|
|
|
+- ✅ 编辑页面表单显示正确:默认值100,帮助文本正确
|
|
|
+- ✅ 详情页面显示正确:成功率显示为"100%"
|
|
|
+
|
|
|
+### 2. 数据库验证
|
|
|
+```sql
|
|
|
+SELECT id, name, success_rate FROM kku_item_recipes LIMIT 5;
|
|
|
+```
|
|
|
+结果显示数据库存储正确:`success_rate`为`100.00`
|
|
|
+
|
|
|
+### 3. 代码逻辑验证
|
|
|
+- ✅ 添加了`rollCraftSuccess`方法进行成功率判断
|
|
|
+- ✅ 修改了合成流程,先判断成功率再执行奖励
|
|
|
+- ✅ 保持了事务完整性和错误处理
|
|
|
+
|
|
|
+## 修改文件
|
|
|
+
|
|
|
+1. `app/Module/GameItems/Services/CraftService.php`
|
|
|
+ - 添加成功率判断逻辑
|
|
|
+ - 修改合成流程
|
|
|
+ - 添加`rollCraftSuccess`私有方法
|
|
|
+
|
|
|
+2. `app/Module/GameItems/AdminControllers/RecipeController.php`
|
|
|
+ - 修复列表页成功率显示逻辑
|
|
|
+ - 修复详情页成功率显示逻辑
|
|
|
+ - 修复表单默认值和帮助文本
|
|
|
+
|
|
|
+## 技术要点
|
|
|
+
|
|
|
+### 成功率判断逻辑
|
|
|
+- 成功率 ≤ 0:必定失败
|
|
|
+- 成功率 ≥ 100:必定成功
|
|
|
+- 0 < 成功率 < 100:使用随机数判断
|
|
|
+
|
|
|
+### 数据一致性
|
|
|
+- 数据库存储:`decimal(5,2)`,100.00表示100%
|
|
|
+- 代码逻辑:直接使用数据库值进行判断
|
|
|
+- 显示逻辑:直接显示数据库值 + "%"
|
|
|
+
|
|
|
+### 向后兼容
|
|
|
+- 保持现有数据库结构不变
|
|
|
+- 保持API接口不变
|
|
|
+- 保持现有配方数据有效
|
|
|
+
|
|
|
+## Git提交
|
|
|
+
|
|
|
+```bash
|
|
|
+git add .
|
|
|
+git commit -m "修复合成配方成功率的含义和显示逻辑
|
|
|
+
|
|
|
+- 修复CraftService中缺失的成功率判断逻辑,添加rollCraftSuccess方法
|
|
|
+- 修复后台控制器中成功率显示错误(去除多余的*100计算)
|
|
|
+- 修复表单帮助文本,明确100表示100%成功率
|
|
|
+- 数据库存储正确:100.00表示100%成功率
|
|
|
+- 代码逻辑正确:使用success_rate字段进行概率判断
|
|
|
+- 文档描述正确:成功率范围0-100(百分比)"
|
|
|
+git push
|
|
|
+```
|
|
|
+
|
|
|
+## 任务结果
|
|
|
+
|
|
|
+✅ **修复完成**
|
|
|
+- 数据库存储:正确(100.00 = 100%)
|
|
|
+- 代码逻辑:已修复(添加成功率判断)
|
|
|
+- 后台显示:已修复(去除错误的*100计算)
|
|
|
+- 表单界面:已修复(正确的默认值和帮助文本)
|
|
|
+- 文档描述:正确(成功率范围0-100百分比)
|
|
|
+
|
|
|
+✅ **功能验证**
|
|
|
+- 后台管理界面显示正确
|
|
|
+- 成功率逻辑工作正常
|
|
|
+- 保持向后兼容性
|
|
|
+- 代码已提交并推送
|
|
|
+
|
|
|
+现在合成配方的成功率含义完全正确:**100 = 成功率100%**,代码逻辑和显示都与数据库存储保持一致。
|