任务时间: 2025年07月03日 10:55-11:35
任务类型: Bug修复
模块: Farm/DisasterLogic, ThirdParty/WebhookDispatchService
修复两个关键问题:
app/Module/Farm/Logics/DisasterLogic.php 第386行Attempt to read property "buffs" on null$activeBuffs = $crop->user->buffs->pluck('buff_type')->toArray();作物数据中存在孤儿记录,关联的用户不存在,导致 $crop->user 返回 null
在 generateDisasters 方法中添加用户存在性检查:
// 检查用户是否存在,如果不存在则跳过
if (!$crop->user) {
$crop->save(); // 仍需更新检查时间
Log::warning('作物关联的用户不存在,跳过灾害生成', [
'crop_id' => $crop->id,
'user_id' => $crop->user_id
]);
return 'skipped';
}
docker exec -it kku_laravel php artisan farm:generate-disasters用户报告:"包 urs 的处理器 register_farm_user 不存在"
$packageHandlers 在某些情况下被重置UrsRegisterFarmUserWebhook 存在且正确UrsServiceProvider 中已正确注册在 WebhookDispatchService::dispatch 方法中添加自动重新注册机制:
// 获取处理器类
$handlerClass = $this->getPackageHandler($packageName, $handlerRoute);
if (!$handlerClass) {
// 尝试重新注册处理器(防止静态变量被重置的情况)
$this->tryReregisterPackageHandlers($packageName);
$handlerClass = $this->getPackageHandler($packageName, $handlerRoute);
if (!$handlerClass) {
throw new \Exception("包 {$packageName} 的处理器 {$handlerRoute} 不存在");
}
}
添加 tryReregisterPackageHandlers 方法:
protected function tryReregisterPackageHandlers(string $packageName): void
{
try {
switch ($packageName) {
case 'urs':
if (class_exists('\ThirdParty\Urs\UrsServiceProvider')) {
$provider = new \ThirdParty\Urs\UrsServiceProvider(app());
$provider->boot();
Log::info("重新注册URS包处理器成功");
}
break;
default:
Log::warning("未知包名,无法重新注册处理器", ['package_name' => $packageName]);
break;
}
} catch (\Exception $e) {
Log::error("重新注册包处理器失败", [
'package_name' => $packageName,
'error' => $e->getMessage()
]);
}
}
clearAllHandlers() 模拟问题app/Module/Farm/Logics/DisasterLogic.php - 添加用户存在性检查app/Module/ThirdParty/Services/WebhookDispatchService.php - 添加自动重新注册机制修复农场灾害生成空指针异常
- 在DisasterLogic::generateDisasters方法中添加用户存在性检查
- 当作物关联的用户不存在时,记录警告日志并跳过该作物
- 避免访问null对象的buffs属性导致的异常
- 修复作物ID 890关联用户ID 9999不存在的问题
修复WebHook处理器注册丢失问题
- 在WebhookDispatchService中添加自动重新注册机制
- 当处理器不存在时,尝试重新注册该包的处理器
- 解决静态变量被重置导致的'处理器不存在'错误
- 添加tryReregisterPackageHandlers方法支持URS包自动重新注册
- 测试验证:清空处理器后能自动恢复注册状态
成功修复了两个关键问题:
两个修复都经过了充分的测试验证,确保系统稳定性和可靠性。