|
|
@@ -1473,6 +1473,220 @@ class AnimeService
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ public function changeEpisodeProps($data) {
|
|
|
+ $anime_id = getProp($data, 'anime_id');
|
|
|
+ $episode_id = getProp($data, 'episode_id');
|
|
|
+ $target_props = getProp($data, 'props');
|
|
|
+ $is_deleted = getProp($data, 'is_deleted', 0);
|
|
|
+
|
|
|
+ // 参数验证
|
|
|
+ if (!$anime_id) Utils::throwError('20003:请提供动漫ID');
|
|
|
+ if (!$episode_id) Utils::throwError('20003:请提供剧集ID');
|
|
|
+ if (!$target_props) Utils::throwError('20003:请提供道具信息');
|
|
|
+
|
|
|
+ // 验证剧集是否存在
|
|
|
+ $episode = DB::table('mp_anime_episodes')
|
|
|
+ ->where('anime_id', $anime_id)
|
|
|
+ ->where('id', $episode_id)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$episode) Utils::throwError('20003:该剧集不存在');
|
|
|
+ $props = json_decode(getProp($episode, 'props'), 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_prop_name = getProp($target_props, 'prop');
|
|
|
+
|
|
|
+ // 如果是删除操作
|
|
|
+ if ($is_deleted == 1) {
|
|
|
+ // 从道具列表中移除该道具
|
|
|
+ $props = array_values(array_filter($props, function($prop) use ($target_prop_name) {
|
|
|
+ return getProp($prop, 'prop') !== $target_prop_name;
|
|
|
+ }));
|
|
|
+
|
|
|
+ // 更新道具列表
|
|
|
+ $result = DB::table('mp_anime_episodes')
|
|
|
+ ->where('anime_id', $anime_id)
|
|
|
+ ->where('id', $episode_id)
|
|
|
+ ->update([
|
|
|
+ 'props' => json_encode($props, 256),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ if ($result === false) {
|
|
|
+ Utils::throwError('20003:删除道具失败');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 新增或更新操作
|
|
|
+ $prop_found = false;
|
|
|
+ $is_new_prop = false;
|
|
|
+
|
|
|
+ // 查找并更新已存在的道具
|
|
|
+ foreach($props as &$prop) {
|
|
|
+ if (getProp($prop, 'prop') === $target_prop_name) {
|
|
|
+ $prop = $target_props;
|
|
|
+ $prop_found = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果道具不存在,则新增
|
|
|
+ if (!$prop_found) {
|
|
|
+ $props[] = $target_props;
|
|
|
+ $is_new_prop = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新道具列表
|
|
|
+ $result = DB::table('mp_anime_episodes')
|
|
|
+ ->where('anime_id', $anime_id)
|
|
|
+ ->where('id', $episode_id)
|
|
|
+ ->update([
|
|
|
+ 'props' => json_encode($props, 256),
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ 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_props, 'prop');
|
|
|
+ $pic_prompt = getProp($target_props, 'pic_prompt', '');
|
|
|
+ $url = getProp($target_props, 'url', '');
|
|
|
+ $product_type = 3; // 3=道具
|
|
|
+
|
|
|
+ // 查找或创建以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_props, '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_props, '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('更新剧集道具失败', [
|
|
|
+ 'anime_id' => $anime_id,
|
|
|
+ 'episode_id' => $episode_id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ Utils::throwError('20003:更新道具列表失败 ' . $e->getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
public function editSegment($data) {
|
|
|
$segment_id = getProp($data, 'segment_id');
|
|
|
$segment_content = getProp($data, 'segment_content');
|