UnjoinListController.class.php 7.86 KB
<?php
/**
 * 【考试中心-后台】获取考试统计详情未参与列表
 * UnjoinListController.class.php
 * @author: houyingcai
 * @email:  594609175@qq.com
 * @date :  2017-05-24 15:19:33
 * @version $Id$
 */

namespace Apicp\Controller\Answer;

use Common\Common\Department;
use VcySDK\Member;
use VcySDK\Service;
use Common\Common\User;
use Common\Service\PaperService;
use Common\Service\RightService;
use Common\Service\AnswerService;

class UnjoinListController extends AbstractController
{
    /** @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)) {
            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');
        }

        // 获取已参与人数
        $join_total = $this->get_join_total($paper, $params);

        $conds = [
            'epc_id' => $ep_id,
            'er_type' => AnswerService::RIGHT_PAPER
        ];

        // 获取未参与考试人员列表
        $unjoin_data = $this->answer_serv->get_unjoin_data($conds, $ep_id, $paper['is_all']);

        // 未参加人的列表
        $unjoin_list = $unjoin_data['unjoin_list'];

        // 【部门】
        if (isset($params['dpIds']) && !empty($params['dpIds']) && is_array($params['dpIds'])) {

            $params_dpids = $params['dpIds'];
            $dpServ = &Department::instance();
            // 取子级部门ID
            $dp_ids = $dpServ->list_childrens_by_cdid($params_dpids, true);
            sort($dp_ids);

            $conditions['dpIdList'] = $dp_ids;
        }

        // 【岗位】
        if (isset($params['memJob']) && $params['memJob']) {

            $conditions['jobIdList'] = [$params['memJob']];
        }

        // 【角色】
        if (isset($params['memRole']) && $params['memRole']) {

            $conditions['roleIdList'] = [$params['memRole']];
        }

        // 【标签】
        if (isset($params['memTag']) && $params['memTag']) {

            $conditions['tagIdList'] = [$params['memTag']];
        }

        // 【员工名称】
        if (isset($params['memUsername']) && $params['memUsername']) {

            $conditions['memUsername'] = $params['memUsername'];

        }

        // 如果存在查询条件
        if (!empty($conditions)) {
            $user_select_list = User::instance()->listAllBasic($conditions);

            if (!empty($user_select_list)) {
                $unjoin_list = array_intersect($unjoin_list, array_column($user_select_list, 'memUid'));
            } else {
                $unjoin_list = [];
            }
        }

        // 分页参数
        $page = !empty($params['page']) ? intval($params['page']) : PaperService::DEFAULT_PAGE;
        $limit = !empty($params['limit']) ? intval($params['limit']) : PaperService::DEFAULT_LIMIT_ADMIN;
        $total = 0;
        if (!empty($unjoin_list)) {

            sort($unjoin_list);
            // 实例化
            $member = new Member(Service::instance());
            $member_conds = [
                'memUids' => $unjoin_list,
            ];
            // 获取未读人员列表
            $list = $member->listAll($member_conds, $page, $limit);
            // 获取未读列表
            $user_list = array_combine_by_key($list['list'], 'memUid');
            // 处理数据
            $unjoin_list = $this->nojoin_data($user_list, $paper);
            // 总人数
            $total = $list['total'];

        }

        // 实时统计的未参与人数不符
        if (count(array_filter($params)) == 0 && $total != $paper['unjoin_count']) {

            // 更新条件
            $conds = [
                'ep_id' => $ep_id
            ];

            // 待更新数据
            $data = [
                'unjoin_count' => $total
            ];

            // 更新试卷表中缓存的未参与人数
            $this->paper_serv->update_by_paper($conds, $data);
        }

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

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

    /**
     *
     * 获取已参与人数
     *
     * @param $paper
     * @param $params
     *
     * @return array|bool
     */
    protected function get_join_total($paper, $params)
    {
        // 组装查询条件
        $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;
            }
        }

        // 统计参与的人数
        return $this->answer_serv->count_mock_answer($conds);
    }

    /**
     * 处理未参加人员数据
     *
     * @param array $members 所有未参加的人员
     * @param array $paper 考卷详情
     *
     * @return array 未参加人员
     */
    private function nojoin_data($members, $paper)
    {
        $status = $paper['exam_status'];
        switch ($paper['exam_status']) {
            // 已发布
            case PaperService::PAPER_PUBLISH:

                // 【已开始】
                if (
                    $paper['begin_time'] < MILLI_TIME &&
                    ($paper['end_time'] >= MILLI_TIME || $paper['end_time'] == 0)
                ) {

                    $status = AnswerService::STATUS_ING;
                }

                // 【已结束】
                if ($paper['end_time'] > 0 && $paper['end_time'] < MILLI_TIME) {

                    $status = AnswerService::STATUS_END;
                }

                break;

            // 已终止
            case PaperService::PAPER_STOP:

                $status = AnswerService::STATUS_STOP;
                break;

            default:
        }

        // 初始化
        $data = [];
        // 遍历用户信息
        foreach ($members as $key => $value) {
            $data[] = [
                'uid' => $key,
                'username' => $value['memUsername'],
                'dpName' => empty($value['dpName']) ? '' : implode(';', array_column($value['dpName'], 'dpName')),
                'memJob' => strval($value['memJob']),
                'memRole' => strval($value['memRole']),
                'memTag' => strval($value['memTag']),
                'memJoinTime' => $value['memCreated'] ? $value['memCreated'] : '',
                'created' => $paper['begin_time'] ? $paper['begin_time'] : '',
                'exam_status' => $status
            ];
        }

        return $data;
    }
}