Files
tougao/application/api/controller/Finalreview.php
chengxl 2d9f7c6260 修改
2025-11-17 13:44:12 +08:00

1217 lines
59 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;
/**
* @title 终审
* @description 对接OPENAI接口
*/
class Finalreview extends Base
{
//邮件模版配置
private $aEmailConfig = [
'reviewer' => [
'email_subject' => 'Invitation for Final Decision of Manuscript - {journal_title} [{accept_sn}]',
'email_content' => '
Dear Prof. {realname},<br><br>
I hope this message finds you well.<br><br>
We would like to invite you to conduct the final decision of the manuscript detailed below:<br>
Title: [{article_title}]<br>
Manuscript ID: [{accept_sn}]<br><br>
The manuscript has passed the peer review, and revisions have been made based on the external reviewer\'s comments. We would be honored if you could conduct the final decision of the manuscript. Your expert opinion is crucial in ensuring the academic quality of the manuscript and determining its final acceptance for publication.<br><br>
<a href="{accept_url}">Click here to review the article and kindly submit your final comments within 5 days</a><br>
<a href="{reject_url}">Click here to reject the review of this manuscript</a><br>
Your username: {account}<br>
Your original password:123456qwe, if you have reset the password, please login with the new one or click the "<a href="https://submission.tmrjournals.com/retrieve">forgot password</a>".<br><br>
We truly appreciate your time and expertise, and we look forward to receiving your valuable feedback.<br><br>
Sincerely,<br>Editorial Office<br>
<a href="https://www.tmrjournals.com/draw_up.html?issn={journal_issn}">{journal_title}</a><br>
Email: {journal_email}<br>
Website: {website}'
],
'editor' => [
'email_subject' => 'Final decision for manuscript - {accept_sn}',
'email_content' => '
Dear Editor,<br><br>
Please check the final decision for manuscript ID [{accept_sn}].'
]
];
//投稿系统地址
private $sTouGaoUrl = "https://submission.tmrjournals.com/";
public function __construct(\think\Request $request = null) {
parent::__construct($request);
}
/**
* @title 终审列表-审稿人【 编委/主编/副主编】
* @param article_id 文章ID
*/
public function lists(){
//获取参数
$aParam = $this->request->post();
//参数验证-审稿人ID
$iReviewerId = empty($aParam['reviewer_id']) ? 0 : $aParam['reviewer_id'];
if(empty($iReviewerId)){
return json_encode(['status' => 2,'msg' => 'Please select a reviewer']);
}
//获取分页相关参数
$iSize = empty($aParam['size']) ? 15 : $aParam['size'];//每页显示条数
$iPage = empty($aParam['page']) ? 1 : $aParam['page'];// 当前页码
//参数组装
$aWhere = ['reviewer_id' => $iReviewerId];
if(isset($aParam['state'])){
$iState = $aParam['state'];
if($iState != ''){
$aState = is_string($iState) ? explode(',', $iState) : $iState;
$aWhere['state'] = ['in',$aState];
}else{
$aWhere['state'] = $iState;
}
}
//组装sql
$sFinalQuery = Db::name('article_reviewer_final')->where($aWhere)->buildSql();
//参数组装
$aWhere = [];
//accept_sn
if(!empty($aParam['accept_sn'])){
$aWhere['t_article.accept_sn'] = $aParam['accept_sn'];
}
//title
if(!empty($aParam['title'])){
$aWhere['t_article.title'] = ['like',"%".$aParam['title']."%"];
}
//查询审稿人相关的文章-统计数量
$iCount = Db::table("({$sFinalQuery}) finalquery")
->join('t_article', 'finalquery.article_id = t_article.article_id')->where($aWhere)->count();
if(empty($iCount)){
return json_encode(['status' => 1,'msg' => 'No final review records related to the reviewer were found','data' => ['total' => 0,'lists' => []]]);
}
//判断页数是否超过最大分页限制
$iPageNum = ceil($iCount/$iSize);
if($iPage > $iPageNum){
return json_encode(['status' => 1,'msg' => 'The number of pages has exceeded the limit, maximum page number:'.$iPageNum,'data' => ['total' => $iCount,'lists' => []]]);
}
//查询记录
$sOrder = empty($aParam['order']) ? 'id desc' : $aParam['order'];//排序
$aLists = Db::table("({$sFinalQuery}) finalquery")
->join('t_article', 'finalquery.article_id = t_article.article_id')
->field('finalquery.*,t_article.accept_sn,t_article.title,t_article.type as article_type,t_article.keywords,t_article.scoring,t_article.manuscirpt_url,t_article.state as article_state,t_article.journal_id,finalquery.invited_time,t_article.abstrart')
->where($aWhere)
->order($sOrder)
->page($iPage, $iSize)
->select();
if(!empty($aLists)){
$aJournalId = array_unique(array_column($aLists, 'journal_id'));
if(!empty($aJournalId)){
$aWhere = ['journal_id' => ['in',$aJournalId],'state' => 0];
$aJournal = Db::name('journal')->where($aWhere)->column('journal_id,title');
}
foreach ($aLists as $key => $value) {
$aLists[$key]['article_type_name'] = empty($value['article_type']) ? '' : translateType($value['article_type']);
$aLists[$key]['journal_name'] = empty($aJournal[$value['journal_id']]) ? '' : $aJournal[$value['journal_id']];
}
}
return json_encode(['status' => 1,'msg' => 'success','data' => ['total' => $iCount,'lists' => $aLists]]);
}
/**
* @title 终审人员列表【编委/主编/副主编】
* @param id 主键ID
*/
public function boardLists(){
//获取参数
$aParam = $this->request->post();
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//获取分页相关参数
$iSize = empty($aParam['size']) ? 15 : $aParam['size'];//每页显示条数
$iPage = empty($aParam['page']) ? 1 : $aParam['page'];// 当前页码
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('journal_id,state')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
//获取期刊ID
$iJournalId = empty($aArticle['journal_id']) ? '' : $aArticle['journal_id'];
if(empty($iJournalId)){
return json_encode(['status' => 3,'msg' => 'The article did not select a journal']);
}
//判断文章状态是否进入终审
$iArticleState = !isset($aArticle['state']) ? '' : $aArticle['state'];
if($iArticleState != 8){
return json_encode(['status' => 4,'msg' => 'The article has not entered the final review stage']);
}
//查询期刊编委
$aWhere = ['journal_id' => $iJournalId,'state' => 0];
//编委类型0主编1副主编2编委成员
if(isset($aParam['board_type'])){
$aWhere['type'] = $aParam['board_type'];
}
if(!empty($aParam['research_areas'])){
$aWhere['sQuery.research_areas'] = ['like',"%".$aParam['research_areas']."%"];
}
//组装sql
$sQuery = Db::name('board_to_journal')->where($aWhere)->buildSql();
//email
$aWhere = [];
if(!empty($aParam['email'])){
$aWhere['t_user.email'] = ['like', "%".$aParam["email"] . "%"];
}
//统计数量
$iCount = Db::table("({$sQuery}) sQuery")
->join('t_user', 'sQuery.user_id = t_user.user_id')->where($aWhere)->count();
if(empty($iCount)){
return json_encode(['status' => 1,'msg' => 'Reviewer not found','data' => ['total' => 0,'lists' => []]]);
}
//判断页数是否超过最大分页限制
$iPageNum = ceil($iCount/$iSize);
if($iPage > $iPageNum){
return json_encode(['status' => 1,'msg' => 'The number of pages has exceeded the limit, maximum page number:'.$iPageNum,'data' => ['total' => $iCount,'lists' => []]]);
}
//查询记录
$sOrder = empty($aParam['order']) ? 'type desc,user_id desc' : $aParam['order'];//排序
$aLists = Db::table("({$sQuery}) sQuery")
->join('t_user', 'sQuery.user_id = t_user.user_id')
->field('sQuery.user_id,sQuery.type,sQuery.research_areas,t_user.account,t_user.email,t_user.realname,t_user.localname')
->where($aWhere)
->order($sOrder)
->page($iPage, $iSize)
->select();
if(!empty($aLists)){
$aUserId = array_unique(array_column($aLists, 'user_id'));
//判断审稿人是否已邀请
$aWhere = ['article_id' => $iArticleId,'reviewer_id' => ['in',$aUserId]];
$aReviewerFinal = Db::name('article_reviewer_final')->where($aWhere)->column('reviewer_id');
foreach ($aLists as $key => $value) {
$aLists[$key]['is_invite'] = 2;
if(!empty($aReviewerFinal) && in_array($value['user_id'], $aReviewerFinal)){
$aLists[$key]['is_invite'] = 1;
continue;
}
}
}
return json_encode(['status' => 1,'msg' => 'success','data' => ['total' => $iCount,'lists' => $aLists]]);
}
/**
* @title 邀请审稿人
* @param article_id 文章ID
* @param reviewer_id 审稿人ID
*/
public function invite(){
//获取参数
$aParam = $this->request->post();
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//参数验证-审稿人ID
$iReviewerId = empty($aParam['reviewer_id']) ? 0 : $aParam['reviewer_id'];
if(empty($iReviewerId)){
return json_encode(['status' => 2,'msg' => 'Please select a reviewer']);
}
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('journal_id,state,accept_sn,title,abstrart')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
//获取期刊ID
$iJournalId = empty($aArticle['journal_id']) ? '' : $aArticle['journal_id'];
if(empty($iJournalId)){
return json_encode(['status' => 3,'msg' => 'The article did not select a journal']);
}
//判断文章状态是否进入终审
$iArticleState = empty($aArticle['state']) ? '' : $aArticle['state'];
if($iArticleState != 8){
return json_encode(['status' => 4,'msg' => 'The article has not entered the final review stage']);
}
//判断审稿人是否已邀请
$aWhere = ['article_id' => $iArticleId,'reviewer_id' => $iReviewerId,'state' => ['in',[0,5]]];
$aReviewerFinal = Db::name('article_reviewer_final')->where($aWhere)->find();
if(!empty($aReviewerFinal)){
return json_encode(['status' => 5,'msg' => 'The reviewer has been invited, please be patient and wait for the review results']);
}
//查询审稿人是否存在
$aWhere = ['journal_id' => $iJournalId,'state' => 0,'user_id' => $iReviewerId];
$aBoard = Db::name('board_to_journal')->field('user_id,type')->where($aWhere)->find();
if(empty($aBoard)){
return json_encode(['status' => 6,'msg' => 'Reviewer information not found']);
}
//查询审稿人的邮箱
$aWhere = ['user_id' => $iReviewerId,'state' => 0];
$aUser = Db::name('user')->field('email,realname,account')->where($aWhere)->find();
if(empty($aUser['email'])){
return json_encode(['status' => 7,'msg' => "Reviewer's email is empty"]);
}
//插入审稿记录
$aInsert = ['article_id' => $iArticleId,'reviewer_id' => $iReviewerId,'reviewer_type' => $aBoard['type'],'state' => 5,'invited_time' => time(),'update_time' => time()];
$iId = DB::name('article_reviewer_final')->insertGetId($aInsert);
if(!$iId){
return json_encode(['status' => 8,'msg' => "Review record insertion failed"]);
}
//邮件发送
//数据准备-查询期刊信息
$aWhere = ['journal_id' => $iJournalId,'state' => 0];
$aJournal = Db::name('journal')->field('title,issn,editorinchief,zname,abbr,alias,email,epassword,website')->where($aWhere)->find();
//数据准备-获取邮件模版
$aEmailConfig= empty($this->aEmailConfig['reviewer']) ? [] : $this->aEmailConfig['reviewer'];
//数据准备-邮件内容替换
$aSearch = [
'{accept_sn}' => empty($aArticle['accept_sn']) ? '' : $aArticle['accept_sn'],//accept_sn
'{article_title}' => empty($aArticle['title']) ? '' : $aArticle['title'],//文章标题
'{abstrart}' => empty($aArticle['abstrart']) ? '' : $aArticle['abstrart'],//文章摘要
'{journal_title}' => empty($aJournal['title']) ? '' : $aJournal['title'],//期刊名
'{journal_issn}' => empty($aJournal['issn']) ? '' : $aJournal['issn'],
'{journal_email}' => empty($aJournal['email']) ? '' : $aJournal['email'],
'{website}' => empty($aJournal['website']) ? '' : $aJournal['website'],
];
//邮箱
$email = $aUser['email'];//'tmr@tmrjournals.com';//
//用户名
$realname = empty($aUser['account']) ? '' : $aUser['account'];
$realname = empty($aUser['realname']) ? $realname : $aUser['realname'];
$aSearch['{realname}'] = $realname;
//用户账号
$aSearch['{account}'] = empty($aUser['account']) ? '' : $aUser['account'];
//审稿链接
$aSearch['{accept_url}'] = $this->createReviewUrl($iReviewerId,$iId,1,$iArticleId);
$aSearch['{reject_url}'] = $this->createReviewUrl($iReviewerId,$iId,2,$iArticleId);
//邮件标题
$title = str_replace(array_keys($aSearch), array_values($aSearch),$aEmailConfig['email_subject']);
//邮件内容变量替换
$content = str_replace(array_keys($aSearch), array_values($aSearch), $aEmailConfig['email_content']);
//带模版的邮件内容
$pre = \think\Env::get('emailtemplete.pre');
$net = \think\Env::get('emailtemplete.net');
$net1 = str_replace("{{email}}",trim($email),$net);
$content=$pre.$content.$net1;
//发送邮件邮箱配置
$memail = empty($aJournal['email']) ? '' : $aJournal['email'];
$mpassword = empty($aJournal['epassword']) ? '' : $aJournal['epassword'];
//期刊标题
$from_name = empty($aJournal['title']) ? '' : $aJournal['title'];
//发送邮件
$aResult = sendEmail($email,$title,$from_name,$content,$memail,$mpassword);
$iStatus = empty($aResult['status']) ? 1 : $aResult['status'];
$iIsSuccess = $iStatus == 1 ? 1 : 2;
$sMsg = empty($aResult['data']) ? $iIsSuccess : $aResult['data'];
//添加邮件发送日志
$aEmailLog = ['article_id' => $iArticleId,'art_rev_id' => $iId,'reviewer_id' => $iReviewerId,'type' => 6,'email' => $email,'content' => $content,'create_time' => time(),'is_success' => $iIsSuccess,'msg' => $sMsg];
$oReviewer = new \app\common\Reviewer;
$iId = $oReviewer->addLog($aEmailLog);
//返回结果
return json_encode(['status' => 1,'msg' => "Invitation successful"]);
}
/**
* @title 更新审稿状态
* @param article_id 文章ID
* @param reviewer_id 审稿人ID
* @param record_id 记录ID
* @param state 状态
*/
public function review(){
//获取参数
$aParam = $this->request->post();
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//参数验证-审稿人ID
$iReviewerId = empty($aParam['reviewer_id']) ? 0 : $aParam['reviewer_id'];
if(empty($iReviewerId)){
return json_encode(['status' => 2,'msg' => 'Please select a reviewer']);
}
//主键ID
$iId = empty($aParam['record_id']) ? 0 : $aParam['record_id'];
if(empty($iId)){
return json_encode(['status' => 2,'msg' => 'Please select the review record']);
}
//状态
$iState = isset($aParam['state']) ? intval($aParam['state']) : '-1';
if(!in_array($iState, [0,1,2,3,4])){
return json_encode(['status' => 2,'msg' => 'Illegal review status']);
}
//判断审稿记录
$aWhere = ['reviewer_id' => $iReviewerId,'article_id' => $iArticleId,'id' => $iId];
$aReviewerFinal = Db::name('article_reviewer_final')->field('state')->where($aWhere)->find();
if(empty($aReviewerFinal)){
return json_encode(['status' => 3,'msg' => 'Review record does not exist']);
}
//判断记录状态
if(!in_array($aReviewerFinal['state'], [0,5])){
return json_encode(['status' => 4,'msg' => 'Reviewer processed']);
}
if($aReviewerFinal['state'] == 5){//邀请审稿0同意4拒绝
if(!in_array($iState, [0,4])){
return json_encode(['status' => 5,'msg' => 'Illegal review status']);
}
$aUpdate = ['state' => $iState,'update_time' => time()];
if($iState == 0){
$aUpdate['agree_review_time'] = time();
}
if($iState == 4){
$aUpdate['refuse_review_time'] = time();
}
}
if($aReviewerFinal['state'] == 0){//同意审稿之后更新状态1接收2拒绝3退修
if(!in_array($iState, [1,2,3])){
return json_encode(['status' => 6,'msg' => 'Please click on "Final Decision" under the "Editorial Board Member" or "Editor-in-Chief" tab in the left sidebar to review the article.']);
}
$suggest_for_editor = empty($aParam['suggest_for_editor']) ? '' : $aParam['suggest_for_editor'];
$suggest_for_author = empty($aParam['suggest_for_author']) ? '' : $aParam['suggest_for_author'];
$aUpdate = ['state' => $iState,'update_time' => time(),'review_time' => time(),'suggest_for_editor' => $suggest_for_editor,'suggest_for_author' => $suggest_for_author];
$aUpdate['is_anonymous'] = empty($aParam['is_anonymous']) ? 2 : $aParam['is_anonymous'];//是否匿名
}
//判断更新参数
if(empty($aUpdate)){
return json_encode(['status' => 7,'msg' => 'Illegal request']);
}
//数据库更新
Db::startTrans();
$aWhere = ['id' => $iId];
$result = Db::name('article_reviewer_final')->where($aWhere)->limit(1)->update($aUpdate);
if(!$result){
return json_encode(['status' => 8,'msg' => "Review failed"]);
}
//更新文章用户最新操作状态 chengxiaoling start 20251113
$aUpdate = ['is_user_act' => 1,'user_update_time' => time()];
$aArticleWhere = ['article_id' => $iArticleId];
$article_result = Db::name('article')->where($aArticleWhere)->limit(1)->update($aUpdate);
if($article_result === false){
return json_encode(['status' => 8,'msg' => "User operation status update failed"]);
}
$oUserActLog = new \app\common\UserActLog;
$aUserLog = ['article_id' => $iArticleId,'type' => 3,'act_id' => $iId,'user_id' => $iReviewerId,'content' => 'Final review completed'];
$aAddResult = $oUserActLog->addLog($aUserLog);
Db::commit();
//更新文章用户最新操作状态 chengxiaoling end 20251113
//发送邮件
if(in_array($iState, [1,2,3])){//有审核结果发送邮件提醒编辑
//查询文章所属期刊
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('journal_id,state,accept_sn')->where($aWhere)->find();
$iJournalId = empty($aArticle['journal_id']) ? 0 : $aArticle['journal_id'];//期刊ID
//邮件发送
//数据准备-查询期刊信息
$aWhere = ['journal_id' => $iJournalId,'state' => 0];
$aJournal = Db::name('journal')->field('title,issn,editorinchief,zname,abbr,alias,email,epassword,website,editor_id')->where($aWhere)->find();
$email = empty($aJournal['email']) ? '' : $aJournal['email'];
if(!empty($email)){
//数据准备-获取邮件模版
$aEmailConfig= empty($this->aEmailConfig['editor']) ? [] : $this->aEmailConfig['editor'];
//数据准备-邮件内容替换
$aSearch = [
'{accept_sn}' => empty($aArticle['accept_sn']) ? '' : $aArticle['accept_sn'],//accept_sn
];
//邮件标题
$title = str_replace(array_keys($aSearch), array_values($aSearch),$aEmailConfig['email_subject']);
//邮件内容变量替换
$content = str_replace(array_keys($aSearch), array_values($aSearch), $aEmailConfig['email_content']);
//带模版的邮件内容
$pre = \think\Env::get('emailtemplete.pre');
$net = \think\Env::get('emailtemplete.net');
$net1 = str_replace("{{email}}",trim($email),$net);
$content=$pre.$content.$net1;
//发送邮件邮箱配置
$memail = empty($aJournal['email']) ? '' : $aJournal['email'];
$mpassword = empty($aJournal['epassword']) ? '' : $aJournal['epassword'];
//期刊标题
$from_name = empty($aJournal['title']) ? '' : $aJournal['title'];
//发送邮件
$aResult = sendEmail($email,$title,$from_name,$content,$memail,$mpassword);
$iStatus = empty($aResult['status']) ? 1 : $aResult['status'];
$iIsSuccess = $iStatus == 1 ? 1 : 2;
$sMsg = empty($aResult['data']) ? $iIsSuccess : $aResult['data'];
//添加邮件发送日志
$editor_id = empty($aJournal['editor_id']) ? 0 : $aJournal['editor_id'];
$aEmailLog = ['article_id' => $iArticleId,'art_rev_id' => $iId,'reviewer_id' => $editor_id,'type' => 5,'email' => $email,'content' => $content,'create_time' => time(),'is_success' => $iIsSuccess,'msg' => $sMsg];
$oReviewer = new \app\common\Reviewer;
$iId = $oReviewer->addLog($aEmailLog);
}
}
//返回结果
return json_encode(['status' => 1,'msg' => "Reviewed successfully"]);
}
/**
* @title 获取审稿信息
* @param record_id 记录ID
* @param state 状态
*/
public function get(){
//获取参数
$aParam = $this->request->post();
//主键ID
$iId = empty($aParam['record_id']) ? 0 : $aParam['record_id'];
if(empty($iId)){
return json_encode(['status' => 2,'msg' => 'Please select the review record']);
}
//参数验证-审稿人ID
$iReviewerId = empty($aParam['reviewer_id']) ? 0 : $aParam['reviewer_id'];
if(empty($iReviewerId)){
return json_encode(['status' => 2,'msg' => 'Please select a reviewer']);
}
//稿件状态
//判断审稿人是否是编委/主编/副主编
$aWhere = ['user_id' => $iReviewerId,'state' => 0];
$aBoard = Db::name('board_to_journal')->where($aWhere)->column('journal_id');
if(empty($aBoard)){
return json_encode(['status' => 2,'msg' => 'The reviewer role does not meet the review requirements']);
}
//查询审稿记录
$aWhere = ['reviewer_id' => $iReviewerId,'id' => $iId,'state' => 0];
$aReviewerFinal = Db::name('article_reviewer_final')->field('article_id')->where($aWhere)->find();
if(empty($aReviewerFinal)){
return json_encode(['status' => 3,'msg' => 'Review record does not exist or review has been completed']);
}
//查询文章相关信息
$aWhere = ['article_id' => $aReviewerFinal['article_id'],'journal_id' => $aBoard,'query' => ['review','repeat','final','response']];
return $this->getReviewRecord($aWhere);
}
/**
* @title 查看审稿记录
* @param record_id 记录ID
* @param state 状态
*/
public function view(){
//获取参数
$aParam = $this->request->post();
//主键ID
$iId = empty($aParam['record_id']) ? 0 : $aParam['record_id'];
if(empty($iId)){
return json_encode(['status' => 2,'msg' => 'Please select the review record']);
}
//查询审稿记录
$aWhere = ['id' => $iId];
$aReviewerFinal = Db::name('article_reviewer_final')->field('article_id,state,suggest_for_editor,suggest_for_author,update_time,reviewer_id,is_anonymous')->where($aWhere)->find();
if(empty($aReviewerFinal)){
return json_encode(['status' => 3,'msg' => 'No review records found']);
}
$aReviewerFinal['update_time'] = date('Y-m-d H:i:s',$aReviewerFinal['update_time']);
//查询审稿人信息
$aWhere = ['user_id' => $aReviewerFinal['reviewer_id']];
$aUser = Db::name('user')->field('email,realname,localname')->where($aWhere)->find();
if(!empty($aUser)){
$aReviewerFinal += $aUser;
}
//查询文章相关信息
$aWhere = ['article_id' => $aReviewerFinal['article_id'],'query' => ['review','repeat','response']];
$aResult = json_decode($this->getReviewRecord($aWhere),true);
$aArticle = empty($aResult['data']) ? [] : $aResult['data'];
if(empty($aArticle)){
return json_encode($aResult);
}
$aArticle['article_final'] = $aReviewerFinal;
return json_encode(['status' => 1,'msg' => 'success','data' => $aArticle]);
}
/**
* @title 获取文章信息及审核信息
* @param article_id 文章ID
* @param reviewer_id 审稿人ID
* @param record_id 记录ID
* @param state 状态
*/
public function getReviewRecord($aParam = []){
//获取参数
$aParam = empty($aParam) ? $this->request->post() : $aParam;
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//查询内容
$sQuery = empty($aParam['query']) ? ['review'] : $aParam['query'];
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('article_id,journal_id,state,accept_sn,title,abstrart,keywords,type,ctime')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
//文章类型
$aArticle['atype'] = empty($aArticle['type']) ? '' : translateType($aArticle['type']);
$aArticle['ctime'] = empty($aArticle['ctime']) ? '' : date('Y-m-d H:i:s',$aArticle['ctime']);
//获取文章领域
$oArticle = new \app\common\Article;
$aMajor = $oArticle->getArticleField($aParam);
$aMajor = empty($aMajor['data']) ? [] : array_unique(array_column($aMajor['data'], 'major_id'));
if(!empty($aMajor)){
foreach ($aMajor as $key => $value) {
$aMajorData[] = getMajorStr($value);
}
}
$aArticle['major'] = empty($aMajorData) ? [] : $aMajorData;
//判断期刊ID是否符合
if(!empty($aParam['journal_id']) && !in_array($aArticle['journal_id'], $aParam['journal_id'])){
return json_encode(['status' => 4,'msg' => 'The journal to which the reviewer belongs does not match the article. Please confirm']);
}
//判断文章状态是否进入终审
$iArticleState = !isset($aArticle['state']) ? '' : $aArticle['state'];
if($iArticleState != 8){
return json_encode(['status' => 5,'msg' => 'The article has not entered the final review stage']);
}
//查询文章审稿记录
$aWhere = ['article_id' => $iArticleId,'state' => ['between',[1,3]]];
$aArticleReviewer = Db::name('article_reviewer')->field('art_rev_id,reviewer_id,state,ctime')->where($aWhere)->select();
if(!empty($aArticleReviewer)){
$aArtRevId = array_column($aArticleReviewer, 'art_rev_id');
$aWhere = ['art_rev_id' => ['in',$aArtRevId],'state' => 0];
//查询初审问卷
$aQuestion = Db::name('article_reviewer_question')->where($aWhere)->order('ctime asc')->select();
$aQuestion = empty($aQuestion) ? [] : array_column($aQuestion, null,'art_rev_id');
//查询复审
$aReviewerRepeatLists = [];
// if(in_array('repeat', $sQuery)){
$aWhere = ['art_rev_id' => ['in',$aArtRevId],'recommend' => ['between',[1,3]]];
$aReviewerRepeat = Db::name('article_reviewer_repeat')->field('art_rev_rep_id,art_rev_id,recommend,content,ctime,stime')->where($aWhere)->select();
if(!empty($aReviewerRepeat)){
foreach ($aReviewerRepeat as $key => $value) {
if(!empty($value['ctime'])){
$value['ctime'] = date('Y-m-d H:i:s',$value['ctime']);
}
if(!empty($value['stime'])){
$value['stime'] = date('Y-m-d H:i:s',$value['stime']);
}
$aReviewerRepeatLists[$value['art_rev_id']][] = $value;
}
}
// }
//查询用户信息
$aUserId = array_column($aArticleReviewer, 'reviewer_id');
$aWhere = ['user_id' => ['in',$aUserId],'state' => 0];
$aUser = Db::name('user')->field('user_id,realname')->where($aWhere)->select();
$aUser = empty($aUser) ? [] : array_column($aUser, 'realname','user_id');
}
//数据处理
$aReviewerData = $aReviewerRepeatData = [];
foreach ($aArticleReviewer as $key => $value) {
//初审答卷
$aQuestionInfo = empty($aQuestion[$value['art_rev_id']]) ? [] : $aQuestion[$value['art_rev_id']];
$value['realname'] = empty($aUser[$value['reviewer_id']]) ? '' : $aUser[$value['reviewer_id']];
$value['ctime'] = empty($aQuestionInfo['ctime']) ? date('Y-m-d H:i:s',$value['ctime']) : date('Y-m-d H:i:s',$aQuestionInfo['ctime']);
$value['is_anonymous'] = empty($aQuestionInfo['is_anonymous']) ? 0 : $aQuestionInfo['is_anonymous'];
$value['question'] = $aQuestionInfo;
//复审
$aReviewerRepeatInfo = empty($aReviewerRepeatLists[$value['art_rev_id']]) ? [] : $aReviewerRepeatLists[$value['art_rev_id']];
$value['repeat'] = $aReviewerRepeatInfo;
$aReviewerData[] = $value;
// $aReviewerRepeatData[] = array_merge($aReviewerRepeatInfo,$value);
}
//查询作者回复
if(in_array('response', $sQuery)){
$aWhere = ['article_id' => $iArticleId,'artr_state' => 0];
$aResponse = Db::name('article_response_to_reviewer')->field('file_url,artr_ctime')->where($aWhere)->select();
if(!empty($aResponse)){
foreach ($aResponse as $key => $value) {
$sFileUrl = empty($value['file_url']) ? '' : $value['file_url'];
if(empty($sFileUrl)){
continue;
}
// $value['file_url'] = trim($this->sTouGaoUrl,'/').'/public/'.$sFileUrl;
$value['artr_ctime'] = empty($value['artr_ctime']) ? '' : date('Y-m-d',$value['artr_ctime']);
$aResponse[$key] = $value;
}
}
}
//查询终审记录
if(in_array('final', $sQuery)){
$aWhere = ['article_id' => $iArticleId,'state' => ['between',[1,3]]];
$aFinal = Db::name('article_reviewer_final')->field('id,reviewer_id,state,suggest_for_editor,suggest_for_author,review_time,is_anonymous')->where($aWhere)->select();
if(!empty($aFinal)){
//查询用户信息
$aUserId = array_column($aFinal, 'reviewer_id');
$aWhere = ['user_id' => ['in',$aUserId],'state' => 0];
$aUser = Db::name('user')->field('user_id,realname')->where($aWhere)->select();
$aUser = empty($aUser) ? [] : array_column($aUser, 'realname','user_id');
//数据处理
foreach ($aFinal as $key => $value) {
$aFinal[$key]['review_time'] = empty($value['review_time']) ? '' : date('Y-m-d H:i:s',$value['review_time']);
$aFinal[$key]['realname'] = empty($aUser[$value['reviewer_id']]) ? '' : $aUser[$value['reviewer_id']];
}
}
}
return json_encode(['status' => 1,'msg' => 'success','data' => ['article_review' => $aReviewerData,'article_review_repeat' => empty($aReviewerRepeatData) ? [] : $aReviewerRepeatData,'article_response' => empty($aResponse) ? [] : $aResponse,'article_final' => empty($aFinal) ? [] : $aFinal,'article' => $aArticle]]);
}
/**
* @title 获取终审文章列表
* @param article_id 文章ID
*/
public function articleLists(){
//接受参数
$aParam = $this->request->post();
//获取登录账号信息
$sUserName = empty($aParam['username']) ? '' : $aParam['username'];
if(empty($sUserName)){
return json_encode(['status' => 1,'msg' => 'Please log in to your account','data' => ['total' => 0,'lists' => []]]);
}
//查询条件数组
$aWhere = [];
//期刊ID
$iJournalId = empty($aParam['journal_id']) ? 0 : $aParam['journal_id'];
if (empty($iJournalId)) { //全部期刊
$aUserInfo = Db::name('user')->field('user_id')->where(['account' => $sUserName])->find();
if(empty($aUserInfo)){
return json_encode(['status' => 1,'msg' => 'User does not exist','data' => ['total' => 0,'lists' => []]]);
}
//获取管理期刊信息
$aJournalId = Db::name('journal')->where(['editor_id' => $aUserInfo['user_id']])->column('journal_id');
if(empty($aJournalId)){
return json_encode(['status' => 1,'msg' => 'No journals managed by this account were found','data' => ['total' => 0,'lists' => []]]);
}
$aWhere['journal_id'] = ['in', $aJournalId];
$aParam['journal_id'] = $aJournalId;
}else {
$aWhere['journal_id'] = $iJournalId;
}
//受理流水号
$sAcceptSn = empty($aParam['accept_sn']) ? '' : trim($aParam['accept_sn']);
if(!empty($sAcceptSn)){
$aWhere['accept_sn'] = $sAcceptSn;
}
//状态
if(isset($aParam['state'])){
$aWhere['state'] = $aParam['state'];
}
//标题
$sTitle = empty($aParam['title']) ? '' : $aParam['title'];
if (!empty($sTitle)) {
$aWhere['title'] = ['like',"%".$sTitle."%"];
}
//获取分页相关参数
$iSize = empty($aParam['size']) ? 15 : $aParam['size'];//每页显示条数
$iPage = empty($aParam['page']) ? 1 : $aParam['page'];// 当前页码
//获取总条数
$iCount = Db::name('article')->where($aWhere)->count();
if(empty($iCount)){
return json_encode(['status' => 1,'msg' => 'No articles found that meet the criteria','data' => ['total' => 0,'lists' => []]]);
}
//判断页数是否超过最大分页限制
$iPageNum = ceil($iCount/$iSize);
if($iPage > $iPageNum){
return json_encode(['status' => 1,'msg' => 'The number of pages has exceeded the limit, maximum page number:'.$iPageNum,'data' => ['total' => $iCount,'lists' => []]]);
}
//获取列表数据
$aArticle = Db::name('article')
->field('article_id,user_id,journal_id,accept_sn,title,type,keywords,abstrart,manuscirpt_url,special_num,remarks,state,scoring,repetition')
->where($aWhere)
->order('article_id desc')
->page($iPage, $iSize)
->select();
if(empty($aArticle)){
return json_encode(['status' => 1,'msg' => 'No articles found that meet the criteria','data' => ['total' => 0,'lists' => []]]);
}
//查询作者信息
$aUserId = array_column($aArticle, 'user_id');
$aWhere = ['user_id' => ['in',$aUserId]];
$aUser = Db::name('user')->field('user_id,email,realname,phone')->where($aWhere)->select();
$aUser = empty($aUser) ? [] : array_column($aUser, null,'user_id');
//查询期刊信息
$aJournalId = array_column($aArticle, 'journal_id');
$aWhere = ['journal_id' => ['in',$aJournalId]];
$aJournal = Db::name('journal')->where($aWhere)->column('journal_id,title');
//AI审核内容
$aArticleId = array_column($aArticle, 'article_id');
$aWhere = ['article_id' => ['in',$aArticleId]];
$aAiReview = Db::name('article_ai_review')->field('article_id,content')->where($aWhere)->column('article_id,content');
//查询终审信息
$aFinal = Db::name('article_reviewer_final')->field('id,article_id,reviewer_id,state,reviewer_type,is_anonymous')->where($aWhere)->select();
$aUserId = empty($aFinal) ? [] : array_unique(array_column($aFinal, 'reviewer_id'));
//查询作者信息
$aUserId += array_column($aArticle, 'user_id');
$aWhere = ['user_id' => ['in',$aUserId]];
$aUser = Db::name('user')->field('user_id,email,realname,phone,google_index')->where($aWhere)->select();
$aUser = empty($aUser) ? [] : array_column($aUser, null,'user_id');
//终审数据处理
$aFinalData = [];
if(!empty($aFinal)){
foreach ($aFinal as $key => $value) {
$value['realname'] = empty($aUser[$value['reviewer_id']]['realname']) ? '' : $aUser[$value['reviewer_id']]['realname'];
$aFinalData[$value['article_id']][] = $value;
}
}
//查询通讯作者信息
$aReportData = $aAuthorData = $aCountryData = [];
$aWhere = ['article_id' => ['in',$aArticleId],'state' => 0];
$aAuthor = Db::name('article_author')->field('art_aut_id,article_id,firstname,lastname,country,email,is_report')->where($aWhere)->select();
if(!empty($aAuthor)){
$aEmail = array_unique(array_column($aAuthor, 'email'));
$aWhere = ['email' => ['in',$aEmail]];
$aUserData = Db::name('user')->field('user_id,email,realname,phone,google_index')->where($aWhere)->select();
$aUserData = empty($aUserData) ? [] : array_column($aUserData, null,'email');
//数据处理
foreach ($aAuthor as $key => $value) {
if($value['is_report'] == 1){
$aUserInfo = empty($aUserData[$value['email']]) ? [] : $aUserData[$value['email']];
if(!empty($aUserInfo)){
$value['author_account'] = $aUserInfo;
$aReportData[$value['article_id']][] = $value;
}
}
$aAuthorData[$value['article_id']][] = $value;
$aCountryData[$value['article_id']][] = $value['country'];
}
}
//查询文件
$aWhere = ['article_id' => ['in',$aArticleId],'state' => 0];
$aFile = Db::name('article_file')->field('file_id,article_id,file_url,type_name,ctime')->where($aWhere)->select();
$aFileData = [];
if(!empty($aFile)){
foreach ($aFile as $key => $value) {
$value['ctime'] = date('Y-m-d');
$aFileData[$value['article_id']][$value['type_name']][] = $value;
}
}
//数据处理
$aArticleLists = [];
foreach ($aArticle as $key => $value) {
//终审
$value['final'] = empty($aFinalData[$value['article_id']]) ? [] : $aFinalData[$value['article_id']];
//作者信息
if(!empty($aUser[$value['user_id']])){
$value += $aUser[$value['user_id']];
}
//AI审稿
$value['ai_review'] = empty($aAiReview[$value['article_id']]) ? '' : $aAiReview[$value['article_id']];
//期刊名
$value['journalname'] = empty($aJournal[$value['journal_id']]) ? '' : $aJournal[$value['journal_id']];
//查询作者信息
$value['author'] = empty($aAuthorData[$value['article_id']]) ? [] : $aAuthorData[$value['article_id']];
//查询通讯作者信息
$value['reports'] = empty($aReportData[$value['article_id']]) ? [] : $aReportData[$value['article_id']];
//国家
$value['country'] = empty($aCountryData[$value['article_id']]) ? [] : array_unique($aCountryData[$value['article_id']]);
//文件
$value['file'] = empty($aFileData[$value['article_id']]) ? [] : $aFileData[$value['article_id']];
//H指数
$iGindex = 0;
$iUserId = empty($value['user_id']) ? 0 : $value['user_id'];
$sEmail = '';
if(!empty($value['reports'])){
foreach ($value['reports'] as $val) {
if ($val['author_account']['google_index'] >= $iGindex) {
$iUserId = empty($val['author_account']['user_id']) ? $iUserId : $val['author_account']['user_id'];
$iGindex = empty($val['author_account']['google_index']) ? $iGindex : $val['author_account']['google_index'];
$sEmail = empty($val['author_account']['email']) ? $iGindex : $val['author_account']['email'];
}
}
}
//查询H指数添加人信息
if(!empty($sEmail)){
$value['H'] = empty($aUserData[$sEmail]) ? [] : $aUserData[$sEmail];
}else{
$value['H'] = empty($aUser[$iUserId]) ? [] : $aUser[$iUserId];
}
$aArticleLists[] = $value;
}
//统计各个状态下的数量
$aWhere = ['state' => ['between',[0,8]]];
if(!empty($aParam['journal_id'])){
$aWhere['journal_id'] = ['in',$aParam['journal_id']];
}
$aCountNum = Db::name('article')->field("state,count(*) as num")->where($aWhere)->group("state")->select();
$aCountNum = empty($aCountNum) ? [] : array_column($aCountNum, 'num','state');
$aCountNumData = [];
for ($i = 0; $i <= 8; $i++) {
$aCountNumData[$i] = empty($aCountNum[$i]) ? 0 : $aCountNum[$i];
}
return json_encode(['status' => 1,'msg' => 'success','data' => ['total' => $iCount,'lists' => $aArticleLists,'count_num' => $aCountNumData]]);
}
/**
* @title 获取已邀请的审稿人
* @param article_id 文章ID
*/
public function inviteBoardLists(){
//获取参数
$aParam = $this->request->post();
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//获取分页相关参数
$iSize = empty($aParam['size']) ? 15 : $aParam['size'];//每页显示条数
$iPage = empty($aParam['page']) ? 1 : $aParam['page'];// 当前页码
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('journal_id,state')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
//获取期刊ID
$iJournalId = empty($aArticle['journal_id']) ? '' : $aArticle['journal_id'];
if(empty($iJournalId)){
return json_encode(['status' => 3,'msg' => 'The article did not select a journal']);
}
//判断文章状态是否进入终审
$iArticleState = !isset($aArticle['state']) ? '' : $aArticle['state'];
if($iArticleState != 8){
return json_encode(['status' => 4,'msg' => 'The article has not entered the final review stage']);
}
//编委类型0主编1副主编2编委成员
if(isset($aParam['reviewer_type'])){
$aWhere['sQuery.reviewer_type'] = $aParam['reviewer_type'];
}
//组装sql
$sQuery = Db::name('article_reviewer_final')->where($aWhere)->buildSql();
//email
$aWhere = [];
if(!empty($aParam['email'])){
$aWhere['t_user.email'] = ['like', "%".$aParam["email"] . "%"];
}
//统计数量
$iCount = Db::table("({$sQuery}) sQuery")
->join('t_user', 'sQuery.reviewer_id = t_user.user_id')->where($aWhere)->count();
if(empty($iCount)){
return json_encode(['status' => 1,'msg' => 'Reviewer not found','data' => ['total' => 0,'lists' => []]]);
}
//判断页数是否超过最大分页限制
$iPageNum = ceil($iCount/$iSize);
if($iPage > $iPageNum){
return json_encode(['status' => 1,'msg' => 'The number of pages has exceeded the limit, maximum page number:'.$iPageNum,'data' => ['total' => $iCount,'lists' => []]]);
}
//查询记录
$sOrder = empty($aParam['order']) ? 'type desc,user_id desc' : $aParam['order'];//排序
$aLists = Db::table("({$sQuery}) sQuery")
->join('t_user', 'sQuery.reviewer_id = t_user.user_id')
->field('sQuery.id,sQuery.reviewer_id,sQuery.reviewer_type,sQuery.state,sQuery.suggest_for_author,sQuery.suggest_for_editor,sQuery.update_time,sQuery.is_anonymous,t_user.account,t_user.email,t_user.realname,t_user.localname')
->where($aWhere)
->order($sOrder)
->page($iPage, $iSize)
->select();
return json_encode(['status' => 1,'msg' => 'success','data' => ['total' => $iCount,'lists' => $aLists]]);
}
/**
* @title 获取文章文件
* @param article_id 文章ID
*/
public function getArticleFile(){
//获取参数
$aParam = $this->request->post();
//主键ID
$iId = empty($aParam['record_id']) ? 0 : $aParam['record_id'];
if(empty($iId)){
return json_encode(['status' => 2,'msg' => 'Please select the review record']);
}
//查询审稿记录
$aWhere = ['id' => $iId];
$aReviewerFinal = Db::name('article_reviewer_final')->field('article_id,state')->where($aWhere)->find();
if(empty($aReviewerFinal)){
return json_encode(['status' => 3,'msg' => 'No review records found']);
}
//文章已审核
if($aReviewerFinal['state'] != 0){
return json_encode(['status' => 4,'msg' => 'The article has been reviewed']);
}
//查询文章信息
$iArticleId = empty($aReviewerFinal['article_id']) ? 0 : $aReviewerFinal['article_id'];
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('article_id')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
// 定义需要查询的文件类型
$aType = ['manuscirpt', 'picturesAndTables', 'supplementary'];
// 初始化结果数组,确保每个类型都有默认空数组
$aData = array_fill_keys($aType, []);
// 获取每个类型的最大file_id最新记录)
$aWhere = ['state' => 0,'type_name' => ['in',$aType],'article_id' => $iArticleId];
$sQuery = Db::name('article_file')
->field('type_name, MAX(file_id) AS max_file_id')
->where($aWhere)
->group('type_name')
->buildSql();
//关联查询获取完整信息
$aFileList = Db::name('article_file')
->alias('article_file')
->join([$sQuery => 'sQuery'], 'article_file.file_id = sQuery.max_file_id', 'INNER')
->field('article_file.type_name, article_file.file_id, article_file.file_url, article_file.ctime')
->select();
// 数据处理
if (!empty($aFileList)) {
foreach ($aFileList as $value) {
$type = empty($value['type_name']) ? '' : $value['type_name'];
$aData[$type][] = [
'file_id' => $value['file_id'],
'file_url' => $value['file_url'],
'ctime' => empty($value['ctime']) ? '' : date('Y-m-d',$value['ctime'])
];
}
}
$aData['manuscirpt'] = empty($aData['manuscirpt'][0]) ? [] : $aData['manuscirpt'][0];
return json_encode(['status' => 1,'msg' => 'success','data' => $aData]);
}
/**
* @title 审稿链接创建
* @param reviewer_id 审稿人ID
* @param record_id 审稿记录主键ID
* @param is_agree 是否同意1是2否
*/
private function createReviewUrl($reviewer_id = 0, $record_id = 0, $is_agree = 2,$iArticleId = 0)
{
if(empty($reviewer_id) || empty($record_id)){
return '';
}
$code = md5(time() . rand(1000, 9999) . 'thinkphp');
//插入自动登录记录
$aInsert = ['user_id' => $reviewer_id,'code' => $code,'ctime' => time()];
$result = Db::name('login_auto')->insertGetId($aInsert);
//返回链接
$sJumpUrl = 'edit_per_text_yq?a_id='.$iArticleId;//拒绝
return trim($this->sTouGaoUrl,'/').'/'.$sJumpUrl.'&r_id=' . $record_id;
}
/**
* @title 获取文章的审稿意见
* @param article_id
*/
public function getArticleFinalReview($aParam = []){
//获取参数
$aParam = empty($aParam) ? $this->request->post() : $aParam;
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//查询文章审稿记录
$aWhere = ['article_id' => $iArticleId,'state' => ['in',[0,1,2,3]]];
$aArticleReviewer = Db::name('article_reviewer')->field('art_rev_id,state,ctime,reviewer_id')->where($aWhere)->select();
if(!empty($aArticleReviewer)){
$aArtRevId = array_column($aArticleReviewer, 'art_rev_id');
$aWhere = ['art_rev_id' => ['in',$aArtRevId],'state' => 0];
//查询初审问卷
$aQuestion = Db::name('article_reviewer_question')->field('art_rev_id,ctime,score,rated,recommend')->where($aWhere)->order('ctime asc')->select();
$aQuestion = empty($aQuestion) ? [] : array_column($aQuestion, null,'art_rev_id');
//查询复审
$aReviewerRepeatLists = [];
$aWhere = ['art_rev_id' => ['in',$aArtRevId],'recommend' => ['between',[1,3]]];
$aReviewerRepeat = Db::name('article_reviewer_repeat')->field('art_rev_rep_id,art_rev_id,recommend,ctime,stime')->where($aWhere)->select();
if(!empty($aReviewerRepeat)){
foreach ($aReviewerRepeat as $key => $value) {
$aReviewerRepeatLists[$value['art_rev_id']][] = $value;
}
}
//查询作者信息
$aUserId = array_unique(array_column($aArticleReviewer, 'reviewer_id'));
$aWhere = ['user_id' => ['in',$aUserId],'state' => 0];
$aUser = Db::name('user')->where($aWhere)->column('user_id,realname');
foreach ($aArticleReviewer as $key => $value) {
$aQuestionData = empty($aQuestion[$value['art_rev_id']]) ? [] : $aQuestion[$value['art_rev_id']];
$value['ctime'] = empty($aQuestionData['ctime']) ? $value['ctime'] : $aQuestionData['ctime'];
$value['score'] = empty($aQuestionData['score']) ? 0 : $aQuestionData['score'];
$value['repeat'] = empty($aReviewerRepeatLists[$value['art_rev_id']]) ? [] : $aReviewerRepeatLists[$value['art_rev_id']];
$value['rated'] = empty($aQuestionData['rated']) ? 0 : $aQuestionData['rated'];
$value['realname'] = empty($aUser[$value['reviewer_id']]) ? '' : $aUser[$value['reviewer_id']];
$value['recommend'] = empty($aQuestionData['recommend']) ? 0 : $aQuestionData['recommend'];
$aArticleReviewer[$key] = $value;
}
}
//查询终审-审稿记录
$aWhere = ['article_id' => $iArticleId,'state' => ['in',[0,1,2,3,4,5]]];
$aReviewerFinal = Db::name('article_reviewer_final')->field('id,state,suggest_for_editor,suggest_for_author,update_time,reviewer_id,is_anonymous')->where($aWhere)->select();
if(!empty($aReviewerFinal)){
//查询作者信息
$aUserId = array_unique(array_column($aReviewerFinal, 'reviewer_id'));
$aWhere = ['user_id' => ['in',$aUserId],'state' => 0];
$aUser = Db::name('user')->where($aWhere)->column('user_id,realname');
foreach ($aReviewerFinal as $key => $value) {
$aReviewerFinal[$key]['realname'] = empty($aUser[$value['reviewer_id']]) ? '' : $aUser[$value['reviewer_id']];
}
}
$aData = ['review' => $aArticleReviewer,'final_review' => $aReviewerFinal];
return json_encode(['status' => 1,'msg' => 'success','data' => $aData]);
}
/**
* @title 查询终审状态
* @param record_id 记录ID
* @param state 状态
*/
public function getById(){
//获取参数
$aParam = $this->request->post();
//主键ID
$iId = empty($aParam['record_id']) ? 0 : $aParam['record_id'];
if(empty($iId)){
return json_encode(['status' => 2,'msg' => 'Please select the review record']);
}
//参数验证-审稿人ID
$iReviewerId = empty($aParam['reviewer_id']) ? 0 : $aParam['reviewer_id'];
if(empty($iReviewerId)){
return json_encode(['status' => 2,'msg' => 'Please select a reviewer']);
}
//稿件状态
//判断审稿人是否是编委/主编/副主编
$aWhere = ['user_id' => $iReviewerId,'state' => 0];
$aBoard = Db::name('board_to_journal')->where($aWhere)->column('journal_id');
if(empty($aBoard)){
return json_encode(['status' => 2,'msg' => 'The reviewer role does not meet the review requirements']);
}
//查询审稿记录
$aWhere = ['reviewer_id' => $iReviewerId,'id' => $iId];
$aReviewerFinal = Db::name('article_reviewer_final')->where($aWhere)->find();
if(empty($aReviewerFinal)){
return json_encode(['status' => 3,'msg' => 'Review record does not exist or review has been completed']);
}
$aWhere = ['user_id' => $iReviewerId];
$aUser = Db::name('user')->field('realname')->where($aWhere)->find();
$aReviewerFinal['realname'] = empty($aUser['realname']) ? '' : $aUser['realname'];
return json_encode(['status' => 1,'msg' => 'success','data' => $aReviewerFinal]);
}
/**
* @title 获取文章的终审意见
* @param article_id
*/
public function getRecord($aParam = []){
//获取参数
$aParam = empty($aParam) ? $this->request->post() : $aParam;
//参数验证-文章ID
$iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id'];
if(empty($iArticleId)){
return json_encode(['status' => 2,'msg' => 'Please select a article']);
}
//查询文章
$aWhere = ['article_id' => $iArticleId];
$aArticle = Db::name('article')->field('ctime')->where($aWhere)->find();
if(empty($aArticle)){
return json_encode(['status' => 3,'msg' => 'The query article does not exist']);
}
//查询终审-审稿记录
$aWhere = ['article_id' => $iArticleId,'state' => ['in',[1,2,3]]];
$aReviewerFinal = Db::name('article_reviewer_final')->field('reviewer_id')->order('review_time desc')->where($aWhere)->find();
//查询审稿人姓名
$iUserId = empty($aReviewerFinal['reviewer_id']) ? 0 : $aReviewerFinal['reviewer_id'];
if(!empty($iUserId)){
$aWhere = ['user_id' => $iUserId,'state' => 0];
$aUser = Db::name('user')->field('realname')->where($aWhere)->find();
$aReviewerFinal['realname'] = empty($aUser['realname']) ? '' : $aUser['realname'];
}
//获取文章记录
$aWhere = ['article_id' => $iArticleId,'state' => 0,'state_to' => ['in',[0,1,5]]];
$aArticleMsg = Db::name('article_msg')->field('state_from,state_to,ctime')->where($aWhere)->order('ctime deac')->select();
if(!empty($aArticleMsg)){
$iReceivedTime = $iRevisionTime = $iAcceptedTime = 0;
foreach ($aArticleMsg as $key => $value) {
if(empty($iReceivedTime) && $value['state_to'] == 0){
$iReceivedTime = $value['ctime'];
}
if(empty($iRevisionTime) && $value['state_to'] == 1){
$iRevisionTime = $value['ctime'];
}
if(empty($iAcceptedTime) && $value['state_to'] == 5){
$iAcceptedTime = $value['ctime'];
}
}
}
$iReceivedTime = empty($iReceivedTime) ? $aArticle['ctime'] : $iReceivedTime;
$aReviewerFinal['received_time'] = empty($iReceivedTime) ? '' :date('Y-m-d H:i:s',$iReceivedTime);
$aReviewerFinal['revision_time'] = empty($iRevisionTime) ? '' :date('Y-m-d H:i:s',$iRevisionTime);
$aReviewerFinal['accepted_time'] = empty($iAcceptedTime) ? '' :date('Y-m-d H:i:s',$iAcceptedTime);
return json_encode(['status' => 1,'msg' => 'success','data' => $aReviewerFinal]);
}
}