['in',[3,5]] ]; $iCount = Db::name('article')->field('article_id,state')->where($aParam)->count(); if(empty($iCount)){ $this->showMessage('未查询到满足要求的审稿人数据',2); exit; } $iSize = 1000; $iDealNum = ceil($iCount/$iSize); //数据处理 $aUpdate = []; for ($iPage=1; $iPage <= $iDealNum; $iPage++) { $iStart = ($iPage - 1) * $iSize; $aArticleState = Db::name('article')->where($aParam)->limit($iStart,$iSize)->column('article_id,state'); if(empty($aArticleState)){ continue; } //获取该文章审核人的信息 $aWhere = [ 'article_id'=>['in',array_keys($aArticleState)], 'state'=>['in',[1,2,3]], ]; $aReviewer = Db::name('article_reviewer')->field('article_id,reviewer_id,state')->where($aWhere)->order('article_id asc,reviewer_id asc')->select(); if(empty($aReviewer)){ continue; } //处理数据并组装数据 $aToState = [2 => 3,3 => 5];//文章3拒稿5录用 审稿人2拒稿3通过 $aId = []; // echo '
';var_dump($aReviewer);
foreach ($aReviewer as $key => $item) {
//审核次数+1;
$aUpdate[$item['reviewer_id']]['reviewer_id'] = $item['reviewer_id'] ;
$aUpdate[$item['reviewer_id']]['rs_num'] = empty($aUpdate[$item['reviewer_id']]['rs_num']) ? 1 : $aUpdate[$item['reviewer_id']]['rs_num']+1 ;
//文章状态
$iArticleState = empty($aArticleState[$item['article_id']]) ? 0 : $aArticleState[$item['article_id']];
if(empty($iArticleState)){
continue;
}
if($item['state'] == 1){
$aUpdate[$item['reviewer_id']]['major_times'] = empty($aUpdate[$item['reviewer_id']]['major_times']) ? 1 : $aUpdate[$item['reviewer_id']]['major_times']+1 ;
continue;
}
if(empty($aToState[$item['state']])){
continue;
}
if($iArticleState == $aToState[$item['state']]){
$aUpdate[$item['reviewer_id']]['right_times'] = empty($aUpdate[$item['reviewer_id']]['right_times']) ? 1 : $aUpdate[$item['reviewer_id']]['right_times']+1 ;
}
if($iArticleState != $aToState[$item['state']]){
$aUpdate[$item['reviewer_id']]['error_times'] = empty($aUpdate[$item['reviewer_id']]['error_times']) ? 1 : $aUpdate[$item['reviewer_id']]['error_times']+1 ;
}
}
}
$aChunk = array_chunk($aUpdate, $iSize);
Db::startTrans();
foreach ($aChunk as $key => $value) {
$aCase = ['right_times' => '', 'right_rate' => '','error_times' => '', 'error_rate' => '','major_times' => '','major_rate' => '','rs_num' => ''];
foreach ($value as $item) {
//正确数
$iRsNum = empty($item['rs_num']) ? 0 : $item['rs_num'];
$iRightTimes = empty($item['right_times']) ? 0 : $item['right_times'];
$iRightRate = empty($iRightTimes) ? 0 : round($iRightTimes/$iRsNum,2);
$aCase['right_times'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['right_times'] .= "'{$iRightTimes}' ";
$aCase['right_rate'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['right_rate'] .= "'{$iRightRate}' ";
//错误数
$iErrorTimes = empty($item['error_times']) ? 0 : $item['error_times'];
$iErrorRate = empty($iErrorTimes) ? 0 : round($iErrorTimes/$iRsNum,2);
$aCase['error_times'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['error_times'] .= "'{$iErrorTimes}' ";
$aCase['error_rate'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['error_rate'] .= "'{$iErrorRate}' ";
//大修次数
$iMajorTimes = empty($item['major_times']) ? 0 : $item['major_times'];
$iMajorRate = empty($iMajorTimes) ? 0 : round($iMajorTimes/$iRsNum,2);
$aCase['major_times'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['major_times'] .= "'{$iMajorTimes}' ";
$aCase['major_rate'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['major_rate'] .= "'{$iMajorRate}' ";
//审核数量
$aCase['rs_num'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['rs_num'] .= "'{$iRsNum}' ";
}
$aId = array_column($value, 'reviewer_id');
//更新数据库
foreach ($aCase as $kk => $value) {
if(empty($value)){
continue;
}
$aUpdateCase[$kk] = Db::raw('CASE user_id '.$value.'END');
}
if(empty($aUpdateCase) || empty($aId)){
$this->showMessage('未查询到满足要求的审稿人数据['.$key.']'."\n",2);
continue;
}
$result = Db::name('user')
->where('user_id', 'IN', $aId)
->limit(count($aId))
->update($aUpdateCase);
if ($result === false) {
$this->showMessage('审稿人质量数据处理失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('审稿人质量数据处理成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
$this->showMessage('审稿人质量数据处理完成',1);
}
/**
* 批量处理审稿人活跃度/疲劳度[近两个月]
*
* @return void
*/
public function reviewerActivity(){
$sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-2 month')));
//获取该文章审核人的信息
$aWhere = [
'ctime'=>['>',$sDate],
// 'state'=>['in',[1,2,3]]
'state' => ['BETWEEN',[1,3]]
];
$aReviewer = Db::name('article_reviewer')->field('reviewer_id,count(article_id) as review_num ')->where($aWhere)->order('reviewer_id asc')->group('reviewer_id')->select();
//查询审稿人数量不为0的审稿信息
$aUserWhere = [
// 'is_reviewer' => 1,
'review_num' => ['>',0]
];
$aUser = Db::name('user')->field('user_id,review_num')->where($aUserWhere)->select();
if(empty($aReviewer) && empty($aUser)){
$this->showMessage('未查询到待处理的审稿人数据',2);
exit;
}
$aUser = empty($aUser) ? [] : array_column($aUser, null,'user_id');
//分片处理数量
$iChunkSize = 200;
if(!empty($aReviewer)){
$aChunk = array_chunk($aReviewer, $iChunkSize);
Db::startTrans();
foreach ($aChunk as $key => $item) { //数据分片操作
//需要更新的用户ID
$aUpdateId = [];
//SQL拼接
$aCase['review_num'] = 'CASE user_id ';
foreach ($item as $key => $value) {
//用户ID
$iUserId = $value['reviewer_id'];
//拼接更新语句
if(empty($aUser[$iUserId])){
//更新数量
$aCase['review_num'] .= "WHEN {$iUserId} THEN '{$value['review_num']}' ";
$aUpdateId[] = $iUserId;
continue;
}
//审核数量无变化,跳过更新
if($aUser[$iUserId]['review_num'] == $value['review_num']){
unset($aUser[$iUserId]);
continue;
}
//审核数量有,变化更新数量
$aCase['review_num'] .= "WHEN {$iUserId} THEN '{$value['review_num']}' ";
$aUpdateId[] = $iUserId;
unset($aUser[$iUserId]);
}
//SQL拼接最后结尾
$aCase['review_num'] .= 'END';
//执行更新
if(empty($aUpdateId)){
continue;
}
$result = Db::name('user')
->where(['user_id' => ['in',$aUpdateId]])
->limit(count($aUpdateId))
->update([
'review_num' => Db::raw($aCase['review_num']),
]);
if ($result === false) {
$this->showMessage('更新审稿人审核数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('更新审稿人审核数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
}
if(!empty($aUser)){
$aChunk = array_chunk($aUser, $iChunkSize);
Db::startTrans();
foreach ($aChunk as $key => $item) { //数据分片操作
$aUserId = array_column($item, 'user_id');
if(empty($aUserId)){
continue;
}
$result = Db::name('user')->where(['user_id' => ['in',$aUserId]])
->limit(count($aUserId))
->update([
'review_num' => 0,
]);
if ($result === false) {
$this->showMessage('清空审稿人审核数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('清空审稿人审核数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
}
$this->showMessage('批量更新审稿人审核数量成功'."\n",1);
}
/**
* @title 审稿人拒绝审稿[超过5日默认自动拒绝审稿]
*
*/
public function refuseReviewArticle(){
$sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-5 day')));
//获取该文章审核人的信息
$aWhere = [
'ctime'=>['<',$sDate],
'state'=> 5
];
//统计每个审稿人未审稿的数量
$aReviewerNum = Db::name('article_reviewer')->field('reviewer_id,count(art_rev_id) as num')->where($aWhere)->group('reviewer_id')->order('reviewer_id asc')->select();
if(empty($aReviewerNum)){
$this->showMessage('未查询到需要超过七日的稿件',2);
exit;
}
//分片处理数量
$iChunkSize = $this->iChunkSize;
//扣减分值
$iScore = 3;
//更新审稿人未审稿的数量
$aChunkReviewerNum = array_chunk($aReviewerNum, $iChunkSize);
//更新超过七日未审核的数据
Db::startTrans();
foreach ($aChunkReviewerNum as $key => $value) {
$aId = array_column($value, 'reviewer_id');
if(empty($aId)){
continue;
}
$aWhere['reviewer_id']=['in',$aId];
$iCount = array_sum(array_column($value, 'num'));
$iResult = Db::name('article_reviewer')->where($aWhere)->limit($iCount)->update(['state' => 4]);
if ($iResult === false) {
$this->showMessage('更新审稿人审稿状态失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('更新审稿人审稿状态成功['.$key.']执行SQL条数:'.$iResult."\n",1);
}
$aUpdateId = [];
$aCase = ['rd_num' => '','review_score' => ''];
foreach ($value as $key => $item) {
if($item['reviewer_id'] <=0){
continue;
}
//审核数量有,变化更新数量
$aCase['rd_num'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['rd_num'] .= Db::raw("rd_num + {$item['num']}")." ";
//扣减分数
$aCase['review_score'] .= "WHEN {$item['reviewer_id']} THEN ";
$aCase['review_score'] .= Db::raw("review_score - {$iScore}")." ";
$aUpdateId[] = $item['reviewer_id'];
}
//更新数据库
foreach ($aCase as $kk => $value) {
if(empty($value)){
continue;
}
$aUpdateCase[$kk] = Db::raw('CASE user_id '.$value.'END');
}
if(empty($aUpdateCase) || empty($aId)){
$this->showMessage('未查询到满足要求的审稿人数据['.$key.']'."\n",2);
continue;
}
//执行更新
$result = Db::name('user')
->where(['user_id' => ['in',$aUpdateId]])
->limit(count($aUpdateId))
->update($aUpdateCase);
if ($result === false) {
$this->showMessage('更新用户拒绝审稿数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('更新用户拒绝审稿数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
$this->showMessage('批量更新超过七日未审稿的状态成功',2);
}
/**
* @title 审稿人拒绝审稿统计
*
*/
public function refuseReviewNum(){
//获取该文章审核人的信息
$aWhere = [
'state'=> 4
];
//统计每个审稿人未审稿的数量
$aReviewerNum = Db::name('article_reviewer')->field('reviewer_id,count(art_rev_id) as num')->where($aWhere)->group('reviewer_id')->order('reviewer_id asc')->select();
if(empty($aReviewerNum)){
$this->showMessage('未查询到用户拒绝审稿数量',2);
exit;
}
//更新超过七日未审核的数据
Db::startTrans();
//更新审稿人未审稿的数量
$aChunkReviewerNum = array_chunk($aReviewerNum, 1000);
foreach ($aChunkReviewerNum as $key => $value) {
$aId = array_column($value, 'reviewer_id');
if(empty($aId)){
continue;
}
$aCase = $aUpdateId = [];
$sRdNum = '';
foreach ($value as $item) {
if($item['reviewer_id'] <=0){
continue;
}
//审核数量有,变化更新数量
$sRdNum .= "WHEN {$item['reviewer_id']} THEN {$item['num']} ";
$aUpdateId[] = $item['reviewer_id'];
}
//SQL拼接最后结尾
$aCase['rd_num'] ='CASE user_id '.$sRdNum.'END';
//执行更新
$result = Db::name('user')
->where(['user_id' => ['in',$aUpdateId]])
->limit(count($aUpdateId))
->update([
'rd_num' => Db::raw($aCase['rd_num']),
]);
if ($result === false) {
$this->showMessage('更新用户拒绝审稿数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('更新用户拒绝审稿数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
$this->showMessage('批量更新超过七日未审稿的状态成功',2);
}
/**
* 批量处理审稿人活跃度/同意审稿数量[近两年]
*
* @return void
*/
public function reviewerActivityForYear(){
$sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-2 year')));
//获取该文章审核人的信息
$aWhere = [
'ctime' => ['>',$sDate],
'state' => ['BETWEEN',[0,5]]
];
$aReviewer = Db::name('article_reviewer')->field('reviewer_id,SUM(state IN (0,1,2,3)) AS review_agree_num,SUM(state IN (1,2,3)) AS review_activity_num,SUM(state = 4) AS review_refuse_num,SUM(state IN (0,1,2,3,4,5)) AS review_invite_num')->where($aWhere)->order('reviewer_id asc')->group('reviewer_id')->select();
//查询审稿人数量不为0的审稿信息
$aUser = Db::name('user')->field('user_id,review_activity_num,review_agree_num,review_refuse_num,review_invite_num')->where('review_invite_num','>',0)->select();
if(empty($aReviewer) && empty($aUser)){
$this->showMessage('未查询到待处理的审稿人数据【近两年】',2);
exit;
}
//处理数量
$iChunkSize = $this->iChunkSize;
$aUser = empty($aUser) ? [] : array_column($aUser, null,'user_id');
//分片处理数据
if(!empty($aReviewer)){
$aChunk = array_chunk($aReviewer, $iChunkSize);
Db::startTrans();
foreach ($aChunk as $key => $item) { //数据分片操作
//需要更新的用户ID
$aUpdateId = [];
//SQL拼接
$aCase = ['review_activity_num' => [], 'review_agree_num' => [],'review_refuse_num' => [],'review_invite_num' => [],'review_agree_rate' => []];
foreach ($item as $key => $value) {
//用户ID
$iUserId = $value['reviewer_id'];
//活跃度
$review_activity_num = empty($value['review_activity_num']) ? 0 : $value['review_activity_num'];
//同意审稿数量
$review_agree_num = empty($value['review_agree_num']) ? 0 : $value['review_agree_num'];
//拒绝审稿数量
$review_refuse_num = empty($value['review_refuse_num']) ? 0 : $value['review_refuse_num'];
//邀请审稿数量
$review_invite_num = empty($value['review_invite_num']) ? 0 : $value['review_invite_num'];
//同意审稿占比
$review_agree_rate = empty($review_invite_num) ? 0 : round($review_agree_num/$review_invite_num,2);
//用户信息
$aUserInfo = empty($aUser[$iUserId]) ? [] : $aUser[$iUserId];
//拼接更新语句
if(empty($aUserInfo)){
//更新活跃度-审稿数量
$aCase['review_activity_num'][]= "WHEN {$iUserId} THEN '{$review_activity_num}' ";
//更新同意审稿数量
$aCase['review_agree_num'][] = "WHEN {$iUserId} THEN '{$review_agree_num}' ";
//更新拒绝审稿数量
$aCase['review_refuse_num'][] = "WHEN {$iUserId} THEN '{$review_refuse_num}' ";
//更新邀请审稿数量
$aCase['review_invite_num'][] = "WHEN {$iUserId} THEN '{$review_invite_num}' ";
//同意审稿占比
$aCase['review_agree_rate'][] = "WHEN {$iUserId} THEN '{$review_agree_rate}' ";
$aUpdateId[] = $iUserId;
continue;
}
//数量无变化,跳过更新
if($aUserInfo['review_activity_num'] == $value['review_activity_num'] && $aUserInfo['review_agree_num'] == $value['review_agree_num'] && $aUserInfo['review_refuse_num'] == $value['review_refuse_num'] && $aUserInfo['review_invite_num'] == $value['review_invite_num']){
unset($aUser[$iUserId]);
continue;
}
//更新活跃度-审稿数量
$aCase['review_activity_num'][] = "WHEN {$iUserId} THEN '{$review_activity_num}' ";
//更新同意审稿数量
$aCase['review_agree_num'][] = "WHEN {$iUserId} THEN '{$review_agree_num}' ";
//更新拒绝审稿数量
$aCase['review_refuse_num'][] = "WHEN {$iUserId} THEN '{$review_refuse_num}' ";
//更新邀请审稿数量
$aCase['review_invite_num'][] = "WHEN {$iUserId} THEN '{$review_invite_num}' ";
//同意审稿占比
$aCase['review_agree_rate'][] = "WHEN {$iUserId} THEN '{$review_agree_rate}' ";
$aUpdateId[] = $iUserId;
unset($aUser[$iUserId]);
}
//更新数据库
foreach ($aCase as $kk => $value) {
if(empty($value)){
continue;
}
$sWhere = implode(" ", $value);
$aUpdateCase[$kk] = Db::raw('CASE user_id '.$sWhere.'END');
}
if(empty($aUpdateCase) || empty($aUpdateId)){
$this->showMessage('未查询到满足要求的审稿人数据['.$key.']'."\n",2);
continue;
}
//更新数据
$result = Db::name('user')
->where(['user_id' => ['in',$aUpdateId]])
->update($aUpdateCase);
if ($result === false) {
$this->showMessage('更新近两年审稿人审核数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('更新近两年审稿人审核数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
}
if(!empty($aUser)){
$aChunk = array_chunk($aUser, $iChunkSize);
Db::startTrans();
foreach ($aChunk as $key => $item) { //数据分片操作
$aUserId = array_column($item, 'user_id');
if(empty($aUserId)){
continue;
}
$result = Db::name('user')->where(['user_id' => ['in',$aUserId]])
->limit(count($aUserId))
->update([
'review_activity_num' => 0,
'review_agree_num' => 0,
'review_refuse_num' => 0,
'review_refuse_num' => 0,
'review_agree_rate' => 0,
]);
if ($result === false) {
$this->showMessage('清空近两年审稿人审核数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2);
}else{
$this->showMessage('清空近两年审稿人审核数量成功['.$key.']执行SQL条数:'.$result."\n",1);
}
}
Db::commit();
}
$this->showMessage('批量更新近两年审稿人审核数量成功'."\n",1);
}
/**
* 批量处理待审核的文章自动推荐审稿人
*
* @return void
*/
public function recommendedReviewer(){
$this->showMessage('批量处理待审核的文章自动推荐审稿人成功'."\n",1);
exit;
//查询条件
$aWhere = ['state' => 2];
$aWhere['user_id'] = 54;
$aArticle = Db::name('article')->field('article_id,accept_sn')->where($aWhere)->limit(1)->select();
if(empty($aArticle)){
$this->showMessage('未查询到需要处理的待审核的文章',2);
exit;
}
//数据处理
foreach ($aArticle as $key => $value) {
$iArticleId = empty($value['article_id']) ? 0 : $value['article_id'];
if(empty($iArticleId)){
continue;
}
$sQueueId = \think\Queue::push('app\api\job\RecommendReviewer@fire',['article_id' =>$iArticleId], 'RecommendReviewer');
if($sQueueId === false){
$this->showMessage('文章入队失败,文章ID:'.$value['article_id'].'['.$value['accept_sn']."]\n",2);
continue;
}
}
$this->showMessage('批量处理待审核的文章自动推荐审稿人成功'."\n",1);
}
/**
*
* 格式化信息输出
*
* @access public
* @return void
* @date 2018.09.28
* @param $[message] [<显示信息>]
* @param $[status] [<输出信息1成功,2失败>]
*/
private function showMessage($message, $status = 1) {
if ($status == 1) {
echo "[SUCCESS]";
} else {
echo "[ERROR]";
}
echo date("Y-m-d H:i:s") . " " . $message . "\n";
}
}