فهرست منبع

农场模块:修改产出数量区间为有灾害时最大产出+有灾害时最小产出

- 为FarmSeedOutput表添加disaster_min_amount字段
- 为FarmSeed表添加disaster_min_output字段
- 更新模型类添加新字段到fillable和注释
- 更新后台管理界面显示和编辑新字段
- 更新CropLogic产量计算逻辑使用新的灾害时最小产出
- 修正数据库现有数据设置合理的默认值
- 更新生成的SQL文件反映新表结构
AI Assistant 6 ماه پیش
والد
کامیت
99ec695b32

+ 4 - 0
app/Module/Farm/AdminControllers/FarmSeedController.php

@@ -54,6 +54,7 @@ class FarmSeedController extends AdminController
             $grid->column('min_output', '最小产出')->sortable();
             $grid->column('max_output', '最大产出')->sortable();
             $grid->column('disaster_max_output', '灾害时最大产出')->sortable();
+            $grid->column('disaster_min_output', '灾害时最小产出')->sortable();
             $grid->column('item_id', '物品ID')->sortable();
             $grid->column('created_at', '创建时间')->sortable();
             $grid->column('updated_at', '更新时间')->sortable();
@@ -107,6 +108,7 @@ class FarmSeedController extends AdminController
             $show->field('min_output', '最小产出');
             $show->field('max_output', '最大产出');
             $show->field('disaster_max_output', '灾害时最大产出');
+            $show->field('disaster_min_output', '灾害时最小产出');
             $show->field('item_id', '物品ID');
             $helper->fieldModelCatsJson('disaster_resistance', '灾害抵抗');
             $helper->fieldModelCatsJson('display_attributes', '显示属性');
@@ -138,6 +140,8 @@ class FarmSeedController extends AdminController
             $form->number('max_output', '最大产出')->min(0)->required();
             $form->number('disaster_max_output', '灾害时最大产出')->min(0)->default(2000)->required()
                 ->help('当作物有灾害时,产量的最大限制值');
+            $form->number('disaster_min_output', '灾害时最小产出')->min(0)->default(500)->required()
+                ->help('当作物有灾害时,产量的最小限制值');
             $form->number('item_id', '物品ID')->min(1)->required();
             $helper->embedsCats('disaster_resistance', '灾害抵抗');
             $helper->embedsCats('display_attributes', '显示属性');

+ 4 - 0
app/Module/Farm/AdminControllers/FarmSeedOutputController.php

@@ -55,6 +55,7 @@ class FarmSeedOutputController extends AdminController
             $grid->column('min_amount', '最小产出数量')->sortable();
             $grid->column('max_amount', '最大产出数量')->sortable();
             $grid->column('disaster_max_amount', '灾害时最大产出')->sortable();
+            $grid->column('disaster_min_amount', '灾害时最小产出')->sortable();
             $grid->column('probability', '产出概率')->display(function ($value) {
                 return $value . '%';
             })->sortable();
@@ -96,6 +97,7 @@ class FarmSeedOutputController extends AdminController
             $show->field('min_amount', '最小产出数量');
             $show->field('max_amount', '最大产出数量');
             $show->field('disaster_max_amount', '灾害时最大产出');
+            $show->field('disaster_min_amount', '灾害时最小产出');
             $show->field('probability', '产出概率')->as(function ($value) {
                 return $value . '%';
             });
@@ -123,6 +125,8 @@ class FarmSeedOutputController extends AdminController
             $form->number('max_amount', '最大产出数量')->min(0)->required();
             $form->number('disaster_max_amount', '灾害时最大产出数量')->min(0)->default(2000)->required()
                 ->help('当作物有灾害时,此物品产出数量的最大限制值');
+            $form->number('disaster_min_amount', '灾害时最小产出数量')->min(0)->default(500)->required()
+                ->help('当作物有灾害时,此物品产出数量的最小限制值');
             $form->number('probability', '产出概率')->min(0)->max(100)
                 ->help('请输入 0-100 之间的数字,表示百分比,如 10 表示 10%')
                 ->required();

+ 1 - 0
app/Module/Farm/Databases/GenerateSql/farm_seed_outputs.sql

@@ -11,6 +11,7 @@ CREATE TABLE `kku_farm_seed_outputs` (
   `min_amount` int unsigned NOT NULL COMMENT '最小产出数量',
   `max_amount` int unsigned NOT NULL COMMENT '最大产出数量',
   `disaster_max_amount` int unsigned NOT NULL DEFAULT '2000' COMMENT '有灾害时最大产出数量',
+  `disaster_min_amount` int unsigned NOT NULL DEFAULT '500' COMMENT '有灾害时最小产出数量',
   `probability` decimal(7,4) NOT NULL COMMENT '产出概率(0-1)',
   `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为默认产出',
   `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

+ 1 - 0
app/Module/Farm/Databases/GenerateSql/farm_seeds.sql

@@ -16,6 +16,7 @@ CREATE TABLE `kku_farm_seeds` (
   `min_output` int unsigned NOT NULL COMMENT '最小产出',
   `max_output` int unsigned NOT NULL COMMENT '最大产出',
   `disaster_max_output` int unsigned NOT NULL DEFAULT '2000' COMMENT '有灾害时最大产出',
+  `disaster_min_output` int unsigned NOT NULL DEFAULT '500' COMMENT '有灾害时最小产出',
   `item_id` bigint unsigned NOT NULL COMMENT '对应的物品ID',
   `disaster_resistance` json DEFAULT NULL COMMENT '灾害抵抗',
   `display_attributes` json DEFAULT NULL COMMENT '显示属性',

+ 12 - 5
app/Module/Farm/Logics/CropLogic.php

@@ -1081,6 +1081,7 @@ class CropLogic
                     'min_amount' => $targetOutput->min_amount,
                     'max_amount' => $targetOutput->max_amount,
                     'disaster_max_amount' => $targetOutput->disaster_max_amount ?? 2000,
+                    'disaster_min_amount' => $targetOutput->disaster_min_amount ?? 500,
                 ];
             }
 
