lh 2 weeks ago
parent
commit
7357191af4
1 changed files with 24 additions and 14 deletions
  1. 24 14
      app/Services/Anime/AnimeService.php

+ 24 - 14
app/Services/Anime/AnimeService.php

@@ -10139,11 +10139,12 @@ class AnimeService
             $props = json_decode(getProp($episode, 'props'), true) ?: [];
 
             $updated = false;
-            $pendingAssets = [];
+            $waitingAssets = [];   // 任务仍在处理中,可等待后续轮询
+            $missingAssets = [];   // 无任务或任务已失败/不存在,无法通过等待自动恢复
 
-            $this->refreshEpisodeAssetsImageTasks($roles, 'role', '旁白', $pendingAssets, $updated);
-            $this->refreshEpisodeAssetsImageTasks($scenes, 'scene', '', $pendingAssets, $updated);
-            $this->refreshEpisodeAssetsImageTasks($props, 'prop', '', $pendingAssets, $updated);
+            $this->refreshEpisodeAssetsImageTasks($roles, 'role', '旁白', $waitingAssets, $missingAssets, $updated);
+            $this->refreshEpisodeAssetsImageTasks($scenes, 'scene', '', $waitingAssets, $missingAssets, $updated);
+            $this->refreshEpisodeAssetsImageTasks($props, 'prop', '', $waitingAssets, $missingAssets, $updated);
 
             // 有图片任务结果更新时写回分集表
             if ($updated) {
@@ -10156,10 +10157,15 @@ class AnimeService
             }
 
             // 所有需要图片的资产都已生成,允许继续 confirmActs 后续逻辑
-            if (empty($pendingAssets)) {
+            if (empty($waitingAssets) && empty($missingAssets)) {
                 return;
             }
 
+            // 其他任务都已处理完毕,仍有角色、场景或道具图片未生成,统一报错阻止后续逻辑
+            if (empty($waitingAssets)) {
+                Utils::throwError('20003:还有主体、场景或道具图片未生成,请等待图片生成后重试');
+            }
+
             // 超过1分钟仍未生成完毕,阻止 confirmActs 后续逻辑
             if (time() - $startTime >= $maxWaitSeconds) {
                 Utils::throwError('20003:还有主体、场景或道具图片未生成,请等待图片生成后重试');
@@ -10171,9 +10177,10 @@ class AnimeService
 
     /**
      * 参照 episodePicsInfo:遍历单个资产列表,对有图片任务但还没有图片URL的资产查询图片任务结果并回填。
-     * 任务成功但没有可用的结果URL、或任务不存在/生成失败时,直接阻止继续(抛出图片未生成的错误)。
+     * 无任务、任务不存在或生成失败的资产记录为缺失项,不在此处直接报错;
+     * 仍在处理中的任务记录为等待项,由外层统一等待所有任务完成后,再对缺失资产统一报错。
      */
-    private function refreshEpisodeAssetsImageTasks(&$assets, $nameKey, $skipName, &$pendingAssets, &$updated) {
+    private function refreshEpisodeAssetsImageTasks(&$assets, $nameKey, $skipName, &$waitingAssets, &$missingAssets, &$updated) {
         foreach ($assets as &$asset) {
             $assetName = getProp($asset, $nameKey);
             if ($assetName === '' || ($skipName !== '' && $assetName === $skipName)) {
@@ -10186,9 +10193,9 @@ class AnimeService
             }
 
             $task_id = getProp($asset, 'task_id');
-            // 没有图片任务且没有图片URL,说明图片尚未生成
+            // 没有图片任务且没有图片URL:记录为缺失项,继续遍历其他资产,待其他任务都完成后再统一报错
             if (!$task_id) {
-                $pendingAssets[] = $assetName;
+                $missingAssets[] = $assetName;
                 continue;
             }
 
@@ -10197,8 +10204,10 @@ class AnimeService
                 ->select('status', 'result_url')
                 ->first();
 
+            // 任务不存在:同样记录为缺失项,不在此处直接报错
             if (!$task) {
-                Utils::throwError('20003:还有主体、场景或道具图片未生成,请等待图片生成后重试');
+                $missingAssets[] = $assetName;
+                continue;
             }
 
             if ($task->status === 'success') {
@@ -10212,13 +10221,14 @@ class AnimeService
                         continue;
                     }
                 }
-                // 任务成功但没有可用的结果URL,仍视为未生成
-                $pendingAssets[] = $assetName;
+                // 任务成功但没有可用的结果URL,仍视为未生成,继续等待后续轮询结果
+                $waitingAssets[] = $assetName;
             } elseif ($task->status === 'failed') {
-                Utils::throwError('20003:还有主体、场景或道具图片未生成,请等待图片生成后重试');
+                // 生成失败:记录为缺失项,待其他任务处理完后统一报错
+                $missingAssets[] = $assetName;
             } else {
                 // 任务仍在生成中,等待下一次轮询
-                $pendingAssets[] = $assetName;
+                $waitingAssets[] = $assetName;
             }
         }
         unset($asset);