first(); if (!$farmUser) { return null; } return FarmInfoDto::fromModel($farmUser); } catch (\Exception $e) { Log::error('获取用户农场信息失败', [ 'user_id' => $userId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return null; } } /** * 初始化用户农场 * * @param int $userId * @return FarmInfoDto|null */ public function initializeFarm(int $userId): ?FarmInfoDto { try { // 检查用户是否已有农场 $farmUser = FarmUser::where('user_id', $userId)->first(); if ($farmUser) { return FarmInfoDto::fromModel($farmUser); } // 检查事务是否已开启 \UCore\Db\Helper::check_tr(); // 创建用户农场记录 $farmUser = new FarmUser(); $farmUser->user_id = $userId; $farmUser->house_level = 1; // 默认1级房屋 $farmUser->last_upgrade_time = now(); $farmUser->save(); // 初始化土地(根据房屋等级) $this->initializeLands($userId, $farmUser->house_level); // 触发农场创建事件 event(new FarmCreatedEvent($userId, $farmUser)); Log::info('用户农场初始化成功', [ 'user_id' => $userId, 'farm_id' => $farmUser->id ]); return FarmInfoDto::fromModel($farmUser); } catch (\Exception $e) { Log::error('用户农场初始化失败', [ 'user_id' => $userId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return null; } } /** * 初始化用户土地 * * @param int $userId * @param int $houseLevel 房屋等级,默认为1 * @return void */ private function initializeLands(int $userId, int $houseLevel = 1): void { try { $houseLogic = new HouseLogic(); $landLogic = new LandLogic(); // 根据房屋等级获取可用土地数量 $availableLands = $houseLogic->getAvailableLandsCount($houseLevel); if ($availableLands <= 0) { Log::warning('房屋等级配置的可用土地数量为0', [ 'user_id' => $userId, 'house_level' => $houseLevel ]); return; } // 创建对应数量的普通土地 for ($position = 1; $position <= $availableLands; $position++) { $land = $landLogic->createLand($userId, $position, 1); // 1表示普通土地 if (!$land) { Log::error('创建土地失败', [ 'user_id' => $userId, 'position' => $position, 'house_level' => $houseLevel ]); } } Log::info('用户土地初始化成功', [ 'user_id' => $userId, 'house_level' => $houseLevel, 'available_lands' => $availableLands ]); } catch (\Exception $e) { Log::error('初始化用户土地失败', [ 'user_id' => $userId, 'house_level' => $houseLevel, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); } } }