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

+ 61 - 21
app/Services/DeepSeek/DeepSeekService.php

@@ -2857,8 +2857,8 @@ class DeepSeekService
         $generated_scenes = isset($episode_arr['scenes']) && is_array($episode_arr['scenes']) ? $episode_arr['scenes'] : [];
         $merged_roles = $this->mergeEpisodeResourceItems($existing_roles, $generated_roles, 'role');
         $merged_scenes = $this->mergeEpisodeResourceItems($existing_scenes, $generated_scenes, 'scene');
-        dLog('deepseek')->info('修改后的数据: ', [$merged_roles, $merged_scenes]);
-        exit();
+        // dLog('deepseek')->info('修改后的数据: ', [$existing_roles, $generated_roles, $merged_roles]);
+        // exit();
         $now = date('Y-m-d H:i:s');
 
         try {
@@ -3104,33 +3104,65 @@ class DeepSeekService
                     continue;
                 }
 
-                if (!$this->isEpisodeResourceChanged($existingMap[$itemKey], $item, $nameKey)) {
-                    $merged[] = $existingMap[$itemKey];
-                    continue;
-                }
-            }
-
-            // 重置资源项,并尝试从现有项中继承URL
-            $resetItem = $this->resetEpisodeResourceItem($item, $nameKey);
-            
-            // 如果现有项存在且有URL,而生成项没有URL,则继承现有URL
-            if (isset($existingMap[$itemKey])) {
-                $existingUrl = getProp($existingMap[$itemKey], 'url');
-                $generatedUrl = getProp($item, 'url');
+                // 检查内容是否发生变化
+                $isChanged = $this->isEpisodeResourceChanged($existingMap[$itemKey], $item, $nameKey);
                 
-                // 条件:1.现有URL存在 2.生成URL不存在 3.名称和描述一致(已通过itemKey和上面的逻辑保证)
-                if (!empty($existingUrl) && empty($generatedUrl)) {
-                    $resetItem['url'] = $existingUrl;
+                if (!$isChanged) {
+                    // nameKey 和 description 一致,继承现有项的 URL
+                    $mergedItem = [
+                        $nameKey => trim((string)getProp($item, $nameKey)),
+                        'description' => trim((string)getProp($item, 'description')),
+                    ];
+                    
+                    // 继承现有项的 URL
+                    $existingUrl = getProp($existingMap[$itemKey], 'url');
+                    if (!empty($existingUrl)) {
+                        $mergedItem['url'] = $existingUrl;
+                    }
+                    
+                    // 保留生成项的音色字段
+                    $timbreName = getProp($item, 'timbre_name');
+                    if (!empty($timbreName)) {
+                        $mergedItem['timbre_name'] = $timbreName;
+                    }
+                    
+                    $timbreType = getProp($item, 'timbre_type');
+                    if (!empty($timbreType)) {
+                        $mergedItem['timbre_type'] = $timbreType;
+                    }
+                    
+                    $merged[] = $mergedItem;
+                } else {
+                    // nameKey 或 description 不一致,重置 URL 但保留音色字段
+                    $mergedItem = [
+                        $nameKey => trim((string)getProp($item, $nameKey)),
+                        'description' => trim((string)getProp($item, 'description')),
+                    ];
+                    
+                    // 保留生成项的音色字段
+                    $timbreName = getProp($item, 'timbre_name');
+                    if (!empty($timbreName)) {
+                        $mergedItem['timbre_name'] = $timbreName;
+                    }
+                    
+                    $timbreType = getProp($item, 'timbre_type');
+                    if (!empty($timbreType)) {
+                        $mergedItem['timbre_type'] = $timbreType;
+                    }
+                    
+                    // 不继承 URL(重置状态)
+                    $merged[] = $mergedItem;
                 }
+            } else {
+                // 新增项,保留生成项的所有字段
+                $merged[] = $this->resetEpisodeResourceItem($item, $nameKey, ['timbre_name', 'timbre_type']);
             }
-
-            $merged[] = $resetItem;
         }
 
         return $merged ?: array_values($existingItems);
     }
 
-    private function resetEpisodeResourceItem(array $item, string $nameKey): array
+    private function resetEpisodeResourceItem(array $item, string $nameKey, array $preserveFields = []): array
     {
         $resetItem = [
             $nameKey => trim((string)getProp($item, $nameKey)),
@@ -3143,6 +3175,14 @@ class DeepSeekService
             $resetItem['url'] = $url;
         }
         
+        // 保留指定的字段
+        foreach ($preserveFields as $field) {
+            $value = getProp($item, $field);
+            if (!empty($value)) {
+                $resetItem[$field] = $value;
+            }
+        }
+        
         return $resetItem;
     }