Просмотр исходного кода

定时任务增加保底检查机制,防止调用过程中出现意外任务

lh 3 месяцев назад
Родитель
Сommit
7e6c8ffefb

+ 126 - 0
app/Console/Commands/CheckImageGenerationTasksCommand.php

@@ -78,6 +78,10 @@ class CheckImageGenerationTasksCommand extends Command
             }
             
             dLog('generate')->info('任务状态检查完成');
+            
+            // 更新分镜表中的图片任务状态
+            $this->updateSegmentPicStatus();
+            
         } catch (\Exception $e) {
             dLog('generate')->error('任务状态检查失败: ' . $e->getMessage());
             return 1;
@@ -85,4 +89,126 @@ class CheckImageGenerationTasksCommand extends Command
 
         return 0;
     }
+
+    /**
+     * 更新分镜表中的图片任务状态
+     * 
+     * @return void
+     */
+    private function updateSegmentPicStatus()
+    {
+        try {
+            // 获取所有状态为"生成中"的分镜
+            $segments = DB::table('mp_episode_segments')
+                ->where('pic_task_status', '生成中')
+                ->whereNotNull('pic_task_id')
+                ->where('pic_task_id', '<>', '')
+                ->select('segment_id', 'pic_task_id')
+                ->get();
+
+            if ($segments->isEmpty()) {
+                return;
+            }
+
+            dLog('generate')->info('开始更新分镜图片任务状态', ['count' => $segments->count()]);
+            logDB('generate', 'info', '开始更新分镜图片任务状态', ['count' => $segments->count()]);
+
+            $successCount = 0;
+            $failedCount = 0;
+            $processingCount = 0;
+
+            foreach ($segments as $segment) {
+                $picTaskId = $segment->pic_task_id;
+                $segmentId = $segment->segment_id;
+
+                // 查询图片生成任务状态
+                $picTask = DB::table('mp_generate_pic_tasks')
+                    ->where('id', $picTaskId)
+                    ->select('id', 'status', 'result_url', 'error_message')
+                    ->first();
+
+                if (!$picTask) {
+                    dLog('generate')->warning('分镜关联的图片任务不存在', [
+                        'segment_id' => $segmentId,
+                        'pic_task_id' => $picTaskId
+                    ]);
+                    continue;
+                }
+
+                $updateData = ['updated_at' => date('Y-m-d H:i:s')];
+
+                // 根据任务状态更新分镜表
+                if ($picTask->status === 'success') {
+                    $updateData['pic_task_status'] = '已完成';
+                    
+                    // 处理 result_url(可能是JSON数组或字符串)
+                    $resultUrl = $picTask->result_url;
+                    if (is_string($resultUrl) && is_json($resultUrl)) {
+                        $resultUrls = json_decode($resultUrl, true);
+                        $updateData['img_url'] = is_array($resultUrls) ? $resultUrls[0] : $resultUrl;
+                    } else {
+                        $updateData['img_url'] = $resultUrl;
+                    }
+                    
+                    $successCount++;
+                    
+                    dLog('generate')->info('分镜图片生成成功', [
+                        'segment_id' => $segmentId,
+                        'pic_task_id' => $picTaskId,
+                        'img_url' => $updateData['img_url']
+                    ]);
+                    logDB('generate', 'info', '分镜图片生成成功', [
+                        'segment_id' => $segmentId,
+                        'pic_task_id' => $picTaskId
+                    ]);
+                    
+                } elseif ($picTask->status === 'failed') {
+                    $updateData['pic_task_status'] = '失败';
+                    
+                    $failedCount++;
+                    
+                    dLog('generate')->error('分镜图片生成失败', [
+                        'segment_id' => $segmentId,
+                        'pic_task_id' => $picTaskId,
+                        'error' => $picTask->error_message
+                    ]);
+                    logDB('generate', 'error', '分镜图片生成失败', [
+                        'segment_id' => $segmentId,
+                        'pic_task_id' => $picTaskId,
+                        'error' => $picTask->error_message
+                    ]);
+                    
+                } else {
+                    // 仍在处理中,不更新
+                    $processingCount++;
+                    continue;
+                }
+
+                // 更新分镜表
+                DB::table('mp_episode_segments')
+                    ->where('segment_id', $segmentId)
+                    ->update($updateData);
+            }
+
+            dLog('generate')->info('分镜图片任务状态更新完成', [
+                'total' => $segments->count(),
+                'success' => $successCount,
+                'failed' => $failedCount,
+                'processing' => $processingCount
+            ]);
+            logDB('generate', 'info', '分镜图片任务状态更新完成', [
+                'total' => $segments->count(),
+                'success' => $successCount,
+                'failed' => $failedCount,
+                'processing' => $processingCount
+            ]);
+
+        } catch (\Exception $e) {
+            dLog('generate')->error('更新分镜图片任务状态异常: ' . $e->getMessage());
+            logDB('generate', 'error', '更新分镜图片任务状态异常', [
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+        }
+    }
 }

+ 126 - 0
app/Console/Commands/CheckVideoGenerationTasksCommand.php

@@ -31,6 +31,7 @@ class CheckVideoGenerationTasksCommand extends Command
     public function handle(AIVideoGenerationService $videoGenerationService)
     {
         dLog('generate')->info('开始检查视频生成任务状态...');
+        logDB('generate', 'info', '定时任务:开始检查视频生成任务状态', []);
 
         // 执行50s
         $time_start = time();
@@ -43,12 +44,137 @@ class CheckVideoGenerationTasksCommand extends Command
                 $videoGenerationService->updatePendingTasks();
                 $count = DB::table('mp_generate_video_tasks')->where('status', 'processing')->count('id');
             }
+            
+            // 更新分镜表中的视频任务状态
+            $this->updateSegmentVideoStatus();
+            
             dLog('generate')->info('视频任务状态检查完成');
+            logDB('generate', 'info', '定时任务:视频生成任务状态检查完成', []);
         } catch (\Exception $e) {
             dLog('generate')->error('视频任务状态检查失败: ' . $e->getMessage());
+            logDB('generate', 'error', '定时任务:视频生成任务状态检查失败', ['error' => $e->getMessage()]);
             return 1;
         }
 
         return 0;
     }
