FarmLogic.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. namespace App\Module\Farm\Logics;
  3. use App\Module\Farm\Dtos\FarmInfoDto;
  4. use App\Module\Farm\Events\FarmCreatedEvent;
  5. use App\Module\Farm\Models\FarmUser;
  6. use Illuminate\Support\Facades\Log;
  7. /**
  8. * 农场基础逻辑
  9. */
  10. class FarmLogic
  11. {
  12. /**
  13. * 获取用户农场信息
  14. *
  15. * @param int $userId
  16. * @return FarmInfoDto|null
  17. */
  18. public function getFarmInfo(int $userId): ?FarmInfoDto
  19. {
  20. try {
  21. $farmUser = FarmUser::where('user_id', $userId)->first();
  22. if (!$farmUser) {
  23. return null;
  24. }
  25. return FarmInfoDto::fromModel($farmUser);
  26. } catch (\Exception $e) {
  27. Log::error('获取用户农场信息失败', [
  28. 'user_id' => $userId,
  29. 'error' => $e->getMessage(),
  30. 'trace' => $e->getTraceAsString()
  31. ]);
  32. return null;
  33. }
  34. }
  35. /**
  36. * 初始化用户农场
  37. *
  38. * @param int $userId
  39. * @return FarmInfoDto|null
  40. */
  41. public function initializeFarm(int $userId): ?FarmInfoDto
  42. {
  43. try {
  44. // 检查用户是否已有农场
  45. $farmUser = FarmUser::where('user_id', $userId)->first();
  46. if ($farmUser) {
  47. return FarmInfoDto::fromModel($farmUser);
  48. }
  49. // 检查事务是否已开启
  50. \UCore\Db\Helper::check_tr();
  51. // 创建用户农场记录
  52. $farmUser = new FarmUser();
  53. $farmUser->user_id = $userId;
  54. $farmUser->house_level = 1; // 默认1级房屋
  55. $farmUser->last_upgrade_time = now();
  56. $farmUser->save();
  57. // 初始化土地(根据房屋等级)
  58. $this->initializeLands($userId, $farmUser->house_level);
  59. // 触发农场创建事件
  60. event(new FarmCreatedEvent($userId, $farmUser));
  61. Log::info('用户农场初始化成功', [
  62. 'user_id' => $userId,
  63. 'farm_id' => $farmUser->id
  64. ]);
  65. return FarmInfoDto::fromModel($farmUser);
  66. } catch (\Exception $e) {
  67. Log::error('用户农场初始化失败', [
  68. 'user_id' => $userId,
  69. 'error' => $e->getMessage(),
  70. 'trace' => $e->getTraceAsString()
  71. ]);
  72. return null;
  73. }
  74. }
  75. /**
  76. * 初始化用户土地
  77. *
  78. * @param int $userId
  79. * @param int $houseLevel 房屋等级,默认为1
  80. * @return void
  81. */
  82. private function initializeLands(int $userId, int $houseLevel = 1): void
  83. {
  84. try {
  85. $houseLogic = new HouseLogic();
  86. $landLogic = new LandLogic();
  87. // 根据房屋等级获取可用土地数量
  88. $availableLands = $houseLogic->getAvailableLandsCount($houseLevel);
  89. if ($availableLands <= 0) {
  90. Log::warning('房屋等级配置的可用土地数量为0', [
  91. 'user_id' => $userId,
  92. 'house_level' => $houseLevel
  93. ]);
  94. return;
  95. }
  96. // 创建对应数量的普通土地
  97. for ($position = 1; $position <= $availableLands; $position++) {
  98. $land = $landLogic->createLand($userId, $position, 1); // 1表示普通土地
  99. if (!$land) {
  100. Log::error('创建土地失败', [
  101. 'user_id' => $userId,
  102. 'position' => $position,
  103. 'house_level' => $houseLevel
  104. ]);
  105. }
  106. }
  107. Log::info('用户土地初始化成功', [
  108. 'user_id' => $userId,
  109. 'house_level' => $houseLevel,
  110. 'available_lands' => $availableLands
  111. ]);
  112. } catch (\Exception $e) {
  113. Log::error('初始化用户土地失败', [
  114. 'user_id' => $userId,
  115. 'house_level' => $houseLevel,
  116. 'error' => $e->getMessage(),
  117. 'trace' => $e->getTraceAsString()
  118. ]);
  119. }
  120. }
  121. }