['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]]
        ];
        $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);

    }


    /**
     * 批量处理审稿人活跃度[近两年]
     *
     * @return void
     */
    public function reviewerActivityForYear(){
        $sDate = strtotime(date('Y-m-d 00:00:00', strtotime('-2 year')));
        //获取该文章审核人的信息
        $aWhere = [
            'ctime'=>['>',$sDate],
            'state'=>['in',[1,2,3]]
        ];
        $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();

        //查询审稿人数量不为0的审稿信息
        $aUserWhere = [
            // 'is_reviewer' => 1,
            'review_num_two_year' => ['>',0]
        ];
        $aUser = Db::name('user')->field('user_id,review_num_two_year')->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_two_year'] = 'CASE user_id ';
               foreach ($item as $key => $value) {
                    //用户ID
                    $iUserId =  $value['reviewer_id'];

                    //拼接更新语句
                    if(empty($aUser[$iUserId])){
                        //更新数量
                        $aCase['review_num_two_year'] .= "WHEN {$iUserId} THEN ";
                        $aCase['review_num_two_year'] .= "'{$value['review_num_two_year']}' ";
                        $aUpdateId[] = $iUserId;
                        continue;
                    }
                    //审核数量无变化,跳过更新
                    if($aUser[$iUserId]['review_num_two_year'] == $value['review_num_two_year']){
                        unset($aUser[$iUserId]);
                        continue;
                    }
                    //审核数量有,变化更新数量
                    $aCase['review_num_two_year'] .= "WHEN {$iUserId} THEN ";
                    $aCase['review_num_two_year'] .= "'{$value['review_num_two_year']}' ";
                    $aUpdateId[] = $iUserId;
                    unset($aUser[$iUserId]);
               }
               //SQL拼接最后结尾
               $aCase['review_num_two_year'] .= 'END';
               //执行更新
               if(empty($aUpdateId)){
                    continue;
               }
               $result = Db::name('user')
                ->where(['user_id' => ['in',$aUpdateId]])
                ->update([
                    'review_num_two_year' => Db::raw($aCase['review_num_two_year']),
                ]);
                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(['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);
    }
    /**
     *
     * 格式化信息输出
     *
     * @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";
    }
}