lh 2 meses atrás
pai
commit
965b2af01d

+ 58 - 2
app/Http/Controllers/AIGeneration/ImageGenerationController.php

@@ -256,7 +256,8 @@ class ImageGenerationController extends BaseController
      */
      */
     public function batchUploadImg(Request $request) {
     public function batchUploadImg(Request $request) {
         $refImgUrls = [];
         $refImgUrls = [];
-        // 处理上传的图片
+        
+        // 处理上传的文件
         if ($request->hasFile('ref_img_file')) {
         if ($request->hasFile('ref_img_file')) {
             $refImgFiles = is_array($request->file('ref_img_file')) 
             $refImgFiles = is_array($request->file('ref_img_file')) 
                 ? $request->file('ref_img_file') 
                 ? $request->file('ref_img_file') 
@@ -287,7 +288,62 @@ class ImageGenerationController extends BaseController
                 }
                 }
                 $refImgUrls[] = $uploaded_url;
                 $refImgUrls[] = $uploaded_url;
             }
             }
-
+        }
+        
+        // 处理二进制内容(ref_img数组)
+        if ($request->has('ref_img')) {
+            $refImgs = $request->input('ref_img');
+            
+            // 确保是数组格式
+            if (!is_array($refImgs)) {
+                $refImgs = [$refImgs];
+            }
+            
+            foreach ($refImgs as $index => $refImgBinary) {
+                $tempFile = null;
+                $tempPath = null;
+                
+                try {
+                    // 解码base64(如果是base64格式)
+                    if (preg_match('/^data:image\/(\w+);base64,/', $refImgBinary, $matches)) {
+                        $refImgBinary = base64_decode(substr($refImgBinary, strpos($refImgBinary, ',') + 1));
+                    }
+                    
+                    // 创建临时文件以验证图片
+                    $tempFile = tmpfile();
+                    $tempPath = stream_get_meta_data($tempFile)['uri'];
+                    fwrite($tempFile, $refImgBinary);
+                    
+                    // 验证图片分辨率和比例
+                    $refImgInfo = @getimagesize($tempPath);
+                    
+                    if (!$refImgInfo) {
+                        Utils::throwError('1003:图片' . ($index + 1) . '格式无效');
+                    }
+                    
+                    $refImg = [
+                        'width' => $refImgInfo[0],
+                        'height' => $refImgInfo[1],
+                        'size' => strlen($refImgBinary),
+                    ];
+                    
+                    // 验证图片规格
+                    $this->validateImageSpecs($refImg, $index + 1);
+                    
+                    // 上传图片到服务器并获取URL(默认使用.jpg格式)
+                    $filename = randStr(10) . '.jpg';
+                    $uploaded_url = uploadStreamByTos('image', $refImgBinary, $filename);
+                    if (!$uploaded_url) {
+                        Utils::throwError('1003:图片' . ($index + 1) . '保存失败');
+                    }
+                    $refImgUrls[] = $uploaded_url;
+                } finally {
+                    // 确保临时文件被关闭和删除
+                    if ($tempFile) {
+                        fclose($tempFile);
+                    }
+                }
+            }
         }
         }
 
 
         return $this->success(['image_urls' => $refImgUrls]);
         return $this->success(['image_urls' => $refImgUrls]);

+ 63 - 39
app/Services/DeepSeek/DeepSeekService.php

