TextbookController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package com.qxgmat.controller.api;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.*;
  4. import com.nuliji.tools.exception.AuthException;
  5. import com.nuliji.tools.exception.ParameterException;
  6. import com.qxgmat.data.constants.enums.QuestionSubject;
  7. import com.qxgmat.data.constants.enums.QuestionType;
  8. import com.qxgmat.data.constants.enums.ServiceKey;
  9. import com.qxgmat.data.constants.enums.logic.TextbookLogic;
  10. import com.qxgmat.data.constants.enums.module.PaperOrigin;
  11. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  12. import com.qxgmat.data.dao.entity.*;
  13. import com.qxgmat.data.inline.UserQuestionStat;
  14. import com.qxgmat.data.relation.entity.TextbookQuestionRelation;
  15. import com.qxgmat.dto.extend.UserPaperBaseExtendDto;
  16. import com.qxgmat.dto.extend.UserReportExtendDto;
  17. import com.qxgmat.dto.extend.UserServiceRecordExtendDto;
  18. import com.qxgmat.dto.extend.UserTextbookGroupExtendDto;
  19. import com.qxgmat.dto.response.UserTextbookGroupDto;
  20. import com.qxgmat.dto.response.UserTextbookInfoDto;
  21. import com.qxgmat.dto.response.UserTextbookPaperDto;
  22. import com.qxgmat.help.ShiroHelp;
  23. import com.qxgmat.service.UserPaperService;
  24. import com.qxgmat.service.UserQuestionService;
  25. import com.qxgmat.service.UserServiceService;
  26. import com.qxgmat.service.UsersService;
  27. import com.qxgmat.service.extend.QuestionFlowService;
  28. import com.qxgmat.service.inline.*;
  29. import io.swagger.annotations.Api;
  30. import io.swagger.annotations.ApiOperation;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.web.bind.annotation.*;
  33. import javax.servlet.http.HttpSession;
  34. import java.text.DateFormat;
  35. import java.text.ParseException;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. @RestController
  39. @RequestMapping("/api/textbook")
  40. @Api(tags = "机经", description = "机经接口")
  41. public class TextbookController
  42. {
  43. @Autowired
  44. private ShiroHelp shiroHelp;
  45. @Autowired
  46. private QuestionService questionService;
  47. @Autowired
  48. private SettingService settingService;
  49. @Autowired
  50. private UsersService usersService;
  51. @Autowired
  52. private UserPaperService userPaperService;
  53. @Autowired
  54. private UserQuestionService userQuestionService;
  55. @Autowired
  56. private UserReportService userReportService;
  57. @Autowired
  58. private UserServiceService userServiceService;
  59. @Autowired
  60. private UserOrderRecordService userOrderRecordService;
  61. @Autowired
  62. private QuestionFlowService questionFlowService;
  63. @Autowired
  64. private TextbookPaperService textbookPaperService;
  65. @Autowired
  66. private TextbookQuestionService textbookQuestionService;
  67. @Autowired
  68. private TextbookLibraryService textbookLibraryService;
  69. @Autowired
  70. private TextbookLibraryHistoryService textbookLibraryHistoryService;
  71. @Autowired
  72. private TextbookTopicService textbookTopicService;
  73. @RequestMapping(value = "/progress", method = RequestMethod.GET)
  74. @ApiOperation(value = "机经进度", httpMethod = "GET")
  75. public Response<List<UserTextbookGroupDto>> progress(HttpSession session) {
  76. User user = (User) shiroHelp.getLoginUser();
  77. TextbookLibrary latest = textbookLibraryService.getLatest();
  78. TextbookLibrary second = textbookLibraryService.getSecond();
  79. List<UserTextbookGroupDto> p = new ArrayList<>(2);
  80. for(TextbookLibrary library : new ArrayList<TextbookLibrary>(2){{add(latest);add(second);}}){
  81. UserTextbookGroupDto dto = Transform.convert(library, UserTextbookGroupDto.class);
  82. dto.setIsLatest(library.getEndDate() == null ? 1 : 0);
  83. dto.setNeedService(library.getEndDate() == null);
  84. dto.setHasService(true);
  85. // 获取第三层所有题目,并获取题目统计
  86. List<TextbookQuestion> list = textbookQuestionService.listByLibrary(library.getId());
  87. List<TextbookQuestionRelation> relations = textbookQuestionService.relation(list);
  88. dto.setStat(textbookQuestionService.statPaper(list));
  89. dto.setQuestionNumber(list.size());
  90. Map<Object, UserQuestionStat> userQuestionStatMap = null;
  91. if(user != null){
  92. if (dto.getNeedService()){
  93. dto.setHasService(userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK));
  94. // 服务, 判断对应服务状态
  95. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), ServiceKey.TEXTBOOK);
  96. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  97. }
  98. Collection questionNoIds = Transform.getIds(list, QuestionNo.class, "id");
  99. List<UserQuestion> userQuestionList = userQuestionService.listByQuestionNo(user.getId(), questionNoIds);
  100. userQuestionStatMap = userQuestionService.statQuestionNoMap(userQuestionList);
  101. dto.setUserStat(userQuestionService.statQuestion(userQuestionList));
  102. if (list.size() > userQuestionStatMap.size()){
  103. dto.setUserNumber(userQuestionStatMap.size());
  104. dto.setMinTimes(0);
  105. }else{
  106. int minTimes = 0;
  107. // 统计最小轮的已做题数
  108. for(UserQuestionStat stat : userQuestionStatMap.values()){
  109. if(stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  110. }
  111. int userNumber = 0;
  112. for(UserQuestionStat stat : userQuestionStatMap.values()){
  113. if(stat.getUserNumber() > minTimes) userNumber += 1;
  114. }
  115. dto.setMinTimes(minTimes);
  116. dto.setUserNumber(userNumber);
  117. }
  118. }
  119. List<UserTextbookGroupExtendDto> childrenDtos = new ArrayList<>(TextbookLogic.all().length);
  120. for(TextbookLogic logic : TextbookLogic.all()){
  121. UserTextbookGroupExtendDto extendDto = new UserTextbookGroupExtendDto();
  122. extendDto.setLogic(logic.key);
  123. extendDto.setTitle(logic.key.toUpperCase());
  124. List<TextbookQuestionRelation> childQuestionList = relations.stream().filter((q)-> logic.contain(QuestionType.ValueOf(q.getQuestion().getQuestionType()))).collect(Collectors.toList());
  125. extendDto.setQuestionNumber(childQuestionList.size());
  126. if (user != null){
  127. int minTimes = 0;
  128. int userQuestionNumber = 0;
  129. boolean flag = true;
  130. for(TextbookQuestion questionNo : childQuestionList){
  131. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  132. if (stat == null) {
  133. flag = false;
  134. break;
  135. }
  136. if (stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  137. }
  138. if (!flag) minTimes = 0;
  139. for(TextbookQuestion questionNo : childQuestionList){
  140. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  141. if (stat != null && stat.getUserNumber() > minTimes) userQuestionNumber += 1;
  142. }
  143. extendDto.setUserNumber(userQuestionNumber);
  144. extendDto.setMinTimes(minTimes);
  145. }
  146. childrenDtos.add(extendDto);
  147. }
  148. dto.setChildren(childrenDtos);
  149. p.add(dto);
  150. }
  151. return ResponseHelp.success(p);
  152. }
  153. @RequestMapping(value = "/info", method = RequestMethod.GET)
  154. @ApiOperation(value = "机经信息", httpMethod = "GET")
  155. public Response<UserTextbookInfoDto> info(HttpSession session) {
  156. User user = (User) shiroHelp.getLoginUser();
  157. UserTextbookInfoDto dto = new UserTextbookInfoDto();
  158. TextbookLibrary latest = textbookLibraryService.getLatest();
  159. dto.setLatest(latest);
  160. if (user != null){
  161. dto.setHasService(userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK));
  162. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), ServiceKey.TEXTBOOK);
  163. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  164. }
  165. TextbookLibrary second = textbookLibraryService.getSecond();
  166. dto.setSecond(second);
  167. return ResponseHelp.success(dto);
  168. }
  169. @RequestMapping(value = "/year", method = RequestMethod.GET)
  170. @ApiOperation(value = "机经年度更新信息", httpMethod = "GET")
  171. public Response<List<TextbookLibrary>> year(
  172. @RequestParam(required = false) String year,
  173. HttpSession session) {
  174. Date start;
  175. try {
  176. start = DateFormat.getDateInstance().parse(String.format("%s-01-01", year));
  177. } catch (ParseException e) {
  178. throw new ParameterException("日期格式错误");
  179. }
  180. Date end = Tools.addYear(start, 1);
  181. List<TextbookLibrary> libraryList = textbookLibraryService.listByTime(start, end);
  182. return ResponseHelp.success(libraryList);
  183. }
  184. @RequestMapping(value = "/history/all", method = RequestMethod.GET)
  185. @ApiOperation(value = "机经更新记录", httpMethod = "GET")
  186. public Response<List<TextbookLibraryHistory>> listHistory(
  187. @RequestParam(required = true) String subject,
  188. HttpSession session) {
  189. User user = (User) shiroHelp.getLoginUser();
  190. if (user == null){
  191. throw new AuthException("请先登录");
  192. }
  193. if (!userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
  194. throw new ParameterException("没有机经查看权限");
  195. }
  196. if (QuestionSubject.ValueOf(subject) == null){
  197. throw new ParameterException("科目错误");
  198. }
  199. TextbookLibrary library = textbookLibraryService.getLatest();
  200. List<TextbookLibraryHistory> p = textbookLibraryHistoryService.allByLibraryAndSubject(library.getId(), QuestionSubject.ValueOf(subject));
  201. return ResponseHelp.success(p);
  202. }
  203. @RequestMapping(value = "/topic/list", method = RequestMethod.GET)
  204. @ApiOperation(value = "机经列表", httpMethod = "GET")
  205. public Response<PageMessage<TextbookTopic>> listTopic(
  206. @RequestParam(required = false, defaultValue = "1") int page,
  207. @RequestParam(required = false, defaultValue = "100") int size,
  208. @RequestParam(required = true) boolean latest,
  209. @RequestParam(required = true) String subject,
  210. @RequestParam(required = false) String[] qualitys,
  211. @RequestParam(required = false) Boolean isOld,
  212. @RequestParam(required = false, defaultValue = "id") String order,
  213. @RequestParam(required = false, defaultValue = "desc") String direction,
  214. HttpSession session) {
  215. TextbookLibrary library;
  216. if (latest){
  217. User user = (User) shiroHelp.getLoginUser();
  218. if (user == null){
  219. throw new AuthException("请先登录");
  220. }
  221. if (!userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
  222. throw new ParameterException("没有机经查看权限");
  223. }
  224. library = textbookLibraryService.getLatest();
  225. }else{
  226. // 获取往期:倒数第二
  227. library = textbookLibraryService.getSecond();
  228. }
  229. Page<TextbookTopic> p = textbookTopicService.list(page, size, library.getId(), QuestionSubject.ValueOf(subject), qualitys, isOld, order, DirectionStatus.ValueOf(direction));
  230. return ResponseHelp.success(p, page, size, p.getTotal());
  231. }
  232. @RequestMapping(value = "/paper/list", method = RequestMethod.GET)
  233. @ApiOperation(value = "机经组卷列表", httpMethod = "GET")
  234. public Response<List<UserTextbookPaperDto>> listPaper(
  235. @RequestParam(required = false, defaultValue = "1") int page,
  236. @RequestParam(required = false, defaultValue = "100") int size,
  237. @RequestParam(required = true) boolean latest,
  238. @RequestParam(required = true) String logic,
  239. @RequestParam(required = false) Integer times,
  240. HttpSession session) {
  241. User user = (User) shiroHelp.getLoginUser();
  242. TextbookLibrary library;
  243. if (latest){
  244. if (user == null){
  245. throw new AuthException("请先登录");
  246. }
  247. if (!userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
  248. throw new ParameterException("没有机经查看权限");
  249. }
  250. library = textbookLibraryService.getLatest();
  251. }else{
  252. // 获取往期:倒数第二
  253. library = textbookLibraryService.getSecond();
  254. }
  255. List<TextbookPaper> p = textbookPaperService.list(page, size, library.getId(), user != null ? user.getId():null, TextbookLogic.ValueOf(logic), times);
  256. List<UserTextbookPaperDto> pr = Transform.convert(p, UserTextbookPaperDto.class);
  257. // 获取试卷统计信息
  258. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  259. for(TextbookPaper paper : p){
  260. questionNoIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  261. }
  262. Map statMap = textbookQuestionService.statPaperMap(questionNoIdsMap);
  263. Transform.combine(pr, statMap, UserTextbookPaperDto.class, "id", "stat");
  264. if (user != null){
  265. // 获取做题记录
  266. Collection ids = Transform.getIds(p, TextbookPaper.class, "id");
  267. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.TEXTBOOK, ids, null);
  268. Transform.combine(pr, userPaperList, UserTextbookPaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  269. // 绑定userPaperId,用于关联report
  270. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  271. Transform.combine(pr, userPaperMap, UserTextbookPaperDto.class, "id", "userPaperId");
  272. // 获取最后一次作业结果
  273. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  274. List<UserReport> reportList = userReportService.listWithLater(paperIds);
  275. Transform.combine(pr, reportList, UserTextbookPaperDto.class, "userPaperId", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  276. }
  277. return ResponseHelp.success(pr);
  278. }
  279. }