checkLogin(); // 接收参数 $id = request('record_id',0); $answerList = request('answer_list',''); // 示例 '[{"question_id":43,"answer_id":128}]' // 组合数据 $data['custom_uid'] = $uid; $data['end_time'] = time(); $data['status'] = 1; // 如果没有记录 if( !$id ) return json_send(['code'=>'error','msg'=>'请选择的记录ID']); // 解析json结构 $answerList = json_decode($answerList,true); // 如果没有记录 if( !$answerList || !is_array($answerList) ) return json_send(['code'=>'error','msg'=>'请先答题']); // 查询记录 $record = $Model->query()->where([['id','=',$id]])->first(); // 如果没有记录 if( !$record ) return json_send(['code'=>'error','msg'=>'记录不存在!']); // 转数据 $record = $record->toArray(); // 如果没有记录 if( $record['status'] ) return json_send(['code'=>'error','msg'=>'请勿重复交卷']); // 写入列表 $insertList = []; // 循环题目列表 foreach ( $answerList as $value ) { // 临时存储 $temp = ['record_id'=>$id,'course_id'=>$record['course_id'],'custom_uid'=>$uid,'question_id'=>$value['question_id'],'answer_id'=>$value['answer_id']]; // 获取答案 $temp['is_answer'] = (int) $VideoAnswer->getOne($value['question_id'],$value['answer_id'],'is_answer'); // 如果没的话,获取题目分数 $temp['score'] = (int) $VideoQuestion->getOne($value['question_id'],'score'); // 获取题目分数 $temp['get_score'] = 0; // 如果答对的话 if( $temp['is_answer'] ) { // 查询该用户该课程该题答题记录 $answerRecord = $ExamAnswer->query()->where([['custom_uid','=',$uid],['course_id','=',$record['course_id']],['question_id','=',$value['question_id']]])->first();; // 如果有的答题记录,不再给分,没有答过题则给分 if( !$answerRecord ) $temp['get_score'] = $temp['score']; } // 时间 $temp['insert_time'] = $data['end_time']; $temp['update_time'] = $data['end_time']; // 重组 $insertList[] = $temp; } // 评测时长 $data['exam_time'] = $data['end_time'] - $record['start_time']; // 查询答题数量 $data['course_id'] = $record['course_id']; // 查询答题数量 $data['answer_total'] = count($insertList); // 查询答对数量 $data['isanswer_total'] = array_sum(array_column($insertList,'is_answer')); // 查询答题总积分 $data['get_score'] = (int) array_sum(array_column($insertList,'get_score')); // 开始事务 DB::beginTransaction(); // 保存答题记录 $result = $ExamAnswer->insert($insertList); // 答题记录保存失败 if ( !$result ) { // 回滚事务 DB::rollBack(); // 失败提醒 return json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']); } // 如果有获取积分 if ($data['get_score']) { // 积分奖励 $result = $CustomScore->trade($uid,$id,$data['get_score'],10,2,'课后评测奖励'); // 积分奖励失败 if( isset($result['error']) ) { // 回滚事务 DB::rollBack(); // 失败提醒 return json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]); } } // 写入/修改学习记录 $result = $Model->edit($id,$data); // 写入失败 if( !$result ) { // 回滚事务 DB::rollBack(); // 失败提醒 return json_send(['code'=>'error', 'msg'=>'测评记录失败,请重试','data'=>['error'=>'测评记录写入失败']]); } // 提交事务 DB::commit(); // 成功提醒 return json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]); } /** * 获取评测报告 /api/video_exam_record/get_report * */ public function get_report(Model $Model){ // 登录信息 $uid = $this->checkLogin(); // 接收参数 $id = request('record_id',0); // 返回结果 $data = $Model->query()->where([['id','=',$id]])->first(); // 错误提示 if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']); // 成功下发 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]); } /** * 获取已完成的报告 /api/video_exam_record/get_report_last * */ public function get_report_last(Model $Model){ // 登录信息 $uid = $this->checkLogin(); $courseId = request('course_id',0); // 返回结果 $data = $Model->query()->where([['course_id','=',$courseId],['custom_uid','=',$uid],['status','=',1]])->orderByDesc('id')->first(); // 错误提示 if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']); // 成功下发 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]); } }