062152-修复自动杀虫技能问题.md 3.3 KB

修复自动杀虫技能问题

时间: 2025-06-06 21:52
任务类型: Bug修复
紧急程度: 急需

问题描述

用户反馈自动杀虫技能处理有问题,实际用户有很多虫害,但是系统显示"自动杀虫成功 - 没有虫害"。

问题分析

通过测试命令 php artisan pet:process-active-skills --sync 和查看用户信息页面 http://kku_laravel.local.gd/admin/farm-user-summary/10002,发现了以下问题:

  1. 杀虫剂道具ID错误: 代码中使用的是1002,但实际数据库中杀虫剂的ID是23
  2. 其他灾害清除道具ID也错误:
    • 干旱清除道具: 代码中1001,实际是24(洒水壶)
    • 杂草清除道具: 代码中1003,实际是22(除草剂)
  3. 事务处理问题: 道具消耗和灾害清除不在同一事务中,导致事务错误

解决方案

1. 修复道具ID映射

修改 app/Module/Pet/Logic/PetAutoSkillLogic.php 中的 getDisasterClearItem 方法:

$clearItemMap = [
    \App\Module\Farm\Enums\DISASTER_TYPE::DROUGHT->value => 24, // 干旱清除道具ID(洒水壶)
    \App\Module\Farm\Enums\DISASTER_TYPE::PEST->value => 23,    // 虫害清除道具ID(杀虫剂)
    \App\Module\Farm\Enums\DISASTER_TYPE::WEED->value => 22,    // 杂草清除道具ID(除草剂)
];

2. 修复事务处理

修改 autoClearSpecificDisaster 方法,确保道具消耗和灾害清除在同一事务中:

// 开启事务
DB::beginTransaction();

// 先消耗道具
\App\Module\GameItems\Services\ItemService::consumeItem(
    $userId,
    $clearItem['item_id'],
    null,
    1,
    ['source' => 'pet_auto_specific_disaster_clear']
);

// 调用农场服务清除灾害
$result = \App\Module\Farm\Services\CropService::clearDisaster($userId, $land->id, $disasterType);

if ($result) {
    DB::commit();
    return true;
} else {
    DB::rollback();
    return false;
}

3. 移除调试日志

清理了临时添加的调试日志,保持代码整洁。

测试结果

修复后测试结果:

  1. 虫害检测正常: 系统正确检测到多个土地有虫害
  2. 杀虫剂消耗正常: 从19个杀虫剂正确消耗
  3. 灾害清除成功: 所有虫害状态变为"已处理"
  4. 土地状态恢复: 所有土地状态从"灾害"恢复为"种植中"
  5. 无事务错误: 不再出现"transaction level is 0"错误

影响范围

  • 自动杀虫技能
  • 自动浇水技能
  • 自动除草技能

文件修改

  • app/Module/Pet/Logic/PetAutoSkillLogic.php
    • 修复道具ID映射(第302-304行)
    • 修复事务处理逻辑(第634-665行)
    • 移除调试日志(第526-553行)

验证方法

  1. 运行命令: php artisan pet:process-active-skills --sync
  2. 查看用户农场信息: http://kku_laravel.local.gd/admin/farm-user-summary/10002
  3. 确认虫害统计为0,土地状态为"种植中",杀虫剂数量减少

提交信息

修复自动杀虫技能问题

- 修复杀虫剂道具ID错误(从1002改为23)
- 修复自动浇水道具ID错误(从1001改为24)  
- 修复自动除草道具ID错误(从1003改为22)
- 修复事务处理问题,确保道具消耗和灾害清除在同一事务中
- 移除调试日志,优化代码结构

现在自动杀虫技能可以正常工作,成功清除虫害并消耗杀虫剂