LearnAnswer.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php namespace App\Http\Controllers\Api\Video;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Models\Video\LearnAnswer as Model;
  4. use App\Models\Video\Answer as VideoAnswer;
  5. use App\Models\Video\Question as VideoQuestion;
  6. use App\Models\Video\LearnQuestion;
  7. use App\Models\Video\LearnRecord;
  8. use App\Models\CustomScore;
  9. use Illuminate\Support\Facades\DB;
  10. /**
  11. * 课程
  12. *
  13. * @author 刘相欣
  14. *
  15. */
  16. class LearnAnswer extends Api{
  17. /**
  18. * 获取答题记录 /api/video_learn_answer/get_list
  19. *
  20. */
  21. public function get_list(Model $Model,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
  22. // 用户登录
  23. $uid = $this->checkLogin();
  24. // 接收参数
  25. $recordId = request('record_id',0);
  26. // 如果不是课中习题
  27. if( !$recordId ) return json_send(['code'=>'error','msg'=>'请选择学习记录']);
  28. // 查询答题记录
  29. $answerList = $Model->query()
  30. ->where([['record_id','=',$recordId]])
  31. ->select(['id','record_id','course_id','question_id','answer_id','is_answer','get_score'])
  32. ->get()->toArray();
  33. // 循环答题
  34. foreach ($answerList as $key => $value) {
  35. // 题目标题
  36. $value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
  37. $value['answer_list'] = $VideoAnswer->getListByQuestion($value['question_id']);
  38. $value['answer_list'] = array_values($value['answer_list']);
  39. // 重组
  40. $answerList[$key] = $value;
  41. }
  42. // 返回结果
  43. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$answerList]);
  44. }
  45. /**
  46. * 上报课中习题答案 /api/video_learn_answer/play_exam
  47. *
  48. */
  49. public function play_exam(Model $Model,LearnQuestion $LearnQuestion,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,CustomScore $CustomScore,LearnRecord $LearnRecord){
  50. // 用户登录
  51. $uid = $this->checkLogin();
  52. // 接收参数
  53. $data['custom_uid'] = $uid;
  54. $data['record_id'] = request('record_id',0);
  55. $data['course_id'] = request('course_id',0);
  56. $data['question_id'] = request('question_id',0);
  57. $data['answer_id'] = request('answer_id',0);
  58. //
  59. if( ! $data['record_id'] ) return json_send(['code'=>'error','msg'=>'请选择学习记录']);
  60. if( ! $data['course_id'] ) return json_send(['code'=>'error','msg'=>'请选择学习课程']);
  61. if( ! $data['question_id'] )return json_send(['code'=>'error','msg'=>'请选择习题问题']);
  62. if( ! $data['answer_id'] ) return json_send(['code'=>'error','msg'=>'请选择习题答案']);
  63. // 判断是不是课中习题
  64. $isLearnQuestion = $LearnQuestion->getOne($data['course_id'],$data['question_id']);
  65. // 如果不是课中习题
  66. if( !$isLearnQuestion ) return json_send(['code'=>'error','msg'=>'题目有误或者题目已停用']);
  67. // 通过记录ID。查询问题是否已经回答
  68. $havaAnswer = $Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid],['question_id','=',$data['question_id']]])->first();
  69. // 如果答过题
  70. if( $havaAnswer ) return json_send(['code'=>'error','msg'=>'已答题,请无重复作答']);
  71. // 查询该用户该课程该题答题记录
  72. $answerRecord = $Model->where([['custom_uid','=',$uid],['course_id','=',$data['course_id']],['question_id','=',$data['question_id']]])->first();
  73. // 获取题目分数
  74. $data['score'] = (int) $VideoQuestion->getOne($data['question_id'],'score');
  75. // 获取答案
  76. $data['is_answer'] = (int) $VideoAnswer->getOne($data['question_id'],$data['answer_id'],'is_answer');
  77. // 如果没有答题记录,并且题目答案正确,则获取分数
  78. $data['get_score'] = (!$answerRecord && $data['is_answer']) ? $data['score'] : 0;
  79. // 获取题目数量
  80. $learnData['question_total']= count($LearnQuestion->getList($data['course_id']));
  81. // 查询答题数量
  82. $learnData['answer_total'] = ($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid]])->count()) + 1;
  83. // 查询答对数量
  84. $learnData['isanswer_total']= ($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid],['is_answer','=',1]])->count()) + ($data['is_answer'] ? 1 : 0);
  85. // 查询答题总积分
  86. $learnData['get_score'] = intval($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid]])->sum('get_score')) + $data['get_score'];
  87. // 开始事务
  88. DB::beginTransaction();
  89. // 保存答题记录
  90. $data['id'] = $Model->add($data);
  91. // 答题记录保存失败
  92. if ( !$data['id'] ) {
  93. // 回滚事务
  94. DB::rollBack();
  95. // 失败提醒
  96. return json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']);
  97. }
  98. // 如果有获取积分
  99. if ($data['get_score']) {
  100. // 积分奖励
  101. $result = $CustomScore->trade($uid,$data['id'],$data['get_score'],10,1,'课中评测奖励');
  102. // 积分奖励失败
  103. if( isset($result['error']) ) {
  104. // 回滚事务
  105. DB::rollBack();
  106. // 失败提醒
  107. return json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]);
  108. }
  109. }
  110. // 写入/修改学习记录
  111. $result = $LearnRecord->edit($data['record_id'],$learnData);
  112. // 写入失败
  113. if( !$result ) {
  114. // 回滚事务
  115. DB::rollBack();
  116. // 失败提醒
  117. return json_send(['code'=>'error', 'msg'=>'学习记录失败,请重试','data'=>['error'=>'学习记录写入失败']]);
  118. }
  119. // 提交事务
  120. DB::commit();
  121. // 成功提醒
  122. return json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]);
  123. }
  124. }