ProcessActiveSkillsJob.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace App\Module\Pet\Jobs;
  3. use App\Module\Pet\Models\PetActiveSkill;
  4. use App\Module\Pet\Logic\PetAutoSkillLogic;
  5. use Illuminate\Bus\Queueable;
  6. use Illuminate\Contracts\Queue\ShouldQueue;
  7. use Illuminate\Foundation\Bus\Dispatchable;
  8. use Illuminate\Queue\InteractsWithQueue;
  9. use Illuminate\Queue\SerializesModels;
  10. use Illuminate\Support\Facades\Log;
  11. /**
  12. * 处理宠物激活技能的定时任务
  13. *
  14. * 每分钟执行一次,检查所有激活中的宠物技能并执行相应操作
  15. */
  16. class ProcessActiveSkillsJob implements ShouldQueue
  17. {
  18. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  19. /**
  20. * 任务超时时间(秒)
  21. *
  22. * @var int
  23. */
  24. public $timeout = 300; // 5分钟
  25. /**
  26. * 最大重试次数
  27. *
  28. * @var int
  29. */
  30. public $tries = 3;
  31. /**
  32. * 创建新的任务实例
  33. *
  34. * @return void
  35. */
  36. public function __construct()
  37. {
  38. //
  39. }
  40. /**
  41. * 执行任务
  42. *
  43. * @return void
  44. */
  45. public function handle()
  46. {
  47. Log::info('开始处理宠物激活技能定时任务');
  48. try {
  49. // 获取所有生效中的技能
  50. $activeSkills = PetActiveSkill::active()->get();
  51. Log::info('找到激活技能数量', ['count' => $activeSkills->count()]);
  52. $processedCount = 0;
  53. $expiredCount = 0;
  54. foreach ($activeSkills as $activeSkill) {
  55. try {
  56. // 检查技能是否已过期
  57. if ($activeSkill->isExpired()) {
  58. $activeSkill->markAsExpired();
  59. $expiredCount++;
  60. Log::info('技能已过期', [
  61. 'active_skill_id' => $activeSkill->id,
  62. 'pet_id' => $activeSkill->pet_id,
  63. 'skill_name' => $activeSkill->skill_name
  64. ]);
  65. continue;
  66. }
  67. // 检查是否需要执行检查
  68. if (!$activeSkill->shouldCheck()) {
  69. Log::debug('shouldCheck', [
  70. 'active_skill_id' => $activeSkill->id,
  71. 'pet_id' => $activeSkill->pet_id,
  72. 'skill_name' => $activeSkill->skill_name
  73. ]);
  74. continue;
  75. }
  76. // 处理技能效果
  77. $this->processSkillEffect($activeSkill);
  78. $processedCount++;
  79. } catch (\Exception $e) {
  80. Log::error('处理单个激活技能失败', [
  81. 'active_skill_id' => $activeSkill->id,
  82. 'pet_id' => $activeSkill->pet_id,
  83. 'skill_name' => $activeSkill->skill_name,
  84. 'error' => $e->getMessage(),
  85. 'trace' => $e->getTraceAsString()
  86. ]);
  87. }
  88. }
  89. Log::info('宠物激活技能定时任务完成', [
  90. 'total_skills' => $activeSkills->count(),
  91. 'processed_count' => $processedCount,
  92. 'expired_count' => $expiredCount
  93. ]);
  94. } catch (\Exception $e) {
  95. Log::error('处理宠物激活技能定时任务失败', [
  96. 'error' => $e->getMessage(),
  97. 'trace' => $e->getTraceAsString()
  98. ]);
  99. throw $e;
  100. }
  101. }
  102. /**
  103. * 处理技能效果
  104. *
  105. * @param PetActiveSkill $activeSkill 激活的技能
  106. * @return void
  107. */
  108. protected function processSkillEffect(PetActiveSkill $activeSkill): void
  109. {
  110. $autoSkillLogic = new PetAutoSkillLogic();
  111. switch ($activeSkill->skill_name) {
  112. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVEST_JOB->value:
  113. $autoSkillLogic->processAutoHarvest($activeSkill);
  114. break;
  115. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANT_JOB->value:
  116. $autoSkillLogic->processAutoPlant($activeSkill);
  117. break;
  118. case \App\Module\Pet\Enums\PET_SKILL_NAME::DISASTER_PROTECTION->value:
  119. $autoSkillLogic->processDisasterProtection($activeSkill);
  120. break;
  121. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WEEDING->value:
  122. $autoSkillLogic->processAutoWeeding($activeSkill);
  123. break;
  124. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WATERING->value:
  125. $autoSkillLogic->processAutoWatering($activeSkill);
  126. break;
  127. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PEST_CONTROL->value:
  128. $autoSkillLogic->processAutoPestControl($activeSkill);
  129. break;
  130. default:
  131. Log::warning('未知的技能类型', [
  132. 'active_skill_id' => $activeSkill->id,
  133. 'skill_name' => $activeSkill->skill_name
  134. ]);
  135. break;
  136. }
  137. // 更新最后检查时间
  138. $activeSkill->updateLastCheckTime();
  139. }
  140. /**
  141. * 任务失败时的处理
  142. *
  143. * @param \Throwable $exception
  144. * @return void
  145. */
  146. public function failed(\Throwable $exception)
  147. {
  148. Log::error('宠物激活技能定时任务失败', [
  149. 'error' => $exception->getMessage(),
  150. 'trace' => $exception->getTraceAsString()
  151. ]);
  152. }
  153. }