redis调整

This commit is contained in:
chengxl
2025-08-07 13:52:52 +08:00
parent 873e4f0aac
commit a42aff2b13

View File

@@ -4,6 +4,8 @@ use think\Db;
use app\common\QrCodeImage;
use app\common\Wechat;
use think\Cache;
use think\Queue;
use app\common\QueueRedis;
class Material
{
@@ -30,10 +32,15 @@ class Material
protected $sAppID; //= 'wx03cb871b66e34e10';
protected $sAppSecret; //= 'f59ccaf00383dcfab489292c4697620a';
public function __construct(\think\Request $request = null) {
//投稿系统
protected $sSubmissionUrl = 'https://submission.tmrjournals.com/';
//定义redis连接
private $oQueueRedis;
public function __construct()
{
$this->oQueueRedis = QueueRedis::getInstance();
}
/**
* @title 生成期刊二维码
* @param aJournal 期刊信息
@@ -43,38 +50,28 @@ class Material
$iJournalStageId = empty($aJournal['journal_stage_id']) ? 0 : $aJournal['journal_stage_id'];
//生成图片地址
$sImagePath = 'journal/'.$iJournalId.'_'.$iJournalStageId.'.jpg';
$sQrCodeUrl = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
$sImagePath = 'journal/'.$iJournalId.'.jpg';
$sQrCodeUrl = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;
//地址
$journal_usx = empty($aJournal['journal_usx']) ? '' : $aJournal['journal_usx'];
$sUrl = trim($this->sJournalUsx,'/').'/'.$journal_usx.'/';
//二维码中间图片
$sLogo = empty($aJournal['journal_icon']) ? '' : $aJournal['journal_icon'];
if(empty($sLogo)){
//创建二维码
//判断二维码是否生成
if (!file_exists($sQrCodeUrl)) {
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
}else{
$sLogo = trim($this->sJournalUsx,'/').$this->sJournalIcon.$sLogo;
$aImageInfo = json_decode($this->getImage($sLogo,$iJournalId.'_'.$iJournalStageId,'journal'),true);
// if(empty($aImageInfo['data'])){
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
// }
// $sImg = QrCodeImage::withLogo($sUrl,$aImageInfo['data'],500,100, $sQrCodeUrl);
}
//查询二维码是否生成
$aWhere = ['journal_id' => $iJournalId,'is_delete' => 2];
$aQrCode = Db::name('ai_journal_qrcode')->field('journal_id,journal_stage_id,qrcode_url,media_id,media_url')->where($aWhere)->find();
if(!empty($aQrCode['qrcode_url'])){
return $aQrCode;
}
//插入字段
$aInsertParam = ['journal_id' => $iJournalId,'journal_stage_id' => $iJournalStageId,'qrcode_url' => $sImagePath,'create_time' => time(),'update_time' => time()];
$sStartSql = 'INSERT INTO t_ai_journal_qrcode ('.implode(',', array_keys($aInsertParam)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time)';
$sSql = '';
foreach ($aInsertParam as $key => $value) {
$sSql .= '"'.$value.'",';
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
$response = Db::name('ai_journal_qrcode')->insertGetId($aInsertParam);
return $aInsertParam;
}
@@ -89,35 +86,22 @@ class Material
//创建二维码
//生成图片地址
$sImagePath = 'article/'.$iArticleId.'.jpg';
$sQrCodeUrl = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
$sQrCodeUrl = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;
//地址
$sUrl = trim($this->sJournalUsx,'/').'/'.'article.html?J_num='.$aArticle['journal_id'].'&a_id='.$iArticleId;
//二维码中间图片
$sLogo = $aArticle['article_icon'];
if(empty($sLogo)){
//判断二维码是否生成
if (!file_exists($sQrCodeUrl)) {
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
}else{
$sLogo = trim($this->sJournalUsx,'/').$this->sArticleIcon.$sLogo;
$aImageInfo = json_decode($this->getImage($sLogo,$iArticleId,'article'),true);
// if(empty($aImageInfo['data'])){
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
// }
// $sImg = QrCodeImage::withLogo($sUrl,$aImageInfo['data'],500,100, $sQrCodeUrl);
}
//查询二维码是否生成
$aWhere = ['article_id' => $iArticleId,'is_delete' => 2];
$aQrCode = Db::name('ai_article_qrcode')->field('article_id,qrcode_url,media_id,media_url')->where($aWhere)->find();
if(!empty($aQrCode['qrcode_url'])){
return $aQrCode;
}
//插入字段
$aInsertParam = ['article_id' => $iArticleId,'qrcode_url' => $sImagePath,'create_time' => time(),'update_time' => time()];
$sStartSql = 'INSERT INTO t_ai_article_qrcode ('.implode(',', array_keys($aInsertParam)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time)';
$sSql = '';
foreach ($aInsertParam as $key => $value) {
$sSql .= '"'.$value.'",';
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
$response = Db::name('ai_article_qrcode')->insertGetId($aInsertParam);
return $aInsertParam;
}
@@ -140,7 +124,7 @@ class Material
//图片地址
$sImagePath = $sType.'/imgae_'.$iId.'.'.$sExtension;
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;
if (file_exists($sImagePath)) {
return json_encode(['status' => 1,'msg' => 'success','data' => $sImagePath]);
}
@@ -184,7 +168,7 @@ class Material
//图片后缀名
$sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension'];
$sImagePath = 'article/imgae_'.$iArticleId.'.'.$sExtension;
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;
if (!file_exists($sImagePath)) {//下载图片
$aImageInfo = json_decode($this->getImage($sIcon,$iArticleId,'article'),true);
if(empty($aImageInfo['data'])){
@@ -206,21 +190,26 @@ class Material
}
//处理入库数据
$sMediaId = empty($aData['media_id']) ? [] : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? [] : $aData['url'];
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
//入库数据组装
$aInsert = ['type' => 'image','media_id' => $sMediaId,'create_time' => $iTime,'article_id' => $iArticleId,'media_url' => $sMediaUrl,'update_time' => $iTime];
$aInsert = ['type' => 'image','media_id' => $sMediaId,'article_id' => $iArticleId,'media_url' => $sMediaUrl];
$sStartSql = 'INSERT INTO t_ai_article_material ('.implode(',', array_keys($aInsert)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time),media_id = VALUES(media_id),media_url = VALUES(media_url)';
$sSql = '';
foreach ($aInsert as $key => $value) {
$sSql .= '"'.$value.'",';
//查询是否插入数据
$aWhere = ['article_id' => $iArticleId,'is_delete' => 2];
$aMaterial = Db::name('ai_article_material')->field('id')->where($aWhere)->find();
if(empty($aMaterial['id'])){
$aInsert['create_time'] = $iTime;
$response = Db::name('ai_article_material')->insertGetId($aInsert);
}else{
$aWhere['id'] = $aMaterial['id'];
$aInsert['update_time'] = $iTime;
$response = Db::name('ai_article_material')->where($aWhere)->limit(1)->update($aInsert);
}
if($response === false){
return json_encode(['status' => 6,'msg' => 'failed:'.json_encode($response)]);
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
}
/**
@@ -243,13 +232,12 @@ class Material
//图片后缀名
$sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension'];
$sImagePath = 'journal/imgae_'.$iJournalId.'_'.$iJournalStageId.'.'.$sExtension;
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
// if (!file_exists($sImagePath)) {//下载图片
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;
//下载图片
$aImageInfo = json_decode($this->getImage($sIcon,$iJournalId.'_'.$iJournalStageId,'journal'),true);
if(empty($aImageInfo['data'])){
return json_encode(['status' => 3,'msg' => 'Image download failed']);
}
// }
//调用微信新增素材接口上传
$oWechat = new Wechat;
@@ -264,22 +252,26 @@ class Material
}
//处理入库数据
$sMediaId = empty($aData['media_id']) ? [] : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? [] : $aData['url'];
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
//入库数据组装
$aInsert = ['type' => 'image','media_id' => $sMediaId,'create_time' => $iTime,'journal_id' => $iJournalId,'media_url' => $sMediaUrl,'update_time' => $iTime,'journal_stage_id' => $iJournalStageId];
$aInsert = ['type' => 'image','media_id' => $sMediaId,'journal_id' => $iJournalId,'media_url' => $sMediaUrl,'journal_stage_id' => $iJournalStageId];
$sStartSql = 'INSERT INTO t_ai_journal_material ('.implode(',', array_keys($aInsert)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time),media_id = VALUES(media_id),media_url = VALUES(media_url)';
$sSql = '';
foreach ($aInsert as $key => $value) {
$sSql .= '"'.$value.'",';
//查询是否插入数据
$aWhere = ['journal_id' => $iJournalId,'is_delete' => 2,'journal_stage_id' => $iJournalStageId];
$aMaterial = Db::name('ai_journal_material')->field('id')->where($aWhere)->find();
if(empty($aMaterial['id'])){
$aInsert['create_time'] = $iTime;
$response = Db::name('ai_journal_material')->insertGetId($aInsert);
}else{
$aWhere['id'] = $aMaterial['id'];
$aInsert['update_time'] = $iTime;
$response = Db::name('ai_journal_material')->where($aWhere)->limit(1)->update($aInsert);
}
if($response === false){
return json_encode(['status' => 6,'msg' => 'failed:'.json_encode($response)]);
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
}
/**
@@ -297,15 +289,16 @@ class Material
//查询是否生成二维码
$aWhere = ['journal_id' => $iJournalId,'is_delete' => 2];
if(!empty($iJournalStageId)){
$aWhere['journal_stage_id'] = $iJournalStageId;
}
// if(!empty($iJournalStageId)){
// $aWhere['journal_stage_id'] = $iJournalStageId;
// }
$aMaterial = Db::name('ai_journal_qrcode')->field('id,qrcode_url,media_id,media_url')->where($aWhere)->find();
if(empty($aMaterial)){
return json_encode(['status' => 3,'msg' => 'data is null']);
}
//处理图片地址
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$aMaterial['qrcode_url'];
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$aMaterial['qrcode_url'];
//调用微信新增素材接口上传
$oWechat = new Wechat;
@@ -319,8 +312,8 @@ class Material
return json_encode(['status' => 4,'msg' => $sMsg]);
}
$sMediaId = empty($aData['media_id']) ? [] : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? [] : $aData['url'];
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
$aUpdate = ['media_id' => $sMediaId,'media_url' => $sMediaUrl,'update_time' => $iTime];
$response = Db::name('ai_journal_qrcode')->where('id',$aMaterial['id'])->limit(1)->update($aUpdate);
@@ -348,7 +341,7 @@ class Material
}
//处理图片地址
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$aMaterial['qrcode_url'];
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$aMaterial['qrcode_url'];
//调用微信新增素材接口上传
$oWechat = new Wechat;
@@ -379,50 +372,59 @@ class Material
*/
private function updateArticleAuthor($aParam = []){
//用户邮箱
$sEmail = empty($aParam['email']) ? '' : $aParam['email'];
//文章图片
$sIcon = empty($aParam['icon']) ? '' : $aParam['icon'];
//用户ID
$iUserId = empty($aParam['user_id']) ? 0 : $aParam['user_id'];
if(empty($sEmail) || empty($sIcon)){
//判空
if(empty($sEmail) || empty($sIcon) || empty($iUserId)){
return json_encode(['status' => 2,'msg' => 'email is empty']);
}
//处理图片地址
$sImagePath = ROOT_PATH.$this->sUserIcon.trim($sIcon,'/');
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sUserIcon,'/').'/'.trim($sIcon,'/');
if(trim($sIcon) != $this->sDefaultUserIcon){//非默认头像
//调用微信新增素材接口上传
$oWechat = new Wechat;
$sWechatAppId = empty($aParam['wechat_app_id']) ? '' : $aParam['wechat_app_id'];
$sWechatAppSecret = empty($aParam['wechat_app_secret']) ? '' : $aParam['wechat_app_secret'];
$aImageParam = ['image_url' => $sImagePath,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret];
$aUploadResult = json_decode($oWechat->uploadMaterial($aImageParam),true);
$sMsg = empty($aUploadResult['msg']) ? 'Failed to upload materials' : $aUploadResult['msg'];
$aData = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aData['url'])){
return json_encode(['status' => 5,'msg' => $sMsg]);
}
//调用微信新增素材接口上传
$oWechat = new Wechat;
$sWechatAppId = empty($aParam['wechat_app_id']) ? '' : $aParam['wechat_app_id'];
$sWechatAppSecret = empty($aParam['wechat_app_secret']) ? '' : $aParam['wechat_app_secret'];
$aImageParam = ['image_url' => $sImagePath,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret];
$aUploadResult = json_decode($oWechat->uploadMaterial($aImageParam),true);
$sMsg = empty($aUploadResult['msg']) ? 'Failed to upload materials' : $aUploadResult['msg'];
$aData = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aData['url'])){
return json_encode(['status' => 5,'msg' => $sMsg]);
}
}
if(trim($sIcon) == $this->sDefaultUserIcon){//默认头像
$aData = $this->aLogo;
}
//更新
$sMediaId = empty($aData['media_id']) ? [] : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? [] : $aData['url'];
//处理入库数据
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
$aInsert = ['media_id' => $sMediaId,'media_url' => $sMediaUrl,'create_time' => $iTime,'email' => $sEmail,'user_id' => $aParam['user_id'],'update_time' => $iTime];
//入库数据组装
$aInsert = ['media_id' => $sMediaId,'media_url' => $sMediaUrl,'email' => $sEmail,'user_id' => $aParam['user_id']];
$sStartSql = 'INSERT INTO t_ai_author_material ('.implode(',', array_keys($aInsert)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time),media_id = VALUES(media_id),media_url = VALUES(media_url)';
$sSql = '';
foreach ($aInsert as $key => $value) {
$sSql .= '"'.$value.'",';
//查询是否插入数据
$aWhere = ['user_id' => $iUserId,'is_delete' => 2];
$aMaterial = Db::name('ai_author_material')->field('author_id')->where($aWhere)->find();
if(empty($aMaterial['author_id'])){
$aInsert['create_time'] = $iTime;
$response = Db::name('ai_author_material')->insertGetId($aInsert);
}else{
$aWhere['author_id'] = $aMaterial['author_id'];
$aInsert['update_time'] = $iTime;
$response = Db::name('ai_author_material')->where($aWhere)->limit(1)->update($aInsert);
}
if($response === false){
return json_encode(['status' => 6,'msg' => 'failed:'.json_encode($response)]);
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
}
@@ -440,7 +442,7 @@ class Material
}
//处理图片地址
$sImagePath = ROOT_PATH.$this->sJournalEditorQrcode.trim($sIcon,'/');
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sJournalEditorQrcode,'/').'/'.trim($sIcon,'/');
//调用微信新增素材接口上传
$oWechat = new Wechat;
@@ -451,70 +453,36 @@ class Material
$sMsg = empty($aUploadResult['msg']) ? 'Failed to upload materials' : $aUploadResult['msg'];
$aData = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aData['url'])){
return json_encode(['status' => 5,'msg' => $sMsg]);
return json_encode(['status' => 5,'msg' => $sMsg]);
}
//处理入库数据
$sMediaId = empty($aData['media_id']) ? [] : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? [] : $aData['url'];
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
//入库数据组装
$aInsert = ['media_id' => $sMediaId,'journal_id' => $iJournalId,'media_url' => $sMediaUrl];
//操作数据组装
$aInsert = ['media_id' => $sMediaId,'journal_id' => $iJournalId,'media_url' => $sMediaUrl,'create_time' => $iTime,'update_time' => $iTime];
$sStartSql = 'INSERT INTO t_ai_journal_editor_material ('.implode(',', array_keys($aInsert)).') VALUES (';
$sEndSql = ') ON DUPLICATE KEY UPDATE update_time = VALUES(update_time),media_id = VALUES(media_id),media_url = VALUES(media_url)';
$sSql = '';
foreach ($aInsert as $key => $value) {
$sSql .= '"'.$value.'",';
//查询是否插入数据
$aWhere = ['journal_id' => $iJournalId,'is_delete' => 2];
$aMaterial = Db::name('ai_journal_editor_material')->field('id')->where($aWhere)->find();
if(empty($aMaterial['id'])){
$aInsert['create_time'] = $iTime;
$response = Db::name('ai_journal_editor_material')->insertGetId($aInsert);
}else{
$aWhere['author_id'] = $aMaterial['author_id'];
$aInsert['update_time'] = $iTime;
$response = Db::name('ai_journal_editor_material')->where($aWhere)->limit(1)->update($aInsert);
}
if($response === false){
return json_encode(['status' => 6,'msg' => 'failed:'.json_encode($response)]);
}
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
$result = Db::execute($sSql);
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
}
/**
* 写入Reids 防止两小时内重复上传
*/
public function setStepForRedis($iArticleId = 0,$sStepName = 'addArticleMaterial'){
//写入redis 避免重复请求
$sStepNameForRedis = $this->getStepForRedis($iArticleId);
if(empty($sStepNameForRedis) || (!empty($sStepNameForRedis) && $sStepNameForRedis != 'finish')){
$sRedisKey = $this->sMaterialStepName.'upload_article_id_'.$iArticleId;
return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒
}
}
/**
* 获取Reids 防止两小时内重复上传
*/
public function getStepForRedis($iArticleId = 0){
$sRedisKey = $this->sMaterialStepName.'upload_article_id_'.$iArticleId;
return Cache::get($sRedisKey); // 有效期600秒
}
/**
* 写入Reids 防止两小时内重复上传
*/
public function setErrorForRedis($iArticleId = 0,$sStepName = 'addArticleMaterial'){
$sRedisKey = $this->sMaterialError.$iArticleId;
return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒
}
/**
* 写入Reids 防止两小时内重复上传
*/
public function getErrorForRedis($iArticleId = 0){
$sRedisKey = $this->sMaterialError.$iArticleId;
return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒
}
/**
* 上传素材
*/
public function uploadMaterial($aParam = []){
//获取参数
@@ -539,18 +507,6 @@ class Material
return json_encode(['status' => 2,'msg' => 'Please configure the AppID and AppSecret']);
}
//获取缓存标识
$sStepName = $this->getStepForRedis($iArticleId);
if(!empty($sStepName) && $sStepName == 'finish'){
return json_encode(['status' => 1,'msg' => 'The relevant materials for the article have been uploaded. Please try again in ten minutes']);
}
if(empty($sStepName)){
//写入标识
$this->setStepForRedis($iArticleId);
$sStepName = 'addArticleMaterial';
}
//微信公众号密钥
$aWechatParam = ['wechat_app_id' => $aParam['wechat_app_id'],'wechat_app_secret' => $aParam['wechat_app_secret']];
@@ -561,81 +517,32 @@ class Material
$aArticleParam = ['article_id' => $iArticleId,'icon' => empty($aArticle['icon']) ? '' : $aArticle['icon']];
$aArticleParam += $aWechatParam;
$aUploadStep = [];
//上传文章图片素材
if(!empty($aArticleParam['icon']) && $sStepName == 'addArticleMaterial'){
$aUploadResult = json_decode($this->addArticleMaterial($aArticleParam),true);
$aParam['article_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aParam['article_info'])){
$sMsg = empty($aUploadResult['msg']) ? 'Article material upload failed' : $aUploadResult['msg'];
$this->setErrorForRedis($iArticleId,$sMsg);
return json_encode(['status' => 2,'msg' => $sMsg]);
}
if(!empty($aArticleParam['icon'])){
$aUploadStep[] = ['func_name' => 'addArticleMaterial','params' => $aArticleParam];
}
//写入Redis下一个执行方法
$sStepName = 'updateArticleQrcode';
$this->setStepForRedis($iArticleId,$sStepName);
//文章二维码图片上传
if($sStepName == 'updateArticleQrcode'){
$aUploadResult = json_decode($this->updateArticleQrcode($aArticleParam),true);
$aParam['article_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aParam['article_qrcode_info'])){
$sMsg = empty($aUploadResult['msg']) ? 'Article QR code image upload failed' : $aUploadResult['msg'];
$this->setErrorForRedis($iArticleId,$sMsg);
return json_encode(['status' => 2,'msg' => $sMsg]);
}
}
//写入Redis下一个执行方法
$sStepName = 'addJournalMaterial';
$this->setStepForRedis($iArticleId, $sStepName);
$aUploadResult = json_decode($this->updateArticleQrcode($aArticleParam),true);
$aUploadStep[] = ['func_name' => 'updateArticleQrcode','params' => $aArticleParam];
//获取期刊信息
$aJournal = empty($aParam['journal_info']) ? [] : $aParam['journal_info'];
//上传期刊素材相关参数组装
$aJournalParam = ['journal_id' => $iJournalId,'icon' => empty($aJournal['icon']) ? '' : $aJournal['icon'],'editor_qrcode' => empty($aJournal['editor_qrcode']) ? '' : $aJournal['editor_qrcode'],'journal_stage_id' => empty($aJournal['journal_stage_id']) ? 0 : $aJournal['journal_stage_id']];
$aJournalParam = ['article_id' => $iArticleId,'journal_id' => $iJournalId,'icon' => empty($aJournal['icon']) ? '' : $aJournal['icon'],'editor_qrcode' => empty($aJournal['editor_qrcode']) ? '' : $aJournal['editor_qrcode'],'journal_stage_id' => empty($aJournal['journal_stage_id']) ? 0 : $aJournal['journal_stage_id']];
$aJournalParam += $aWechatParam;
//上传期刊图片
if(!empty($aJournalParam['icon']) && $sStepName == 'addJournalMaterial'){
$aUploadResult = json_decode($this->addJournalMaterial($aJournalParam),true);
$aParam['journal_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aParam['journal_info'])){
$sMsg = empty($aUploadResult['msg']) ? 'Journal material image upload failed' : $aUploadResult['msg'];
$this->setErrorForRedis($iArticleId,$sMsg);
return json_encode(['status' => 2,'msg' => $sMsg]);
}
if(!empty($aJournalParam['icon'])){
$aUploadStep[] = ['func_name' => 'addJournalMaterial','params' => $aJournalParam];
}
//写入Redis下一个执行方法
$sStepName = 'updateJournalQrcode';
$this->setStepForRedis($iArticleId,$sStepName);
//上传期刊二维码
if($sStepName == 'updateJournalQrcode'){
$aUploadResult = json_decode($this->updateJournalQrcode($aJournalParam),true);
$aParam['journal_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aParam['journal_qrcode_info'])){
$sMsg = empty($aUploadResult['msg']) ? 'Journal QR code image upload failed' : $aUploadResult['msg'];
$this->setErrorForRedis($iArticleId,$sMsg);
return json_encode(['status' => 2,'msg' => $sMsg]);
}
}
//写入Redis下一个执行方法
$sStepName = 'updateJournalEditorQrcode';
$this->setStepForRedis($iArticleId,$sStepName);
$aUploadStep[] = ['func_name' => 'updateJournalQrcode','params' => $aJournalParam];
//期刊编辑二维码
if(!empty($aJournalParam['editor_qrcode']) && $sStepName == 'updateJournalEditorQrcode'){
$aUploadResult = json_decode($this->updateJournalEditorQrcode($aJournalParam),true);
$aParam['editor_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aParam['editor_qrcode_info'])){
$sMsg = empty($aUploadResult['msg']) ? "Journal editor's QR code image upload failed" : $aUploadResult['msg'];
$this->setErrorForRedis($iArticleId,$sMsg);
return json_encode(['status' => 2,'msg' => $sMsg]);
}
if(!empty($aJournalParam['editor_qrcode'])){
$aUploadStep[] = ['func_name' => 'updateJournalEditorQrcode','params' => $aJournalParam];
}
//写入下一个执行方法
$sStepName = 'updateArticleAuthor';
$this->setStepForRedis($iArticleId,$sStepName);
//作者
$aAuthor = empty($aParam['author_info']) ? [] : $aParam['author_info'];
if(!empty($aAuthor) && $sStepName == 'updateArticleAuthor'){
$sError = '';
if(!empty($aAuthor)){
foreach ($aAuthor as $key => $value) {
if(empty($value['icon'])){
continue;
@@ -643,25 +550,178 @@ class Material
//文章二维码图片上传
$aUpload = ['email' => $value['email'],'icon' => $value['icon'],'user_id' => $value['user_id']];
$aUpload += $aWechatParam;
$aAuthorResult = json_decode($this->updateArticleAuthor($aUpload),true);
$aAuthorData = empty($aAuthorResult['data']) ? [] : $aAuthorResult['data'];
if(empty($aAuthorData)){
$sError .= empty($aAuthorResult['msg']) ? "The corresponding author's avatar upload failed:".$value['email'].';' : $aAuthorResult['msg']."-".$value['email'].';';
}
$aAuthor[$key]['icon'] = empty($aAuthorData['media_url']) ? $value['icon'] : $aAuthorData['media_url'];
$aUploadStep[] = ['func_name' => 'updateArticleAuthor','params' => $aUpload];
}
$aParam['author_info'] = $aAuthor;
}
if(!empty($sError)){
$this->setErrorForRedis($iArticleId,$sError);
return json_encode(['status' => 2,'msg' => $sError]);
//查询研究结果素材
$aWhere = ['article_id' => $iArticleId,'ami_id' => ['<>','']];
$aArticleResults = Db::name('ai_article_results')->where($aWhere)->column('ami_id');
$aArticleResults = empty($aArticleResults) ? '' : implode(',', $aArticleResults);
$aArticleResults = empty($aArticleResults) ? [] : array_unique(explode(',', $aArticleResults));
if(!empty($aArticleResults)){
foreach ($aArticleResults as $key => $value) {
$aParams = ['ami_id' => $value,'article_id' => $iArticleId];
$aParams += $aWechatParam;
$aUploadStep[] = ['func_name' => 'addArticleResultMaterial','params' => $aParams];
}
}
//写入redis 上传执行完成
$this->setStepForRedis($iArticleId,'finish');
//返回参数
return json_encode(['status' => 1,'msg' => 'Upload successful','data' => $aParam]);
//数据处理
if(empty($aUploadStep)){
return json_encode(['status' => 3,'msg' => 'upload data is null']);
}
//记录处理开始
$iNum = count($aUploadStep);
$sRedisKey = 'queue_material_job:upload:'.$iArticleId;
$result = $this->oQueueRedis->recordProcessingStart($sRedisKey,$iNum);
$result = empty($result) ? 0 : $result;
if($result == 1){
foreach ($aUploadStep as $key => $value) {
$aParam = empty($value['params']) ? [] : $value['params'];
$aParam += ['chunkIndex' => $key+1,'func_name' => empty($value['func_name']) ? '' : $value['func_name']];
Queue::push('app\api\job\uploadMaterialStep@fire', $aParam, 'uploadMaterialStep');
}
//返回结果
return json_encode(['status' => 1, 'msg' => 'The article material is being uploaded, please wait']);
}
if($result == 2){
return json_encode(['status' => 4, 'msg' => 'The article material has been uploaded. Please proceed to the next step']);
}
if($result == 3){
return json_encode(['status' => 5, 'msg' => 'Uploading,please wait']);
}
return json_encode(['status' => 6, 'msg' => 'Redis write failure']);
}
/**
* 上传素材-分步执行队列
*/
public function uploadMaterialStep($aParam = []){
//主键ID
$iId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iId)){
return json_encode(['status' => 2, 'msg' => 'Please select an article']);
}
//执行方法名
$sFuncName = empty($aParam['func_name']) ? [] : $aParam['func_name'];
if (empty($sFuncName)) {
return json_encode(['status' => 2, 'msg' => 'The execution method is null']);
}
//请求方法上传
$aResult = json_decode($this->$sFuncName($aParam),true);
$iStatus = empty($aResult['status']) ? 0 : $aResult['status'];
$sMsg = empty($aResult['msg']) ? 'upload fail' : $aResult['msg'];
//更新处理进度
$iIndex = empty($aParam['chunkIndex']) ? 0 : $aParam['chunkIndex'];
$sRedisKey = 'queue_material_job:upload:'.$iId;
$iProgress = $this->oQueueRedis->updateProcessingProgress($sRedisKey,$iIndex);
//保存内容
$sRedisKey = 'queue_job:article_material_upload_progress:'.$iId;
$this->oQueueRedis->saveChunkProgress($sRedisKey, $iIndex,json_encode($aResult));
//获取日志判断是否插入
$aWhere = ['article_id' => $iId,'type' => 1];
$aLog = json_decode($this->getWechatLog($aWhere),true);
$aLog = empty($aLog['data']) ? [] : $aLog['data'];
if(!empty($aLog)){
$sMsg .= empty($aLog['msg']) ? '' : ';'.$aLog['msg'];
}
if($iStatus != 1) {
$iStatus = 2;
}
if($iProgress >= 100){
$iStatus = 1;
}else{
$iStatus = 3;
}
//插入日志记录
$aUpdate = ['article_id' => $iId,'type' => 1,'msg' => $sFuncName.':'.$sMsg,'status' => $iStatus,'create_time' => time()];
if(empty($aLog['log_id'])){
$result = $this->addWechatLog($aUpdate);
}else{
$aWhere['log_id'] = $aLog['log_id'];
$result = Db::name('wechat_api_log')->where($aWhere)->limit(1)->update($aUpdate);
}
return json_encode($aResult);
}
/**
* 添加文章结果素材
*/
private function addArticleResultMaterial($aParam = []){
//文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
//素材ID
$iAmiId = empty($aParam['ami_id']) ? 0 : $aParam['ami_id'];
//必填验证
if(empty($iArticleId) || empty($iAmiId)){
return json_encode(['status' => 2,'msg' => 'article_id or ami_id is empty']);
}
//查询素材信息
$aWhere = ['state' => 0,'ami_id' => $iAmiId];
$aMainImage = Db::name('article_main_image')->field('url')->where($aWhere)->find();
if(empty($aMainImage['url'])){
return json_encode(['status' => 3,'msg' => 'No materials found']);
}
//处理图片地址
$aImageInfo = pathinfo($aMainImage['url']);
//判断图片是否存在
$sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension'];//图片后缀名
$sImagePath = 'article_result/imgae_'.$iArticleId.'_'.$iAmiId.'.'.$sExtension;//下载后图片地址
$sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath;//组装地址
if (!file_exists($sImagePath)) {//下载图片
//原图片地址
$sImagePath = trim($this->sSubmissionUrl,'/').'/public/articleImage/'.$aMainImage['url'];
//下载图片
$aImageInfo = json_decode($this->getImage($sImagePath,$iArticleId.'_'.$iAmiId,'article_result'),true);
if(empty($aImageInfo['data'])){
return json_encode(['status' => 3,'msg' => 'Image download failed']);
}
$sImagePath = $aImageInfo['data'];
}
//调用微信新增素材接口上传
$oWechat = new Wechat;
$sWechatAppId = empty($aParam['wechat_app_id']) ? '' : $aParam['wechat_app_id'];
$sWechatAppSecret = empty($aParam['wechat_app_secret']) ? '' : $aParam['wechat_app_secret'];
$aImageParam = ['image_url' => $sImagePath,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret];
$aUploadResult = json_decode($oWechat->uploadMaterial($aImageParam),true);
$sMsg = empty($aUploadResult['msg']) ? 'Failed to upload materials' : $aUploadResult['msg'];
$aData = empty($aUploadResult['data']) ? [] : $aUploadResult['data'];
if(empty($aData['url'])){
return json_encode(['status' => 4,'msg' => $sMsg]);
}
//处理入库数据
$sMediaId = empty($aData['media_id']) ? '' : $aData['media_id'];
$sMediaUrl = empty($aData['url']) ? '' : $aData['url'];
$iTime = empty($aUploadResult['created_at']) ? time() : $aUploadResult['created_at'];
//入库数据组装
$aInsert = ['media_id' => $sMediaId,'article_id' => $iArticleId,'ami_id' => $iAmiId,'media_url' => $sMediaUrl];
//查询是否插入数据
$aWhere = ['article_id' => $iArticleId,'ami_id' => $iAmiId,'is_delete' => 2];
$aMaterial = Db::name('ai_results_material')->field('id')->where($aWhere)->find();
if(empty($aMaterial['id'])){
$aInsert['create_time'] = $iTime;
$response = Db::name('ai_results_material')->insertGetId($aInsert);
}else{
$aWhere['id'] = $aMaterial['id'];
$aInsert['update_time'] = $iTime;
$response = Db::name('ai_results_material')->where($aWhere)->limit(1)->update($aInsert);
}
if($response === false){
return json_encode(['status' => 6,'msg' => 'failed:'.json_encode($response)]);
}
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
}
/**
* 获取素材
*/
@@ -713,7 +773,7 @@ class Material
*/
public function addWechatLog($aParam = []){
//获取参数
$aParam = empty($aParam) ? $this->request->post() : $aParam;
$aParam = empty($aParam) ? [] : $aParam;
//必填参数验证
if(empty($aParam['article_id']) || empty($aParam['type'])){
return json_encode(['status' => 2, 'msg' => '非法操作']);
@@ -730,7 +790,7 @@ class Material
*/
public function getWechatLog($aParam = []){
//获取参数
$aParam = empty($aParam) ? $this->request->post() : $aParam;
$aParam = empty($aParam) ? [] : $aParam;
//必填参数验证
if(empty($aParam['article_id']) || empty($aParam['type'])){
return json_encode(['status' => 2, 'msg' => '非法操作']);