GenerateKnowledgeExplanationTaskJob.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. 'paper_id' => $knowledgeId,
  40. 'knowledge_id' => $knowledgeId,
  41. 'kp_codes' => array_map(static fn (array $kp) => $kp['kp_code'] ?? '', $knowledgePoints),
  42. ]);
  43. $taskManager->updateTaskProgress($this->taskId, 55, '案例筛选完成,开始生成PDF...');
  44. dispatch(new GenerateKnowledgeExplanationPdfJob($this->taskId, $knowledgeId, $knowledgePoints));
  45. } catch (\Throwable $e) {
  46. Log::error('GenerateKnowledgeExplanationTaskJob 失败', [
  47. 'task_id' => $this->taskId,
  48. 'error' => $e->getMessage(),
  49. ]);
  50. $knowledgeId = (string) ($payload['knowledge_id'] ?? '');
  51. if ($knowledgeId !== '') {
  52. KnowledgeExplanation::query()
  53. ->where('knowledge_id', $knowledgeId)
  54. ->update(['status' => 'failed']);
  55. }
  56. $taskManager->markTaskFailed($this->taskId, $e->getMessage());
  57. }
  58. }
  59. public function failed(Throwable $exception): void
  60. {
  61. $taskManager = app(TaskManager::class);
  62. $task = $taskManager->getTaskStatus($this->taskId);
  63. $knowledgeId = is_array($task) ? (string) ($task['data']['knowledge_id'] ?? '') : '';
  64. if ($knowledgeId !== '') {
  65. KnowledgeExplanation::query()
  66. ->where('knowledge_id', $knowledgeId)
  67. ->update(['status' => 'failed']);
  68. }
  69. $taskManager->markTaskFailed($this->taskId, $exception->getMessage());
  70. }
  71. }