UserQuestionService.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package com.qxgmat.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.Page;
  4. import com.nuliji.tools.AbstractService;
  5. import com.nuliji.tools.PageResult;
  6. import com.nuliji.tools.Transform;
  7. import com.nuliji.tools.exception.ParameterException;
  8. import com.nuliji.tools.exception.SystemException;
  9. import com.nuliji.tools.mybatis.Example;
  10. import com.qxgmat.data.constants.enums.module.PaperModule;
  11. import com.qxgmat.data.constants.enums.module.QuestionModule;
  12. import com.qxgmat.data.dao.UserQuestionMapper;
  13. import com.qxgmat.data.dao.entity.UserQuestion;
  14. import com.qxgmat.data.dao.entity.UserReport;
  15. import com.qxgmat.data.inline.UserQuestionStat;
  16. import com.qxgmat.service.annotation.InitQuestion;
  17. import com.qxgmat.service.inline.QuestionNoService;
  18. import com.qxgmat.service.inline.SentenceQuestionService;
  19. import com.qxgmat.util.annotation.Callback;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import javax.annotation.Resource;
  25. import java.util.*;
  26. import java.util.stream.Collectors;
  27. @Service
  28. public class UserQuestionService extends AbstractService {
  29. private static final Logger logger = LoggerFactory.getLogger(UserQuestionService.class);
  30. @Resource
  31. private UserQuestionMapper userQuestionMapper;
  32. /**
  33. * 用户错题记录:相同题目的最后一次做题记录及其编号
  34. * @param page
  35. * @param size
  36. * @param userId
  37. * @return
  38. */
  39. public PageResult<UserQuestion> listError(int page, int size, Integer userId){
  40. // todo 查询错题列表
  41. return new PageResult<>(null, 0);
  42. }
  43. /**
  44. * 根据用户题目获取该题总统计
  45. * @param userQuestionList
  46. * @return
  47. */
  48. public UserQuestionStat statQuestion(List<UserQuestion> userQuestionList){
  49. UserQuestionStat stat = new UserQuestionStat();
  50. Integer totalTime = 0;
  51. Integer totalNumber = 0;
  52. Integer totalCorrect = 0;
  53. for(UserQuestion question : userQuestionList){
  54. totalTime += question.getUserTime();
  55. totalNumber += 1;
  56. totalCorrect += question.getIsCorrect();
  57. }
  58. stat.setUserCorrect(totalCorrect);
  59. stat.setUserNumber(totalNumber);
  60. stat.setUserTime(totalTime);
  61. return stat;
  62. }
  63. public List<UserQuestion> listByQuestion(Integer userId, Collection questionIds){
  64. Example example = new Example(UserQuestion.class);
  65. example.and(
  66. example.createCriteria()
  67. .andEqualTo("userId", userId)
  68. .andIn("questionId", questionIds)
  69. );
  70. return select(userQuestionMapper, example);
  71. }
  72. public List<UserQuestion> listByQuestionNo(Integer userId, Collection questionNoIds){
  73. Example example = new Example(UserQuestion.class);
  74. example.and(
  75. example.createCriteria()
  76. .andEqualTo("userId", userId)
  77. .andIn("questionNoId", questionNoIds)
  78. );
  79. return select(userQuestionMapper, example);
  80. }
  81. /**
  82. * 根据试卷分组获取统计信息
  83. * @param userQuestionList
  84. * @return
  85. */
  86. public Map<Object, UserQuestionStat> statQuestionMap(List<UserQuestion> userQuestionList){
  87. Map<Object, UserQuestionStat> relationMap = new HashMap<>();
  88. Map<Integer, List<UserQuestion>> map = new HashMap<>();
  89. for (UserQuestion userQuestion: userQuestionList){
  90. if (!map.containsKey(userQuestion.getQuestionId())){
  91. map.put(userQuestion.getQuestionId(), new ArrayList<>());
  92. }
  93. List<UserQuestion> list = map.get(userQuestion.getQuestionId());
  94. list.add(userQuestion);
  95. }
  96. for(Integer questionId : map.keySet()){
  97. relationMap.put(questionId, statQuestion(map.get(questionId)));
  98. }
  99. return relationMap;
  100. }
  101. /**
  102. * 根据试卷分组获取统计信息
  103. * @param userQuestionList
  104. * @return
  105. */
  106. public Map<Object, UserQuestionStat> statQuestionNoMap(List<UserQuestion> userQuestionList){
  107. Map<Object, UserQuestionStat> relationMap = new HashMap<>();
  108. Map<Integer, List<UserQuestion>> map = new HashMap<>();
  109. for (UserQuestion userQuestion: userQuestionList){
  110. if (!map.containsKey(userQuestion.getQuestionNoId())){
  111. map.put(userQuestion.getQuestionNoId(), new ArrayList<>());
  112. }
  113. List<UserQuestion> list = map.get(userQuestion.getQuestionNoId());
  114. list.add(userQuestion);
  115. }
  116. for(Integer questionNoId : map.keySet()){
  117. relationMap.put(questionNoId, statQuestion(map.get(questionNoId)));
  118. }
  119. return relationMap;
  120. }
  121. /**
  122. * 获取当前报告最后一题
  123. * @param userId
  124. * @param userReportId
  125. * @return
  126. */
  127. public UserQuestion getLastByReport(Integer userId, Integer userReportId){
  128. Example example = new Example(UserQuestion.class);
  129. example.and(
  130. example.createCriteria()
  131. .andEqualTo("userId", userId)
  132. .andEqualTo("reportId", userReportId)
  133. );
  134. example.orderBy("id").desc();
  135. return one(userQuestionMapper, example);
  136. }
  137. /**
  138. * 获取报告对应序号题目
  139. * @param userId
  140. * @param userReportId
  141. * @param no
  142. * @return
  143. */
  144. public UserQuestion getByReportAndNo(Integer userId, Integer userReportId, Integer no){
  145. Example example = new Example(UserQuestion.class);
  146. example.and(
  147. example.createCriteria()
  148. .andEqualTo("userId", userId)
  149. .andEqualTo("reportId", userReportId)
  150. .andEqualTo("no", no)
  151. );
  152. return one(userQuestionMapper, example);
  153. }
  154. /**
  155. * 根据用户report创建下一题
  156. * @param report
  157. * @param lastQuestion
  158. * @return
  159. */
  160. public UserQuestion newByReport(UserReport report, UserQuestion lastQuestion){
  161. // 根据report模块获取试题所属模块
  162. QuestionModule module = QuestionModule.WithPaper(PaperModule.ValueOf(report.getPaperModule()));
  163. UserQuestion question = UserQuestion.builder()
  164. .reportId(report.getId())
  165. .questionModule(module.key)
  166. .userId(report.getUserId())
  167. // 添加题目序号
  168. .no(lastQuestion != null ? lastQuestion.getNo() + 1: 1)
  169. .build();
  170. return question;
  171. }
  172. /**
  173. * 获取报告的所有做题记录
  174. * @param userId
  175. * @param userReportId
  176. * @return
  177. */
  178. public List<UserQuestion> listByReport(Integer userId, Integer userReportId){
  179. Example example = new Example(UserQuestion.class);
  180. example.and(
  181. example.createCriteria()
  182. .andEqualTo("userId", userId)
  183. .andEqualTo("reportId", userReportId)
  184. );
  185. example.orderBy("id").asc();
  186. return select(userQuestionMapper, example);
  187. }
  188. /**
  189. * 获取报告固定题目类型做题记录
  190. * @return
  191. */
  192. public List<UserQuestion> listByReportAndType(Integer userId, Integer userReportId, Collection questionTypes){
  193. Example example = new Example(UserQuestion.class);
  194. example.and(
  195. example.createCriteria()
  196. .andEqualTo("userId", userId)
  197. .andEqualTo("reportId", userReportId)
  198. .andIn("questionType", questionTypes)
  199. );
  200. example.orderBy("id").asc();
  201. return select(userQuestionMapper, example);
  202. }
  203. public UserQuestion add(UserQuestion question){
  204. int result = insert(userQuestionMapper, question);
  205. question = one(userQuestionMapper, question.getId());
  206. if(question == null){
  207. throw new SystemException("用户题目添加失败");
  208. }
  209. return question;
  210. }
  211. public UserQuestion edit(UserQuestion question){
  212. UserQuestion in = one(userQuestionMapper, question.getId());
  213. if(in == null){
  214. throw new ParameterException("用户题目不存在");
  215. }
  216. int result = update(userQuestionMapper, question);
  217. return question;
  218. }
  219. public boolean delete(Number id){
  220. UserQuestion in = one(userQuestionMapper, id);
  221. if(in == null){
  222. throw new ParameterException("用户题目不存在");
  223. }
  224. int result = delete(userQuestionMapper, id);
  225. return result > 0;
  226. }
  227. public UserQuestion get(Number id){
  228. UserQuestion in = one(userQuestionMapper, id);
  229. if(in == null){
  230. throw new ParameterException("用户题目不存在");
  231. }
  232. return in;
  233. }
  234. public Page<UserQuestion> select(int page, int pageSize){
  235. return select(userQuestionMapper, page, pageSize);
  236. }
  237. public Page<UserQuestion> select(Integer[] ids){
  238. return page(()->select(userQuestionMapper, ids), 1, ids.length);
  239. }
  240. public List<UserQuestion> select(Collection ids){
  241. return select(userQuestionMapper, ids);
  242. }
  243. }