taskId = $taskId; $this->animeId = $animeId; $this->startEpisodeNumber = $startEpisodeNumber; $this->totalEpisodes = $totalEpisodes; $this->requestData = $requestData; $this->uid = $uid; $this->cpid = $cpid; } /** * Execute the job. * * @return void */ public function handle() { try { // 设置当前用户上下文 Site::setUid($this->uid); Site::setCpid($this->cpid); $deepSeekService = app(DeepSeekService::class); // 逐集生成 for ($i = 0; $i < $this->totalEpisodes; $i++) { $currentEpisodeNumber = $this->startEpisodeNumber + $i; // 更新当前任务进度 $this->updateTaskProgress($currentEpisodeNumber, 'processing'); try { // 准备当前集的数据 $episodeData = $this->requestData; $episodeData['episode_number'] = $currentEpisodeNumber; $episodeData['prompt'] = '确认分镜大纲'; // 调用非流式生成方法 $result = $deepSeekService->chatForAceNonStream($episodeData); // 标记当前集完成 $this->updateTaskProgress($currentEpisodeNumber, 'completed', $result); } catch (\Exception $e) { // 标记当前集失败 $this->updateTaskProgress($currentEpisodeNumber, 'failed', null, $e->getMessage()); // 记录错误日志 logDB('batch_episode_generation', 'error', "第{$currentEpisodeNumber}集生成失败", [ 'task_id' => $this->taskId, 'anime_id' => $this->animeId, 'episode_number' => $currentEpisodeNumber, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // 继续生成下一集(可选:根据需求决定是否中断整个任务) // throw $e; // 如果要中断整个任务,取消注释这行 } } // 标记整个任务完成 DB::table('mp_batch_episode_generation_tasks') ->where('id', $this->taskId) ->update([ 'status' => 'completed', 'completed_at' => now(), 'updated_at' => now() ]); } catch (\Exception $e) { // 标记整个任务失败 DB::table('mp_batch_episode_generation_tasks') ->where('id', $this->taskId) ->update([ 'status' => 'failed', 'error_message' => $e->getMessage(), 'updated_at' => now() ]); // 记录错误日志 logDB('batch_episode_generation', 'error', '批量生成任务失败', [ 'task_id' => $this->taskId, 'anime_id' => $this->animeId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw $e; } } /** * 更新任务进度 */ private function updateTaskProgress($episodeNumber, $status, $result = null, $errorMessage = null) { $updateData = [ 'current_episode' => $episodeNumber, 'updated_at' => now() ]; if ($status === 'completed') { $updateData['completed_episodes'] = DB::raw('completed_episodes + 1'); } if ($errorMessage) { $updateData['error_message'] = $errorMessage; } DB::table('mp_batch_episode_generation_tasks') ->where('id', $this->taskId) ->update($updateData); // 保存每集的详细状态 DB::table('mp_batch_episode_generation_details')->insert([ 'task_id' => $this->taskId, 'episode_number' => $episodeNumber, 'status' => $status, 'result_data' => $result ? json_encode($result, JSON_UNESCAPED_UNICODE) : null, 'error_message' => $errorMessage, 'created_at' => now(), 'updated_at' => now() ]); } /** * 任务失败处理 */ public function failed(\Throwable $exception) { DB::table('mp_batch_episode_generation_tasks') ->where('id', $this->taskId) ->update([ 'status' => 'failed', 'error_message' => $exception->getMessage(), 'updated_at' => now() ]); logDB('batch_episode_generation', 'error', '批量生成任务彻底失败', [ 'task_id' => $this->taskId, 'anime_id' => $this->animeId, 'error' => $exception->getMessage() ]); } }