aiImageGenerationService = $aiImageGenerationService; } public function uploadImg($data) { } public function batchSetRoleImg($data) { $anime_id = getProp($data, 'anime_id'); 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_animes')->where('id', $anime_id)->update([ 'roles' => json_encode($roles, 256), 'generate_status' => '执行中', '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:请选择对话'); $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_animes')->where('id', $anime_id)->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, start_episode_sequence, end_episode_sequence, episode_num, 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)->orderBy('episode_number') ->select('id', 'episode_number', 'title', 'content', 'segment_number', 'segment_content') ->orderBy('episode_number')->orderBy('segment_number')->get()->map(function ($value) { return (array)$value; })->toArray(); $return_episodes = []; foreach($episodes as $episode) { $episode_number = getProp($episode, 'episode_number'); if (isset($return_episodes[$episode_number])) { $return_episodes[$episode_number]['segments'][] = [ 'segment_number' => getProp($episode, 'segment_number'), 'segment_content' => getProp($episode, 'segment_content') ]; }else { $return_episodes[$episode_number] = [ 'episode_number' => $episode_number, 'title' => getProp($episode, 'title'), 'segments' => [ [ 'segment_number' => getProp($episode, 'segment_number'), 'segment_content' => getProp($episode, 'segment_content') ] ] ]; } } $anime['episodes'] = array_values($return_episodes); return $anime; } }