diff --git a/application/api/controller/Aiarticle.php b/application/api/controller/Aiarticle.php index df526bd..7c0df52 100644 --- a/application/api/controller/Aiarticle.php +++ b/application/api/controller/Aiarticle.php @@ -94,6 +94,8 @@ class Aiarticle extends Base 'wechat_app_secret' => 'd5e6002b8b48de46f64dc9a02312f944' ]; + //生成AI文章状态 + protected $sGenerateStatusName = 'generate_status_article_id'; public function __construct(\think\Request $request = null) { $this->proxy = ''; @@ -289,6 +291,8 @@ class Aiarticle extends Base $aSearch['{#title_chinese#}'] = $this->basic_html_filter($aArticle['title']); $aSearch['{#journal_content#}'] = $this->basic_html_filter($aJournal['journal_content'] ?? ''); $aSearch['{#journal_content#}'] = trim(trim($aSearch['{#journal_content#}'],'.'),'。'); + + //写入Redis 标识已经开始请求OPENAI处理 $aResult = $this->_createContentForOpenAI($aSearch,2); $aResult = json_decode($aResult,true); if($aResult['status'] != 1){ @@ -411,19 +415,6 @@ class Aiarticle extends Base } } - //查询是否上传到微信草稿箱 - if(!empty($iArticleId)){ - $aWhere = ['article_id' => $iArticleId,'is_delete' => 2]; - if(!empty($aParam['template_id'])){ - $aWhere['template_id'] = $aParam['template_id']; - } - if(!empty($aParam['wechat_id'])){ - $aWhere['wechat_id'] = $aParam['wechat_id']; - } - $aDraft = Db::name('ai_wechat_article')->field('template_id,wechat_id')->where($aWhere)->select(); - $aAiArticle['upload_draft'] = $aDraft; - } - return json_encode(['status' => 1,'msg' => 'success','data' => ['ai_article' => $aAiArticle,'ai_article_author' => $aAiAuthor]]); } /** @@ -710,52 +701,46 @@ class Aiarticle extends Base // //上传素材到微信 if($iIsSync == 1){ - //文章图片上传 - $sWechatAppId = empty($aParam['wechat_app_id']) ? '' : $aParam['wechat_app_id']; - $sWechatAppSecret = empty($aParam['wechat_app_secret']) ? '' : $aParam['wechat_app_secret']; - $aUpload = ['article_id' => $iArticleId,'icon' => $sArticleIcon,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aArticleResult = json_decode($oMaterial->addArticleMaterial($aUpload),true); - $aArticleData = empty($aArticleResult['data']) ? [] : $aArticleResult['data']; - $aAiArticle['article_icon'] = empty($aArticleData['media_url']) ? $sArticleIcon : $aArticleData['media_url']; - - //期刊图片上传 - $aUpload = ['journal_id' => $aAiArticle['journal_id'],'icon' => $sJournalIcon,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aJournalResult = json_decode($oMaterial->addJournalMaterial($aUpload),true); - $aJournalData = empty($aJournalResult['data']) ? [] : $aJournalResult['data']; - $aAiArticle['journal_icon'] = empty($aJournalData['media_url']) ? $sJournalIcon : $aJournalData['media_url']; - - //期刊二维码图片上传 - $aUpload = ['journal_id' => $aAiArticle['journal_id'],'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aJournalQrCodeResult = json_decode($oMaterial->updateJournalQrcode($aUpload),true); - $aJournalQrCodeData = empty($aJournalQrCodeResult['data']) ? [] : $aJournalQrCodeResult['data']; - $aAiArticle['journal_qrcode'] = empty($aJournalQrCodeData['media_url']) ? $sJournalIcon : $aJournalQrCodeData['media_url']; - - //文章二维码图片上传 - $aUpload = ['article_id' => $iArticleId,'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aArticleQrCodeResult = json_decode($oMaterial->updateArticleQrcode($aUpload),true); - $aArticleQrCodeData = empty($aArticleQrCodeResult['data']) ? [] : $aArticleQrCodeResult['data']; - $aAiArticle['article_qrcode'] = empty($aArticleQrCodeData['media_url']) ? $sArticleIcon : $aArticleQrCodeData['media_url']; - - //作者图片上传 + //查询参数组装 + $aQueryParam = ['article_id' => $iArticleId,'journal_id' => $aArticle['journal_id']]; + //组装作者数据 if(!empty($aAuthor)){ $aAuthor = $this->_dealAuthor($aAuthor); + $aUpload['author_info'] = $aAuthor; + } + + //获取素材信息 + $oMaterial = new Material; + $aReturnDataResult = json_decode($oMaterial->getMaterial($aQueryParam),true); + $aReturnData = empty($aReturnDataResult['data']) ? [] : $aReturnDataResult['data']; + //文章图片 + $aDataInfo = empty($aReturnData['ai_article_material']) ? [] : $aReturnData['ai_article_material']; + $aAiArticle['article_icon'] = empty($aDataInfo['media_url']) ? $sArticleIcon : $aDataInfo['media_url']; + //文章二维码图片 + $aDataInfo = empty($aReturnData['ai_article_qrcode']) ? [] : $aReturnData['ai_article_qrcode']; + $aAiArticle['article_qrcode'] = empty($aDataInfo['media_url']) ? $sArticleIcon : $aDataInfo['media_url']; + //期刊图片 + $aDataInfo = empty($aReturnData['ai_journal_material']) ? [] : $aReturnData['ai_journal_material']; + $aAiArticle['journal_icon'] = empty($aDataInfo['media_url']) ? $sJournalIcon : $aDataInfo['media_url']; + //期刊二维码图片 + $aDataInfo = empty($aReturnData['ai_journal_qrcode']) ? [] : $aReturnData['ai_journal_qrcode']; + $aAiArticle['journal_qrcode'] = empty($aDataInfo['media_url']) ? $sJournalIcon : $aDataInfo['media_url']; + //期刊编辑二维码 + $aDataInfo = empty($aReturnData['ai_journal_editor_material']) ? [] : $aReturnData['ai_journal_editor_material']; + $aAiArticle['editor_qrcode'] = empty($aDataInfo['media_url']) ? $sEditorQrcode : $aDataInfo['media_url']; + //作者图片上传 + $aDataInfo = empty($aReturnData['ai_author_material']) ? [] : $aReturnData['ai_author_material']; + if(!empty($aDataInfo) && $aAuthor){ + $aDataInfo = array_column($aDataInfo, null,'email'); foreach ($aAuthor as $key => $value) { - if(empty($value['icon'])){ + $aAuthorData = empty($aDataInfo[$value['email']]) ? [] : $aDataInfo[$value['email']]; + if(empty($aUser)){ continue; } - //文章二维码图片上传 - $aUpload = ['email' => $value['email'],'icon' => $value['icon'],'user_id' => $value['user_id'],'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aAuthorResult = json_decode($oMaterial->updateArticleAuthor($aUpload),true); - $aAuthorData = empty($aAuthorResult['data']) ? [] : $aAuthorResult['data']; $aAuthor[$key]['icon'] = empty($aAuthorData['media_url']) ? $value['icon'] : $aAuthorData['media_url']; } } - //上传期刊编辑二维码 - $aUpload = ['editor_qrcode' => $aJournal['editor_qrcode']??'','journal_id' => $aAiArticle['journal_id'],'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; - $aJournalEditorQrCodeResult = json_decode($oMaterial->updateJournalEditorQrcode($aUpload),true); - $aJournalEditorQrCodeData = empty($aJournalEditorQrCodeResult['data']) ? [] : $aJournalEditorQrCodeResult['data']; - $aAiArticle['editor_qrcode'] = empty($aJournalEditorQrCodeData['media_url']) ? $sEditorQrcode : $aJournalEditorQrCodeData['media_url']; }else{ //处理文章图片地址数据 @@ -813,7 +798,9 @@ class Aiarticle extends Base $aAuthorInfo = json_decode($this->dealTemplateAuthor($aAuthor,$iTemplateId),true); $aAuthorInfo = empty($aAuthorInfo['data']) ? [] : $aAuthorInfo['data']; $aSearch['{###author_summary###}'] = empty($aAuthorInfo['author_info']) ? '' : $aAuthorInfo['author_info']; - + + $aSearch['{###author_string###}'] = empty($aAuthorInfo['author_string']) ? '' : ',通讯作者为'.$aAuthorInfo['author_string']; + //处理往期推荐数据 $aPreviousRecommend = json_decode($this->dealTemplatePreviousRecommend($aArticle,$iTemplateId),true); $aSearch['{###previous_recommend_summary###}'] = empty($aPreviousRecommend['data']) ? '' : $aPreviousRecommend['data']; @@ -874,8 +861,6 @@ class Aiarticle extends Base return json_encode(['status' => 2,'msg' => 'Corresponding author or template does not exist']); } - //处理作者 - // $aAuthor = $this->_dealAuthor($aAuthor); //获取通讯作者模版 $sAuthorTemplatePath = ROOT_PATH."public/wechatTemplate/template_".$iTemplateId.'/author.html'; if (!file_exists($sAuthorTemplatePath)) { @@ -955,7 +940,7 @@ class Aiarticle extends Base //通讯作者字符串处理 $sAuthorInfo = trim($sAuthorInfo,','); - return json_encode(['status' => 1,'msg' => 'success','data' => ['author_info' => $sAuthorTemplate,'author' => trim($sAuthorInfo,';')]]); + return json_encode(['status' => 1,'msg' => 'success','data' => ['author_info' => $sAuthorTemplate,'author_string' => trim($sAuthorInfo,';')]]); } /** @@ -1089,8 +1074,6 @@ class Aiarticle extends Base $iArticleId = empty($aParam['article_id'] ) ? '' : $aParam['article_id']; //模版ID $iTemplateId = empty($aParam['template_id']) ? '' : $aParam['template_id']; - // //推送公众号Id - // $sWechatId = empty($aParam['wechat_id']) ? '' : $aParam['wechat_id']; //必填参数验证 if(empty($iArticleId)){ @@ -1099,9 +1082,6 @@ class Aiarticle extends Base if(empty($iTemplateId)){ return json_encode(['status' => 2, 'msg' => 'Please select a template']); } - // if(empty($sWechatId)){ - // return json_encode(['status' => 2, 'msg' => 'Please select the WeChat official account to push']); - // } //判断文章类型 $article_type = empty($aParam['article_type']) ? 'news' : $aParam['article_type']; if(!in_array($article_type, ['news','newspic'])){ @@ -1219,18 +1199,64 @@ class Aiarticle extends Base return json_encode(['status' => 2,'msg' => 'Please select the article to be generated']); } + //返回数据定义 + $aResult = ['generate_status' => 3,'draft_status' => 2,'publish_status' => -1]; + //查询AI生成的文章内容 $aWhere = ['is_delete' => 2]; if(!empty($iArticleId)){ $aWhere['article_id'] = $iArticleId; } $aAiArticle = Db::name('ai_article')->field('is_generate')->where($aWhere)->find(); - // 生成状态 - $aMsg = [1 => 'The data has been generated, please proceed with the next steps',2 => 'AI content generation in progress',3 => 'AI content not generated']; + $aMsg = [1 => 'The data has been generated, please proceed with the next steps',2 => 'AI content generation in progress',3 => 'AI content not generated',4 => 'The article has been pushed to the draft box',6 => 'The article has been pushed to the draft box']; $iStatus = empty($aAiArticle['is_generate']) ? 3 : $aAiArticle['is_generate']; $sMsg = empty($aMsg[$iStatus]) ? 'illegal request' : $aMsg[$iStatus]; - return json_encode(['status' => 1,'msg' => $sMsg,'data' => ['is_generate' => $iStatus]]); + $aResult['generate_status'] = $iStatus; + + if(!empty($aAiArticle)){ + + $aMsg = [1 => 'The article has been pushed to the draft box',2 => 'Not pushed to the draft box',3 => 'Material upload in progress',4 => 'Material upload completed']; + //获取Redis内容,判断是否上传素材成功 + $oMaterial = new Material; + $sUploadInfo = $oMaterial->getStepForRedis($iArticleId); + $sErrorInfo = ''; + if(!empty($sUploadInfo) && $sUploadInfo != 'finish'){ + $iStatus = 3;//素材上传中 + $sErrorInfo = $oMaterial->getErrorForRedis($iArticleId); + if(!empty($sErrorInfo)){ + $iStatus = 5; + return json_encode(['status' => 5,'msg' => $sErrorInfo]); + } + + } + if(!empty($sUploadInfo) && $sUploadInfo == 'finish'){ + $iStatus = 4;//素材上传完成 + } + //判断是否推送到草稿箱 + if(empty($sUploadInfo) || $iStatus == 4){ + if(!empty($aParam['template_id'])){ + $aWhere['template_id'] = $aParam['template_id']; + } + $aDraft = Db::name('ai_wechat_article')->field('is_publish,publish_status,article_id,template_id,wechat_id')->where($aWhere)->find(); + $iStatus = empty($aDraft) ? 2 : 1; + } + $aResult['draft_status'] = $iStatus; + + if(!empty($aDraft)){ + $aMsg = [0 => 'Article successfully published', 1 => 'Article is being published',2 => 'Original article creation failed', 3 => 'Article conventional failure', 4 => 'WeChat official account platform review failed', 5 => 'After success, the user deletes all articles', 6 => 'After success, the system will ban all articles','-1' => 'Draft box article not published']; + + //查询微信接口获取发布状态 + if($aDraft['publish_status'] == 1){ + $aReturnData = json_decode($this->queryStatus($aDraft),true); + $aData = empty($aReturnData['data']['data']) ? [] : $aReturnData['data']['data']; + } + $iStatus = empty($aData['publish_status']) ? $aDraft['publish_status'] : $aData['publish_status']; + $aResult['publish_status'] = $iStatus; + } + } + $sMsg = empty($aMsg[$iStatus]) ? 'illegal request' : $aMsg[$iStatus]; + return json_encode(['status' => 1,'msg' => $sMsg,'data' => $aResult]); } /** @@ -1267,7 +1293,7 @@ class Aiarticle extends Base // return json_encode(['status' => 2, 'msg' => 'Please select the WeChat official account to push']); // } //查询是否上传到草稿箱 - $aWhere = ['article_id' => $iArticleId,'template_id' => $iTemplateId,'wechat_id' => $sWechatId]; + $aWhere = ['article_id' => $iArticleId,'template_id' => $iTemplateId]; $aWechatArticle = Db::name('ai_wechat_article')->field('id,is_publish,media_id,publish_status,wechat_id')->where($aWhere)->find(); $sMediaId = empty($aWechatArticle['media_id']) ? '' : $aWechatArticle['media_id']; if(empty($sMediaId)){ @@ -1299,7 +1325,6 @@ class Aiarticle extends Base } //更新数据表 - $aData['publish_id'] = '100000001'; //更新文章表publish_id $aUpdate = ['update_time' => time(),'is_publish' => 1,'publish_id' => $aData['publish_id'],'publish_status' => 1]; $result = Db::name('ai_wechat_article')->where('id',$iId)->limit(1)->update($aUpdate); @@ -1313,10 +1338,10 @@ class Aiarticle extends Base * @param $sToken Token * @param article_id array 文章ID */ - public function queryStatus(){ + public function queryStatus($aParam = []){ //获取参数 - $aParam = $this->request->post(); + $aParam = empty($aParam) ? $this->request->post() : $aParam; //查询条件 $aWhere = ['is_publish' => 1,'publish_id' => ['<>',''],'publish_status' => 1,'is_delete' => 2]; @@ -1346,13 +1371,13 @@ class Aiarticle extends Base $aWhere = ['issn' => ['in',$aIssn]]; $aJournalInfo = Db::name('journal')->field('issn,wechat_app_id,wechat_app_secret')->where($aWhere)->select(); if(!empty($aJournalInfo)){ - // return json_encode(['status' => 4, 'msg' => 'WeChat official account interface docking account is not configured, please confirm']); $aJournalInfo = array_column($aJournalInfo, null,'issn'); } //循环处理 $oWechat = new Wechat; - $aInsert = $aUpdate = []; + $aInsert = []; + Db::startTrans(); foreach ($aWechatArticle as $key => $value) { if(empty($value['wechat_id']) || empty($value['publish_id'])){ continue; @@ -1365,51 +1390,147 @@ class Aiarticle extends Base $aAccount['publish_id'] = $value['publish_id']; $aResult = json_decode($oWechat->queryStatus($aAccount),true); $aData = empty($aResult['data']) ? [] : $aResult['data']; - if(empty($aData)){ continue; } //日志记录 $aData = $this->dealStatusData($aData); - $aInsert[] = $aData; + $aLog = empty($aData['log']) ? [] : $aData['log']; + if(!empty($aLog)){ + $aInsert[] = $aData['log']; + } //更新状态 - $aUpdate[$aData['publish_status']][] = $value['id']; + $aDetail = empty($aData['article_detail']) ? [] : $aData['article_detail']; + $iStatus = isset($aLog['publish_status']) ? $aLog['publish_status'] : $value['publish_status']; + //微信文章链接 + $sUrl = empty($aDetail[0]['article_url']) ? '' : $aDetail[0]['article_url']; + $updateResult = Db::name('ai_wechat_article')->where('id',$value['id'])->limit(1)->update(['publish_status' => $iStatus,'wechat_article_url' => $sUrl,'update_time' => time()]); } - - Db::startTrans(); //插入日志表 if(!empty($aInsert)){ - $result = Db::name('wechat_article_publish_log')->insertAll($aInsert); - } - //更新文章表的发布状态 - if(!empty($aUpdate)){ - foreach ($aUpdate as $key => $value) { - if(empty($value)){ - continue; - } - $result = Db::name('ai_wechat_article')->whereIn('id',$value)->limit(count($value))->update(['publish_status' => $key,'update_time' => time()]); - } + $insertResult = Db::name('wechat_article_publish_log')->insertAll($aInsert); } Db::commit(); return json_encode(['status' => 1,'msg' => 'success']); } + /** + * 发布日志数据处理 + * @param $sToken Token + * @param article_id array 文章ID + */ private function dealStatusData($aParam = []){ //log日志需要参数 - $aField = ['publish_id','publish_status' ,'article_id' ,'article_detail' ,'fail_idx' ,'create_time']; - $aResult = []; - foreach ($aField as $value) { - if($value == 'create_time'){ - $aResult[$value] = time(); - continue; - } - $aResult[$value] = empty($aParam[$value]) ? ' ' : $aParam[$value]; - if(is_array($aResult[$value])){ - $aResult[$value] = json_encode($aResult[$value]); + $aField = ['publish_id' => '','publish_status' => '' ,'article_id' => '' ,'article_detail' => '' ,'fail_idx' => '']; + + $aDetail = []; + foreach ($aParam as $key => $value) { + if($key == 'article_detail'){ + $aDetail = empty($value) ? [] : $value; + $aDetail = empty($aDetail['item']) ? [] : $aDetail['item']; } + $aField[$key] = empty($value) ? '' : $value; + $aField[$key] = is_array($aField[$key]) ? json_encode($aField[$key]) : $aField[$key]; } - return $aResult; + $aField['create_time'] = time(); + return ['article_detail' => $aDetail,'log' => $aField]; } + /** + * 上传素材 + * @param $sToken Token + * @param article_id array 文章ID + */ + + public function uploadMaterial($aParam = []){ + + //获取参数 + $aParam = empty($aParam) ? $this->request->post() : $aParam; + + //文章ID + $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; + //模版ID + $iTemplateId = empty($aParam['template_id']) ? '' : $aParam['template_id']; + + //必填参数验证 + if(empty($iArticleId)){ + return json_encode(['status' => 2, 'msg' => 'Please select an article']); + } + if(empty($iTemplateId)){ + return json_encode(['status' => 2, 'msg' => 'Please select a template']); + } + + //获取AI生成文章内容 + $aAiContent = json_decode($this->getAiArticle(['article_id' => $iArticleId,'is_select_author' => 1]),true); + $aAiContent = empty($aAiContent['data']) ? [] : $aAiContent['data']; + $aAiArticle = empty($aAiContent['ai_article']) ? [] : $aAiContent['ai_article']; + //判断是否生成AI内容 + if(empty($aAiArticle)){ + return json_encode(['status' => 3, 'msg' => 'The article content of WeChat official account has not been generated']); + } + //模版ID + $iTemplateId = empty($iTemplateId) ? $aAiArticle['template_id'] : $iTemplateId; + + //获取文章内容 + $aResult = json_decode($this->getArticle($iArticleId),true); + //获取数据 + $aArticleContent = empty($aResult['data']) ? [] : $aResult['data']; + if(empty($aArticleContent)){ + return json_encode($aResult); + } + + //文章数据 + $aArticle = empty($aArticleContent['article']) ? [] : $aArticleContent['article']; + if(empty($aArticle)){ + return json_encode(['status' => 4,'msg' => 'Article data is empty']); + } + //期刊数据 + $aJournal = empty($aArticleContent['journal']) ? [] : $aArticleContent['journal']; + if(empty($aJournal)){ + return json_encode(['status' => 4,'msg' => 'Journal data is empty']); + } + + //通讯作者 + $aAuthor = empty($aArticleContent['author']) ? [] : $aArticleContent['author']; + + //文章图片 + $sArticleIcon = trim($this->sJournalUsx,'/').$this->sArticleIcon.$aArticle['article_icon']; + //期刊图片 + $sJournalIcon = trim($this->sJournalUsx,'/').$this->sJournalIcon.$aJournal['journal_icon']; + + //期刊编辑二维码 + $editor_qrcode = empty($aJournal['editor_qrcode']) ? '' : $aJournal['editor_qrcode']; + $sEditorQrcode = trim($this->sSubmissionUrl,'/').$this->sJournalEditorQrcode.$editor_qrcode; + + //获取期刊二维码 + $oMaterial = new Material; + $aJournalQrCode = $oMaterial->createJournalQrCode($aJournal); + $sJournalCode = empty($aJournalQrCode['qrcode_url']) ? '' : $this->sSubmissionUrl.'public/qrcode/'.$aJournalQrCode['qrcode_url']; + $aAiArticle['journal_qrcode'] = $sJournalCode; + + //文章二维码 + $aArticleQrCode = $oMaterial->createArticleQrCode($aArticle); + $sArticleCode = empty($aArticleQrCode['qrcode_url']) ? '' : $this->sSubmissionUrl.'public/qrcode/'.$aArticleQrCode['qrcode_url']; + $aAiArticle['article_qrcode'] = $sArticleCode; + + // //上传素材到微信 + //组装文章数据 + $aWechatConfig = $this->aWechatConfig; + $sWechatAppId = empty($aJournal['wechat_app_id']) ? $aWechatConfig['wechat_app_id'] : $aJournal['wechat_app_id']; + $sWechatAppSecret = empty($aJournal['wechat_app_secret']) ? $aWechatConfig['wechat_app_secret'] : $aJournal['wechat_app_secret']; + $aUpload['article_info'] = ['icon' => $sArticleIcon]; + + //组装期刊数据 + $aUpload['journal_info'] = ['icon' => $sJournalIcon,'editor_qrcode' => $editor_qrcode]; + + //组装作者数据 + if(!empty($aAuthor)){ + $aUpload['author_info'] = $this->_dealAuthor($aAuthor); + } + //上传微信公众号用到的素材 + $aUpload += ['article_id' => $iArticleId,'journal_id' => $aArticle['journal_id'],'wechat_app_id' => $sWechatAppId,'wechat_app_secret' => $sWechatAppSecret]; + $oMaterial = new Material; + return $oMaterial->uploadMaterial($aUpload); + } }