diff --git a/app/Tasks/AiTaskAnalyzeTask.php b/app/Tasks/AiTaskAnalyzeTask.php new file mode 100644 index 000000000..e72f03235 --- /dev/null +++ b/app/Tasks/AiTaskAnalyzeTask.php @@ -0,0 +1,123 @@ +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() + { + } +}