From f6391adcb00a4b9ed125ca41f6f89bc3a0926454 Mon Sep 17 00:00:00 2001 From: chengxl Date: Thu, 4 Dec 2025 15:20:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/Crontask.php | 205 +++++++++++++++++------- 1 file changed, 147 insertions(+), 58 deletions(-) diff --git a/application/api/controller/Crontask.php b/application/api/controller/Crontask.php index 4e09a0a..dc7ba4c 100644 --- a/application/api/controller/Crontask.php +++ b/application/api/controller/Crontask.php @@ -2,9 +2,11 @@ namespace app\api\controller; use think\Controller; use think\Db; +use app\common\Reviewer; class Crontask extends Controller { + protected $iChunkSize = 500; /** * 批量处理审稿人审稿质量 * @return void @@ -144,7 +146,8 @@ class Crontask extends Controller //获取该文章审核人的信息 $aWhere = [ 'ctime'=>['>',$sDate], - 'state'=>['in',[1,2,3]] + // '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(); @@ -159,8 +162,10 @@ class Crontask extends Controller exit; } $aUser = empty($aUser) ? [] : array_column($aUser, null,'user_id'); + //分片处理数量 + $iChunkSize = 200; if(!empty($aReviewer)){ - $aChunk = array_chunk($aReviewer, 100); + $aChunk = array_chunk($aReviewer, $iChunkSize); Db::startTrans(); foreach ($aChunk as $key => $item) { //数据分片操作 //需要更新的用户ID @@ -174,8 +179,7 @@ class Crontask extends Controller //拼接更新语句 if(empty($aUser[$iUserId])){ //更新数量 - $aCase['review_num'] .= "WHEN {$iUserId} THEN "; - $aCase['review_num'] .= "'{$value['review_num']}' "; + $aCase['review_num'] .= "WHEN {$iUserId} THEN '{$value['review_num']}' "; $aUpdateId[] = $iUserId; continue; } @@ -185,8 +189,7 @@ class Crontask extends Controller continue; } //审核数量有,变化更新数量 - $aCase['review_num'] .= "WHEN {$iUserId} THEN "; - $aCase['review_num'] .= "'{$value['review_num']}' "; + $aCase['review_num'] .= "WHEN {$iUserId} THEN '{$value['review_num']}' "; $aUpdateId[] = $iUserId; unset($aUser[$iUserId]); } @@ -198,6 +201,7 @@ class Crontask extends Controller } $result = Db::name('user') ->where(['user_id' => ['in',$aUpdateId]]) + ->limit(count($aUpdateId)) ->update([ 'review_num' => Db::raw($aCase['review_num']), ]); @@ -210,14 +214,14 @@ class Crontask extends Controller Db::commit(); } if(!empty($aUser)){ - $aChunk = array_chunk($aUser, 100); + $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(['is_reviewer' => 1,'user_id' => ['in',$aUserId]]) + $result = Db::name('user')->where(['user_id' => ['in',$aUserId]]) ->limit(count($aUserId)) ->update([ 'review_num' => 0, @@ -235,11 +239,11 @@ class Crontask extends Controller } /** - * @title 审稿人拒绝审稿[超过七日默认自动拒绝审稿] + * @title 审稿人拒绝审稿[超过5日默认自动拒绝审稿] * */ public function refuseReviewArticle(){ - $sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-7 day'))); + $sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-5 day'))); //获取该文章审核人的信息 $aWhere = [ 'ctime'=>['<',$sDate], @@ -252,11 +256,14 @@ class Crontask extends Controller $this->showMessage('未查询到需要超过七日的稿件',2); exit; } - + //分片处理数量 + $iChunkSize = $this->iChunkSize; + //扣减分值 + $iScore = 3; + //更新审稿人未审稿的数量 + $aChunkReviewerNum = array_chunk($aReviewerNum, $iChunkSize); //更新超过七日未审核的数据 Db::startTrans(); - //更新审稿人未审稿的数量 - $aChunkReviewerNum = array_chunk($aReviewerNum, 500); foreach ($aChunkReviewerNum as $key => $value) { $aId = array_column($value, 'reviewer_id'); if(empty($aId)){ @@ -270,26 +277,38 @@ class Crontask extends Controller }else{ $this->showMessage('更新审稿人审稿状态成功['.$key.']执行SQL条数:'.$iResult."\n",1); } - $aCase = $aUpdateId = []; - $sRdNum = ''; + $aUpdateId = []; + $aCase = ['rd_num' => '','review_score' => '']; foreach ($value as $key => $item) { if($item['reviewer_id'] <=0){ continue; } //审核数量有,变化更新数量 - $sRdNum .= "WHEN {$item['reviewer_id']} THEN "; - $sRdNum .= Db::raw("rd_num + {$item['num']}")." "; + $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']; } - //SQL拼接最后结尾 - $aCase['rd_num'] ='CASE user_id '.$sRdNum.'END'; + //更新数据库 + 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([ - 'rd_num' => Db::raw($aCase['rd_num']), - ]); + ->update($aUpdateCase); if ($result === false) { $this->showMessage('更新用户拒绝审稿数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2); }else{ @@ -333,8 +352,7 @@ class Crontask extends Controller continue; } //审核数量有,变化更新数量 - $sRdNum .= "WHEN {$item['reviewer_id']} THEN "; - $sRdNum .= "{$item['num']} "; + $sRdNum .= "WHEN {$item['reviewer_id']} THEN {$item['num']} "; $aUpdateId[] = $item['reviewer_id']; } //SQL拼接最后结尾 @@ -360,7 +378,7 @@ class Crontask extends Controller /** - * 批量处理审稿人活跃度[近两年] + * 批量处理审稿人活跃度/同意审稿数量[近两年] * * @return void */ @@ -368,64 +386,98 @@ class Crontask extends Controller $sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-2 year'))); //获取该文章审核人的信息 $aWhere = [ - 'ctime'=>['>',$sDate], - 'state'=>['in',[1,2,3]] + 'ctime' => ['>',$sDate], + 'state' => ['BETWEEN',[0,5]] ]; - $aReviewer = Db::name('article_reviewer')->field('reviewer_id,count(article_id) as review_num_two_year')->where($aWhere)->order('reviewer_id asc')->group('reviewer_id')->select(); + $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的审稿信息 - $aUserWhere = [ - // 'is_reviewer' => 1, - 'review_num_two_year' => ['>',0] - ]; - $aUser = Db::name('user')->field('user_id,review_num_two_year')->where($aUserWhere)->select(); + $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, 100); + $aChunk = array_chunk($aReviewer, $iChunkSize); Db::startTrans(); foreach ($aChunk as $key => $item) { //数据分片操作 //需要更新的用户ID $aUpdateId = []; //SQL拼接 - $aCase['review_num_two_year'] = 'CASE user_id '; + $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($aUser[$iUserId])){ - //更新数量 - $aCase['review_num_two_year'] .= "WHEN {$iUserId} THEN "; - $aCase['review_num_two_year'] .= "'{$value['review_num_two_year']}' "; + 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($aUser[$iUserId]['review_num_two_year'] == $value['review_num_two_year']){ + //数量无变化,跳过更新 + 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_num_two_year'] .= "WHEN {$iUserId} THEN "; - $aCase['review_num_two_year'] .= "'{$value['review_num_two_year']}' "; + + //更新活跃度-审稿数量 + $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]); - } - //SQL拼接最后结尾 - $aCase['review_num_two_year'] .= 'END'; - //执行更新 - if(empty($aUpdateId)){ + } + //更新数据库 + 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([ - 'review_num_two_year' => Db::raw($aCase['review_num_two_year']), - ]); + } + //更新数据 + $result = Db::name('user') + ->where(['user_id' => ['in',$aUpdateId]]) + ->update($aUpdateCase); if ($result === false) { $this->showMessage('更新近两年审稿人审核数量失败['.$key.']执行SQL:'.Db::getLastSql()."\n",2); }else{ @@ -435,7 +487,7 @@ class Crontask extends Controller Db::commit(); } if(!empty($aUser)){ - $aChunk = array_chunk($aUser, 100); + $aChunk = array_chunk($aUser, $iChunkSize); Db::startTrans(); foreach ($aChunk as $key => $item) { //数据分片操作 $aUserId = array_column($item, 'user_id'); @@ -445,7 +497,11 @@ class Crontask extends Controller $result = Db::name('user')->where(['user_id' => ['in',$aUserId]]) ->limit(count($aUserId)) ->update([ - 'review_num' => 0, + '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); @@ -458,13 +514,44 @@ class Crontask extends Controller } $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 - * @author huangpu * @date 2018.09.28 * @param $[message] [<显示信息>] * @param $[status] [<输出信息1成功,2失败>] @@ -477,4 +564,6 @@ class Crontask extends Controller } echo date("Y-m-d H:i:s") . " " . $message . "\n"; } + + }