UserQuestionService.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. * @param IInitQuestion
  159. * @return
  160. */
  161. public UserQuestion addByReport(UserReport report, UserQuestion lastQuestion, InitQuestion IInitQuestion){
  162. // 根据report模块获取试题所属模块
  163. QuestionModule module = QuestionModule.WithPaper(PaperModule.ValueOf(report.getPaperModule()));
  164. UserQuestion question = UserQuestion.builder()
  165. .reportId(report.getId())
  166. .questionModule(module.key)
  167. .userId(report.getUserId())
  168. // 添加题目序号
  169. .no(lastQuestion != null ? lastQuestion.getNo() + 1: 1)
  170. .build();
  171. // 回调,根据模块更新设置
  172. boolean result = IInitQuestion.callback(question, report, lastQuestion);
  173. if (!result) {
  174. // 做题结束
  175. return null;
  176. }
  177. return add(question);
  178. }
  179. /**
  180. * 获取报告的所有做题记录
  181. * @param userId
  182. * @param userReportId
  183. * @return
  184. */
  185. public List<UserQuestion> listByReport(Integer userId, Integer userReportId){
  186. Example example = new Example(UserQuestion.class);
  187. example.and(
  188. example.createCriteria()
  189. .andEqualTo("userId", userId)
  190. .andEqualTo("reportId", userReportId)
  191. );
  192. example.orderBy("id").asc();
  193. return select(userQuestionMapper, example);
  194. }
  195. /**
  196. * 获取报告固定题目类型做题记录
  197. * @return
  198. */
  199. public List<UserQuestion> listByReportAndType(Integer userId, Integer userReportId, Collection questionTypes){
  200. Example example = new Example(UserQuestion.class);
  201. example.and(
  202. example.createCriteria()
  203. .andEqualTo("userId", userId)
  204. .andEqualTo("reportId", userReportId)
  205. .andIn("questionType", questionTypes)
  206. );
  207. example.orderBy("id").asc();
  208. return select(userQuestionMapper, example);
  209. }
  210. public UserQuestion add(UserQuestion question){
  211. int result = insert(userQuestionMapper, question);
  212. question = one(userQuestionMapper, question.getId());
  213. if(question == null){
  214. throw new SystemException("用户题目添加失败");
  215. }
  216. return question;
  217. }
  218. public UserQuestion edit(UserQuestion question){
  219. UserQuestion in = one(userQuestionMapper, question.getId());
  220. if(in == null){
  221. throw new ParameterException("用户题目不存在");
  222. }
  223. int result = update(userQuestionMapper, question);
  224. return question;
  225. }
  226. public boolean delete(Number id){
  227. UserQuestion in = one(userQuestionMapper, id);
  228. if(in == null){
  229. throw new ParameterException("用户题目不存在");
  230. }
  231. int result = delete(userQuestionMapper, id);
  232. return result > 0;
  233. }
  234. public UserQuestion get(Number id){
  235. UserQuestion in = one(userQuestionMapper, id);
  236. if(in == null){
  237. throw new ParameterException("用户题目不存在");
  238. }
  239. return in;
  240. }
  241. public Page<UserQuestion> select(int page, int pageSize){
  242. return select(userQuestionMapper, page, pageSize);
  243. }
  244. public List<UserQuestion> select(Collection ids){
  245. return select(userQuestionMapper, ids);
  246. }
  247. public List<UserQuestion> select(Integer[] ids){
  248. return select(userQuestionMapper, ids);
  249. }
  250. }