function ($query) { $query->withField('id, name'); } ]) ->where('status', CommonStatus::NORMAL) ->where('is_only_room', 0)// 过滤仅考场使用的试卷 ->whereRaw("((start_time = 0 and end_time = 0) or (start_time < {$now} and end_time > {$now}))"); // 分类 if ($cate_id) { $child_cate_ids = CateModel::getChildId($cate_id); array_push($child_cate_ids, $cate_id); $query->whereIn('cate_id', $child_cate_ids); } // 排序 if ($sort && $sort != 'null') { $sort = explode('|', $sort); $field = $sort[0]; $order_by = $sort[1]; $field = in_array($field, ['join_count']) ? $field : 'join_count'; $order_by = $order_by == 'desc' ? 'desc' : 'asc'; $query->order("{$field} $order_by"); } $list = $query->paginate(); $this->success('', ['list' => $list]); } /** * 试卷取题接口 */ public function getExamQuestion() { $paper_id = input('paper_id/d', 0); $room_id = input('room_id/d', 0); // 验证是否需要绑定手机号 // UserModel::isMustBindMobile($this->auth->getUser()); // 预创建考场考试记录 // $room_grade_id = ExamService::preRoomGrade($room_id, $this->auth->id); // 获取试卷题目 $question_data = ExamService::getExamQuestion($paper_id, $room_id); // $this->success('', array_merge($question_data, ['room_grade_id' => $room_grade_id])); $this->success('', $question_data); } //开始考试接口 public function startpaper(){ $paper_id = input('paper_id/d', 0); $user_id = $this->auth->id; //检查考试状态 $check = Db::name('exam_grade')->where('user_id', $user_id)->where('status',1)->find(); if($check){ $this->success('您有其他考试正在进行中,即将继续考试',0);//直接给成功,数据返回0,前端跳转 } //检查试卷 $paper = PaperModel::get($paper_id); switch (true) { case !$paper: $this->error('试卷信息不存在'); case $paper->status != 'NORMAL': $this->error('试卷未开启'); case $paper->mode == 'RANDOM' && !$paper->configs: $this->error('试卷未配置'); } //时间限制 if ($paper['start_time'] > 0 && $paper['start_time'] > time()) { $this->error('该试卷未开始,不能参与考试'); } if ($paper['end_time'] > 0 && $paper['end_time'] < time()) { $this->error('该试卷已结束,不能参与考试'); } //考试资格 if(!in_array($user_id,explode(',',$paper['user_ids']))){ $this->error('您不能参加该考试'); } //次数限制 if ($paper['limit_count'] > 0){ $my_count = Db::name('exam_grade')->where('user_id', $user_id)->where('paper_id', $paper_id)->count(); if($my_count >= $paper['limit_count']) { $this->error('该试卷您的考试次数已达上限'); } } //记录为已开始,计划任务倒计时之后 自动结束 $data = [ 'cate_id' => $paper['cate_id'], 'user_id' => $this->auth->id, 'paper_id' => $paper_id, 'mode' => $paper['mode'], 'total_score' => $paper['total_score'], 'total_count' => $paper['quantity'], 'start_time' => time(), 'createtime' => time(), 'status' => 1, 'limit_time' => $paper['limit_time'], //限时N秒 'last_time' => $paper['limit_time'] > 0 ? (time() + $paper['limit_time']) : 0, //最后限制交卷时间,时间戳 ]; $grade_id = Db::name('exam_grade')->insertGetId($data); $this->success('',$grade_id); } //进行中考试 public function half_examing(){ $user_id = $this->auth->id; $check = Db::name('exam_grade')->where('user_id', $user_id)->where('status',1)->find(); if(empty($check)){ $this->error('您没有进行中的考试'); } $paper_id = $check['paper_id']; // 获取试卷题目 $question_data = ExamService::getExamQuestion($paper_id, 0); $question_data['paper']['limit_time'] = $check['last_time'] - time();//倒计时秒数 $this->success('', $question_data); } /** * 交卷 */ public function submit() { $request = Request::instance(); $user_id = $this->auth->id; $paper_id = $request->post('paper_id/d', 0); $questions = $request->post('questions/a', []); $start_time = $request->post('start_time/d', time()); $room_id = 0; $room_grade_id = $request->post('room_grade_id/d', 0); if (!$user_id || !$paper_id || !$questions) { $this->error('提交数据有误'); } $check = Db::name('exam_grade')->where('status',1)->where('user_id',$user_id)->where('paper_id',$paper_id)->find(); if(!$check){ $this->error('交卷有误,或者您已交卷'); } $grade_id = $check['id']; $start_time = $check['start_time']; // 考场考试 if ($room_id) { if (!$room_grade_id) { $this->error('提交数据不合法'); } // 考场考试 $result = ExamService::roomExam($user_id, $room_id, $room_grade_id, $questions, $start_time, $paper, $room, $is_makeup, $room_grade_log); // 记录考场考试成绩 $room_grade_log->allowField(true)->save( array_merge( $result, [ // 'cate_id' => $paper['cate_id'], 'user_id' => $user_id, 'paper_id' => $paper_id, 'is_makeup' => $is_makeup, 'is_pre' => 0, // 提交成绩后不再为预创建标记 ], [ 'exam_mode' => ExamMode::ROOM, ] ) ); } else { $result = ExamService::paperExam($user_id, $paper_id, $questions, $start_time, $paper); // 记录考试成绩 /*GradeModel::create(array_merge( $result, [ 'cate_id' => $paper['cate_id'], 'user_id' => $user_id, 'paper_id' => $paper_id, ], [ // 'exam_mode' => ExamMode::PAPER, 'date' => date('Y-m-d'), ]), true);*/ $update = array_merge( $result, [ 'cate_id' => $paper['cate_id'], 'updatetime' => time(), 'date' => date('Y-m-d'), 'status' => 2, 'finish_time' => time(), ]); unset($update['pass_score']); unset($update['start_time']); $rs = Db::name('exam_grade')->where('id',$grade_id)->update($update); if($rs === false){ $this->error('交卷失败'); } } $result['nickname'] = $this->auth->nickname; //删除本试卷分数最低的试卷 $old_grade = Db::name('exam_grade')->where('user_id',$user_id)->where('paper_id',$paper_id)->where('id','NEQ',$grade_id)->find(); if(!empty($old_grade)){ if($old_grade['score'] <= $update['score']){ $delete_id = $old_grade['id']; }else{ $delete_id = $grade_id; } Db::name('exam_grade')->where('id',$delete_id)->delete(); } //删除本试卷分数最低的试卷 $this->success('',$result); // return json($result); } /* * 查看错题 * Robin * @param $ids * */ public function error_ids($ids) { $questions = QuestionModel::whereIn('id', ($ids))->select(); $this->success('', $questions); } }