liuhairui hace 3 semanas
padre
commit
91841c9299

+ 0 - 4
application/job/ImageArrJob.php

@@ -27,13 +27,9 @@ class ImageArrJob
         if (empty($data['status_val']) || $data['status_val'] == '文生图') {
             Queue::push('app\job\TextToImageJob', $data, 'txttoimg');
             echo date('Y-m-d H:i:s') . " 队列已启动\n";
-            $job->delete();
-            die;
         }else if (empty($data['status_val']) || $data['status_val'] == '图生文') {
             Queue::push('app\job\ImageJob', $data, 'imgtotxt');
             echo date('Y-m-d H:i:s') . " 队列已启动\n";
-            $job->delete();
-            die;
         } else {
 
             $task_id = $data['task_id'];

+ 72 - 44
application/job/TextToImageJob.php

@@ -1,5 +1,6 @@
 <?php
 namespace app\job;
+use app\api\controller\WorkOrder;
 use app\service\AIGatewayService;
 use think\Db;
 use think\Exception;
@@ -22,53 +23,70 @@ class TextToImageJob
     {
         if (empty($data['status_val']) || $data['status_val'] == '文生图') {
             // 获取任务ID
-            $taskId = $data['id'] ?? null;
+            $taskId = $data['task_id'];
+            // 获取产品ID
+            $Id = $data['id'];
             if (empty($taskId)) {
                 $job->delete();
                 return;
             }
-
-            // 创建Redis连接
+            if (empty($Id)) {
+                $job->delete();
+                return;
+            }
+            
+            //连接Redis将数据队列存到库中
             $redis = new \Redis();
             $redis->connect('127.0.0.1', 6379);
             $redis->auth('123456');
             $redis->select(15);
-
-            // 设置锁键名
-            $lockKey = "text_to_image_lock:{$taskId}";
-            $lockExpire = 300; // 锁的过期时间,单位:秒(5分钟)
-
-            // 尝试获取锁(使用SET命令的NX和EX选项进行原子操作)
-            // NX: 只在键不存在时设置
-            // EX: 设置过期时间
-            $lockAcquired = $redis->set($lockKey, time(), ['NX', 'EX' => $lockExpire]);
-
-            if (!$lockAcquired) {
-                // 无法获取锁,任务正在执行
-                echo "❌ 检测到相同ID({$taskId})的任务正在执行,当前任务跳过\n";
+            
+            echo "\n" . date('Y-m-d H:i:s') . " 任务开始:{$taskId}\n";
+
+            // 更新任务状态为处理中
+            $redis->set("text_to_image_task:{$taskId}", json_encode([
+                'status' => 'processing',
+                'started_at' => date('Y-m-d H:i:s')
+            ]), ['EX' => 300]); // 5分钟过期
+ 
+            try {
+                // 执行图片生成
+                $result = $this->get_txt_to_img($data);
+                // sleep(10);
+                // 更新Redis中的任务状态为成功
+                $redis->set("text_to_image_task:{$taskId}", json_encode([
+                    'status' => 'completed',
+                    // 'image_url' => "/uploads/merchant/690377511/6903775111138/newimg/698550113c2b8.jpeg",
+                    'image_url' => $result,
+                    'completed_at' => date('Y-m-d H:i:s')
+                ]), ['EX' => 300]); // 5分钟过期
+                
+                echo "🎉 任务 {$taskId} 执行完成,图片生成成功!\n";
+                $job->delete();
+            } catch (\Exception $e) {
+                echo "❌ 任务执行失败:" . $e->getMessage() . "\n";
+                
+                // 检查是否是网络超时错误
+                if (strpos($e->getMessage(), 'Connection timed out') !== false) {
+                    // 对于超时错误,保持任务状态为处理中,让前端继续查询
+                    echo "⚠️ 检测到网络超时,任务可能仍在执行中\n";
+                    $redis->set("text_to_image_task:{$taskId}", json_encode([
+                        'status' => 'processing',
+                        'error' => '网络连接超时,正在重试...',
+                        'updated_at' => date('Y-m-d H:i:s')
+                    ]), ['EX' => 300]); // 5分钟过期
+                } else {
+                    // 其他错误,标记为失败
+                    $redis->set("text_to_image_task:{$taskId}", json_encode([
+                        'status' => 'failed',
+                        'error' => $e->getMessage(),
+                        'completed_at' => date('Y-m-d H:i:s')
+                    ]), ['EX' => 300]); // 5分钟过期
+                }
+                $job->delete();
+            } finally {
                 $job->delete();
-                return;
-            } else {
-                echo "🔒 成功获取任务锁,ID: {$taskId}\n";
-            }
-
-            echo "━━━━━━━━━━ ▶ 文生图任务开始处理━━━━━━━━━━\n";
-            $result = $this->get_txt_to_img($data);
-            // 标准化结果文本
-            if ($result === true || $result === 1 || $result === '成功') {
-                $resultText = '成功';
-            } else {
-                $resultText = (string) $result ?: '失败或无返回';
             }
-            echo "✅ 处理结果:{$resultText}\n";
-            echo "完成时间:" . date('Y-m-d H:i:s') . "\n";
-            echo "文生图已处理完成\n";
-
-            // 释放锁 - 使用del()替代被弃用的delete()方法
-            $redis->del($lockKey);
-            echo "🔓 释放任务锁,ID: {$taskId}\n";
-            $job->delete();
-            die;
         } else {
 
             $logId = $data['log_id'] ?? null;
@@ -227,7 +245,6 @@ class TextToImageJob
         // 调用AI生成图片
         $aiGateway = new AIGatewayService();
         $res = $aiGateway->callDalleApi($prompt, $model, $size);
-
         // 提取base64图片数据
 //        if (isset($res['candidates'][0]['content']['parts'][0]['text'])) {
 //            $text_content = $res['candidates'][0]['content']['parts'][0]['text'];
@@ -265,12 +282,23 @@ class TextToImageJob
             // 生成数据库存储路径(使用正斜杠格式)
             $db_img_path = $url_path . $file_name;
 
-            Db::name('product')->where('id',  $data['id'])->update(['product_new_img' => $db_img_path]);
-
-            return  '成功';
-//        } else {
-//            return 'AI返回格式错误';
-//        }
+            Db::name('product')->where('id',  $data['id'])->update
+            (
+                [
+                'createTime' => date('Y-m-d H:i:s'),
+                'content' => $data['prompt'],
+                'product_new_img' => $db_img_path
+                ]
+            );
+            //生成新图后保存到记录 存留历史图片
+            $record['product_id'] = $data['id'];
+            $record['product_new_img'] = $db_img_path;
+            $record['product_content'] = $data['prompt'];
+            $record['template_id'] = $data['template_id'];
+            $record['createTime'] = date('Y-m-d H:i:s');
+            Db::name('product_image')->insert($record);
+
+            return $db_img_path;
     }
 
     /**

+ 0 - 5
application/service/AIGatewayService.php

@@ -38,11 +38,6 @@ class AIGatewayService{
          'submitimage' => [
              'api_key' => 'sk-iURfrAgzAjhZ4PpPLwzmWIAhM7zKfrkwDvyxk4RVBQ4ouJNK',
              'api_url' => 'https://chatapi.onechats.ai/mj/submit/imagine'
-         ],
-         //文生视频【sora-2】
-         'videos' => [
-             'api_key' => 'sk-sWW1GFlnjbrDRb1DkMEzePIxgdvLK6cZt0Qg93yDMVP2z1yN',
-             'api_url' => 'https://chatapi.onechats.ai/v1/videos'
          ]
      ];
 

+ 21 - 1
application/service/ImageService.php

@@ -52,11 +52,31 @@ class ImageService{
      * @return array GPT生成的结果
      */
     public function handleTextToImg($params) {
+        // 生成唯一任务ID,格式:$params['id']-年月日时间-随机四位数字
+        $id = $params['id'];
+        $time = date('YmdHis');
+        $random = mt_rand(1000, 9999);
+        $taskId = "{$id}-{$time}-{$random}";
+        $params['task_id'] = $taskId;
+
+        // 将任务状态存储到Redis
+        $redis = new \Redis();
+        $redis->connect('127.0.0.1', 6379);
+        $redis->auth('123456');
+        $redis->select(15);
+        $redis->set("text_to_image_task:{$taskId}", json_encode([
+            'status' => 'pending',
+            'created_at' => date('Y-m-d H:i:s')
+        ]), ['EX' => 300]); // 5分钟过期
+        
+        // 将任务推送到队列
         Queue::push('app\job\ImageArrJob', $params, "arrimage");
-        return true;
+        // 返回任务ID
+        return ['success' => true, 'message' => '正在生成图片中,请稍等.....', 'task_id' => $taskId];
     }
 
 
+
     /**
      * 推送图像任务到队列(支持链式和单独模式)
      * @param array $params 请求参数,包含图像批次、模型类型、尺寸等