@@ -1396,19 +1396,19 @@ class DeepSeekService
 
 
     public function createEpisode($data) {
     public function createEpisode($data) {
         $script_id = getProp($data, 'script_id');
         $script_id = getProp($data, 'script_id');
-        $episode_name = getProp($data, 'episode_name');
+        $group_name = getProp($data, 'group_name');
         $remark = getProp($data, 'remark');
         $remark = getProp($data, 'remark');
         
         
         $uid = Site::getUid(); // 获取当前用户ID
         $uid = Site::getUid(); // 获取当前用户ID
-        if (!$episode_name) Utils::throwError('20003:分集名称不能为空');
+        if (!$group_name) Utils::throwError('20003:分集名称不能为空');
 
 
-        if (DB::table('mp_script_episode_group')->where('episode_name', $episode_name)->exists()) {
-            $episode_name .= '_'.date('YmdHis');
+        if (DB::table('mp_script_episode_group')->where('group_name', $group_name)->exists()) {
+            $group_name .= '_'.date('YmdHis');
         }
         }
 
 
         return DB::table('mp_script_episode_group')->insertGetId([
         return DB::table('mp_script_episode_group')->insertGetId([
             'script_id'   => $script_id,
             'script_id'   => $script_id,
-            'episode_name' => $episode_name,
+            'group_name' => $group_name,
             'user_id'     => $uid,
             'user_id'     => $uid,
             'remark'      => $remark,
             'remark'      => $remark,
             'created_at'  => date('Y-m-d H:i:s'),
             'created_at'  => date('Y-m-d H:i:s'),
@@ -1420,17 +1420,17 @@ class DeepSeekService
         $group_id = getProp($data, 'group_id');
         $group_id = getProp($data, 'group_id');
         $start_episode_number = getProp($data, 'start_episode_number');
         $start_episode_number = getProp($data, 'start_episode_number');
         $end_episode_number = getProp($data, 'end_episode_number');
         $end_episode_number = getProp($data, 'end_episode_number');
-        $episode_name = getProp($data, 'episode_name');
+        $group_name = getProp($data, 'group_name');
         $uid = Site::getUid(); // 获取当前用户ID
         $uid = Site::getUid(); // 获取当前用户ID
-        if (!$group_id || !$episode_name || !$start_episode_number || !$end_episode_number) Utils::throwError('20003:参数异常');
+        if (!$group_id || !$group_name || !$start_episode_number || !$end_episode_number) Utils::throwError('20003:参数异常');
 
 
-        $id = DB::table('mp_script_episode_group')->where('episode_name', $episode_name)->value('id');
+        $id = DB::table('mp_script_episode_group')->where('group_name', $group_name)->value('id');
         if ((int)$id != (int)$group_id) {
         if ((int)$id != (int)$group_id) {
-            $episode_name .= '_'.date('YmdHis');
+            $group_name .= '_'.date('YmdHis');
         }
         }
 
 
         return DB::table('mp_script_episode_group')->where('id', $group_id)->update([
         return DB::table('mp_script_episode_group')->where('id', $group_id)->update([
-            'episode_name' => $episode_name,
+            'group_name' => $group_name,
             'start_episode_number' => $start_episode_number,
             'start_episode_number' => $start_episode_number,
             'end_episode_number' => $end_episode_number,
             'end_episode_number' => $end_episode_number,
             'updated_at'  => date('Y-m-d H:i:s')
             'updated_at'  => date('Y-m-d H:i:s')
@@ -1851,11 +1851,40 @@ class DeepSeekService
     }
     }
 
 
     public function exportScript($data) {
     public function exportScript($data) {
-        $script = $this->scriptInfo($data);
+        $filename = getProp($data, 'filename');
+        $script_id = getProp($data, 'script_id');
+        $group_id = getProp($data, 'group_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();
+        if (!$script) Utils::throwError('20003:该剧本不存在!');
+        $script = (array)$script;
+        $script['roles'] = json_decode($script['roles']);
+        $script['scenes'] = json_decode($script['scenes']);
+        $start = 1;
+        $end = DB::table('mp_script_episodes')->where('script_id', $script_id)->count('id');
+
+        // 获取分集组信息
+        if ($group_id) {
+            $group = DB::table('mp_script_episode_group')->where('script_id', $script_id)->where('id', $group_id)
+            ->select('start_episode_number', 'end_episode_number')->first();
+            if (!$group) Utils::throwError('20003:分集不存在');
+
+            $start = getProp($group, 'start_episode_number');
+            $end = getProp($group, 'end_episode_number');
+        }
+
+        // 获取分集信息
+        $episode_list = DB::table('mp_script_episodes')->where('script_id', $script_id)->whereBetween('episode_number', [$start, $end])
+        ->select('episode_number', 'episode_name', 'episode_content')->orderBy('episode_number')->get()->map(function ($value) {
+            return (array)$value;
+        })->toArray();
+        $script['episodes'] = $episode_list;
+
         $export_type = getProp($data, 'export_type', 'txt');
         $export_type = getProp($data, 'export_type', 'txt');
         
         
         // 生成文件名
         // 生成文件名
-        $filename = $script['script_name'] . '_' . date('YmdHis');
+        $filename = $filename ? $filename : $script['script_name'] . '_' . date('YmdHis');
         
         
         // 根据导出类型生成不同格式的文件
         // 根据导出类型生成不同格式的文件
         switch ($export_type) {
         switch ($export_type) {
@@ -2005,23 +2034,25 @@ class DeepSeekService
             foreach ($script['episodes'] as $episode) {
             foreach ($script['episodes'] as $episode) {
                 $html .= '<div class="episode">';
                 $html .= '<div class="episode">';
                 $html .= '<h3>第' . htmlspecialchars($episode['episode_number']) . '集';
                 $html .= '<h3>第' . htmlspecialchars($episode['episode_number']) . '集';
-                if (!empty($episode['title'])) {
-                    $html .= ':' . htmlspecialchars($episode['title']);
+                if (!empty($episode['episode_name'])) {
+                    $html .= ':' . htmlspecialchars($episode['episode_name']);
                 }
                 }
                 $html .= '</h3>';
                 $html .= '</h3>';
-                
-                // 处理分内容
-                if (!empty($episode['segments']) && is_array($episode['segments'])) {
-                    foreach ($episode['segments'] as $segment) {
-                        if (!empty($segment['segment_content'])) {
-                            $html .= '<div class="segment">';
-                            if (!empty($segment['segment_number'])) {
-                                $html .= '<strong>第' . htmlspecialchars($segment['segment_number']) . '段</strong><br>';
-                            }
-                            $html .= nl2br(htmlspecialchars($segment['segment_content']));
-                            $html .= '</div>';
-                        }
+
+                // 处理分内容
+                if (!empty($episode['episode_content'])) {
+                    $html .= '<div class="segment">';
+                    // 去掉第一行(标题行)
+                    $content = $episode['episode_content'];
+                    $lines = explode("\n", $content);
+                    if (count($lines) > 1) {
+                        array_shift($lines); // 移除第一行
+                        $content = implode("\n", $lines);
+                    } else {
+                        $content = ''; // 如果只有一行,则清空
                     }
                     }
+                    $html .= nl2br(htmlspecialchars($content));
+                    $html .= '</div>';
                 }
                 }
                 
                 
                 $html .= '</div>';
                 $html .= '</div>';
@@ -2219,19 +2250,12 @@ class DeepSeekService
         if (!empty($script['episodes']) && is_array($script['episodes'])) {
         if (!empty($script['episodes']) && is_array($script['episodes'])) {
             $content .= "###分集剧本\n";
             $content .= "###分集剧本\n";
             foreach ($script['episodes'] as $episode) {
             foreach ($script['episodes'] as $episode) {
-                $content .= "##分集" . $episode['episode_number'] . "\n分集名";
-                if (!empty($episode['title'])) {
-                    $content .= ":" . $episode['title'];
-                }
-                $content .= "\n";
-                
-                // 处理分镜
-                if (!empty($episode['segments']) && is_array($episode['segments'])) {
-                    foreach ($episode['segments'] as $segment) {
-                        $content .= "分镜" . $episode['episode_number'] . '-' . $segment['segment_number'] . "\n";
-                        $content .= $segment['segment_content'] . "\n\n";
-                    }
-                }
+                // $content .= "##分集" . $episode['episode_number'] . "\n分集名";
+                // if (!empty($episode['episode_name'])) {
+                //     $content .= ":" . $episode['episode_name'];
+                // }
+                // $content .= "\n";
+                $content .= $episode['episode_content'] . "\n\n";
             }
             }
         }
         }