taskId = $taskId; } public function start() { $task = ProjectTask::with('project')->find($this->taskId); if (!$task || $task->deleted_at || !$task->dialog_id) { return; } // 获取该任务的所有待处理事件 $events = ProjectTaskAiEvent::where('task_id', $this->taskId) ->whereIn('status', [ ProjectTaskAiEvent::STATUS_PENDING, ProjectTaskAiEvent::STATUS_FAILED, ]) ->get() ->keyBy('event_type'); $suggestions = []; // 遍历所有事件类型 foreach (ProjectTaskAiEvent::getEventTypes() as $eventType) { $event = $events->get($eventType); // 如果没有记录,跳过 if (!$event) { continue; } // 如果是失败状态但不能重试,跳过 if ($event->status === ProjectTaskAiEvent::STATUS_FAILED && !$event->canRetry()) { continue; } // 标记为处理中 $event->markProcessing(); try { // 检查是否满足执行条件 if (!AiTaskSuggestion::shouldExecute($task, $eventType)) { $event->markSkipped('不满足执行条件'); continue; } // 执行对应的分析 $result = $this->executeAnalysis($task, $eventType); if ($result === null) { $event->markSkipped('未生成有效建议'); continue; } // 收集建议 $suggestions[] = $result; $event->markCompleted($result); } catch (\Exception $e) { $event->markFailed($e->getMessage()); \Log::error("AiTaskAnalyzeTask error: task={$this->taskId}, type={$eventType}, error={$e->getMessage()}"); } } // 如果有建议,发送消息 if (!empty($suggestions)) { $msgId = AiTaskSuggestion::sendSuggestionMessage($task, $suggestions); // 更新所有事件的 msg_id if ($msgId) { ProjectTaskAiEvent::where('task_id', $this->taskId) ->where('status', ProjectTaskAiEvent::STATUS_COMPLETED) ->update(['msg_id' => $msgId]); } } } /** * 执行具体的分析 */ private function executeAnalysis(ProjectTask $task, string $eventType): ?array { switch ($eventType) { case ProjectTaskAiEvent::EVENT_DESCRIPTION: return AiTaskSuggestion::generateDescription($task); case ProjectTaskAiEvent::EVENT_SUBTASKS: return AiTaskSuggestion::generateSubtasks($task); case ProjectTaskAiEvent::EVENT_ASSIGNEE: return AiTaskSuggestion::generateAssignee($task); case ProjectTaskAiEvent::EVENT_SIMILAR: return AiTaskSuggestion::findSimilarTasks($task); default: return null; } } public function end() { } }