Пример #1
0
 /**
  * 获取试卷信息
  * @param    int    $paper_id
  * @return   array
  */
 private function _paper($paper_id)
 {
     if (!$paper_id) {
         return array();
     }
     $paper = ExamPaperModel::get_paper($paper_id);
     if (empty($paper)) {
         return array();
     }
     $exam = ExamModel::get_exam($paper['exam_id'], 'grade_id, class_id, subject_id, qtype_score, total_score');
     if (empty($exam)) {
         return array();
     }
     // 分数计算
     $score = array();
     // 题目数量
     $question_num = explode(',', $paper['qtype_ques_num']);
     // 题型分数
     $qtype_score = explode(',', $exam['qtype_score']);
     // 总分 排除题组
     $total_score = 0;
     foreach ($qtype_score as $key => $value) {
         $score[$key + 1]['score'] = $value;
         $score[$key + 1]['num'] = isset($question_num[$key + 1]) ? $question_num[$key + 1] : 0;
         $score[$key + 1]['total_score'] = $score[$key + 1]['score'] * $score[$key + 1]['num'];
         $total_score += $score[$key + 1]['score'] * $score[$key + 1]['num'];
     }
     // 题组总分
     $total_0 = $exam['total_score'] - $total_score;
     $data = array();
     $data['exam'] = $exam;
     $data['score'] = $score;
     $data['total_0'] = $total_0;
     if ($exam['subject_id'] == 3) {
         $group = array(1 => array(), 4 => array(), 0 => array(), 5 => array(), 6 => array(), 7 => array(), 2 => array(), 3 => array(), 8 => array(), 9 => array());
     } else {
         $group = array(1 => array(), 2 => array(), 3 => array(), 0 => array());
     }
     /** 题组分值系数总和 */
     $sql = "SELECT sum(score_factor) as sum FROM {pre}question q\n                LEFT JOIN {pre}exam_question eq ON eq.ques_id=q.ques_id\n                LEFT JOIN {pre}relate_class rc ON rc.ques_id=q.ques_id\n                          AND rc.grade_id = {$exam['grade_id']} AND rc.class_id = {$exam['class_id']}\n                WHERE eq.paper_id = {$paper_id} and q.type=0";
     $query = $this->db->query($sql);
     $sum_score_factor = $query->row_array();
     $sql = "SELECT q.ques_id,q.type,q.title,q.picture,q.answer,q.score_factor,q.children_num,rc.difficulty\n                FROM {pre}exam_question eq\n                LEFT JOIN {pre}question q ON eq.ques_id=q.ques_id\n                LEFT JOIN {pre}relate_class rc ON rc.ques_id = q.ques_id AND rc.grade_id = {$exam['grade_id']}\n                          AND rc.class_id = {$exam['class_id']}\n                WHERE eq.paper_id = {$paper_id} ORDER BY rc.difficulty DESC,q.ques_id ASC";
     $query = $this->db->query($sql);
     foreach ($query->result_array() as $row) {
         $row['title'] = $this->_format_question_content($row['title'], in_array($row['type'], array(3, 9)));
         switch ($row['type']) {
             case 0:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 foreach ($row['children'] as &$child) {
                     $child['title'] = $this->_format_question_content($child['title'], in_array($child['type'], array(3, 9)));
                 }
                 // 分值系数
                 if ($sum_score_factor > 0) {
                     $row['total_score'] = round($total_0 * $row['score_factor'] / $sum_score_factor['sum'], 2);
                     $row['score'] = round($row['total_score'] / $row['children_num'], 2);
                 } else {
                     $row['total_score'] = 0;
                     $row['score'] = 0;
                 }
                 break;
             case 1:
             case 2:
             case 7:
                 $row['options'] = QuestionModel::get_options($row['ques_id']);
                 break;
             case 3:
             case 9:
                 $row['answer'] = explode("\n", $row['answer']);
                 break;
             case 4:
             case 5:
             case 6:
             case 8:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 break;
             default:
         }
         $group[$row['type']][] = $row;
     }
     $paper_info = array();
     $types = array_keys($group);
     foreach ($types as $type) {
         $paper_info[$type] = isset($group[$type]) ? $group[$type] : array();
     }
     $data['group'] = array_filter($paper_info);
     return $data;
 }
