|
|
@@ -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 = '';
|
|
|
}
|