['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; } //查询审核人信息 $aUserId = array_column($aReviewer,'reviewer_id'); $aUser = Db::name('user')->field('user_id,rs_num,right_times,error_times')->whereIn('user_id',$aUserId)->order('user_id asc')->select(); if(empty($aUser)){ continue; } $aUser = array_column($aUser, null,'user_id'); //处理数据并组装数据 $aCase = ['right_times' => '', 'right_rate' => '','error_times' => '', 'error_rate' => '']; $aToState = [2 => 3,3 => 5];//文章3拒稿5录用 审稿人2拒稿3通过 $aId = []; 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(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 != $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' => '','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}' "; //审核数量 $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]] ]; $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'); if(!empty($aReviewer)){ $aChunk = array_chunk($aReviewer, 100); 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 "; $aCase['review_num'] .= "'{$value['review_num']}' "; $aUpdateId[] = $iUserId; continue; } //审核数量无变化,跳过更新 if($aUser[$iUserId]['review_num'] == $value['review_num']){ unset($aUser[$iUserId]); continue; } //审核数量有,变化更新数量 $aCase['review_num'] .= "WHEN {$iUserId} THEN "; $aCase['review_num'] .= "'{$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]]) ->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, 100); Db::startTrans(); foreach ($aChunk as $key => $item) { //数据分片操作 $aUserId = array_column($item, 'user_id'); if(empty($aUserId)){ continue; } $result = Db::name('user')->where(['is_reviewer' => 1,'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 审稿人拒绝审稿[超过七日默认自动拒绝审稿] * */ public function refuseReviewArticle(){ $sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-7 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; } //更新超过七日未审核的数据 Db::startTrans(); //更新审稿人未审稿的数量 $aChunkReviewerNum = array_chunk($aReviewerNum, 500); 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); } $aCase = $aUpdateId = []; $sRdNum = ''; foreach ($value as $key => $item) { if($item['reviewer_id'] <=0){ continue; } //审核数量有,变化更新数量 $sRdNum .= "WHEN {$item['reviewer_id']} THEN "; $sRdNum .= Db::raw("rd_num + {$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); } /** * * 格式化信息输出 * * @access public * @return void * @author huangpu * @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"; } }