ProcessActiveSkillsJob.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. continue;
  70. }
  71. // 处理技能效果
  72. $this->processSkillEffect($activeSkill);
  73. $processedCount++;
  74. } catch (\Exception $e) {
  75. Log::error('处理单个激活技能失败', [
  76. 'active_skill_id' => $activeSkill->id,
  77. 'pet_id' => $activeSkill->pet_id,
  78. 'skill_name' => $activeSkill->skill_name,
  79. 'error' => $e->getMessage(),
  80. 'trace' => $e->getTraceAsString()
  81. ]);
  82. }
  83. }
  84. Log::info('宠物激活技能定时任务完成', [
  85. 'total_skills' => $activeSkills->count(),
  86. 'processed_count' => $processedCount,
  87. 'expired_count' => $expiredCount
  88. ]);
  89. } catch (\Exception $e) {
  90. Log::error('处理宠物激活技能定时任务失败', [
  91. 'error' => $e->getMessage(),
  92. 'trace' => $e->getTraceAsString()
  93. ]);
  94. throw $e;
  95. }
  96. }
  97. /**
  98. * 处理技能效果
  99. *
  100. * @param PetActiveSkill $activeSkill 激活的技能
  101. * @return void
  102. */
  103. protected function processSkillEffect(PetActiveSkill $activeSkill): void
  104. {
  105. $autoSkillLogic = new PetAutoSkillLogic();
  106. switch ($activeSkill->skill_name) {
  107. case '自动收菜':
  108. $autoSkillLogic->processAutoHarvest($activeSkill);
  109. break;
  110. case '自动播种':
  111. $autoSkillLogic->processAutoPlant($activeSkill);
  112. break;
  113. case '灾害防护':
  114. $autoSkillLogic->processDisasterProtection($activeSkill);
  115. break;
  116. default:
  117. Log::warning('未知的技能类型', [
  118. 'active_skill_id' => $activeSkill->id,
  119. 'skill_name' => $activeSkill->skill_name
  120. ]);
  121. break;
  122. }
  123. // 更新最后检查时间
  124. $activeSkill->updateLastCheckTime();
  125. }
  126. /**
  127. * 任务失败时的处理
  128. *
  129. * @param \Throwable $exception
  130. * @return void
  131. */
  132. public function failed(\Throwable $exception)
  133. {
  134. Log::error('宠物激活技能定时任务失败', [
  135. 'error' => $exception->getMessage(),
  136. 'trace' => $exception->getTraceAsString()
  137. ]);
  138. }
  139. }