ExamRecord.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php namespace App\Http\Controllers\Api\Video;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Models\Video\Answer as VideoAnswer;
  4. use App\Models\Video\Question as VideoQuestion;
  5. use App\Models\Video\ExamAnswer;
  6. use App\Models\Video\ExamRecord as Model;
  7. use App\Models\CustomScore;
  8. use Illuminate\Support\Facades\DB;
  9. /**
  10. * 课后评测记录
  11. *
  12. * @author 刘相欣
  13. *
  14. */
  15. class ExamRecord extends Api{
  16. /**
  17. * 交卷 /api/video_exam_record/hand_in
  18. *
  19. */
  20. public function hand_in(Model $Model,ExamAnswer $ExamAnswer,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,CustomScore $CustomScore){
  21. // 用户登录
  22. $uid = $this->checkLogin();
  23. // 接收参数
  24. $id = request('record_id',0);
  25. $answerList = request('answer_list',''); // 示例 '[{"question_id":43,"answer_id":128}]'
  26. // 组合数据
  27. $data['custom_uid'] = $uid;
  28. $data['end_time'] = time();
  29. $data['status'] = 1;
  30. // 如果没有记录
  31. if( !$id ) return json_send(['code'=>'error','msg'=>'请选择的记录ID']);
  32. // 解析json结构
  33. $answerList = json_decode($answerList,true);
  34. // 如果没有记录
  35. if( !$answerList || !is_array($answerList) ) return json_send(['code'=>'error','msg'=>'请先答题']);
  36. // 查询记录
  37. $record = $Model->query()->where([['id','=',$id]])->first();
  38. // 如果没有记录
  39. if( !$record ) return json_send(['code'=>'error','msg'=>'记录不存在!']);
  40. // 转数据
  41. $record = $record->toArray();
  42. // 如果没有记录
  43. if( $record['status'] ) return json_send(['code'=>'error','msg'=>'请勿重复交卷']);
  44. // 写入列表
  45. $insertList = [];
  46. // 循环题目列表
  47. foreach ( $answerList as $value ) {
  48. // 临时存储
  49. $temp = ['record_id'=>$id,'course_id'=>$record['course_id'],'custom_uid'=>$uid,'question_id'=>$value['question_id'],'answer_id'=>$value['answer_id']];
  50. // 获取答案
  51. $temp['is_answer'] = (int) $VideoAnswer->getOne($value['question_id'],$value['answer_id'],'is_answer');
  52. // 如果没的话,获取题目分数
  53. $temp['score'] = (int) $VideoQuestion->getOne($value['question_id'],'score');
  54. // 获取题目分数
  55. $temp['get_score'] = 0;
  56. // 如果答对的话
  57. if( $temp['is_answer'] ) {
  58. // 查询该用户该课程该题答题记录
  59. $answerRecord = $ExamAnswer->query()->where([['custom_uid','=',$uid],['course_id','=',$record['course_id']],['question_id','=',$value['question_id']]])->first();;
  60. // 如果有的答题记录,不再给分
  61. if( $answerRecord ) continue;
  62. // 获取积分
  63. $temp['get_score'] = $temp['score'];
  64. }
  65. // 时间
  66. $temp['insert_time'] = $data['end_time'];
  67. $temp['update_time'] = $data['end_time'];
  68. // 重组
  69. $insertList[] = $temp;
  70. }
  71. // 评测时长
  72. $data['exam_time'] = $data['end_time'] - $record['start_time'];
  73. // 查询答题数量
  74. $data['course_id'] = $record['course_id'];
  75. // 查询答题数量
  76. $data['answer_total'] = count($insertList);
  77. // 查询答对数量
  78. $data['isanswer_total'] = count(array_column($insertList,'is_answer'));
  79. // 查询答题总积分
  80. $data['get_score'] = (int) array_sum(array_column($insertList,'get_score'));
  81. // 开始事务
  82. DB::beginTransaction();
  83. // 保存答题记录
  84. $result = $ExamAnswer->insert($insertList);
  85. // 答题记录保存失败
  86. if ( !$result ) {
  87. // 回滚事务
  88. DB::rollBack();
  89. // 失败提醒
  90. return json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']);
  91. }
  92. // 如果有获取积分
  93. if ($data['get_score']) {
  94. // 积分奖励
  95. $result = $CustomScore->trade($uid,$id,$data['get_score'],10,2,'课后评测奖励');
  96. // 积分奖励失败
  97. if( isset($result['error']) ) {
  98. // 回滚事务
  99. DB::rollBack();
  100. // 失败提醒
  101. return json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]);
  102. }
  103. }
  104. // 写入/修改学习记录
  105. $result = $Model->edit($id,$data);
  106. // 写入失败
  107. if( !$result ) {
  108. // 回滚事务
  109. DB::rollBack();
  110. // 失败提醒
  111. return json_send(['code'=>'error', 'msg'=>'测评记录失败,请重试','data'=>['error'=>'测评记录写入失败']]);
  112. }
  113. // 提交事务
  114. DB::commit();
  115. // 成功提醒
  116. return json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]);
  117. }
  118. /**
  119. * 获取评测报告 /api/video_exam_record/get_report
  120. *
  121. */
  122. public function get_report(Model $Model){
  123. // 登录信息
  124. $uid = $this->checkLogin();
  125. // 接收参数
  126. $id = request('record_id',0);
  127. // 返回结果
  128. $data = $Model->query()->where([['id','=',$id]])->first();
  129. // 错误提示
  130. if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']);
  131. // 成功下发
  132. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  133. }
  134. /**
  135. * 获取已完成的报告 /api/video_exam_record/get_report_last
  136. *
  137. */
  138. public function get_report_last(Model $Model){
  139. // 登录信息
  140. $uid = $this->checkLogin();
  141. $courseId = request('course_id',0);
  142. // 返回结果
  143. $data = $Model->query()->where([['course_id','=',$courseId],['custom_uid','=',$uid],['status','=',1]])->orderByDesc('id')->first();
  144. // 错误提示
  145. if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']);
  146. // 成功下发
  147. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  148. }
  149. }