修复UpdateCropGrowthCommand没有正确处理final_output_item_id的bug,确保作物在发芽期必须确定最终产出果实ID
根据系统设计,作物应该在进入发芽期(SPROUT阶段)时确定final_output_item_id,这是系统的核心逻辑。但是发现有成熟期的作物没有确定果实final_output_item_id,这是一个严重的bug。
UpdateCropGrowthCommand是定时任务中更新作物生长状态的核心命令,但它有以下问题:
// 原有的错误实现
foreach ($crops as $crop) {
$userId = $crop->user_id;
$oldStage = $crop->growth_stage;
// 直接计算新的生长阶段
$newStage = $this->calculateNextStage($crop);
// 直接更新作物信息,没有调用CropLogic的完整逻辑
$crop->growth_stage = $newStage;
$crop->stage_start_time = now();
$crop->stage_end_time = $stageEndTime;
$crop->fertilized = false;
$crop->save(); // 没有处理final_output_item_id
}
问题:
updateGrowthStage方法final_output_item_id的设置逻辑CropLogic::updateGrowthStage():包含完整的生长阶段更新逻辑,包括final_output_item_id的设置UpdateCropGrowthCommand:只更新基本字段,缺少关键逻辑final_output_item_id// 修复后的实现
foreach ($crops as $crop) {
$userId = $crop->user_id;
$oldStage = $crop->growth_stage;
// 使用CropLogic的updateGrowthStage方法,确保所有逻辑都正确执行
$cropLogic = new CropLogic();
$updated = $cropLogic->updateGrowthStage($crop->id);
if ($updated) {
$updatedCount++;
// 重新获取作物信息以显示更新后的状态
$crop->refresh();
$this->info("作物 ID: {$crop->id}, 用户 ID: {$userId}, 阶段: {$oldStage} -> {$crop->growth_stage}");
}
}
calculateNextStage和calculateStageEndTime方法// 如果进入发芽期,必须确定最终产出果实ID
if ($newStage === GROWTH_STAGE::SPROUT->value) {
if (!$crop->final_output_item_id) {
$outputInfo = $this->getRandomOutput($crop->seed_id);
$crop->final_output_item_id = $outputInfo['item_id'];
Log::info('作物进入发芽期,确定最终产出果实', [
'crop_id' => $crop->id,
'user_id' => $crop->user_id,
'seed_id' => $crop->seed_id,
'final_output_item_id' => $crop->final_output_item_id
]);
}
}
// 验证:如果进入成熟期但没有final_output_item_id,这是一个严重错误
if ($newStage === GROWTH_STAGE::MATURE->value && !$crop->final_output_item_id) {
Log::error('严重错误:作物进入成熟期但没有确定最终产出果实ID', [
'crop_id' => $crop->id,
'user_id' => $crop->user_id,
'seed_id' => $crop->seed_id,
'current_stage' => $oldStage,
'new_stage' => $newStage
]);
throw new \Exception("作物ID {$crop->id} 进入成熟期但没有确定最终产出果实ID,这是系统错误");
}
创建专门的修复命令来处理现有的有问题的作物数据:
php artisan farm:fix-crop-final-output --dry-run // 查看需要修复的数据
php artisan farm:fix-crop-final-output // 实际修复
final_output_item_id的作物将CropLogic::getRandomOutput()方法从private改为public,供修复命令使用。
# 查看需要修复的数据
php artisan farm:fix-crop-final-output --dry-run
# 执行修复
php artisan farm:fix-crop-final-output
✅ 已完成
app/Module/Farm/Commands/UpdateCropGrowthCommand.php - 修复主要bugapp/Module/Farm/Logics/CropLogic.php - 强化验证逻辑app/Module/Farm/Commands/FixCropFinalOutputCommand.php - 新增修复命令