Просмотр исходного кода

完善FarmLand模型has_crop字段功能:添加数据库字段、数值维护和后台展示

notfff 7 месяцев назад
Родитель
Сommit
cb02a807

+ 11 - 0
app/Module/Farm/AdminControllers/FarmLandController.php

@@ -48,6 +48,9 @@ class FarmLandController extends AdminController
             $grid->column('position', '位置')->sortable();
             $helper->columnLandType();
             $helper->columnLandStatus();
+            $grid->column('has_crop', '是否有作物')->display(function ($value) {
+                return $value ? '有作物' : '无作物';
+            });
 
             // 关联显示种子状态
             $grid->column('crop.seed_id', '种子ID')->display(function ($seedId) {
@@ -100,6 +103,7 @@ class FarmLandController extends AdminController
                 $filter->equal('position', '位置');
                 $filterHelper->equalLandType();
                 $filterHelper->equalLandStatus();
+                $filter->equal('has_crop', '是否有作物')->select([0 => '无作物', 1 => '有作物']);
                 $filter->equal('crop.seed_id', '种子ID');
                 $filter->equal('crop.growth_stage', '生长阶段')->select(\App\Module\Farm\Enums\GROWTH_STAGE::getAll());
                 $filterHelper->betweenDatetime('created_at', '创建时间');
@@ -152,6 +156,9 @@ class FarmLandController extends AdminController
 
             // 直接使用select方法而不是selectOptionCast,避免枚举类型转换问题
             $form->select('status', '状态')->options(\App\Module\Farm\Enums\LAND_STATUS::getValueDescription());
+            $form->display('has_crop', '是否有作物')->with(function ($value) {
+                return $value ? '有作物' : '无作物';
+            });
 
             $form->display('created_at', '创建时间');
             $form->display('updated_at', '更新时间');
@@ -162,6 +169,10 @@ class FarmLandController extends AdminController
                 if ($form->status !== null) {
                     $form->status = (int)$form->status;
                 }
+
+                // 根据状态自动更新has_crop字段
+                $status = (int)$form->status;
+                $form->has_crop = in_array($status, [1, 2, 3, 4]) ? 1 : 0;
             });
         });
     }

+ 2 - 0
app/Module/Farm/Listeners/UpdateCropStatusListener.php

@@ -48,6 +48,8 @@ class UpdateCropStatusListener
                     break;
             }
 
+            // 更新has_crop字段
+            $land->updateHasCrop();
             $land->save();
 
             Log::info('作物状态更新成功', [

+ 6 - 0
app/Module/Farm/Logics/CropLogic.php

@@ -146,6 +146,7 @@ class CropLogic
 
             // 更新土地状态
             $land->status = LAND_STATUS::PLANTING->value;
+            $land->updateHasCrop();
             $land->save();
 
             // 触发作物种植事件
@@ -275,6 +276,7 @@ class CropLogic
 
             // 更新土地状态为枯萎状态
             $land->status = LAND_STATUS::WITHERED;
+            $land->updateHasCrop();
             $land->save();
 
             // 触发作物生长阶段变更事件(从成熟期到枯萎期)
@@ -585,6 +587,7 @@ class CropLogic
             $oldLandStatus = $land->status;
             if (!$hasActiveDisaster) {
                 $land->status = LAND_STATUS::PLANTING->value;
+                $land->updateHasCrop();
             }
 
             // 保存更改
@@ -654,6 +657,7 @@ class CropLogic
                 // 如果没有作物但土地状态不是空闲,修正土地状态
                 $oldLandStatus = $land->status;
                 $land->status = LAND_STATUS::IDLE->value;
+                $land->updateHasCrop();
                 $land->save();
 
                 // 记录状态变更信息,由调用方处理事件触发
@@ -675,6 +679,7 @@ class CropLogic
 
             // 更新土地状态
             $land->status = LAND_STATUS::IDLE->value;
+            $land->updateHasCrop();
             $land->save();
 
             // 记录状态变更信息,由调用方处理事件触发和事务提交
@@ -796,6 +801,7 @@ class CropLogic
                 $land = $crop->land;
                 if ($land) {
                     $land->status = LAND_STATUS::WITHERED;
+                    $land->updateHasCrop();
                     $land->save();
 
                     Log::info('作物进入枯萎期,更新土地状态', [

+ 7 - 5
app/Module/Farm/Models/FarmLand.php

@@ -43,10 +43,12 @@ class FarmLand extends Model
         'position',
         'land_type',
         'status',
+        'has_crop',
     ];
     // 暂时移除枚举类型转换,避免在表单处理时出现类型问题
     protected $casts = [
         // 'status' => LAND_STATUS::class
+        'has_crop' => 'boolean',
     ];
 
     /**
@@ -80,14 +82,14 @@ class FarmLand extends Model
     }
 
     /**
-     * 判断是否有作物
-     * 种植中、灾害、可收获、枯萎状态都算有作物
+     * 更新has_crop字段值
+     * 根据当前状态自动更新has_crop字段
      *
-     * @return bool
+     * @return void
      */
-    public function getHasCropAttribute(): bool
+    public function updateHasCrop(): void
     {
-        return in_array($this->status, [
+        $this->has_crop = in_array($this->status, [
             LAND_STATUS::PLANTING->value,    // 1 种植中
             LAND_STATUS::DISASTER->value,    // 2 灾害
             LAND_STATUS::HARVESTABLE->value, // 3 可收获