|
|
@@ -0,0 +1,165 @@
|
|
|
+# 修复宠物自动收获技能铲除枯萎作物功能
|
|
|
+
|
|
|
+**时间**: 2025年07月20日 02:19
|
|
|
+**任务**: 修复宠物自动收获技能中的铲除枯萎作物功能不生效问题
|
|
|
+
|
|
|
+## 问题描述
|
|
|
+
|
|
|
+宠物自动收获技能中的铲除枯萎作物功能不生效,收获后枯萎的作物仍然存在。
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+
|
|
|
+### 根本原因
|
|
|
+
|
|
|
+原始代码的逻辑错误:
|
|
|
+1. **错误的查找方式**:通过土地状态(`LAND_STATUS::WITHERED`)查找枯萎作物
|
|
|
+2. **时序问题**:收获后土地状态可能不会立即更新为枯萎状态
|
|
|
+3. **应该直接检查作物状态**:应该查找作物的`growth_stage`为`GROWTH_STAGE::WITHERED`的记录
|
|
|
+
|
|
|
+### 收获流程分析
|
|
|
+
|
|
|
+正确的收获流程:
|
|
|
+1. 作物收获 → 作物进入枯萎期(`growth_stage = 50`)
|
|
|
+2. 土地状态更新为枯萎状态(`status = 4`)
|
|
|
+3. 宠物自动铲除枯萎作物
|
|
|
+4. 土地变为空闲状态(`status = 0`)
|
|
|
+
|
|
|
+## 解决方案
|
|
|
+
|
|
|
+### 1. 修复 `autoClearWitheredCropAfterHarvest` 方法
|
|
|
+
|
|
|
+**文件**: `app/Module/Pet/Logic/PetAutoSkillLogic.php`
|
|
|
+
|
|
|
+**修改前**:
|
|
|
+```php
|
|
|
+// 检查土地状态是否为枯萎状态
|
|
|
+if ($land->status !== \App\Module\Farm\Enums\LAND_STATUS::WITHERED->value) {
|
|
|
+ return ['success' => false, 'reason' => '土地状态不是枯萎状态', 'crop_id' => null];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**修改后**:
|
|
|
+```php
|
|
|
+// 直接检查作物状态,而不是土地状态
|
|
|
+// 获取土地上的作物(直接检查作物状态,不依赖土地状态)
|
|
|
+$crop = \App\Module\Farm\Models\FarmCrop::where('land_id', $landId)->first();
|
|
|
+if (!$crop) {
|
|
|
+ return ['success' => false, 'reason' => '土地上没有作物', 'crop_id' => null];
|
|
|
+}
|
|
|
+
|
|
|
+// 检查作物是否为枯萎状态
|
|
|
+$cropStageValue = is_object($crop->growth_stage) ? $crop->growth_stage->value : $crop->growth_stage;
|
|
|
+if ($cropStageValue !== \App\Module\Farm\Enums\GROWTH_STAGE::WITHERED->value) {
|
|
|
+ return ['success' => false, 'reason' => '作物不是枯萎状态,当前状态: ' . $cropStageValue, 'crop_id' => $crop->id];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 修复 `clearAllWitheredCrops` 方法
|
|
|
+
|
|
|
+**修改前**:
|
|
|
+```php
|
|
|
+// 获取所有枯萎状态的土地
|
|
|
+$witheredLands = \App\Module\Farm\Models\FarmLand::where('user_id', $userId)
|
|
|
+ ->where('status', \App\Module\Farm\Enums\LAND_STATUS::WITHERED->value)
|
|
|
+ ->get();
|
|
|
+```
|
|
|
+
|
|
|
+**修改后**:
|
|
|
+```php
|
|
|
+// 直接查找所有枯萎状态的作物
|
|
|
+$witheredCrops = \App\Module\Farm\Models\FarmCrop::whereHas('land', function($query) use ($userId) {
|
|
|
+ $query->where('user_id', $userId);
|
|
|
+ })
|
|
|
+ ->where('growth_stage', \App\Module\Farm\Enums\GROWTH_STAGE::WITHERED->value)
|
|
|
+ ->get();
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 修复返回值处理
|
|
|
+
|
|
|
+**问题**: 原代码中存在一个潜在的返回值处理错误
|
|
|
+- `CropService::removeCrop()` 返回数组格式:`['success' => true/false, ...]`
|
|
|
+- 但代码中直接用 `if ($result)` 判断,应该用 `if ($result['success'])`
|
|
|
+
|
|
|
+**修复**: 在新的方法中正确处理返回值:
|
|
|
+```php
|
|
|
+if ($result['success']) {
|
|
|
+ return [
|
|
|
+ 'success' => true,
|
|
|
+ 'reason' => '宠物自动铲除枯萎作物成功',
|
|
|
+ 'crop_id' => $crop->id
|
|
|
+ ];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 测试验证
|
|
|
+
|
|
|
+### 测试流程
|
|
|
+
|
|
|
+1. **创建测试数据**:
|
|
|
+ - 用户39170,作物ID 14886
|
|
|
+ - 设置作物为成熟期(`growth_stage = 40`)
|
|
|
+ - 设置土地状态为可收获(`status = 3`)
|
|
|
+
|
|
|
+2. **执行自动收获**:
|
|
|
+ ```bash
|
|
|
+ php artisan pet:process-active-skills --sync
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **验证结果**:
|
|
|
+ - 作物收获成功,进入枯萎期
|
|
|
+ - 宠物自动铲除枯萎作物成功
|
|
|
+ - 土地状态正确更新
|
|
|
+
|
|
|
+### 测试结果
|
|
|
+
|
|
|
+**日志输出**:
|
|
|
+```
|
|
|
+[2025-07-20T02:32:58.763866+08:00] 作物收获成功,进入枯萎期 {"user_id":39170,"land_id":2444,"crop_id":14886,"seed_id":1,"output_item_id":2,"output_amount":5,"harvest_log_id":8283,"old_stage":40,"new_stage":50,"land_status":4}
|
|
|
+[2025-07-20T02:32:59.029658+08:00] 自动收菜成功 {"user_id":39170,"pet_id":44,"land_id":2444}
|
|
|
+[2025-07-20T02:32:59.296399+08:00] 铲除作物成功(软删除) {"user_id":39170,"land_id":2444,"crop_id":14886,"old_status":1,"new_status":0,"soft_deleted":true}
|
|
|
+[2025-07-20T02:32:59.330752+08:00] 自动铲除收获后枯萎作物成功 {"user_id":39170,"pet_id":44,"land_id":2444,"crop_id":14886}
|
|
|
+[2025-07-20T02:32:59.362362+08:00] 自动收菜技能处理完成 {"active_skill_id":166,"pet_id":44,"user_id":39170,"harvest_count":1,"auto_cleared_count":1,"withered_cleared_count":0,"total_lands":1}
|
|
|
+```
|
|
|
+
|
|
|
+**数据库验证**:
|
|
|
+- 作物14886已被软删除:`deleted_at": "2025-07-20T02:32:59.000Z"`
|
|
|
+- 土地状态正确,可继续种植新作物
|
|
|
+
|
|
|
+## 修改文件
|
|
|
+
|
|
|
+1. **app/Module/Pet/Logic/PetAutoSkillLogic.php**
|
|
|
+ - 修改 `autoClearWitheredCropAfterHarvest` 方法(第1091-1156行)
|
|
|
+ - 修改 `clearAllWitheredCrops` 方法(第791-843行)
|
|
|
+ - 修改 `processAutoHarvest` 方法中的统计逻辑
|
|
|
+
|
|
|
+2. **app/Module/Pet/Console/ProcessActiveSkillsCommand.php**
|
|
|
+ - 修复第1行的语法错误(移除多余空格)
|
|
|
+
|
|
|
+## 技术要点
|
|
|
+
|
|
|
+### 关键修复点
|
|
|
+
|
|
|
+1. **直接检查作物状态**:
|
|
|
+ - 不依赖土地状态,直接查询作物的`growth_stage`
|
|
|
+ - 使用`whereHas`关联查询提高查询效率
|
|
|
+
|
|
|
+2. **正确的枚举处理**:
|
|
|
+ ```php
|
|
|
+ $cropStageValue = is_object($crop->growth_stage) ? $crop->growth_stage->value : $crop->growth_stage;
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **改进的错误信息**:
|
|
|
+ - 显示当前作物状态便于调试
|
|
|
+ - 返回详细的操作结果信息
|
|
|
+
|
|
|
+### 设计原则
|
|
|
+
|
|
|
+- **数据一致性**:直接查询作物状态,避免依赖可能不同步的土地状态
|
|
|
+- **错误处理**:提供详细的错误信息和状态信息
|
|
|
+- **性能优化**:使用关联查询减少数据库查询次数
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+修复成功解决了宠物自动收获技能中铲除枯萎作物功能不生效的问题。核心改进是将查找逻辑从"通过土地状态查找"改为"直接查找枯萎状态的作物",确保了功能的可靠性和准确性。
|
|
|
+
|
|
|
+**提交信息**: `4b0e775e - 修复宠物自动收获技能中铲除枯萎作物功能`
|