lh пре 4 месеци
родитељ
комит
550e2eb2e1

+ 66 - 0
app/Console/Anime/AnimeCheckImgUrlCommand.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Console\Anime;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\DB;
+
+class AnimeCheckImgUrlCommand extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'Anime:checkImgUrl';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '检查动漫对话角色和场景图片生成状态';
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        dLog('generate')->info('====================开始检查动漫对话角色和场景图片生成状态====================');
+        $time_start = microtime(true);
+
+        // 获取待执行的动漫对话数据
+        $data = DB::table('mp_animes')->where('status', '执行中')->select('roles', 'scenes')->get();
+        
+        // foreach ($data as $val) {
+        //     $roles = json_decode($val->roles, true);
+        //     $scenes = json_decode($val->scenes, true);
+        //     $role_count = count($roles);
+        //     $scene_count = count($scenes);
+        //     $role_success_count = 0;
+        //     $scene_success_count = 0;
+        //     for ($i=0; $i < $role_count; $i++) { 
+        //         if (isset($roles[$i]['url']) && !empty($roles[$i]['url'])) {
+        //             $role_success_count++;
+        //         }
+        //     }
+        //     for ($i=0; $i < $scene_count; $i++) { 
+        //         if (isset($scenes[$i]['url']) && !empty($scenes[$i]['url'])) {
+        //             $scene_success_count++;
+        //         }
+        //     }
+
+        //     if ($role_success_count == $role_count && $scene_success_count == $scene_count) {
+        //         // 更新状态为已完成
+        //         DB::table('mp_animes')->where('status', '执行中')->update(['status' => '已完成']);
+        //         dLog('generate')->info('动漫对话图片已生成完成');
+        //     }
+        // }
+        // $this->info('检查完成');
+
+        $time_end = microtime(true);
+        dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
+        dLog('generate')->info('====================结束检查动漫对话角色和场景图片生成状态====================');
+    }
+}

+ 9 - 4
app/Console/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace App\Console;
 
+use App\Console\Anime\AnimeCheckImgUrlCommand;
 use App\Console\Test\RegisterUserCommand;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -11,6 +12,7 @@ class Kernel extends ConsoleKernel
     protected $commands = [
         Test\TestCommand::class,
         RegisterUserCommand::class,
+        AnimeCheckImgUrlCommand::class,
     ];
 
 
@@ -22,11 +24,14 @@ class Kernel extends ConsoleKernel
      */
     protected function schedule(Schedule $schedule)
     {
-        // 每5分钟检查一次图片生成任务状态
-        $schedule->command('AIGeneration:checkImgTasks')->everyFiveMinutes();
+        // 每分钟检查一次图片生成任务状态
+        $schedule->command('AIGeneration:checkImgTasks')->everyMinute();
         
-        // 每5分钟检查一次视频生成任务状态
-        $schedule->command('AIGeneration:checkVideoTasks')->everyFiveMinutes();
+        // 每分钟检查一次视频生成任务状态
+        $schedule->command('AIGeneration:checkVideoTasks')->everyMinute();
+
+        // 没分钟检查一次动漫对话图片生成状态
+        $schedule->command('Anime:checkImgUrl')->everyMinute();
     }
 
     /**

+ 51 - 4
app/Services/Anime/AnimeService.php

@@ -5,6 +5,7 @@ namespace App\Services\Anime;
 use App\Consts\ErrorConst;
 use App\Facade\Site;
 use App\Libs\Utils;
+use App\Services\AIGeneration\AIImageGenerationService;
 use GuzzleHttp\Client;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
@@ -14,9 +15,10 @@ use OSS\OssClient;
 
 class AnimeService
 {
+    protected $aiImageGenerationService;
 
-    public function __construct() {
-
+    public function __construct(AIImageGenerationService $aiImageGenerationService) {
+        $this->aiImageGenerationService = $aiImageGenerationService;
     }
 
     public function uploadImg($data) {
@@ -24,11 +26,56 @@ class AnimeService
     }
 
     public function batchSetRoleImg($data) {
+        $anime_id = getProp($data, 'anime_id');
+        if (!$anime_id) Utils::throwError('1002:请选择对话');
         $roles = getProp($data, 'roles');
+        // $roles格式
+        // [
+        //     {
+        //         "role": "角色名",
+        //         "description": "角色描述"
+        //         "ref_img_url": "参考图地址"
+        //     },
+        //     ...
+        // ]
         
-        foreach ($roles as $role) {
+        foreach ($roles as &$role) {
+            $role_name = getProp($role, 'role');
+            $description = getProp($role, 'description');
             // 参考图地址
-            $ref
+            $ref_img_url = getProp($role, 'ref_img_url');
+            
+            // 此处调用AIImageGenerationService的生成图片任务接口: createImageGenerationTask(注意使用默认参数,prompt使用角色描述),并返回任务id
+            try {
+                $params = [
+                    'prompt' => $description,
+                    'ref_img_urls' => !empty($ref_img_url) ? $ref_img_url : []
+                ];
+                
+                $task = $this->aiImageGenerationService->createImageGenerationTask($params);
+                $task_id = $task->task_id;
+                
+                if (!$task_id) {
+                    Utils::throwError("20003: 角色({$role_name})生成图片失败");
+                }
+                
+                $role['task_id'] = $task_id;
+                $role['task_status'] = 'processing';
+            } catch (\Exception $e) {
+                Utils::throwError("20003:" . $e->getMessage());
+            }
+        }
+        
+        // 保存角色信息
+        $boolen = DB::table('mp_animes')->where('id', $anime_id)->update([
+            'roles'             => json_encode($roles, 256),
+            'generate_status'   => '执行中',
+            'updated_at'        => date('Y-m-d H:i:s')
+        ]);
+        if (!$boolen) {
+            Utils::throwError('20003:保存角色信息失败');
         }
+
+        return $boolen;
     }
 }

+ 3 - 1
routes/api.php

@@ -6,6 +6,7 @@ use App\Http\Controllers\Book\BookController;
 use App\Http\Controllers\Timbre\TimbreController;
 use App\Http\Controllers\AIGeneration\ImageGenerationController;
 use App\Http\Controllers\AIGeneration\VideoGenerationController;
+use App\Http\Controllers\Anime\AnimeController;
 use Illuminate\Support\Facades\Route;
 
 /*
@@ -98,7 +99,6 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
     // AI生成
     Route::group(['prefix' => 'AIGeneration'], function () {
         // 图片生成相关路由
-        Route::post('image/batchUpload', [ImageGenerationController::class, 'batchUploadImg']);
         Route::post('image/createTask', [ImageGenerationController::class, 'createTask']);
         Route::get('image/taskStatus', [ImageGenerationController::class, 'taskStatus']);
         Route::get('image/taskList', [ImageGenerationController::class, 'taskList']);
@@ -128,6 +128,8 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
     // 动漫管理
     Route::group(['prefix' => 'anime'], function () {
         Route::post('confirmOutline', [DeepSeekController::class, 'confirmOutline']);
+        Route::post('batchUploadImg', [ImageGenerationController::class, 'batchUploadImg']);
+        Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']);
     });
     
 });