Files
tougao/application/api/controller/Crontask.php

380 lines
16 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 think\Controller;
use think\Db;
class Crontask extends Controller
{
/**
* 批量处理审稿人审稿质量
* @return void
*/
public function reviewerQuality()
{
//查询文章状态
$aParam = [
'state'=>['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 '<pre>';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]]
];
$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);
}
/**
* @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 ";
$sRdNum .= "{$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";
}
}