Selaa lähdekoodia

调整剧本管理数据结构,分集内容改为text文本而不是分组

lh 2 kuukautta sitten
vanhempi
commit
a0946b36d8

+ 9 - 2
app/Http/Controllers/DeepSeek/DeepSeekController.php

@@ -486,10 +486,17 @@ class DeepSeekController extends BaseController
         ]);
     }
 
+    public function getEpisodeContent(Request $request) {
+        $data = $request->all();
+        $result = $this->deepseekService->getEpisodeContent($data);
+
+        return $this->success($result);
+    }
+
     // 保存剧本
-    public function saveScript(Request $request) {
+    public function saveEpisodeContent(Request $request) {
         $data = $request->all();
-        $result = $this->deepseekService->saveScript($data);
+        $result = $this->deepseekService->saveEpisodeContent($data);
         return $this->success(['success'=>$result ? 1 : 0]);
     }
 

+ 132 - 56
app/Services/DeepSeek/DeepSeekService.php

@@ -1323,28 +1323,19 @@ class DeepSeekService
     public function scriptInfo($data) {
         $script_id = getProp($data, 'script_id');
         $script = DB::table('mp_scripts')->where('id', $script_id)->where('is_deleted', 0)
-        ->selectRaw('id as script_id, script_name, intro, highlights, roles, role_relationship, core_contradiction, art_style, scenes, status, start_episode_sequence, end_episode_sequence, episode_num, remark, created_at')->first();
+        // ->selectRaw('id as script_id, script_name, intro, highlights, roles, role_relationship, core_contradiction, art_style, scenes, status, start_episode_sequence, end_episode_sequence, episode_num, remark, created_at')->first();
+        ->selectRaw('id as script_id, script_name')->first();
         if (!$script) Utils::throwError('20003:该剧本不存在!');
         $script = (array)$script;
-        $script['roles'] = json_decode($script['roles']);
-        $script['scenes'] = json_decode($script['scenes']);
 
         // 获取分集组信息
         $groups = DB::table('mp_script_episode_group')->where('script_id', $script_id)
-        ->select('id as group_id', 'script_id', 'group_name', 'start_episode_number', 'end_episode_number')
-        ->orderBy('start_episode_number')->get()->map(function ($value) {
+        ->selectRaw('id as group_id, script_id, group_name, start_episode_number, end_episode_number, intro, highlights, roles, role_relationship, core_contradiction, art_style, scenes, status, episode_content')
+        ->orderBy('start_episode_number')->orderBy('id')->get()->map(function ($value) {
+            $value = (array)$value;
+            $value['episode_content'] = mb_substr($value['episode_content'], 0, 200);
             return (array)$value;
         })->toArray();
-
-        foreach($groups as &$group) {
-            $script_id = getProp($group, 'script_id');
-            // 获取2个分集
-            $episode_list = DB::table('mp_script_episodes')->where('script_id', $script_id)->whereBetween('episode_number', [$group['start_episode_number'], $group['end_episode_number']])
-            ->select('episode_number', 'episode_name', 'episode_content')->orderBy('episode_number')->limit(2)->get()->map(function ($value) {
-                return (array)$value;
-            })->toArray();
-            $group['episodes'] = $episode_list;
-        }
         $script['group'] = $groups;
         return $script;
     }
@@ -1483,8 +1474,36 @@ class DeepSeekService
             Utils::throwError('20003:该模型不存在!');
         }
 
-        $exists_sequence_arr = DB::table('mp_script_episodes')->where('script_id', $script_id)->whereBetween('episode_number', [$start_episode_sequence, $end_episode_sequence])->pluck('episode_number')->toArray();
-        if ($exists_sequence_arr) Utils::throwError('20003:剧集 '.implode('、', $exists_sequence_arr).' 已存在,不得创建!');
+        // 检查是否存在重叠的剧集序号范围
+        $exists_groups = DB::table('mp_script_episode_group')
+            ->where('script_id', $script_id)
+            ->where('id', '<>', $group_id) // 排除当前组
+            ->where(function($query) use ($start_episode_sequence, $end_episode_sequence) {
+                // 检查新范围是否与现有范围重叠
+                $query->where(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围的开始在现有范围内
+                    $q->where('start_episode_number', '<=', $start_episode_sequence)
+                      ->where('end_episode_number', '>=', $start_episode_sequence);
+                })->orWhere(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围的结束在现有范围内
+                    $q->where('start_episode_number', '<=', $end_episode_sequence)
+                      ->where('end_episode_number', '>=', $end_episode_sequence);
+                })->orWhere(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围完全包含现有范围
+                    $q->where('start_episode_number', '>=', $start_episode_sequence)
+                      ->where('end_episode_number', '<=', $end_episode_sequence);
+                });
+            })
+            ->select('start_episode_number', 'end_episode_number')
+            ->get();
+        
+        if ($exists_groups->isNotEmpty()) {
+            $conflict_ranges = [];
+            foreach ($exists_groups as $group) {
+                $conflict_ranges[] = "第{$group->start_episode_number}-{$group->end_episode_number}集";
+            }
+            Utils::throwError('20003:剧集序号范围与已存在的剧集组重叠: '.implode('、', $conflict_ranges).',不得创建!');
+        }
 
         // 模型兼容性处理:deepseek-chat 和 deepseek-reasoner 映射到 deepseek-v4-flash
         $thinkingMode = getProp($data, 'thinking', 'disabled'); // 默认非思考模式
