701 lines
32 KiB
PHP
701 lines
32 KiB
PHP
<?php
|
||
namespace app\common;
|
||
use think\Db;
|
||
use app\common\QrCodeImage;
|
||
use app\common\Wechat;
|
||
use think\Cache;
|
||
class Material
|
||
{
|
||
|
||
protected $aLogo = ['media_id' => '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';
|
||
|
||
public function __construct(\think\Request $request = null) {
|
||
|
||
}
|
||
|
||
/**
|
||
* @title 生成期刊二维码
|
||
* @param aJournal 期刊信息
|
||
*/
|
||
public function createJournalQrCode($aJournal = []){
|
||
|
||
$iJournalId = empty($aJournal['journal_id']) ? 0 : $aJournal['journal_id'];
|
||
|
||
//生成图片地址
|
||
$sImagePath = 'journal/'.$iJournalId.'.jpg';
|
||
$sQrCodeUrl = ROOT_PATH.$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)){
|
||
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
|
||
}else{
|
||
$sLogo = trim($this->sJournalUsx,'/').$this->sJournalIcon.$sLogo;
|
||
$aImageInfo = json_decode($this->getImage($sLogo,$iJournalId,'journal'),true);
|
||
if(empty($aImageInfo['data'])){
|
||
$sImg = QrCodeImage::generate($sUrl,500,$sQrCodeUrl);
|
||
}
|
||
$sImg = QrCodeImage::withLogo($sUrl,$aImageInfo['data'],500,100, $sQrCodeUrl);
|
||
}
|
||
|
||
//插入字段
|
||
$aInsertParam = ['journal_id' => $iJournalId,'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);
|
||
return $aInsertParam;
|
||
}
|
||
|
||
/**
|
||
* @title 生成文章二维码
|
||
* @param aArticle 文章信息
|
||
*/
|
||
public function createArticleQrCode($aArticle = []){
|
||
|
||
$iArticleId = empty($aArticle['article_id']) ? 0 : $aArticle['article_id'];
|
||
|
||
//创建二维码
|
||
//生成图片地址
|
||
$sImagePath = 'article/'.$iArticleId.'.jpg';
|
||
$sQrCodeUrl = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
|
||
//地址
|
||
$sUrl = trim($this->sJournalUsx,'/').'/'.'article.html?J_num='.$aArticle['journal_id'].'&a_id='.$iArticleId;
|
||
|
||
//二维码中间图片
|
||
$sLogo = $aArticle['article_icon'];
|
||
if(empty($sLogo)){
|
||
$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);
|
||
}
|
||
|
||
//插入字段
|
||
$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);
|
||
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 = ROOT_PATH.$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 = ROOT_PATH.$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,'create_time' => $iTime,'article_id' => $iArticleId,'media_url' => $sMediaUrl,'update_time' => $iTime];
|
||
|
||
$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.'",';
|
||
}
|
||
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
|
||
$result = Db::execute($sSql);
|
||
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
|
||
}
|
||
/**
|
||
* 添加期刊素材
|
||
*/
|
||
private function addJournalMaterial($aParam = []){
|
||
|
||
//期刊ID
|
||
$iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_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.'.'.$sExtension;
|
||
$sImagePath = ROOT_PATH.$this->sQrCodeUrl.$sImagePath;
|
||
if (!file_exists($sImagePath)) {//下载图片
|
||
$aImageInfo = json_decode($this->getImage($sIcon,$iJournalId,'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,'create_time' => $iTime,'journal_id' => $iJournalId,'media_url' => $sMediaUrl,'update_time' => $iTime];
|
||
|
||
$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.'",';
|
||
}
|
||
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
|
||
$result = Db::execute($sSql);
|
||
return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]);
|
||
}
|
||
/**
|
||
* 更新期刊二维码关联微信公众号素材
|
||
*/
|
||
private function updateJournalQrcode($aParam = []){
|
||
|
||
//期刊ID
|
||
$iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id'];
|
||
if(empty($iJournalId)){
|
||
return json_encode(['status' => 2,'msg' => 'journal_id or image is empty']);
|
||
}
|
||
|
||
//查询是否生成二维码
|
||
$aWhere = ['journal_id' => $iJournalId,'is_delete' => 2];
|
||
$aMaterial = Db::name('ai_journal_qrcode')->field('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'];
|
||
|
||
//调用微信新增素材接口上传
|
||
$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('journal_id',$iJournalId)->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 = ROOT_PATH.$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'];
|
||
|
||
if(empty($sEmail) || empty($sIcon)){
|
||
return json_encode(['status' => 2,'msg' => 'email is empty']);
|
||
}
|
||
|
||
//处理图片地址
|
||
$sImagePath = ROOT_PATH.$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,'create_time' => $iTime,'email' => $sEmail,'user_id' => $aParam['user_id'],'update_time' => $iTime];
|
||
|
||
$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.'",';
|
||
}
|
||
$sSql = $sStartSql.trim($sSql,',').$sEndSql;
|
||
$result = Db::execute($sSql);
|
||
|
||
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 = ROOT_PATH.$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,'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.'",';
|
||
}
|
||
$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 = []){
|
||
|
||
//获取参数
|
||
$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']);
|
||
}
|
||
|
||
//获取缓存标识
|
||
$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']];
|
||
|
||
//获取文章参数
|
||
$aArticle = empty($aParam['article_info']) ? [] : $aParam['article_info'];
|
||
|
||
//上传文章素材参数组装
|
||
$aArticleParam = ['article_id' => $iArticleId,'icon' => empty($aArticle['icon']) ? '' : $aArticle['icon']];
|
||
$aArticleParam += $aWechatParam;
|
||
|
||
//上传文章图片素材
|
||
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]);
|
||
}
|
||
}
|
||
//写入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);
|
||
//获取期刊信息
|
||
$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']];
|
||
$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]);
|
||
}
|
||
}
|
||
//写入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);
|
||
//期刊编辑二维码
|
||
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]);
|
||
}
|
||
}
|
||
//写入下一个执行方法
|
||
$sStepName = 'updateArticleAuthor';
|
||
$this->setStepForRedis($iArticleId,$sStepName);
|
||
//作者
|
||
$aAuthor = empty($aParam['author_info']) ? [] : $aParam['author_info'];
|
||
if(!empty($aAuthor) && $sStepName == 'updateArticleAuthor'){
|
||
$sError = '';
|
||
foreach ($aAuthor as $key => $value) {
|
||
if(empty($value['icon'])){
|
||
continue;
|
||
}
|
||
//文章二维码图片上传
|
||
$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'];
|
||
}
|
||
$aParam['author_info'] = $aAuthor;
|
||
}
|
||
if(!empty($sError)){
|
||
$this->setErrorForRedis($iArticleId,$sError);
|
||
return json_encode(['status' => 2,'msg' => $sError]);
|
||
}
|
||
//写入redis 上传执行完成
|
||
$this->setStepForRedis($iArticleId,'finish');
|
||
//返回参数
|
||
return json_encode(['status' => 1,'msg' => 'Upload successful','data' => $aParam]);
|
||
}
|
||
|
||
/**
|
||
* 获取素材
|
||
*/
|
||
|
||
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)->find();
|
||
}
|
||
return json_encode(['status' => 1,'msg' => 'Successfully obtained data','data' => $aData]);
|
||
}
|
||
}
|