458 lines
21 KiB
PHP
458 lines
21 KiB
PHP
<?php
|
||
namespace app\api\controller;
|
||
|
||
use app\api\controller\Base;
|
||
use think\Db;
|
||
use think\Queue;
|
||
use think\Url;
|
||
use think\Validate;
|
||
|
||
class Web extends Base
|
||
{
|
||
|
||
private $Base_url = "http://journalapi.tmrjournals.com/public/index.php/";
|
||
public function __construct(\think\Request $request = null)
|
||
{
|
||
parent::__construct($request);
|
||
}
|
||
|
||
public function getStages(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"journal_id" => 'require'
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$journal_info = $this->journal_obj->where('journal_id',$data['journal_id'])->find();
|
||
|
||
//发送请求到官网
|
||
$url = $this->Base_url."master/Submision/getJournalStages";
|
||
$program['issn'] = $journal_info['issn'];
|
||
$res = object_to_array(json_decode(myPost($url,$program)));
|
||
$list = $res['data']['stages'];
|
||
$re['stages'] = $list;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
/**获取分期文章列表
|
||
* @return \think\response\Json|void
|
||
*/
|
||
public function getArticlesByStage(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"journal_stage_id"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$url = $this->Base_url."master/Submision/getArticlesByStage";
|
||
$program['journal_stage_id'] = $data['journal_stage_id'];
|
||
$res = object_to_array(json_decode(myPost($url,$program)));
|
||
$list = $res['data']['articles'];
|
||
$re['articles'] = $list;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
/**获取编委国际化
|
||
* @return void
|
||
*/
|
||
public function getBWGJHByIssn(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"issn"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$journal_info = $this->journal_obj->where('issn',$data['issn'])->find();
|
||
$list = $this->board_to_journal_obj
|
||
->field("t_board_to_journal.*,t_board_group.group_name,t_user.account,t_user.email,t_user.realname,t_user.icon,t_user.google_index,t_user.google_time,t_user.wos_index,t_user.wos_time,t_user_reviewer_info.*")
|
||
->join("t_board_group","t_board_group.board_group_id = t_board_to_journal.board_group_id","left")
|
||
->join("t_user","t_user.user_id = t_board_to_journal.user_id","left")
|
||
->join("t_user_reviewer_info","t_user_reviewer_info.reviewer_id=t_board_to_journal.user_id","left")
|
||
->where('t_board_to_journal.journal_id',$journal_info['journal_id'])
|
||
->where('t_board_to_journal.state',0)
|
||
->select();
|
||
$frag = [];
|
||
foreach ($list as $v) {
|
||
if (isset($frag[$v['country']])) {
|
||
$frag[$v['country']]++;
|
||
} else {
|
||
$frag[$v['country']] = 1;
|
||
}
|
||
}
|
||
$re['count'] = count($list);
|
||
$re['country'] = $frag;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
/**
|
||
* @return void
|
||
*/
|
||
public function getBoardsByIssn(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"issn"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$journal_info = $this->journal_obj->where('issn',$data['issn'])->find();
|
||
//数据排序调整 chengxiaoling 20250627 start
|
||
// $boards = $this->getBoardsForJournal($journal_info['journal_id']);
|
||
$boards = $this->getBoardListsForJournal($journal_info['journal_id']);
|
||
//数据排序调整 chengxiaoling 20250627 end
|
||
//获取委员会和编辑信息
|
||
$committees = $this->committee_to_journal_obj
|
||
->field("t_committee_to_journal.*,t_user.account,t_user.email,t_user.realname,t_user.icon,t_user.google_index,t_user.google_time,t_user.wos_index,t_user.wos_time,t_user_reviewer_info.*")
|
||
->join("t_user","t_user.user_id = t_committee_to_journal.user_id","left")
|
||
->join("t_user_reviewer_info","t_user_reviewer_info.reviewer_id = t_committee_to_journal.user_id","left")
|
||
->where('t_committee_to_journal.journal_id',$journal_info['journal_id'])
|
||
->where('t_committee_to_journal.state',0)
|
||
->select();
|
||
$editors = $this->editor_to_journal_obj
|
||
->field("t_editor_to_journal.*,t_user.account,t_user.email,t_user.realname,t_user.icon,t_user.google_index,t_user.google_time,t_user.wos_index,t_user.wos_time,t_user_reviewer_info.*")
|
||
->join("t_user","t_user.user_id = t_editor_to_journal.user_id","left")
|
||
->join("t_user_reviewer_info","t_user_reviewer_info.reviewer_id = t_editor_to_journal.user_id","left")
|
||
->where('t_editor_to_journal.journal_id',$journal_info['journal_id'])
|
||
->where('t_editor_to_journal.state',0)
|
||
->select();
|
||
$re['editors'] = $editors;
|
||
$re['committees'] = $committees;
|
||
$re['boards'] = $boards;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
|
||
public function getJournalEthics(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"issn"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$info = $this->journal_obj->where("issn",$data['issn'])->find();
|
||
$re['ethics'] = $info['ethics'];
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
public function getRefers(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"w_article_id"=>"require",
|
||
"doi"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$production_info = $this->production_article_obj->where('w_article_id',$data['w_article_id'])->find();
|
||
if (!$production_info){//一次验证,如果w_article_id获取失败
|
||
$production_info = $this->production_article_obj->where('doi',$data['doi'])->find();
|
||
}
|
||
|
||
if(!$production_info){//如果两次获取都失败
|
||
$refers = [];
|
||
return jsonSuccess(['refer'=>$refers]);
|
||
}
|
||
|
||
$list = $this->production_article_refer_obj->where('p_article_id',$production_info['p_article_id'])->where('state',0)->order('index')->select();
|
||
$re['refers'] = $list;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
public function getArticleMainsByPID(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"p_article_id"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$p_info = $this->production_article_obj->where("p_article_id",$data['p_article_id'])->find();
|
||
$mains = getArticleMains($p_info["article_id"]);
|
||
$list = $this->production_article_refer_obj->where('p_article_id',$data['p_article_id'])->where('state',0)->order('index')->select();
|
||
|
||
return jsonSuccess(['mains'=>$mains,"refers"=>$list]);
|
||
}
|
||
|
||
|
||
|
||
public function getArticleMainsForJournal(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"article_id"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$production_article_info = $this->production_article_obj->where("w_article_id",$data['article_id'])->find();
|
||
if(!$production_article_info){
|
||
return jsonError("production error");
|
||
}
|
||
$mains = $this->article_main_obj->where("article_id",$production_article_info['article_id'])->whereIn("state",[0,2])->order("sort asc")->find();
|
||
if(!$mains){
|
||
$this->addArticleMainEx($data['article_id']);
|
||
}
|
||
$mains = $this->article_main_obj->where("article_id",$production_article_info['article_id'])->whereIn("state",[0,2])->order("sort asc")->select();
|
||
if(!$mains){
|
||
return jsonError("error");
|
||
}
|
||
foreach ($mains as $k=>$main) {
|
||
if($main['type']==0){
|
||
continue;
|
||
}elseif($main['type']==1){
|
||
$c_d = $this->article_main_image_obj->where("ami_id",$main['ami_id'])->find();
|
||
$mains[$k]['image'] = $c_d;
|
||
}else{
|
||
$c_d_t = $this->article_main_table_obj->where("amt_id",$main['amt_id'])->find();
|
||
$mains[$k]['table'] = $c_d_t;
|
||
}
|
||
}
|
||
$re['list'] = $mains;
|
||
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
public function checkArticleMain(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"article_id"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$product = $this->production_article_obj->where("w_article_id",$data['article_id'])->find();
|
||
if(!$product){
|
||
return jsonError("system error,no product for article");
|
||
}
|
||
$check = $this->article_main_obj->where("article_id",$product['article_id'])->find();
|
||
$re["check"] = $check?1:0;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
/**获取文章流程通过doi
|
||
* @return void
|
||
*/
|
||
public function getStackByDoi(){
|
||
$data = $this->request->post();
|
||
$rule = new Validate([
|
||
"doi"=>"require"
|
||
]);
|
||
if(!$rule->check($data)){
|
||
return jsonError($rule->getError());
|
||
}
|
||
$r = explode("/",$data['doi']);
|
||
$p_info = $this->production_article_obj->where('doi',$r[1])->where("state",2)->find();
|
||
if(!$p_info){
|
||
return jsonError("production error");
|
||
}
|
||
$article_info = $this->article_obj->where('article_id',$p_info['article_id'])->find();
|
||
//只显示2023年5。1之后的文章流程
|
||
// if($article_info['rtime']<1682870400){
|
||
// return jsonError("time error");
|
||
// }
|
||
|
||
|
||
$msgs = $this->article_msg_obj->where('article_id',$article_info['article_id'])->select();
|
||
$reviewers = $this->article_reviewer_obj
|
||
->field("t_article_reviewer.*,t_article_reviewer_question.ctime qtime,t_article_reviewer_question.rated,t_article_reviewer_question.is_anonymous")
|
||
->join("t_article_reviewer_question","t_article_reviewer_question.art_rev_id = t_article_reviewer.art_rev_id","left")
|
||
->where('t_article_reviewer.article_id',$p_info['article_id'])
|
||
->where('t_article_reviewer.state','in',[1,2,3])
|
||
->select();
|
||
foreach ($reviewers as $k => $v){
|
||
if($v['is_anonymous']==0){
|
||
$u_info = $this->user_obj->where('user_id',$v['reviewer_id'])->find();
|
||
$reviewers[$k]['reviewer_name'] = $u_info['realname'];
|
||
}else{
|
||
$reviewers[$k]['reviewer_name'] = "anonymous";
|
||
}
|
||
// if(($article_info['journal_id']==1&&$p_info['journal_stage_id']>=453)
|
||
// ||($article_info['journal_id']==2&&$p_info['journal_stage_id']>=4747)
|
||
// ||($article_info['journal_id']==6&&$p_info['journal_stage_id']>=515)
|
||
// ||($article_info['journal_id']==15&&($article_info['article_id']>=4465||$article_info['article_id']==4349))
|
||
// ||($article_info['journal_id']==10&&$p_info['journal_stage_id']>=534)
|
||
// ||($article_info['journal_id']==3&&($article_info['article_id']>=4523||$article_info['article_id']==4094||$article_info['article_id']==4369))
|
||
// ||($article_info['journal_id']==2&&$article_info['article_id']>=4361)
|
||
// ||($article_info['journal_id']==9&&$p_info['journal_stage_id']>=545)
|
||
// ||$article_info['journal_id']==23||$article_info['journal_id']==4||$article_info['journal_id']==8||$article_info['journal_id']==11
|
||
// ||$article_info['journal_id']==12||$article_info['journal_id']==13||$article_info['journal_id']==14||$article_info['journal_id']==16
|
||
// ||$article_info['journal_id']==17||$article_info['journal_id']==18||$article_info['journal_id']==19||$article_info['journal_id']==24||$article_info['journal_id']==25
|
||
// ){
|
||
if(
|
||
$article_info['journal_id']==3&&$p_info['journal_stage_id']<526
|
||
){
|
||
$reviewers[$k]['question'] = null;
|
||
$reviewers[$k]['re_question'] = null;
|
||
}else{
|
||
|
||
|
||
//添加初审问卷
|
||
$reviewers[$k]['question'] = $this->article_reviewer_question_obj->where('art_rev_id',$v['art_rev_id'])->find();
|
||
//添加复审问卷
|
||
$reviewers[$k]['re_question']=$this->article_reviewer_repeat_obj->where('art_rev_id',$v['art_rev_id'])->select();
|
||
}
|
||
// }else {
|
||
// $reviewers[$k]['question'] = null;
|
||
// $reviewers[$k]['re_question'] = null;
|
||
// }
|
||
}
|
||
|
||
//查询终审信息 chengxiaoling 20250825 start
|
||
$iArticleId = empty($article_info['article_id']) ? 0 : $article_info['article_id'];
|
||
$aWhere = ['state' => ['between',[1,3]],'article_id' => $iArticleId];
|
||
$aFinal = Db::name('article_reviewer_final')->field('state,suggest_for_editor,suggest_for_author,invited_time,review_time,is_anonymous,reviewer_id')->where($aWhere)->select();
|
||
if(!empty($aFinal)){
|
||
$aUserId = array_unique(array_column($aFinal, 'reviewer_id'));
|
||
$aWhere = ['user_id' => ['in',$aUserId],'state' => 0];
|
||
$aUser = Db::name('user')->where($aWhere)->column('user_id,realname');
|
||
foreach ($aFinal as $key => $value) {
|
||
$aFinal[$key]['realname'] = empty($aUser[$value['reviewer_id']]) ? '' : $aUser[$value['reviewer_id']];
|
||
}
|
||
}
|
||
//查询终审信息 chengxiaoling 20250825 end
|
||
|
||
$begin['type'] = 0;
|
||
$begin['time'] = $article_info['ctime'];
|
||
$frag[] = $begin;
|
||
$reviewer_has = false;
|
||
$reciv = false;
|
||
$bFinal = false;
|
||
foreach ($msgs as $v){
|
||
if($v['state_to']==2&&!$reviewer_has){
|
||
$reviewer_has = true;
|
||
$frag[] = [
|
||
"type"=>$v['state_to'],
|
||
"reviewers"=>$reviewers,
|
||
"time"=>$v['ctime']
|
||
];
|
||
continue;
|
||
}
|
||
if($v['state_to']==4&&!$reciv&&count($reviewers)>0&&
|
||
(($article_info['journal_id']==1&&$p_info['journal_stage_id']>=453)
|
||
||$article_info['journal_id']==23
|
||
||$article_info['journal_id']==2
|
||
||$article_info['journal_id']==9
|
||
||$article_info['journal_id']==10
|
||
)){
|
||
$r_files = $this->article_response_to_reviewer_obj->where('article_id',$article_info['article_id'])->select();
|
||
$reciv=true;
|
||
if($r_files){
|
||
$frag[] = [
|
||
"type"=>$v['state_to'],
|
||
"response" => $r_files,
|
||
"time"=>$v['ctime']
|
||
];
|
||
continue;
|
||
}
|
||
}
|
||
if($v['state_to']==8 &&!$bFinal && $reviewer_has){
|
||
$bFinal = true;
|
||
if(!empty($aFinal)){
|
||
$frag[] = [
|
||
"type"=>$v['state_to'],
|
||
"response" => $aFinal,
|
||
"time"=>$v['ctime']
|
||
];
|
||
continue;
|
||
}
|
||
}
|
||
$frag[] = [
|
||
"type"=>$v['state_to'],
|
||
"time"=>$v['ctime']
|
||
];
|
||
}
|
||
//如果没有审稿状态,添加
|
||
if(!$reviewer_has&&count($reviewers)>0){
|
||
$frag[] = [
|
||
"type"=>2,
|
||
"reviewers"=>$reviewers,
|
||
"time"=>$reviewers[0]['ctime']
|
||
];
|
||
}
|
||
|
||
//没有接收。添加
|
||
|
||
//如果没有proof,增加
|
||
if($p_info['proof_stime']>0){
|
||
$frag[] = [
|
||
"type"=>7,
|
||
"time"=>$p_info['proof_stime']
|
||
];
|
||
}
|
||
|
||
//没有online,添加
|
||
|
||
//冒泡排序法
|
||
for ($i = 0; $i < count($frag) -1; $i++) {//循环对比的轮数
|
||
for ($j = 0; $j < count($frag) - $i - 1; $j++) {//当前轮相邻元素循环对比
|
||
if ($frag[$j]["time"] > $frag[$j + 1]["time"]) {//如果前边的大于后边的
|
||
$tmp = $frag[$j];//交换数据
|
||
$frag[$j] = $frag[$j + 1];
|
||
$frag[$j + 1] = $tmp;
|
||
}
|
||
}
|
||
}
|
||
|
||
$re['msgs'] = $frag;
|
||
return jsonSuccess($re);
|
||
}
|
||
|
||
/**获取期刊编辑信息
|
||
* @return void
|
||
*/
|
||
private function getBoardListsForJournal($journal_id, $aar = false)
|
||
{
|
||
$ca_board = [];
|
||
$boards = $this->board_to_journal_obj
|
||
->field("t_board_to_journal.btj_id,t_board_to_journal.user_id,t_board_to_journal.board_group_id,t_board_to_journal.journal_id,t_board_to_journal.type,t_board_to_journal.research_areas,t_board_to_journal.realname as board_realname,t_board_to_journal.email as board_email,t_board_to_journal.website as board_website,t_board_to_journal.affiliation as board_affiliation,t_board_to_journal.icon as board_icon,t_board_to_journal.technical as board_technical,t_board_to_journal.remark,t_board_to_journal.state,t_board_group.group_name,t_user.account,t_user.email,t_user.realname,t_user.icon,t_user.google_index,t_user.google_time,t_user.wos_index,t_user.wos_time,t_user_reviewer_info.*")
|
||
->join("t_board_group", "t_board_group.board_group_id = t_board_to_journal.board_group_id", "left")
|
||
->join("t_user", "t_user.user_id = t_board_to_journal.user_id", "left")
|
||
->join("t_user_reviewer_info", "t_user_reviewer_info.reviewer_id=t_board_to_journal.user_id", "left")
|
||
->where('t_board_to_journal.journal_id', $journal_id)
|
||
->where('t_board_to_journal.state', 0)
|
||
->order("t_board_group.board_group_id asc,t_user.realname")
|
||
->select();
|
||
foreach ($boards as $val) {
|
||
if ($aar) {
|
||
$article1 = $this->article_obj->where('user_id', $val['user_id'])->where('journal_id', $val['journal_id'])->where('state', 5)->where('ctime', ">", strtotime("-1 year"))->select();
|
||
$article11 = $this->article_obj->where('user_id', $val['user_id'])->where('journal_id', $val['journal_id'])->where('ctime', ">", strtotime("-1 year"))->select();
|
||
$ids = $this->article_author_obj->where('email', $val['email'])->column("article_id");
|
||
$article2 = $this->article_obj->where('state', 5)->where('journal_id', $val['journal_id'])->where('article_id', "in", $ids)->select();
|
||
$article22 = $this->article_obj->where('journal_id', $val['journal_id'])->where('article_id', "in", $ids)->select();
|
||
$articles = my_array_merge($article1, $article2);
|
||
$articles_all = my_array_merge($article11, $article22);
|
||
$reviewes = $this->article_reviewer_obj->join("t_article", "t_article.article_id = t_article_reviewer.article_id", "left")->where('t_article_reviewer.reviewer_id', $val['user_id'])->where('t_article.journal_id', $journal_id)->where('t_article_reviewer.ctime', ">", strtotime("-1 year"))->where('t_article_reviewer.state', "in", [1, 2, 3])->select();
|
||
$val['articles'] = $articles;
|
||
$val['articles_all'] = $articles_all;
|
||
$val['reviewes'] = $reviewes;
|
||
}
|
||
|
||
//编委数据隔离加默认数据 chengxiaoling 20251022 start
|
||
$val['realname'] = empty($val['board_realname']) ? $val['realname'] : $val['board_realname'];
|
||
$val['email'] = empty($val['board_email']) ? $val['email'] : $val['board_email'];
|
||
$val['technical'] = empty($val['board_technical']) ? $val['technical'] : $val['board_technical'];
|
||
$val['website'] = empty($val['board_website']) ? $val['website'] : $val['board_website'];
|
||
$val['icon'] = empty($val['board_icon']) ? $val['icon'] : $val['board_icon'];
|
||
$val['company'] = empty($val['board_affiliation']) ? $val['company'] : $val['board_affiliation'];
|
||
//编委数据隔离加默认数据 chengxiaoling 20251022 end
|
||
|
||
if ($val['type'] == 0) {//主编
|
||
$ca_board['main'][] = $val;
|
||
} elseif ($val['type'] == 1) {//副主编
|
||
$ca_board['remain'][] = $val;
|
||
} else {//编委会成员
|
||
if ($val['board_group_id'] == 0) {
|
||
$ca_board['member']['nogroup'][] = $val;
|
||
} else {
|
||
$ca_board['member'][$val['group_name']][] = $val;
|
||
}
|
||
}
|
||
}
|
||
return $ca_board;
|
||
}
|
||
|
||
}
|
||
?>
|