06日2103-为FarmLand模型增加has_crop字段.md 5.0 KB

为FarmLand模型增加has_crop字段

任务时间

  • 开始时间:2025年06月06日 21:03:21
  • 完成时间:2025年06月06日 21:03

任务描述

app/Module/Farm/Models/FarmLand.php 模型增加 has_crop 字段,用于判断土地是否有作物。

实现方案

  1. 数据库字段:在 kku_farm_land_users 表中添加 has_crop 字段
  2. 模型更新:在模型中添加字段定义、类型转换和维护方法
  3. 数值维护:在土地状态变化时自动更新该字段
  4. 后台展示:在管理后台显示和筛选该字段

业务逻辑

根据土地状态判断是否有作物:

  • 0 空闲:没有作物
  • 1 种植中:有作物 ✓
  • 2 灾害:有作物 ✓
  • 3 可收获:有作物 ✓
  • 4 枯萎:有作物 ✓(枯萎也算有作物)

代码实现

1. 数据库字段创建

-- 添加has_crop字段
ALTER TABLE `kku_farm_land_users` ADD COLUMN `has_crop` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有作物:0无,1有' AFTER `status`;

-- 根据现有数据更新字段值
UPDATE `kku_farm_land_users` SET `has_crop` = 1 WHERE `status` IN (1, 2, 3, 4);

2. 更新字段注释

/**
 * field start 
 * @property  int  $id  主键ID
 * @property  int  $user_id  用户ID
 * @property  int  $position  土地位置(1-20)
 * @property  int  $land_type  土地类型:1普通,2红土,3黑土,4金,5蓝,6紫
 * @property  int  $status  土地状态:0空闲,1种植中,2灾害,3可收获,4枯萎
 * @property  bool  $has_crop  是否有作物(种植中、灾害、可收获、枯萎状态都算有作物)
 * @property  \Carbon\Carbon  $created_at  创建时间
 * @property  \Carbon\Carbon  $updated_at  更新时间
 * field end
 */

3. 模型字段定义

// 在$fillable中添加字段
protected $fillable = [
    'user_id',
    'position',
    'land_type',
    'status',
    'has_crop',  // 新增
];

// 添加类型转换
protected $casts = [
    'has_crop' => 'boolean',
];

4. 添加维护方法

/**
 * 更新has_crop字段值
 * 根据当前状态自动更新has_crop字段
 *
 * @return void
 */
public function updateHasCrop(): void
{
    $this->has_crop = in_array($this->status, [
        LAND_STATUS::PLANTING->value,    // 1 种植中
        LAND_STATUS::DISASTER->value,    // 2 灾害
        LAND_STATUS::HARVESTABLE->value, // 3 可收获
        LAND_STATUS::WITHERED->value,    // 4 枯萎
    ]);
}

5. 数值维护逻辑

在所有修改土地状态的地方添加 $land->updateHasCrop() 调用:

  • CropLogic::sowSeed() - 种植时
  • CropLogic::witherCrop() - 枯萎时
  • CropLogic::clearDisaster() - 清理灾害时
  • CropLogic::clearCrop() - 清理作物时
  • CropLogic::updateCropGrowthStage() - 生长阶段更新时
  • UpdateCropStatusListener::handle() - 状态监听器中

6. 后台管理展示

// 在Grid中添加列显示
$grid->column('has_crop', '是否有作物')->display(function ($value) {
    return $value ? '有作物' : '无作物';
});

// 在筛选器中添加筛选
$filter->equal('has_crop', '是否有作物')->select([0 => '无作物', 1 => '有作物']);

// 在表单中添加只读显示
$form->display('has_crop', '是否有作物')->with(function ($value) {
    return $value ? '有作物' : '无作物';
});

// 在表单保存时自动更新
$form->saving(function (Form $form) {
    $status = (int)$form->status;
    $form->has_crop = in_array($status, [1, 2, 3, 4]) ? 1 : 0;
});

使用方式

$farmLand = FarmLand::find(1);
$hasCrop = $farmLand->has_crop; // 返回 true/false

// 手动更新(通常不需要,系统会自动维护)
$farmLand->updateHasCrop();
$farmLand->save();

数据验证

更新后的数据库状态:

  • 状态0(空闲):4条记录,has_crop=0
  • 状态1(种植中):1条记录,has_crop=1
  • 状态2(灾害):12条记录,has_crop=1
  • 状态3(可收获):12条记录,has_crop=1
  • 状态4(枯萎):5条记录,has_crop=1

提交信息

  • 第一次提交:808853f8 - 为FarmLand模型增加has_crop字段判断是否有作物
  • 第二次提交:cb02a807 - 完善FarmLand模型has_crop字段功能:添加数据库字段、数值维护和后台展示
  • 已推送到远程仓库

文件变更

  • app/Module/Farm/Models/FarmLand.php:增加字段定义、类型转换和维护方法
  • app/Module/Farm/AdminControllers/FarmLandController.php:增加后台展示和筛选功能
  • app/Module/Farm/Listeners/UpdateCropStatusListener.php:增加字段维护逻辑
  • app/Module/Farm/Logics/CropLogic.php:在多个方法中增加字段维护逻辑
  • 数据库:kku_farm_land_users 表增加 has_crop 字段

功能验证

✅ 数据库字段创建成功 ✅ 现有数据正确更新 ✅ 后台管理页面正确显示"有作物"/"无作物" ✅ 筛选功能正常工作 ✅ 表单显示功能正常 ✅ 自动维护逻辑已添加到所有相关位置

测试建议

建议编写单元测试验证:

  1. 不同状态下 has_crop 字段的返回值
  2. 状态变化时字段的自动更新
  3. 后台筛选功能的正确性