From a42aff2b13b7c4b7d6d1accfb2dc5c734fc609fe Mon Sep 17 00:00:00 2001 From: chengxl Date: Thu, 7 Aug 2025 13:52:52 +0800 Subject: [PATCH] =?UTF-8?q?redis=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/common/Material.php | 560 ++++++++++++++++++-------------- 1 file changed, 310 insertions(+), 250 deletions(-) diff --git a/application/common/Material.php b/application/common/Material.php index e38aafa..7852dfc 100644 --- a/application/common/Material.php +++ b/application/common/Material.php @@ -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' => '非法操作']);