QuestionController.java 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  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. User user = (User) shiroHelp.getLoginUser();
  105. // 过滤千行cat的数据
  106. // List<ExaminationStruct> structs = examinationStructService.main();
  107. // ExaminationStruct qxCatStruct = structs.stream().filter((row)-> row.getExtend().equals(ServiceKey.QX_CAT.key)).findFirst().get();
  108. Page<QuestionNoRelation> p = questionNoService.searchStemFulltext(page, size, keyword, questionTypes, module, structIds, place, difficult, null, order, DirectionStatus.ValueOf(direction));
  109. List<QuestionNoDetailDto> pr = Transform.convert(p, QuestionNoDetailDto.class);
  110. if(user!= null){
  111. Collection questionIds = Transform.getIds(p, QuestionNoRelation.class, "questionId");
  112. List<UserCollectQuestion> userCollectQuestionList = userCollectQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  113. Map collectMap = Transform.getMap(userCollectQuestionList, UserCollectQuestion.class, "questionId", "id");
  114. List<UserNoteQuestion> userNoteQuestionList = userNoteQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  115. Map noteMap = Transform.getMap(userNoteQuestionList, UserNoteQuestion.class, "questionId", "id");
  116. for(QuestionNoDetailDto dto : pr){
  117. dto.setCollect(collectMap.containsKey(dto.getQuestionId()));
  118. dto.setNote(noteMap.containsKey(dto.getQuestionId()));
  119. }
  120. }
  121. return ResponseHelp.success(pr, page, size, p.getTotal());
  122. }
  123. @RequestMapping(value = "/search/no", method = RequestMethod.GET)
  124. @ApiOperation(value = "搜索题目编号列表:题目编号搜索", httpMethod = "GET")
  125. public Response<PageMessage<QuestionNoDto>> searchNo(
  126. @RequestParam(required = false, defaultValue = "1") int page,
  127. @RequestParam(required = false, defaultValue = "5") int size,
  128. @RequestParam(required = true) String keyword,
  129. @RequestParam(required = false) String module,
  130. HttpSession session) {
  131. // 过滤千行cat的数据
  132. // List<ExaminationStruct> structs = examinationStructService.main();
  133. // ExaminationStruct qxCatStruct = structs.stream().filter((row)-> row.getExtend().equals(ServiceKey.QX_CAT.key)).findFirst().get();
  134. Page<QuestionNo> p = questionNoService.searchNoFulltext(page, size, keyword, module, null);
  135. List<QuestionNoDto> pr = Transform.convert(p, QuestionNoDto.class);
  136. return ResponseHelp.success(pr, page, size, p.getTotal());
  137. }
  138. @RequestMapping(value = "/info", method = RequestMethod.GET)
  139. @ApiOperation(value = "获取题目信息", notes = "获取题目信息", httpMethod = "GET")
  140. public Response<UserQuestionDetailDto> info(
  141. @RequestParam(required = true) Integer questionNoId
  142. ) {
  143. User user = (User) shiroHelp.getLoginUser();
  144. QuestionNo questionNo = questionNoService.get(questionNoId);
  145. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(questionNo.getModule());
  146. QuestionModule module = QuestionModule.WithQuestionNo(questionNoModule);
  147. UserQuestion userQuestion = UserQuestion.builder()
  148. .questionId(questionNo.getQuestionId())
  149. .questionNoId(questionNoId)
  150. .questionModule(module.key)
  151. .build();
  152. UserQuestionDetailDto dto = Transform.convert(userQuestion, UserQuestionDetailDto.class);
  153. dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
  154. Question question = questionService.get(userQuestion.getQuestionId());
  155. dto.setQuestion(Transform.convert(question, QuestionDetailExtendDto.class));
  156. if (user!=null){
  157. UserCollectQuestion collect = userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  158. dto.setCollect(collect != null);
  159. UserNoteQuestion userNoteQuestion = userNoteQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  160. dto.setNote(Transform.convert(userNoteQuestion, UserNoteQuestionExtendDto.class));
  161. }
  162. List<UserAskQuestion> userAskQuestionList = userAskQuestionService.listByQuestion(userQuestion.getQuestionId(), true);
  163. dto.setAsks(Transform.convert(userAskQuestionList, UserAskQuestionExtendDto.class));
  164. if (question.getAssociationContent() != null){
  165. List<QuestionNoRelation> associations = questionNoService.listWithRelationByIds(question.getAssociationContent());
  166. Collection questions = Transform.getIds(associations, QuestionNoRelation.class, "question");
  167. dto.setAssociations(Transform.convert(questions, QuestionBaseExtendDto.class));
  168. }
  169. List<QuestionNo> questionNoList = questionNoService.listByQuestion(userQuestion.getQuestionId());
  170. dto.setQuestionNos(Transform.convert(questionNoList, QuestionNoExtendDto.class));
  171. // 获取提问权限
  172. if (user!= null){
  173. Integer recordId = questionFlowService.questionRelationCourse(user.getId(), null, QuestionType.ValueOf(question.getQuestionType()));
  174. if (recordId != null){
  175. dto.setQuestionStatus(1);
  176. }
  177. }
  178. if(dto.getQuestionStatus() == null){
  179. dto.setQuestionStatus(questionFlowService.questionStatus(questionNo));
  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. Integer start = 0;
  228. for(ExercisePaper child : paperList){
  229. UserExerciseGroupExtendDto extendDto = new UserExerciseGroupExtendDto();
  230. extendDto.setId(child.getId());
  231. if (child.getQuestionNumber() > 1){
  232. extendDto.setTitle((start+1) + "-"+(start+child.getQuestionNumber()));
  233. start += child.getQuestionNumber();
  234. }else{
  235. extendDto.setTitle(child.getNo().toString());
  236. }
  237. extendDto.setQuestionNumber(child.getQuestionNumber());
  238. if(user != null){
  239. int minTimes = 0;
  240. int userQuestionNumber = 0;
  241. boolean flag = true;
  242. for(int questionNoId : child.getQuestionNoIds()){
  243. UserQuestionStat stat = userQuestionStatMap.get(questionNoId);
  244. if (stat == null) {
  245. flag = false;
  246. break;
  247. }
  248. if (stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  249. }
  250. if (!flag) minTimes = 0;
  251. for(int questionNoId : child.getQuestionNoIds()){
  252. UserQuestionStat stat = userQuestionStatMap.get(questionNoId);
  253. if (stat != null && stat.getUserNumber() > minTimes) userQuestionNumber += 1;
  254. }
  255. extendDto.setUserNumber(userQuestionNumber);
  256. extendDto.setMinTimes(minTimes);
  257. }
  258. extendDto.setType("paper");
  259. childrenDtos.add(extendDto);
  260. }
  261. if (user != null){
  262. Collection ids = Transform.getIds(paperList, ExercisePaper.class, "id");
  263. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXERCISE, ids, null);
  264. // 绑定userPaperId,用于关联report
  265. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  266. Transform.combine(childrenDtos, userPaperMap, UserExerciseGroupExtendDto.class, "id", "userPaperId");
  267. // 获取最后一次作业结果
  268. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  269. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  270. Transform.combine(childrenDtos, reportList, UserExerciseGroupExtendDto.class, "userPaperId", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  271. }
  272. dto.setChildren(childrenDtos);
  273. }else{
  274. // 以struct作为children
  275. List<UserExerciseGroupExtendDto> childrenDtos = new ArrayList<>(children.size());
  276. for(ExerciseStruct child : children){
  277. UserExerciseGroupExtendDto extendDto = new UserExerciseGroupExtendDto();
  278. extendDto.setId(child.getId());
  279. extendDto.setTitleEn(child.getTitleEn());
  280. extendDto.setTitleZh(child.getTitleZh());
  281. List<QuestionNo> childQuestionList = list.stream().filter((q)-> Arrays.stream(q.getModuleStruct()).filter((r)->r==child.getId()).count()>0).collect(Collectors.toList());
  282. extendDto.setQuestionNumber(childQuestionList.size());
  283. if (user != null){
  284. int minTimes = 0;
  285. int userQuestionNumber = 0;
  286. boolean flag = true;
  287. for(QuestionNo questionNo : childQuestionList){
  288. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  289. if (stat == null) {
  290. flag = false;
  291. break;
  292. }
  293. if (stat.getUserNumber() < minTimes || minTimes == 0) minTimes = stat.getUserNumber();
  294. }
  295. if (!flag) minTimes = 0;
  296. for(QuestionNo questionNo : childQuestionList){
  297. UserQuestionStat stat = userQuestionStatMap.get(questionNo.getId());
  298. if (stat != null && stat.getUserNumber() > minTimes) userQuestionNumber += 1;
  299. }
  300. extendDto.setUserNumber(userQuestionNumber);
  301. extendDto.setMinTimes(minTimes);
  302. }
  303. extendDto.setType("struct");
  304. childrenDtos.add(extendDto);
  305. }
  306. dto.setChildren(childrenDtos);
  307. }
  308. p.add(dto);
  309. }
  310. return ResponseHelp.success(p);
  311. }
  312. @RequestMapping(value = "/exercise/place", method = RequestMethod.GET)
  313. @ApiOperation(value = "练习组卷考点分组条件", httpMethod = "GET")
  314. public Response<List<String>> exercisePlace(
  315. @RequestParam(required = true) Integer structId, // 查询第4层
  316. HttpSession session) {
  317. return ResponseHelp.success(exercisePaperService.groupPlace(structId));
  318. }
  319. @RequestMapping(value = "/exercise/list", method = RequestMethod.GET)
  320. @ApiOperation(value = "练习组卷列表", httpMethod = "GET")
  321. public Response<PageMessage<UserExercisePaperDto>> listExercisePaper(
  322. @RequestParam(required = false, defaultValue = "1") int page,
  323. @RequestParam(required = false, defaultValue = "100") int size,
  324. @RequestParam(required = true) Integer structId,
  325. @RequestParam(required = true) String logic,
  326. @RequestParam(required = false) String logicExtend,
  327. @RequestParam(required = false) Integer times,
  328. HttpSession session) {
  329. User user = (User) shiroHelp.getLoginUser();
  330. Page<ExercisePaper> p = exerciseService.list(page, size, structId, user != null ? user.getId():null, ExerciseLogic.ValueOf(logic), logicExtend, times);
  331. List<UserExercisePaperDto> pr = Transform.convert(p, UserExercisePaperDto.class);
  332. // 获取试卷统计信息
  333. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  334. for(ExercisePaper paper : p){
  335. questionNoIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  336. }
  337. Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
  338. Transform.combine(pr, statMap, UserExercisePaperDto.class, "id", "stat");
  339. if (user != null){
  340. // 获取做题记录
  341. Collection ids = Transform.getIds(p, ExercisePaper.class, "id");
  342. List<UserPaper> paperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXERCISE, ids, null);
  343. Transform.combine(pr, paperList, UserExercisePaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  344. // 绑定userPaperId,用于关联report
  345. Map userPaperMap = Transform.getMap(paperList, UserPaper.class, "originId", "id");
  346. Transform.combine(pr, userPaperMap, UserExercisePaperDto.class, "id", "userPaperId");
  347. // 获取最后一次作业结果
  348. Collection paperIds = Transform.getIds(paperList, UserPaper.class, "id");
  349. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  350. Transform.combine(pr, reportList, UserExercisePaperDto.class, "userPaperId", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  351. }
  352. return ResponseHelp.success(pr, page, size, p.getTotal());
  353. }
  354. @RequestMapping(value = "/examination/info", method = RequestMethod.GET)
  355. @ApiOperation(value = "模考信息", httpMethod = "GET")
  356. public Response<UserExaminationInfoDto> info(HttpSession session) {
  357. User user = (User) shiroHelp.getLoginUser();
  358. UserExaminationInfoDto dto = new UserExaminationInfoDto();
  359. if (user != null){
  360. UserService userService = userServiceService.getService(user.getId(), ServiceKey.QX_CAT);
  361. dto.setHasService(userService != null);
  362. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), ServiceKey.QX_CAT);
  363. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  364. dto.setReset(userService != null && userService.getIsReset() > 0);
  365. dto.setStartTime(userService!=null ? userService.getStartTime() : null);
  366. dto.setExpireTime(userService != null ? userService.getExpireTime() : null);
  367. dto.setCanReset(examinationService.isFinishCat(user.getId()));
  368. }
  369. return ResponseHelp.success(dto);
  370. }
  371. @RequestMapping(value = "/examination/progress", method = RequestMethod.GET)
  372. @ApiOperation(value = "模考进度", httpMethod = "GET")
  373. public Response<List<UserExaminationGroupDto>> examinationProgress(
  374. @RequestParam(required = true) Integer structId, // 第一层,查询第三层,以及第二层汇总
  375. HttpSession session) {
  376. User user = (User) shiroHelp.getLoginUser();
  377. List<ExaminationStruct> two = examinationStructService.children(structId, 0);
  378. List<UserExaminationGroupDto> p = new ArrayList<>(two.size());
  379. for(ExaminationStruct struct : two){
  380. UserExaminationGroupDto dto = Transform.convert(struct, UserExaminationGroupDto.class);
  381. ServiceKey serviceKey = ServiceKey.ValueOf(struct.getExtend());
  382. dto.setNeedService(serviceKey != null);
  383. dto.setHasService(true);
  384. // 获取第三层节点
  385. // 以下属的paper作为children
  386. List<ExaminationPaper> paperList = examinationPaperService.listByTwo(struct.getId());
  387. dto.setPaperNumber(paperList.size());
  388. dto.setMinTimes(0);
  389. if(user != null){
  390. if (serviceKey != null){
  391. // 服务, 判断对应服务状态
  392. UserService userService = userServiceService.getService(user.getId(), serviceKey);
  393. dto.setHasService(userService!= null);
  394. dto.setExpireTime(userService != null ? userService.getExpireTime() : null);
  395. UserOrderRecord record = userOrderRecordService.getUnUseService(user.getId(), serviceKey);
  396. dto.setUnUseRecord(Transform.convert(record, UserServiceRecordExtendDto.class));
  397. }
  398. Collection ids = Transform.getIds(paperList, ExaminationPaper.class, "id");
  399. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXAMINATION, ids, null);
  400. userPaperList = userPaperList.stream().filter((q)-> q.getFinishTimes()>0).collect(Collectors.toList());
  401. if (paperList.size() > userPaperList.size()){
  402. dto.setUserNumber(userPaperList.size());
  403. dto.setMinTimes(0);
  404. }else{
  405. int minTimes = 0;
  406. // 统计最小轮的已做题数
  407. for(UserPaper userPaper : userPaperList){
  408. if(userPaper.getFinishTimes() < minTimes || minTimes == 0) minTimes = userPaper.getFinishTimes();
  409. }
  410. int userNumber = 0;
  411. for(UserPaper userPaper : userPaperList){
  412. if(userPaper.getFinishTimes() > minTimes) userNumber += 1;
  413. }
  414. dto.setUserNumber(userNumber);
  415. }
  416. }
  417. p.add(dto);
  418. }
  419. return ResponseHelp.success(p);
  420. }
  421. @RequestMapping(value = "/examination/list", method = RequestMethod.GET)
  422. @ApiOperation(value = "模考组卷列表", httpMethod = "GET")
  423. public Response<PageMessage<UserExaminationPaperDto>> examinationPaperList(
  424. @RequestParam(required = false, defaultValue = "1") int page,
  425. @RequestParam(required = false, defaultValue = "100") int size,
  426. @RequestParam(required = true) Integer structId,
  427. @RequestParam(required = false) Integer times,
  428. HttpSession session) {
  429. User user = (User) shiroHelp.getLoginUser();
  430. ExaminationStruct struct = examinationStructService.get(structId);
  431. ServiceKey serviceKey = ServiceKey.ValueOf(struct.getExtend());
  432. if (serviceKey == ServiceKey.QX_CAT){
  433. if (user == null){
  434. throw new ParameterException("请先登录");
  435. }
  436. if (!userServiceService.hasService(user.getId(), serviceKey)){
  437. throw new ParameterException("请先开通模考");
  438. }
  439. }
  440. PageResult<ExaminationPaper> p = examinationService.list(page, size, structId, user != null ? user.getId():null, serviceKey == ServiceKey.QX_CAT && user != null ? user.getQxCat() : null, times);
  441. List<UserExaminationPaperDto> pr = Transform.convert(p, UserExaminationPaperDto.class);
  442. if (user != null){
  443. // 获取做题记录
  444. Collection ids = Transform.getIds(p, ExaminationPaper.class, "id");
  445. List<UserPaper> paperList;
  446. if (serviceKey == ServiceKey.QX_CAT){
  447. // cat模考,根据情况获取对应试题列表
  448. paperList = userPaperService.listWithCat(user.getId(), ids, user.getQxCat());
  449. }else{
  450. paperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.EXAMINATION, ids, null);
  451. }
  452. Transform.combine(pr, paperList, UserExaminationPaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  453. // 绑定userPaperId,用于关联report
  454. Map userPaperMap = Transform.getMap(paperList, UserPaper.class, "originId", "id");
  455. Transform.combine(pr, userPaperMap, UserExaminationPaperDto.class, "id", "userPaperId");
  456. // 获取最后一次结果
  457. Collection paperIds = Transform.getIds(paperList, UserPaper.class, "id");
  458. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  459. Transform.combine(pr, reportList, UserExaminationPaperDto.class, "id", "report", UserReport.class, "originId", UserReportExtendDto.class);
  460. if (serviceKey == ServiceKey.QX_CAT && user.getQxCat() > 0){
  461. // 获取上一遍模考成绩
  462. UserService userService = userServiceService.getServiceBase(user.getId(), serviceKey);
  463. if (userService.getIsReset() > 0){
  464. List<UserPaper> prevPaperList = userPaperService.listWithCat(user.getId(), ids, user.getQxCat() - 1);
  465. Transform.combine(pr, prevPaperList, UserExaminationPaperDto.class, "id", "prevPaper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  466. // 绑定userPaperId,用于关联report
  467. Map prevUserPaperMap = Transform.getMap(prevPaperList, UserPaper.class, "originId", "id");
  468. Transform.combine(pr, prevUserPaperMap, UserExaminationPaperDto.class, "id", "prevUserPaperId");
  469. // 获取最后一次结果
  470. Collection prevPaperIds = Transform.getIds(prevPaperList, UserPaper.class, "id");
  471. List<UserReport> prevReportList = userReportService.listWithLastNoReset(prevPaperIds);
  472. Transform.combine(pr, prevReportList, UserExaminationPaperDto.class, "id", "prevReport", UserReport.class, "paperId", UserReportExtendDto.class);
  473. }
  474. }
  475. }
  476. return ResponseHelp.success(pr, page, size, p.getTotal());
  477. }
  478. @RequestMapping(value = "/base", method = RequestMethod.GET)
  479. @ApiOperation(value = "获取题目详情", notes = "根据题目序号获取题目", httpMethod = "GET")
  480. public Response<UserQuestionBaseDto> base(
  481. @RequestParam(required = true) Integer userReportId,
  482. @RequestParam(required = true) Integer no,
  483. @RequestParam(required = false) String stage
  484. ) {
  485. User user = (User) shiroHelp.getLoginUser();
  486. if (user == null) {
  487. throw new AuthException("请先登录");
  488. }
  489. if (no == null || no == 0){
  490. no = 1;
  491. }
  492. UserQuestion userQuestion = userQuestionService.getByReportAndNo(user.getId(), userReportId, no, stage);
  493. UserQuestionBaseDto dto = Transform.convert(userQuestion, UserQuestionBaseDto.class);
  494. return ResponseHelp.success(dto);
  495. }
  496. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  497. @ApiOperation(value = "获取题目详情", notes = "获取题目详情", httpMethod = "GET")
  498. public Response<UserQuestionDetailDto> detail(
  499. @RequestParam(required = true) Integer userQuestionId
  500. ) {
  501. User user = (User) shiroHelp.getLoginUser();
  502. UserQuestion userQuestion = userQuestionService.get(userQuestionId);
  503. UserQuestionDetailDto dto = Transform.convert(userQuestion, UserQuestionDetailDto.class);
  504. UserReport userReport = userReportService.get(userQuestion.getReportId());
  505. dto.setReport(Transform.convert(userReport, UserReportExtendDto.class));
  506. UserPaper userPaper = userPaperService.get(userReport.getPaperId());
  507. dto.setPaper(Transform.convert(userPaper, UserPaperBaseExtendDto.class));
  508. Question question = questionService.get(userQuestion.getQuestionId());
  509. dto.setQuestion(Transform.convert(question, QuestionDetailExtendDto.class));
  510. if (user != null){
  511. UserCollectQuestion collect = userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  512. dto.setCollect(collect != null);
  513. UserNoteQuestion userNoteQuestion = userNoteQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId());
  514. dto.setNote(Transform.convert(userNoteQuestion, UserNoteQuestionExtendDto.class));
  515. }
  516. List<UserAskQuestion> userAskQuestionList = userAskQuestionService.listByQuestion(userQuestion.getQuestionId(), true);
  517. dto.setAsks(Transform.convert(userAskQuestionList, UserAskQuestionExtendDto.class));
  518. if (question.getAssociationContent() != null){
  519. List<QuestionNoRelation> associations = questionNoService.listWithRelationByIds(question.getAssociationContent());
  520. Collection questions = Transform.getIds(associations, QuestionNoRelation.class, "question");
  521. dto.setAssociations(Transform.convert(questions, QuestionBaseExtendDto.class));
  522. }
  523. List<QuestionNo> questionNoList = questionNoService.listByQuestion(userQuestion.getQuestionId());
  524. dto.setQuestionNos(Transform.convert(questionNoList, QuestionNoExtendDto.class));
  525. QuestionNo questionNo = questionNoService.get(userQuestion.getQuestionNoId());
  526. dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
  527. // 获取提问权限
  528. PaperOrigin origin = PaperOrigin.ValueOf(userReport.getPaperOrigin());
  529. if (user != null){
  530. Integer recordId = questionFlowService.questionRelationCourse(user.getId(), origin == PaperOrigin.PREVIEW ? userReport.getOriginId() : null, QuestionType.ValueOf(question.getQuestionType()));
  531. if (recordId != null){
  532. dto.setQuestionStatus(1);
  533. }
  534. }
  535. if(dto.getQuestionStatus() == null){
  536. dto.setQuestionStatus(questionFlowService.questionStatus(questionNo));
  537. }
  538. return ResponseHelp.success(dto);
  539. }
  540. @RequestMapping(value = "/exercise/paper", method = RequestMethod.GET)
  541. @ApiOperation(value = "获取练习卷", notes = "获取练习卷", httpMethod = "GET")
  542. public Response<PaperBaseDto> detailExercise(
  543. @RequestParam(required = true) Integer paperId
  544. ) {
  545. User user = (User) shiroHelp.getLoginUser();
  546. if (user == null) {
  547. throw new AuthException("请先登录");
  548. }
  549. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.EXERCISE, paperId);
  550. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  551. return ResponseHelp.success(paperDto);
  552. }
  553. @RequestMapping(value = "/examination/paper", method = RequestMethod.GET)
  554. @ApiOperation(value = "获取模考卷", notes = "获取模考卷", httpMethod = "GET")
  555. public Response<PaperBaseDto> detailExamination(
  556. @RequestParam(required = true) Integer paperId
  557. ) {
  558. User user = (User) shiroHelp.getLoginUser();
  559. if (user == null) {
  560. throw new AuthException("请先登录");
  561. }
  562. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.EXAMINATION, paperId);
  563. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  564. return ResponseHelp.success(paperDto);
  565. }
  566. @RequestMapping(value = "/report/base", method = RequestMethod.GET)
  567. @ApiOperation(value = "获取练习记录", notes = "获取练习记录", httpMethod = "GET")
  568. public Response<UserReportBaseDto> baseReport(
  569. @RequestParam(required = true) Integer userReportId
  570. ) {
  571. User user = (User) shiroHelp.getLoginUser();
  572. if (user == null) {
  573. throw new AuthException("请先登录");
  574. }
  575. UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
  576. UserReportBaseDto userReportDto = Transform.convert(report, UserReportBaseDto.class);
  577. return ResponseHelp.success(userReportDto);
  578. }
  579. @RequestMapping(value = "/report/detail", method = RequestMethod.GET)
  580. @ApiOperation(value = "获取练习详细记录", notes = "获取练习卷", httpMethod = "GET")
  581. public Response<UserReportDetailDto> detailReport(
  582. @RequestParam(required = true) Integer userReportId
  583. ) {
  584. User user = (User) shiroHelp.getLoginUser();
  585. if (user == null) {
  586. throw new AuthException("请先登录");
  587. }
  588. UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
  589. UserReportDetailDto userReportDto = Transform.convert(report, UserReportDetailDto.class);
  590. // 用户paper
  591. UserPaper userPaper = userPaperService.get(report.getPaperId());
  592. userReportDto.setPaper(Transform.convert(userPaper, UserPaperBaseExtendDto.class));
  593. return ResponseHelp.success(userReportDto);
  594. }
  595. @RequestMapping(value = "/report/question", method = RequestMethod.GET)
  596. @ApiOperation(value = "获取做题记录", notes = "获取做题记录", httpMethod = "GET")
  597. public Response<List<UserQuestionBaseDto>> detailReportQuestion(
  598. @RequestParam(required = true) Integer userReportId
  599. ) {
  600. User user = (User) shiroHelp.getLoginUser();
  601. if (user == null) {
  602. throw new AuthException("请先登录");
  603. }
  604. List<UserQuestion> p = questionFlowService.listByReport(user.getId(), userReportId);
  605. List<UserQuestionBaseDto> pr = Transform.convert(p, UserQuestionBaseDto.class);
  606. Collection questionIds = Transform.getIds(p, UserQuestion.class, "questionId");
  607. List<UserCollectQuestion> userCollectQuestionList = userCollectQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  608. Map collectMap = Transform.getMap(userCollectQuestionList, UserCollectQuestion.class, "questionId", "id");
  609. List<UserNoteQuestion> userNoteQuestionList = userNoteQuestionService.listByUserAndQuestions(user.getId(), questionIds);
  610. Map noteMap = Transform.getMap(userNoteQuestionList, UserNoteQuestion.class, "questionId", "id");
  611. for(UserQuestionBaseDto dto : pr){
  612. dto.setCollect(collectMap.containsKey(dto.getQuestionId()));
  613. dto.setNote(noteMap.containsKey(dto.getQuestionId()));
  614. }
  615. // 绑定题目信息
  616. List<Question> questionList = questionService.select(questionIds);
  617. Transform.combine(pr, questionList, UserQuestionBaseDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  618. Collection questionNoIds = Transform.getIds(pr, UserQuestionBaseDto.class, "questionNoId");
  619. List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
  620. Transform.combine(pr, questionNoList, UserQuestionBaseDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  621. return ResponseHelp.success(pr);
  622. }
  623. @RequestMapping(value = "/examination/start", method = RequestMethod.POST)
  624. @ApiOperation(value = "开始: 模考", notes = "提交考试设置", httpMethod = "POST")
  625. public Response<UserReportBaseDto> startExamination(@RequestBody @Validated ExaminationStartDto dto) {
  626. User user = (User) shiroHelp.getLoginUser();
  627. if (user == null) {
  628. throw new AuthException("请先登录");
  629. }
  630. // 判断是否是cat模考,并且有模考权限
  631. ExaminationPaper examinationPaper = examinationPaperService.get(dto.getPaperId());
  632. if(examinationService.isCat(examinationPaper)){
  633. UserService userService = userServiceService.getService(user.getId(), ServiceKey.QX_CAT);
  634. if (userService== null){
  635. throw new ParameterException("请先开通模考");
  636. }
  637. }
  638. JSONObject setting = new JSONObject();
  639. setting.put("disorder", dto.getDisorder());
  640. setting.put("order", dto.getOrder());
  641. UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXAMINATION, dto.getPaperId(), setting);
  642. return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
  643. }
  644. @RequestMapping(value = "/exercise/start", method = RequestMethod.POST)
  645. @ApiOperation(value = "开始: 练习", notes = "提交考试设置", httpMethod = "POST")
  646. public Response<UserReportBaseDto> startExercise(@RequestBody @Validated ExerciseStartDto dto) {
  647. User user = (User) shiroHelp.getLoginUser();
  648. if (user == null) {
  649. throw new AuthException("请先登录");
  650. }
  651. JSONObject setting = new JSONObject();
  652. setting.put("disorder", dto.getDisorder());
  653. UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXERCISE, dto.getPaperId(), setting);
  654. return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
  655. }
  656. @RequestMapping(value = "/preview/start", method = RequestMethod.POST)
  657. @ApiOperation(value = "开始: 预习作业", notes = "提交考试设置", httpMethod = "POST")
  658. public Response<UserReportBaseDto> startPreview(@RequestBody @Validated PreviewStartDto dto) {
  659. User user = (User) shiroHelp.getLoginUser();
  660. if (user == null) {
  661. throw new AuthException("请先登录");
  662. }
  663. JSONObject setting = new JSONObject();
  664. setting.put("disorder", dto.getDisorder());
  665. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.PREVIEW, dto.getPaperId(), setting);
  666. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  667. return ResponseHelp.success(userReportBaseDto);
  668. }
  669. @RequestMapping(value = "/textbook/paper", method = RequestMethod.GET)
  670. @ApiOperation(value = "获取机经练习卷", notes = "获取练习卷", httpMethod = "GET")
  671. public Response<PaperBaseDto> detailTextbookPaper(
  672. @RequestParam(required = true) Integer paperId
  673. ) {
  674. User user = (User) shiroHelp.getLoginUser();
  675. if (user == null) {
  676. throw new AuthException("请先登录");
  677. }
  678. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.TEXTBOOK, paperId);
  679. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  680. return ResponseHelp.success(paperDto);
  681. }
  682. @RequestMapping(value = "/textbook/start", method = RequestMethod.POST)
  683. @ApiOperation(value = "开始: 机经", notes = "提交考试设置", httpMethod = "POST")
  684. public Response<UserReportBaseDto> startTextbook(@RequestBody @Validated TextbookStartDto dto) {
  685. User user = (User) shiroHelp.getLoginUser();
  686. if (user == null) {
  687. throw new AuthException("请先登录");
  688. }
  689. JSONObject setting = new JSONObject();
  690. setting.put("disorder", dto.getDisorder());
  691. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.TEXTBOOK, dto.getPaperId(), setting);
  692. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  693. return ResponseHelp.success(userReportBaseDto);
  694. }
  695. @RequestMapping(value = "/sentence/paper", method = RequestMethod.GET)
  696. @ApiOperation(value = "获取长难句练习卷", notes = "获取练习卷", httpMethod = "GET")
  697. public Response<PaperBaseDto> detailSentencePaper(
  698. @RequestParam(required = true) Integer paperId
  699. ) {
  700. User user = (User) shiroHelp.getLoginUser();
  701. if (user == null) {
  702. throw new AuthException("请先登录");
  703. }
  704. UserPaper paper = questionFlowService.paper(user.getId(), PaperOrigin.SENTENCE, paperId);
  705. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  706. return ResponseHelp.success(paperDto);
  707. }
  708. @RequestMapping(value = "/sentence/start", method = RequestMethod.POST)
  709. @ApiOperation(value = "开始: 长难句", notes = "提交考试设置", httpMethod = "POST")
  710. public Response<UserReportBaseDto> startSentence(@RequestBody @Validated SentenceStartDto dto) {
  711. User user = (User) shiroHelp.getLoginUser();
  712. if (user == null) {
  713. throw new AuthException("请先登录");
  714. }
  715. JSONObject setting = new JSONObject();
  716. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.SENTENCE, dto.getPaperId(), setting);
  717. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  718. return ResponseHelp.success(userReportBaseDto);
  719. }
  720. @RequestMapping(value = "/error/paper", method = RequestMethod.GET)
  721. @ApiOperation(value = "获取错题组卷", notes = "获取错题组卷", httpMethod = "GET")
  722. public Response<PaperBaseDto> detailError(
  723. @RequestParam(required = true) Integer paperId
  724. ) {
  725. User user = (User) shiroHelp.getLoginUser();
  726. if (user == null) {
  727. throw new AuthException("请先登录");
  728. }
  729. UserPaper paper = userPaperService.get(paperId);
  730. if (!paper.getPaperOrigin().equals(PaperOrigin.ERROR.key)){
  731. throw new ParameterException("试卷不存在");
  732. }
  733. if (!paper.getUserId().equals(user.getId())){
  734. throw new ParameterException("试卷不存在");
  735. }
  736. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  737. return ResponseHelp.success(paperDto);
  738. }
  739. @RequestMapping(value = "/error/start", method = RequestMethod.POST)
  740. @ApiOperation(value = "开始: 错题组卷", notes = "提交考试设置", httpMethod = "POST")
  741. public Response<UserReportBaseDto> startError(@RequestBody @Validated PreviewStartDto dto) {
  742. User user = (User) shiroHelp.getLoginUser();
  743. if (user == null) {
  744. throw new AuthException("请先登录");
  745. }
  746. JSONObject setting = new JSONObject();
  747. setting.put("disorder", dto.getDisorder());
  748. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.ERROR, dto.getPaperId(), setting);
  749. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  750. return ResponseHelp.success(userReportBaseDto);
  751. }
  752. @RequestMapping(value = "/collect/paper", method = RequestMethod.GET)
  753. @ApiOperation(value = "获取收藏组卷", notes = "获取收藏组卷", httpMethod = "GET")
  754. public Response<PaperBaseDto> detailCollect(
  755. @RequestParam(required = true) Integer paperId
  756. ) {
  757. User user = (User) shiroHelp.getLoginUser();
  758. if (user == null) {
  759. throw new AuthException("请先登录");
  760. }
  761. UserPaper paper = userPaperService.get(paperId);
  762. if (!paper.getPaperOrigin().equals(PaperOrigin.COLLECT.key)){
  763. throw new ParameterException("试卷不存在");
  764. }
  765. if (!paper.getUserId().equals(user.getId())){
  766. throw new ParameterException("试卷不存在");
  767. }
  768. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  769. return ResponseHelp.success(paperDto);
  770. }
  771. @RequestMapping(value = "/collect/start", method = RequestMethod.POST)
  772. @ApiOperation(value = "开始: 收藏组卷", notes = "提交考试设置", httpMethod = "POST")
  773. public Response<UserReportBaseDto> startCollect(@RequestBody @Validated PreviewStartDto dto) {
  774. User user = (User) shiroHelp.getLoginUser();
  775. if (user == null) {
  776. throw new AuthException("请先登录");
  777. }
  778. JSONObject setting = new JSONObject();
  779. setting.put("disorder", dto.getDisorder());
  780. UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.COLLECT, dto.getPaperId(), setting);
  781. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  782. return ResponseHelp.success(userReportBaseDto);
  783. }
  784. @RequestMapping(value = "/continue", method = RequestMethod.POST)
  785. @ApiOperation(value = "继续做题", notes = "获取报告信息", httpMethod = "POST")
  786. public Response<UserReportBaseDto> continueReport(@RequestBody @Validated ReportContinueDto dto) {
  787. User user = (User) shiroHelp.getLoginUser();
  788. if (user == null) {
  789. throw new AuthException("请先登录");
  790. }
  791. UserReportRelation report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
  792. UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  793. return ResponseHelp.success(userReportBaseDto);
  794. }
  795. @RequestMapping(value = "/next", method = RequestMethod.POST)
  796. @ApiOperation(value = "获取下一题", notes = "获取下一题", httpMethod = "POST")
  797. public Response<UserQuestionBaseDto> next(@RequestBody @Validated ReportNextDto dto) {
  798. User user = (User) shiroHelp.getLoginUser();
  799. if (user == null) {
  800. throw new AuthException("请先登录");
  801. }
  802. UserQuestion userQuestion = questionFlowService.next(user.getId(), dto.getUserReportId());
  803. if (userQuestion == null) {
  804. throw new ParameterException("finish");
  805. }
  806. UserQuestionBaseDto baseDto = Transform.convert(userQuestion, UserQuestionBaseDto.class);
  807. // 绑定question
  808. baseDto.setQuestion(Transform.convert(questionService.get(userQuestion.getQuestionId()), QuestionBaseExtendDto.class));
  809. // 绑定questionNo
  810. baseDto.setQuestionNo(Transform.convert(questionNoService.get(userQuestion.getQuestionNoId()), QuestionNoExtendDto.class));
  811. // 绑定collect
  812. baseDto.setCollect(userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId()) != null);
  813. return ResponseHelp.success(baseDto);
  814. }
  815. @RequestMapping(value = "/submit", method = RequestMethod.POST)
  816. @ApiOperation(value = "提交题目答案", notes = "提交题目", httpMethod = "POST")
  817. public Response<Boolean> submit(@RequestBody @Validated QuestionSubmitDto dto) {
  818. User user = (User) shiroHelp.getLoginUser();
  819. if (user == null) {
  820. throw new AuthException("请先登录");
  821. }
  822. UserQuestion userQuestion = userQuestionService.get(dto.getUserQuestionId());
  823. if (userQuestion == null){
  824. throw new ParameterException("做题不存在");
  825. }
  826. userQuestion.setUserTime(dto.getTime());
  827. userQuestion.setUserAnswer(JSONObject.parseObject(JSONObject.toJSONString(dto.getAnswer())));
  828. userQuestion.setSetting(JSONObject.parseObject(JSONObject.toJSONString(dto.getSetting())));
  829. Boolean result = questionFlowService.submit(user.getId(), userQuestion);
  830. return ResponseHelp.success(result);
  831. }
  832. @RequestMapping(value = "/finish", method = RequestMethod.POST)
  833. @ApiOperation(value = "完成考试", notes = "完成考试", httpMethod = "POST")
  834. public Response<Boolean> finish(@RequestBody @Validated ReportFinishDto dto) {
  835. User user = (User) shiroHelp.getLoginUser();
  836. if (user == null) {
  837. throw new AuthException("请先登录");
  838. }
  839. Boolean result = questionFlowService.finish(user.getId(), dto.getUserReportId());
  840. return ResponseHelp.success(result);
  841. }
  842. @RequestMapping(value = "/stage", method = RequestMethod.POST)
  843. @ApiOperation(value = "本阶段完成", notes = "结束当前阶段: 达到阶段时间时调用,然后继续调用next", httpMethod = "POST")
  844. public Response<Boolean> stage(@RequestBody @Validated ReportStageDto dto) {
  845. User user = (User) shiroHelp.getLoginUser();
  846. if (user == null) {
  847. throw new AuthException("请先登录");
  848. }
  849. Boolean result = questionFlowService.stage(user.getId(), dto.getUserReportId());
  850. return ResponseHelp.success(result);
  851. }
  852. @RequestMapping(value = "/restart/paper", method = RequestMethod.POST)
  853. @ApiOperation(value = "重置考试", notes = "重置考试", httpMethod = "POST")
  854. public Response<Boolean> restart(@RequestBody @Validated PaperRestartDto dto) {
  855. User user = (User) shiroHelp.getLoginUser();
  856. if (user == null) {
  857. throw new AuthException("请先登录");
  858. }
  859. questionFlowService.restart(dto.getUserPaperId(), user.getId());
  860. return ResponseHelp.success(true);
  861. }
  862. @RequestMapping(value = "/reset/cat", method = RequestMethod.POST)
  863. @ApiOperation(value = "重置整套模拟卷", notes = "重置考试", httpMethod = "POST")
  864. public Response<Boolean> resetCat() {
  865. User user = (User) shiroHelp.getLoginUser();
  866. if (user == null) {
  867. throw new AuthException("请先登录");
  868. }
  869. UserService userService = userServiceService.getServiceBase(user.getId(), ServiceKey.QX_CAT);
  870. if (userService == null){
  871. throw new ParameterException("无重置权限");
  872. }
  873. if (userService.getIsReset() > 0){
  874. throw new ParameterException("已重置,请再次购买服务");
  875. }
  876. // reset当前考卷的所有状态
  877. examinationService.resetCat(user.getId(), false);
  878. userServiceService.edit(UserService.builder().id(userService.getId()).isReset(1).build());
  879. return ResponseHelp.success(true);
  880. }
  881. }