'Cn8zlXvVB5DwjcA9h40z9fprHDoc3Jqv97SwrInpmyYiilkeRdKvpD63cWqTYHfz','url' => 'http://mmbiz.qpic.cn/mmbiz_jpg/QHFVW13lONaQJxK9QbHU9CtrvTS2ModZnUyeAvuVN67t8XP85DxVJwDJf2YxCTalrsr17jS080xM6xQv5yGiaEQ/0?wx_fmt=jpeg'];//默认头像 //文章图片icon地址 protected $sArticleIcon = '/public/articleicon/'; //期刊图片icon地址 protected $sJournalIcon = '/public/journalicon/'; //作者头像地址 protected $sUserIcon = '/public/usericon/'; //期刊编辑二维码地址 protected $sJournalEditorQrcode = '/public/journaleditorqrcode/'; //二维码地址 protected $sQrCodeUrl = 'public/qrcode/'; //官网地址 protected $sJournalUsx = 'https://www.tmrjournals.com'; //默认头像 protected $sDefaultUserIcon = '/static/img/userImg.f3d9bc3b.jpg'; protected $sMaterialStepName = 'upload_step_name_'; protected $sMaterialError = 'upload_error_'; protected $sAppID; //= 'wx03cb871b66e34e10'; protected $sAppSecret; //= 'f59ccaf00383dcfab489292c4697620a'; //投稿系统 protected $sSubmissionUrl = 'https://submission.tmrjournals.com/'; //定义redis连接 private $oQueueRedis; public function __construct() { $this->oQueueRedis = QueueRedis::getInstance(); } /** * @title 生成期刊二维码 * @param aJournal 期刊信息 */ public function createJournalQrCode($aJournal = []){ $iJournalId = empty($aJournal['journal_id']) ? 0 : $aJournal['journal_id']; $iJournalStageId = empty($aJournal['journal_stage_id']) ? 0 : $aJournal['journal_stage_id']; //生成图片地址 $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.'/'; //创建二维码 //判断二维码是否生成 if (!file_exists($sQrCodeUrl)) { $sImg = QrCodeImage::generate($sUrl,500,$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()]; $response = Db::name('ai_journal_qrcode')->insertGetId($aInsertParam); return $aInsertParam; } /** * @title 生成文章二维码 * @param aArticle 文章信息 */ public function createArticleQrCode($aArticle = []){ $iArticleId = empty($aArticle['article_id']) ? 0 : $aArticle['article_id']; //创建二维码 //生成图片地址 $sImagePath = 'article/'.$iArticleId.'.jpg'; $sQrCodeUrl = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath; //地址 $sUrl = trim($this->sJournalUsx,'/').'/'.'article.html?J_num='.$aArticle['journal_id'].'&a_id='.$iArticleId; //判断二维码是否生成 if (!file_exists($sQrCodeUrl)) { $sImg = QrCodeImage::generate($sUrl,500,$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()]; $response = Db::name('ai_article_qrcode')->insertGetId($aInsertParam); return $aInsertParam; } /** * @title curl 请求获取图片保存到本地 * @param sPath 图片链接地址 */ public function getImage($sPath = '',$iId = 0,$sType = 'journal'){ //判断参数 if(empty($sPath)){ return json_encode(['status' => 2,'msg' => 'url is empty','data' => '']); } //获取图片名称 $aImageInfo = pathinfo($sPath); //图片后缀名 $sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension']; //图片地址 $sImagePath = $sType.'/imgae_'.$iId.'.'.$sExtension; $sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$sImagePath; if (file_exists($sImagePath)) { return json_encode(['status' => 1,'msg' => 'success','data' => $sImagePath]); } //curl 请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$sPath); // 设置请求URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置返回数据而不是直接输出 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用SSL验证 $response = curl_exec($ch); if (curl_errno($ch)) { return json_encode(['status' => 3,'msg' => 'Error:' . curl_error($ch),'data' => $sImagePath]); } //保存图片 file_put_contents($sImagePath, $response); curl_close($ch); return json_encode(['status' => 1,'msg' => 'success','data' => $sImagePath]); } /** * 添加文章素材 * @param article_id 文章ID * @param media_id 微信公众号素材media_id * @param media_url 微信公众号素材地址 * @param sType select 查询|add 新增 * @param $sPath 图片地址 */ private function addArticleMaterial($aParam = []){ //文章ID $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; //文章图片 $sIcon = empty($aParam['icon']) ? '' : $aParam['icon']; //必填验证 if(empty($iArticleId) || empty($sIcon)){ return json_encode(['status' => 2,'msg' => 'article_id or article_image is empty']); } //处理图片地址 $aImageInfo = pathinfo($sIcon); //图片后缀名 $sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension']; $sImagePath = 'article/imgae_'.$iArticleId.'.'.$sExtension; $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'])){ return json_encode(['status' => 3,'msg' => 'Image download failed']); } } //调用微信新增素材接口上传 $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 = ['type' => 'image','media_id' => $sMediaId,'article_id' => $iArticleId,'media_url' => $sMediaUrl]; //查询是否插入数据 $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)]); } return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } /** * 添加期刊素材 */ private function addJournalMaterial($aParam = []){ //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; //子期刊ID $iJournalStageId = empty($aParam['journal_stage_id']) ? 0 : $aParam['journal_stage_id']; //期刊图片 $sIcon = empty($aParam['icon']) ? '' : $aParam['icon']; if(empty($iJournalId) || empty($sIcon)){ return json_encode(['status' => 2,'msg' => 'journal_id or image is empty']); } //处理图片地址 $aImageInfo = pathinfo($sIcon); //图片后缀名 $sExtension = empty($aImageInfo['extension']) ? 'jpg' : $aImageInfo['extension']; $sImagePath = 'journal/imgae_'.$iJournalId.'_'.$iJournalStageId.'.'.$sExtension; $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; $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 = ['type' => 'image','media_id' => $sMediaId,'journal_id' => $iJournalId,'media_url' => $sMediaUrl,'journal_stage_id' => $iJournalStageId]; //查询是否插入数据 $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)]); } return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } /** * 更新期刊二维码关联微信公众号素材 */ private function updateJournalQrcode($aParam = []){ //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; //子期刊ID $iJournalStageId = empty($aParam['journal_stage_id']) ? 0 : $aParam['journal_stage_id']; if(empty($iJournalId)){ return json_encode(['status' => 2,'msg' => 'journal_id or image is empty']); } //查询是否生成二维码 $aWhere = ['journal_id' => $iJournalId,'is_delete' => 2]; // 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 = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$aMaterial['qrcode_url']; //调用微信新增素材接口上传 $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']; $aUpdate = ['media_id' => $sMediaId,'media_url' => $sMediaUrl,'update_time' => $iTime]; $response = Db::name('ai_journal_qrcode')->where('id',$aMaterial['id'])->limit(1)->update($aUpdate); if($response === false){ return json_encode(['status' => 3,'msg' => 'fail']); } return json_encode(['status' => 1,'msg' => 'success','data' => $aUpdate]); } /** * 更新文章二维码关联微信公众号素材 */ private function updateArticleQrcode($aParam = []){ $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'article_id is empty']); } //查询是否添加素材 $aWhere = ['article_id' => $iArticleId,'is_delete' => 2]; $aMaterial = Db::name('ai_article_qrcode')->field('qrcode_url,media_id,media_url')->where($aWhere)->find(); if(empty($aMaterial)){ return json_encode(['status' => 3,'msg' => 'data is null']); } //处理图片地址 $sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sQrCodeUrl,'/').'/'.$aMaterial['qrcode_url']; //调用微信新增素材接口上传 $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]); } //更新 $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_article_qrcode')->where('article_id',$iArticleId)->limit(1)->update($aUpdate); if($response === false){ return json_encode(['status' => 3,'msg' => 'update fail']); } return json_encode(['status' => 1,'msg' => 'success','data' => $aUpdate]); } /** * 更新通讯作者关联微信公众号素材 */ 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) || empty($iUserId)){ return json_encode(['status' => 2,'msg' => 'email is empty']); } //处理图片地址 $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]); } } if(trim($sIcon) == $this->sDefaultUserIcon){//默认头像 $aData = $this->aLogo; } //处理入库数据 $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,'email' => $sEmail,'user_id' => $aParam['user_id']]; //查询是否插入数据 $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)]); } return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } /** * 更新通讯作者关联微信公众号素材 */ private function updateJournalEditorQrcode($aParam = []){ $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; //文章图片 $sIcon = empty($aParam['editor_qrcode']) ? '' : $aParam['editor_qrcode']; if(empty($iJournalId) || empty($sIcon)){ return json_encode(['status' => 2,'msg' => 'The journal editor did not upload the QR code']); } //处理图片地址 $sImagePath = rtrim(ROOT_PATH,'/').'/'.trim($this->sJournalEditorQrcode,'/').'/'.trim($sIcon,'/'); //调用微信新增素材接口上传 $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]); } //处理入库数据 $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]; //查询是否插入数据 $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['id'] = $aMaterial['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)]); } return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } /** * 上传素材 */ public function uploadMaterial($aParam = []){ //获取参数 $aParam = empty($aParam) ? $this->input->post() : $aParam; //文章ID $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; //必填验证 if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'article_id is empty']); } //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; if(empty($iJournalId)){ return json_encode(['status' => 2,'msg' => 'journal_id is empty']); } // 获取微信公众号APPID和APPKEY if(empty($aParam['wechat_app_id']) || empty($aParam['wechat_app_secret'])){ return json_encode(['status' => 2,'msg' => 'Please configure the AppID and AppSecret']); } //微信公众号密钥 $aWechatParam = ['wechat_app_id' => $aParam['wechat_app_id'],'wechat_app_secret' => $aParam['wechat_app_secret']]; //获取文章参数 $aArticle = empty($aParam['article_info']) ? [] : $aParam['article_info']; //上传文章素材参数组装 $aArticleParam = ['article_id' => $iArticleId,'icon' => empty($aArticle['icon']) ? '' : $aArticle['icon']]; $aArticleParam += $aWechatParam; $aUploadStep = []; //上传文章图片素材 if(!empty($aArticleParam['icon'])){ $aUploadStep[] = ['func_name' => 'addArticleMaterial','params' => $aArticleParam]; } //文章二维码图片上传 $aUploadResult = json_decode($this->updateArticleQrcode($aArticleParam),true); $aUploadStep[] = ['func_name' => 'updateArticleQrcode','params' => $aArticleParam]; //获取期刊信息 $aJournal = empty($aParam['journal_info']) ? [] : $aParam['journal_info']; //上传期刊素材相关参数组装 $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'])){ $aUploadStep[] = ['func_name' => 'addJournalMaterial','params' => $aJournalParam]; } //上传期刊二维码 $aUploadStep[] = ['func_name' => 'updateJournalQrcode','params' => $aJournalParam]; //期刊编辑二维码 if(!empty($aJournalParam['editor_qrcode'])){ $aUploadStep[] = ['func_name' => 'updateJournalEditorQrcode','params' => $aJournalParam]; } //作者 $aAuthor = empty($aParam['author_info']) ? [] : $aParam['author_info']; if(!empty($aAuthor)){ foreach ($aAuthor as $key => $value) { if(empty($value['icon'])){ continue; } //文章二维码图片上传 $aUpload = ['email' => $value['email'],'icon' => $value['icon'],'user_id' => $value['user_id'],'article_id' => $iArticleId]; $aUpload += $aWechatParam; $aUploadStep[] = ['func_name' => 'updateArticleAuthor','params' => $aUpload]; } } //查询研究结果素材 $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]; } } //数据处理 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->recordQuestionProcessingStart($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']]; $aParam['key_name'] = 'queue_1_completed'; 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']); } //更新处理进度 $iIndex = empty($aParam['chunkIndex']) ? 0 : $aParam['chunkIndex']; $sRedisKey = 'queue_material_job:upload:'.$iId; $sChunkProgress = $this->oQueueRedis->getChunkProgress($sRedisKey, $iIndex); if(!empty($sChunkProgress)){ return json_encode(['status' => 3, 'msg' => $sRedisKey.'_'.$iIndex.' Uploaded']); } //请求方法上传 $aResult = json_decode($this->$sFuncName($aParam),true); $iStatus = empty($aResult['status']) ? 0 : $aResult['status']; $sMsg = empty($aResult['msg']) ? 'upload fail' : $aResult['msg']; //更新处理进度 $sKeyName = empty($aParam['key_name']) ? 'queue_1_completed' : $aParam['key_name']; $iProgress = $this->oQueueRedis->updateQuestionProcessingProgress($sRedisKey,$sKeyName); //保存内容 $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']) ? '' : "\n".$aLog['msg']; } $sStatusName = 'processing'; if($iStatus != 1) { $iStatus = 2; $sStatusName = 'fail'; } if($iProgress >= 100){ $iStatus = 1; $sStatusName = 'finish'; }else{ $iStatus = 3; } //插入日志记录 $aUpdate = ['article_id' => $iId,'type' => 1,'msg' => $sFuncName.':'.$sMsg,'status' => $iStatus,'create_time' => time(),'status_name' => $sStatusName]; 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); } if($iProgress >= 100){//上传素材完成后【1分钟后推送草稿箱】 $iDelaySeconds = 60;// 1分钟的秒数 Queue::later($iDelaySeconds,'app\api\job\WechatDraft@fire', ['article_id' => $iId], 'WechatDraft'); } 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]); } /** * 获取素材 */ public function getMaterial($aParam = []){ //获取参数 $aParam = empty($aParam) ? $this->input->post() : $aParam; //文章ID $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; //必填验证 if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'article_id is empty']); } //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; if(empty($iJournalId)){ return json_encode(['status' => 2,'msg' => 'journal_id is empty']); } //返回数据定义空数组 $aData = []; //文章图片素材 $aWhere = ['article_id' => $iArticleId,'is_delete' => 2]; $aData['ai_article_material'] = Db::name('ai_article_material')->field('media_id,media_url')->where($aWhere)->find(); //文章二维码素材 $aData['ai_article_qrcode'] = Db::name('ai_article_qrcode')->field('media_id,media_url')->where($aWhere)->find(); //期刊素材 $aJournalWhere = ['journal_id' => $iJournalId,'is_delete' => 2]; $aData['ai_journal_material'] = Db::name('ai_journal_material')->field('media_id,media_url')->where($aJournalWhere)->find(); //期刊二维码 $aData['ai_journal_qrcode'] = Db::name('ai_journal_qrcode')->field('media_id,media_url')->where($aJournalWhere)->find(); //期刊编辑 $aData['ai_journal_editor_material'] = Db::name('ai_journal_editor_material')->field('media_id,media_url')->where($aJournalWhere)->find(); //文章作者 if(!empty($aParam['author_info'])){ $aEmail = array_column($aParam['author_info'], 'email'); $aWhere = ['email' => ['in',$aEmail],'is_delete' => 2]; $aData['ai_author_material'] = Db::name('ai_author_material')->field('user_id,email,media_id,media_url')->where($aWhere)->select(); } return json_encode(['status' => 1,'msg' => 'Successfully obtained data','data' => $aData]); } /** * 对接微信公众号日志 */ public function addWechatLog($aParam = []){ //获取参数 $aParam = empty($aParam) ? [] : $aParam; //必填参数验证 if(empty($aParam['article_id']) || empty($aParam['type'])){ return json_encode(['status' => 2, 'msg' => '非法操作']); } $result = Db::name('wechat_api_log')->insertGetId($aParam); if($result === false){ return json_encode(['status' => 3, 'msg' => '数据插入失败'.Db::getLastSql()."\n数据内容:",'data' => $aParam]); } return json_encode(['status' => 1, 'msg' => '日志插入成功']); } /** * 获取公众号 */ public function getWechatLog($aParam = []){ //获取参数 $aParam = empty($aParam) ? [] : $aParam; //必填参数验证 if(empty($aParam['article_id']) || empty($aParam['type'])){ return json_encode(['status' => 2, 'msg' => '非法操作']); } $aLog = Db::name('wechat_api_log')->where($aParam)->find(); return json_encode(['status' => 1, 'msg' => '获取数据成功','data' => $aLog]); } }