Пример #2
0
 /**
  * @description 试卷预览分数修改
  * @author
  * @final
  * @param int $id 试卷id
  */
 public function preview($id = 0)
 {
     if (!$this->check_power('exam_list,exam_manage')) {
         return;
     }
     $id = intval($id);
     $paper = ExamPaperModel::get_paper($id);
     if (empty($paper)) {
         message('试卷不存在', 'javascript');
         return;
     }
     $exam = ExamModel::get_exam($paper['exam_id'], 'grade_id,class_id,subject_id,qtype_score,total_score');
     if (empty($exam)) {
         message('考试期次不存在');
         return;
     }
     // 分数计算
     $score = array();
     // 题目数量
     $question_num = explode(',', $paper['qtype_ques_num']);
     // 题型分数
     $qtype_score = explode(',', $exam['qtype_score']);
     // 总分 排除题组
     $total_score = 0;
     foreach ($qtype_score as $key => $value) {
         $score[$key + 1]['score'] = round($value, 2);
         $score[$key + 1]['num'] = isset($question_num[$key + 1]) ? $question_num[$key + 1] : 0;
         $score[$key + 1]['total_score'] = $score[$key + 1]['score'] * $score[$key + 1]['num'];
         $total_score += $score[$key + 1]['score'] * $score[$key + 1]['num'];
     }
     // 题组总分
     $total_0 = $exam['total_score'] - $total_score;
     $data['score'] = $score;
     $data['total_0'] = $total_0;
     if ($exam['subject_id'] == 3) {
         $group = array(1 => array(), 0 => array(), 4 => array(), 5 => array(), 8 => array(), 3 => array(), 7 => array(), 6 => array(), 2 => array(), 9 => array(), 14 => array());
     } else {
         $group = array(1 => array(), 2 => array(), 3 => array(), 0 => array(), 14 => array());
     }
     $paper = ExamPaperModel::get_paper_by_id($id);
     $questions_arr = json_decode($paper['question_sort'], true);
     /** 题组分值系数总和 */
     $sql = "SELECT sum(score_factor) as sum FROM {pre}question q\n        LEFT JOIN {pre}exam_question eq ON eq.ques_id=q.ques_id\n        LEFT JOIN {pre}relate_class rc ON rc.ques_id=q.ques_id AND rc.grade_id='{$exam['grade_id']}' AND rc.class_id='{$exam['class_id']}'\n        WHERE eq.paper_id={$id} and q.type=0";
     $query = $this->db->query($sql);
     $sum_score_factor = $query->row_array();
     $sql = "SELECT q.ques_id,q.type,q.title,q.picture,q.answer,q.score_factor,q.children_num,rc.difficulty\n        FROM {pre}exam_question eq\n        LEFT JOIN {pre}question q ON eq.ques_id=q.ques_id\n        LEFT JOIN {pre}relate_class rc ON rc.ques_id=q.ques_id AND rc.grade_id='{$exam['grade_id']}' AND rc.class_id='{$exam['class_id']}'\n        WHERE eq.paper_id={$id} ORDER BY rc.difficulty DESC,q.ques_id ASC";
     $query = $this->db->query($sql);
     $questions_tmp = $query->result_array();
     /* 重新排序 */
     $sort = array();
     if (!is_array($questions_arr)) {
         $sort = $questions_tmp;
     } else {
         foreach ($questions_arr as $v) {
             foreach ($questions_tmp as $value) {
                 if ($v == $value['ques_id']) {
                     $sort[$v] = $value;
                 }
             }
         }
     }
     foreach ($sort as $row) {
         $row['title'] = str_replace("\r\n", '<br/>', $row['title']);
         //$row['title'] = str_replace(" ", '&nbsp;', $row['title']);
         switch ($row['type']) {
             case 0:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 // 分值系数
                 if ($sum_score_factor > 0) {
                     $row['total_score'] = round($total_0 * $row['score_factor'] / $sum_score_factor['sum'], 2);
                     $row['score'] = round($row['total_score'] / $row['children_num'], 2);
                     $row['children_score'] = round($row['total_score'] / $row['children_num'], 2);
                 } else {
                     $row['total_score'] = 0;
                     $row['score'] = 0;
                 }
                 break;
             case 2:
                 //$row['answer'] = explode(',', $row['answer']);
             //$row['answer'] = explode(',', $row['answer']);
             case 1:
                 $row['options'] = QuestionModel::get_options($row['ques_id']);
                 break;
             case 3:
                 $row['answer'] = explode("\n", $row['answer']);
                 break;
             case 4:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 $row['children_score'] = round($score[$row['type']]['score'] / $row['children_num'], 2);
                 break;
             case 5:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 $row['children_score'] = round($score[$row['type']]['score'] / $row['children_num'], 2);
                 break;
             case 6:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 $row['children_score'] = round($score[$row['type']]['score'] / $row['children_num'], 2);
                 break;
             case 7:
                 $row['options'] = QuestionModel::get_options($row['ques_id']);
                 break;
             case 8:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 $row['children_score'] = round($score[$row['type']]['score'] / $row['children_num'], 2);
                 break;
             case 9:
                 $row['answer'] = explode("\n", $row['answer']);
                 break;
             default:
                 break;
         }
         $group[$row['type']][] = $row;
     }
     $tmp_arr = array();
     if ($exam['subject_id'] == 3) {
         $types = array('12', '1', '0', '5', '4', '8', '3', '15', '11', '7', '6', '2', '9', '10', '13', '14');
     } else {
         $types = array('1', '2', '3', '0', '10', '14', '15', '11');
     }
     foreach ($types as $type) {
         $tmp_arr[$type] = isset($group[$type]) ? $group[$type] : array();
     }
     $data['paper'] = $paper;
     $data['qtypes'] = C('qtype');
     $data['qtypes'] = C('qtype');
     $data['group'] = $tmp_arr;
     // 模版
     $this->load->view('paper/preview', $data);
 }
