041111-修复农场灾害清理时的土地状态问题.md 3.6 KB

修复农场灾害清理时的土地状态问题

时间: 2025年07月04日 11:11:11
任务: 修复农场土地状态和作物收获的逻辑问题

问题描述

用户反馈:部分土地状态为灾害,但是其作物已经可以'成熟期'可以收获了。

经过分析发现,实际问题是:作物成熟时土地状态正确变为"可收获",但当用户尝试清理灾害时,系统会强制将土地状态修正回"灾害",导致无法收获。

问题分析

根本原因

CropLogic::clearDisaster 方法中存在两个问题:

  1. 强制状态修正逻辑(第622-637行):

    • 当用户清理灾害时,系统检查土地状态与作物灾害数据的一致性
    • 如果土地状态是"可收获"但作物有活跃灾害,系统认为数据不一致
    • 自动将土地状态强制修正为"灾害"
    • 这违反了"作物成熟时即使有灾害也应该允许收获"的业务规则
  2. 清理完灾害后的状态设置(第649-654行):

    • 清理完所有灾害后,土地状态被固定设置为"种植中"
    • 没有考虑作物的当前生长阶段
    • 如果作物已成熟,应该设置为"可收获"而不是"种植中"

业务逻辑梳理

正确的业务逻辑应该是:

  1. 作物可以在有灾害的情况下正常成熟
  2. 作物成熟时,土地状态变为"可收获",即使有灾害也允许收获
  3. 清理灾害时,不应该强制修改土地状态
  4. 清理完所有灾害后,应该根据作物当前生长阶段设置正确的土地状态

解决方案

修改文件

  • app/Module/Farm/Logics/CropLogic.php

具体修改

  1. 移除强制状态修正逻辑

    // 原来的逻辑:强制修正土地状态
    if ($land->status !== LAND_STATUS::DISASTER->value) {
       $land->status = LAND_STATUS::DISASTER->value;
       $land->save();
    }
       
    // 修改后:仅记录日志,不修改状态
    Log::info('清理灾害时的土地状态', [
       'user_id' => $userId,
       'land_id' => $landId,
       'land_status' => $land->status,
       'crop_growth_stage' => $crop->growth_stage,
       // ...
    ]);
    
  2. 优化清理完灾害后的状态设置

    // 原来的逻辑:固定设置为种植中
    if (!$hasActiveDisaster) {
       $land->status = LAND_STATUS::PLANTING->value;
    }
       
    // 修改后:根据作物生长阶段设置状态
    if (!$hasActiveDisaster) {
       if ($crop->growth_stage === GROWTH_STAGE::MATURE->value) {
           $land->status = LAND_STATUS::HARVESTABLE->value;
       } elseif ($crop->growth_stage === GROWTH_STAGE::WITHERED->value) {
           $land->status = LAND_STATUS::WITHERED->value;
       } else {
           $land->status = LAND_STATUS::PLANTING->value;
       }
    }
    

测试验证

通过数据库查询验证修复效果:

  • 查询到16个成熟期作物,土地状态都正确为"可收获"
  • 其中多个作物有活跃灾害,但土地状态仍然保持"可收获"
  • 符合预期的业务逻辑

提交信息

修复农场灾害清理时的土地状态问题

- 移除clearDisaster方法中强制修正土地状态为灾害的逻辑
- 修改清理完所有灾害后的土地状态更新逻辑,根据作物生长阶段设置正确的土地状态
- 确保作物成熟时即使有灾害也能保持可收获状态
- 清理灾害后如果作物已成熟,土地状态应为可收获而不是种植中

影响范围

  • 修复了作物成熟但无法收获的问题
  • 优化了灾害清理后的土地状态逻辑
  • 确保了土地状态与作物生长阶段的一致性
  • 不影响其他农场功能的正常运行