aiImageGenerationService = $aiImageGenerationService; $this->url = 'https://api.deepseek.com/chat/completions'; $this->api_key = env('DEEPSEEK_API_KEY'); $this->headers = [ 'Authorization' => 'Bearer '.$this->api_key, 'Content-Type' => 'application/json; charset=UTF-8' ]; } public function uploadImg($data) { } public function batchSetRoleImg($data) { $anime_id = getProp($data, 'anime_id'); $episode_number = getProp($data, 'episode_number'); if (!$anime_id) Utils::throwError('1002:请选择对话'); $roles = getProp($data, 'roles'); foreach ($roles as &$role) { $role_name = getProp($role, 'role'); $description = getProp($role, 'description'); // 参考图地址 $ref_img_url = getProp($role, 'ref_img_url'); // 此处调用AIImageGenerationService的生成图片任务接口: createImageGenerationTask(注意使用默认参数,prompt使用角色描述),并返回任务id try { $params = [ 'prompt' => $description, 'ref_img_urls' => !empty($ref_img_url) ? $ref_img_url : [] ]; $task = $this->aiImageGenerationService->createImageGenerationTask($params); $task_id = $task->id; if (!$task_id) { Utils::throwError("20003: 角色({$role_name})生成图片失败"); } $role['task_id'] = $task_id; $role['task_status'] = 'processing'; } catch (\Exception $e) { Utils::throwError("20003:" . $e->getMessage()); } } // 保存角色信息 $boolen = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('is_default', 1)->update([ 'roles' => json_encode($roles, 256), 'generate_status' => '执行中', 'generate_status' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') ]); if (!$boolen) { Utils::throwError('20003:保存角色信息失败'); } return $boolen; } public function batchSetSceneImg($data) { $anime_id = getProp($data, 'anime_id'); if (!$anime_id) Utils::throwError('1002:请选择对话'); $episode_number = getProp($data, 'episode_number'); $scenes = getProp($data, 'scenes'); foreach ($scenes as &$scene) { $scene_name = getProp($scene, 'scene'); $description = getProp($scene, 'description'); // 参考图地址 $ref_img_url = getProp($scene, 'url'); // 此处调用AIImageGenerationService的生成图片任务接口: createImageGenerationTask(注意使用默认参数,prompt使用角色描述),并返回任务id try { $params = [ 'prompt' => $description, 'ref_img_urls' => !empty($ref_img_url) ? $ref_img_url : [] ]; $task = $this->aiImageGenerationService->createImageGenerationTask($params); $task_id = $task->id; if (!$task_id) { Utils::throwError("20003: 角色({$scene_name})生成图片失败"); } $scene['task_id'] = $task_id; $scene['task_status'] = 'processing'; } catch (\Exception $e) { Utils::throwError("20003:" . $e->getMessage()); } } // 保存角色信息 $boolen = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->update([ 'scenes' => json_encode($scenes, 256), 'generate_status' => '执行中', 'updated_at' => date('Y-m-d H:i:s') ]); if (!$boolen) { Utils::throwError('20003:保存角色信息失败'); } return $boolen; } public function editAnime($data) { $script_arr =getProp($data, 'script', []); if (!$script_arr) Utils::throwError('20003:剧本内容不能为空'); $start_episode_sequence = getProp($data, 'start_episode_sequence', 1); $anime_id = getProp($data, 'anime_id'); try { DB::beginTransaction(); $table_data = [ 'intro' => isset($script_arr['intro']) ? $script_arr['intro'] : '', 'highlights' => isset($script_arr['highlights']) ? $script_arr['highlights'] : '', 'role_relationship' => isset($script_arr['role_relationship']) ? $script_arr['role_relationship'] : '', 'core_contradiction' => isset($script_arr['core_contradiction']) ? $script_arr['core_contradiction'] : '', 'roles' => isset($script_arr['roles']) ? json_encode($script_arr['roles'], 256) : '', 'art_style' => isset($script_arr['art_style']) ? $script_arr['art_style'] : '', 'scenes' => isset($script_arr['scenes']) ? json_encode($script_arr['scenes'], 256) : '', 'status' => 3, 'start_episode_sequence' => $start_episode_sequence, 'end_episode_sequence' => $start_episode_sequence + count($script_arr['episodes']) - 1, 'episode_num' => count($script_arr['episodes']), 'updated_at' => date('Y-m-d H:i:s') ]; // 保存剧本内容 if (!empty($anime_id)) { $boolen = DB::table('mp_animes')->where('id', $anime_id)->update($table_data); if (!$boolen) { dLog('deepseek')->info('对话保存失败', $table_data); Utils::throwError('20003:对话保存失败'); } }else { $table['created_at'] = $table_data['updated_at']; $anime_id = DB::table('mp_animes')->insertGetId($table_data); if (!$anime_id) { dLog('deepseek')->info('对话保存失败', $table_data); Utils::throwError('20003:对话保存失败'); } } // 保存分集内容 // 删除历史分集内容 $boolen1 = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->delete(); $episodes = []; $sequence = 1; foreach ($script_arr['episodes'] as $episode) { $segment_number = 1; foreach($episode['segments'] as $segment) { $episodes[] = [ 'anime_id' => $anime_id, 'episode_number' => $episode['episode_number'], 'title' => $episode['title'], // 'content' => $episode['content'], 'content' => '', 'segment_number' => $segment_number, 'segment_content' => $segment['segment_content'], 'sequence' => $sequence, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') ]; $sequence++; $segment_number++; } } $boolen2 = DB::table('mp_anime_episodes')->insert($episodes); if (!$boolen2) { dLog('deepseek')->info('分集内容保存失败', $episodes); Utils::throwError('20003:分集内容保存失败'); } } catch (\Exception $e) { DB::rollBack(); Utils::throwError('20003:'.$e->getMessage()); } DB::commit(); return true; } public function animeDetail($data) { $anime_id = getProp($data, 'anime_id'); $anime = DB::table('mp_animes')->where('id', $anime_id)->where('is_deleted', 0) ->selectRaw('id as anime_id, anime_name, intro, highlights, roles, role_relationship, core_contradiction, art_style, scenes, status, remark, generate_status, created_at')->first(); if (!$anime) Utils::throwError('20003:该剧本不存在!'); $anime = (array)$anime; $anime['roles'] = json_decode($anime['roles']); $anime['scenes'] = json_decode($anime['scenes']); // 获取分集信息 $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('is_default', 1) ->select('id as episode_id', 'episode_number', 'title') ->orderBy('episode_number')->get()->map(function ($value) { return (array)$value; })->toArray(); $anime['episodes'] = $episodes; return $anime; } public function episodeInfo($data) { $anime_id = getProp($data, 'anime_id'); $episode_number = getProp($data, 'episode_number'); if (!$anime_id || !$episode_number) { Utils::throwError('1002:请选择剧集'); } $episode = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('is_default', 1)->select('id as episode_id', 'anime_id', 'episode_number', 'title', 'intro', 'art_style', 'roles', 'scenes', 'acts')->first(); if (!$episode) Utils::throwError('20003: 该剧集不存在!'); $episode = (array)$episode; $episode['roles'] = json_decode($episode['roles'], true); $episode['scenes'] = json_decode($episode['scenes'], true); $episode['acts'] = json_decode($episode['acts'], true); return $episode; } public function copyEpisodeVersion($data) { $episode_id = getProp($data, 'episode_id'); $episode = DB::table('mp_anime_episodes')->where('id', $episode_id)->first(); if (!$episode) Utils::throwError('20003:该剧集不存在'); $episode = (array)$episode; $count = DB::table('mp_anime_episodes')->where('anime_id', $episode['anime_id'])->where('episode_number', $episode['episode_number'])->count('id'); $sequence = $count + 1; unset($episode['id']); $episode['sequence'] = $sequence; $episode['created_at'] = date('Y-m-d H:i:s'); $episode['updated_at'] = date('Y-m-d H:i:s'); $episode['is_default'] = 1; try { DB::beginTransaction(); // 移除is_default标志 $boolen = DB::table('mp_anime_episodes')->where('anime_id', $episode['anime_id'])->where('episode_number', $episode['episode_number'])->update(['is_default' => 0, 'updated_at'=>date('Y-m-d H:i:s')]); if (!$boolen) { Utils::throwError('20003:更新失败!'); } // 新增副本 $new_episode_id = DB::table('mp_anime_episodes')->insertGetId($episode); if (!$new_episode_id) { Utils::throwError('20003:创建副本失败!'); } $episode['episode_id'] = $new_episode_id; }catch (\Exception $e) { DB::rollBack(); Utils::throwError('20003:'.$e->getMessage()); } DB::commit(); return $episode; } public function episodeVersions($data) { $anime_id = getProp($data, 'anime_id'); $episode_number = getProp($data, 'episode_number'); if (!$anime_id || !$episode_number) { Utils::throwError('1002:请选择剧集'); } $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->select('anime_id', 'episode_number', 'sequence', 'title', 'intro', 'art_style', 'roles', 'scenes', 'acts')->get()->map(function($value) { return (array)$value; })->toArray(); if (!$episodes) Utils::throwError('20003: 该剧集不存在!'); foreach($episodes as &$episode) { $episode['version'] = 'V'.$episode['sequence']; $episode['roles'] = json_decode($episode['roles'], true); $episode['scenes'] = json_decode($episode['scenes'], true); $episode['acts'] = json_decode($episode['acts'], true); } return $episodes; } public function bindEpisodeVersion($data) { $episode_id = getProp($data, 'episode_id'); $episode = DB::table('mp_anime_episodes')->where('id', $episode_id)->first(); if (!$episode) Utils::throwError('20003:该剧集不存在'); $episode = (array)$episode; if ((int)$episode['is_default'] === 1) return true; try { DB::beginTransaction(); // 移除is_default标志 $boolen = DB::table('mp_anime_episodes')->where('anime_id', $episode['anime_id'])->where('episode_number', $episode['episode_number'])->update(['is_default' => 0, 'updated_at'=>date('Y-m-d H:i:s')]); if (!$boolen) { Utils::throwError('20003:更新失败!'); } // 绑定副本 $boolen2 = DB::table('mp_anime_episodes')->where('id', $episode_id)->update(['is_default' => 1, 'updated_at'=>date('Y-m-d H:i:s')]); if (!$boolen2) { Utils::throwError('20003:绑定失败!'); } }catch (\Exception $e) { DB::rollBack(); Utils::throwError('20003:'.$e->getMessage()); } DB::commit(); return true; } }