SentenceController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.nuliji.tools.Response;
  4. import com.nuliji.tools.ResponseHelp;
  5. import com.nuliji.tools.Transform;
  6. import com.nuliji.tools.exception.AuthException;
  7. import com.qxgmat.data.constants.enums.SettingKey;
  8. import com.qxgmat.data.constants.enums.logic.SentenceLogic;
  9. import com.qxgmat.data.constants.enums.module.PaperOrigin;
  10. import com.qxgmat.data.dao.entity.*;
  11. import com.qxgmat.dto.extend.CommentExtendDto;
  12. import com.qxgmat.dto.extend.UserPaperBaseExtendDto;
  13. import com.qxgmat.dto.extend.UserReportExtendDto;
  14. import com.qxgmat.dto.request.*;
  15. import com.qxgmat.dto.response.*;
  16. import com.qxgmat.help.ShiroHelp;
  17. import com.qxgmat.service.UserPaperService;
  18. import com.qxgmat.service.extend.SentenceService;
  19. import com.qxgmat.service.inline.SentencePaperService;
  20. import com.qxgmat.service.UserCollectQuestionService;
  21. import com.qxgmat.service.UsersService;
  22. import com.qxgmat.service.extend.QuestionFlowService;
  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.Collection;
  31. import java.util.HashMap;
  32. import java.util.List;
  33. import java.util.Map;
  34. @RestController
  35. @RequestMapping("/api/sentence")
  36. @Api(tags = "长难句", description = "长难句接口")
  37. public class SentenceController
  38. {
  39. @Autowired
  40. private ShiroHelp shiroHelp;
  41. @Autowired
  42. private SentenceArticleService sentenceArticleService;
  43. @Autowired
  44. private SentenceQuestionService sentenceQuestionService;
  45. @Autowired
  46. private SentencePaperService sentencePaperService;
  47. @Autowired
  48. private SentenceCodeService sentenceCodeService;
  49. @Autowired
  50. private SentenceService sentenceService;
  51. @Autowired
  52. private QuestionService questionService;
  53. @Autowired
  54. private QuestionNoService questionNoService;
  55. @Autowired
  56. private SettingService settingService;
  57. @Autowired
  58. private CourseDataService courseDataService;
  59. @Autowired
  60. private CommentService commentService;
  61. @Autowired
  62. private UsersService usersService;
  63. @Autowired
  64. private UserPaperService userPaperService;
  65. @Autowired
  66. private UserReportService userReportService;
  67. @Autowired
  68. private UserSentenceProgressService userSentenceProgressService;
  69. @Autowired
  70. private UserSentenceRecordService userSentenceRecordService;
  71. @Autowired
  72. private UserCollectQuestionService userCollectQuestionService;
  73. @Autowired
  74. private QuestionFlowService questionFlowService;
  75. @RequestMapping(value = "/info", method = RequestMethod.GET)
  76. @ApiOperation(value = "所有长难句信息", httpMethod = "GET")
  77. public Response<UserSentenceInfoDto> info(HttpSession session) {
  78. UserSentenceInfoDto dto = new UserSentenceInfoDto();
  79. User user = (User) shiroHelp.getLoginUser();
  80. if (user != null){
  81. // 用户code状态
  82. SentenceCode code = sentenceCodeService.isActive(user.getId());
  83. if (code != null){
  84. dto.setCode(code.getCode());
  85. }
  86. }
  87. // 章节信息
  88. Setting entity = settingService.getByKey(SettingKey.SENTENCE);
  89. JSONObject value = entity.getValue();
  90. dto.setChapters(value.getJSONArray("chapters"));
  91. dto.setTrailPages(value.getInteger("trailPages"));
  92. // 评论: 通过资料的长难句分类获取该资料的评论
  93. CourseData courseData = courseDataService.getSentence();
  94. if(courseData != null){
  95. List<Comment> commentList = commentService.list(1, 1, "course_data", courseData.getId().toString());
  96. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  97. }
  98. return ResponseHelp.success(dto);
  99. }
  100. @RequestMapping(value = "/active", method = RequestMethod.PUT)
  101. @ApiOperation(value = "激活长难句", httpMethod = "PUT")
  102. public Response<Boolean> active(@RequestBody @Validated UserSentenceCodeDto dto) {
  103. User user = (User) shiroHelp.getLoginUser();
  104. if (user == null) throw new AuthException("需要登录");
  105. sentenceService.active(user.getId(), dto.getCode());
  106. return ResponseHelp.success(true);
  107. }
  108. @RequestMapping(value = "/article/list", method = RequestMethod.GET)
  109. @ApiOperation(value = "长难句文章列表", httpMethod = "GET")
  110. public Response<List<UserSentenceArticleDto>> listArticle(
  111. HttpSession session) {
  112. User user = (User) shiroHelp.getLoginUser();
  113. List<SentenceArticle> p = sentenceArticleService.all();
  114. List<UserSentenceArticleDto> pr = Transform.convert(p, UserSentenceArticleDto.class);
  115. if (user != null){
  116. // 查询文章进度
  117. List<UserSentenceProgress> progressList = userSentenceProgressService.all(user.getId());
  118. Map<String, UserSentenceProgress> progressMap = new HashMap<>();
  119. for (UserSentenceProgress progress:progressList){
  120. progressMap.put(String.format("%d-%d", progress.getChapter(), progress.getPart()), progress);
  121. }
  122. for (UserSentenceArticleDto dto : pr){
  123. UserSentenceProgress progress = progressMap.get(String.format("%d-%d", dto.getChapter(), dto.getPart()));
  124. dto.setProgress(progress == null ? 0 : progress.getProgress());
  125. dto.setTimes(progress == null ? 0:progress.getTimes());
  126. }
  127. }
  128. return ResponseHelp.success(pr);
  129. }
  130. @RequestMapping(value = "/article/detail", method = RequestMethod.GET)
  131. @ApiOperation(value = "长难句文章详情", httpMethod = "GET")
  132. public Response<UserSentenceArticleDetailDto> detailArticle(
  133. @RequestParam(required = true) Integer articleId
  134. ) {
  135. User user = (User) shiroHelp.getLoginUser();
  136. SentenceArticle article = sentenceArticleService.get(articleId);
  137. UserSentenceArticleDetailDto dto = Transform.convert(article, UserSentenceArticleDetailDto.class);
  138. if (user != null){
  139. // 查询文章进度
  140. UserSentenceProgress progress = userSentenceProgressService.get(user.getId(), article.getChapter(), article.getPart());
  141. if (progress != null){
  142. dto.setProgress(progress.getProgress());
  143. dto.setTimes(progress.getTimes());
  144. }
  145. }
  146. return ResponseHelp.success(dto);
  147. }
  148. @RequestMapping(value = "/article/progress", method = RequestMethod.PUT)
  149. @ApiOperation(value = "更新长难句文章进度", httpMethod = "PUT")
  150. public Response<Boolean> articleProcess(@RequestBody @Validated UserSentenceProgressDto dto) {
  151. UserSentenceProgress entity = Transform.dtoToEntity(dto);
  152. User user = (User) shiroHelp.getLoginUser();
  153. if (user == null) throw new AuthException("需要登录");
  154. // 添加阅读记录
  155. if (dto.getCurrentChapter() != null && dto.getCurrentPart() != null && dto.getTime() != null && dto.getTime() > 0){
  156. userSentenceRecordService.add(UserSentenceRecord.builder()
  157. .userId(user.getId())
  158. .chapter(dto.getCurrentChapter())
  159. .part(dto.getCurrentPart())
  160. .userTime(dto.getTime())
  161. .build());
  162. }
  163. // 获取本章节的最大part数
  164. // Integer max = sentenceArticleService.maxPart(dto.getChapter());
  165. // 更新阅读进度
  166. userSentenceProgressService.updateProgress(user.getId(), dto.getChapter(), dto.getPart(), dto.getProgress());
  167. return ResponseHelp.success(true);
  168. }
  169. @RequestMapping(value = "/paper/list", method = RequestMethod.GET)
  170. @ApiOperation(value = "长难句组卷列表", httpMethod = "GET")
  171. public Response<List<UserSentencePaperDto>> listPaper(
  172. HttpSession session) {
  173. User user = (User) shiroHelp.getLoginUser();
  174. List<SentencePaper> p;
  175. // 查询用户code
  176. if (user != null && sentenceCodeService.isActive(user.getId()) != null){
  177. p = sentencePaperService.listByLogic(SentenceLogic.NO);
  178. } else {
  179. p = sentencePaperService.listByLogic(SentenceLogic.TRAIL);
  180. }
  181. List<UserSentencePaperDto> pr = Transform.convert(p, UserSentencePaperDto.class);
  182. // 获取试卷统计信息
  183. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  184. for(SentencePaper paper : p){
  185. questionNoIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  186. }
  187. Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
  188. Transform.combine(pr, statMap, UserSentencePaperDto.class, "id", "stat");
  189. if (user != null){
  190. // 获取做题记录
  191. Collection ids = Transform.getIds(p, SentencePaper.class, "id");
  192. List<UserPaper> userPaperList = userPaperService.listWithOrigin(user.getId(), PaperOrigin.SENTENCE, ids, null);
  193. Transform.combine(pr, userPaperList, UserSentencePaperDto.class, "id", "paper", UserPaper.class, "originId", UserPaperBaseExtendDto.class);
  194. // 绑定userPaperId,用于关联report
  195. Map userPaperMap = Transform.getMap(userPaperList, UserPaper.class, "originId", "id");
  196. Transform.combine(pr, userPaperMap, UserSentencePaperDto.class, "id", "userPaperId");
  197. // 获取最后一次作业结果
  198. Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  199. List<UserReport> reportList = userReportService.listWithLast(paperIds);
  200. Transform.combine(pr, reportList, UserSentencePaperDto.class, "userPaperId", "report", UserReport.class, "paperId", UserReportExtendDto.class);
  201. }
  202. return ResponseHelp.success(pr);
  203. }
  204. @RequestMapping(value = "/paper", method = RequestMethod.GET)
  205. @ApiOperation(value = "获取练习卷", notes = "获取练习卷", httpMethod = "GET")
  206. public Response<PaperBaseDto> detailPaper(
  207. @RequestParam(required = true, name="id") Integer paperId
  208. ) {
  209. User user = (User) shiroHelp.getLoginUser();
  210. SentencePaper paper = sentencePaperService.get(paperId);
  211. PaperBaseDto paperDto = Transform.convert(paper, PaperBaseDto.class);
  212. return ResponseHelp.success(paperDto);
  213. }
  214. //
  215. // @RequestMapping(value = "/report/detail", method = RequestMethod.GET)
  216. // @ApiOperation(value = "获取详细记录", notes = "获取报告", httpMethod = "GET")
  217. // public Response<UserReportDetailDto> detailReport(
  218. // @RequestParam(required = true, name="id") Integer userReportId
  219. // ) {
  220. // User user = (User) shiroHelp.getLoginUser();
  221. // UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
  222. //
  223. // UserReportDetailDto userReportDto = Transform.convert(report, UserReportDetailDto.class);
  224. //
  225. // // todo 绑定数据
  226. //
  227. // return ResponseHelp.success(userReportDto);
  228. // }
  229. //
  230. // @RequestMapping(value = "/report/question", method = RequestMethod.GET)
  231. // @ApiOperation(value = "获取做题记录", notes = "获取报告题目", httpMethod = "GET")
  232. // public Response<List<UserSentenceQuestionDetailDto>> detailReportQuestion(
  233. // @RequestParam(required = true, name="id") Integer userReportId
  234. // ) {
  235. // User user = (User) shiroHelp.getLoginUser();
  236. // List<UserQuestion> userQuestionList = questionFlowService.listByReport(user.getId(), userReportId);
  237. //
  238. // List<UserSentenceQuestionDetailDto> userQuestionDetailDtos = Transform.convert(userQuestionList, UserSentenceQuestionDetailDto.class);
  239. //
  240. // // todo 绑定数据
  241. //
  242. // return ResponseHelp.success(userQuestionDetailDtos);
  243. // }
  244. //
  245. // @RequestMapping(value = "/start", method = RequestMethod.POST)
  246. // @ApiOperation(value = "开始做题", notes = "提交考试设置", httpMethod = "POST")
  247. // public Response<UserReportBaseDto> start(@RequestBody @Validated SentenceStartDto dto) {
  248. // User user = (User) shiroHelp.getLoginUser();
  249. // JSONObject setting = new JSONObject();
  250. // UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.SENTENCE, dto.getPaperId(), setting);
  251. //
  252. // UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  253. //
  254. // return ResponseHelp.success(userReportBaseDto);
  255. // }
  256. //
  257. // @RequestMapping(value = "/continue", method = RequestMethod.POST)
  258. // @ApiOperation(value = "继续做题", notes = "获取报告信息", httpMethod = "POST")
  259. // public Response<UserReportBaseDto> continueReport(@RequestBody @Validated ReportContinueDto dto) {
  260. // User user = (User) shiroHelp.getLoginUser();
  261. // UserReportRelation report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
  262. //
  263. // UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
  264. //
  265. // return ResponseHelp.success(userReportBaseDto);
  266. // }
  267. //
  268. // @RequestMapping(value = "/next", method = RequestMethod.POST)
  269. // @ApiOperation(value = "获取下一题", notes = "获取下一题", httpMethod = "POST")
  270. // public Response<UserSentenceQuestionBaseDto> next(@RequestBody @Validated ReportNextDto dto) {
  271. // User user = (User) shiroHelp.getLoginUser();
  272. //
  273. // UserQuestion userQuestion = questionFlowService.next(user.getId(), dto.getUserReportId());
  274. //
  275. // UserSentenceQuestionBaseDto baseDto = Transform.convert(userQuestion, UserSentenceQuestionBaseDto.class);
  276. //
  277. // // 绑定question
  278. // baseDto.setQuestion(Transform.convert(questionService.get(userQuestion.getQuestionId()), QuestionExtendDto.class));
  279. //
  280. // // 绑定sentenceQuestion
  281. // baseDto.setSentence(Transform.convert(sentenceQuestionService.get(userQuestion.getQuestionNoId()), SentenceQuestionBaseExtendDto.class));
  282. //
  283. // // 绑定collect
  284. // baseDto.setCollect(userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId()) != null);
  285. //
  286. // return ResponseHelp.success(null);
  287. // }
  288. //
  289. // @RequestMapping(value = "/submit", method = RequestMethod.POST)
  290. // @ApiOperation(value = "提交题目答案", notes = "提交题目", httpMethod = "POST")
  291. // public Response<Boolean> submit(@RequestBody @Validated QuestionSubmitDto dto) {
  292. // User user = (User) shiroHelp.getLoginUser();
  293. // Boolean result = questionFlowService.submit(user.getId(), dto.getUserQuestionId(), dto.getTime(), dto.getAnswer(), dto.getSetting());
  294. // return ResponseHelp.success(result);
  295. // }
  296. //
  297. // @RequestMapping(value = "/finish", method = RequestMethod.POST)
  298. // @ApiOperation(value = "完成考试", notes = "完成考试", httpMethod = "POST")
  299. // public Response<Boolean> finish(@RequestBody @Validated ReportFinishDto dto) {
  300. // User user = (User) shiroHelp.getLoginUser();
  301. //
  302. // Boolean result = questionFlowService.finish(user.getId(), dto.getUserReportId());
  303. // return ResponseHelp.success(result);
  304. // }
  305. //
  306. // @RequestMapping(value = "/restart", method = RequestMethod.POST)
  307. // @ApiOperation(value = "重置考试", notes = "重置考试", httpMethod = "POST")
  308. // public Response<Boolean> restart(@RequestBody @Validated PaperRestartDto dto) {
  309. // User user = (User) shiroHelp.getLoginUser();
  310. //
  311. // questionFlowService.restart(dto.getUserPaperId(), user.getId());
  312. //
  313. // return ResponseHelp.success(true);
  314. // }
  315. }