定时任务时间修改

This commit is contained in:
chengxl
2025-12-04 15:20:18 +08:00
parent c8d7923f49
commit f6391adcb0

View File

@@ -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";
}
}