QuestionController.java 43 KB

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