예제 #1
0
    /**
     * 设定学生考卷(每科考试随机选一份试卷)
     *
     * @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;
    }
예제 #2
0
 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);
 }