@@ -1504,7 +1523,7 @@ class DeepSeekService
         if (!$script) {
             Utils::throwError('20003:剧本不存在');
         }
-        $content = getProp($script, 'content');
+        $content = getProp($group, 'content');
 
         if (!$file && !$content && !$bid) {
             Utils::throwError('20003:请上传文件或选择书籍或输入内容');
@@ -1603,38 +1622,44 @@ class DeepSeekService
 
         try {
             DB::beginTransaction();
-            // 返回前保存剧本内容
-            $boolen = DB::table('mp_scripts')->where('id', $script_id)->update([
-                'content' => $content,
-                'updated_at' => date('Y-m-d H:i:s')
-            ]);
-            if (!$boolen) {
-                Utils::throwError('20003:保存剧本内容失败');
-            }
+            // // 返回前保存剧本内容
+            // $boolen = DB::table('mp_scripts')->where('id', $script_id)->update([
+            //     'content' => $content,
+            //     'updated_at' => date('Y-m-d H:i:s')
+            // ]);
+            // if (!$boolen) {
+            //     Utils::throwError('20003:保存剧本内容失败');
+            // }
 
-            $boolen1 = DB::table('mp_script_episode_group')->where('id', $group_id)->update([
-                'start_episode_number'  => $start_episode_sequence,
-                'end_episode_number'    => $end_episode_sequence,
-                'updated_at'            => date('Y-m-d H:i:s')
-            ]);
-            if (!$boolen1) {
-                Utils::throwError('20003:保存分集失败');
-            }
+            // $boolen1 = DB::table('mp_script_episode_group')->where('id', $group_id)->update([
+            //     'start_episode_number'  => $start_episode_sequence,
+            //     'end_episode_number'    => $end_episode_sequence,
+            //     'updated_at'            => date('Y-m-d H:i:s')
+            // ]);
+            // if (!$boolen1) {
+            //     Utils::throwError('20003:保存分集失败');
+            // }
+
+            $episode_content = '';
 
             $episodes = [];
             foreach ($script_arr['episodes'] as $item) {
-                $episodes[] = [
-                    'script_id' => $script_id,
-                    'episode_number' => $item['episode_number'],
-                    'episode_name' => $item['episode_name'],
-                    'episode_content' => $item['episode_content'],
-                    'created_at' => date('Y-m-d H:i:s'),
-                    'updated_at' => date('Y-m-d H:i:s'),
-                ];
+                $episode_content .= "\u{200D}\u{200D}\u{200D}" . $item['episode_content'] . "\r\n\r\n";
+                // $episodes[] = [
+                //     'script_id' => $script_id,
+                //     'episode_number' => $item['episode_number'],
+                //     'episode_name' => $item['episode_name'],
+                //     'episode_content' => $item['episode_content'],
+                //     'created_at' => date('Y-m-d H:i:s'),
+                //     'updated_at' => date('Y-m-d H:i:s'),
+                // ];
             }
 
-            if ($episodes) {
-                $boolen2 = DB::table('mp_script_episodes')->insert($episodes);
+            if ($episode_content) {
+                $boolen2 = DB::table('mp_script_episode_group')->where('id', $group_id)->update([
+                    'episode_content'   => $episode_content,
+                    'updated_at'        => date('Y-m-d H:i:s')
+                ]);
                 if (!$boolen2) {
                     Utils::throwError('20003:保存分集内容失败');
                 }
@@ -1672,8 +1697,35 @@ class DeepSeekService
             Utils::throwError('20003:该模型不存在!');
         }
 
-        $exists_sequence_arr = DB::table('mp_script_episodes')->where('script_id', $script_id)->whereBetween('episode_number', [$start_episode_sequence, $end_episode_sequence])->pluck('episode_number')->toArray();
-        if ($exists_sequence_arr) Utils::throwError('20003:剧集 '.implode('、', $exists_sequence_arr).' 已存在,不得创建!');
+        // 检查是否存在重叠的剧集序号范围
+        $exists_groups = DB::table('mp_script_episode_group')
+            ->where('script_id', $script_id)
+            ->where(function($query) use ($start_episode_sequence, $end_episode_sequence) {
+                // 检查新范围是否与现有范围重叠
+                $query->where(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围的开始在现有范围内
+                    $q->where('start_episode_number', '<=', $start_episode_sequence)
+                      ->where('end_episode_number', '>=', $start_episode_sequence);
+                })->orWhere(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围的结束在现有范围内
+                    $q->where('start_episode_number', '<=', $end_episode_sequence)
+                      ->where('end_episode_number', '>=', $end_episode_sequence);
+                })->orWhere(function($q) use ($start_episode_sequence, $end_episode_sequence) {
+                    // 新范围完全包含现有范围
+                    $q->where('start_episode_number', '>=', $start_episode_sequence)
+                      ->where('end_episode_number', '<=', $end_episode_sequence);
+                });
+            })
+            ->select('start_episode_number', 'end_episode_number')
+            ->get();
+        
+        if ($exists_groups->isNotEmpty()) {
+            $conflict_ranges = [];
+            foreach ($exists_groups as $group) {
+                $conflict_ranges[] = "第{$group->start_episode_number}-{$group->end_episode_number}集";
+            }
+            Utils::throwError('20003:剧集序号范围与已存在的剧集组重叠: '.implode('、', $conflict_ranges).',不得创建!');
+        }
 
         // 模型兼容性处理:deepseek-chat 和 deepseek-reasoner 映射到 deepseek-v4-flash
         $thinkingMode = getProp($data, 'thinking', 'disabled'); // 默认非思考模式
@@ -1839,19 +1891,28 @@ class DeepSeekService
 
         try {
             DB::beginTransaction();
-            // 返回前保存剧本内容
-            $boolen = DB::table('mp_scripts')->where('id', $script_id)->update([
-                'content' => $content,
-                'status'  => '解析完成',
-                'updated_at' => date('Y-m-d H:i:s')
-            ]);
-            if (!$boolen) {
-                Utils::throwError('20003:保存剧本内容失败');
-            }
+            // // 返回前保存剧本内容
+            // $boolen = DB::table('mp_scripts')->where('id', $script_id)->update([
+            //     'content' => $content,
+            //     'status'  => '解析完成',
+            //     'updated_at' => date('Y-m-d H:i:s')
+            // ]);
+            // if (!$boolen) {
+            //     Utils::throwError('20003:保存剧本内容失败');
+            // }
 
             $boolen1 = DB::table('mp_script_episode_group')->where('id', $group_id)->update([
                 'start_episode_number'  => $start_episode_sequence,
                 'end_episode_number'    => $end_episode_sequence,
+                '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' => '解析完成',
+                'content' => $content,
                 'updated_at'            => date('Y-m-d H:i:s')
             ]);
             if (!$boolen1) {
@@ -2024,7 +2085,22 @@ class DeepSeekService
         ];
     }
 
-    public function saveScript($data) {
+    public function getEpisodeContent($data) {
+        $group_id = getProp($data, 'group_id');
+
+        return DB::table('mp_script_episode_group')->where('id', $group_id)->value('episode_content');
+    }
+
+    public function saveEpisodeContent($data) {
+        $group_id = getProp($data, 'group_id');
+        $episode_content = getProp($data, 'episode_content');
+
+        return DB::table('mp_script_episode_group')->where('id', $group_id)->update([
+            'content'       => $episode_content,
+            'updated_at'    => date('Y-m-d H:i:s')
+        ]);
+
+
         $script_arr =getProp($data, 'script', []);
         if (!$script_arr) Utils::throwError('20003:剧本内容不能为空');
         $start_episode_sequence = getProp($data, 'start_episode_sequence', 1);

+ 4 - 5
app/Transformer/DeepSeek/DeepSeekTransformer.php

@@ -25,17 +25,16 @@ class DeepSeekTransformer
             $script_id = getProp($item, 'id');
 
             // 获取分集信息
-            $episodes = DB::table('mp_script_episodes')->where('script_id', $script_id)->orderBy('episode_number')->select('episode_name', 'episode_number', 'episode_content')->limit(2)->get()->map(function ($value) {
-                return (array)$value;
-            })->toArray();
+            $episode_content = DB::table('mp_script_episode_group')->where('script_id', $script_id)->orderBy('start_episode_number')->orderBy('id')->value('episode_content');
+            $episode_content = mb_substr($episode_content, 0, 200);
             $result[] = [
                 'user_id'               => getProp($item, 'user_id'),
                 'script_id'             => $script_id,
                 'script_name'           => getProp($item, 'script_name'),
-                'status'                => getProp($item, 'status'),
+                // 'status'                => getProp($item, 'status'),
                 'created_at'            => transDate(getProp($item, 'created_at')),
                 'updated_at'            => transDate(getProp($item, 'updated_at')),
-                'episodes'              => $episodes,
+                'episode_content'       => $episode_content,
             ];
         }
 

+ 2 - 1
routes/api.php

@@ -106,7 +106,8 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::post('chatWithFile', [DeepSeekController::class, 'chatWithFile']);
         Route::post('chatWithFileStream', [DeepSeekController::class, 'chatWithFileStream']);
         Route::post('generateEpisodes', [DeepSeekController::class, 'generateEpisodes']);
-        Route::post('saveScript', [DeepSeekController::class, 'saveScript']);
+        Route::get('getEpisodeContent', [DeepSeekController::class, 'getEpisodeContent']);
+        Route::post('saveEpisodeContent', [DeepSeekController::class, 'saveEpisodeContent']);
     });
 
     // AI生成