Пример #3
0
 /**
  * 学生对应考试答题卡
  *
  * @param int $uid            
  * @param int $exam_id            
  * @param int $exam_pid            
  * @return multitype:Ambigous <>
  */
 private function _sheet($uid, $exam_pid, $exam_id)
 {
     if ($this->exam_info[$exam_id]['subject_id'] == 3) {
         $group = array(1 => array(), 4 => array(), 0 => array(), 5 => array(), 6 => array(), 7 => array(), 2 => array(), 3 => array(), 8 => array(), 9 => array());
         $types = array('1', '4', '0', '5', '6', '7', '2', '3', '8', '9');
     } else {
         $group = array(3 => array(), 1 => array(), 2 => array(), 0 => array());
         $types = array('1', '2', '3', '0');
     }
     $grade_id = (int) $this->exam_list[$exam_id]['grade_id'];
     $class_id = (int) $this->exam_list[$exam_id]['class_id'];
     $paper_id = (int) $this->exam_info[$exam_id]['paper_id'];
     $sql = "SELECT q.ques_id,q.type,q.answer FROM {pre}exam_question eq\n                LEFT JOIN {pre}question q ON eq.ques_id=q.ques_id\n                LEFT JOIN {pre}relate_class rc ON rc.ques_id=q.ques_id\n                AND rc.grade_id={$grade_id}\n                AND rc.class_id={$class_id}\n                WHERE eq.paper_id={$paper_id}\n                ORDER BY rc.difficulty DESC,q.ques_id ASC";
     $question = $this->db->query($sql)->result_array();
     if (!$question) {
         $this->_notice('此学科未分配试卷');
     }
     foreach ($question as $row) {
         switch ($row['type']) {
             case 0:
             case 4:
             case 5:
             case 6:
             case 8:
                 $row['children'] = QuestionModel::get_children((int) $row['ques_id']);
                 break;
             case 1:
             case 2:
             case 7:
                 $row['options'] = QuestionModel::get_options($row['ques_id']);
                 break;
             case 3:
             case 9:
                 $row['answer'] = explode("\n", $row['answer']);
                 break;
             default:
                 break;
         }
         $group[$row['type']][] = $row;
     }
     $tmp_arr = array();
     foreach ($types as $type) {
         if (!empty($group[$type])) {
             $tmp_arr[$type] = $group[$type];
         }
     }
     return $tmp_arr;
 }
