123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php namespace App\Http\Controllers\Api\Video;
- use App\Http\Controllers\Api\Api;
- use App\Models\Video\Answer as VideoAnswer;
- use App\Models\Video\Question as VideoQuestion;
- use App\Models\Video\ExamAnswer;
- use App\Models\Video\ExamRecord as Model;
- use App\Models\CustomScore;
- use Illuminate\Support\Facades\DB;
- /**
- * 课后评测记录
- *
- * @author 刘相欣
- *
- */
- class ExamRecord extends Api{
-
- /**
- * 交卷 /api/video_exam_record/hand_in
- *
- */
- public function hand_in(Model $Model,ExamAnswer $ExamAnswer,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,CustomScore $CustomScore){
- // 用户登录
- $uid = $this->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 ) continue;
- // 获取积分
- $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'] = count(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]);
- }
- }
|