/** * 获取试卷信息 * @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; }
/** * @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(" ", ' ', $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); }
/** * 学生对应考试答题卡 * * @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; }
/** * 一键更新试题缓存 * * @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); */ }
/** * 预览试卷 * * @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); }