Преглед изворни кода

修复农场灾害生成空指针异常

- 在DisasterLogic::generateDisasters方法中添加用户存在性检查
- 当作物关联的用户不存在时,记录警告日志并跳过该作物
- 避免访问null对象的buffs属性导致的异常
- 修复作物ID 890关联用户ID 9999不存在的问题
AI Assistant пре 6 месеци
родитељ
комит
443fe14ea0
2 измењених фајлова са 33 додато и 9 уклоњено
  1. 23 9
      AiWork/now.md
  2. 10 0
      app/Module/Farm/Logics/DisasterLogic.php

+ 23 - 9
AiWork/now.md

@@ -1,17 +1,31 @@
-# 新增URS注册农场用户WebHook
+# 修复农场灾害生成空指针异常
 
 ## 任务概述
-按照现有WebHook模式,新增一个URS注册农场用户的WebHook处理器,用于处理URS用户注册农场用户的请求
+修复 DisasterLogic.php 中因访问不存在用户的buffs属性导致的空指针异常错误
 
-## 任务要求
-- 传入参数:user_id (URS的用户ID), user_key (URS的用户密钥)
-- 处理逻辑:使用 UrsUserMappingService::getFarmUserIdByUserKeyWithAutoCreate($userKey, $ursUserId) 的公共逻辑
-- 返回结果:farm_user_id (农场的用户ID)
+## 错误详情
+- 错误位置:`app/Module/Farm/Logics/DisasterLogic.php` 第386行
+- 错误信息:`Attempt to read property "buffs" on null`
+- 涉及作物:ID 890,关联用户ID 9999(不存在)
+- 错误代码:`$activeBuffs = $crop->user->buffs->pluck('buff_type')->toArray();`
+
+## 修复方案
+在 `generateDisasters` 方法中添加用户存在性检查,跳过孤儿作物数据
 
 ## 工作计划
-- [x] 创建URS注册农场用户WebHook处理器
-- [x] 实现参数验证和业务逻辑
-- [x] 集成UrsUserMappingService逻辑
+- [x] 错误分析和定位
+- [x] 修复代码逻辑
+- [x] 测试修复效果
+
+## 修复详情
+- 在 `generateDisasters` 方法中添加了用户存在性检查
+- 如果 `$crop->user` 为 `null`,记录警告日志并跳过该作物
+- 仍然更新 `last_disaster_check_time` 避免重复处理
+
+## 测试结果
+- 命令执行成功:`docker exec -it kku_laravel php artisan farm:generate-disasters`
+- 日志显示正确处理:跳过了作物890(用户9999不存在)
+- 无空指针异常,系统稳定运行
 - [x] 在UrsServiceProvider中注册WebHook
 - [x] 测试WebHook功能
 - [x] 提交代码到git仓库

+ 10 - 0
app/Module/Farm/Logics/DisasterLogic.php

@@ -374,6 +374,16 @@ class DisasterLogic
             // 更新检查时间
             $crop->last_disaster_check_time = now();
 
+            // 检查用户是否存在,如果不存在则跳过
+            if (!$crop->user) {
+                $crop->save(); // 仍需更新检查时间
+                Log::warning('作物关联的用户不存在,跳过灾害生成', [
+                    'crop_id' => $crop->id,
+                    'user_id' => $crop->user_id
+                ]);
+                return 'skipped';
+            }
+
             // 跳过已经有灾害的土地
             if ($crop->land->status === LAND_STATUS::DISASTER) {
                 $crop->save(); // 仍需更新检查时间