Files
tougao/application/api/controller/Web.php
2025-11-04 13:31:32 +08:00

458 lines
21 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\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;
}
}
?>