public function index($exam_pid = 0) { if (!$exam_pid) { message('请指定考试期次!'); } $exam = ExamModel::get_exam_by_id($exam_pid); if (!$exam) { message('考试期次不存在!'); } $data = array(); $cond_param['exam_pid'] = $exam_pid; $cond_param['ct_name'] = trim($this->input->get('ct_name')); $cond_param['stu_name'] = trim($this->input->get('stu_name')); $cond_param['subject_id'] = intval($this->input->get('subject_id')); $page = intval($this->input->get('page')); $page = $page ? $page : 1; $perpage = C('default_perpage_num'); $total = TeacherStudentModel::teacherStudentListCount($cond_param); if ($total) { $data['list'] = TeacherStudentModel::teacherStudentList('*', $cond_param, $page, $perpage); } $purl = site_url('admin/teacher_student/index/' . $exam_pid) . ($cond_param ? '?' . implode('&', $cond_param) : ''); $data['pagination'] = multipage($total, $perpage, $page, $purl); $data['search'] = $cond_param; $data['exam'] = $exam; $data['subject'] = C('subject'); $this->load->view('teacher_student/index', $data); }
/** * 设定学生考卷(每科考试随机选一份试卷) * * @param int 考试场次id(place_id) * @param int 学生id * @return array */ public static function set_student_test_paper($place_id, $uid, $is_trans = true) { $subjects = ExamPlaceModel::get_exam_place_subject($place_id); if (empty($subjects)) { return FALSE; } $test_papers = array(); $no_paper_subjects = false; foreach ($subjects as $row) { $sql = <<<EOT SELECT paper_id, exam_pid FROM rd_exam_subject_paper WHERE exam_id = ? ORDER BY RAND() LIMIT 1 EOT; $arr = Fn::db()->fetchRow($sql, $row['exam_id']); if (!isset($arr['paper_id'])) { $no_paper_subjects = true; break; } $exam = ExamModel::get_exam_by_id($row['exam_id'], 'total_score, class_id, grade_id'); $total_score = $exam['total_score']; $class_id = $exam['class_id']; $grade_id = $exam['grade_id']; $test_papers[] = array('exam_pid' => $row['exam_pid'], 'exam_id' => $row['exam_id'], 'uid' => $uid, 'paper_id' => $arr['paper_id'], 'place_id' => $place_id, 'subject_id' => $row['subject_id'], 'full_score' => $total_score, 'test_score' => '0.00', 'etp_flag' => 0, 'ctime' => time()); } if ($no_paper_subjects) { return false; } $db = Fn::db(); if ($is_trans) { $db->beginTransaction(); } // save $insert_ids = array(); foreach ($test_papers as $val) { $sql = "SELECT etp_id FROM rd_exam_test_paper\n WHERE exam_pid = {$val['exam_pid']} AND exam_id = {$val['exam_id']}\n AND uid = {$val['uid']} AND paper_id = {$val['paper_id']}\n AND place_id = {$val['place_id']} AND subject_id = {$val['subject_id']} "; $res1 = $db->fetchRow($sql); if (isset($res1['etp_id']) && $res1['etp_id'] > 0) { $res = $db->update('rd_exam_test_paper', $val, 'etp_id = ' . $res1['etp_id']); $etp_id = $res1['etp_id']; } else { $res = $db->insert('rd_exam_test_paper', $val); //添加试卷试题 $etp_id = $db->lastInsertId('rd_exam_test_paper', 'etp_id'); } if ($etp_id) { $etp_id_where = "etp_id = {$etp_id}"; $db->delete('rd_exam_test_paper_question', $etp_id_where); $sql = "SELECT q.ques_id,q.type\n FROM rd_exam_question eq\n LEFT JOIN rd_question q ON eq.ques_id=q.ques_id\n LEFT JOIN rd_relate_class rc ON rc.ques_id=q.ques_id AND rc.grade_id={$grade_id}\n AND rc.class_id={$class_id} WHERE eq.paper_id={$val['paper_id']}\n ORDER BY rc.difficulty DESC,q.ques_id ASC"; $result = $db->fetchAll($sql); if ($val['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'); } $paper_array = array(); foreach ($types as $type) { foreach ($result as $key => $row) { if ($row['type'] != $type) { continue; } $paper_array[] = $row['ques_id']; unset($result[$key]); } } $ques_ids = implode(',', $paper_array); $res = $db->insert('rd_exam_test_paper_question', array('etp_id' => $etp_id, 'ques_id' => $ques_ids)); } if (!$res) { break; } } if ($is_trans && $res) { $res = $db->commit(); if (!$res) { $db->rollBack(); } } else { if ($is_trans && !$res) { $db->rollBack(); return false; } } return $res; }
/** * 目标匹配度 XX% * note: * xx%=班级的学科总得分/期望得分(班级考的试卷每题期望得分累加) * * @param Number $rule_id 评估规则id * @param number $exam_id 考试学科 * @param number $schcls_id 班级id */ public function module_match_percent($rule_id = 0, $exam_id = 0, $schcls_id = 0) { $rule_id = intval($rule_id); $exam_id = intval($exam_id); $schcls_id = intval($schcls_id); if (!$rule_id || !$exam_id || !$schcls_id) { return array(); } $match_percent = array(); $class = $this->class_common_model->get_class_info($schcls_id); $total_score = ExamModel::get_exam_by_id($exam_id, 'total_score'); $paper_id = $this->class_common_model->get_class_exam_paper($schcls_id, $exam_id); if (!$paper_id) { return array(); } if (!isset(self::$_data['paper_question_score'][$exam_id][$paper_id])) { $paper = PaperModel::get_paper_by_id($paper_id); $score = json_decode($paper['question_score'], true); self::$_data['paper_question_score'][$exam_id][$paper_id] = $score; } else { $score = self::$_data['paper_question_score'][$exam_id][$paper_id]; } // 获取该班级所考到的试卷题目 $sql = "SELECT etpq.ques_id\n \t FROM rd_exam_test_paper_question etpq\n \t LEFT JOIN rd_exam_test_paper etp ON etpq.etp_id=etp.etp_id\n \t WHERE etp.exam_id={$exam_id} AND etp.paper_id={$paper_id} AND etp.etp_flag=2\n \t "; $ques_id = trim(self::$_db->fetchOne($sql)); if (!$ques_id) { return array(); } $ques_ids = @explode(',', $ques_id); if (!is_array($ques_ids) || !$ques_ids) { return array(); } // 获取这些题目的难易度 $sql = "SELECT rc.ques_id,rc.difficulty\n \t FROM rd_relate_class rc\n \t LEFT JOIN rd_exam e ON rc.grade_id=e.grade_id AND rc.class_id=e.class_id\n \t AND rc.subject_type=e.subject_type\n \t WHERE e.exam_id={$exam_id} AND rc.ques_id IN({$ques_id})\n \t "; $ques_difficulties = self::$_db->fetchPairs($sql); //本次考试班级试题得分情况 $sql = "SELECT ques_id, ROUND(total_score / student_amount) AS full_score, avg_score\n \t FROM rd_summary_region_question\n \t WHERE exam_id = {$exam_id} AND region_id = {$schcls_id}\n \t AND is_school = 0 AND is_class = 1 AND ques_id IN ({$ques_id})"; $class_score = self::$_db->fetchAssoc($sql); //本次考试年级试题得分情况 $sql = "SELECT ques_id, ROUND(total_score / student_amount) AS full_score, avg_score\n \t FROM rd_summary_region_question\n \t WHERE exam_id = {$exam_id} AND region_id = {$class['school_id']}\n \t AND is_school = 1 AND is_class = 0 AND ques_id IN ({$ques_id})"; $grade_score = self::$_db->fetchAssoc($sql); $data = array(array('难易度', '低', '中', '高', '合计'), array('本班平均分', -1, -1, -1, 0), array('年级平均分', -1, -1, -1, 0), array('期望得分', -1, -1, -1, 0), array('总分', -1, -1, -1, 0)); $level = array('低' => 1, '中' => 2, '高' => 3); foreach ($ques_ids as $ques_id) { if (!isset($ques_difficulties[$ques_id])) { continue; } $q_diffculty = $ques_difficulties[$ques_id]; $cls_full_score = 0; $cls_test_score = 0; $grd_test_score = 0; if (isset($class_score[$ques_id])) { $cls_full_score = isset($score[$ques_id]) ? array_sum($score[$ques_id]) : $class_score[$ques_id]['full_score']; $cls_test_score = $class_score[$ques_id]['avg_score']; } if (isset($grade_score[$ques_id])) { $grd_test_score = $grade_score[$ques_id]['avg_score']; } $d_level = $this->class_common_model->convert_question_difficulty($q_diffculty); $expect_score = $cls_full_score * $q_diffculty / 100; $k = $level[$d_level]; if ($data[1][$k] == -1) { $data[1][$k] = 0; } $data[1][$k] += $cls_test_score; $data[1][4] += $cls_test_score; if ($data[2][$k] == -1) { $data[2][$k] = 0; } $data[2][$k] += $grd_test_score; $data[2][4] += $grd_test_score; if ($data[3][$k] == -1) { $data[3][$k] = 0; } $data[3][$k] += $expect_score; $data[3][4] += $expect_score; if ($data[4][$k] == -1) { $data[4][$k] = 0; } $data[4][$k] += $cls_full_score; } $data[4][4] = $total_score; return array('data' => $data, 'percent' => round(end($data[1]) / end($data[3]) * 100)); }