lh 2 месяцев назад
Родитель
Сommit
9863b583cd
1 измененных файлов с 45 добавлено и 7 удалено
  1. 45 7
      app/Services/DeepSeek/DeepSeekService.php

+ 45 - 7
app/Services/DeepSeek/DeepSeekService.php

@@ -40,7 +40,7 @@ class DeepSeekService
         $this->valid_text_models = DB::table('mp_text_models')->where('is_enabled', 1)->pluck('model')->toArray();
         $this->sys_message = [
                 'role'    => 'system',
-                'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表><分集剧本>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+                'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表><分集剧本>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                 强制要求:\n
                 1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                 2.用户如果直接给了你一本小说或者要求你帮忙写一个故事或者剧本,此类要求不属于与剧本无关,请帮助用户完成请求
@@ -1790,7 +1790,7 @@ class DeepSeekService
         $messages = [
             [
                 'role'    => 'system',
-                'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+                'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                 强制要求:\n
                 1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                 2.用户如果直接给了你一本小说或者要求你帮忙写一个故事或者剧本,此类要求不属于与剧本无关,请帮助用户完成请求
@@ -2109,11 +2109,49 @@ class DeepSeekService
     }
 
     public function saveEpisodeContent($data) {
+        $script_id = getProp($data, 'script_id');
         $group_id = getProp($data, 'group_id');
+        $start_episode_sequence = getProp($data, 'start_episode_number');
+        $end_episode_sequence = getProp($data, 'end_episode_number');
+
+        // 检查是否存在重叠的剧集序号范围
+        $exists_groups = DB::table('mp_script_episode_group')
+            ->where('script_id', $script_id)
+            ->where('id', '<>', $group_id) // 排除当前组
+            ->where('is_deleted', 0)
+            ->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).',不得创建!');
+        }
+
         $episode_content = getProp($data, 'episode_content');
 
-        return DB::table('mp_script_episode_group')->where('id', $group_id)->update([
+        return DB::table('mp_script_episode_group')->where('id', $group_id)->where('script_id', $script_id)->update([
             'content'       => $episode_content,
+            'start_episode_number'  => $start_episode_sequence,
+            'end_episode_number'  => $end_episode_sequence,
             'updated_at'    => date('Y-m-d H:i:s')
         ]);
 
@@ -2813,7 +2851,7 @@ class DeepSeekService
 画面类型:普通画面
 尾帧描述:固定镜头。光影在火车票表面微微晃动,强调其陈旧的纸张纹理与关键的行程信息。\n
             "
-            : "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+            : "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                 强制要求:\n
                 1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                 2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答
@@ -3442,7 +3480,7 @@ class DeepSeekService
 画面类型:普通画面
 尾帧描述:固定镜头。光影在火车票表面微微晃动,强调其陈旧的纸张纹理与关键的行程信息。\n
             "
-            : "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+            : "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                 强制要求:\n
                 1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                 2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答
@@ -3504,7 +3542,7 @@ class DeepSeekService
             $question = "请根据实例格式完成{$episode_count}集剧本大纲";
             $system_message = [
                     'role'    => 'system',
-                    'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表><分集详细内容>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+                    'content' => "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容及下面提供的示例格式完成剧本大纲(需通过以下几个板块进行回复: <故事梗概><剧本亮点><人物关系><核心矛盾><主体列表><美术风格><场景列表><分集详细内容>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                     强制要求:\n
                     1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                     2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答
@@ -3981,7 +4019,7 @@ class DeepSeekService
         }
 
         $prompt = trim((string)getProp($data, 'prompt', '确认分镜大纲'));
-        $demo = "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需包含以下几个板块: <剧集标题><故事梗概><美术风格><主体列表><场景列表><分镜剧本>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
+        $demo = "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需包含以下几个板块: <剧集标题><故事梗概><美术风格><主体列表><场景列表><分镜剧本>,每个板块之间必须使用###分隔,#不能多也不能少;同时板块之间需满足以下要求:\n
                     强制要求:
                     1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
                     2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答