ExamCountController.class.php 7.62 KB
<?php
/**
 * 员工考试统计
 * User: yingcai
 * Date: 2017/10/12
 * Time: 上午11:08
 */

namespace Apicp\Controller\Exam;

use Com\PackageValidate;
use Common\Common\Constant;
use Common\Common\ExamHelper;
use Common\Common\User;
use Common\Model\ExamPaperModel;

class ExamCountController extends \Apicp\Controller\AbstractController
{
    /**
     * ExamCount
     * @author houyingcai
     * @desc 员工考试统计
     * @param Int page:1 当前页
     * @param Int limit:20 当前页条数
     * @param String dp_ids 组织ID
     * @param String role_ids 角色ID
     * @param String job_ids 岗位ID
     * @param String username 姓名
     * @param Int ec_id 考试分类ID
     * @param String ep_name 试卷名称
     * @param Int score_order:1 1:员工考试时间降序,2:成绩升序,3:成绩降序
     * @return array
    array(
     * 'page' => 1, // 当前页
     * 'limit' => 20, // 当前页条数
     * 'total' => 100, // 总条数
     * 'list' => array( // 列表数据
     * array(
     * 'ea_id' => 123 // 答卷ID(测评试卷时使用)
     * 'uid' => 'AB4A446C7F0000013BAC6CF3F2504659', // 用户UID
     * 'username' => '李四', // 姓名
     * 'dp_names' => array('开发组', '测试组'), // 组织
     * 'job' => '苹果系统工程师', // 岗位
     * 'role' => 'leader', // 角色
     * 'ep_id' => 1, // 试卷ID
     * 'ep_name' => '入职测试考试', // 考试名称
     * 'my_begin_time' => 1507776224150, // 开考时间
     * 'my_end_time' => 1507776524150, // 交卷试卷
     * 'my_time' => 12, // 用时(秒)
     * 'my_score' => '10.00', // 得分
     * 'my_is_pass' => 1, // 是否及格(0:不及格,1:及格)
     * 'paper_type' => 1, // 试卷类型(0:测评试卷,1:模拟试卷)
     * ),
     * ),
     * )
     */
    public function Index_post()
    {
        // 验证规则
        $rules = [
            'page' => 'integer|gt:0',
            'limit' => 'integer|gt:0',
            'dp_ids' => 'array',
            'role_ids' => 'array',
            'job_ids' => 'array',
            'username' => 'max:64',
            'ec_id' => 'integer|gt:0',
            'ep_name' => 'max:64',
            'score_order' => 'integer|in:1,2,3',
        ];

        // 验证请求数据
        $postData = I('post.');
        $validate = new PackageValidate();
        $validate->postData = $postData;
        $validate->validateParams($rules);

        // 分页
        $page = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE;
        $limit = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT;

        // 初始化查询条件
        $conds = [];

        // 组合人员搜索条件
        $user_conds = [];
        if (isset($postData['dp_ids'])) {
            $user_conds['dpIdList'] = $postData['dp_ids'];
            // 按部门条件查询时,表示部门是否递归查询人员 【0:不递归(默认值)、1:递归】
            $user_conds['departmentChildrenFlag'] = 1;
        }
        if (isset($postData['role_ids'])) {
            $user_conds['roleIdList'] = $postData['role_ids'];
        }
        if (isset($postData['job_ids'])) {
            $user_conds['jobIdList'] = $postData['job_ids'];
        }
        if (isset($postData['username'])) {
            $user_conds['memUsername'] = $postData['username'];
        }

        $userServ = &User::instance();
        if (!empty($user_conds)) {
            $user_conds['memAll'] = 1; // 可以查询删除人员

            // 获取符合条件的人员UID
            $userList = $userServ->listUsersAll($user_conds);
            $userList = array_combine_by_key($userList, 'memUid');

            if (!empty($user_conds)) {
                $conds['uid'] = empty($userList) ? '' : array_column($userList, 'memUid');
            }
        }

        // 组合试卷搜索条件
        $paper_conds = [
            'exam_type' => Constant::EXAM_TYPE,
        ];
        if (isset($postData['ec_id'])) {
            $paper_conds['ec_id'] = $postData['ec_id'];
        }
        if (isset($postData['ep_name'])) {
            $postData['ep_name'] = str_replace("%", '\%', $postData['ep_name']);
            $paper_conds['ep_name like ?'] = '%' . $postData['ep_name'] . '%';
        }

        // 获取符合条件的试卷ID
        $paperModel = new ExamPaperModel();
        $paperList = $paperModel->list_by_conds($paper_conds, null, [], 'ep_name,ep_id');
        $paperList = array_combine_by_key($paperList, 'ep_id');

        $conds['ep_id'] = empty($paperList) ? '' : array_column($paperList, 'ep_id');

        // 分页
        list($start, $limit) = page_limit($page, $limit);

        // 分页参数
        $page_option = [$start, $limit];

        // 排序
        if ($postData['score_order'] == 2) {
            $order_option = ['my_score' => 'ASC', 'my_time' => 'ASC'];
        } elseif ($postData['score_order'] == 3) {
            $order_option = ['my_score' => 'DESC', 'my_time' => 'ASC'];
        } else {
            $order_option = ['my_begin_time' => 'DESC'];
        }

        $conds['answer_status'] = 2; // 已批阅(考试中心迭代后数据已更新:1;待批阅,2:已批阅)

        $exam_helper = &ExamHelper::instance();

        // 获取员工考试统计列表
        $result_list = $exam_helper->list_user_exam_count($conds, $page_option, $order_option);

        if (empty($result_list)) {
            $this->_result = [
                'page' => $page,
                'limit' => $limit,
                'total' => 0,
                'list' => [],
            ];

            return true;
        }

        // 获取员工考试统计列表
        $exam_data = $exam_helper->count_user_exam_count($conds);

        $total = count($exam_data);
        unset($exam_data);

        if (empty($userList)) {
            $uids = array_unique(array_column($result_list, 'uid'));
            // 获取符合条件的人员UID
            $userList = $userServ->listByUid($uids);
            $userList = array_combine_by_key($userList, 'memUid');
        }

        $list = [];
        foreach ($result_list as $v) {
            $paper = $paperList[$v['ep_id']];
            if ($paper) {

                $user = $userList[$v['uid']];
                // 获取被删除的用户
                if (empty($user)) {
                    $user = $userServ->getByUid($v['uid']);
                }
                // 得分为小数时按小数处理,不为小数时显示整数
                $my_score_arr = explode('.', $v['my_score']);
                $my_score = intval($my_score_arr[1]) > 0 ? $v['my_score'] : (int)$v['my_score'];

                $list[] = [
                    'ea_id' => intval($v['ea_id']),
                    'uid' => $v['uid'],
                    'username' => $user['memUsername'],
                    'dp_names' => isset($user['dpName']) && !empty($user['dpName']) ? array_column($user['dpName'], 'dpName') : [],
                    'job' => $user['memJob'],
                    'role' => $user['memRole'],
                    'ep_id' => intval($v['ep_id']),
                    'ep_name' => $paper['ep_name'],
                    'my_begin_time' => (int)$v['my_begin_time'],
                    'my_end_time' => (int)$v['my_end_time'],
                    'my_time' => ceil($v['my_time'] / 1000),
                    'my_score' => $my_score,
                    'my_is_pass' => intval($v['my_is_pass']),
                    'paper_type' => intval($paper['paper_type']),
                ];
            }
        }

        $this->_result = [
            'page' => $page,
            'limit' => $limit,
            'total' => $total,
            'list' => $list,
        ];
    }
}