Files
tougao/application/common/Article.php
2025-08-07 13:50:20 +08:00

410 lines
17 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\OpenAi;
use app\common\Aireview;
class Article
{
//JAVA接口
protected $sJavaUrl = "http://ts.tmrjournals.com/";
//官网文件地址
protected $sFileUrl = "https://submission.tmrjournals.com/public/";
//Ai地址
protected $sAiUrl = "http://125.39.141.154:10002";
/**
* 获取文章文件内容
*/
public function getFileContent($aParam = []){
//判断文章ID
$iArticleId = empty($aParam['article_id']) ? [] : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select an article']);
}
//获取文件内容
$aWhere = ['article_id' => $iArticleId,'type_name' => 'manuscirpt'];
$aFile = Db::name('article_file')->field('file_url')->where($aWhere)->order('ctime desc')->limit(1)->find();
if(empty($aFile['file_url'])){
return json_encode(['status' => 2,'msg' => 'No Manuscript']);
}
//接口获取上传文件
$sUrl = $this->sJavaUrl."api/typeset/readDocx";
$aParam['fileRoute'] = $this->sFileUrl.$aFile['file_url'];
$aResult = object_to_array(json_decode(myPost($sUrl,$aParam)));
return json_encode($aResult);
}
/**
* 获取期刊内容
*/
public function getJournalPaperArt($aParam = []){
//判断文章ID
$sIssn = empty($aParam['issn']) ? [] : $aParam['issn'];
if(empty($sIssn)){
return json_encode(['status' => 2,'msg' => 'Please select an article']);
}
//接口获取期刊内容
$sUrl = $this->sTmrUrl."/api/Supplementary/getJournalPaperArt";
$aParam = ['issn' => $sIssn];
$aResult = object_to_array(json_decode(myPost($sUrl,$aParam),true));
return json_encode($aResult);
}
/**
* 更新AI生成内容入库
* @param $messages 内容
* @param $model 模型类型
*/
public function updateAiArticle($aParam = []){
//文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
//主键ID
$iAiArticleId = empty($aParam['ai_article_id']) ? 0 : $aParam['ai_article_id'];
//查询内容是否存在
$aWhere = ['is_delete' => 2];
if(empty($iArticleId) && empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select the article to be modified']);
}
if(!empty($iArticleId)){
$aWhere['article_id'] = $iArticleId;
}
if(!empty($iAiArticleId)){
$aWhere['ai_article_id'] = $iAiArticleId;
}
//查询文章是否生成AI内容
$aAiArticle = Db::name('ai_article')->field('ai_article_id')->where($aWhere)->find();
if(empty($aAiArticle)){
return json_encode(['status' => 3,'msg' => 'The article content of WeChat official account has not been generated']);
}
$iAiArticleId = $aAiArticle['ai_article_id'];
//必填参数验证
$aFields = ['article_id','article_type','media_type','journal_id','journal_issn','title_english','title_chinese','covered','research_method','digest','research_background','overview','summary','conclusion','is_generate'];
$sFiled = '';
$aUpdateParam = [];
foreach($aFields as $val){
if(!isset($aParam[$val])){
continue;
}
if(is_array($aParam[$val])){
$aParam[$val] = implode(";",$aParam[$val]);
}
$aUpdateParam[$val] = empty($aParam[$val]) ? '' : $this->func_safe($aParam[$val]);
}
if(empty($aUpdateParam)){
return json_encode(['status' => 1,'msg' => 'No data currently being processed']);
}
//执行入库
$aUpdateParam['update_time'] = time();
$result = Db::name('ai_article')->where('ai_article_id',$iAiArticleId)->limit(1)->update($aUpdateParam);
if($result === false){
return json_encode(['status' => 4,'msg' => 'UPDATEING AI article failed']);
}
return json_encode(['status' => 1,'msg' => 'success']);
}
/**
* 构建文章领域-处理提示词
*/
private function buildFieldPrompt($aSearch = []){
//必填验证
if(empty($aSearch)){
return [];
}
$sSysMessagePrompt = '
你是一位资深的医学期刊学术评审专家负责严谨、客观地评估学术文章。返回格式必须严格遵循以下JSON结构!请根据文章的标题和摘要从目标期刊下所有领域中筛选出符合文章的领域';
$sSysMessagePrompt .= json_encode([
"article_field" => [
"assessment" => [
"major_id" => "领域ID多个,分隔",
"major_name" => "领域名称多个,分隔"
],
"explanation" =>"请详细解释说明.请返回中文解释!"
]
],JSON_UNESCAPED_UNICODE);
//组装问题
$sUserPrompt = '根据文章的标题:{title};摘要:{abstrart}从目标期刊:【{journal_name}】包含的领域【json结构】{journal_major}中筛选出最符合文章领域【小于等于3个】';
$sUserPrompt = str_replace(array_keys($aSearch), array_values($aSearch), $sUserPrompt);
return [
['role' => 'system', 'content' => $sSysMessagePrompt], ['role' => 'user', 'content' => $sUserPrompt]
];
}
/**
* 获取文章领域【AI】
* @param bool $assoc 是否返回关联数组默认true
*/
public function getAiField($aParam = []){
$iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(array('status' => 2,'msg' => 'Please select an article' ));
}
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = json_decode($this->get($aWhere),true);
$aArticle = empty($aArticle['data']) ? [] : $aArticle['data'];
if(empty($aArticle)){
return json_encode(array('status' => 3,'msg' => 'No articles requiring review were found' ));
}
//获取文章领域
$aArticleField = $this->getArticleField($aWhere);
if(!empty($aArticleField['data'])){
return json_encode(array('status' => 4,'msg' =>'The article has been added to the field' ));
}
//文章标题
$title = empty($aArticle['title']) ? '' : $aArticle['title'];
if(empty($title)){
return json_encode(array('status' => 5,'msg' => 'The title cannot be empty'));
}
//摘要
$abstrart = empty($aArticle['abstrart']) ? '' : $aArticle['abstrart'];
if(empty($abstrart)){
return json_encode(array('status' => 5,'msg' => 'The abstract cannot be empty' ));
}
//查询该期刊下的所有领域
$aWhere = ['journal_id' => $aArticle['journal_id']];
$aResult = $this->getJouarnalMajor($aWhere);
//期刊领域
$aMaJor = empty($aResult['data']['major']) ? [] : $aResult['data']['major'];
//期刊信息
$aJournal = empty($aResult['data']['journal']) ? [] : $aResult['data']['journal'];
if(empty($aJournal) || empty($aMaJor)){
return json_encode($aResult);
}
//变量替换
$aSearch = [];
$title = empty($aArticle['title']) ? '' : '文章标题:'.$aArticle['title'];
$abstrart = empty($aArticle['abstrart']) ? '' : '文章摘要:'.$aArticle['abstrart'];
$aSearch['{title}'] = 'title:'.$title;
$aSearch['{abstrart}'] = 'abstract:'.$abstrart;
$aSearch['{journal_major}'] = empty($aMaJor) ? '' : json_encode($aMaJor);//期刊领域
$aSearch['{journal_name}'] = empty($aJournal['title']) ? '' : $aJournal['title'];
$aMessage = $this->buildFieldPrompt($aSearch);
//请求OPENAI接口-非重要维度一次请求获取答案
if(empty($aMessage)){
return json_encode(['status' => 6,'msg' => 'AI Q&A content not obtained']);
}
//请求OPENAI
$oOpenAi = new OpenAi;
$aParam = ['messages' => $aMessage,'model' => empty($aParam['api_model']) ? 'gpt-4.1' : $aParam['api_model'],'url' => $this->sAiUrl];
$aResult = json_decode($oOpenAi->curlOpenAIStream($aParam),true);
//处理返回信息
$aData = empty($aResult['data']) ? [] : $aResult['data'];
if(empty($aData)){
return json_encode(['status' => 7,'msg' => empty($aResult['msg']) ? 'OPENAI returns empty content' : $aResult['msg']]);
}
//数据处理
$aData = $oOpenAi->extractAndParse($aData);
if(empty($aData['data'])){
return json_encode($aData);
}
//关联文章领域
$aData = $aData['data'];
$aMaJorId = empty($aData['article_field']['assessment']) ? [] : $aData['article_field']['assessment'];
$sMaJorId = empty($aMaJorId['major_id']) ? '' : $aMaJorId['major_id'];
$aAddResult = $this->addArticleField(['article_field' => $sMaJorId,'article_id' => $iArticleId]);
//插入文章审核记录表
$oAireview = new Aireview;
$aData['article_id'] = $iArticleId;
$aData['journal_id'] = $aArticle['journal_id'];
$aResult = $oAireview->addAiReview($aData);
return json_encode($aAddResult);
}
/**
* @title 文章内容
* @param article_id 文章ID
*/
public function get($aParam = []){
//获取参数
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(array('status' => 2,'msg' => 'Please select an article' ));
}
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->where($aWhere)->find();
return json_encode(['status' => 1,'msg' => 'success','data' => $aArticle]);
}
/**
* @title 获取文章期刊领域
* @param article_id 文章ID
*/
public function getJouarnalMajor($aParam = []){
//期刊ID
$iJournalId = empty($aParam['journal_id']) ? 0 : $aParam['journal_id'];
if(empty($iJournalId)){
return ['status' => 2,'msg' => 'Please select an journal'];
}
//根据期刊ID查询期刊信息
$aWhere = ['journal_id' => $iJournalId,'state' => 2];
$aJournal = Db::name('journal')->field('title,issn,journal_id')->where('journal_id', $iJournalId)->find();
if(empty($aJournal)){
return ['status' => 3,'msg' => 'This article is not associated with a journal'];
}
$sIssn = empty($aJournal['issn']) ? '' : $aJournal['issn'];
if(empty($sIssn)){
return ['status' => 4,'msg' => 'The issn of the journal is empty'];
}
//查询期刊领域ID
$aWhere = ['journal_issn' => $sIssn,'mtj_state' => 0];
$aMaJorId = Db::name('major_to_journal')->where($aWhere)->column('major_id');
if(empty($aMaJorId)){
return ['status' => 5,'msg' => 'The field of the journal is empty'];
}
//查询领域名称
$aWhere = ['major_state' => 0,'major_id' => ['in',$aMaJorId],'pid' => ['>',0]];
$aMaJor = Db::name('major')->where($aWhere)->column('major_id,major_title');
return ['status' => 5,'msg' => 'success','data' => ['major' => $aMaJor,'journal' => $aJournal]];
}
/**
* 获取文章所属领域
* @param article_id 文章ID
*/
public function getArticleField($aParam = []){
// 文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return ['status' => 2,'msg' => 'Please select a Article'];
}
//查询审稿人领域信息
$aParam['state'] = 0;
$aWhere = ['article_id' => $iArticleId,'state' => 0];
$aArticleField = Db::name('major_to_article')->field('major_id')->where($aWhere)->select();
return ['status' => 1,'msg' => "success",'data' => $aArticleField];
}
/**
* 添加文章所属领域
* @param reviewer_id 审核人ID
* @param
*/
public function addArticleField($aParam = []){
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return ['status' => 2,'msg' => 'Please select a article'];
}
$sField = empty($aParam['article_field']) ? '' : $aParam['article_field'];
if(empty($sField)){
return ['status' => 2,'msg' => "Please select the field to which the article belongs"];
}
$aField = is_array($sField) ? $sField : explode(',', trim($sField,','));
if(empty($aField)){
return ['status' => 3,'msg' => "Please select the user's field of expertise"];
}
//领域入库
$aInsertParam = [];
foreach ($aField as $key => $value) {
if(empty($value)){
continue;
}
$aInsertParam[] = ['major_id' => $value,'article_id' => $iArticleId,'ctime' => time(),'state' => 0];
}
if(empty($aInsertParam)){
return ['status' => 4,'msg' => "Please select the user's field of expertise"];
}
$result = Db::name('major_to_article')->insertAll($aInsertParam);
if($result === false){
return ['status' => 5,'msg' => "Failed to add article field"];
}
return ['status' => 1,'msg' => "Successfully added the article field"];
}
/**
* 更新AI生成结果内容入库
* @param $messages 内容
* @param $model 模型类型
*/
public function updateAiArticleResults($aParam = []){
//文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
//二级标题ID
$iCurrentAmId = empty($aParam['current_am_id']) ? 0 : $aParam['current_am_id'];
//查询内容是否存在
if(empty($iArticleId) || empty($iCurrentAmId)){
return json_encode(['status' => 2,'msg' => 'Please select the article to be modified']);
}
//查询投稿系统文章ID
$aWhere = ['w_article_id' => $iArticleId,'state' => ['in',[0,2]]];
$aProductionArticle = Db::name('production_article')->field('article_id')->where($aWhere)->find();
if(empty($aProductionArticle)){
return json_encode(['status' => 2,'msg' => 'The production article data is empty']);
}
//查询文章是否生成内容
$aWhere = ['article_id' => $iArticleId,'current_am_id' => $iCurrentAmId];
$aAiArticleResults = Db::name('ai_article_results')->field('id')->where($aWhere)->find();
$iId = empty($aAiArticleResults['id']) ? 0 : $aAiArticleResults['id'];
//必填参数验证
$aFields = ['article_id','title','content','current_am_id','next_am_id','ami_id'];
$sFiled = '';
$aUpdateParam = [];
foreach($aFields as $val){
if(!isset($aParam[$val])){
continue;
}
if(is_array($aParam[$val])){
$aParam[$val] = implode(";",$aParam[$val]);
}
$aUpdateParam[$val] = empty($aParam[$val]) ? '' : $this->func_safe($aParam[$val]);
}
if(empty($aUpdateParam)){
return json_encode(['status' => 1,'msg' => 'No data currently being processed']);
}
if(empty($iId)){
$aUpdateParam['create_time'] = time();
$result = Db::name('ai_article_results')->insert($aUpdateParam);
}else{
$aUpdateParam['update_time'] = time();
$result = Db::name('ai_article_results')->where('id',$iId)->limit(1)->update($aUpdateParam);
}
if($result === false){
return json_encode(['status' => 4,'msg' => 'UPDATEING AI article Results failed']);
}
return json_encode(['status' => 1,'msg' => 'success']);
}
/**
* 字符串过滤
* @param $messages 内容
* @param $model 模型类型
*/
private function func_safe($data,$ignore_magic_quotes=false){
if(is_string($data)){
$data=trim(htmlspecialchars($data));//防止被挂马,跨站攻击
if(($ignore_magic_quotes==true)||(!get_magic_quotes_gpc())){
$data = addslashes($data);//防止sql注入
}
return $data;
}else if(is_array($data)){//如果是数组采用递归过滤
foreach($data as $key=>$value){
$data[$key]=func_safe($value);
}
return $data;
}else{
return $data;
}
}
}