lh 5 bulan lalu
induk
melakukan
c40608667a
1 mengubah file dengan 64 tambahan dan 7 penghapusan
  1. 64 7
      app/Services/Anime/AnimeService.php

+ 64 - 7
app/Services/Anime/AnimeService.php

@@ -436,7 +436,9 @@ class AnimeService
         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');
+        $anime_id = $episode['anime_id'];
+        $episode_number = $episode['episode_number'];
+        $count = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->count('id');
         $sequence = $count + 1;
         unset($episode['id']);
         $episode['sequence'] = $sequence;
@@ -447,7 +449,7 @@ class AnimeService
         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')]);
+            $boolen = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->update(['is_default' => 0, 'updated_at'=>date('Y-m-d H:i:s')]);
             if (!$boolen) {
                 Utils::throwError('20003:更新失败!');
             }
@@ -457,10 +459,9 @@ class AnimeService
             if (!$new_episode_id) {
                 Utils::throwError('20003:创建副本失败!');
             }
-            $episode['episode_id'] = $new_episode_id;
 
-            // 获取分镜数据
-            $segments = DB::table('mp_episode_segments')->where('episode_id', $episode_id)->get()->map(function($item) use ($new_episode_id) {
+            // 获取分镜数据并准备插入
+            $segments_for_insert = DB::table('mp_episode_segments')->where('episode_id', $episode_id)->orderBy('segment_number')->get()->map(function($item) use ($new_episode_id) {
                 $item = (array)$item;
                 unset($item['id']);
                 $item['episode_id'] = $new_episode_id;
@@ -470,7 +471,7 @@ class AnimeService
             })->toArray();
 
             // 写入分镜数据
-            $boolen2 = DB::table('mp_episode_segments')->insert($segments);
+            $boolen2 = DB::table('mp_episode_segments')->insert($segments_for_insert);
             if (!$boolen2) {
                 Utils::throwError('20003:写入分镜数据失败!');
             }
@@ -481,7 +482,63 @@ class AnimeService
 
         DB::commit();
 
-        return $episode;
+        // 构建与 episodeInfo 方法一致的返回数据结构
+        $result = [
+            'episode_id' => $new_episode_id,
+            'anime_id' => $anime_id,
+            'episode_number' => $episode_number,
+            'title' => $episode['title'],
+            'intro' => $episode['intro'],
+            'art_style' => $episode['art_style'],
+            'roles' => json_decode($episode['roles'], true),
+            'scenes' => json_decode($episode['scenes'], true),
+        ];
+
+        // 复用已有的分镜数据,按 act 分组(避免重复查询数据库)
+        $acts = [];
+        foreach($segments_for_insert as $segment) {
+            $act_number = getProp($segment, 'act_number');
+            $segment_info = [
+                'segment_id' => getProp($segment, 'segment_id'),
+                'segment_number' => getProp($segment, 'segment_number'),
+                'segment_content' => getProp($segment, 'segment_content'),
+                'description' => getProp($segment, 'description'),
+                'composition' => getProp($segment, 'composition'),
+                'camera_movement' => getProp($segment, 'camera_movement'),
+                'voice_actor' => getProp($segment, 'voice_actor'),
+                'dialogue' => getProp($segment, 'dialogue'),
+                'frame_type' => getProp($segment, 'frame_type'),
+                'scene' => getProp($segment, 'scene'),
+                'characters' => getProp($segment, 'characters'),
+                'tail_frame' => getProp($segment, 'tail_frame'),
+                'emotion' => getProp($segment, 'emotion'),
+                'emotion_type' => getProp($segment, 'emotion_type'),
+                'gender' => getProp($segment, 'gender'),
+                'speed_ratio' => getProp($segment, 'speed_ratio'),
+                'loudness_ratio' => getProp($segment, 'loudness_ratio'),
+                'emotion_scale' => getProp($segment, 'emotion_scale'),
+                'pitch' => getProp($segment, 'pitch'),
+                'voice_name' => getProp($segment, 'voice_name'),
+                'voice_type' => getProp($segment, 'voice_type'),
+                'voice_audio_url' => getProp($segment, 'voice_audio_url'),
+                'img_url' => getProp($segment, 'img_url'),
+                'video_url' => getProp($segment, 'video_url'),
+                'last_frame_url' => getProp($segment, 'last_frame_url'),
+            ];
+
+            if (isset($acts[$act_number])) {
+                $acts[$act_number]['segments'][] = $segment_info;
+            } else {
+                $acts[$act_number] = [
+                    'act_number' => $act_number,
+                    'act_title' => getProp($segment, 'act_title'),
+                    'segments' => [$segment_info]
+                ];
+            }
+        }
+        $result['acts'] = array_values($acts);
+
+        return $result;
     }
 
     public function episodeVersions($data) {