+
+    /**
+     * 更新分镜表中的视频任务状态
+     * 
+     * @return void
+     */
+    private function updateSegmentVideoStatus()
+    {
+        try {
+            // 获取所有状态为"生成中"的分镜
+            $segments = DB::table('mp_episode_segments')
+                ->where('video_task_status', '生成中')
+                ->whereNotNull('video_task_id')
+                ->where('video_task_id', '<>', '')
+                ->select('segment_id', 'video_task_id')
+                ->get();
+
+            if ($segments->isEmpty()) {
+                return;
+            }
+
+            dLog('generate')->info('开始更新分镜视频任务状态', ['count' => $segments->count()]);
+            logDB('generate', 'info', '开始更新分镜视频任务状态', ['count' => $segments->count()]);
+
+            $successCount = 0;
+            $failedCount = 0;
+            $processingCount = 0;
+
+            foreach ($segments as $segment) {
+                $videoTaskId = $segment->video_task_id;
+                $segmentId = $segment->segment_id;
+
+                // 查询视频生成任务状态
+                $videoTask = DB::table('mp_generate_video_tasks')
+                    ->where('id', $videoTaskId)
+                    ->select('id', 'status', 'result_url', 'last_frame_url', 'error_message')
+                    ->first();
+
+                if (!$videoTask) {
+                    dLog('generate')->warning('分镜关联的视频任务不存在', [
+                        'segment_id' => $segmentId,
+                        'video_task_id' => $videoTaskId
+                    ]);
+                    continue;
+                }
+
+                $updateData = ['updated_at' => date('Y-m-d H:i:s')];
+
+                // 根据任务状态更新分镜表
+                if ($videoTask->status === 'success') {
+                    $updateData['video_task_status'] = '已完成';
+                    $updateData['video_url'] = $videoTask->result_url;
+                    
+                    // 如果有尾帧图片,也更新
+                    if (!empty($videoTask->last_frame_url)) {
+                        $updateData['last_frame_url'] = $videoTask->last_frame_url;
+                    }
+                    
+                    $successCount++;
+                    
+                    dLog('generate')->info('分镜视频生成成功', [
+                        'segment_id' => $segmentId,
+                        'video_task_id' => $videoTaskId,
+                        'video_url' => $videoTask->result_url
+                    ]);
+                    logDB('generate', 'info', '分镜视频生成成功', [
+                        'segment_id' => $segmentId,
+                        'video_task_id' => $videoTaskId
+                    ]);
+                    
+                } elseif ($videoTask->status === 'failed') {
+                    $updateData['video_task_status'] = '失败';
+                    
+                    $failedCount++;
+                    
+                    dLog('generate')->error('分镜视频生成失败', [
+                        'segment_id' => $segmentId,
+                        'video_task_id' => $videoTaskId,
+                        'error' => $videoTask->error_message
+                    ]);
+                    logDB('generate', 'error', '分镜视频生成失败', [
+                        'segment_id' => $segmentId,
+                        'video_task_id' => $videoTaskId,
+                        'error' => $videoTask->error_message
+                    ]);
+                    
+                } else {
+                    // 仍在处理中,不更新
+                    $processingCount++;
+                    continue;
+                }
+
+                // 更新分镜表
+                DB::table('mp_episode_segments')
+                    ->where('segment_id', $segmentId)
+                    ->update($updateData);
+            }
+
+            dLog('generate')->info('分镜视频任务状态更新完成', [
+                'total' => $segments->count(),
+                'success' => $successCount,
+                'failed' => $failedCount,
+                'processing' => $processingCount
+            ]);
+            logDB('generate', 'info', '分镜视频任务状态更新完成', [
+                'total' => $segments->count(),
+                'success' => $successCount,
+                'failed' => $failedCount,
+                'processing' => $processingCount
+            ]);
+
+        } catch (\Exception $e) {
+            dLog('generate')->error('更新分镜视频任务状态异常: ' . $e->getMessage());
+            logDB('generate', 'error', '更新分镜视频任务状态异常', [
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+        }
+    }
 }