Procházet zdrojové kódy

1.调整创建剧集副本的逻辑,增加对话历史2.新增是否生成分镜视频的字段

lh před 3 měsíci
rodič
revize
c890ed8458
1 změnil soubory, kde provedl 50 přidání a 21 odebrání
  1. 50 21
      app/Services/Anime/AnimeService.php

+ 50 - 21
app/Services/Anime/AnimeService.php

@@ -434,6 +434,7 @@ class AnimeService
 
     public function copyEpisodeVersion($data) {
         $episode_id = getProp($data, 'episode_id');
+        $uid = Site::getUid();
 
         $episode = DB::table('mp_anime_episodes')->where('id', $episode_id)->first();
         if (!$episode) Utils::throwError('20003:该剧集不存在');
@@ -441,21 +442,19 @@ class AnimeService
         $episode = (array)$episode;
         $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;
+        $count = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('version_count', '>', 1)->count('id');
         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');
+        $now = date('Y-m-d H:i:s');
+        $episode['created_at'] = $now;
+        $episode['updated_at'] = $now;
         $episode['is_default'] = 1;
+        $episode['title'] = $count > 0 ? $episode['title']."(副本{$count})" : $episode['title']."(副本)";
+        $episode['version_count'] = $count + 2;
+        $episode['is_generated'] = 0;
 
         try {
             DB::beginTransaction();
-            // 移除is_default标志
-            $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:更新失败!');
-            }
+            DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->update(['is_default' => 0, 'updated_at'=>$now]);
 
             // 新增副本
             $new_episode_id = DB::table('mp_anime_episodes')->insertGetId($episode);
@@ -478,6 +477,35 @@ class AnimeService
             if (!$boolen2) {
                 Utils::throwError('20003:写入分镜数据失败!');
             }
+
+            // 写入对话历史
+            $records = [
+                [
+                    'uid' => $uid,
+                    'anime_id' => $anime_id,
+                    'role' => 'user',
+                    'content' => '创建副本',
+                    'sequence' => $episode_number,
+                    'episode_id' => $new_episode_id,
+                    'created_at' => $now,
+                    'updated_at' => $now
+                ],
+                [
+                    'uid' => $uid,
+                    'anime_id' => $anime_id,
+                    'role' => 'assistant',
+                    'content' => '好的,已为您创建副本',
+                    'sequence' => $episode_number,
+                    'episode_id' => $new_episode_id,
+                    'created_at' => $now,
+                    'updated_at' => $now
+                ]
+            ];
+            $boolen3 = DB::table('mp_anime_records')->insert($records);
+            if (!$boolen3) {
+                Utils::throwError('20003:对话记录保存失败');
+            }
+            
         }catch (\Exception $e) {
             DB::rollBack();
             Utils::throwError('20003:'.$e->getMessage());
@@ -495,6 +523,7 @@ class AnimeService
             'art_style' => $episode['art_style'],
             'roles' => json_decode($episode['roles'], true),
             'scenes' => json_decode($episode['scenes'], true),
+            'is_generated' => (int)$episode['is_generated']
         ];
 
         // 复用已有的分镜数据,按 act 分组(避免重复查询数据库)
@@ -556,7 +585,7 @@ class AnimeService
         })->toArray();
         if (!$episodes) Utils::throwError('20003:该剧集不存在!');
         foreach($episodes as &$episode) {
-            $episode['version'] = 'V'.$episode['sequence'];
+            $episode['version'] = 'V'.$episode['version_count'];
             $episode['roles'] = json_decode($episode['roles'], true);
             $episode['scenes'] = json_decode($episode['scenes'], true);
         }
@@ -914,7 +943,7 @@ class AnimeService
         // 获取所有分镜信息
         $segments = DB::table('mp_episode_segments')
             ->where('anime_id', $anime_id)
-            ->where('episode_id', $episode->episode_id)
+            ->where('episode_id', $episode_id)
             ->whereNotIn('pic_task_status', ['已完成', '生成中'])
             ->orderBy('segment_number')
             ->get()
@@ -1081,15 +1110,15 @@ class AnimeService
             }
         }
 
-        // // 更新剧集生成状态
-        // if (!empty($updated_segments)) {
-        //     DB::table('mp_anime_episodes')
-        //         ->where('id', $episode->episode_id)
-        //         ->update([
-        //             'generate_status' => '执行中',
-        //             'updated_at' => date('Y-m-d H:i:s')
-        //         ]);
-        // }
+        // 更新剧集生成状态
+        if (!empty($updated_segments)) {
+            DB::table('mp_anime_episodes')
+                ->where('id', $episode_id)
+                ->update([
+                    'is_generated' => 1,
+                    'updated_at' => date('Y-m-d H:i:s')
+                ]);
+        }
 
         return [
             'success_count' => count($updated_segments),