Unit.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php
  2. namespace addons\yexam\service;
  3. use app\admin\model\yexam\Answer;
  4. use app\admin\model\yexam\Fav;
  5. use app\admin\model\yexam\Question;
  6. use app\admin\model\yexam\QuestionLog;
  7. use think\Exception;
  8. class Unit
  9. {
  10. public $model;
  11. public function __construct()
  12. {
  13. $this->model = new \app\admin\model\yexam\Unit();
  14. }
  15. /**
  16. * 获取上次答题定位num
  17. */
  18. public function getLastPosition($unit_id,$user_id){
  19. //获取当前单元已经练习的最后的题目ID
  20. $logModel = new QuestionLog();
  21. $data = $logModel
  22. ->field("a.question_id")
  23. ->alias("a")
  24. ->join("yexam_question b","a.question_id=b.id",'inner')
  25. ->where(['a.unit_id'=>$unit_id,'user_id'=>$user_id])->order('a.lasttime desc')->find();
  26. if(empty($data)){
  27. return 1;
  28. }else{
  29. $questionModel = new \app\admin\model\yexam\Question();
  30. $questionList = $questionModel->field("id")->where(['unit_id'=>$unit_id])->order("type asc,id asc")->select();
  31. $num = 1;
  32. foreach($questionList as $k=>$v){
  33. $num++;
  34. if($data['question_id'] == $v['id']){
  35. break;
  36. }
  37. }
  38. if($num>count($questionList)){
  39. $num = 1;
  40. }
  41. return $num;
  42. }
  43. }
  44. /**
  45. * 递归获取下级终极章节ID
  46. * @param $id
  47. * @param $arr
  48. * @return array
  49. * @throws \think\db\exception\DataNotFoundException
  50. * @throws \think\db\exception\ModelNotFoundException
  51. * @throws \think\exception\DbException
  52. */
  53. public function _up_unit($id, &$arr)
  54. {
  55. $unitModel = new \app\admin\model\yexam\Unit();
  56. $list = $unitModel->where(['pid'=>$id])->select();
  57. foreach ($list as $k=>$v) {
  58. if ($v['is_last'] == 1) {
  59. $arr[] = $v['id'];
  60. } else {
  61. $this->_up_unit($v['id'], $arr);
  62. }
  63. }
  64. return $arr;
  65. }
  66. /**
  67. * 获取指定章节下的章节练习的题目正确数量
  68. * @throws Exception
  69. */
  70. public function getUnitQuestionRightNum($unit_id,$user_id){
  71. $unit_ids = [$unit_id];
  72. try {
  73. self::_up_unit($unit_id, $unit_ids);
  74. } catch (Exception $e) {
  75. }
  76. $questionModel = new Question();
  77. return $questionModel
  78. ->alias("question")
  79. ->join("yexam_question_log log","question.id=log.question_id","inner")
  80. ->where(['question.unit_id'=>['in',$unit_ids],"log.state"=>1,"log.user_id"=>$user_id])->count();
  81. }
  82. /**
  83. * 获取指定章节下的章节练习的题目练习数量
  84. * @throws Exception
  85. */
  86. public function getUnitQuestionTestNum($unit_id,$user_id){
  87. $unit_ids = [$unit_id];
  88. try {
  89. self::_up_unit($unit_id, $unit_ids);
  90. } catch (Exception $e) {
  91. }
  92. $questionModel = new Question();
  93. return $questionModel
  94. ->alias("question")
  95. ->join("yexam_question_log log","question.id=log.question_id","inner")
  96. ->where(['question.unit_id'=>['in',$unit_ids],"log.user_id"=>$user_id])->count();
  97. }
  98. /**
  99. * 获取指定章节下的章节练习的题目数量
  100. * @throws Exception
  101. */
  102. public function getUnitQuestionNum($unit_id){
  103. $unit_ids = [$unit_id];
  104. try {
  105. self::_up_unit($unit_id, $unit_ids);
  106. } catch (Exception $e) {
  107. }
  108. $questionModel = new Question();
  109. return $questionModel->where(['unit_id'=>['in',$unit_ids]])->count();
  110. }
  111. /**
  112. * 获取章节正确率
  113. * @throws Exception
  114. */
  115. public function right_scale($unit_id,$user_id){
  116. //获取正确数量
  117. $test_num = self::getUnitQuestionTestNum($unit_id,$user_id);
  118. $right_num = self::getUnitQuestionRightNum($unit_id,$user_id);
  119. return empty($test_num)?0:intval(bcdiv($right_num,$test_num,2)*100);
  120. }
  121. /**
  122. * 章节练习答题
  123. */
  124. public function doanswer($id,$answer,$user_id){
  125. $questionModel = new \app\admin\model\yexam\Question();
  126. if($questionInfo = $questionModel->where(['id'=>$id])->find()){
  127. if (preg_replace('# #', '', $questionInfo['right_answer']) != preg_replace('# #', '', $answer)) {
  128. $result = 0;
  129. }else{
  130. $result = 1;
  131. }
  132. }else{
  133. return;
  134. }
  135. //写入答题记录
  136. $logModel = new QuestionLog();
  137. if($log = $logModel->where(['question_id'=>$id,'user_id'=>$user_id])->find()){
  138. $log->save(['lasttime'=>time(),'state'=>$result]);
  139. $log->setInc('total_num');
  140. if(empty($result)){
  141. $log->setInc('error_num');
  142. }else{
  143. $log->save(['error_num'=>0]);
  144. }
  145. }else{
  146. $logModel = new QuestionLog();
  147. $logModel->save([
  148. 'subject_id'=>$questionInfo['subject_id'],
  149. 'unit_id'=>$questionInfo['unit_id'],
  150. 'question_id'=>$id,
  151. 'user_id'=>$user_id,
  152. 'createtime'=>time(),
  153. 'lasttime'=>time(),
  154. 'state'=>$result
  155. ]);
  156. }
  157. return $result;
  158. }
  159. /**
  160. * 获取章节练习错题列表
  161. */
  162. public function getErrorLogList($subject_id,$user_id,$page,$limit){
  163. $logModel = new QuestionLog();
  164. $count = $logModel
  165. ->alias("log")
  166. ->join("yexam_unit unit","log.unit_id=unit.id",'inner')
  167. ->where(['log.subject_id'=>$subject_id,'log.user_id'=>$user_id,'log.state'=>0])->group("unit.id")->count();
  168. if($page){
  169. $data = $logModel
  170. ->alias("log")
  171. ->field("unit.id,unit.unit_name,count(log.id) as error_num")
  172. ->join("yexam_unit unit","log.unit_id=unit.id",'inner')
  173. ->where(['log.subject_id'=>$subject_id,'log.user_id'=>$user_id,'log.state'=>0])
  174. ->page($page,$limit)
  175. ->group("unit.id")
  176. ->select();
  177. }else{
  178. $data = $logModel
  179. ->alias("log")
  180. ->field("unit.id,unit.unit_name,count(log.id) as error_num")
  181. ->join("yexam_unit unit","log.unit_id=unit.id",'inner')
  182. ->where(['log.subject_id'=>$subject_id,'log.user_id'=>$user_id,'log.state'=>0])
  183. ->group("unit.id")
  184. ->select();
  185. }
  186. return ['total'=>$count,'data'=>$data];
  187. }
  188. /**
  189. * 获取章节练习错题答题卡
  190. */
  191. public function getErrorCard($unit_id,$user_id){
  192. $logModel = new QuestionLog();
  193. $data = collection($logModel
  194. ->alias("log")
  195. ->field("question.id")
  196. ->join("yexam_question question","log.question_id=question.id",'inner')
  197. ->join("yexam_unit unit","log.unit_id=unit.id",'inner')
  198. ->where(['log.unit_id'=>$unit_id,'log.user_id'=>$user_id,'log.state'=>0])
  199. ->order("question.type asc,question.id asc")
  200. ->select());
  201. return $data;
  202. }
  203. /**
  204. * 移除章节考试错题
  205. * @param $unit_id
  206. * @param $id
  207. * @param $user_id
  208. */
  209. public function removeErrorQuestion($id,$user_id){
  210. $logModel = new QuestionLog();
  211. $row = $logModel
  212. ->where(['unit_id'=>['neq',0],'user_id'=>$user_id,'question_id'=>$id,'state'=>0])
  213. ->find();
  214. if(empty($row)){
  215. return true;
  216. }
  217. $row->delete();
  218. return true;
  219. }
  220. /**
  221. * 获取章节练习错题答题卡
  222. */
  223. public function getFavCard($unit_id,$user_id){
  224. $favModel = new Fav();
  225. $data = collection($favModel
  226. ->alias("fav")
  227. ->field("question.id")
  228. ->join("yexam_question question","fav.question_id=question.id",'inner')
  229. ->join("yexam_unit unit","fav.unit_id=unit.id",'inner')
  230. ->where(['fav.unit_id'=>$unit_id,'fav.user_id'=>$user_id])
  231. ->order("question.type asc,question.id asc")
  232. ->select());
  233. return $data;
  234. }
  235. /**
  236. * 获取父级章节名称集合
  237. */
  238. public function getParentNames($unit_id,&$arr){
  239. $unitModel = new \app\admin\model\yexam\Unit();
  240. $unitInfo = $unitModel->where(['id'=>$unit_id])->find();
  241. if($unitInfo){
  242. $parent = $unitModel->where(['id'=>$unitInfo['pid']])->find();
  243. if($parent){
  244. $arr[] = $parent['unit_name'];
  245. if(!empty($parent['pid'])){
  246. $this->getParentNames($parent['pid'], $arr);
  247. }
  248. }
  249. }
  250. return $arr;
  251. }
  252. /**
  253. * 获取章节练习收藏列表
  254. */
  255. public function getFavList($subject_id,$user_id,$page,$limit){
  256. $favModel = new Fav();
  257. $count = $favModel
  258. ->alias("fav")
  259. ->join("yexam_unit unit","fav.unit_id=unit.id",'inner')
  260. ->where(['unit.subject_id'=>$subject_id,'fav.user_id'=>$user_id])
  261. ->count();
  262. if($page){
  263. $data = $favModel
  264. ->alias("fav")
  265. ->field("unit.id,unit.unit_name,count(fav.id) as num")
  266. ->join("yexam_unit unit","fav.unit_id=unit.id",'inner')
  267. ->where(['unit.subject_id'=>$subject_id,'fav.user_id'=>$user_id])
  268. ->group("unit.id")
  269. ->page($page,$limit)
  270. ->select();
  271. }else{
  272. $data = $favModel
  273. ->alias("fav")
  274. ->field("unit.id,unit.unit_name,count(fav.id) as num")
  275. ->join("yexam_unit unit","fav.unit_id=unit.id",'inner')
  276. ->where(['unit.subject_id'=>$subject_id,'fav.user_id'=>$user_id])
  277. ->group("unit.id")
  278. ->select();
  279. }
  280. return ['total'=>$count,'data'=>$data];
  281. }
  282. }