lh 1 месяц назад
Родитель
Сommit
075bf85aa4
1 измененных файлов с 64 добавлено и 34 удалено
  1. 64 34
      app/Services/DeepSeek/DeepSeekService.php

+ 64 - 34
app/Services/DeepSeek/DeepSeekService.php

@@ -9650,23 +9650,25 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                 $validation_failed = true;
                 $validation_error_msg = '未生成分镜剧本相关的内容';
             } else {
-                // 检查主体列表是否匹配 - 只验证生成的主体名是否都在预期列表中
-                $generated_roles = array_column($episode_arr['roles'], 'role');
-                // 过滤掉"旁白"角色
-                $generated_roles = array_filter($generated_roles, function($role) {
-                    return $role !== '旁白';
-                });
-                $expected_roles = array_keys($extra_roles);
-                
-                // 找出生成的主体中不在预期列表中的主体
-                $invalid_roles = array_diff($generated_roles, $expected_roles);
-                if (!empty($invalid_roles)) {
-                    $validation_failed = true;
-                    $validation_error_msg = '生成的主体列表包含不在【强制主体设定】中的主体:' . implode('、', $invalid_roles);
+                // 仅当存在强制主体设定时校验主体列表
+                if (!empty($extra_roles)) {
+                    $generated_roles = array_column($episode_arr['roles'], 'role');
+                    // 过滤掉"旁白"角色
+                    $generated_roles = array_filter($generated_roles, function($role) {
+                        return $role !== '旁白';
+                    });
+                    $expected_roles = array_keys($extra_roles);
+                    
+                    // 找出生成的主体中不在预期列表中的主体
+                    $invalid_roles = array_diff($generated_roles, $expected_roles);
+                    if (!empty($invalid_roles)) {
+                        $validation_failed = true;
+                        $validation_error_msg = '生成的主体列表包含不在【强制主体设定】中的主体:' . implode('、', $invalid_roles);
+                    }
                 }
                 
-                // 检查场景列表是否匹配 - 只验证生成的场景名是否都在预期列表中
-                if (!$validation_failed) {
+                // 仅当存在强制场景设定时校验场景列表
+                if (!$validation_failed && !empty($extra_scenes)) {
                     $generated_scenes = array_column($episode_arr['scenes'], 'scene');
                     $expected_scenes = array_keys($extra_scenes);
                     
@@ -9677,6 +9679,19 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                         $validation_error_msg = '生成的场景列表包含不在【强制场景设定】中的场景:' . implode('、', $invalid_scenes);
                     }
                 }
+
+                // 仅当存在强制道具设定时校验道具列表
+                if (!$validation_failed && !empty($extra_props)) {
+                    $generated_props = array_column($episode_arr['props'] ?? [], 'prop');
+                    $expected_props = array_keys($extra_props);
+                    
+                    // 找出生成的道具中不在预期列表中的道具
+                    $invalid_props = array_diff($generated_props, $expected_props);
+                    if (!empty($invalid_props)) {
+                        $validation_failed = true;
+                        $validation_error_msg = '生成的道具列表包含不在【强制道具设定】中的道具:' . implode('、', $invalid_props);
+                    }
+                }
             }
         } else {
             // 如果没有anime_script_id,只检查是否有acts数据
@@ -9778,22 +9793,24 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                         $validation_failed = true;
                         $validation_error_msg = '未生成分镜剧本相关的内容';
                     } else {
-                        // 检查主体列表 - 只验证生成的主体名是否都在预期列表中
-                        $generated_roles = array_column($episode_arr['roles'], 'role');
-                        // 过滤掉"旁白"角色
-                        $generated_roles = array_filter($generated_roles, function($role) {
-                            return $role !== '旁白';
-                        });
-                        $expected_roles = array_keys($extra_roles);
-                        $invalid_roles = array_diff($generated_roles, $expected_roles);
-                        
-                        if (!empty($invalid_roles)) {
-                            $validation_failed = true;
-                            $validation_error_msg = '生成的主体列表包含不在【强制主体设定】中的主体:' . implode('、', $invalid_roles);
+                        // 仅当存在强制主体设定时校验主体列表
+                        if (!empty($extra_roles)) {
+                            $generated_roles = array_column($episode_arr['roles'], 'role');
+                            // 过滤掉"旁白"角色
+                            $generated_roles = array_filter($generated_roles, function($role) {
+                                return $role !== '旁白';
+                            });
+                            $expected_roles = array_keys($extra_roles);
+                            $invalid_roles = array_diff($generated_roles, $expected_roles);
+                            
+                            if (!empty($invalid_roles)) {
+                                $validation_failed = true;
+                                $validation_error_msg = '生成的主体列表包含不在【强制主体设定】中的主体:' . implode('、', $invalid_roles);
+                            }
                         }
                         
-                        // 检查场景列表 - 只验证生成的场景名是否都在预期列表中
-                        if (!$validation_failed) {
+                        // 仅当存在强制场景设定时校验场景列表
+                        if (!$validation_failed && !empty($extra_scenes)) {
                             $generated_scenes = array_column($episode_arr['scenes'], 'scene');
                             $expected_scenes = array_keys($extra_scenes);
                             $invalid_scenes = array_diff($generated_scenes, $expected_scenes);
@@ -9803,6 +9820,18 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                                 $validation_error_msg = '生成的场景列表包含不在【强制场景设定】中的场景:' . implode('、', $invalid_scenes);
                             }
                         }
+
+                        // 仅当存在强制道具设定时校验道具列表
+                        if (!$validation_failed && !empty($extra_props)) {
+                            $generated_props = array_column($episode_arr['props'] ?? [], 'prop');
+                            $expected_props = array_keys($extra_props);
+                            $invalid_props = array_diff($generated_props, $expected_props);
+                            
+                            if (!empty($invalid_props)) {
+                                $validation_failed = true;
+                                $validation_error_msg = '生成的道具列表包含不在【强制道具设定】中的道具:' . implode('、', $invalid_props);
+                            }
+                        }
                     }
                 } else {
                     if (empty($episode_arr['acts'])) {
@@ -9819,9 +9848,14 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             }
         }
 
+        // 将生成内容中的资产合并进强制列表,保证后续数据合并包含新资产(即使没有强制列表也执行)
+        $extra_roles = $this->mergeGeneratedResources($episode_arr['roles'] ?? [], $extra_roles, 'role');
+        $extra_scenes = $this->mergeGeneratedResources($episode_arr['scenes'] ?? [], $extra_scenes, 'scene');
+        $extra_props = $this->mergeGeneratedResources($episode_arr['props'] ?? [], $extra_props, 'prop');
+
         // 最后一次重试仍校验失败时,兼容合并非强制列表中的资产,保证可以保存并返回 episodes
         if ($validation_failed && $retry_count >= $max_retries) {
-            dLog('deepseek')->info('最后一次重试仍校验失败,合并非强制列表资产后继续保存', [
+            dLog('deepseek')->info('最后一次重试仍校验失败,兼容非强制列表资产后继续保存', [
                 'retry_count' => $retry_count,
                 'last_error' => $validation_error_msg
             ]);
@@ -9830,10 +9864,6 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                 'anime_id' => $anime_id
             ]);
 
-            $extra_roles = $this->mergeGeneratedResources($episode_arr['roles'] ?? [], $extra_roles, 'role');
-            $extra_scenes = $this->mergeGeneratedResources($episode_arr['scenes'] ?? [], $extra_scenes, 'scene');
-            $extra_props = $this->mergeGeneratedResources($episode_arr['props'] ?? [], $extra_props, 'prop');
-
             $validation_failed = false;
             $validation_error_msg = '';
         }