TestJoinListController.class.php 6.94 KB
<?php
/**
 * 【考试中心-后台】获取测评考试统计已参与详情列表接口
 * TestJoinListController.class.php
 * @author: houyingcai
 * @email:  594609175@qq.com
 * @date :  2017-05-23 16:31:25
 * @version $Id$
 */

namespace Apicp\Controller\Answer;

use Common\Common\User;
use Common\Service\PaperService;
use Common\Service\RightService;
use Common\Service\AnswerService;

class TestJoinListController extends AbstractController
{
    // 成绩升序
    const SORT_ASC = 2;

    /** @var PaperService */
    protected $paper_serv;
    /** @var RightService */
    protected $right_serv;
    /** @var AnswerService */
    protected $answer_serv;

    public function before_action($action = '')
    {
        if (parent::before_action($action) === false) {
            return false;
        }

        // 实例化试卷service
        $this->paper_serv = new PaperService();
        // 实例化权限service
        $this->right_serv = new RightService();
        // 实例化答卷service
        $this->answer_serv = new AnswerService();
        // 用户信息初始化
        $this->user = User::instance();

        return true;
    }

    public function Index_post()
    {
        // 接收post参数
        $params = I('post.');
        // 参数为空,返回提示"参数不能为空"
        if (empty($params)) {

            E('_ERR_PARAMS_NOT_NULL');
        }

        // 获取试卷ID
        $ep_id = rintval($params['ep_id']);
        if (empty($ep_id)) {

            E('_EMPTY_EP_ID');
        }

        // 试卷详情
        $paper = $this->paper_serv->get($ep_id);
        // 试卷不存在
        if (empty($paper)) {

            E('_ERR_PAPER_NOT_FOUND');
        }

        // 试卷类型不是测评试卷
        if ($paper['paper_type'] != PaperService::EVALUATION_PAPER_TYPE) {

            E('_ERR_PAPER_TYPE_TEST');
        }

        // 获取未参加人数
        $un_total = $this->answer_serv->get_un_total($ep_id, $paper, $params);

        // 默认值
        $page = !empty($params['page']) ? intval($params['page']) : PaperService::DEFAULT_PAGE;
        $limit = !empty($params['limit']) ? intval($params['limit']) : PaperService::DEFAULT_LIMIT_ADMIN;
        // 分页
        list($start, $limit) = page_limit($page, $limit);
        $page_option = [$start, $limit];

        // 【排序】
        $sort = $params['sort'];
        // 成绩升序
        if (self::SORT_ASC == $sort) {

            $order_by = [
                'my_score' => 'ASC',
                'my_time' => 'ASC',
                'created' => 'ASC'
            ];
        } else { // 成绩降序

            $order_by = array(
                'my_score' => 'DESC',
                'my_time' => 'ASC',
                'created' => 'ASC'
            );
        }

        // 组装查询条件
        $conds = $this->answer_serv->get_conditions($paper, $params);
        // 【考试完成时间】
        if (isset($params['end_time']) && !empty($params['end_time']) && is_array($params['end_time'])) {

            $end_time = $params['end_time'];
            $end_time1 = $end_time[0];
            $end_time2 = $end_time[1];
            if ($end_time1 && $end_time2) {

                $conds['my_end_time>=?'] = $end_time1;
                $conds['my_end_time<=?'] = $end_time2;
            }
        }

        // 根据最高分记录去查
        $conds['is_score_top'] = AnswerService::IS_SCORE_TOP_TRUE;

        // 统计参与的人数
        $total = $this->answer_serv->count_by_where($conds);
        $join = [];
        if ($total) {

            // 参与这场考试的人员的考试信息
            $join = $this->answer_serv->list_by_where($conds, $page_option, $order_by);
            if (!empty($join)) {

                // 参与考试的所有人的UID
                $uids = array_column($join, 'uid');
                // 参与考试的人员的详细信息列表
                $userlist = $this->answer_serv->getUser($uids);

                // 格式化返回字段信息
                foreach ($join as $key => &$val) {

                    // 获取用户所在的所有部门
                    $dpNames = '';

                    if ($userlist[$val['uid']]['dpName']) {
                        $res_dpNames = array_column($userlist[$val['uid']]['dpName'], 'dpName');

                        if (!empty($res_dpNames)) {
                            $dpNames = implode(';', $res_dpNames);
                        }
                    }

                    $val['ranking'] = intval($key + 1); // 排序
                    $val['username'] = $userlist[$val['uid']]['memUsername']; // 用户名
                    $val['dpName'] = $dpNames; // 部门
                    $val['memJob'] = $userlist[$val['uid']]['memJob'];
                    $val['memRole'] = $userlist[$val['uid']]['memRole'];
                    $val['memTag'] = $userlist[$val['uid']]['memTag'];
                    $val['begin_time'] = $val['my_begin_time']; // 开始时间

                    // 查询补考次数条件
                    $join_answer_conds = [
                        'uid' => $val['uid'],
                        'ep_id' => $ep_id,
                        'is_makeup' => 1, // 是补考
                    ];
                    // 补考次数
                    $val['makeup_num'] = $this->answer_serv->count_by_conds($join_answer_conds);;

                    $val['end_time'] = $val['my_begin_time'] + $val['my_time']; // 结束时间
                    $val['my_is_pass'] = intval($val['my_is_pass']); // 是否通过
                    $val['answer_status'] = intval($val['answer_status']); // 阅卷状态

                    unset(
                        $val['ep_id'],
                        $val['my_begin_time'],
                        $val['my_error_num'],
                        $val['paper_info'],
                        $val['domain'],
                        $val['status'],
                        $val['created'],
                        $val['updated'],
                        $val['deleted']
                    );
                }
            }
        }

        // 去除条件
        unset(
            $params['page'],
            $params['limit'],
            $params['ep_id'],
            $params['sort']
        );

        // 实时统计的未参与人数和已参与人数与缓存的人数不符
        if (count(array_filter($params)) == 0 && isset($paper['unjoin_count']) && ($un_total != $paper['unjoin_count'] || $total['join_count'] != $paper['join_count'])) {

            // 更新试卷表中缓存的未参与人数
            $this->paper_serv->update_by_conds(['ep_id' => $ep_id],
                [
                    'unjoin_count' => $un_total,
                    'join_count' => $total
                ]
            );
        }

        $this->_result = [
            'join_total' => (int)$total,
            'un_total' => (int)$un_total,
            'limit' => (int)$limit,
            'page' => (int)$page,
            'list' => $join
        ];
    }
}