Files
tougao/application/common/Material.php
2025-08-07 16:43:51 +08:00

805 lines
37 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\common;
use think\Db;
use app\common\QrCodeImage;
use app\common\Wechat;
use think\Cache;
use think\Queue;
use app\common\QueueRedis;
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';
//投稿系统
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->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'];
}
$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);
}
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]);
}
}