Commit 823044e7 authored by 刘小敏's avatar 刘小敏

AI脚本增加去重逻辑,日志优化

parent 69f87043
......@@ -5,7 +5,6 @@ namespace addons\shopro\job;
use addons\shopro\service\user\Ai;
use app\admin\model\shopro\AiTryon as AiTryOnModel;
use think\queue\Job;
use think\facade\Notification as NotificationFacade;
/**
* AI生成图片
......@@ -19,7 +18,7 @@ class AiImgGen extends BaseJob
}
/**
* AI视频结果处理
* AI图片生成
*/
public function exec(Job $job, $data)
{
......@@ -28,7 +27,7 @@ class AiImgGen extends BaseJob
$user = $data['user'];
$user_id = isset($user['id']) ? $user['id'] : 0;
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). 'AI图片生成脚本开始 userid '.$user_id.' id:'.$id.' ***********************************'.PHP_EOL);
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). '[AI图片异步队列]AI图片生成脚本开始 userid '.$user_id.' id:'.$id.' ***********************************'.PHP_EOL);
// 校验入参
if (empty($id) || empty($user_id)) {
......@@ -47,6 +46,12 @@ class AiImgGen extends BaseJob
return false;
}
if ($tryOn->ai_status !== 0) {
$this->debug_log('[AI图片异步队列][删除job]用户ID:'. $user_id .' id:'. $id .' 试戴记录已完成');
$job->delete();
return false;
}
// 合成AI图
$aiService = new Ai();
$res = $aiService->generateImage($tryOn->toArray(), $user_id, 'url');
......@@ -56,6 +61,7 @@ class AiImgGen extends BaseJob
AiTryOnModel::where('id', $id)->where('user_id', $user_id)->update(['ai_status' => 2, 'ai_err_msg' => $res['msg']]);
$job->delete();
return false;
} else {
// 保存图片到本地
......@@ -78,6 +84,7 @@ class AiImgGen extends BaseJob
$this->debug_log('[AI图片异步队列]删除Job');
$job->delete();
return true;
}
} catch (\Exception $e) {
......
......@@ -29,23 +29,20 @@ class AiVideoGen extends BaseJob
$id = $data['id'];
$user = $data['user'];
$user_id = isset($user['id']) ? $user['id'] : 0;
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). '生成AI视频脚本开始 userid '.$user_id.' id:'.$id.' ***********************************'.PHP_EOL);
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). '[AI视频生成异步队列]生成AI视频脚本开始 userid:'.$user_id.' id:'.$id.' ***********************************'.PHP_EOL);
// 开发过程中的临时代码 调试用
// $this->sendNotification($user_id, $taskid);
// $this->debug_log('[AI视频异步队列]删除Job');
// $this->debug_log('[AI视频生成异步队列]删除Job');
// $job->delete();
// exit;
// 校验入参
if (!isset($id) || empty($id) || !isset($user_id) || empty($user_id)) {
$this->debug_log('[AI视频异步队列]入参有空值 tryon_id:'.$id .' user_id:'.$user_id);
if ( empty($id) || empty($user_id)) {
$this->debug_log('[AI视频生成异步队列][删除Job]入参有空值 tryon_id:'.$id .' user_id:'.$user_id);
// 删除队列job
$this->debug_log('[AI视频]删除Job');
$job->delete();
return false;
}
......@@ -54,19 +51,41 @@ class AiVideoGen extends BaseJob
$res = $ai->generateVideo($id, $user_id);
// 2. 更新试戴表状态
$tryonModel = new AiTryOnModel();
if ($res['code'] === 0) {
$tryonModel = new AiTryOnModel();
$tryonModel->where('id', $id)->update(['ai_status' => 2, 'ai_err_msg' => $res['msg']]);
$this->debug_log('[AI视频异步队列]合成AI视频失败 tryon_id:'.$id .' user_id:'.$user_id.' msg:'.$res['msg']);
$this->debug_log('[AI视频生成异步队列][删除Job]合成AI视频失败 tryon_id:'.$id .' user_id:'.$user_id.' msg:'.$res['msg']);
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$job->delete();
return false;
} else {
// 去重处理
$taskid = $res['data'];
$tryonModel->where('id', $id)->update(['ai_task_id' => 0, 'ai_err_msg' => '视频生成中']);
$tryon = AiTryOnModel::where('id', $id)->find();
// 检查记录是否存在
if (!$tryon) {
$this->debug_log('[AI视频生成][删除Job]试戴记录不存在: id='.$id);
$job->delete();
return false;
}
// 检查是否已有任务ID(去重)
if (!empty($tryon['ai_task_id'])) {
$this->debug_log('[AI视频生成][删除Job]已有任务ID,跳过: id='.$id.', task_id='.$tryon['ai_task_id']);
$job->delete();
return false;
}
// 更新任务ID和状态
AiTryOnModel::where('id', $id)->update([
'ai_task_id' => $taskid,
'ai_err_msg' => '视频生成中'
]);
// 推送队列
\think\Queue::push('\addons\shopro\job\AiVideoRetry@exec', ['user' => $user, 'taskId' => $taskid, 'id' => $id, 'retry_count' => 0], 'shopro-high');
......@@ -75,18 +94,9 @@ class AiVideoGen extends BaseJob
} catch (\Exception $e) {
// 队列执行失败,记录日志并删除队列job
$logInfo = [
" [AI视频异步队列] Exception LOG INFO BEGIN ",
'[ Message ] ' . var_export('[' . $e->getCode() . ']' . $e->getMessage() . ' ' . 'AiVideoGen.save.' . $user['id'] ?? 'user_id' . $video_url??'video_url', true),
'[ File ] ' . var_export($e->getFile() . ':' . $e->getLine(), true),
'[ Trace ] ' . var_export($e->getTraceAsString(), true),
"[AI视频异步队列] Exception LOG INFO ENDED ",
];
$logInfo = implode(PHP_EOL, $logInfo) . PHP_EOL;
$this->debug_log($logInfo);
format_log_error_custom_name($e, '[AI视频生成异步队列][异常][删除Job]', '', 'gen_ai');
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$job->delete();
}
}
......
......@@ -44,15 +44,15 @@ class AiVideoRetry extends BaseJob
$user = $data['user'];
$user_id = isset($user['id']) ? $user['id'] : 0;
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). '查询AI视频生成状态脚本开始 userid '.$user_id.' taskid:'.$taskid.' id:'.$id.' ***********************************'.PHP_EOL);
$this->debug_log('***************************** '.date('Y-m-d H:i:s'). '查询AI视频状态脚本开始 userid '.$user_id.' taskid:'.$taskid.' id:'.$id.' ***********************************'.PHP_EOL);
// 校验入参
if (empty($id) || empty($user_id) || empty($taskid)) {
$this->debug_log('[AI视频异步队列]入参有空值 tryon_id:'.$id .' user_id:'.$user_id.' taskid:'.$taskid);
$this->debug_log('[AI视频查询异步队列]入参有空值 tryon_id:'.$id .' user_id:'.$user_id.' taskid:'.$taskid);
// 删除队列job
$this->debug_log('[AI视频]删除Job');
$this->debug_log('[AI视频查询异步队列]删除Job');
$job->delete();
return false;
}
......@@ -68,7 +68,7 @@ class AiVideoRetry extends BaseJob
'allow_redirects' => true
];
$this->debug_log('[AI视频异步队列]请求AI接口入参 user_id:'.$user_id.' AI接口url:'.$url.' params:'.json_encode($params));
$this->debug_log('[AI视频查询异步队列]请求AI接口入参 user_id:'.$user_id.' AI接口url:'.$url.' params:'.json_encode($params));
// 向AI接口 发送请求
$client = new Http();
......@@ -78,7 +78,7 @@ class AiVideoRetry extends BaseJob
$content = preg_replace('/[^\x20-\x7E]/', '', $content);
$result = json_decode($content, true);
$this->debug_log('[AI视频异步队列]请求AI接口出参 response:'.json_encode($result));
$this->debug_log('[AI视频查询异步队列]请求AI接口出参 response:'.json_encode($result));
// 2. AI接口 返回值处理 接口失败场景
if (isset($result['error'])){
......@@ -89,7 +89,7 @@ class AiVideoRetry extends BaseJob
->update(['ai_status' => 2, 'ai_err_msg' => $message]);
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$this->debug_log('[AI视频查询异步队列]删除Job');
$job->delete();
return false;
}
......@@ -104,24 +104,22 @@ class AiVideoRetry extends BaseJob
$aiService = new Ai();
$video_url = $aiService->saveFileLoc(isset($result['content']['video_url']) ? $result['content']['video_url'] : '', '.mp4', 'gen_ai');
// $video_url = $this->saveVideoLoc(isset($result['content']['video_url']) ? $result['content']['video_url'] : '');
$this->debug_log('[AI视频异步队列]保存本地接口返回值 video_url:'.$video_url);
$this->debug_log('[AI视频查询异步队列]保存本地接口返回值 video_url:'.$video_url);
if ($video_url === 0){
AiTryOnModel::where('user_id', $user_id)->where('ai_task_id', $taskid)->update(['ai_status' => 2, 'ai_err_msg' => '视频保存到本地失败']);
$this->debug_log('[AI视频异步队列]保存本地视频失败 sql: '.db()->getLastSql());
$this->debug_log('[AI视频查询异步队列]保存本地视频失败 sql: '.db()->getLastSql());
}
// 更新我的试戴
// 更新我的试戴记录
AiTryOnModel::where('user_id', $user_id)->where('ai_task_id', $taskid)->update(['ai_status' => 1,'ai_url' => config('shopro.api_host').$video_url, 'ai_err_msg' => '视频生成成功']);
$this->debug_log('[AI视频异步队列]保存本地视频成功 sql: '.db()->getLastSql());
$this->debug_log('[AI视频查询异步队列]保存本地视频成功 sql: '.db()->getLastSql());
// 发送成功消息通知
$aiService->sendNotification($user_id, $id);
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$this->debug_log('[AI视频查询异步队列]删除Job');
$job->delete();
break;
......@@ -138,12 +136,12 @@ class AiVideoRetry extends BaseJob
][$result['status']];
AiTryOnModel::where('user_id', $user_id)->where('ai_task_id', $taskid)->update(['ai_status' => 2, 'ai_err_msg' => $msg]);
$this->debug_log('[AI视频异步队列]AI生成视频任务 过期: taskId: ' . $taskid . 'userId '. $user_id );
$this->debug_log('[AI视频异步队列]AI生成视频任务 过期: result:'.json_encode($result));
$this->debug_log('[AI视频异步队列]AI生成视频任务 过期: sql:' .db()->getLastSql());
$this->debug_log('[AI视频查询异步队列]AI视频任务 过期: taskId: ' . $taskid . 'userId '. $user_id );
$this->debug_log('[AI视频查询异步队列]AI视频任务 过期: result:'.json_encode($result));
$this->debug_log('[AI视频查询异步队列]AI视频任务 过期: sql:' .db()->getLastSql());
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$this->debug_log('[AI视频查询异步队列]删除Job');
$job->delete();
break;
......@@ -169,8 +167,6 @@ class AiVideoRetry extends BaseJob
// 队列执行失败
format_log_error_custom_name($e, '[AI视频异步队列]', '', 'gen_ai');
// !empty($video_url) && $this->deleteLocalVideo($video_url); // 删除保存到本地的视频,如果已经保存了的话
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$job->delete();
......@@ -193,17 +189,16 @@ class AiVideoRetry extends BaseJob
$data['retry_count'] = $retryCount; // 存储到data中
// release(0) 立即放入队尾,release($delay) 延迟后放入队尾
$this->debug_log('[AI视频异步队列]放入队尾Job: taskId: ' . $taskid . 'userId '. $user_id . 'retryCount: ' . $retryCount. 'id: ' . $id);
$this->debug_log('[AI视频查询异步队列]放入队尾Job: taskId: ' . $taskid . ' userId: '. $user_id . ' retryCount: ' . $retryCount. 'id: ' . $id);
$job->release(self::RETRY_DELAY);
} else {
// 重试次数已达上限,标记失败
AiTryOnModel::where('user_id', $user_id)->where('ai_task_id', $taskid)->update(['ai_status' => 2, 'ai_err_msg' => '视频生成超时']);
$this->debug_log('[AI视频异步队列]超时未得到结果: taskId: ' . $taskid . 'userId '. $user_id . 'retryCount: ' . $retryCount. 'id: ' . $id);
$this->debug_log('[AI视频异步队列]超时未得到结果: sql:' .db()->getLastSql());
$this->debug_log('[AI视频查询异步队列]超时未得到结果: taskId: ' . $taskid . 'userId '. $user_id . ' retryCount: ' . $retryCount. 'id: ' . $id);
$this->debug_log('[AI视频查询异步队列][删除Job]超时未得到结果: sql:' .db()->getLastSql());
// 删除队列job
$this->debug_log('[AI视频异步队列]删除Job');
$job->delete();
}
}
......
......@@ -220,7 +220,7 @@ class Ai
// 查询tryon报表
$tryOn = AiTryOnModel::where('id', $id)->find();
if (!$tryOn) {
custom_log('[AI视频异步队列]用户ID:'. $userId .' id:'. $id .' 试戴记录不存在', 'gen_ai');
custom_log('[AI视频生成异步队列]用户ID:'. $userId .' id:'. $id .' 试戴记录不存在', 'gen_ai');
return [
'code' => 0 ,
'msg' => '试戴记录不存在'
......@@ -268,7 +268,7 @@ class Ai
];
// 记录入参日志
custom_log('[AI视频异步队列]用户ID:'. $userId .' AI生成视频接口入参:'.json_encode($params), 'gen_ai');
custom_log('[AI视频生成异步队列]用户ID:'. $userId .' AI生成视频接口入参:'.json_encode($params), 'gen_ai');
// AI接口 发送请求
$client = new Http();
......@@ -280,7 +280,7 @@ class Ai
$result = json_decode($content, true);
// 记录出参日志
custom_log('[AI视频异步队列]用户ID:'. $userId .' AI生成视频接口返回:'.json_encode($result), 'gen_ai');
custom_log('[AI视频生成异步队列]用户ID:'. $userId .' AI生成视频接口返回:'.json_encode($result), 'gen_ai');
return [
'code' => 1 ,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment