SubmitController.class.php 5.67 KB
<?php
/**
 * 【考试中心-手机端】阅卷交卷
 * SubmitController.class.php
 * @author: 蔡建华
 * @date: 2017-06-19
 */

namespace Api\Controller\Marking;

use Common\Service\AnswerDetailService;
use Common\Service\AnswerService;
use Common\Service\PaperService;
use Common\Common\TaskCenter;

class SubmitController extends AbstractController
{
    public function Index_post()
    {
        // 接收post参数
        $ea_id = I('post.ea_id', 0, 'intval');
        $list = I('post.list');

        if (!$ea_id) {
            // 答卷ID不能为空
            E('_EMPTY_EA_ID');
        }

        // 答卷信息
        $answer_serv = new AnswerService();
        $answer = $answer_serv->get($ea_id);
        if (empty($answer)) {

            E("_EMPTY_MARKING_INFO");
        }

        // 判断阅卷状态是否是待批阅
        if ($answer['answer_status'] != AnswerService::READ_WAITING) {

            E("_ERR_MARKING_PAPER");
        }

        $answer_detail_serv = new AnswerDetailService();

        $ead_ids = array_column($list, 'ead_id');

        $answer_detail_list = $answer_detail_serv->list_by_pks($ead_ids);
        $answer_detail_list = array_combine_by_key($answer_detail_list, 'ead_id');

        // 实例化试卷service
        $paper_s = new PaperService();
        // 试卷详情
        $ep_id = $answer['ep_id'];
        $paper_info = $paper_s->get($ep_id);

        try {

            $answer_detail_serv->start_trans();

            foreach ($list as $val) {

                if (!intval($val['ead_id'])) {
                    // 判断ead_id是否存在
                    E('_EMPTY_MARKING_EAD_ID');
                }

                $my_score = $val['my_score'];

                // 获取试题信息
                $data = $answer_detail_list[$val['ead_id']];
                // 判断分数不合法
                $score = $data['score'];
                if ($my_score < 0 || $my_score > $score) {

                    E("_ERR_MARKING_SCORE_MIN");
                }

                // 更新答卷试题状态和分数
                $answer_detail_serv->update_by_conds(
                    ['ead_id' => $val['ead_id']],
                    [
                        'my_score' => $my_score,
                        'is_pass' => $my_score == $score ? AnswerDetailService::MY_PASS : AnswerDetailService::NO_MY_PASS, // 得满分算正确,否则错误
                        'marking_status' => 1
                    ]
                );
            }
            
            // 计算答题总分
            $my_answer_detail_list = $answer_detail_serv->list_by_conds(['ea_id' => $ea_id]);
            $my_score = array_sum(array_column($my_answer_detail_list, 'my_score'));

            // 答对的试题数据
            $pass_answers = array_filter($my_answer_detail_list, function ($v) {

                return $v['is_pass'] == AnswerService::MY_PASS;
            });

            // 做对题数
            $my_success_num = count($pass_answers);
            // 答错的题数(总答题数-作对的题数)
            $my_error_num = count($my_answer_detail_list) - $my_success_num;


            // 获取最高分的答卷
            $max_score_answer = $answer_serv->get_by_conds(
                [
                    'ep_id' => $answer['ep_id'],
                    'uid' => $answer['uid'],
                ],
                ['my_score' => 'DESC']
            );

            $max_score = $max_score_answer['my_score'];

            // 是否是最高分
            $is_score_top = $my_score > $max_score ? AnswerService::IS_SCORE_TOP_TRUE : AnswerService::IS_SCORE_TOP_FALSE;

            if ($is_score_top) {
                // 更新最高分状态
                $answer_serv->update(
                    $max_score_answer['ea_id'],
                    ['is_score_top' => AnswerService::IS_SCORE_TOP_FALSE]
                );
            }

            // 更新答卷表的 阅卷管理员 和 总分
            $answer_serv->update(
                $ea_id,
                [
                    'marking_uid' => $this->uid,
                    'marking_name' => $this->_login->user['memUsername'],
                    'my_score' => $my_score,
                    'marking_user_type' => 0, // 阅卷人是否是管理员(0:否,1:是)
                    'is_score_top' => $is_score_top,
                    'my_is_pass' => $my_score >= $paper_info['pass_score'] ? AnswerService::PASS : AnswerService::UNPASS, // 是否通过
                    'my_error_num' => $my_error_num, // 做错的题目数
                    'answer_status' => AnswerService::READ_OVER,
                    'marking_time' => MILLI_TIME,
                ]
            );

            $answer_detail_serv->commit();

        } catch (\Think\Exception $e) {
            $answer_detail_serv->rollback();
            E('_ERR_SUBMIT_CHECK_FAIL');
        } catch (\Exception $e) {
            $answer_detail_serv->rollback();
            E('_ERR_SUBMIT_CHECK_FAIL');
        }

        // 常规任务埋点:考试通过
        if (PaperService::TASK_TYPE == $paper_info['exam_type'] && AnswerService::PASS == $answer['my_is_pass']) {
            $params = [
                'uid' => $answer['uid'],
                'customtask_id' => $answer['obj_id'],
                'app_data_id' => $ep_id,
                'action_key' => 'exam_pass',
                'description' => '考试通过'
            ];

            $taskCenter = &TaskCenter::instance();
            $taskCenter->triggerCustomtask($params);
        }

        // 阅卷交卷成功,发送考试消息(阅卷结果出来发送消息)
        $answer_serv->send_cms_answer($ea_id, AnswerService::MARKING_RESULT_MSG);

        return true;
    }
}