/** * 设定学生考卷(每科考试随机选一份试卷) * * @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; }
public function add($method = 'manual', $place_id = 0, $page_size = '') { if (!$this->check_power('exam_manage')) { return; } $param = array(); $place_id = intval($place_id); if ($place_id) { $query = $this->db->select('p.*,e.exam_id,e.exam_name,e.exam_pid,e.grade_id')->from('exam_place p')->join('exam e', 'p.exam_pid=e.exam_id')->where(array('p.place_id' => $place_id))->get(); $place = $query->row_array(); } if (empty($place)) { message('考场信息不存在', 'admin/exam/index'); return; } $subjects = ExamPlaceModel::get_exam_place_subject($place_id); if (empty($subjects)) { message('考场学科信息不存在', 'admin/exam/index'); return FALSE; } foreach ($subjects as $row) { $query = $this->db->select('paper_id,exam_pid')->where(array('exam_id' => $row['exam_id']))->order_by('rand()')->get(self::$_table_exam_subject_paper, 1); $arr = $query->row_array(); if (!isset($arr['paper_id'])) { message('考场学科试卷信息不存在', 'admin/exam/index'); return FALSE; } } // 控制考场只能在未开始考试操作 $no_start = ExamPlaceModel::place_is_no_start($place_id); if (!$no_start) { message('该考场正在考试或已结束,无法做此操作'); } // 是否为本考场所在的学校的考生 $school_id = $place['school_id']; if ($school_id) { $query_school_id = intval($this->input->post('school_id')); if ($query_school_id) { $school_id = $query_school_id; } $param[] = "school_id=" . $school_id; } // 该考场所考到的学科 $subject_ids = array(); $query = $this->db->select('subject_id')->from('exam_place_subject')->where(array('place_id' => $place['place_id']))->get(); $subjects = $query->result_array(); $subject_ids = array(); foreach ($subjects as $subject) { $subject_ids[] = $subject['subject_id']; } $subject_ids = count($subject_ids) ? implode(',', $subject_ids) : '""'; $place['start_time'] = $place['start_time'] + 1; $place['end_time'] = $place['end_time'] - 1; // 不存在这些状态:已参加正在进行、已参加还未开始、已参加相同学科 $not_exists_sql = "SELECT uid FROM {pre}exam_place_student ps,{pre}exam_place p WHERE ps.place_id=p.place_id AND p.place_index={$place['place_index']} AND ps.uid=u.uid AND (((p.start_time >= {$place['start_time']} and p.start_time <= {$place['end_time']}) OR (p.end_time >= {$place['start_time']} and p.end_time <= {$place['end_time']}) OR (p.start_time <= {$place['start_time']} and p.end_time >= {$place['end_time']})) OR p.place_id IN(select distinct(place_id) from {pre}exam_place_subject eps where eps.subject_id in({$subject_ids}) and eps.exam_pid={$place['exam_id']}) )"; $tmp_sql = ''; $data['student_name'] = $this->input->post('student_name'); if ($data['student_name']) { $student_name = "'" . implode("','", array_unique(array_filter(explode("\n", $data['student_name'])))) . "'"; $tmp_sql = " AND u.uid IN (SELECT uid FROM v_rd_student WHERE fullname IN ({$student_name}))"; } // 统计还未安排考场的学生数量(以学校作为一个考点单位) $sql = "SELECT COUNT(*) nums FROM {pre}student u\n WHERE u.school_id={$school_id} AND u.grade_id={$place['grade_id']} AND u.is_delete=0\n AND NOT EXISTS({$not_exists_sql}) {$tmp_sql}"; $row = $this->db->query($sql)->row_array(); $total = $row['nums']; if ($total == 0) { // message('所有学生都已经分配考场', 'admin/place_student/index/'.$place_id); // return; } $data['page_size'] = $page_size; if ($method == 'auto') { // 自动模式添加 $tpl = 'place_student/add_auto'; } else { // 手工模式添加 $tpl = 'place_student/add_manual'; $size = $page_size ? $page_size : 15; $page = isset($_GET['page']) && intval($_GET['page']) > 1 ? intval($_GET['page']) : 1; $offset = ($page - 1) * $size; $list = array(); // 获取所有学校里未被分配过考场的学生 $sql = "SELECT u.uid,u.first_name,u.last_name,u.email,u.exam_ticket,u.sex,sch.school_name\n FROM {pre}student u,{pre}school sch\n WHERE u.school_id=sch.school_id " . ($school_id ? "AND u.school_id={$school_id}" : '') . " AND u.grade_id={$place['grade_id']} AND u.is_delete=0\n AND NOT EXISTS({$not_exists_sql}) {$tmp_sql} LIMIT {$offset},{$size}"; $query = $this->db->query($sql); foreach ($query->result_array() as $row) { $list[] = $row; } // 分页 $purl = site_url('admin/place_student/add/manual/' . $place_id . '/' . $size . ($param ? '?' . implode('&', $param) : '')); $data['pagination'] = multipage($total, $size, $page, $purl); $data['list'] =& $list; } $school = SchoolModel::schoolInfo($school_id); $data['total'] = $total; $data['place'] =& $place; $data['school'] =& $school; // 模版 $this->load->view($tpl, $data); }