@@ -1093,6 +1094,7 @@ class CropLogic
                     'min_amount' => $seed->min_output,
                     'max_amount' => $seed->max_output,
                     'disaster_max_amount' => $seed->disaster_max_output ?? 2000,
+                    'disaster_min_amount' => $seed->disaster_min_output ?? 500,
                 ];
             }
 
@@ -1154,17 +1156,21 @@ class CropLogic
             // 2. 获取基础产量(使用发芽期确定的产出配置)
             $outputInfo = $this->getOutputInfoByItemId($seed->id, $crop->final_output_item_id);
 
-            // 检查是否有灾害,如果有灾害则限制基础产量的最大值
+            // 检查是否有灾害,如果有灾害则使用灾害时的产量区间
             $hasDisaster = !empty($crop->disasters);
+            $minBaseAmount = $outputInfo['min_amount'];
             $maxBaseAmount = $outputInfo['max_amount'];
 
             if ($hasDisaster) {
-                // 有灾害时,基础产量的最大值不能超过产出配置的灾害最大产量
+                // 有灾害时,使用灾害时的产量区间
+                $disasterMinAmount = $outputInfo['disaster_min_amount'] ?? 500;
                 $disasterMaxAmount = $outputInfo['disaster_max_amount'] ?? 2000;
-                $maxBaseAmount = min($outputInfo['max_amount'], $disasterMaxAmount);
+                $minBaseAmount = $disasterMinAmount;
+                $maxBaseAmount = $disasterMaxAmount;
             }
 
-            $baseAmount = mt_rand($outputInfo['min_amount'], $maxBaseAmount);
+            // 3. 计算基础产量(随机值)
+            $baseAmount = mt_rand($minBaseAmount, $maxBaseAmount);
 
             // 3. 获取土地的产量加成
             $landOutputBonus = $land->landType->output_bonus ?? 0;
@@ -1206,7 +1212,7 @@ class CropLogic
             if ($hasHarvestBuff) {
                 // 丰收之神加持时的最大产量也要考虑灾害影响
                 $maxPossibleAmount = $hasDisaster ?
-                    min($outputInfo['max_amount'], $outputInfo['disaster_max_amount'] ?? 2000) :
+                    ($outputInfo['disaster_max_amount'] ?? 2000) :
                     $outputInfo['max_amount'];
 
                 $maxPossibleAmount = (int)($maxPossibleAmount * (1 + $landOutputBonus));
@@ -1233,6 +1239,7 @@ class CropLogic
                 'user_id' => $crop->user_id,
                 'seed_id' => $seed->id,
                 'base_amount' => $baseAmount,
+                'min_base_amount' => $minBaseAmount,
                 'max_base_amount' => $maxBaseAmount,
                 'final_amount' => $finalAmount,
                 'land_bonus' => $landOutputBonus,

+ 2 - 0
app/Module/Farm/Models/FarmSeed.php

@@ -19,6 +19,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
  * @property  int  $min_output  最小产出
  * @property  int  $max_output  最大产出
  * @property  int  $disaster_max_output  有灾害时最大产出
+ * @property  int  $disaster_min_output  有灾害时最小产出
  * @property  int  $item_id  对应的物品ID
  * @property  \App\Module\Farm\Casts\DisasterResistanceCast  $disaster_resistance  灾害抵抗
  * @property  \App\Module\Farm\Casts\DisplayAttributesCast  $display_attributes  显示属性
@@ -47,6 +48,7 @@ class FarmSeed extends Model
         'min_output',
         'max_output',
         'disaster_max_output',
+        'disaster_min_output',
         'item_id',
         'disaster_resistance',
         'display_attributes',

+ 2 - 0
app/Module/Farm/Models/FarmSeedOutput.php

@@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  * @property  int  $min_amount  最小产出数量
  * @property  int  $max_amount  最大产出数量
  * @property  int  $disaster_max_amount  有灾害时最大产出数量
+ * @property  int  $disaster_min_amount  有灾害时最小产出数量
  * @property  float  $probability  产出概率(0-1)
  * @property  bool  $is_default  是否为默认产出
  * @property  \Carbon\Carbon  $created_at  创建时间
@@ -41,6 +42,7 @@ class FarmSeedOutput extends Model
         'min_amount',
         'max_amount',
         'disaster_max_amount',
+        'disaster_min_amount',
         'probability',
         'is_default',
     ];