ExamRecord.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 ) $temp['get_score'] = $temp['score'];
  62. }
  63. // 时间
  64. $temp['insert_time'] = $data['end_time'];
  65. $temp['update_time'] = $data['end_time'];
  66. // 重组
  67. $insertList[] = $temp;
  68. }
  69. // 评测时长
  70. $data['exam_time'] = $data['end_time'] - $record['start_time'];
  71. // 查询答题数量
  72. $data['course_id'] = $record['course_id'];
  73. // 查询答题数量
  74. $data['answer_total'] = count($insertList);
  75. // 查询答对数量
  76. $data['isanswer_total'] = array_sum(array_column($insertList,'is_answer'));
  77. // 查询答题总积分
  78. $data['get_score'] = (int) array_sum(array_column($insertList,'get_score'));
  79. // 开始事务
  80. DB::beginTransaction();
  81. // 保存答题记录
  82. $result = $ExamAnswer->insert($insertList);
  83. // 答题记录保存失败
  84. if ( !$result ) {
  85. // 回滚事务
  86. DB::rollBack();
  87. // 失败提醒
  88. return json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']);
  89. }
  90. // 如果有获取积分
  91. if ($data['get_score']) {
  92. // 积分奖励
  93. $result = $CustomScore->trade($uid,$id,$data['get_score'],10,2,'课后评测奖励');
  94. // 积分奖励失败
  95. if( isset($result['error']) ) {
  96. // 回滚事务
  97. DB::rollBack();
  98. // 失败提醒
  99. return json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]);
  100. }
  101. }
  102. // 写入/修改学习记录
  103. $result = $Model->edit($id,$data);
  104. // 写入失败
  105. if( !$result ) {
  106. // 回滚事务
  107. DB::rollBack();
  108. // 失败提醒
  109. return json_send(['code'=>'error', 'msg'=>'测评记录失败,请重试','data'=>['error'=>'测评记录写入失败']]);
  110. }
  111. // 提交事务
  112. DB::commit();
  113. // 成功提醒
  114. return json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]);
  115. }
  116. /**
  117. * 获取评测报告 /api/video_exam_record/get_report
  118. *
  119. */
  120. public function get_report(Model $Model){
  121. // 登录信息
  122. $uid = $this->checkLogin();
  123. // 接收参数
  124. $id = request('record_id',0);
  125. // 返回结果
  126. $data = $Model->query()->where([['id','=',$id]])->first();
  127. // 错误提示
  128. if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']);
  129. // 成功下发
  130. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  131. }
  132. /**
  133. * 获取已完成的报告 /api/video_exam_record/get_report_last
  134. *
  135. */
  136. public function get_report_last(Model $Model){
  137. // 登录信息
  138. $uid = $this->checkLogin();
  139. $courseId = request('course_id',0);
  140. // 返回结果
  141. $data = $Model->query()->where([['course_id','=',$courseId],['custom_uid','=',$uid],['status','=',1]])->orderByDesc('id')->first();
  142. // 错误提示
  143. if(!$data) return json_send(['code'=>'error','msg'=>'记录不存在']);
  144. // 成功下发
  145. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  146. }
  147. }