|
|
@@ -1049,6 +1049,15 @@ class AnimeService
|
|
|
if (!$episode) Utils::throwError('20003:该剧集不存在');
|
|
|
$roles = json_decode(getProp($episode, 'roles'), true);
|
|
|
|
|
|
+ // 获取anime信息,检查是否有关联的script_id
|
|
|
+ $anime = DB::table('mp_animes')->where('id', $anime_id)->first();
|
|
|
+ if (!$anime) Utils::throwError('20003:动漫不存在');
|
|
|
+
|
|
|
+ $script_id = getProp($anime, 'script_id');
|
|
|
+ $episode_number = getProp($episode, 'episode_number', 1);
|
|
|
+ $uid = Site::getUid();
|
|
|
+ $cpid = Site::getCpid();
|
|
|
+
|
|
|
try {
|
|
|
$target_role_name = getProp($target_roles, 'role');
|
|
|
|
|
|
@@ -1074,6 +1083,7 @@ class AnimeService
|
|
|
} else {
|
|
|
// 新增或更新操作
|
|
|
$role_found = false;
|
|
|
+ $is_new_role = false;
|
|
|
|
|
|
// 查找并更新已存在的角色
|
|
|
foreach($roles as &$role) {
|
|
|
@@ -1087,6 +1097,7 @@ class AnimeService
|
|
|
// 如果角色不存在,则新增
|
|
|
if (!$role_found) {
|
|
|
$roles[] = $target_roles;
|
|
|
+ $is_new_role = true;
|
|
|
}
|
|
|
|
|
|
// 更新角色列表
|
|
|
@@ -1117,6 +1128,124 @@ class AnimeService
|
|
|
'voice_audio_url' => $voice_audio_url,
|
|
|
'updated_at' => date('Y-m-d H:i:s')
|
|
|
]);
|
|
|
+
|
|
|
+ // 如果有关联的script_id,则同步到mp_products表
|
|
|
+ if ($script_id) {
|
|
|
+ // 查询剧本信息
|
|
|
+ $script = DB::table('mp_scripts')
|
|
|
+ ->where('id', $script_id)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($script) {
|
|
|
+ $script_name = $script->script_name ?? 'script_' . $script_id;
|
|
|
+ $product_name = getProp($target_roles, 'role');
|
|
|
+ $pic_prompt = getProp($target_roles, 'pic_prompt', '');
|
|
|
+ $url = getProp($target_roles, 'url', '');
|
|
|
+ $product_type = 1; // 1=角色
|
|
|
+
|
|
|
+ // 查找或创建以script_name命名的文件夹
|
|
|
+ $folder = DB::table('mp_products')
|
|
|
+ ->where('cpid', $cpid)
|
|
|
+ ->where('type', 2) // 文件夹类型
|
|
|
+ ->where('product', $product_type) // 角色类型
|
|
|
+ ->where('product_name', $script_name)
|
|
|
+ ->where('parent_id', 0)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$folder) {
|
|
|
+ // 创建文件夹
|
|
|
+ $folder_id = DB::table('mp_products')->insertGetId([
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'cpid' => $cpid,
|
|
|
+ 'type' => 2, // 文件夹
|
|
|
+ 'product' => $product_type, // 角色类型
|
|
|
+ 'parent_id' => 0,
|
|
|
+ 'level' => 1,
|
|
|
+ 'product_name' => $script_name,
|
|
|
+ 'sort_order' => time(),
|
|
|
+ 'is_deleted' => 0,
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ } else {
|
|
|
+ $folder_id = $folder->id;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找该文件夹下是否已存在同名资产
|
|
|
+ $existing_product = DB::table('mp_products')
|
|
|
+ ->where('cpid', $cpid)
|
|
|
+ ->where('type', 1) // 资产类型
|
|
|
+ ->where('product', $product_type)
|
|
|
+ ->where('parent_id', $folder_id)
|
|
|
+ ->where('product_name', $product_name)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($existing_product) {
|
|
|
+ // 更新已存在的资产
|
|
|
+ $updateData = [
|
|
|
+ 'pic_task_status' => '生成成功',
|
|
|
+ ];
|
|
|
+ if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
|
|
|
+ if ($url) $updateData['url'] = $url;
|
|
|
+
|
|
|
+ // 处理versions字段
|
|
|
+ $versions = getProp($target_roles, 'versions', []);
|
|
|
+ if ($versions && is_array($versions)) {
|
|
|
+ $updateData['versions'] = json_encode($versions, 256);
|
|
|
+ }
|
|
|
+
|
|
|
+ $updateData['updated_at'] = date('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ DB::table('mp_products')
|
|
|
+ ->where('id', $existing_product->id)
|
|
|
+ ->update($updateData);
|
|
|
+
|
|
|
+ $product_id = $existing_product->id;
|
|
|
+ } else {
|
|
|
+ // 创建新资产
|
|
|
+ $versions = getProp($target_roles, 'versions', []);
|
|
|
+
|
|
|
+ $product_id = DB::table('mp_products')->insertGetId([
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'cpid' => $cpid,
|
|
|
+ 'type' => 1, // 资产
|
|
|
+ 'product' => $product_type, // 角色
|
|
|
+ 'parent_id' => $folder_id,
|
|
|
+ 'level' => 2,
|
|
|
+ 'product_name' => $product_name,
|
|
|
+ 'url' => $url,
|
|
|
+ 'pic_prompt' => $pic_prompt,
|
|
|
+ 'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
|
|
|
+ 'sort_order' => time(),
|
|
|
+ 'is_deleted' => 0,
|
|
|
+ 'pic_task_status' => '生成成功',
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 建立或更新绑定关系
|
|
|
+ $existing_mapping = DB::table('mp_script_product_mappings')
|
|
|
+ ->where('script_id', $script_id)
|
|
|
+ ->where('product_id', $product_id)
|
|
|
+ ->where('episode_number', $episode_number)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$existing_mapping) {
|
|
|
+ // 创建绑定关系
|
|
|
+ DB::table('mp_script_product_mappings')->insert([
|
|
|
+ 'script_id' => $script_id,
|
|
|
+ 'product_id' => $product_id,
|
|
|
+ 'episode_number' => $episode_number,
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
} catch (\Exception $e) {
|
|
|
dLog('anime')->error('更新剧集角色失败', [
|
|
|
@@ -1150,6 +1279,15 @@ class AnimeService
|
|
|
if (!$episode) Utils::throwError('20003:该剧集不存在');
|
|
|
$scenes = json_decode(getProp($episode, 'scenes'), true);
|
|
|
|
|
|
+ // 获取anime信息,检查是否有关联的script_id
|
|
|
+ $anime = DB::table('mp_animes')->where('id', $anime_id)->first();
|
|
|
+ if (!$anime) Utils::throwError('20003:动漫不存在');
|
|
|
+
|
|
|
+ $script_id = getProp($anime, 'script_id');
|
|
|
+ $episode_number = getProp($episode, 'episode_number', 1);
|
|
|
+ $uid = Site::getUid();
|
|
|
+ $cpid = Site::getCpid();
|
|
|
+
|
|
|
try {
|
|
|
$target_scene_name = getProp($target_scenes, 'scene');
|
|
|
|
|
|
@@ -1175,6 +1313,7 @@ class AnimeService
|
|
|
} else {
|
|
|
// 新增或更新操作
|
|
|
$scene_found = false;
|
|
|
+ $is_new_scene = false;
|
|
|
|
|
|
// 查找并更新已存在的场景
|
|
|
foreach($scenes as &$scene) {
|
|
|
@@ -1188,6 +1327,7 @@ class AnimeService
|
|
|
// 如果场景不存在,则新增
|
|
|
if (!$scene_found) {
|
|
|
$scenes[] = $target_scenes;
|
|
|
+ $is_new_scene = true;
|
|
|
}
|
|
|
|
|
|
// 更新场景列表
|
|
|
@@ -1202,6 +1342,124 @@ class AnimeService
|
|
|
if ($result === false) {
|
|
|
Utils::throwError('20003:更新场景列表失败');
|
|
|
}
|
|
|
+
|
|
|
+ // 如果有关联的script_id,则同步到mp_products表
|
|
|
+ if ($script_id) {
|
|
|
+ // 查询剧本信息
|
|
|
+ $script = DB::table('mp_scripts')
|
|
|
+ ->where('id', $script_id)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($script) {
|
|
|
+ $script_name = $script->script_name ?? 'script_' . $script_id;
|
|
|
+ $product_name = getProp($target_scenes, 'scene');
|
|
|
+ $pic_prompt = getProp($target_scenes, 'pic_prompt', '');
|
|
|
+ $url = getProp($target_scenes, 'url', '');
|
|
|
+ $product_type = 2; // 2=场景
|
|
|
+
|
|
|
+ // 查找或创建以script_name命名的文件夹
|
|
|
+ $folder = DB::table('mp_products')
|
|
|
+ ->where('cpid', $cpid)
|
|
|
+ ->where('type', 2) // 文件夹类型
|
|
|
+ ->where('product', $product_type) // 场景类型
|
|
|
+ ->where('product_name', $script_name)
|
|
|
+ ->where('parent_id', 0)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$folder) {
|
|
|
+ // 创建文件夹
|
|
|
+ $folder_id = DB::table('mp_products')->insertGetId([
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'cpid' => $cpid,
|
|
|
+ 'type' => 2, // 文件夹
|
|
|
+ 'product' => $product_type, // 场景类型
|
|
|
+ 'parent_id' => 0,
|
|
|
+ 'level' => 1,
|
|
|
+ 'product_name' => $script_name,
|
|
|
+ 'sort_order' => time(),
|
|
|
+ 'is_deleted' => 0,
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ } else {
|
|
|
+ $folder_id = $folder->id;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找该文件夹下是否已存在同名资产
|
|
|
+ $existing_product = DB::table('mp_products')
|
|
|
+ ->where('cpid', $cpid)
|
|
|
+ ->where('type', 1) // 资产类型
|
|
|
+ ->where('product', $product_type)
|
|
|
+ ->where('parent_id', $folder_id)
|
|
|
+ ->where('product_name', $product_name)
|
|
|
+ ->where('is_deleted', 0)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($existing_product) {
|
|
|
+ // 更新已存在的资产
|
|
|
+ $updateData = [
|
|
|
+ 'pic_task_status' => '生成成功'
|
|
|
+ ];
|
|
|
+ if ($pic_prompt) $updateData['pic_prompt'] = $pic_prompt;
|
|
|
+ if ($url) $updateData['url'] = $url;
|
|
|
+
|
|
|
+ // 处理versions字段
|
|
|
+ $versions = getProp($target_scenes, 'versions', []);
|
|
|
+ if ($versions && is_array($versions)) {
|
|
|
+ $updateData['versions'] = json_encode($versions, 256);
|
|
|
+ }
|
|
|
+
|
|
|
+ $updateData['updated_at'] = date('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ DB::table('mp_products')
|
|
|
+ ->where('id', $existing_product->id)
|
|
|
+ ->update($updateData);
|
|
|
+
|
|
|
+ $product_id = $existing_product->id;
|
|
|
+ } else {
|
|
|
+ // 创建新资产
|
|
|
+ $versions = getProp($target_scenes, 'versions', []);
|
|
|
+
|
|
|
+ $product_id = DB::table('mp_products')->insertGetId([
|
|
|
+ 'user_id' => $uid,
|
|
|
+ 'cpid' => $cpid,
|
|
|
+ 'type' => 1, // 资产
|
|
|
+ 'product' => $product_type, // 场景
|
|
|
+ 'parent_id' => $folder_id,
|
|
|
+ 'level' => 2,
|
|
|
+ 'product_name' => $product_name,
|
|
|
+ 'url' => $url,
|
|
|
+ 'pic_prompt' => $pic_prompt,
|
|
|
+ 'versions' => is_array($versions) ? json_encode($versions, 256) : '[]',
|
|
|
+ 'sort_order' => time(),
|
|
|
+ 'is_deleted' => 0,
|
|
|
+ 'pic_task_status' => '生成成功',
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 建立或更新绑定关系
|
|
|
+ $existing_mapping = DB::table('mp_script_product_mappings')
|
|
|
+ ->where('script_id', $script_id)
|
|
|
+ ->where('product_id', $product_id)
|
|
|
+ ->where('episode_number', $episode_number)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$existing_mapping) {
|
|
|
+ // 创建绑定关系
|
|
|
+ DB::table('mp_script_product_mappings')->insert([
|
|
|
+ 'script_id' => $script_id,
|
|
|
+ 'product_id' => $product_id,
|
|
|
+ 'episode_number' => $episode_number,
|
|
|
+ 'created_at' => date('Y-m-d H:i:s'),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
} catch (\Exception $e) {
|
|
|
dLog('anime')->error('更新剧集场景失败', [
|
|
|
@@ -6407,7 +6665,10 @@ class AnimeService
|
|
|
// 检查是否有图片生成任务
|
|
|
if (!empty($product->pic_task_id)) {
|
|
|
$productTaskMap[$product->id] = $product->pic_task_id;
|
|
|
- } else {
|
|
|
+ } else if($product->url && $product->pic_task_status == '生成成功') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else {
|
|
|
// 有资产没有图片任务
|
|
|
$hasAllTasks = false;
|
|
|
}
|
|
|
@@ -6941,9 +7202,24 @@ class AnimeService
|
|
|
while (time() - $startTime < $timeout) {
|
|
|
sleep($pollInterval);
|
|
|
|
|
|
+ // 从 mp_script_product_mappings 表获取该剧本的所有资产ID
|
|
|
+ $mappings = DB::table('mp_script_product_mappings')
|
|
|
+ ->where('script_id', $script_id)
|
|
|
+ ->pluck('product_id')
|
|
|
+ ->unique()
|
|
|
+ ->toArray();
|
|
|
+
|
|
|
+ if (empty($mappings)) {
|
|
|
+ dLog('anime')->warning('该剧本没有关联的资产', [
|
|
|
+ 'script_id' => $script_id,
|
|
|
+ 'script_name' => $script_name
|
|
|
+ ]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
// 查询所有资产的当前状态
|
|
|
$products = DB::table('mp_products')
|
|
|
- ->whereIn('id', array_keys($productTaskMap))
|
|
|
+ ->whereIn('id', $mappings)
|
|
|
->where('is_deleted', 0)
|
|
|
->get();
|
|
|
|