| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- <?php
- namespace App\Jobs;
- use App\Models\KnowledgeExplanation;
- use App\Services\KnowledgeExplanationService;
- use App\Services\TaskManager;
- use Illuminate\Bus\Queueable;
- use Illuminate\Contracts\Queue\ShouldQueue;
- use Illuminate\Foundation\Bus\Dispatchable;
- use Illuminate\Queue\InteractsWithQueue;
- use Illuminate\Queue\SerializesModels;
- use Illuminate\Support\Facades\Log;
- use Throwable;
- class GenerateKnowledgeExplanationTaskJob implements ShouldQueue
- {
- use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
- public function __construct(public string $taskId)
- {
- $this->onQueue('logic');
- $this->afterCommit();
- }
- public int $tries = 2;
- public int $timeout = 180;
- public function handle(
- KnowledgeExplanationService $knowledgeExplanationService,
- TaskManager $taskManager
- ): void {
- $task = $taskManager->getTaskStatus($this->taskId);
- if (! is_array($task) || ! isset($task['data']) || ! is_array($task['data'])) {
- $taskManager->markTaskFailed($this->taskId, '任务数据不存在');
- return;
- }
- $payload = $task['data'];
- try {
- $taskManager->updateTaskProgress($this->taskId, 15, '开始生成知识点讲解与案例...');
- $prepared = $knowledgeExplanationService->prepareKnowledgeExplanation($payload);
- $knowledgeId = (string) $prepared['knowledge_id'];
- $knowledgePoints = (array) $prepared['knowledge_points'];
- $taskManager->updateTaskStatus($this->taskId, [
- 'paper_id' => $knowledgeId,
- 'knowledge_id' => $knowledgeId,
- 'kp_codes' => array_map(static fn (array $kp) => $kp['kp_code'] ?? '', $knowledgePoints),
- ]);
- $taskManager->updateTaskProgress($this->taskId, 55, '案例筛选完成,开始生成PDF...');
- dispatch(new GenerateKnowledgeExplanationPdfJob($this->taskId, $knowledgeId, $knowledgePoints));
- } catch (\Throwable $e) {
- Log::error('GenerateKnowledgeExplanationTaskJob 失败', [
- 'task_id' => $this->taskId,
- 'error' => $e->getMessage(),
- ]);
- $knowledgeId = (string) ($payload['knowledge_id'] ?? '');
- if ($knowledgeId !== '') {
- KnowledgeExplanation::query()
- ->where('knowledge_id', $knowledgeId)
- ->update(['status' => 'failed']);
- }
- $taskManager->markTaskFailed($this->taskId, $e->getMessage());
- }
- }
- public function failed(Throwable $exception): void
- {
- $taskManager = app(TaskManager::class);
- $task = $taskManager->getTaskStatus($this->taskId);
- $knowledgeId = is_array($task) ? (string) ($task['data']['knowledge_id'] ?? '') : '';
- if ($knowledgeId !== '') {
- KnowledgeExplanation::query()
- ->where('knowledge_id', $knowledgeId)
- ->update(['status' => 'failed']);
- }
- $taskManager->markTaskFailed($this->taskId, $exception->getMessage());
- }
- }
|