# 修复神秘种子灾害产量显示错误 **时间**: 2025年06月20日 14:49 **任务**: 修复后台土地类型列表中神秘种子灾害产量显示错误的问题 ## 问题描述 用户反馈后台 `/admin/farm-land-types` 页面中,神秘种子的灾害产量显示为 200-300,但数据库配置的是 100-200,与期望不一致。 ## 问题分析 通过检查发现问题的根源: 1. **数据库配置正确**:种子产出配置表中,神秘种子的灾害产量确实配置为 100-200 2. **普通种子显示正确**:普通种子的灾害产量正确显示为 100-200 3. **神秘种子显示错误**:神秘种子的灾害产量错误显示为 200-300 ## 根本原因 问题出现在 `MysterySeeLLogic::calculateAdjustedProbabilities()` 方法中,该方法返回的数据结构缺少了 `disaster_min_amount` 和 `disaster_max_amount` 字段,导致后台代码使用 fallback 逻辑,错误地使用了正常产量作为灾害产量。 ## 架构问题 用户指出了一个重要的架构问题:**后台编写了独立的产出逻辑计算,这是错误的,应该使用服务层/逻辑层的现有逻辑**。 这违反了项目的架构设计原则: - 后台应该使用服务层逻辑,而不是重复实现计算逻辑 - 如果逻辑层不完善,说明逻辑层有问题,应该修复逻辑层 ## 解决方案 ### 1. 修复逻辑层 修复 `app/Module/Farm/Logics/MysterySeeLLogic.php` 中的两个方法: #### calculateAdjustedProbabilities() 方法 ```php $adjustedOutputs[] = [ 'item_id' => $output->item_id, 'min_amount' => $output->min_amount, 'max_amount' => $output->max_amount, 'disaster_min_amount' => $output->disaster_min_amount, // 新增 'disaster_max_amount' => $output->disaster_max_amount, // 新增 'original_probability' => $baseProbability, 'adjusted_probability' => $adjustedProbability, 'adjustment_type' => $adjustmentType, 'is_default' => $output->is_default ]; ``` #### getDefaultOutputConfig() 方法 ```php return [[ 'item_id' => $seed->item_id, 'min_amount' => $seed->min_output, 'max_amount' => $seed->max_output, 'disaster_min_amount' => $seed->disaster_min_output, // 新增 'disaster_max_amount' => $seed->disaster_max_output, // 新增 'original_probability' => 100, 'adjusted_probability' => 100, 'adjustment_type' => 'default', 'is_default' => true ]]; ``` ### 2. 更新后台代码注释 更新 `app/Module/Farm/AdminControllers/Helper/GridHelperTrait.php` 中的注释,明确说明使用服务层逻辑: ```php /** * 渲染神秘种子的产出详情 * * 使用服务层逻辑计算神秘种子在该土地类型上的产出概率和产量 * * @param \App\Module\Farm\Models\FarmLandType $landType * @return string */ ``` ## 测试验证 修复后通过浏览器访问后台土地类型列表页面,验证结果: ### 修复前 - **神秘种子灾害产量**:200-300(错误) - **普通种子灾害产量**:100-200(正确) ### 修复后 - **神秘种子灾害产量**:100-200(正确) - **普通种子灾害产量**:100-200(正确) 现在两者都与数据库配置一致。 ## 代码提交 ```bash git add app/Module/Farm/AdminControllers/Helper/GridHelperTrait.php app/Module/Farm/Logics/MysterySeeLLogic.php git commit -m "修复农场模块:神秘种子灾害产量显示错误问题 - 修复MysterySeeLLogic::calculateAdjustedProbabilities()方法缺少disaster_min_amount和disaster_max_amount字段的问题 - 修复getDefaultOutputConfig()方法缺少灾害产量字段的问题 - 更新后台GridHelperTrait注释,明确使用服务层逻辑而非独立计算 - 现在神秘种子和普通种子的灾害产量都正确显示为100-200,与数据库配置一致 - 遵循架构设计原则:后台使用服务层逻辑,避免重复实现计算逻辑" git push ``` ## 总结 这次修复解决了两个层面的问题: 1. **技术问题**:修复了逻辑层缺少灾害产量字段的bug 2. **架构问题**:强调了后台应该使用服务层逻辑,而不是重复实现计算逻辑的原则 通过修复逻辑层的数据结构,确保了后台显示与数据库配置的一致性,同时遵循了项目的架构设计原则。