|
@@ -1,5 +1,6 @@
|
|
|
<?php
|
|
<?php
|
|
|
namespace app\job;
|
|
namespace app\job;
|
|
|
|
|
+use app\api\controller\WorkOrder;
|
|
|
use app\service\AIGatewayService;
|
|
use app\service\AIGatewayService;
|
|
|
use think\Db;
|
|
use think\Db;
|
|
|
use think\Exception;
|
|
use think\Exception;
|
|
@@ -22,53 +23,70 @@ class TextToImageJob
|
|
|
{
|
|
{
|
|
|
if (empty($data['status_val']) || $data['status_val'] == '文生图') {
|
|
if (empty($data['status_val']) || $data['status_val'] == '文生图') {
|
|
|
// 获取任务ID
|
|
// 获取任务ID
|
|
|
- $taskId = $data['id'] ?? null;
|
|
|
|
|
|
|
+ $taskId = $data['task_id'];
|
|
|
|
|
+ // 获取产品ID
|
|
|
|
|
+ $Id = $data['id'];
|
|
|
if (empty($taskId)) {
|
|
if (empty($taskId)) {
|
|
|
$job->delete();
|
|
$job->delete();
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 创建Redis连接
|
|
|
|
|
|
|
+ if (empty($Id)) {
|
|
|
|
|
+ $job->delete();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //连接Redis将数据队列存到库中
|
|
|
$redis = new \Redis();
|
|
$redis = new \Redis();
|
|
|
$redis->connect('127.0.0.1', 6379);
|
|
$redis->connect('127.0.0.1', 6379);
|
|
|
$redis->auth('123456');
|
|
$redis->auth('123456');
|
|
|
$redis->select(15);
|
|
$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();
|
|
$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 {
|
|
} else {
|
|
|
|
|
|
|
|
$logId = $data['log_id'] ?? null;
|
|
$logId = $data['log_id'] ?? null;
|
|
@@ -227,7 +245,6 @@ class TextToImageJob
|
|
|
// 调用AI生成图片
|
|
// 调用AI生成图片
|
|
|
$aiGateway = new AIGatewayService();
|
|
$aiGateway = new AIGatewayService();
|
|
|
$res = $aiGateway->callDalleApi($prompt, $model, $size);
|
|
$res = $aiGateway->callDalleApi($prompt, $model, $size);
|
|
|
-
|
|
|
|
|
// 提取base64图片数据
|
|
// 提取base64图片数据
|
|
|
// if (isset($res['candidates'][0]['content']['parts'][0]['text'])) {
|
|
// if (isset($res['candidates'][0]['content']['parts'][0]['text'])) {
|
|
|
// $text_content = $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_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;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|