ProcessActiveSkillsJob.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. use UCore\Queue\QueueJob;
  12. /**
  13. * 处理宠物激活技能的定时任务
  14. *
  15. * 每分钟执行一次,检查所有激活中的宠物技能并执行相应操作
  16. */
  17. class ProcessActiveSkillsJob extends QueueJob
  18. {
  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. * @param PetActiveSkill $activeSkill 激活的技能
  35. * @return void
  36. */
  37. protected function processSkillEffect(PetActiveSkill $activeSkill): void
  38. {
  39. $autoSkillLogic = new PetAutoSkillLogic();
  40. switch ($activeSkill->skill_name) {
  41. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVESTING->value:
  42. $autoSkillLogic->processAutoHarvest($activeSkill);
  43. break;
  44. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANTING->value:
  45. $autoSkillLogic->processAutoPlant($activeSkill);
  46. break;
  47. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WEEDING->value:
  48. $autoSkillLogic->processAutoWeeding($activeSkill);
  49. break;
  50. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WATERING->value:
  51. $autoSkillLogic->processAutoWatering($activeSkill);
  52. break;
  53. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PEST_CONTROL->value:
  54. $autoSkillLogic->processAutoPestControl($activeSkill);
  55. break;
  56. case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_FERTILIZING->value:
  57. $autoSkillLogic->processAutoFertilizing($activeSkill);
  58. break;
  59. default:
  60. Log::warning('未知的技能类型', [
  61. 'active_skill_id' => $activeSkill->id,
  62. 'skill_name' => $activeSkill->skill_name
  63. ]);
  64. break;
  65. }
  66. // 更新最后检查时间
  67. $activeSkill->updateLastCheckTime();
  68. }
  69. public function run(): bool
  70. {
  71. Log::info('开始处理宠物激活技能定时任务');
  72. try {
  73. // 获取所有生效中的技能
  74. $activeSkills = PetActiveSkill::active()->get();
  75. Log::info('找到激活技能数量', [ 'count' => $activeSkills->count() ]);
  76. $processedCount = 0;
  77. $expiredCount = 0;
  78. /**
  79. * @var PetActiveSkill $activeSkill
  80. */
  81. foreach ($activeSkills as $activeSkill) {
  82. try {
  83. // 检查技能是否已过期
  84. if ($activeSkill->isExpired()) {
  85. $activeSkill->markAsExpired();
  86. $expiredCount++;
  87. Log::info('技能已过期', [
  88. 'active_skill_id' => $activeSkill->id,
  89. 'pet_id' => $activeSkill->pet_id,
  90. 'skill_name' => $activeSkill->skill_name
  91. ]);
  92. continue;
  93. }
  94. // 检查是否需要执行检查
  95. if (!$activeSkill->shouldCheck()) {
  96. Log::debug('shouldCheck false', [
  97. 'active_skill_id' => $activeSkill->id,
  98. 'pet_id' => $activeSkill->pet_id,
  99. 'skill_name' => $activeSkill->skill_name
  100. ]);
  101. continue;
  102. }
  103. Log::debug('shouldCheck false', [
  104. 'active_skill_id' => $activeSkill->id,
  105. 'pet_id' => $activeSkill->pet_id,
  106. 'skill_name' => $activeSkill->skill_name
  107. ]);
  108. // 处理技能效果
  109. $this->processSkillEffect($activeSkill);
  110. $processedCount++;
  111. } catch (\Exception $e) {
  112. Log::error('处理单个激活技能失败', [
  113. 'active_skill_id' => $activeSkill->id,
  114. 'pet_id' => $activeSkill->pet_id,
  115. 'skill_name' => $activeSkill->skill_name,
  116. 'error' => $e->getMessage(),
  117. 'trace' => $e->getTraceAsString()
  118. ]);
  119. }
  120. }
  121. Log::info('宠物激活技能定时任务完成', [
  122. 'total_skills' => $activeSkills->count(),
  123. 'processed_count' => $processedCount,
  124. 'expired_count' => $expiredCount
  125. ]);
  126. } catch (\Exception $e) {
  127. Log::error('处理宠物激活技能定时任务失败', [
  128. 'error' => $e->getMessage(),
  129. 'trace' => $e->getTraceAsString()
  130. ]);
  131. throw $e;
  132. }
  133. return true;
  134. }
  135. public function payload()
  136. {
  137. return [];
  138. }
  139. }