Пример #4
0
    /**
     * 一键更新试题缓存
     *
     * @author TCG
     * @param int $exam_id 考试期次科目id
     * @return mixed 返回成功及失败提示
     */
    public function update_questions_cache($exam_id)
    {
        $exam_id = (int) $exam_id;
        $exam = Fn::db()->fetchRow("SELECT exam_id, exam_pid, subject_id, grade_id, class_id, total_score, qtype_score FROM rd_exam WHERE exam_id=?", $exam_id);
        if (empty($exam)) {
            return false;
        }
        $is_mini_test = ExamModel::is_mini_test($exam['exam_pid']);
        /** 载入缓存功能 */
        if ($is_mini_test) {
            $this->load->driver('cache');
            /** 缓存时间 单位second 默认缓存30天 */
            $cache_time = 24 * 3600 * 20;
        } else {
            $cache = Fn::factory('File');
        }
        /** 写入缓存 */
        $is_mini_test && $this->cache->file->save('get_paper_question_detail_p_exam_' . $exam_id, $exam, $cache_time);
        $sql = "SELECT paper_id FROM rd_exam_paper WHERE exam_id={$exam_id}";
        $rows = Fn::db()->fetchAll($sql);
        foreach ($rows as $row) {
            /** 写入缓存 */
            $is_mini_test && $this->cache->file->save('get_paper_question_detail_p_exam_id_' . $row['paper_id'], $exam_id, $cache_time);
            $question_sort = Fn::db()->fetchOne('SELECT question_sort FROM rd_exam_paper
                WHERE paper_id = ?', array($row[paper_id]));
            $question_sort = json_decode($question_sort, true);
            $sql = <<<EOT
    SELECT q.ques_id,q.type,q.title,q.score_factor,rc.difficulty
    FROM rd_exam_question eq
    LEFT JOIN rd_question q ON eq.ques_id=q.ques_id
    LEFT JOIN rd_relate_class rc ON rc.ques_id = q.ques_id AND rc.grade_id = ? AND rc.class_id = ?
    WHERE eq.paper_id = ? ORDER BY rc.difficulty DESC,q.ques_id ASC
EOT;
            if ($question_sort) {
                $res = Fn::db()->fetchAssoc($sql, array($exam['grade_id'], $exam['class_id'], $row['paper_id']));
                $sort = explode(',', $question_sort);
                $result = array();
                foreach ($question_sort as $ques_id) {
                    $result[] = $res[$ques_id];
                    unset($res[$ques_id]);
                }
            } else {
                $result = Fn::db()->fetchAll($sql, array($exam[grade_id], $exam[class_id], $row[paper_id]));
            }
            $key = 'get_paper_question_detail_p_' . $exam[grade_id] . '_' . $exam[class_id] . '_' . $row[paper_id];
            !$is_mini_test && $cache->save('/zmexam/' . $key, $result);
            /** 写入缓存 */
            $is_mini_test && $this->cache->file->save($key, $result, $cache_time);
        }
        //$domain=C('memcache_pre');
        /** 获取考试期次所有试题 */
        $sql = "SELECT ques_id FROM {pre}exam_question WHERE exam_id={$exam_id}";
        $query = $this->db->query($sql);
        $rows = $query->result_array();
        /** 生成缓存 (执行时间可能过长) */
        if (count($rows) > 0 && !empty($rows)) {
            $questions = array();
            /** 获取试题数据 */
            foreach ($rows as $key => $value) {
                $question = QuestionModel::get_question($value['ques_id'], 'ques_id, type, title, picture, parent_id,subject_id');
                if (!$question) {
                    continue;
                }
                /** 题组 */
                if (in_array($question['type'], array(0, 4, 5, 6, 8))) {
                    $pid = $question['ques_id'];
                    $sql = "SELECT ques_id,type,title,picture,parent_id,subject_id FROM {pre}question WHERE parent_id={$pid}";
                    $query = $this->db->query($sql);
                    $group_rows = $query->result_array();
                    /** 写入题组子题 */
                    $question['children'] = $group_rows;
                    /** 子题加入缓存列表 */
                    $questions = array_merge($questions, $group_rows);
                }
                $questions[] = $question;
            }
            foreach ($questions as $key => &$question) {
                /** 样式修正 */
                $question['title'] && $this->_format_question_content($question['ques_id'], $question['title'], in_array($question['type'], array(3, 9)));
                /** 获取试题选项数据(选择题) */
                if (in_array($question['type'], array(1, 2, 7, 14))) {
                    $question['options'] = QuestionModel::get_options($question['ques_id']);
                }
                /** 获取题组子题选项 */
                if (in_array($question['type'], array(0, 4, 5, 6, 8)) && !empty($question['children'])) {
                    foreach ($question['children'] as $k => &$v) {
                        $v['title'] && $this->_format_question_content($v['ques_id'], $v['title'], $v['type'] == 3);
                        $question['children'][$k]['options'] = QuestionModel::get_options($v['ques_id']);
                    }
                }
                !$is_mini_test && $cache->save('/zmexam/question_' . $question['ques_id'], $question);
                /** 写入缓存 */
                $is_mini_test && $this->cache->file->save($question['ques_id'], $question, $cache_time);
            }
            /** 成功提示页面 */
            message('生成成功.', 'admin/exam/index');
        } else {
            /** 失败提示页面 */
            message('生成失败!!!请尝试从新输入!', 'admin/exam/index');
        }
        /** $this->output->enable_profiler(TRUE); */
    }
Пример #5
0
 /**
  * 预览试卷
  *
  * @return void
  **/
 public function preview_paper($paper_id)
 {
     $paper = PaperModel::get_paper_by_id($paper_id);
     if (empty($paper)) {
         message('未查询到当前试卷,请重试!');
     }
     /*
     $admin_info = $this->session->all_userdata();
     if ($paper['admin_id']!=$admin_info['admin_id']&&!$admin_info['is_super'])
     {
         message('你没有该试卷的权限!');
     }
     */
     $questions_arr = json_decode($paper['question_sort'], true);
     $questions_score = json_decode($paper['question_score'], true);
     if (empty($questions_arr)) {
         echo "当前试卷暂无试题!";
         exit;
     }
     /* 查询试题信息 */
     $sql = "SELECT ques_id,type,title,picture,answer FROM {pre}question \n                WHERE ques_id in (" . implode(',', $questions_arr) . ")";
     $questions_tmp = $this->db->query($sql)->result_array();
     $sort = array();
     /* 重新排序 */
     foreach ($questions_arr as $v) {
         foreach ($questions_tmp as $value) {
             if ($v == $value['ques_id']) {
                 $sort[] = $value;
             }
         }
     }
     $questions = array();
     $tmp_index = 0;
     foreach ($sort as $key => $row) {
         if (in_array($row['type'], array(3, 9))) {
             $row['title'] = $this->_format_question_content($row['title'], 1);
         }
         $row['score'] = array_sum($questions_score[$row['ques_id']]);
         switch ($row['type']) {
             case 0:
             case 12:
             case 13:
             case 15:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 foreach ($row['children'] as &$child) {
                     $child['title'] = $this->_format_question_content($child['title'], in_array($child['type'], array(3, 9)));
                 }
                 break;
             case 1:
             case 2:
             case 7:
             case 14:
                 $row['options'] = QuestionModel::get_options($row['ques_id']);
                 break;
             case 3:
             case 9:
                 $row['answer'] = explode("\n", $row['answer']);
                 break;
             case 4:
             case 5:
             case 6:
             case 8:
             case 10:
                 $row['children'] = QuestionModel::get_children($row['ques_id']);
                 break;
             default:
         }
         if ($key <= 0) {
             $questions[$tmp_index]['type'] = $row['type'];
             $questions[$tmp_index]['questions'][] = $row;
             $questions[$tmp_index]['scores'] += $row['score'];
         } else {
             if ($row['type'] == $sort[$key - 1]['type']) {
                 $questions[$tmp_index]['questions'][] = $row;
                 $questions[$tmp_index]['scores'] += $row['score'];
             } else {
                 $tmp_index++;
                 $questions[$tmp_index]['type'] = $row['type'];
                 $questions[$tmp_index]['questions'][] = $row;
                 $questions[$tmp_index]['scores'] += $row['score'];
             }
         }
     }
     $data = array();
     $subject = C('subject');
     $data['subject'] = $subject;
     $data['qtypes'] = C('qtype');
     $data['questions'] = $questions;
     $data['question_score'] = $questions_score;
     $data['paper'] = $paper;
     $data['group_index'] = array('一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四');
     $this->load->view('paper_diy/preview', $data);
 }