GenerateKnowledgeExplanationTaskJob.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\KnowledgeExplanation;
  4. use App\Services\KnowledgeExplanationService;
  5. use App\Services\TaskManager;
  6. use Illuminate\Bus\Queueable;
  7. use Illuminate\Contracts\Queue\ShouldQueue;
  8. use Illuminate\Foundation\Bus\Dispatchable;
  9. use Illuminate\Queue\InteractsWithQueue;
  10. use Illuminate\Queue\SerializesModels;
  11. use Illuminate\Support\Facades\Log;
  12. use Throwable;
  13. class GenerateKnowledgeExplanationTaskJob implements ShouldQueue
  14. {
  15. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  16. public function __construct(public string $taskId)
  17. {
  18. $this->onQueue('logic');
  19. $this->afterCommit();
  20. }
  21. public int $tries = 2;
  22. public int $timeout = 180;
  23. public function handle(
  24. KnowledgeExplanationService $knowledgeExplanationService,
  25. TaskManager $taskManager
  26. ): void {
  27. $task = $taskManager->getTaskStatus($this->taskId);
  28. if (! is_array($task) || ! isset($task['data']) || ! is_array($task['data'])) {
  29. $taskManager->markTaskFailed($this->taskId, '任务数据不存在');
  30. return;
  31. }
  32. $payload = $task['data'];
  33. try {
  34. $taskManager->updateTaskProgress($this->taskId, 15, '开始生成知识点讲解与案例...');
  35. $prepared = $knowledgeExplanationService->prepareKnowledgeExplanation($payload);
  36. $knowledgeId = (string) $prepared['knowledge_id'];
  37. $knowledgePoints = (array) $prepared['knowledge_points'];
  38. $taskManager->updateTaskStatus($this->taskId, [
  39. 'knowledge_id' => $knowledgeId,
  40. 'kp_codes' => array_map(static fn (array $kp) => $kp['kp_code'] ?? '', $knowledgePoints),
  41. ]);
  42. $taskManager->updateTaskProgress($this->taskId, 55, '案例筛选完成,开始生成PDF...');
  43. dispatch(new GenerateKnowledgeExplanationPdfJob($this->taskId, $knowledgeId, $knowledgePoints));
  44. } catch (\Throwable $e) {
  45. Log::error('GenerateKnowledgeExplanationTaskJob 失败', [
  46. 'task_id' => $this->taskId,
  47. 'error' => $e->getMessage(),
  48. ]);
  49. $knowledgeId = (string) ($payload['knowledge_id'] ?? '');
  50. if ($knowledgeId !== '') {
  51. KnowledgeExplanation::query()
  52. ->where('knowledge_id', $knowledgeId)
  53. ->update(['status' => 'failed']);
  54. }
  55. $taskManager->markTaskFailed($this->taskId, $e->getMessage());
  56. }
  57. }
  58. public function failed(Throwable $exception): void
  59. {
  60. $taskManager = app(TaskManager::class);
  61. $task = $taskManager->getTaskStatus($this->taskId);
  62. $knowledgeId = is_array($task) ? (string) ($task['data']['knowledge_id'] ?? '') : '';
  63. if ($knowledgeId !== '') {
  64. KnowledgeExplanation::query()
  65. ->where('knowledge_id', $knowledgeId)
  66. ->update(['status' => 'failed']);
  67. }
  68. $taskManager->markTaskFailed($this->taskId, $exception->getMessage());
  69. }
  70. }