QuestionController.java 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.Page;
  4. import com.nuliji.tools.*;
  5. import com.nuliji.tools.exception.AuthException;
  6. import com.nuliji.tools.exception.ParameterException;
  7. import com.qxgmat.data.constants.enums.QuestionType;
  8. import com.qxgmat.data.constants.enums.ServiceKey;
  9. import com.qxgmat.data.constants.enums.logic.ExerciseLogic;
  10. import com.qxgmat.data.constants.enums.module.*;
  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.QuestionNoRelation;
  15. import com.qxgmat.data.relation.entity.UserReportRelation;
  16. import com.qxgmat.dto.admin.request.QuestionNoDto;
  17. import com.qxgmat.dto.extend.*;
  18. import com.qxgmat.dto.request.*;
  19. import com.qxgmat.dto.response.*;
  20. import com.qxgmat.help.ShiroHelp;
  21. import com.qxgmat.service.*;
  22. import com.qxgmat.service.extend.*;
  23. import com.qxgmat.service.inline.*;
  24. import io.swagger.annotations.Api;
  25. import io.swagger.annotations.ApiOperation;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.validation.annotation.Validated;
  28. import org.springframework.web.bind.annotation.*;
  29. import javax.servlet.http.HttpSession;
  30. import java.util.*;
  31. import java.util.stream.Collectors;
  32. @RestController
  33. @RequestMapping("/api/question")
  34. @Api(tags = "题目", description = "题目接口")
  35. public class QuestionController {
  36. @Autowired
  37. private ShiroHelp shiroHelp;
  38. @Autowired
  39. private PreviewService previewService;
  40. @Autowired
  41. private ExercisePaperService exercisePaperService;
  42. @Autowired
  43. private ExerciseStructService exerciseStructService;
  44. @Autowired
  45. private ExerciseService exerciseService;
  46. @Autowired
  47. private ExaminationPaperService examinationPaperService;
  48. @Autowired
  49. private ExaminationStructService examinationStructService;
  50. @Autowired
  51. private ExaminationService examinationService;
  52. @Autowired
  53. private QuestionNoService questionNoService;
  54. @Autowired
  55. private QuestionService questionService;
  56. @Autowired
  57. private SentenceQuestionService sentenceQuestionService;
  58. @Autowired
  59. private TextbookQuestionService textbookQuestionService;
  60. @Autowired
  61. private SentencePaperService sentencePaperService;
  62. @Autowired
  63. private TextbookPaperService textbookPaperService;
  64. @Autowired
  65. private TextbookLibraryService textbookLibraryService;
  66. @Autowired
  67. private UserQuestionService userQuestionService;
  68. @Autowired
  69. private UserCollectQuestionService userCollectQuestionService;
  70. @Autowired
  71. private UserNoteQuestionService userNoteQuestionService;
  72. @Autowired
  73. private UserAskQuestionService userAskQuestionService;
  74. @Autowired
  75. private UserCourseService userCourseService;
  76. @Autowired
  77. private UserOrderService userOrderService;
  78. @Autowired
  79. private UserOrderRecordService userOrderRecordService;
  80. @Autowired
  81. private UserReportService userReportService;
  82. @Autowired
  83. private UserPaperService userPaperService;
  84. @Autowired
  85. private UserServiceService userServiceService;
  86. @Autowired
  87. private QuestionFlowService questionFlowService;
  88. @Autowired
  89. private CourseExtendService courseExtendService;
  90. @RequestMapping(value = "/search/stem", method = RequestMethod.GET)
  91. @ApiOperation(value = "搜索题目编号列表:题干搜索", httpMethod = "GET")
  92. public Response<PageMessage<QuestionNoDetailDto>> searchStem(
  93. @RequestParam(required = false, defaultValue = "1") int page,
  94. @RequestParam(required = false, defaultValue = "10") int size,
  95. @RequestParam(required = false) String keyword,
  96. @RequestParam(required = false) String[] questionTypes,
  97. @RequestParam(required = false) String module,
  98. @RequestParam(required = false) Integer[] structIds,
  99. @RequestParam(required = false) String place,
  100. @RequestParam(required = false) String difficult,
  101. @RequestParam(required = false, defaultValue = "id") String order, // collect_number, correct, time, relation_score
  102. @RequestParam(required = false, defaultValue = "desc") String direction,
  103. HttpSession session) {
  104. // 过滤千行cat的数据
  105. List<ExaminationStruct> structs = examinationStructService.main();
  106. ExaminationStruct qxCatStruct = structs.stream().filter((row)-> row.getExtend().equals(ServiceKey.QX_CAT.key)).findFirst().get();
  107. Page<QuestionNoRelation> p = questionNoService.searchStemFulltext(page, size, keyword, questionTypes, module, structIds, place, difficult, qxCatStruct.getId(), order, DirectionStatus.ValueOf(direction));
  108. List<QuestionNoDetailDto> pr = Transform.convert(p, QuestionNoDetailDto.class);
  109. return ResponseHelp.success(pr, page, size, p.getTotal());
  110. }
  111. @RequestMapping(value = "/search/no", method = RequestMethod.GET)
  112. @ApiOperation(value = "搜索题目编号列表:题目编号搜索", httpMethod = "GET")
  113. public Response<PageMessage<QuestionNoDto>> searchNo(
  114. @RequestParam(required = false, defaultValue = "1") int page,
  115. @RequestParam(required = false, defaultValue = "5") int size,
  116. @RequestParam(required = true) String keyword,
  117. HttpSession session) {
  118. // 过滤千行cat的数据
  119. List<ExaminationStruct> structs = examinationStructService.main();
  120. ExaminationStruct qxCatStruct = structs.stream().filter((row)-> row.getExtend().equals(ServiceKey.QX_CAT.key)).findFirst().get();
  121. Page<QuestionNo> p = questionNoService.searchNoFulltext(page, size, keyword, qxCatStruct.getId());
  122. List<QuestionNoDto> pr = Transform.convert(p, QuestionNoDto.class);
  123. return ResponseHelp.success(pr, page, size, p.getTotal());
  124. }
  125. @RequestMapping(value = "/info", method = RequestMethod.GET)
  126. @ApiOperation(value = "获取题目信息", notes = "获取题目信息", httpMethod = "GET")
  127. public Response<UserQuestionDetailDto> info(
  128. @RequestParam(required = true) Integer questionNoId
  129. ) {
  130. User user = (User) shiroHelp.getLoginUser();
  131. QuestionNo questionNo = questionNoService.get(questionNoId);
  132. UserQuestion userQuestion = UserQuestion.builder()
  133. .questionId(questionNo.getQuestionId())
  134. .questionNoId(questionNoId)
  135. .questionModule(QuestionModule.BASE.key)
  136. .build();
  137. UserQuestionDetailDto dto = Transform.convert(userQuestion, UserQuestionDetailDto.class);
  138. Question question = questionService.get(userQuestion.getQuestionId());
  139. dto.setQuestion(Transform.convert(question, QuestionDetailExtendDto.class));
  140. dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
  141. if (user!=null){
  142. UserCollectQuestion collect = userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  143. dto.setCollect(collect != null);
  144. UserNoteQuestion userNoteQuestion = userNoteQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  145. dto.setNote(Transform.convert(userNoteQuestion, UserNoteQuestionExtendDto.class));
  146. }
  147. List<UserAskQuestion> userAskQuestionList = userAskQuestionService.listByQuestion(userQuestion.getQuestionId(), true);
  148. dto.setAsks(Transform.convert(userAskQuestionList, UserAskQuestionExtendDto.class));
  149. if (question.getAssociationContent() != null){
  150. List<QuestionNoRelation> associations = questionNoService.listWithRelationByIds(question.getAssociationContent());
  151. Collection questions = Transform.getIds(associations, QuestionNoRelation.class, "question");
  152. dto.setAssociations(Transform.convert(questions, QuestionBaseExtendDto.class));
  153. }
  154. List<QuestionNo> questionNoList = questionNoService.listByQuestion(userQuestion.getQuestionId());
  155. dto.setQuestionNos(Transform.convert(questionNoList, QuestionNoExtendDto.class));
  156. // 获取提问权限
  157. if (user!= null){
  158. Integer recordId = questionFlowService.questionRelationCourse(user.getId(), null, QuestionType.ValueOf(question.getQuestionType()));
  159. if (recordId != null){
  160. dto.setQuestionStatus(1);
  161. }
  162. }
  163. if(dto.getQuestionStatus() == null){
  164. Integer id = questionNo.getModuleStruct()[questionNo.getModuleStruct().length - 1];
  165. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(questionNo.getModule());
  166. // 获取基本当前权限
  167. switch(questionNoModule){
  168. case EXAMINATION:
  169. ExaminationStruct examinationStruct = examinationStructService.get(id);
  170. dto.setQuestionStatus(examinationStruct.getQuestionStatus());
  171. break;
  172. case EXERCISE:
  173. ExerciseStruct exerciseStruct = exerciseStructService.get(id);
  174. dto.setQuestionStatus(exerciseStruct.getQuestionStatus());
  175. break;
  176. default:
  177. // 自由组卷,不提供提问显示
  178. dto.setQuestionStatus(-1);
  179. }
  180. }
  181. return ResponseHelp.success(dto);
  182. }
  183. @RequestMapping(value = "/exercise/progress", method = RequestMethod.GET)
  184. @ApiOperation(value = "练习进度", httpMethod = "GET")
  185. public Response<List<UserExerciseGroupDto>> exerciseProgress(
  186. @RequestParam(required = true) Integer structId, // 第二层,查询第4层,以及第三层汇总
  187. HttpSession session) {
  188. User user = (User) shiroHelp.getLoginUser();
  189. List<ExerciseStruct> three = exerciseStructService.children(structId, 0);
  190. List<UserExerciseGroupDto> p = new ArrayList<>(three.size());
  191. for(ExerciseStruct struct : three){
  192. UserExerciseGroupDto dto = Transform.convert(struct, UserExerciseGroupDto.class);
  193. // 获取第三层所有题目,并获取题目统计
  194. List<QuestionNo> list = questionNoService.listByStruct(StructModule.EXERCISE, struct.getId());
  195. dto.setStat(questionNoService.statPaper(list));
  196. dto.setQuestionNumber(list.size());
  197. Map<Object, UserQuestionStat> userQuestionStatMap = null;
  198. if(user != null){
  199. Collection questionNoIds = Transform.getIds(list, QuestionNo.class, "id");
  200. List<UserQuestion> userQuestionList = userQuestionService.listByQuestionNo(user.getId(), QuestionModule.BASE, questionNoIds);
  201. userQuestionStatMap = userQuestionService.statQuestionNoMap(userQuestionList);
  202. dto.setUserStat(userQuestionService.statQuestion(userQuestionList));
  203. if (list.size() > userQuestionStatMap.size()){
  204. dto.setUserNumber(userQuestionStatMap.size());
  205. dto.setMinTimes(0);
  206. }else{
  207. int minTimes = 0;
  208. // 统计最小轮的已做题数
  209. for(UserQuestionStat stat : userQuestionStatMap.values()){
  210. if(stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  211. }
  212. int userNumber = 0;
  213. for(UserQuestionStat stat : userQuestionStatMap.values()){
  214. if(stat.getUserNumber() > minTimes) userNumber += 1;
  215. }
  216. dto.setMinTimes(minTimes);
  217. dto.setUserNumber(userNumber);
  218. }
  219. }
  220. // 作文、阅读没有第4层
  221. // 获取第四层节点
  222. List<ExerciseStruct> children = exerciseStructService.children(struct.getId(), 0);
  223. if (children == null || children.size() == 0){
  224. // 以下属的paper作为children
  225. List<ExercisePaper> paperList = exercisePaperService.listByLogic(struct.getId(), 0, ExerciseLogic.NO, null);
  226. List<UserExerciseGroupExtendDto> childrenDtos = new ArrayList<>(paperList.size());
  227. for(ExercisePaper child : paperList){
  228. UserExerciseGroupExtendDto extendDto = new UserExerciseGroupExtendDto();
  229. extendDto.setId(child.getId());
  230. extendDto.setTitle(child.getNo().toString());
  231. extendDto.setQuestionNumber(child.getQuestionNumber());
  232. if(user != null){
  233. int minTimes = 0;
  234. int userQuestionNumber = 0;
  235. boolean flag = true;
  236. for(int questionNoId : child.getQuestionNoIds()){
  237. UserQuestionStat stat = userQuestionStatMap.get(questionNoId);
  238. if (stat == null) {
  239. flag = false;
  240. break;
  241. }
  242. if (stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  243. }
  244. if (!flag) minTimes = 0;
  245. for(int questionNoId : child.getQuestionNoIds()){
  246. UserQuestionStat stat = userQuestionStatMap.get(questionNoId);
  247. if (stat != null && stat.getUserNumber() > minTimes) userQuestionNumber += 1;
  248. }
  249. extendDto.setUserNumber(userQuestionNumber);
  250. extendDto.setMinTimes(minTimes);
  251. }
  252. extendDto.setType("paper");
  253. childrenDtos.add(extendDto);
  254. }
  255. if (user != null){
  256. Collection ids = Transform.getIds(paperList, ExercisePaper.class, "id");
  257. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXERCISE, ids, null);
  258. // 绑定userPaperId,用于关联report
  259. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  260. Transform.combine(childrenDtos, userPaperMap, UserExerciseGroupExtendDto.class, "id", "userPaperId");
  261. // 获取最后一次作业结果
  262. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  263. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  264. Transform.combine(childrenDtos, reportList, UserExerciseGroupExtendDto.class, "userPaperId", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  265. }
  266. dto.setChildren(childrenDtos);
  267. }else{
  268. // 以struct作为children
  269. List<UserExerciseGroupExtendDto> childrenDtos = new ArrayList<>(children.size());
  270. for(ExerciseStruct child : children){
  271. UserExerciseGroupExtendDto extendDto = new UserExerciseGroupExtendDto();
  272. extendDto.setId(child.getId());
  273. extendDto.setTitleEn(child.getTitleEn());
  274. extendDto.setTitleZh(child.getTitleZh());
  275. List<QuestionNo> childQuestionList = list.stream().filter((q)-> Collections.singletonList(q.getModuleStruct()).contains(child.getId().intValue())).collect(Collectors.toList());
  276. extendDto.setQuestionNumber(childQuestionList.size());
  277. if (user != null){
  278. int minTimes = 0;
  279. int userQuestionNumber = 0;
  280. boolean flag = true;
  281. for(QuestionNo questionNo : childQuestionList){
  282. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  283. if (stat == null) {
  284. flag = false;
  285. break;
  286. }
  287. if (stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  288. }
  289. if (!flag) minTimes = 0;
  290. for(QuestionNo questionNo : childQuestionList){
  291. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  292. if (stat != null && stat.getUserNumber() > minTimes) userQuestionNumber += 1;
  293. }
  294. extendDto.setUserNumber(userQuestionNumber);
  295. extendDto.setMinTimes(minTimes);
  296. }
  297. extendDto.setType("struct");
  298. childrenDtos.add(extendDto);
  299. }
  300. dto.setChildren(childrenDtos);
  301. }
  302. p.add(dto);
  303. }
  304. return ResponseHelp.success(p);
  305. }
  306. @RequestMapping(value = "/exercise/place", method = RequestMethod.GET)
  307. @ApiOperation(value = "练习组卷考点分组条件", httpMethod = "GET")
  308. public Response<List<String>> exercisePlace(
  309. @RequestParam(required = true) Integer structId, // 查询第4层
  310. HttpSession session) {
  311. return ResponseHelp.success(exercisePaperService.groupPlace(structId));
  312. }
  313. @RequestMapping(value = "/exercise/list", method = RequestMethod.GET)
  314. @ApiOperation(value = "练习组卷列表", httpMethod = "GET")
  315. public Response<PageMessage<UserExercisePaperDto>> listExercisePaper(
  316. @RequestParam(required = false, defaultValue = "1") int page,
  317. @RequestParam(required = false, defaultValue = "100") int size,
  318. @RequestParam(required = true) Integer structId,
  319. @RequestParam(required = true) String logic,
  320. @RequestParam(required = false) String logicExtend,
  321. @RequestParam(required = false) Integer times,
  322. HttpSession session) {
  323. User user = (User) shiroHelp.getLoginUser();
  324. Page<ExercisePaper> p = exerciseService.list(page, size, structId, user != null ? user.getId():null, ExerciseLogic.ValueOf(logic), logicExtend, times);
  325. List<UserExercisePaperDto> pr = Transform.convert(p, UserExercisePaperDto.class);
  326. // 获取试卷统计信息
  327. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  328. for(ExercisePaper paper : p){
  329. questionNoIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  330. }
  331. Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
  332. Transform.combine(pr, statMap, UserExercisePaperDto.class, "id", "stat");
  333. if (user != null){
  334. // 获取做题记录
  335. Collection ids = Transform.getIds(p, ExercisePaper.class, "id");
  336. List<UserPaper> paperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXERCISE, ids, null);
  337. Transform.combine(pr, paperList, UserExercisePaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  338. // 绑定userPaperId,用于关联report
  339. Map userPaperMap = Transform.getMap(paperList, UserPaper.class, "originId", "id");
  340. Transform.combine(pr, userPaperMap, UserExercisePaperDto.class, "id", "userPaperId");
  341. // 获取最后一次作业结果
  342. Collection paperIds = Transform.getIds(paperList, UserPaper.class, "id");
  343. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  344. Transform.combine(pr, reportList, UserExercisePaperDto.class, "id", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  345. }
  346. return ResponseHelp.success(pr, page, size, p.getTotal());
  347. }
  348. @RequestMapping(value = "/examination/info", method = RequestMethod.GET)
  349. @ApiOperation(value = "模考信息", httpMethod = "GET")
  350. public Response<UserExaminationInfoDto> info(HttpSession session) {
  351. User user = (User) shiroHelp.getLoginUser();
  352. UserExaminationInfoDto dto = new UserExaminationInfoDto();
  353. if (user != null){
  354. UserService userService = userServiceService.getService(user.getId(), ServiceKey.QX_CAT);
  355. dto.setHasService(userService != null);
  356. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), ServiceKey.QX_CAT);
  357. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  358. dto.setReset(userService != null && userService.getIsReset() > 0);
  359. dto.setStartTime(userService!=null ? userService.getStartTime() : null);
  360. dto.setExpireTime(userService != null ? userService.getExpireTime() : null);
  361. dto.setCanReset(examinationService.isFinishCat(user.getId()));
  362. }
  363. return ResponseHelp.success(dto);
  364. }
  365. @RequestMapping(value = "/examination/progress", method = RequestMethod.GET)
  366. @ApiOperation(value = "模考进度", httpMethod = "GET")
  367. public Response<List<UserExaminationGroupDto>> examinationProgress(
  368. @RequestParam(required = true) Integer structId, // 第一层,查询第三层,以及第二层汇总
  369. HttpSession session) {
  370. User user = (User) shiroHelp.getLoginUser();
  371. List<ExaminationStruct> two = examinationStructService.children(structId, 0);
  372. List<UserExaminationGroupDto> p = new ArrayList<>(two.size());
  373. for(ExaminationStruct struct : two){
  374. UserExaminationGroupDto dto = Transform.convert(struct, UserExaminationGroupDto.class);
  375. ServiceKey serviceKey = ServiceKey.ValueOf(struct.getExtend());
  376. dto.setNeedService(serviceKey != null);
  377. dto.setHasService(true);
  378. // 获取第三层节点
  379. // 以下属的paper作为children
  380. List<ExaminationPaper> paperList = examinationPaperService.listByTwo(struct.getId());
  381. dto.setPaperNumber(paperList.size());
  382. dto.setMinTimes(0);
  383. if(user != null){
  384. if (serviceKey != null){
  385. // 服务, 判断对应服务状态
  386. dto.setHasService(userServiceService.hasService(user.getId(), serviceKey));
  387. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), serviceKey);
  388. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  389. }
  390. Collection ids = Transform.getIds(paperList, ExaminationPaper.class, "id");
  391. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXAMINATION, ids, null);
  392. if (paperList.size() > userPaperList.size()){
  393. dto.setUserNumber(userPaperList.size());
  394. dto.setMinTimes(0);
  395. }else{
  396. int minTimes = 0;
  397. // 统计最小轮的已做题数
  398. for(UserPaper userPaper : userPaperList){
  399. if(userPaper.getTimes() < minTimes || minTimes == 0) minTimes = userPaper.getTimes();
  400. }
  401. int userNumber = 0;
  402. for(UserPaper userPaper : userPaperList){
  403. if(userPaper.getTimes() > minTimes) userNumber += 1;
  404. }
  405. dto.setUserNumber(userNumber);
  406. }
  407. }
  408. p.add(dto);
  409. }
  410. return ResponseHelp.success(p);
  411. }
  412. @RequestMapping(value = "/examination/list", method = RequestMethod.GET)
  413. @ApiOperation(value = "模考组卷列表", httpMethod = "GET")
  414. public Response<PageMessage<UserExaminationPaperDto>> examinationPaperList(
  415. @RequestParam(required = false, defaultValue = "1") int page,
  416. @RequestParam(required = false, defaultValue = "100") int size,
  417. @RequestParam(required = true) Integer structId,
  418. @RequestParam(required = false) Integer times,
  419. HttpSession session) {
  420. User user = (User) shiroHelp.getLoginUser();
  421. ExaminationStruct struct = examinationStructService.get(structId);
  422. ServiceKey serviceKey = ServiceKey.ValueOf(struct.getExtend());
  423. if (serviceKey == ServiceKey.QX_CAT){
  424. if (user == null){
  425. throw new ParameterException("请先登录");
  426. }
  427. if (!userServiceService.hasService(user.getId(), serviceKey)){
  428. throw new ParameterException("请先开通模考");
  429. }
  430. }
  431. PageResult<ExaminationPaper> p = examinationService.list(page, size, structId, user != null ? user.getId():null, serviceKey == ServiceKey.QX_CAT && user != null ? user.getQxCat() : null, times);
  432. List<UserExaminationPaperDto> pr = Transform.convert(p, UserExaminationPaperDto.class);
  433. if (user != null){
  434. // 获取做题记录
  435. Collection ids = Transform.getIds(p, ExaminationPaper.class, "id");
  436. List<UserPaper> paperList;
  437. if (serviceKey == ServiceKey.QX_CAT){
  438. // cat模考,根据情况获取对应试题列表
  439. paperList = userPaperService.listWithCat(user.getId(), ids, user.getQxCat());
  440. }else{
  441. paperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXAMINATION, ids, null);
  442. }
  443. Transform.combine(pr, paperList, UserExaminationPaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  444. // 绑定userPaperId,用于关联report
  445. Map userPaperMap = Transform.getMap(paperList, UserPaper.class, "originId", "id");
  446. Transform.combine(pr, userPaperMap, UserExaminationPaperDto.class, "id", "userPaperId");
  447. // 获取最后一次结果
  448. Collection paperIds = Transform.getIds(paperList, UserPaper.class, "id");
  449. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  450. Transform.combine(pr, reportList, UserExaminationPaperDto.class, "id", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  451. if (serviceKey == ServiceKey.QX_CAT && user.getQxCat() > 0){
  452. // 获取上一遍模考成绩
  453. UserService userService = userServiceService.getServiceBase(user.getId(), serviceKey);
  454. if (userService.getIsReset() > 0){
  455. List<UserPaper> prevPaperList = userPaperService.listWithCat(user.getId(), ids, user.getQxCat() - 1);
  456. Transform.combine(pr, prevPaperList, UserExaminationPaperDto.class, "id", "prevPaper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  457. // 绑定userPaperId,用于关联report
  458. Map prevUserPaperMap = Transform.getMap(prevPaperList, UserPaper.class, "originId", "id");
  459. Transform.combine(pr, prevUserPaperMap, UserExaminationPaperDto.class, "id", "prevUserPaperId");
  460. // 获取最后一次结果
  461. Collection prevPaperIds = Transform.getIds(prevPaperList, UserPaper.class, "id");
  462. List<UserReport> prevReportList = userReportService.listWithLastNoReset(prevPaperIds);
  463. Transform.combine(pr, prevReportList, UserExaminationPaperDto.class, "id", "prevReport", UserReport.class, "paperId", UserReportExtendDto.class);
  464. }
  465. }
  466. }
  467. return ResponseHelp.success(pr, page, size, p.getTotal());
  468. }
  469. @RequestMapping(value = "/base", method = RequestMethod.GET)
  470. @ApiOperation(value = "获取题目详情", notes = "根据题目序号获取题目", httpMethod = "GET")
  471. public Response<UserQuestionBaseDto> base(
  472. @RequestParam(required = true) Integer userReportId,
  473. @RequestParam(required = true) Integer no,
  474. @RequestParam(required = false) String stage
  475. ) {
  476. User user = (User) shiroHelp.getLoginUser();
  477. if (user == null) {
  478. throw new AuthException("请先登录");
  479. }
  480. if (no == null || no == 0){
  481. no = 1;
  482. }
  483. UserQuestion userQuestion = userQuestionService.getByReportAndNo(user.getId(), userReportId, no, stage);
  484. UserQuestionBaseDto dto = Transform.convert(userQuestion, UserQuestionBaseDto.class);
  485. return ResponseHelp.success(dto);
  486. }
  487. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  488. @ApiOperation(value = "获取题目详情", notes = "获取题目详情", httpMethod = "GET")
  489. public Response<UserQuestionDetailDto> detail(
  490. @RequestParam(required = true) Integer userQuestionId
  491. ) {
  492. User user = (User) shiroHelp.getLoginUser();
  493. UserQuestion userQuestion = userQuestionService.get(userQuestionId);
  494. UserQuestionDetailDto dto = Transform.convert(userQuestion, UserQuestionDetailDto.class);
  495. UserReport userReport = userReportService.get(userQuestion.getReportId());
  496. dto.setReport(Transform.convert(userReport, UserReportExtendDto.class));
  497. UserPaper userPaper = userPaperService.get(userReport.getPaperId());
  498. dto.setPaper(Transform.convert(userPaper, UserPaperBaseExtendDto.class));
  499. Question question = questionService.get(userQuestion.getQuestionId());
  500. dto.setQuestion(Transform.convert(question, QuestionDetailExtendDto.class));
  501. if (user != null){
  502. UserCollectQuestion collect = userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  503. dto.setCollect(collect != null);
  504. UserNoteQuestion userNoteQuestion = userNoteQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  505. dto.setNote(Transform.convert(userNoteQuestion, UserNoteQuestionExtendDto.class));
  506. }
  507. List<UserAskQuestion> userAskQuestionList = userAskQuestionService.listByQuestion(userQuestion.getQuestionId(), true);
  508. dto.setAsks(Transform.convert(userAskQuestionList, UserAskQuestionExtendDto.class));
  509. if (question.getAssociationContent() != null){
  510. List<QuestionNoRelation> associations = questionNoService.listWithRelationByIds(question.getAssociationContent());
  511. Collection questions = Transform.getIds(associations, QuestionNoRelation.class, "question");
  512. dto.setAssociations(Transform.convert(questions, QuestionBaseExtendDto.class));
  513. }
  514. switch (QuestionModule.ValueOf(userQuestion.getQuestionModule())){
  515. case BASE:
  516. List<QuestionNo> questionNoList = questionNoService.listByQuestion(userQuestion.getQuestionId());
  517. dto.setQuestionNos(Transform.convert(questionNoList, QuestionNoExtendDto.class));
  518. QuestionNo questionNo = questionNoService.get(userQuestion.getQuestionNoId());
  519. dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
  520. break;
  521. case SENTENCE:
  522. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(userQuestion.getQuestionNoId());
  523. dto.setQuestionNo(Transform.convert(sentenceQuestion, QuestionNoExtendDto.class));
  524. break;
  525. case TEXTBOOK:
  526. TextbookQuestion textbookQuestion = textbookQuestionService.get(userQuestion.getQuestionNoId());
  527. dto.setQuestionNo(Transform.convert(textbookQuestion, QuestionNoExtendDto.class));
  528. break;
  529. }
  530. // 获取提问权限
  531. PaperOrigin origin = PaperOrigin.ValueOf(userReport.getPaperOrigin());
  532. if (user != null){
  533. Integer recordId = questionFlowService.questionRelationCourse(user.getId(), origin == PaperOrigin.PREVIEW ? userReport.getOriginId() : null, QuestionType.ValueOf(question.getQuestionType()));
  534. if (recordId != null){
  535. dto.setQuestionStatus(1);
  536. }
  537. }
  538. if (dto.getQuestionStatus() == null){
  539. // 获取基本当前权限
  540. switch(origin){
  541. case EXAMINATION:
  542. ExaminationPaper examinationPaper = examinationPaperService.get(userReport.getOriginId());
  543. ExaminationStruct examinationStruct = examinationStructService.get(examinationPaper.getStructThree());
  544. dto.setQuestionStatus(examinationStruct.getQuestionStatus());
  545. break;
  546. case EXERCISE:
  547. ExercisePaper exercisePaper = exercisePaperService.get(userReport.getOriginId());
  548. ExerciseStruct exerciseStruct = exerciseStructService.get(exercisePaper.getStructFour());
  549. dto.setQuestionStatus(exerciseStruct.getQuestionStatus());
  550. break;
  551. case TEXTBOOK:
  552. TextbookQuestion textbookQuestion = textbookQuestionService.get(userQuestion.getQuestionNoId());
  553. TextbookLibrary textbookLibrary = textbookLibraryService.get(textbookQuestion.getLibraryId());
  554. dto.setQuestionStatus(textbookLibrary.getQuestionStatus());
  555. break;
  556. case PREVIEW:
  557. // 上面questionRelationCourse包括了,不会执行到
  558. default:
  559. // 自由组卷,不提供提问显示
  560. dto.setQuestionStatus(-1);
  561. }
  562. }
  563. return ResponseHelp.success(dto);
  564. }
  565. @RequestMapping(value = "/exercise/paper", method = RequestMethod.GET)
  566. @ApiOperation(value = "获取练习卷", notes = "获取练习卷", httpMethod = "GET")
  567. public Response<PaperBaseDto> detailExercise(
  568. @RequestParam(required = true) Integer paperId
  569. ) {
  570. User user = (User) shiroHelp.getLoginUser();
  571. if (user == null) {
  572. throw new AuthException("请先登录");
  573. }
  574. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.EXERCISE, paperId);
  575. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  576. return ResponseHelp.success(paperDto);
  577. }
  578. @RequestMapping(value = "/examination/paper", method = RequestMethod.GET)
  579. @ApiOperation(value = "获取模考卷", notes = "获取模考卷", httpMethod = "GET")
  580. public Response<PaperBaseDto> detailExamination(
  581. @RequestParam(required = true) Integer paperId
  582. ) {
  583. User user = (User) shiroHelp.getLoginUser();
  584. if (user == null) {
  585. throw new AuthException("请先登录");
  586. }
  587. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.EXAMINATION, paperId);
  588. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  589. return ResponseHelp.success(paperDto);
  590. }
  591. @RequestMapping(value = "/report/base", method = RequestMethod.GET)
  592. @ApiOperation(value = "获取练习记录", notes = "获取练习记录", httpMethod = "GET")
  593. public Response<UserReportBaseDto> baseReport(
  594. @RequestParam(required = true) Integer userReportId
  595. ) {
  596. User user = (User) shiroHelp.getLoginUser();
  597. if (user == null) {
  598. throw new AuthException("请先登录");
  599. }
  600. UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
  601. UserReportBaseDto userReportDto = Transform.convert(report, UserReportBaseDto.class);
  602. return ResponseHelp.success(userReportDto);
  603. }
  604. @RequestMapping(value = "/report/detail", method = RequestMethod.GET)
  605. @ApiOperation(value = "获取练习详细记录", notes = "获取练习卷", httpMethod = "GET")
  606. public Response<UserReportDetailDto> detailReport(
  607. @RequestParam(required = true) Integer userReportId
  608. ) {
  609. User user = (User) shiroHelp.getLoginUser();
  610. if (user == null) {
  611. throw new AuthException("请先登录");
  612. }
  613. UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
  614. UserReportDetailDto userReportDto = Transform.convert(report, UserReportDetailDto.class);
  615. // 用户paper
  616. UserPaper userPaper = userPaperService.get(report.getPaperId());
  617. userReportDto.setPaper(Transform.convert(userPaper, UserPaperBaseExtendDto.class));
  618. return ResponseHelp.success(userReportDto);
  619. }
  620. @RequestMapping(value = "/report/question", method = RequestMethod.GET)
  621. @ApiOperation(value = "获取做题记录", notes = "获取做题记录", httpMethod = "GET")
  622. public Response<List<UserQuestionBaseDto>> detailReportQuestion(
  623. @RequestParam(required = true) Integer userReportId
  624. ) {
  625. User user = (User) shiroHelp.getLoginUser();
  626. if (user == null) {
  627. throw new AuthException("请先登录");
  628. }
  629. List<UserQuestion> p = questionFlowService.listByReport(user.getId(), userReportId);
  630. List<UserQuestionBaseDto> pr = Transform.convert(p, UserQuestionBaseDto.class);
  631. Collection questionIds = Transform.getIds(p, UserQuestion.class, "questionId");
  632. List<UserCollectQuestion> userCollectQuestionList = userCollectQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  633. Map collectMap = Transform.getMap(userCollectQuestionList, UserCollectQuestion.class, "questionId", "id");
  634. List<UserNoteQuestion> userNoteQuestionList = userNoteQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  635. Map noteMap = Transform.getMap(userNoteQuestionList, UserNoteQuestion.class, "questionId", "id");
  636. for(UserQuestionBaseDto dto : pr){
  637. dto.setCollect(collectMap.containsKey(dto.getQuestionId()));
  638. dto.setNote(noteMap.containsKey(dto.getQuestionId()));
  639. }
  640. // 绑定题目信息
  641. List<Question> questionList = questionService.select(questionIds);
  642. Transform.combine(pr, questionList, UserQuestionBaseDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  643. List<UserQuestionBaseDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
  644. Collection baseQuestionNoIds = Transform.getIds(basePr, UserQuestionBaseDto.class, "questionNoId");
  645. List<QuestionNo> baseQuestionNoList = questionNoService.select(baseQuestionNoIds);
  646. Transform.combine(basePr, baseQuestionNoList, UserQuestionBaseDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  647. List<UserQuestionBaseDto> sentencePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.SENTENCE.key)).collect(Collectors.toList());
  648. Collection sentenceQuestionNoIds = Transform.getIds(sentencePr, UserQuestionBaseDto.class, "questionNoId");
  649. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(sentenceQuestionNoIds);
  650. Transform.combine(sentencePr, sentenceQuestionList, UserQuestionBaseDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  651. List<UserQuestionBaseDto> textbookPr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.TEXTBOOK.key)).collect(Collectors.toList());
  652. Collection textbookQuestionNoIds = Transform.getIds(textbookPr, UserQuestionBaseDto.class, "questionNoId");
  653. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(textbookQuestionNoIds);
  654. Transform.combine(textbookPr, textbookQuestionList, UserQuestionBaseDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  655. return ResponseHelp.success(pr);
  656. }
  657. @RequestMapping(value = "/examination/start", method = RequestMethod.POST)
  658. @ApiOperation(value = "开始: 模考", notes = "提交考试设置", httpMethod = "POST")
  659. public Response<UserReportBaseDto> startExamination(@RequestBody @Validated ExaminationStartDto dto) {
  660. User user = (User) shiroHelp.getLoginUser();
  661. if (user == null) {
  662. throw new AuthException("请先登录");
  663. }
  664. // 判断是否是cat模考,并且有模考权限
  665. ExaminationPaper examinationPaper = examinationPaperService.get(dto.getPaperId());
  666. if(examinationService.isCat(examinationPaper)){
  667. UserService userService = userServiceService.getService(user.getId(), ServiceKey.QX_CAT);
  668. if (userService== null){
  669. throw new ParameterException("请先开通模考");
  670. }
  671. }
  672. JSONObject setting = new JSONObject();
  673. setting.put("disorder", dto.getDisorder());
  674. setting.put("order", dto.getOrder());
  675. UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXAMINATION, dto.getPaperId(), setting);
  676. return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
  677. }
  678. @RequestMapping(value = "/exercise/start", method = RequestMethod.POST)
  679. @ApiOperation(value = "开始: 练习", notes = "提交考试设置", httpMethod = "POST")
  680. public Response<UserReportBaseDto> startExercise(@RequestBody @Validated ExerciseStartDto dto) {
  681. User user = (User) shiroHelp.getLoginUser();
  682. if (user == null) {
  683. throw new AuthException("请先登录");
  684. }
  685. JSONObject setting = new JSONObject();
  686. setting.put("disorder", dto.getDisorder());
  687. UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXERCISE, dto.getPaperId(), setting);
  688. return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
  689. }
  690. @RequestMapping(value = "/preview/start", method = RequestMethod.POST)
  691. @ApiOperation(value = "开始: 预习作业", notes = "提交考试设置", httpMethod = "POST")
  692. public Response<UserReportBaseDto> startPreview(@RequestBody @Validated PreviewStartDto dto) {
  693. User user = (User) shiroHelp.getLoginUser();
  694. if (user == null) {
  695. throw new AuthException("请先登录");
  696. }
  697. JSONObject setting = new JSONObject();
  698. setting.put("disorder", dto.getDisorder());
  699. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.PREVIEW, dto.getPaperId(), setting);
  700. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  701. return ResponseHelp.success(userReportBaseDto);
  702. }
  703. @RequestMapping(value = "/textbook/paper", method = RequestMethod.GET)
  704. @ApiOperation(value = "获取机经练习卷", notes = "获取练习卷", httpMethod = "GET")
  705. public Response<PaperBaseDto> detailTextbookPaper(
  706. @RequestParam(required = true) Integer paperId
  707. ) {
  708. User user = (User) shiroHelp.getLoginUser();
  709. if (user == null) {
  710. throw new AuthException("请先登录");
  711. }
  712. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.TEXTBOOK, paperId);
  713. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  714. return ResponseHelp.success(paperDto);
  715. }
  716. @RequestMapping(value = "/textbook/start", method = RequestMethod.POST)
  717. @ApiOperation(value = "开始: 机经", notes = "提交考试设置", httpMethod = "POST")
  718. public Response<UserReportBaseDto> startTextbook(@RequestBody @Validated TextbookStartDto dto) {
  719. User user = (User) shiroHelp.getLoginUser();
  720. if (user == null) {
  721. throw new AuthException("请先登录");
  722. }
  723. JSONObject setting = new JSONObject();
  724. setting.put("disorder", dto.getDisorder());
  725. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.TEXTBOOK, dto.getPaperId(), setting);
  726. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  727. return ResponseHelp.success(userReportBaseDto);
  728. }
  729. @RequestMapping(value = "/sentence/paper", method = RequestMethod.GET)
  730. @ApiOperation(value = "获取长难句练习卷", notes = "获取练习卷", httpMethod = "GET")
  731. public Response<PaperBaseDto> detailSentencePaper(
  732. @RequestParam(required = true) Integer paperId
  733. ) {
  734. User user = (User) shiroHelp.getLoginUser();
  735. if (user == null) {
  736. throw new AuthException("请先登录");
  737. }
  738. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.SENTENCE, paperId);
  739. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  740. return ResponseHelp.success(paperDto);
  741. }
  742. @RequestMapping(value = "/sentence/start", method = RequestMethod.POST)
  743. @ApiOperation(value = "开始: 长难句", notes = "提交考试设置", httpMethod = "POST")
  744. public Response<UserReportBaseDto> startSentence(@RequestBody @Validated SentenceStartDto dto) {
  745. User user = (User) shiroHelp.getLoginUser();
  746. if (user == null) {
  747. throw new AuthException("请先登录");
  748. }
  749. JSONObject setting = new JSONObject();
  750. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.SENTENCE, dto.getPaperId(), setting);
  751. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  752. return ResponseHelp.success(userReportBaseDto);
  753. }
  754. @RequestMapping(value = "/error/paper", method = RequestMethod.GET)
  755. @ApiOperation(value = "获取错题组卷", notes = "获取错题组卷", httpMethod = "GET")
  756. public Response<PaperBaseDto> detailError(
  757. @RequestParam(required = true) Integer paperId
  758. ) {
  759. User user = (User) shiroHelp.getLoginUser();
  760. if (user == null) {
  761. throw new AuthException("请先登录");
  762. }
  763. UserPaper paper = userPaperService.get(paperId);
  764. if (!paper.getPaperOrigin().equals(PaperOrigin.ERROR.key)){
  765. throw new ParameterException("试卷不存在");
  766. }
  767. if (!paper.getUserId().equals(user.getId())){
  768. throw new ParameterException("试卷不存在");
  769. }
  770. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  771. return ResponseHelp.success(paperDto);
  772. }
  773. @RequestMapping(value = "/error/start", method = RequestMethod.POST)
  774. @ApiOperation(value = "开始: 错题组卷", notes = "提交考试设置", httpMethod = "POST")
  775. public Response<UserReportBaseDto> startError(@RequestBody @Validated PreviewStartDto dto) {
  776. User user = (User) shiroHelp.getLoginUser();
  777. if (user == null) {
  778. throw new AuthException("请先登录");
  779. }
  780. JSONObject setting = new JSONObject();
  781. setting.put("disorder", dto.getDisorder());
  782. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.ERROR, dto.getPaperId(), setting);
  783. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  784. return ResponseHelp.success(userReportBaseDto);
  785. }
  786. @RequestMapping(value = "/collect/paper", method = RequestMethod.GET)
  787. @ApiOperation(value = "获取收藏组卷", notes = "获取收藏组卷", httpMethod = "GET")
  788. public Response<PaperBaseDto> detailCollect(
  789. @RequestParam(required = true) Integer paperId
  790. ) {
  791. User user = (User) shiroHelp.getLoginUser();
  792. if (user == null) {
  793. throw new AuthException("请先登录");
  794. }
  795. UserPaper paper = userPaperService.get(paperId);
  796. if (!paper.getPaperOrigin().equals(PaperOrigin.COLLECT.key)){
  797. throw new ParameterException("试卷不存在");
  798. }
  799. if (!paper.getUserId().equals(user.getId())){
  800. throw new ParameterException("试卷不存在");
  801. }
  802. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  803. return ResponseHelp.success(paperDto);
  804. }
  805. @RequestMapping(value = "/collect/start", method = RequestMethod.POST)
  806. @ApiOperation(value = "开始: 收藏组卷", notes = "提交考试设置", httpMethod = "POST")
  807. public Response<UserReportBaseDto> startCollect(@RequestBody @Validated PreviewStartDto dto) {
  808. User user = (User) shiroHelp.getLoginUser();
  809. if (user == null) {
  810. throw new AuthException("请先登录");
  811. }
  812. JSONObject setting = new JSONObject();
  813. setting.put("disorder", dto.getDisorder());
  814. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.COLLECT, dto.getPaperId(), setting);
  815. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  816. return ResponseHelp.success(userReportBaseDto);
  817. }
  818. @RequestMapping(value = "/continue", method = RequestMethod.POST)
  819. @ApiOperation(value = "继续做题", notes = "获取报告信息", httpMethod = "POST")
  820. public Response<UserReportBaseDto> continueReport(@RequestBody @Validated ReportContinueDto dto) {
  821. User user = (User) shiroHelp.getLoginUser();
  822. if (user == null) {
  823. throw new AuthException("请先登录");
  824. }
  825. UserReportRelation report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
  826. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  827. return ResponseHelp.success(userReportBaseDto);
  828. }
  829. @RequestMapping(value = "/next", method = RequestMethod.POST)
  830. @ApiOperation(value = "获取下一题", notes = "获取下一题", httpMethod = "POST")
  831. public Response<UserQuestionBaseDto> next(@RequestBody @Validated ReportNextDto dto) {
  832. User user = (User) shiroHelp.getLoginUser();
  833. if (user == null) {
  834. throw new AuthException("请先登录");
  835. }
  836. UserQuestion userQuestion = questionFlowService.next(user.getId(), dto.getUserReportId());
  837. if (userQuestion == null) {
  838. throw new ParameterException("finish");
  839. }
  840. UserQuestionBaseDto baseDto = Transform.convert(userQuestion, UserQuestionBaseDto.class);
  841. // 绑定question
  842. baseDto.setQuestion(Transform.convert(questionService.get(userQuestion.getQuestionId()), QuestionBaseExtendDto.class));
  843. // 绑定questionNo
  844. baseDto.setQuestionNo(Transform.convert(questionNoService.get(userQuestion.getQuestionNoId()), QuestionNoExtendDto.class));
  845. // 绑定collect
  846. baseDto.setCollect(userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId()) != null);
  847. return ResponseHelp.success(baseDto);
  848. }
  849. @RequestMapping(value = "/submit", method = RequestMethod.POST)
  850. @ApiOperation(value = "提交题目答案", notes = "提交题目", httpMethod = "POST")
  851. public Response<Boolean> submit(@RequestBody @Validated QuestionSubmitDto dto) {
  852. User user = (User) shiroHelp.getLoginUser();
  853. if (user == null) {
  854. throw new AuthException("请先登录");
  855. }
  856. UserQuestion userQuestion = userQuestionService.get(dto.getUserQuestionId());
  857. if (userQuestion == null){
  858. throw new ParameterException("做题不存在");
  859. }
  860. userQuestion.setUserTime(dto.getTime());
  861. userQuestion.setUserAnswer(JSONObject.parseObject(JSONObject.toJSONString(dto.getAnswer())));
  862. userQuestion.setSetting(JSONObject.parseObject(JSONObject.toJSONString(dto.getSetting())));
  863. Boolean result = questionFlowService.submit(user.getId(), userQuestion);
  864. return ResponseHelp.success(result);
  865. }
  866. @RequestMapping(value = "/finish", method = RequestMethod.POST)
  867. @ApiOperation(value = "完成考试", notes = "完成考试", httpMethod = "POST")
  868. public Response<Boolean> finish(@RequestBody @Validated ReportFinishDto dto) {
  869. User user = (User) shiroHelp.getLoginUser();
  870. if (user == null) {
  871. throw new AuthException("请先登录");
  872. }
  873. Boolean result = questionFlowService.finish(user.getId(), dto.getUserReportId());
  874. return ResponseHelp.success(result);
  875. }
  876. @RequestMapping(value = "/stage", method = RequestMethod.POST)
  877. @ApiOperation(value = "本阶段完成", notes = "结束当前阶段: 达到阶段时间时调用,然后继续调用next", httpMethod = "POST")
  878. public Response<Boolean> stage(@RequestBody @Validated ReportStageDto dto) {
  879. User user = (User) shiroHelp.getLoginUser();
  880. if (user == null) {
  881. throw new AuthException("请先登录");
  882. }
  883. Boolean result = questionFlowService.stage(user.getId(), dto.getUserReportId());
  884. return ResponseHelp.success(result);
  885. }
  886. @RequestMapping(value = "/restart/paper", method = RequestMethod.POST)
  887. @ApiOperation(value = "重置考试", notes = "重置考试", httpMethod = "POST")
  888. public Response<Boolean> restart(@RequestBody @Validated PaperRestartDto dto) {
  889. User user = (User) shiroHelp.getLoginUser();
  890. if (user == null) {
  891. throw new AuthException("请先登录");
  892. }
  893. questionFlowService.restart(dto.getUserPaperId(), user.getId());
  894. return ResponseHelp.success(true);
  895. }
  896. @RequestMapping(value = "/reset/cat", method = RequestMethod.POST)
  897. @ApiOperation(value = "重置整套模拟卷", notes = "重置考试", httpMethod = "POST")
  898. public Response<Boolean> resetCat() {
  899. User user = (User) shiroHelp.getLoginUser();
  900. if (user == null) {
  901. throw new AuthException("请先登录");
  902. }
  903. UserService userService = userServiceService.getServiceBase(user.getId(), ServiceKey.QX_CAT);
  904. if (userService == null){
  905. throw new ParameterException("无重置权限");
  906. }
  907. if (userService.getIsReset() > 0){
  908. throw new ParameterException("已重置,请再次购买服务");
  909. }
  910. // reset当前考卷的所有状态
  911. examinationService.resetCat(user.getId(), false);
  912. userServiceService.edit(UserService.builder().id(userService.getId()).isReset(1).build());
  913. return ResponseHelp.success(true);
  914. }
  915. }