MyController.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  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.ParameterException;
  6. import com.nuliji.tools.exception.SystemException;
  7. import com.qxgmat.data.constants.enums.QuestionType;
  8. import com.qxgmat.data.constants.enums.SettingKey;
  9. import com.qxgmat.data.constants.enums.module.FeedbackModule;
  10. import com.qxgmat.data.constants.enums.module.PaperModule;
  11. import com.qxgmat.data.constants.enums.module.PaperOrigin;
  12. import com.qxgmat.data.constants.enums.module.QuestionModule;
  13. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  14. import com.qxgmat.data.dao.entity.*;
  15. import com.qxgmat.data.inline.UserQuestionStat;
  16. import com.qxgmat.data.relation.entity.*;
  17. import com.qxgmat.dto.extend.*;
  18. import com.qxgmat.dto.request.*;
  19. import com.qxgmat.dto.request.UserNoteDto;
  20. import com.qxgmat.dto.response.*;
  21. import com.qxgmat.help.ShiroHelp;
  22. import com.qxgmat.service.*;
  23. import com.qxgmat.service.extend.QuestionFlowService;
  24. import com.qxgmat.service.inline.*;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.http.MediaType;
  30. import org.springframework.validation.annotation.Validated;
  31. import org.springframework.web.bind.annotation.*;
  32. import org.springframework.web.multipart.MultipartFile;
  33. import javax.servlet.http.HttpServletRequest;
  34. import javax.servlet.http.HttpSession;
  35. import javax.validation.Validator;
  36. import java.io.File;
  37. import java.io.IOException;
  38. import java.text.DateFormat;
  39. import java.text.ParseException;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. /**
  43. * Created by GaoJie on 2017/10/31.
  44. */
  45. @RestController
  46. @RequestMapping("/api/my")
  47. @Api(tags = "用户接口", description = "获取与操作当前用户信息", produces = MediaType.APPLICATION_JSON_VALUE)
  48. public class MyController {
  49. @Value("${upload.local_path}")
  50. private String localPath;
  51. @Value("${upload.web_url}")
  52. private String webUrl;
  53. @Autowired
  54. private Validator validator;
  55. @Autowired
  56. private ShiroHelp shiroHelp;
  57. @Autowired
  58. private SettingService settingService;
  59. @Autowired
  60. private ExerciseStructService exerciseStructService;
  61. @Autowired
  62. private ClassCourseService classCourseService;
  63. @Autowired
  64. private ClassCourseNoService classCourseNoService;
  65. @Autowired
  66. private QuestionService questionService;
  67. @Autowired
  68. private QuestionNoService questionNoService;
  69. @Autowired
  70. private SentenceQuestionService sentenceQuestionService;
  71. @Autowired
  72. private TextbookQuestionService textbookQuestionService;
  73. @Autowired
  74. private UsersService usersService;
  75. @Autowired
  76. private UserMessageService userMessageService;
  77. @Autowired
  78. private UserCourseRecordService userCourseRecordService;
  79. @Autowired
  80. private UserSentenceRecordService userSentenceRecordService;
  81. @Autowired
  82. private UserServiceService userServiceService;
  83. @Autowired
  84. private UserCollectQuestionService userCollectQuestionService;
  85. @Autowired
  86. private UserNoteQuestionService userNoteQuestionService;
  87. @Autowired
  88. private UserAskQuestionService userAskQuestionService;
  89. @Autowired
  90. private UserFeedbackErrorService userFeedbackErrorService;
  91. @Autowired
  92. private UserQuestionService userQuestionService;
  93. @Autowired
  94. private UserReportService userReportService;
  95. @Autowired
  96. private UserPaperService userPaperService;
  97. @Autowired
  98. private UserPaperQuestionService userPaperQuestionService;
  99. @Autowired
  100. private QuestionFlowService questionFlowService;
  101. @RequestMapping(value = "/email", method = RequestMethod.POST)
  102. @ApiOperation(value = "绑定邮箱", httpMethod = "POST")
  103. public Response<Boolean> email(@RequestBody @Validated UserEmailDto dto, HttpSession session, HttpServletRequest request) {
  104. User user = (User) shiroHelp.getLoginUser();
  105. usersService.edit(User.builder()
  106. .id(user.getId())
  107. .email(dto.getEmail())
  108. .build());
  109. return ResponseHelp.success(true);
  110. }
  111. @RequestMapping(value = "/info", method = RequestMethod.POST)
  112. @ApiOperation(value = "修改用户信息", httpMethod = "POST")
  113. public Response<Boolean> info(@RequestBody @Validated UserInfoDto dto){
  114. User user = (User) shiroHelp.getLoginUser();
  115. usersService.edit(User.builder()
  116. .id(user.getId())
  117. .nickname(dto.getNickname())
  118. .avatar(dto.getAvatar())
  119. .build());
  120. return ResponseHelp.success(true);
  121. }
  122. @RequestMapping(value = "/real", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.POST)
  123. @ApiOperation(value = "实名认证", notes = "保存用户实名信息", httpMethod = "POST")
  124. public Response<UserRealDto> real(@RequestParam("file") MultipartFile multipartFile) {
  125. if (multipartFile.isEmpty()) {
  126. throw new ParameterException("上传文件为空");
  127. }
  128. String contentType = multipartFile.getContentType();
  129. if (!contentType.contains("")) {
  130. throw new ParameterException("文件类型错误");
  131. }
  132. User user = (User) shiroHelp.getLoginUser();
  133. UserRealDto dto = new UserRealDto();
  134. // todo 第三方验证
  135. String file = UUID.randomUUID().toString();
  136. try {
  137. File dest = new File(localPath + File.separator+file);
  138. multipartFile.transferTo(dest);
  139. dto.setPhoto(webUrl+file);
  140. usersService.edit(User.builder()
  141. .id(user.getId())
  142. .realAddress(dto.getAddress())
  143. .realName(dto.getName())
  144. .realIdentity(dto.getIdentity())
  145. .realPhoto(dto.getPhoto())
  146. .build());
  147. return ResponseHelp.success(dto);
  148. } catch (IOException e) {
  149. e.printStackTrace();
  150. return ResponseHelp.exception(new SystemException("图片上传失败"));
  151. }
  152. }
  153. @RequestMapping(value = "/message", method = RequestMethod.GET)
  154. @ApiOperation(value = "用户站内信", notes = "用户消息列表", httpMethod = "GET")
  155. public Response<PageMessage<UserMessage>> message(
  156. @RequestParam(required = false, defaultValue = "1") int page,
  157. @RequestParam(required = false, defaultValue = "100") int size,
  158. @RequestParam(required = false) String type,
  159. @RequestParam(required = false) Integer read
  160. ) {
  161. User user = (User) shiroHelp.getLoginUser();
  162. Page<UserMessage> p = userMessageService.select(page, size, user.getId(), type, read);
  163. return ResponseHelp.success(p, page, size, p.getTotal());
  164. }
  165. @RequestMapping(value = "/message/read", method = RequestMethod.PUT)
  166. @ApiOperation(value = "读取消息", notes = "读取用户消息/全部", httpMethod = "PUT")
  167. public Response<Boolean> readMessage(@RequestBody @Validated MessageReadDto dto) {
  168. User user = (User) shiroHelp.getLoginUser();
  169. if (dto.getAll()){
  170. userMessageService.clearAll(user.getId());
  171. }else{
  172. userMessageService.clear(user.getId(), dto.getId());
  173. }
  174. return ResponseHelp.success(true);
  175. }
  176. @RequestMapping(value = "/prepare", method = RequestMethod.PUT)
  177. @ApiOperation(value = "修改备考信息", notes = "修改用户备考信息", httpMethod = "PUT")
  178. public Response<Boolean> editPrepare(@RequestBody @Validated UserPrepareDto dto) {
  179. User entity = Transform.dtoToEntity(dto);
  180. User user = (User) shiroHelp.getLoginUser();
  181. entity.setId(user.getId());
  182. usersService.edit(entity);
  183. return ResponseHelp.success(true);
  184. }
  185. @RequestMapping(value = "/prepare", method = RequestMethod.GET)
  186. @ApiOperation(value = "获取备考信息", notes = "获取备考信息及分布", httpMethod = "GET")
  187. public Response<UserPrepareDetailDto> getPrepare() {
  188. User user = (User) shiroHelp.getLoginUser();
  189. User entity = usersService.get(user.getId());
  190. UserPrepareDetailDto dto = Transform.convert(entity, UserPrepareDetailDto.class);
  191. Setting setting = settingService.getByKey(SettingKey.PREPARE_INFO);
  192. JSONObject value = setting.getValue();
  193. return ResponseHelp.success(dto);
  194. }
  195. @RequestMapping(value = "/study", method = RequestMethod.GET)
  196. @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
  197. public Response<UserStudyDayDto> studyTime(
  198. @RequestParam(required = false) String date
  199. ) {
  200. User user = (User) shiroHelp.getLoginUser();
  201. Date day;
  202. try {
  203. day = DateFormat.getDateInstance().parse(date);
  204. } catch (ParseException e) {
  205. throw new ParameterException("日期格式错误");
  206. }
  207. Date endDay = Tools.addDate(day, 1);
  208. String startTime = day.toString();
  209. String endTime = endDay.toString();
  210. UserStudyDayDto dto = new UserStudyDayDto();
  211. List<ExerciseStruct> p = exerciseStructService.main();
  212. Map<String, String> m = new HashMap<>();
  213. for (ExerciseStruct struct : p){
  214. if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
  215. m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
  216. }
  217. // 获取总用户数
  218. Integer total = usersService.count();
  219. // 获取练习统计 - 按题型进行分组统计
  220. Integer exerciseTime = 0;
  221. Integer exerciseQuestion = 0;
  222. List<UserExerciseExtendDto> exerciseList = new ArrayList<>();
  223. List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), startTime, endTime);
  224. for(UserStudyStatRelation type:typeList){
  225. exerciseTime += type.getUserTime();
  226. exerciseQuestion += type.getUserNumber();
  227. exerciseList.add(new UserExerciseExtendDto(m.get(type.getModule()), type.getUserNumber(), type.getUserTime(), type.getUserCorrect()));
  228. }
  229. // todo 练习统计排行
  230. UserRankStatRelation exerciseRank = userReportService.rankExerciseByTime(user.getId(), startTime, endTime);
  231. exerciseRank.setTotal(total);
  232. dto.setExerciseTime(exerciseTime);
  233. dto.setExerciseQuestion(exerciseQuestion);
  234. dto.setExerciseList(exerciseList);
  235. dto.setExerciseExceed(exerciseRank);
  236. // 获取模考统计 - 按卷子
  237. Integer examinationTime = 0;
  238. Integer examinationPaper = 0;
  239. List<UserReport> userReportList = userReportService.getByModule(user.getId(), PaperModule.EXAMINATION, startTime, endTime);
  240. Collection paperIds = Transform.getIds(userReportList, UserReport.class, "paperId");
  241. List<UserPaper> userPaperList = userPaperService.select(paperIds);
  242. Map userPaper = Transform.getMap(userPaperList, UserPaper.class, "id");
  243. List<UserPaperBaseExtendDto> examinationPaperList = new ArrayList<>(userReportList.size());
  244. for(UserReport report: userReportList){
  245. examinationTime += report.getUserTime();
  246. examinationPaper += 1;
  247. UserPaperBaseExtendDto d = Transform.convert(userPaper.get(report.getPaperId()), UserPaperBaseExtendDto.class);
  248. d.setReport(Transform.convert(report, UserReportExtendDto.class));
  249. examinationPaperList.add(d);
  250. }
  251. // todo 模考统计排行
  252. UserRankStatRelation examinationRank = userReportService.rankExaminationByTime(user.getId(), startTime, endTime);
  253. examinationRank.setTotal(total);
  254. dto.setExaminationTime(examinationTime);
  255. dto.setExaminationPaper(examinationPaper);
  256. dto.setExaminationList(examinationPaperList);
  257. dto.setExaminationExceed(examinationRank);
  258. // 获取课程访问记录 - 按课时
  259. Integer classTime = 0;
  260. Integer classCourse = 0;
  261. List<UserCourseRecord> userCourseRecordList = userCourseRecordService.getByTime(user.getId(), startTime, endTime);
  262. Collection courseIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "courseId");
  263. Collection courseNoIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "noId");
  264. List<ClassCourse> classCourseList = classCourseService.select(courseIds);
  265. Map classCourseMap = Transform.getMap(classCourseList, ClassCourse.class, "id", "title");
  266. List<ClassCourseNo> classCourseNoList = classCourseNoService.select(courseNoIds);
  267. Map classCourseNoMap = Transform.getMap(classCourseNoList, ClassCourseNo.class, "id", "content");
  268. List<UserCourseResultExtendDto> courseResultList = new ArrayList<>(userCourseRecordList.size());
  269. for(UserCourseRecord record:userCourseRecordList){
  270. classTime += record.getUserTime();
  271. classCourse += 1;
  272. UserCourseResultExtendDto d = Transform.convert(record, UserCourseResultExtendDto.class);
  273. d.setTitle((String)classCourseMap.get(record.getCourseId()));
  274. d.setContent((String)classCourseNoMap.get(record.getCourseNoId()));
  275. courseResultList.add(d);
  276. }
  277. // todo 听课统计排行
  278. UserRankStatRelation classRank = userCourseRecordService.rankByTime(user.getId(), startTime, endTime);
  279. classRank.setTotal(total);
  280. dto.setClassTime(classTime);
  281. dto.setClassCourse(classCourse);
  282. dto.setClassList(courseResultList);
  283. dto.setClassExceed(classRank);
  284. return ResponseHelp.success(dto);
  285. }
  286. @RequestMapping(value = "/study/total", method = RequestMethod.GET)
  287. @ApiOperation(value = "获取总学习记录", notes = "获取总学习记录", httpMethod = "GET")
  288. public Response<UserStudyDetailDto> studyTotalTime() {
  289. User user = (User) shiroHelp.getLoginUser();
  290. UserStudyDetailDto dto = new UserStudyDetailDto();
  291. dto.setCreateTime(user.getCreateTime());
  292. dto.setDays((int)((user.getCreateTime().getTime() - new Date().getTime()) / (1000*3600*24)));
  293. Integer totalTime = 0;
  294. Map<String, Integer> categoryMap = new HashMap<>();
  295. // 按模块来源分组查询: module=> sentence, examination, collect+error, 忽略exercise,preview
  296. List<UserStudyStatRelation> moduleList = userReportService.statGroupModule(user.getId());
  297. for(UserStudyStatRelation module:moduleList){
  298. // 练习时间过滤
  299. if (module.getModule().equals(PaperModule.EXERCISE.key)){
  300. continue;
  301. }
  302. Integer time = module.getUserTime();
  303. String key = module.getModule();
  304. totalTime += time;
  305. // 收藏及错误组卷合并
  306. if (module.getModule().equals(PaperOrigin.COLLECT.key)
  307. || module.getModule().equals(PaperOrigin.ERROR.key)){
  308. key = "freedom";
  309. time += categoryMap.getOrDefault(key, 0);
  310. }else if (module.getModule().equals(PaperOrigin.PREVIEW.key)){
  311. key = PaperOrigin.EXERCISE.key;
  312. }
  313. categoryMap.put(key, time);
  314. }
  315. // 按题型统计练习
  316. List<UserStudyStatRelation> exerciseList = userReportService.statGroupExerciseType(user.getId(), null, null);
  317. for(UserStudyStatRelation type:exerciseList){
  318. totalTime += type.getUserTime();
  319. categoryMap.put(type.getModule(), type.getUserTime());
  320. }
  321. // 按题型统计预习作业
  322. List<UserStudyStatRelation> previewList = userReportService.statGroupExerciseType(user.getId(), null, null);
  323. for(UserStudyStatRelation type:previewList){
  324. totalTime += type.getUserTime();
  325. categoryMap.put(type.getModule(), type.getUserTime());
  326. }
  327. // 按题型统计课程
  328. List<UserCourseStatRelation> recordList = userCourseRecordService.statGroupType(user.getId(), null, null);
  329. for (UserCourseStatRelation record : recordList){
  330. totalTime += record.getUserTime();
  331. // 累加同类型时间
  332. Integer time = categoryMap.getOrDefault(record.getModule(), 0);
  333. categoryMap.put(record.getModule(), time);
  334. }
  335. // 获取长难句阅读统计
  336. UserSentenceStatRelation sentenceStatRelation = userSentenceRecordService.stat(user.getId(), null, null);
  337. if (sentenceStatRelation != null){
  338. Integer sentenceTime = categoryMap.getOrDefault(PaperModule.SENTENCE.key, 0);
  339. categoryMap.put(PaperModule.SENTENCE.key, sentenceTime + sentenceStatRelation.getUserTime());
  340. }
  341. List<ExerciseStruct> p = exerciseStructService.main();
  342. Map<String, String> m = new HashMap<>();
  343. for (ExerciseStruct struct : p){
  344. if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
  345. m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
  346. }
  347. // 组装数据
  348. List<UserStudyExtendDto> categorys = new ArrayList<>();
  349. if (categoryMap.containsKey(PaperModule.SENTENCE.key)) categorys.add(new UserStudyExtendDto(m.get(PaperModule.SENTENCE.key), categoryMap.get(PaperModule.SENTENCE.key)));
  350. if (categoryMap.containsKey(QuestionType.SC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.SC.key), categoryMap.get(QuestionType.SC.key)));
  351. if (categoryMap.containsKey(QuestionType.RC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.RC.key), categoryMap.get(QuestionType.RC.key)));
  352. if (categoryMap.containsKey(QuestionType.CR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.CR.key), categoryMap.get(QuestionType.CR.key)));
  353. if (categoryMap.containsKey(QuestionType.PS.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.PS.key), categoryMap.get(QuestionType.PS.key)));
  354. if (categoryMap.containsKey(QuestionType.DS.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.DS.key), categoryMap.get(QuestionType.DS.key)));
  355. if (categoryMap.containsKey(QuestionType.IR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.IR.key), categoryMap.get(QuestionType.IR.key)));
  356. if (categoryMap.containsKey(QuestionType.AWA.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.AWA.key), categoryMap.get(QuestionType.AWA.key)));
  357. if (categoryMap.containsKey(PaperModule.EXAMINATION.key)) categorys.add(new UserStudyExtendDto("模考", categoryMap.get(PaperModule.EXAMINATION.key)));
  358. if (categoryMap.containsKey("freedom")) categorys.add(new UserStudyExtendDto("自由组卷", categoryMap.get("freedom")));
  359. dto.setTime(totalTime);
  360. dto.setCategorys(categorys);
  361. return ResponseHelp.success(dto);
  362. }
  363. @RequestMapping(value = "/data", method = RequestMethod.GET)
  364. @ApiOperation(value = "获取做题数据", notes = "获取做题数据", httpMethod = "GET")
  365. public Response<UserStudyDayDto> questionData(
  366. @RequestParam(required = false) String startTime,
  367. @RequestParam(required = false) String endTime
  368. ) {
  369. User user = (User) shiroHelp.getLoginUser();
  370. UserStudyDayDto dto = new UserStudyDayDto();
  371. // todo
  372. return ResponseHelp.success(dto);
  373. }
  374. @RequestMapping(value = "/collect/add", method = RequestMethod.PUT)
  375. @ApiOperation(value = "添加收藏", notes = "添加收藏", httpMethod = "PUT")
  376. public Response<Boolean> addCollect(@RequestBody @Validated UserCollectDto dto) {
  377. UserCollectQuestion entity = Transform.dtoToEntity(dto);
  378. User user = (User) shiroHelp.getLoginUser();
  379. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  380. case BASE:
  381. entity.setQuestionModule(QuestionModule.BASE.key);
  382. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  383. entity.setQuestionId(questionNo.getQuestionId());
  384. entity.setQuestionNoId(questionNo.getId());
  385. break;
  386. case SENTENCE:
  387. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  388. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  389. entity.setQuestionId(sentenceQuestion.getQuestionId());
  390. entity.setQuestionNoId(sentenceQuestion.getId());
  391. break;
  392. case TEXTBOOK:
  393. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  394. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  395. entity.setQuestionId(textbookQuestion.getQuestionId());
  396. entity.setQuestionNoId(textbookQuestion.getId());
  397. break;
  398. }
  399. entity.setUserId(user.getId());
  400. userCollectQuestionService.addQuestion(entity);
  401. return ResponseHelp.success(true);
  402. }
  403. @RequestMapping(value = "/collect/delete", method = RequestMethod.DELETE)
  404. @ApiOperation(value = "移除收藏", notes = "移除收藏", httpMethod = "DELETE")
  405. public Response<Boolean> deleteCollect(String questionModule, Integer questionNoId) {
  406. User user = (User) shiroHelp.getLoginUser();
  407. Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), QuestionModule.ValueOf(questionModule), questionNoId);
  408. return ResponseHelp.success(result);
  409. }
  410. @RequestMapping(value = "/collect/bind", method = RequestMethod.POST)
  411. @ApiOperation(value = "收藏组卷", notes = "收藏组卷", httpMethod = "POST")
  412. public Response<Boolean> bindCollect(@RequestBody @Validated UserCustomBindDto dto) {
  413. User user = (User) shiroHelp.getLoginUser();
  414. questionFlowService.makePaper(
  415. user.getId(),
  416. QuestionModule.ValueOf(dto.getQuestionModule()),
  417. PaperOrigin.COLLECT,
  418. Arrays.stream(dto.getQuestionNoIds()).collect(Collectors.toList()),
  419. dto.getFilterTimes()
  420. );
  421. return ResponseHelp.success(true);
  422. }
  423. @RequestMapping(value = "/collect/question", method = RequestMethod.GET)
  424. @ApiOperation(value = "获取收藏题目列表", notes = "获取收藏题目列表", httpMethod = "GET")
  425. public Response<PageMessage<UserCollectQuestionDto>> listCollect(
  426. @RequestParam(required = false, defaultValue = "1") int page,
  427. @RequestParam(required = false, defaultValue = "100") int size,
  428. @RequestParam(required = true) String module,
  429. @RequestParam(required = false) String type,
  430. @RequestParam(required = false) String startTime,
  431. @RequestParam(required = false) String endTime,
  432. @RequestParam(required = false, defaultValue = "id") String order,
  433. @RequestParam(required = false, defaultValue = "desc") String direction,
  434. HttpSession session) {
  435. User user = (User) shiroHelp.getLoginUser();
  436. QuestionModule questionModule = QuestionModule.ValueOf(module);
  437. PageResult<UserCollectQuestionRelation> p = userCollectQuestionService.listQuestion(page, size, user.getId(), questionModule, QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  438. List<UserCollectQuestionDto> pr = Transform.convert(p, UserCollectQuestionDto.class);
  439. // 获取题目信息
  440. Collection questionIds = Transform.getIds(pr, UserCollectQuestionDto.class, "questionId");
  441. List<Question> questionList = questionService.select(questionIds);
  442. Transform.combine(pr, questionList, UserCollectQuestionDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  443. Collection questionNoIds = Transform.getIds(pr, UserCollectQuestionDto.class, "questionNoId");
  444. switch(questionModule){
  445. case BASE:
  446. List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
  447. Transform.combine(pr, questionNoList, UserCollectQuestionDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  448. break;
  449. case SENTENCE:
  450. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(questionNoIds);
  451. Transform.combine(pr, sentenceQuestionList, UserCollectQuestionDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  452. break;
  453. case TEXTBOOK:
  454. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(questionNoIds);
  455. Transform.combine(pr, textbookQuestionList, UserCollectQuestionDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  456. break;
  457. }
  458. // 绑定题目统计
  459. Map<Object, UserQuestionStat> stats = userQuestionService.statQuestionMap(questionIds);
  460. Transform.combine(pr, stats, UserCollectQuestionDto.class, "questionId", "stat");
  461. return ResponseHelp.success(pr, page, size, p.getTotal());
  462. }
  463. @RequestMapping(value = "/error/list", method = RequestMethod.GET)
  464. @ApiOperation(value = "获取错题列表", notes = "获取错题列表", httpMethod = "GET")
  465. public Response<PageMessage<UserQuestionErrorListDto>> listError(
  466. @RequestParam(required = false, defaultValue = "1") int page,
  467. @RequestParam(required = false, defaultValue = "100") int size,
  468. @RequestParam(required = true) String module,
  469. @RequestParam(required = false) Number category
  470. ) {
  471. User user = (User) shiroHelp.getLoginUser();
  472. QuestionModule questionModule = QuestionModule.ValueOf(module);
  473. PageResult<UserQuestion> p = userQuestionService.listError(page, size, user.getId());
  474. List<UserQuestionErrorListDto> pr = Transform.convert(p, UserQuestionErrorListDto.class);
  475. // 获取题目信息
  476. Collection questionIds = Transform.getIds(pr, UserQuestionErrorListDto.class, "questionId");
  477. List<Question> questionList = questionService.select(questionIds);
  478. Transform.combine(pr, questionList, UserQuestionErrorListDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  479. Collection questionNoIds = Transform.getIds(pr, UserQuestionErrorListDto.class, "questionNoId");
  480. switch(questionModule){
  481. case BASE:
  482. List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
  483. Transform.combine(pr, questionNoList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  484. break;
  485. case SENTENCE:
  486. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(questionNoIds);
  487. Transform.combine(pr, sentenceQuestionList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  488. break;
  489. case TEXTBOOK:
  490. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(questionNoIds);
  491. Transform.combine(pr, textbookQuestionList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  492. break;
  493. }
  494. return ResponseHelp.success(pr, page, size, p.getTotal());
  495. }
  496. @RequestMapping(value = "/error/bind", method = RequestMethod.POST)
  497. @ApiOperation(value = "错题组卷", notes = "错题组卷", httpMethod = "POST")
  498. public Response<Boolean> bindError(@RequestBody @Validated UserCustomBindDto dto) {
  499. User user = (User) shiroHelp.getLoginUser();
  500. questionFlowService.makePaper(
  501. user.getId(),
  502. QuestionModule.ValueOf(dto.getQuestionModule()),
  503. PaperOrigin.ERROR,
  504. Arrays.stream(dto.getQuestionNoIds()).collect(Collectors.toList()),
  505. dto.getFilterTimes()
  506. );
  507. return ResponseHelp.success(true);
  508. }
  509. @RequestMapping(value = "/error/clear", method = RequestMethod.POST)
  510. @ApiOperation(value = "错题移除", notes = "错题移除", httpMethod = "POST")
  511. public Response<Boolean> clearError(@RequestBody @Validated UserQuestionIdsDto dto) {
  512. User user = (User) shiroHelp.getLoginUser();
  513. List<UserQuestion> questionList = userQuestionService.select(dto.getQuestionNoIds());
  514. userPaperQuestionService.addRemoveError(questionList);
  515. return ResponseHelp.success(true);
  516. }
  517. @RequestMapping(value = "/error/remove", method = RequestMethod.POST)
  518. @ApiOperation(value = "移除正确题", notes = "移除正确题", httpMethod = "POST")
  519. public Response<Boolean> removeError(@RequestBody @Validated ErrorReportDto dto) {
  520. User user = (User) shiroHelp.getLoginUser();
  521. UserReport report = userReportService.get(dto.getUserReportId());
  522. if (report.getIsFinish() == 0){
  523. throw new ParameterException("试卷未完成");
  524. }
  525. List<UserQuestion> questionList = userQuestionService.listByReport(user.getId(), dto.getUserReportId());
  526. userPaperQuestionService.addRemoveError(questionList);
  527. return ResponseHelp.success(true);
  528. }
  529. @RequestMapping(value = "/note/question", method = RequestMethod.PUT)
  530. @ApiOperation(value = "更新笔记", notes = "更新笔记", httpMethod = "PUT")
  531. public Response<Boolean> updateNoteQuestion(@RequestBody @Validated UserNoteDto dto) {
  532. UserNoteQuestion entity = Transform.dtoToEntity(dto);
  533. User user = (User) shiroHelp.getLoginUser();
  534. entity.setUserId(user.getId());
  535. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  536. case BASE:
  537. entity.setQuestionModule(QuestionModule.BASE.key);
  538. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  539. entity.setQuestionId(questionNo.getQuestionId());
  540. entity.setQuestionNoId(questionNo.getId());
  541. break;
  542. case SENTENCE:
  543. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  544. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  545. entity.setQuestionId(sentenceQuestion.getQuestionId());
  546. entity.setQuestionNoId(sentenceQuestion.getId());
  547. break;
  548. case TEXTBOOK:
  549. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  550. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  551. entity.setQuestionId(textbookQuestion.getQuestionId());
  552. entity.setQuestionNoId(textbookQuestion.getId());
  553. break;
  554. }
  555. userNoteQuestionService.update(entity);
  556. return ResponseHelp.success(true);
  557. }
  558. @RequestMapping(value = "/note/question/list", method = RequestMethod.GET)
  559. @ApiOperation(value = "获取题目笔记列表", notes = "获取笔记列表", httpMethod = "GET")
  560. public Response<PageMessage<UserNoteQuestionDto>> listNoteQuestion(
  561. @RequestParam(required = false, defaultValue = "1") int page,
  562. @RequestParam(required = false, defaultValue = "100") int size,
  563. @RequestParam(required = true) String module,
  564. @RequestParam(required = false) String type,
  565. @RequestParam(required = false) String startTime,
  566. @RequestParam(required = false) String endTime,
  567. @RequestParam(required = false, defaultValue = "id") String order,
  568. @RequestParam(required = false, defaultValue = "desc") String direction,
  569. HttpSession session) {
  570. User user = (User) shiroHelp.getLoginUser();
  571. QuestionModule questionModule = QuestionModule.ValueOf(module);
  572. PageResult<UserNoteQuestionRelation> p = userNoteQuestionService.list(page, size, user.getId(), questionModule, QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  573. List<UserNoteQuestionDto> pr = Transform.convert(p, UserNoteQuestionDto.class);
  574. // 获取题目信息
  575. Collection questionIds = Transform.getIds(pr, UserNoteQuestionDto.class, "questionId");
  576. List<Question> questionList = questionService.select(questionIds);
  577. Transform.combine(pr, questionList, UserNoteQuestionDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  578. Collection questionNoIds = Transform.getIds(pr, UserQuestionErrorListDto.class, "questionNoId");
  579. switch(questionModule){
  580. case BASE:
  581. List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
  582. Transform.combine(pr, questionNoList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  583. break;
  584. case SENTENCE:
  585. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(questionNoIds);
  586. Transform.combine(pr, sentenceQuestionList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  587. break;
  588. case TEXTBOOK:
  589. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(questionNoIds);
  590. Transform.combine(pr, textbookQuestionList, UserQuestionErrorListDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  591. break;
  592. }
  593. return ResponseHelp.success(pr, page, size, p.getTotal());
  594. }
  595. @RequestMapping(value = "/report/list", method = RequestMethod.GET)
  596. @ApiOperation(value = "获取报告列表", notes = "获取报告列表", httpMethod = "GET")
  597. public Response<PageMessage<UserPaperDto>> reportList(
  598. @RequestParam(required = false, defaultValue = "1") int page,
  599. @RequestParam(required = false, defaultValue = "100") int size,
  600. @RequestParam(required = true) String origin,
  601. @RequestParam(required = false) Integer structId,
  602. @RequestParam(required = false) String startTime,
  603. @RequestParam(required = false) String endTime,
  604. @RequestParam(required = false, defaultValue = "id") String order,
  605. @RequestParam(required = false, defaultValue = "desc") String direction,
  606. HttpSession session) {
  607. User user = (User) shiroHelp.getLoginUser();
  608. PaperOrigin paperOrigin = PaperOrigin.ValueOf(origin);
  609. PageResult<UserPaper> p = userPaperService.list(page, size, user.getId(), paperOrigin, structId, startTime, endTime, order, DirectionStatus.ValueOf(direction));
  610. List<UserPaperDto> pr = Transform.convert(p, UserPaperDto.class);
  611. Collection paperIds = Transform.getIds(p, UserPaper.class, "id");
  612. // 绑定用户报告
  613. Map<Object, Collection<UserReport>> reportByPaper = userReportService.mapByPaper(paperIds);
  614. Transform.combine(pr, reportByPaper, UserPaperDto.class, "id", "reports", UserReportExtendDto.class);
  615. // 错题 -> 题型
  616. return ResponseHelp.success(pr, page, size, p.getTotal());
  617. }
  618. @RequestMapping(value = "/ask/question", method = RequestMethod.POST)
  619. @ApiOperation(value = "添加提问", notes = "添加提问", httpMethod = "POST")
  620. public Response<Boolean> addAskQuestion(@RequestBody @Validated UserAskDto dto) {
  621. UserAskQuestion entity = Transform.dtoToEntity(dto);
  622. User user = (User) shiroHelp.getLoginUser();
  623. entity.setUserId(user.getId());
  624. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  625. case BASE:
  626. entity.setQuestionModule(QuestionModule.BASE.key);
  627. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  628. entity.setQuestionId(questionNo.getQuestionId());
  629. entity.setQuestionNoId(questionNo.getId());
  630. break;
  631. case SENTENCE:
  632. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  633. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  634. entity.setQuestionId(sentenceQuestion.getQuestionId());
  635. entity.setQuestionNoId(sentenceQuestion.getId());
  636. break;
  637. case TEXTBOOK:
  638. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  639. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  640. entity.setQuestionId(textbookQuestion.getQuestionId());
  641. entity.setQuestionNoId(textbookQuestion.getId());
  642. break;
  643. }
  644. userAskQuestionService.add(entity);
  645. return ResponseHelp.success(true);
  646. }
  647. @RequestMapping(value = "/feedback/error/question", method = RequestMethod.POST)
  648. @ApiOperation(value = "添加题目勘误", notes = "添加勘误", httpMethod = "POST")
  649. public Response<Boolean> addFeedbackErrorQuestion(@RequestBody @Validated UserFeedbackErrorDto dto) {
  650. UserFeedbackError entity = Transform.dtoToEntity(dto);
  651. User user = (User) shiroHelp.getLoginUser();
  652. entity.setUserId(user.getId());
  653. entity.setModule(FeedbackModule.QUESTION.key);
  654. entity.setStatus(0);
  655. userFeedbackErrorService.add(entity);
  656. return ResponseHelp.success(true);
  657. }
  658. @RequestMapping(value = "/feedback/error/data", method = RequestMethod.POST)
  659. @ApiOperation(value = "添加资料勘误", notes = "添加勘误", httpMethod = "POST")
  660. public Response<Boolean> addFeedbackError(@RequestBody @Validated UserFeedbackErrorDto dto) {
  661. UserFeedbackError entity = Transform.dtoToEntity(dto);
  662. User user = (User) shiroHelp.getLoginUser();
  663. entity.setUserId(user.getId());
  664. entity.setModule(FeedbackModule.DATA.key);
  665. entity.setStatus(0);
  666. userFeedbackErrorService.add(entity);
  667. return ResponseHelp.success(true);
  668. }
  669. }