MyController.java 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.github.pagehelper.Page;
  5. import com.nuliji.tools.*;
  6. import com.nuliji.tools.exception.ParameterException;
  7. import com.nuliji.tools.exception.SystemException;
  8. import com.qxgmat.data.constants.enums.MessageType;
  9. import com.qxgmat.data.constants.enums.QuestionSubject;
  10. import com.qxgmat.data.constants.enums.QuestionType;
  11. import com.qxgmat.data.constants.enums.SettingKey;
  12. import com.qxgmat.data.constants.enums.module.*;
  13. import com.qxgmat.data.constants.enums.status.AskStatus;
  14. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  15. import com.qxgmat.data.constants.enums.user.DataType;
  16. import com.qxgmat.data.dao.entity.*;
  17. import com.qxgmat.data.inline.PaperStat;
  18. import com.qxgmat.data.inline.UserQuestionStat;
  19. import com.qxgmat.data.relation.entity.*;
  20. import com.qxgmat.dto.extend.*;
  21. import com.qxgmat.dto.request.*;
  22. import com.qxgmat.dto.request.CommentDto;
  23. import com.qxgmat.dto.request.FaqDto;
  24. import com.qxgmat.dto.request.UserCollectQuestionDto;
  25. import com.qxgmat.dto.request.UserNoteQuestionDto;
  26. import com.qxgmat.dto.response.*;
  27. import com.qxgmat.help.AiHelp;
  28. import com.qxgmat.help.MailHelp;
  29. import com.qxgmat.help.ShiroHelp;
  30. import com.qxgmat.service.*;
  31. import com.qxgmat.service.extend.*;
  32. import com.qxgmat.service.inline.*;
  33. import io.swagger.annotations.Api;
  34. import io.swagger.annotations.ApiOperation;
  35. import org.apache.logging.log4j.util.Strings;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.beans.factory.annotation.Value;
  38. import org.springframework.http.MediaType;
  39. import org.springframework.validation.annotation.Validated;
  40. import org.springframework.web.bind.annotation.*;
  41. import org.springframework.web.multipart.MultipartFile;
  42. import javax.servlet.http.HttpServletRequest;
  43. import javax.servlet.http.HttpSession;
  44. import javax.validation.Validator;
  45. import java.io.File;
  46. import java.io.IOException;
  47. import java.text.DateFormat;
  48. import java.text.ParseException;
  49. import java.util.*;
  50. import java.util.stream.Collectors;
  51. /**
  52. * Created by GaoJie on 2017/10/31.
  53. */
  54. @RestController
  55. @RequestMapping("/api/my")
  56. @Api(tags = "用户接口", description = "获取与操作当前用户信息", produces = MediaType.APPLICATION_JSON_VALUE)
  57. public class MyController {
  58. @Value("${upload.local_path}")
  59. private String localPath;
  60. @Value("${upload.web_url}")
  61. private String webUrl;
  62. @Autowired
  63. private Validator validator;
  64. @Autowired
  65. private ShiroHelp shiroHelp;
  66. @Autowired
  67. private AiHelp aiHelp;
  68. @Autowired
  69. private MailHelp mailHelp;
  70. @Autowired
  71. private PreviewService previewService;
  72. @Autowired
  73. private SettingService settingService;
  74. @Autowired
  75. private ExerciseStructService exerciseStructService;
  76. @Autowired
  77. private CourseService courseService;
  78. @Autowired
  79. private CourseNoService courseNoService;
  80. @Autowired
  81. private QuestionService questionService;
  82. @Autowired
  83. private QuestionNoService questionNoService;
  84. @Autowired
  85. private SentenceQuestionService sentenceQuestionService;
  86. @Autowired
  87. private TextbookQuestionService textbookQuestionService;
  88. @Autowired
  89. private TextbookTopicService textbookTopicService;
  90. @Autowired
  91. private TextbookLibraryService textbookLibraryService;
  92. @Autowired
  93. private CourseDataService courseDataService;
  94. @Autowired
  95. private CourseExperienceService courseExperienceService;
  96. @Autowired
  97. private CourseDataHistoryService courseDataHistoryService;
  98. @Autowired
  99. private CourseTeacherService courseTeacherService;
  100. @Autowired
  101. private FaqService faqService;
  102. @Autowired
  103. private CommentService commentService;
  104. @Autowired
  105. private UsersService usersService;
  106. @Autowired
  107. private UserMessageService userMessageService;
  108. @Autowired
  109. private UserCourseRecordService userCourseRecordService;
  110. @Autowired
  111. private UserCourseAppointmentService userCourseAppointmentService;
  112. @Autowired
  113. private UserCourseProgressService userCourseProgressService;
  114. @Autowired
  115. private UserSentenceRecordService userSentenceRecordService;
  116. @Autowired
  117. private UserServiceService userServiceService;
  118. @Autowired
  119. private UserCollectQuestionService userCollectQuestionService;
  120. @Autowired
  121. private UserCollectExperienceService userCollectExperienceService;
  122. @Autowired
  123. private UserNoteQuestionService userNoteQuestionService;
  124. @Autowired
  125. private UserNoteCourseService userNoteCourseService;
  126. @Autowired
  127. private UserAskQuestionService userAskQuestionService;
  128. @Autowired
  129. private UserAskCourseService userAskCourseService;
  130. @Autowired
  131. private UserFeedbackErrorService userFeedbackErrorService;
  132. @Autowired
  133. private UserTextbookFeedbackService userTextbookFeedbackService;
  134. @Autowired
  135. private UserQuestionService userQuestionService;
  136. @Autowired
  137. private UserReportService userReportService;
  138. @Autowired
  139. private UserPaperService userPaperService;
  140. @Autowired
  141. private UserPaperQuestionService userPaperQuestionService;
  142. @Autowired
  143. private UserOrderService userOrderService;
  144. @Autowired
  145. private UserOrderRecordService userOrderRecordService;
  146. @Autowired
  147. private QuestionFlowService questionFlowService;
  148. @Autowired
  149. private SentenceService sentenceService;
  150. @Autowired
  151. private CourseExtendService courseExtendService;
  152. @Autowired
  153. private OrderFlowService orderFlowService;
  154. @Autowired
  155. private MessageExtendService messageExtendService;
  156. @RequestMapping(value = "/email", method = RequestMethod.POST)
  157. @ApiOperation(value = "绑定邮箱", httpMethod = "POST")
  158. public Response<Boolean> email(@RequestBody @Validated UserEmailDto dto, HttpSession session, HttpServletRequest request) {
  159. User user = (User) shiroHelp.getLoginUser();
  160. usersService.edit(User.builder()
  161. .id(user.getId())
  162. .email(dto.getEmail())
  163. .build());
  164. return ResponseHelp.success(true);
  165. }
  166. @RequestMapping(value = "/info", method = RequestMethod.POST)
  167. @ApiOperation(value = "修改用户信息", httpMethod = "POST")
  168. public Response<Boolean> info(@RequestBody @Validated UserInfoDto dto){
  169. User user = (User) shiroHelp.getLoginUser();
  170. usersService.edit(User.builder()
  171. .id(user.getId())
  172. .nickname(dto.getNickname())
  173. .avatar(dto.getAvatar())
  174. .build());
  175. return ResponseHelp.success(true);
  176. }
  177. @RequestMapping(value = "/real/front", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.POST)
  178. @ApiOperation(value = "实名认证", notes = "保存用户实名信息", httpMethod = "POST")
  179. public Response<UserRealDto> realFront(@RequestParam("file") MultipartFile file) throws IOException {
  180. if (file.isEmpty()) {
  181. throw new ParameterException("上传文件为空");
  182. }
  183. User user = (User) shiroHelp.getLoginUser();
  184. UserRealDto dto = new UserRealDto();
  185. Map<String, String> map = aiHelp.orcIdcardFront(file.getBytes());
  186. dto.setName(map.get("name"));
  187. dto.setAddress(map.get("address"));
  188. dto.setIdentity(map.get("identity"));
  189. User in = usersService.getByIdentity(map.get("identity"));
  190. if (in != null){
  191. throw new ParameterException("该身份证已被其他账号认证");
  192. }
  193. String frontName = UUID.randomUUID().toString();
  194. try {
  195. File frontDest = new File(localPath + File.separator+frontName);
  196. file.transferTo(frontDest);
  197. dto.setPhotoFront(webUrl+frontName);
  198. usersService.edit(User.builder()
  199. .id(user.getId())
  200. .realAddress(dto.getAddress())
  201. .realName(dto.getName())
  202. .realIdentity(dto.getIdentity())
  203. .realPhotoFront(dto.getPhotoFront())
  204. .build());
  205. return ResponseHelp.success(dto);
  206. } catch (IOException e) {
  207. e.printStackTrace();
  208. return ResponseHelp.exception(new SystemException("图片上传失败"));
  209. }
  210. }
  211. @RequestMapping(value = "/real/back", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.POST)
  212. @ApiOperation(value = "实名认证", notes = "保存用户实名信息", httpMethod = "POST")
  213. public Response<UserRealDto> realBack(@RequestParam("file") MultipartFile file) throws IOException {
  214. if (file.isEmpty()) {
  215. throw new ParameterException("上传文件为空");
  216. }
  217. User user = (User) shiroHelp.getLoginUser();
  218. UserRealDto dto = new UserRealDto();
  219. aiHelp.orcIdcardBack(file.getBytes());
  220. String backName = UUID.randomUUID().toString();
  221. try {
  222. File backDest = new File(localPath + File.separator+backName);
  223. file.transferTo(backDest);
  224. dto.setPhotoBack(webUrl+backName);
  225. usersService.edit(User.builder()
  226. .id(user.getId())
  227. .realPhotoBack(dto.getPhotoBack())
  228. .build());
  229. return ResponseHelp.success(dto);
  230. } catch (IOException e) {
  231. e.printStackTrace();
  232. return ResponseHelp.exception(new SystemException("图片上传失败"));
  233. }
  234. }
  235. @RequestMapping(value = "/real/finish", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.POST)
  236. @ApiOperation(value = "实名认证", notes = "保存用户实名信息", httpMethod = "POST")
  237. public Response<UserRealDto> realFinish() {
  238. User user = (User) shiroHelp.getLoginUser();
  239. UserRealDto dto = new UserRealDto();
  240. User in = usersService.get(user.getId());
  241. if (in.getRealAddress() == null || !in.getRealAddress().equals("")){
  242. throw new ParameterException("实名认证流程错误");
  243. }
  244. if (in.getRealIdentity() == null || !in.getRealIdentity().equals("")){
  245. throw new ParameterException("实名认证流程错误");
  246. }
  247. if (in.getRealName() == null || !in.getRealName().equals("")){
  248. throw new ParameterException("实名认证流程错误");
  249. }
  250. if (in.getRealPhotoFront() == null || !in.getRealPhotoFront().equals("")){
  251. throw new ParameterException("实名认证流程错误");
  252. }
  253. if (in.getRealPhotoBack() == null || !in.getRealPhotoBack().equals("")){
  254. throw new ParameterException("实名认证流程错误");
  255. }
  256. usersService.edit(User.builder()
  257. .id(user.getId())
  258. .realStatus(1)
  259. .realTime(new Date())
  260. .build());
  261. orderFlowService.giveReal(user.getId());
  262. return ResponseHelp.success(dto);
  263. }
  264. @RequestMapping(value = "/invite/email", method = RequestMethod.POST)
  265. @ApiOperation(value = "发送邮件邀请", httpMethod = "POST")
  266. public Response<Boolean> inviteEmail(@RequestBody @Validated InviteEmailDto dto) {
  267. User user = (User) shiroHelp.getLoginUser();
  268. messageExtendService.sendInviteEmail(user, dto.getEmails(), user.getInviteCode());
  269. return ResponseHelp.success(true);
  270. }
  271. @RequestMapping(value = "/message", method = RequestMethod.GET)
  272. @ApiOperation(value = "用户站内信", notes = "用户消息列表", httpMethod = "GET")
  273. public Response<PageMessage<UserMessage>> message(
  274. @RequestParam(required = false, defaultValue = "1") int page,
  275. @RequestParam(required = false, defaultValue = "100") int size,
  276. @RequestParam(required = false) String messageType,
  277. @RequestParam(required = false) Integer read
  278. ) {
  279. User user = (User) shiroHelp.getLoginUser();
  280. Page<UserMessage> p = userMessageService.list(page, size, user.getId(), MessageType.ValueOf(messageType), read);
  281. return ResponseHelp.success(p, page, size, p.getTotal());
  282. }
  283. @RequestMapping(value = "/message/read", method = RequestMethod.PUT)
  284. @ApiOperation(value = "读取消息", notes = "读取用户消息/全部", httpMethod = "PUT")
  285. public Response<Boolean> readMessage(@RequestBody @Validated MessageReadDto dto) {
  286. User user = (User) shiroHelp.getLoginUser();
  287. if (dto.getAll()){
  288. userMessageService.clearAll(user.getId());
  289. }else{
  290. userMessageService.clear(user.getId(), dto.getId());
  291. }
  292. return ResponseHelp.success(true);
  293. }
  294. @RequestMapping(value = "/clear/exercise/latest", method = RequestMethod.PUT)
  295. @ApiOperation(value = "清除最后一次做题记录", notes = "清除最后一次做题记录", httpMethod = "PUT")
  296. public Response<Boolean> clearLatestExercise() {
  297. User user = (User) shiroHelp.getLoginUser();
  298. usersService.edit(User.builder().id(user.getId()).latestExercise(0).build());
  299. return ResponseHelp.success(true);
  300. }
  301. @RequestMapping(value = "/clear/error/latest", method = RequestMethod.PUT)
  302. @ApiOperation(value = "清除最后一次错题组卷做题记录", notes = "清除最后一次错题组卷做题记录", httpMethod = "PUT")
  303. public Response<Boolean> clearLatestError() {
  304. User user = (User) shiroHelp.getLoginUser();
  305. usersService.edit(User.builder().id(user.getId()).latestError(0).build());
  306. return ResponseHelp.success(true);
  307. }
  308. @RequestMapping(value = "/prepare", method = RequestMethod.PUT)
  309. @ApiOperation(value = "修改备考信息", notes = "修改用户备考信息", httpMethod = "PUT")
  310. public Response<Boolean> editPrepare(@RequestBody @Validated UserPrepareDto dto) {
  311. User entity = Transform.dtoToEntity(dto);
  312. User user = (User) shiroHelp.getLoginUser();
  313. entity.setId(user.getId());
  314. if (user.getPrepareTime() == null){
  315. // 邀请奖励
  316. orderFlowService.givePrepare(user.getId());
  317. }
  318. entity.setPrepareTime(new Date());
  319. usersService.edit(entity);
  320. return ResponseHelp.success(true);
  321. }
  322. @RequestMapping(value = "/prepare", method = RequestMethod.GET)
  323. @ApiOperation(value = "获取备考信息", notes = "获取备考信息及分布", httpMethod = "GET")
  324. public Response<UserPrepareDetailDto> getPrepare() {
  325. User user = (User) shiroHelp.getLoginUser();
  326. User entity = usersService.get(user.getId());
  327. UserPrepareDetailDto dto = Transform.convert(entity, UserPrepareDetailDto.class);
  328. Setting setting = settingService.getByKey(SettingKey.PREPARE_INFO);
  329. JSONObject value = setting.getValue();
  330. return ResponseHelp.success(dto);
  331. }
  332. @RequestMapping(value = "/study", method = RequestMethod.GET)
  333. @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
  334. public Response<UserStudyDayDto> studyTime(
  335. @RequestParam(required = false) String date
  336. ) {
  337. User user = (User) shiroHelp.getLoginUser();
  338. Date day;
  339. try {
  340. day = DateFormat.getDateInstance().parse(date);
  341. } catch (ParseException e) {
  342. throw new ParameterException("日期格式错误");
  343. }
  344. Date endDay = Tools.addDate(day, 1);
  345. String startTime = day.toString();
  346. String endTime = endDay.toString();
  347. UserStudyDayDto dto = new UserStudyDayDto();
  348. List<ExerciseStruct> p = exerciseStructService.main();
  349. Map<String, String> m = new HashMap<>();
  350. for (ExerciseStruct struct : p){
  351. if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
  352. m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
  353. }
  354. // 获取总用户数
  355. Integer total = usersService.count();
  356. // 获取练习统计 - 按题型进行分组统计
  357. Integer exerciseTime = 0;
  358. Integer exerciseQuestion = 0;
  359. List<UserExerciseExtendDto> exerciseList = new ArrayList<>();
  360. List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), startTime, endTime);
  361. for(UserStudyStatRelation type:typeList){
  362. exerciseTime += type.getUserTime();
  363. exerciseQuestion += type.getUserNumber();
  364. exerciseList.add(new UserExerciseExtendDto(m.get(type.getModule()), type.getUserNumber(), type.getUserTime(), type.getUserCorrect()));
  365. }
  366. // todo 练习统计排行
  367. UserRankStatRelation exerciseRank = userReportService.rankExerciseByTime(user.getId(), startTime, endTime);
  368. exerciseRank.setTotal(total);
  369. dto.setExerciseTime(exerciseTime);
  370. dto.setExerciseQuestion(exerciseQuestion);
  371. dto.setExerciseList(exerciseList);
  372. dto.setExerciseExceed(exerciseRank);
  373. // 获取模考统计 - 按卷子
  374. Integer examinationTime = 0;
  375. Integer examinationPaper = 0;
  376. List<UserReport> userReportList = userReportService.getByModule(user.getId(), PaperModule.EXAMINATION, startTime, endTime);
  377. Collection paperIds = Transform.getIds(userReportList, UserReport.class, "paperId");
  378. List<UserPaper> userPaperList = userPaperService.select(paperIds);
  379. Map userPaper = Transform.getMap(userPaperList, UserPaper.class, "id");
  380. List<UserPaperDetailExtendDto> examinationPaperList = new ArrayList<>(userReportList.size());
  381. for(UserReport report: userReportList){
  382. examinationTime += report.getUserTime();
  383. examinationPaper += 1;
  384. UserPaperDetailExtendDto d = Transform.convert(userPaper.get(report.getPaperId()), UserPaperDetailExtendDto.class);
  385. d.setReport(Transform.convert(report, UserReportExtendDto.class));
  386. examinationPaperList.add(d);
  387. }
  388. // todo 模考统计排行
  389. UserRankStatRelation examinationRank = userReportService.rankExaminationByTime(user.getId(), startTime, endTime);
  390. examinationRank.setTotal(total);
  391. dto.setExaminationTime(examinationTime);
  392. dto.setExaminationPaper(examinationPaper);
  393. dto.setExaminationList(examinationPaperList);
  394. dto.setExaminationExceed(examinationRank);
  395. // 获取课程访问记录 - 按课时
  396. Integer courseTime = 0;
  397. Integer courseNumber = 0;
  398. List<UserCourseRecord> userCourseRecordList = userCourseRecordService.getByTime(user.getId(), startTime, endTime);
  399. Collection courseIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "courseId");
  400. Collection courseNoIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "noId");
  401. List<Course> courseList = courseService.select(courseIds);
  402. Map courseMap = Transform.getMap(courseList, Course.class, "id", "title");
  403. List<CourseNo> courseNoList = courseNoService.select(courseNoIds);
  404. Map classCourseNoMap = Transform.getMap(courseNoList, CourseNo.class, "id", "content");
  405. List<UserCourseResultExtendDto> courseResultList = new ArrayList<>(userCourseRecordList.size());
  406. for(UserCourseRecord record:userCourseRecordList){
  407. courseTime += record.getUserTime();
  408. courseNumber += 1;
  409. UserCourseResultExtendDto d = Transform.convert(record, UserCourseResultExtendDto.class);
  410. d.setTitle((String)courseMap.get(record.getCourseId()));
  411. d.setContent((String)classCourseNoMap.get(record.getCourseNoId()));
  412. courseResultList.add(d);
  413. }
  414. // todo 听课统计排行
  415. UserRankStatRelation classRank = userCourseRecordService.rankByTime(user.getId(), startTime, endTime);
  416. classRank.setTotal(total);
  417. dto.setCourseTime(courseTime);
  418. dto.setCourseNumber(courseNumber);
  419. dto.setCourseList(courseResultList);
  420. dto.setCourseExceed(classRank);
  421. return ResponseHelp.success(dto);
  422. }
  423. @RequestMapping(value = "/study/week", method = RequestMethod.GET)
  424. @ApiOperation(value = "获取本周记录", notes = "获取本周学习记录", httpMethod = "GET")
  425. public Response<UserStudyDetailDto> studyWeekTime(
  426. @RequestParam(required = false) Integer week
  427. ) {
  428. User user = (User) shiroHelp.getLoginUser();
  429. UserStudyDetailDto dto = new UserStudyDetailDto();
  430. dto.setCreateTime(user.getCreateTime());
  431. dto.setDays((int)((user.getCreateTime().getTime() - new Date().getTime()) / (1000*3600*24)));
  432. Date now = Tools.today();
  433. int day = Tools.getDayOfWeek(now);
  434. Date start = Tools.addDate(now, -1 * (day + week * 7));
  435. Date end = Tools.addDate(start, 7);
  436. Integer time = 0;
  437. time += courseExtendService.studyTime(user.getId(), start, end);
  438. time += sentenceService.studyTime(user.getId(), start, end);
  439. time += questionFlowService.studyTime(user.getId(), start, end);
  440. dto.setTime(time);
  441. Integer avgTime = 0;
  442. avgTime += courseExtendService.studyAvgTime(start, end);
  443. avgTime += sentenceService.studyAvgTime(start, end);
  444. avgTime += questionFlowService.studyAvgTime(start, end);
  445. dto.setAvgTime(avgTime);
  446. return ResponseHelp.success(dto);
  447. }
  448. @RequestMapping(value = "/study/total", method = RequestMethod.GET)
  449. @ApiOperation(value = "获取总学习记录", notes = "获取总学习记录", httpMethod = "GET")
  450. public Response<UserStudyDetailDto> studyTotalTime() {
  451. User user = (User) shiroHelp.getLoginUser();
  452. UserStudyDetailDto dto = new UserStudyDetailDto();
  453. dto.setCreateTime(user.getCreateTime());
  454. dto.setDays((int)((user.getCreateTime().getTime() - new Date().getTime()) / (1000*3600*24)));
  455. Integer totalTime = 0;
  456. Map<String, Integer> categoryMap = new HashMap<>();
  457. // 按模块来源分组查询: module=> sentence, examination, collect+error, 忽略exercise,preview
  458. List<UserStudyStatRelation> moduleList = userReportService.statGroupModule(user.getId());
  459. for(UserStudyStatRelation module:moduleList){
  460. // 练习时间过滤
  461. if (module.getModule().equals(PaperModule.EXERCISE.key)){
  462. continue;
  463. }
  464. Integer time = module.getUserTime();
  465. String key = module.getModule();
  466. totalTime += time;
  467. // 收藏及错误组卷合并
  468. if (module.getModule().equals(PaperOrigin.COLLECT.key)
  469. || module.getModule().equals(PaperOrigin.ERROR.key)){
  470. key = "freedom";
  471. time += categoryMap.getOrDefault(key, 0);
  472. }else if (module.getModule().equals(PaperOrigin.PREVIEW.key)){
  473. key = PaperOrigin.EXERCISE.key;
  474. }
  475. categoryMap.put(key, time);
  476. }
  477. // 按题型统计练习
  478. List<UserStudyStatRelation> exerciseList = userReportService.statGroupExerciseType(user.getId(), null, null);
  479. for(UserStudyStatRelation type:exerciseList){
  480. totalTime += type.getUserTime();
  481. categoryMap.put(type.getModule(), type.getUserTime());
  482. }
  483. // 按题型统计预习作业
  484. List<UserStudyStatRelation> previewList = userReportService.statGroupExerciseType(user.getId(), null, null);
  485. for(UserStudyStatRelation type:previewList){
  486. totalTime += type.getUserTime();
  487. categoryMap.put(type.getModule(), type.getUserTime());
  488. }
  489. // 按题型统计课程
  490. List<UserModuleRecordStatRelation> recordList = userCourseRecordService.statGroupType(user.getId(), null, null);
  491. for (UserModuleRecordStatRelation record : recordList){
  492. totalTime += record.getUserTime();
  493. // 累加同类型时间
  494. Integer time = categoryMap.getOrDefault(record.getModule(), 0);
  495. categoryMap.put(record.getModule(), time);
  496. }
  497. // 获取长难句阅读统计
  498. UserRecordStatRelation sentenceStatRelation = userSentenceRecordService.stat(user.getId(), null, null);
  499. if (sentenceStatRelation != null){
  500. Integer sentenceTime = categoryMap.getOrDefault(PaperModule.SENTENCE.key, 0);
  501. categoryMap.put(PaperModule.SENTENCE.key, sentenceTime + sentenceStatRelation.getUserTime());
  502. }
  503. List<ExerciseStruct> p = exerciseStructService.main();
  504. Map<String, String> m = new HashMap<>();
  505. for (ExerciseStruct struct : p){
  506. if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
  507. m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
  508. }
  509. // 组装数据
  510. List<UserStudyExtendDto> categorys = new ArrayList<>();
  511. if (categoryMap.containsKey(PaperModule.SENTENCE.key)) categorys.add(new UserStudyExtendDto(m.get(PaperModule.SENTENCE.key), categoryMap.get(PaperModule.SENTENCE.key)));
  512. if (categoryMap.containsKey(QuestionType.SC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.SC.key), categoryMap.get(QuestionType.SC.key)));
  513. if (categoryMap.containsKey(QuestionType.RC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.RC.key), categoryMap.get(QuestionType.RC.key)));
  514. if (categoryMap.containsKey(QuestionType.CR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.CR.key), categoryMap.get(QuestionType.CR.key)));
  515. if (categoryMap.containsKey(QuestionType.PS.key)){
  516. // 累加数学
  517. Integer time = categoryMap.getOrDefault(QuestionSubject.QUANT.key, 0);
  518. categoryMap.put(QuestionSubject.QUANT.key, time + categoryMap.get(QuestionType.PS.key));
  519. }
  520. if (categoryMap.containsKey(QuestionType.DS.key)){
  521. // 累加数学
  522. Integer time = categoryMap.getOrDefault(QuestionSubject.QUANT.key, 0);
  523. categoryMap.put(QuestionSubject.QUANT.key, time + categoryMap.get(QuestionType.DS.key));
  524. }
  525. if (categoryMap.containsKey(QuestionSubject.QUANT.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionSubject.QUANT.key), categoryMap.get(QuestionSubject.QUANT.key)));
  526. if (categoryMap.containsKey(QuestionType.IR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.IR.key), categoryMap.get(QuestionType.IR.key)));
  527. if (categoryMap.containsKey(QuestionType.AWA.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.AWA.key), categoryMap.get(QuestionType.AWA.key)));
  528. if (categoryMap.containsKey(PaperModule.EXAMINATION.key)) categorys.add(new UserStudyExtendDto("模考", categoryMap.get(PaperModule.EXAMINATION.key)));
  529. if (categoryMap.containsKey("freedom")) categorys.add(new UserStudyExtendDto("自由组卷", categoryMap.get("freedom")));
  530. dto.setTime(totalTime);
  531. dto.setCategorys(categorys);
  532. return ResponseHelp.success(dto);
  533. }
  534. @RequestMapping(value = "/data", method = RequestMethod.GET)
  535. @ApiOperation(value = "获取做题数据", notes = "获取做题数据", httpMethod = "GET")
  536. public Response<Map<String, UserDataDto>> questionData(
  537. @RequestParam(required = false) String module,
  538. @RequestParam(required = false) String subject,
  539. @RequestParam(required = false) Integer[] structIds,
  540. @RequestParam(required = false) String startTime,
  541. @RequestParam(required = false) String endTime
  542. ) {
  543. User user = (User) shiroHelp.getLoginUser();
  544. QuestionSubject questionSubject = QuestionSubject.ValueOf(subject);
  545. StructModule structModule = StructModule.ValueOf(module);
  546. List<QuestionNo> questionNoList = questionNoService.listByStruct(structModule, structIds);
  547. List<QuestionNoRelation> relationList = questionNoService.relation(questionNoList);
  548. Map<Number, QuestionNoRelation> relationMap = new HashMap<>();
  549. for(QuestionNoRelation relation : relationList){
  550. relationMap.put(relation.getId(), relation);
  551. }
  552. List<String> questionTypes = QuestionType.FromSubject(questionSubject);
  553. Map<String, UserDataDto> dtoMap = new HashMap<>();
  554. for(String questionType : questionTypes){
  555. UserDataDto dto = new UserDataDto();
  556. JSONObject placeMap = new JSONObject();
  557. JSONObject difficultMap = new JSONObject();
  558. Integer correctTime = 0;
  559. Integer incorrectTime = 0;
  560. List<QuestionNo> list = relationList.stream().filter((row)->row.getQuestion().getQuestionType().equals(questionType)).collect(Collectors.toList());
  561. PaperStat stat = questionNoService.statPaper(list);
  562. dto.setTotalCorrect(stat.getTotalCorrect());
  563. dto.setTotalNumber(stat.getTotalNumber());
  564. dto.setTotalTime(stat.getTotalTime());
  565. Collection questionNoIds = Transform.getIds(list, QuestionNo.class, "id");
  566. List<UserQuestion> userQuestionList = userQuestionService.listByQuestionWithTime(user.getId(), QuestionModule.BASE, questionNoIds, startTime, endTime);
  567. UserQuestionStat userQuestionStat = userQuestionService.statQuestion(userQuestionList);
  568. dto.setUserCorrect(userQuestionStat.getUserCorrect());
  569. dto.setUserNumber(userQuestionStat.getUserNumber());
  570. dto.setUserTime(userQuestionStat.getUserTime());
  571. for (UserQuestion userQuestion:userQuestionList){
  572. QuestionNoRelation relation = relationMap.get(userQuestion.getQuestionNoId());
  573. // 考点用时,以及正确度
  574. String placeKey = relation.getQuestion().getPlace();
  575. JSONObject place = placeMap.getJSONObject(placeKey);
  576. if (place == null){
  577. place = new JSONObject();
  578. place.put("key", placeKey);
  579. place.put("userNumber", 1);
  580. place.put("userCorrect", userQuestion.getIsCorrect());
  581. place.put("userTime", userQuestion.getUserTime());
  582. placeMap.put(placeKey, place);
  583. }else{
  584. place.put("userNumber", place.getInteger("userNumber") + 1);
  585. place.put("userCorrect", place.getInteger("userCorrect") + userQuestion.getIsCorrect());
  586. place.put("userTime", place.getInteger("userTime") + userQuestion.getUserTime());
  587. }
  588. // 难度正确度
  589. String difficultKey = relation.getQuestion().getDifficult();
  590. JSONObject difficult = difficultMap.getJSONObject(difficultKey);
  591. if (difficult == null){
  592. difficult = new JSONObject();
  593. difficult.put("key", difficultKey);
  594. difficult.put("userNumber", 1);
  595. difficult.put("userCorrect", userQuestion.getIsCorrect());
  596. difficult.put("totalNumber", relation.getTotalNumber());
  597. difficult.put("totalCorrect", relation.getTotalCorrect());
  598. difficultMap.put(difficultKey, difficult);
  599. }else{
  600. difficult.put("userNumber", difficult.getInteger("userNumber") + 1);
  601. difficult.put("userCorrect", difficult.getInteger("userCorrect") + userQuestion.getIsCorrect());
  602. difficult.put("totalNumber", difficult.getInteger("totalNumber") + relation.getTotalNumber());
  603. difficult.put("totalCorrect", difficult.getInteger("totalCorrect") + relation.getTotalCorrect());
  604. }
  605. if (userQuestion.getIsCorrect() > 0){
  606. correctTime += userQuestion.getUserTime();
  607. }else{
  608. incorrectTime += userQuestion.getUserTime();
  609. }
  610. }
  611. JSONArray difficult = new JSONArray();
  612. JSONArray place = new JSONArray();
  613. difficult.addAll(difficultMap.values());
  614. place.addAll(placeMap.values());
  615. dto.setDifficult(difficult);
  616. dto.setPlace(place);
  617. dto.setCorrectTime(correctTime);
  618. dto.setIncorrectTime(incorrectTime);
  619. dtoMap.put(questionType, dto);
  620. }
  621. return ResponseHelp.success(dtoMap);
  622. }
  623. @RequestMapping(value = "/collect/experience/add", method = RequestMethod.PUT)
  624. @ApiOperation(value = "添加心经收藏", notes = "添加心经收藏", httpMethod = "PUT")
  625. public Response<Boolean> addExperienceCollect(@RequestBody @Validated UserCollectExperienceDto dto) {
  626. UserCollectExperience entity = Transform.dtoToEntity(dto);
  627. User user = (User) shiroHelp.getLoginUser();
  628. entity.setUserId(user.getId());
  629. userCollectExperienceService.addExperience(entity);
  630. return ResponseHelp.success(true);
  631. }
  632. @RequestMapping(value = "/collect/experience/delete", method = RequestMethod.DELETE)
  633. @ApiOperation(value = "移除心经收藏", notes = "移除心经收藏", httpMethod = "DELETE")
  634. public Response<Boolean> deleteExperienceCollect(Integer experienceId) {
  635. User user = (User) shiroHelp.getLoginUser();
  636. Boolean result = userCollectExperienceService.deleteExperience(user.getId(), experienceId);
  637. return ResponseHelp.success(result);
  638. }
  639. @RequestMapping(value = "/collect/experience/list", method = RequestMethod.GET)
  640. @ApiOperation(value = "获取收藏心经列表", notes = "获取收藏心经列表", httpMethod = "GET")
  641. public Response<PageMessage<CourseExperience>> listExperienceCollect(
  642. @RequestParam(required = false, defaultValue = "1") int page,
  643. @RequestParam(required = false, defaultValue = "100") int size,
  644. @RequestParam(required = false) String startTime,
  645. @RequestParam(required = false) String endTime,
  646. @RequestParam(required = false, defaultValue = "id") String order, // collect_time, update_time
  647. @RequestParam(required = false, defaultValue = "desc") String direction,
  648. HttpSession session) {
  649. User user = (User) shiroHelp.getLoginUser();
  650. Page<CourseExperience> p = courseExperienceService.listWithUser(page, size, user.getId(), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  651. return ResponseHelp.success(p, page, size, p.getTotal());
  652. }
  653. @RequestMapping(value = "/collect/question/add", method = RequestMethod.PUT)
  654. @ApiOperation(value = "添加题目收藏", notes = "添加题目收藏", httpMethod = "PUT")
  655. public Response<Boolean> addQuestionCollect(@RequestBody @Validated UserCollectQuestionDto dto) {
  656. UserCollectQuestion entity = Transform.dtoToEntity(dto);
  657. User user = (User) shiroHelp.getLoginUser();
  658. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  659. case BASE:
  660. entity.setQuestionModule(QuestionModule.BASE.key);
  661. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  662. entity.setQuestionId(questionNo.getQuestionId());
  663. entity.setQuestionNoId(questionNo.getId());
  664. break;
  665. case SENTENCE:
  666. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  667. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  668. entity.setQuestionId(sentenceQuestion.getQuestionId());
  669. entity.setQuestionNoId(sentenceQuestion.getId());
  670. break;
  671. case TEXTBOOK:
  672. entity.setQuestionModule(QuestionModule.TEXTBOOK.key);
  673. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  674. entity.setQuestionId(textbookQuestion.getQuestionId());
  675. entity.setQuestionNoId(textbookQuestion.getId());
  676. break;
  677. }
  678. entity.setUserId(user.getId());
  679. userCollectQuestionService.addQuestion(entity);
  680. return ResponseHelp.success(true);
  681. }
  682. @RequestMapping(value = "/collect/question/delete", method = RequestMethod.DELETE)
  683. @ApiOperation(value = "移除题目收藏", notes = "移除题目收藏", httpMethod = "DELETE")
  684. public Response<Boolean> deleteQuestionCollect(String questionModule, Integer questionNoId) {
  685. User user = (User) shiroHelp.getLoginUser();
  686. Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), QuestionModule.ValueOf(questionModule), questionNoId);
  687. return ResponseHelp.success(result);
  688. }
  689. @RequestMapping(value = "/collect/question/bind", method = RequestMethod.POST)
  690. @ApiOperation(value = "收藏题目组卷", notes = "收藏题目组卷", httpMethod = "POST")
  691. public Response<UserPaper> bindQuestionCollect(@RequestBody @Validated UserCustomBindDto dto) {
  692. User user = (User) shiroHelp.getLoginUser();
  693. UserPaper userPaper = questionFlowService.makePaper(
  694. user.getId(),
  695. QuestionModule.ValueOf(dto.getQuestionModule()),
  696. PaperOrigin.COLLECT,
  697. Arrays.stream(dto.getQuestionNoIds()).collect(Collectors.toList()),
  698. dto.getFilterTimes()
  699. );
  700. return ResponseHelp.success(userPaper);
  701. }
  702. @RequestMapping(value = "/collect/question/list", method = RequestMethod.GET)
  703. @ApiOperation(value = "获取收藏题目列表", notes = "获取收藏题目列表", httpMethod = "GET")
  704. public Response<PageMessage<UserCollectQuestionInfoDto>> listQuestionCollect(
  705. @RequestParam(required = false, defaultValue = "1") int page,
  706. @RequestParam(required = false, defaultValue = "100") int size,
  707. @RequestParam(required = false) String keyword,
  708. @RequestParam(required = false) String module,
  709. @RequestParam(required = false) String[] questionTypes,
  710. @RequestParam(required = false) Integer[] structIds,
  711. @RequestParam(required = false) String startTime,
  712. @RequestParam(required = false) String endTime,
  713. @RequestParam(required = false) Boolean latest,
  714. @RequestParam(required = false) String year,
  715. @RequestParam(required = false) String order, // (pid asc, no asc), time, correct, question_type, latest_time
  716. HttpSession session) {
  717. User user = (User) shiroHelp.getLoginUser();
  718. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(module);
  719. Page<UserCollectQuestion> p = null;
  720. if(questionNoModule == QuestionNoModule.EXERCISE){
  721. p = userCollectQuestionService.listExercise(page, size, user.getId(), keyword, questionTypes, structIds, startTime, endTime, order != null ? order.replace("|", " ") : null);
  722. }else if (questionNoModule == QuestionNoModule.EXAMINATION){
  723. Integer libraryId = null;
  724. if (latest != null){
  725. if (latest) {
  726. TextbookLibrary textbookLibrary = textbookLibraryService.getLatest();
  727. libraryId = textbookLibrary.getId();
  728. year = null;
  729. }
  730. }
  731. p = userCollectQuestionService.listExamination(page, size, user.getId(), keyword, questionTypes, structIds, libraryId, year, startTime, endTime, order != null ? order.replace("|", " ") : null);
  732. }else{
  733. throw new ParameterException("参数逻辑错误");
  734. }
  735. List<UserCollectQuestionInfoDto> pr = Transform.convert(p, UserCollectQuestionInfoDto.class);
  736. // 获取题目信息
  737. Collection questionIds = Transform.getIds(pr, UserCollectQuestionInfoDto.class, "questionId");
  738. List<Question> questionList = questionService.select(questionIds);
  739. Transform.combine(pr, questionList, UserCollectQuestionInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  740. List<UserCollectQuestionInfoDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
  741. Collection baseQuestionNoIds = Transform.getIds(basePr, UserCollectQuestionInfoDto.class, "questionNoId");
  742. List<QuestionNo> baseQuestionNoList = questionNoService.select(baseQuestionNoIds);
  743. Transform.combine(basePr, baseQuestionNoList, UserCollectQuestionInfoDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  744. List<UserCollectQuestionInfoDto> sentencePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.SENTENCE.key)).collect(Collectors.toList());
  745. Collection sentenceQuestionNoIds = Transform.getIds(sentencePr, UserCollectQuestionInfoDto.class, "questionNoId");
  746. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(sentenceQuestionNoIds);
  747. Transform.combine(sentencePr, sentenceQuestionList, UserCollectQuestionInfoDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  748. List<UserCollectQuestionInfoDto> textbookPr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.TEXTBOOK.key)).collect(Collectors.toList());
  749. Collection textbookQuestionNoIds = Transform.getIds(textbookPr, UserCollectQuestionInfoDto.class, "questionNoId");
  750. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(textbookQuestionNoIds);
  751. Transform.combine(textbookPr, textbookQuestionList, UserCollectQuestionInfoDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  752. // 绑定题目统计
  753. List<UserQuestion> userQuestionList = userQuestionService.listByQuestion(user.getId(), questionIds);
  754. Map<Object, UserQuestionStat> stats = userQuestionService.statQuestionMap(userQuestionList);
  755. Transform.combine(pr, stats, UserCollectQuestionInfoDto.class, "questionId", "stat");
  756. // 最近做题
  757. List<UserQuestion> lastList = userQuestionService.listWithLast(questionIds);
  758. Map lastMap = Transform.getMap(lastList, UserQuestion.class, "id", "createTime");
  759. Transform.combine(pr, lastMap, UserQuestionErrorInfoDto.class, "questionId", "latestTime");
  760. return ResponseHelp.success(pr, page, size, p.getTotal());
  761. }
  762. @RequestMapping(value = "/error/list", method = RequestMethod.GET)
  763. @ApiOperation(value = "获取错题列表", notes = "获取错题列表", httpMethod = "GET")
  764. public Response<PageMessage<UserQuestionErrorInfoDto>> listError(
  765. @RequestParam(required = false, defaultValue = "1") int page,
  766. @RequestParam(required = false, defaultValue = "100") int size,
  767. @RequestParam(required = false) String keyword,
  768. @RequestParam(required = false) String module,
  769. @RequestParam(required = false) String[] questionTypes,
  770. @RequestParam(required = false) Integer[] structIds,
  771. @RequestParam(required = false) String startTime,
  772. @RequestParam(required = false) String endTime,
  773. @RequestParam(required = false) Boolean latest,
  774. @RequestParam(required = false) String year,
  775. @RequestParam(required = false) String order // (pid asc, no asc), time, correct, question_type, latest_time
  776. ) {
  777. User user = (User) shiroHelp.getLoginUser();
  778. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(module);
  779. Page<UserQuestion> p = null;
  780. if(questionNoModule == QuestionNoModule.EXERCISE){
  781. p = userQuestionService.listExerciseError(page, size, user.getId(), keyword, questionTypes, structIds, startTime, endTime, order != null ? order.replace("|", " ") : null);
  782. }else if (questionNoModule == QuestionNoModule.EXAMINATION){
  783. Integer libraryId = null;
  784. if (latest != null){
  785. if (latest) {
  786. TextbookLibrary textbookLibrary = textbookLibraryService.getLatest();
  787. libraryId = textbookLibrary.getId();
  788. year = null;
  789. }
  790. }
  791. p = userQuestionService.listExaminationError(page, size, user.getId(), keyword, questionTypes, structIds, libraryId, year, startTime, endTime, order != null ? order.replace("|", " ") : null);
  792. }else{
  793. throw new ParameterException("参数逻辑错误");
  794. }
  795. List<UserQuestionErrorInfoDto> pr = Transform.convert(p, UserQuestionErrorInfoDto.class);
  796. // 获取题目信息
  797. Collection questionIds = Transform.getIds(pr, UserQuestionErrorInfoDto.class, "questionId");
  798. List<Question> questionList = questionService.select(questionIds);
  799. Transform.combine(pr, questionList, UserQuestionErrorInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  800. List<UserQuestionErrorInfoDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
  801. Collection baseQuestionNoIds = Transform.getIds(basePr, UserQuestionErrorInfoDto.class, "questionNoId");
  802. List<QuestionNo> baseQuestionNoList = questionNoService.select(baseQuestionNoIds);
  803. Transform.combine(basePr, baseQuestionNoList, UserQuestionErrorInfoDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  804. List<UserQuestionErrorInfoDto> sentencePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.SENTENCE.key)).collect(Collectors.toList());
  805. Collection sentenceQuestionNoIds = Transform.getIds(sentencePr, UserQuestionErrorInfoDto.class, "questionNoId");
  806. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(sentenceQuestionNoIds);
  807. Transform.combine(sentencePr, sentenceQuestionList, UserQuestionErrorInfoDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  808. List<UserQuestionErrorInfoDto> textbookPr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.TEXTBOOK.key)).collect(Collectors.toList());
  809. Collection textbookQuestionNoIds = Transform.getIds(textbookPr, UserQuestionErrorInfoDto.class, "questionNoId");
  810. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(textbookQuestionNoIds);
  811. Transform.combine(textbookPr, textbookQuestionList, UserQuestionErrorInfoDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  812. // 绑定题目统计
  813. List<UserQuestion> userQuestionList = userQuestionService.listByQuestion(user.getId(), questionIds);
  814. Map<Object, UserQuestionStat> stats = userQuestionService.statQuestionMap(userQuestionList);
  815. Transform.combine(pr, stats, UserQuestionErrorInfoDto.class, "questionId", "stat");
  816. // 最近做题
  817. List<UserQuestion> lastList = userQuestionService.listWithLast(questionIds);
  818. Map lastMap = Transform.getMap(lastList, UserQuestion.class, "id", "createTime");
  819. Transform.combine(pr, lastMap, UserQuestionErrorInfoDto.class, "questionId", "latestTime");
  820. return ResponseHelp.success(pr, page, size, p.getTotal());
  821. }
  822. @RequestMapping(value = "/error/bind", method = RequestMethod.POST)
  823. @ApiOperation(value = "错题组卷", notes = "错题组卷", httpMethod = "POST")
  824. public Response<UserPaper> bindError(@RequestBody @Validated UserCustomBindDto dto) {
  825. User user = (User) shiroHelp.getLoginUser();
  826. UserPaper userPaper = questionFlowService.makePaper(
  827. user.getId(),
  828. QuestionModule.ValueOf(dto.getQuestionModule()),
  829. PaperOrigin.ERROR,
  830. Arrays.stream(dto.getQuestionNoIds()).collect(Collectors.toList()),
  831. dto.getFilterTimes()
  832. );
  833. return ResponseHelp.success(userPaper);
  834. }
  835. @RequestMapping(value = "/error/clear", method = RequestMethod.POST)
  836. @ApiOperation(value = "错题移除", notes = "错题移除", httpMethod = "POST")
  837. public Response<Boolean> clearError(@RequestBody @Validated UserQuestionIdsDto dto) {
  838. User user = (User) shiroHelp.getLoginUser();
  839. List<UserQuestion> questionList = userQuestionService.select(dto.getQuestionNoIds());
  840. userPaperQuestionService.addRemoveError(questionList);
  841. return ResponseHelp.success(true);
  842. }
  843. @RequestMapping(value = "/error/remove", method = RequestMethod.POST)
  844. @ApiOperation(value = "移除正确题", notes = "移除正确题", httpMethod = "POST")
  845. public Response<Boolean> removeError(@RequestBody @Validated ErrorReportDto dto) {
  846. User user = (User) shiroHelp.getLoginUser();
  847. UserReport report = userReportService.get(dto.getUserReportId());
  848. if (report.getIsFinish() == 0){
  849. throw new ParameterException("试卷未完成");
  850. }
  851. List<UserQuestion> questionList = userQuestionService.listByReport(user.getId(), dto.getUserReportId());
  852. userPaperQuestionService.addRemoveError(questionList);
  853. return ResponseHelp.success(true);
  854. }
  855. @RequestMapping(value = "/note/question", method = RequestMethod.PUT)
  856. @ApiOperation(value = "更新题目笔记", notes = "更新题目笔记", httpMethod = "PUT")
  857. public Response<Boolean> updateNoteQuestion(@RequestBody @Validated UserNoteQuestionDto dto) {
  858. UserNoteQuestion entity = Transform.dtoToEntity(dto);
  859. User user = (User) shiroHelp.getLoginUser();
  860. entity.setUserId(user.getId());
  861. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  862. case BASE:
  863. entity.setQuestionModule(QuestionModule.BASE.key);
  864. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  865. entity.setQuestionId(questionNo.getQuestionId());
  866. entity.setQuestionNoId(questionNo.getId());
  867. break;
  868. case SENTENCE:
  869. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  870. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  871. entity.setQuestionId(sentenceQuestion.getQuestionId());
  872. entity.setQuestionNoId(sentenceQuestion.getId());
  873. break;
  874. case TEXTBOOK:
  875. entity.setQuestionModule(QuestionModule.TEXTBOOK.key);
  876. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  877. entity.setQuestionId(textbookQuestion.getQuestionId());
  878. entity.setQuestionNoId(textbookQuestion.getId());
  879. break;
  880. }
  881. userNoteQuestionService.update(entity);
  882. return ResponseHelp.success(true);
  883. }
  884. @RequestMapping(value = "/note/question/list", method = RequestMethod.GET)
  885. @ApiOperation(value = "获取题目笔记列表", notes = "获取笔记列表", httpMethod = "GET")
  886. public Response<PageMessage<UserNoteQuestionInfoDto>> listNoteQuestion(
  887. @RequestParam(required = false, defaultValue = "1") int page,
  888. @RequestParam(required = false, defaultValue = "100") int size,
  889. @RequestParam(required = false) String keyword,
  890. @RequestParam(required = false) String module,
  891. @RequestParam(required = false) String[] questionTypes,
  892. @RequestParam(required = false) Integer[] structIds,
  893. @RequestParam(required = false) String startTime,
  894. @RequestParam(required = false) String endTime,
  895. @RequestParam(required = false) Boolean latest,
  896. @RequestParam(required = false) String year,
  897. @RequestParam(required = false) String order, // update_time
  898. HttpSession session) {
  899. User user = (User) shiroHelp.getLoginUser();
  900. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(module);
  901. Page<UserNoteQuestion> p = null;
  902. if(questionNoModule == QuestionNoModule.EXERCISE){
  903. p = userNoteQuestionService.listExercise(page, size, user.getId(), keyword, questionTypes, structIds, startTime, endTime, order != null ? order.replace("|", " ") : null);
  904. }else if (questionNoModule == QuestionNoModule.EXAMINATION){
  905. Integer libraryId = null;
  906. if (latest != null){
  907. if (latest) {
  908. TextbookLibrary textbookLibrary = textbookLibraryService.getLatest();
  909. libraryId = textbookLibrary.getId();
  910. year = null;
  911. }
  912. }
  913. p = userNoteQuestionService.listExamination(page, size, user.getId(), keyword, questionTypes, structIds, libraryId, year, startTime, endTime, order != null ? order.replace("|", " ") : null);
  914. }else{
  915. throw new ParameterException("参数逻辑错误");
  916. }
  917. List<UserNoteQuestionInfoDto> pr = Transform.convert(p, UserNoteQuestionInfoDto.class);
  918. // 获取题目信息
  919. Collection questionIds = Transform.getIds(pr, UserNoteQuestionInfoDto.class, "questionId");
  920. List<Question> questionList = questionService.select(questionIds);
  921. Transform.combine(pr, questionList, UserNoteQuestionInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  922. List<UserNoteQuestionInfoDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
  923. Collection baseQuestionNoIds = Transform.getIds(basePr, UserNoteQuestionInfoDto.class, "questionNoId");
  924. List<QuestionNo> baseQuestionNoList = questionNoService.select(baseQuestionNoIds);
  925. Transform.combine(basePr, baseQuestionNoList, UserNoteQuestionInfoDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  926. List<UserNoteQuestionInfoDto> sentencePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.SENTENCE.key)).collect(Collectors.toList());
  927. Collection sentenceQuestionNoIds = Transform.getIds(sentencePr, UserNoteQuestionInfoDto.class, "questionNoId");
  928. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(sentenceQuestionNoIds);
  929. Transform.combine(sentencePr, sentenceQuestionList, UserNoteQuestionInfoDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  930. List<UserNoteQuestionInfoDto> textbookPr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.TEXTBOOK.key)).collect(Collectors.toList());
  931. Collection textbookQuestionNoIds = Transform.getIds(textbookPr, UserNoteQuestionInfoDto.class, "questionNoId");
  932. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(textbookQuestionNoIds);
  933. Transform.combine(textbookPr, textbookQuestionList, UserNoteQuestionInfoDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  934. return ResponseHelp.success(pr, page, size, p.getTotal());
  935. }
  936. @RequestMapping(value = "/note/course", method = RequestMethod.PUT)
  937. @ApiOperation(value = "更新课程笔记", notes = "更新课程笔记", httpMethod = "PUT")
  938. public Response<Boolean> updateNoteCourse(@RequestBody @Validated UserNoteQuestionDto dto) {
  939. UserNoteCourse entity = Transform.dtoToEntity(dto);
  940. User user = (User) shiroHelp.getLoginUser();
  941. entity.setUserId(user.getId());
  942. userNoteCourseService.update(entity);
  943. return ResponseHelp.success(true);
  944. }
  945. @RequestMapping(value = "/report/list", method = RequestMethod.GET)
  946. @ApiOperation(value = "获取报告列表", notes = "获取报告列表", httpMethod = "GET")
  947. public Response<PageMessage<UserPaperDto>> listReport(
  948. @RequestParam(required = false, defaultValue = "1") int page,
  949. @RequestParam(required = false, defaultValue = "100") int size,
  950. @RequestParam(required = false) String keyword,
  951. @RequestParam(required = false) String module,
  952. @RequestParam(required = false) String origin,
  953. @RequestParam(required = false) String[] questionTypes,
  954. @RequestParam(required = false) Integer[] structIds,
  955. @RequestParam(required = false) String startTime,
  956. @RequestParam(required = false) String endTime,
  957. @RequestParam(required = false) Boolean latest,
  958. @RequestParam(required = false) String year,
  959. @RequestParam(required = false) String[] courseModules,
  960. @RequestParam(required = false) String order, // title, latest_time,correct,time
  961. HttpSession session) {
  962. User user = (User) shiroHelp.getLoginUser();
  963. PaperOrigin paperOrigin = PaperOrigin.ValueOf(origin);
  964. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(module);
  965. Page<UserPaper> p = null;
  966. if (questionNoModule != null && (paperOrigin == PaperOrigin.COLLECT || paperOrigin == PaperOrigin.ERROR)){
  967. p = userPaperService.list(page, size, user.getId(), keyword, paperOrigin, startTime, endTime, order != null ? order.replace("|", " ") : null);
  968. }else if(questionNoModule == QuestionNoModule.EXERCISE){
  969. p = userPaperService.listExercise(page, size, user.getId(), keyword, questionTypes, structIds, courseModules, startTime, endTime, order != null ? order.replace("|", " ") : null);
  970. }else if (questionNoModule == QuestionNoModule.EXAMINATION){
  971. Integer libraryId = null;
  972. if (latest != null){
  973. paperOrigin = PaperOrigin.TEXTBOOK;
  974. if (latest) {
  975. TextbookLibrary textbookLibrary = textbookLibraryService.getLatest();
  976. libraryId = textbookLibrary.getId();
  977. year = null;
  978. }
  979. }
  980. p = userPaperService.listExamination(page, size, user.getId(), keyword, structIds, libraryId, year, startTime, endTime, order != null ? order.replace("|", " ") : null);
  981. }else{
  982. throw new ParameterException("参数逻辑错误");
  983. }
  984. List<UserPaperDto> pr = Transform.convert(p, UserPaperDto.class);
  985. Collection paperIds = Transform.getIds(p, UserPaper.class, "id");
  986. // 绑定用户报告
  987. Map<Object, Collection<UserReport>> reportByPaper = userReportService.mapByPaper(paperIds);
  988. Transform.combine(pr, reportByPaper, UserPaperDto.class, "id", "reports", UserReportExtendDto.class);
  989. // 获取试卷统计信息
  990. List<UserPaperDto> basePr = pr.stream().filter((row)->QuestionModule.BASE == QuestionModule.WithPaper(PaperModule.ValueOf(row.getPaperModule()))).collect(Collectors.toList());
  991. Map<Integer, Integer[]> baseIdsMap = new HashMap<>();
  992. for(UserPaperDto paper : basePr){
  993. baseIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  994. }
  995. Map baseStatMap = questionNoService.statPaperMap(baseIdsMap);
  996. Transform.combine(pr, baseStatMap, UserPaperDto.class, "id", "stat");
  997. List<UserPaperDto> sentencePr = pr.stream().filter((row)->QuestionModule.SENTENCE == QuestionModule.WithPaper(PaperModule.ValueOf(row.getPaperModule()))).collect(Collectors.toList());
  998. Map<Integer, Integer[]> sentenceIdsMap = new HashMap<>();
  999. for(UserPaperDto paper : sentencePr){
  1000. sentenceIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  1001. }
  1002. Map sentenceStatMap = sentenceQuestionService.statPaperMap(sentenceIdsMap);
  1003. Transform.combine(pr, sentenceStatMap, UserPaperDto.class, "id", "stat");
  1004. List<UserPaperDto> textbookPr = pr.stream().filter((row)->QuestionModule.TEXTBOOK == QuestionModule.WithPaper(PaperModule.ValueOf(row.getPaperModule()))).collect(Collectors.toList());
  1005. Map<Integer, Integer[]> textbookIdsMap = new HashMap<>();
  1006. for(UserPaperDto paper : textbookPr){
  1007. textbookIdsMap.put(paper.getId(), paper.getQuestionNoIds());
  1008. }
  1009. Map textbookStatMap = textbookQuestionService.statPaperMap(textbookIdsMap);
  1010. Transform.combine(pr, textbookStatMap, UserPaperDto.class, "id", "stat");
  1011. return ResponseHelp.success(pr, page, size, p.getTotal());
  1012. }
  1013. @RequestMapping(value = "/ask/question", method = RequestMethod.POST)
  1014. @ApiOperation(value = "添加题目提问", notes = "添加题目提问", httpMethod = "POST")
  1015. public Response<Boolean> addAskQuestion(@RequestBody @Validated UserAskQuestionDto dto) {
  1016. UserAskQuestion entity = Transform.dtoToEntity(dto);
  1017. User user = (User) shiroHelp.getLoginUser();
  1018. entity.setUserId(user.getId());
  1019. PaperModule paperModule = PaperModule.ValueOf(dto.getPaperModule());
  1020. QuestionModule questionModule = QuestionModule.WithPaper(paperModule);
  1021. Question question;
  1022. switch (questionModule){
  1023. case BASE:
  1024. entity.setQuestionModule(QuestionModule.BASE.key);
  1025. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  1026. entity.setQuestionId(questionNo.getQuestionId());
  1027. entity.setQuestionNoId(questionNo.getId());
  1028. question = questionService.get(questionNo.getQuestionId());
  1029. break;
  1030. case SENTENCE:
  1031. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  1032. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  1033. entity.setQuestionId(sentenceQuestion.getQuestionId());
  1034. entity.setQuestionNoId(sentenceQuestion.getId());
  1035. question = questionService.get(sentenceQuestion.getQuestionId());
  1036. break;
  1037. case TEXTBOOK:
  1038. entity.setQuestionModule(QuestionModule.TEXTBOOK.key);
  1039. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  1040. entity.setQuestionId(textbookQuestion.getQuestionId());
  1041. entity.setQuestionNoId(textbookQuestion.getId());
  1042. question = questionService.get(textbookQuestion.getQuestionId());
  1043. break;
  1044. default:
  1045. throw new ParameterException("题目模块错误");
  1046. }
  1047. entity.setAskModule(AskModule.WithPaper(paperModule).key);
  1048. Integer assignId = null;
  1049. if (dto.getUserPaperId() != null && dto.getUserPaperId() > 0){
  1050. UserPaper userPaper = userPaperService.get(dto.getUserPaperId());
  1051. if(userPaper != null && userPaper.getPaperOrigin().equals(PaperOrigin.PREVIEW.key)){
  1052. assignId = userPaper.getOriginId();
  1053. }
  1054. }
  1055. Integer recordId = questionFlowService.questionRelationCourse(user.getId(), assignId, QuestionType.ValueOf(question.getQuestionType()));
  1056. if (recordId != null){
  1057. // 绑定提问权限
  1058. entity.setRecordId(recordId);
  1059. UserOrderRecord record = userOrderRecordService.get(recordId);
  1060. entity.setAskTime(record.getAskTime());
  1061. }else{
  1062. // todo 判断题目是否有提问权限
  1063. }
  1064. userAskQuestionService.add(entity);
  1065. return ResponseHelp.success(true);
  1066. }
  1067. @RequestMapping(value = "/ask/question/delete", method = RequestMethod.DELETE)
  1068. @ApiOperation(value = "提问删除", httpMethod = "DELETE")
  1069. public Response<Boolean> deleteAskQuestion(@RequestParam int id, HttpServletRequest request) {
  1070. UserAskQuestion in = userAskQuestionService.get(id);
  1071. User user = (User) shiroHelp.getLoginUser();
  1072. if(in == null){
  1073. throw new ParameterException("提问不存在");
  1074. }
  1075. if (!in.getUserId().equals(user.getId())){
  1076. throw new ParameterException("提问不存在");
  1077. }
  1078. if (in.getAnswerStatus()== AskStatus.ANSWER.index){
  1079. throw new ParameterException("提问已回答");
  1080. }
  1081. userAskQuestionService.delete(id);
  1082. // 如果
  1083. return ResponseHelp.success(true);
  1084. }
  1085. @RequestMapping(value = "/ask/question/list", method = RequestMethod.GET)
  1086. @ApiOperation(value = "获取题目提问列表", notes = "获取题目提问列表", httpMethod = "GET")
  1087. public Response<PageMessage<UserAskQuestionInfoDto>> listAskQuestion(
  1088. @RequestParam(required = false, defaultValue = "1") int page,
  1089. @RequestParam(required = false, defaultValue = "100") int size,
  1090. @RequestParam(required = false) String keyword,
  1091. @RequestParam(required = false) String module,
  1092. @RequestParam(required = false) String[] questionTypes,
  1093. @RequestParam(required = false) Integer[] structIds,
  1094. @RequestParam(required = false) String startTime,
  1095. @RequestParam(required = false) String endTime,
  1096. @RequestParam(required = false) Integer askStatus,
  1097. @RequestParam(required = false) Boolean latest,
  1098. @RequestParam(required = false) String year,
  1099. @RequestParam(required = false) String order, // create_time, answer_time
  1100. HttpSession session) {
  1101. User user = (User) shiroHelp.getLoginUser();
  1102. QuestionNoModule questionNoModule = QuestionNoModule.ValueOf(module);
  1103. Page<UserAskQuestion> p = null;
  1104. if(questionNoModule == QuestionNoModule.EXERCISE){
  1105. p = userAskQuestionService.listExercise(page, size, user.getId(), keyword, questionTypes, structIds, AskStatus.ValueOf(askStatus),startTime, endTime, order != null ? order.replace("|", " ") : null);
  1106. }else if (questionNoModule == QuestionNoModule.EXAMINATION){
  1107. Integer libraryId = null;
  1108. if (latest != null){
  1109. if (latest) {
  1110. TextbookLibrary textbookLibrary = textbookLibraryService.getLatest();
  1111. libraryId = textbookLibrary.getId();
  1112. year = null;
  1113. }
  1114. }
  1115. p = userAskQuestionService.listExamination(page, size, user.getId(), keyword, questionTypes, structIds, libraryId, year, AskStatus.ValueOf(askStatus), startTime, endTime, order != null ? order.replace("|", " ") : null);
  1116. }else{
  1117. throw new ParameterException("参数逻辑错误");
  1118. }
  1119. List<UserAskQuestionInfoDto> pr = Transform.convert(p, UserAskQuestionInfoDto.class);
  1120. // 获取题目信息
  1121. Collection questionIds = Transform.getIds(pr, UserNoteQuestionInfoDto.class, "questionId");
  1122. List<Question> questionList = questionService.select(questionIds);
  1123. Transform.combine(pr, questionList, UserNoteQuestionInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
  1124. List<UserAskQuestionInfoDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
  1125. Collection baseQuestionNoIds = Transform.getIds(basePr, UserAskQuestionInfoDto.class, "questionNoId");
  1126. List<QuestionNo> baseQuestionNoList = questionNoService.select(baseQuestionNoIds);
  1127. Transform.combine(basePr, baseQuestionNoList, UserAskQuestionInfoDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
  1128. List<UserAskQuestionInfoDto> sentencePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.SENTENCE.key)).collect(Collectors.toList());
  1129. Collection sentenceQuestionNoIds = Transform.getIds(sentencePr, UserAskQuestionInfoDto.class, "questionNoId");
  1130. List<SentenceQuestion> sentenceQuestionList = sentenceQuestionService.select(sentenceQuestionNoIds);
  1131. Transform.combine(sentencePr, sentenceQuestionList, UserAskQuestionInfoDto.class, "questionNoId", "questionNo", SentenceQuestion.class, "id", QuestionNoExtendDto.class);
  1132. List<UserAskQuestionInfoDto> textbookPr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.TEXTBOOK.key)).collect(Collectors.toList());
  1133. Collection textbookQuestionNoIds = Transform.getIds(textbookPr, UserAskQuestionInfoDto.class, "questionNoId");
  1134. List<TextbookQuestion> textbookQuestionList = textbookQuestionService.select(textbookQuestionNoIds);
  1135. Transform.combine(textbookPr, textbookQuestionList, UserAskQuestionInfoDto.class, "questionNoId", "questionNo", TextbookQuestion.class, "id", QuestionNoExtendDto.class);
  1136. return ResponseHelp.success(pr, page, size, p.getTotal());
  1137. }
  1138. @RequestMapping(value = "/ask/course", method = RequestMethod.POST)
  1139. @ApiOperation(value = "添加课程提问", notes = "添加课程提问", httpMethod = "POST")
  1140. public Response<Boolean> addAskCourse(@RequestBody @Validated UserAskCourseDto dto) {
  1141. UserAskCourse entity = Transform.dtoToEntity(dto);
  1142. User user = (User) shiroHelp.getLoginUser();
  1143. entity.setUserId(user.getId());
  1144. UserCourse userCourse = courseExtendService.userCourse(user.getId(), dto.getCourseId());
  1145. if (userCourse != null){
  1146. // 绑定提问权限
  1147. entity.setRecordId(userCourse.getRecordId());
  1148. UserOrderRecord record = userOrderRecordService.get(userCourse.getRecordId());
  1149. entity.setAskTime(record.getAskTime());
  1150. }else{
  1151. throw new ParameterException("课程需开通后才能提问");
  1152. }
  1153. userAskCourseService.add(entity);
  1154. return ResponseHelp.success(true);
  1155. }
  1156. @RequestMapping(value = "/feedback/error/question", method = RequestMethod.POST)
  1157. @ApiOperation(value = "添加题目勘误", notes = "添加勘误", httpMethod = "POST")
  1158. public Response<Boolean> addFeedbackErrorQuestion(@RequestBody @Validated UserFeedbackErrorQuestionDto dto) {
  1159. UserFeedbackError entity = Transform.dtoToEntity(dto);
  1160. User user = (User) shiroHelp.getLoginUser();
  1161. entity.setUserId(user.getId());
  1162. entity.setModule(FeedbackModule.QUESTION.key);
  1163. entity.setStatus(0);
  1164. Question question;
  1165. switch (QuestionModule.ValueOf(dto.getQuestionModule())){
  1166. case BASE:
  1167. entity.setQuestionModule(QuestionModule.BASE.key);
  1168. QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
  1169. entity.setModuleId(questionNo.getQuestionId());
  1170. entity.setQuestionNoId(questionNo.getId());
  1171. question = questionService.get(questionNo.getQuestionId());
  1172. break;
  1173. case SENTENCE:
  1174. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  1175. SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
  1176. entity.setModuleId(sentenceQuestion.getQuestionId());
  1177. entity.setQuestionNoId(sentenceQuestion.getId());
  1178. question = questionService.get(sentenceQuestion.getQuestionId());
  1179. break;
  1180. case TEXTBOOK:
  1181. entity.setQuestionModule(QuestionModule.SENTENCE.key);
  1182. TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
  1183. entity.setModuleId(textbookQuestion.getQuestionId());
  1184. entity.setQuestionNoId(textbookQuestion.getId());
  1185. question = questionService.get(textbookQuestion.getQuestionId());
  1186. break;
  1187. default:
  1188. throw new ParameterException("题目模块错误");
  1189. }
  1190. entity.setQuestionType(question.getQuestionType());
  1191. userFeedbackErrorService.add(entity);
  1192. return ResponseHelp.success(true);
  1193. }
  1194. @RequestMapping(value = "/feedback/error/data", method = RequestMethod.POST)
  1195. @ApiOperation(value = "添加资料勘误", notes = "添加勘误", httpMethod = "POST")
  1196. public Response<Boolean> addFeedbackError(@RequestBody @Validated UserFeedbackErrorDataDto dto) {
  1197. UserFeedbackError entity = Transform.dtoToEntity(dto);
  1198. User user = (User) shiroHelp.getLoginUser();
  1199. entity.setUserId(user.getId());
  1200. entity.setModule(FeedbackModule.DATA.key);
  1201. entity.setModuleId(dto.getDataId());
  1202. entity.setStatus(0);
  1203. userFeedbackErrorService.add(entity);
  1204. return ResponseHelp.success(true);
  1205. }
  1206. @RequestMapping(value = "/faq", method = RequestMethod.POST)
  1207. @ApiOperation(value = "添加faq", notes = "添加faq", httpMethod = "POST")
  1208. public Response<Boolean> addFaq(@RequestBody @Validated FaqDto dto) {
  1209. Faq entity = Transform.dtoToEntity(dto);
  1210. User user = (User) shiroHelp.getLoginUser();
  1211. entity.setUserId(user.getId());
  1212. entity.setMessage(1);
  1213. // 取消邮箱发送
  1214. // entity.setEmail(user.getEmail());
  1215. faqService.add(entity);
  1216. return ResponseHelp.success(true);
  1217. }
  1218. @RequestMapping(value = "/comment", method = RequestMethod.POST)
  1219. @ApiOperation(value = "添加评论", notes = "添加评论", httpMethod = "POST")
  1220. public Response<Boolean> addComment(@RequestBody @Validated CommentDto dto) {
  1221. Comment entity = Transform.dtoToEntity(dto);
  1222. User user = (User) shiroHelp.getLoginUser();
  1223. entity.setUserId(user.getId());
  1224. commentService.add(entity);
  1225. return ResponseHelp.success(true);
  1226. }
  1227. @RequestMapping(value = "/data/history", method = RequestMethod.GET)
  1228. @ApiOperation(value = "资料更新记录", httpMethod = "GET")
  1229. public Response<PageMessage<CourseDataHistoryInfoDto>> listDataHistory(
  1230. @RequestParam(required = false, defaultValue = "1") int page,
  1231. @RequestParam(required = false, defaultValue = "100") int size,
  1232. @RequestParam(required = false) Integer dataId,
  1233. HttpSession session) {
  1234. User user = (User) shiroHelp.getLoginUser();
  1235. Page<CourseDataHistory> p = courseDataHistoryService.listByUser(page, size, dataId, user.getId());
  1236. List<CourseDataHistoryInfoDto> pr = Transform.convert(p, CourseDataHistoryInfoDto.class);
  1237. // 绑定资料
  1238. Collection dataIds = Transform.getIds(p, CourseDataHistory.class, "dataId");
  1239. List<CourseData> dataList = courseDataService.select(dataIds);
  1240. Transform.combine(pr, dataList, CourseDataHistoryInfoDto.class, "dataId", "data", CourseData.class, "id", CourseDataExtendDto.class);
  1241. return ResponseHelp.success(pr, page, size, p.getTotal());
  1242. }
  1243. @RequestMapping(value = "/data/list", method = RequestMethod.GET)
  1244. @ApiOperation(value = "购买的资料记录", httpMethod = "GET")
  1245. public Response<PageMessage<CourseData>> listData(
  1246. @RequestParam(required = false, defaultValue = "1") int page,
  1247. @RequestParam(required = false, defaultValue = "100") int size,
  1248. @RequestParam(required = false) Integer structId,
  1249. @RequestParam(required = false) String dataType,
  1250. @RequestParam(required = false, defaultValue = "id") String order, // latest_time, sale_number
  1251. @RequestParam(required = false, defaultValue = "desc") String direction,
  1252. HttpSession session) {
  1253. User user = (User) shiroHelp.getLoginUser();
  1254. Page<CourseData> p = courseDataService.listByUser(page, size, user.getId(), structId, DataType.ValueOf(dataType),order, DirectionStatus.ValueOf(direction));
  1255. return ResponseHelp.success(p, page, size, p.getTotal());
  1256. }
  1257. @RequestMapping(value = "/course/list", method = RequestMethod.GET)
  1258. @ApiOperation(value = "购买的课程记录", httpMethod = "GET")
  1259. public Response<PageMessage<UserCourseDetailDto>> listCourse(
  1260. @RequestParam(required = false, defaultValue = "1") int page,
  1261. @RequestParam(required = false, defaultValue = "100") int size,
  1262. @RequestParam(required = false) String courseModule,
  1263. @RequestParam(required = false) Boolean isUsed,
  1264. @RequestParam(required = false) Boolean isEnd,
  1265. @RequestParam(required = false, defaultValue = "id") String order, // useEndTime desc
  1266. @RequestParam(required = false, defaultValue = "desc") String direction,
  1267. HttpSession session) {
  1268. User user = (User) shiroHelp.getLoginUser();
  1269. Page<UserOrderRecord> p = userOrderRecordService.listWithCourse(page, size, user.getId(), CourseModule.ValueOf(courseModule), isUsed, isEnd, order, DirectionStatus.ValueOf(direction));
  1270. List<UserCourseDetailDto> pr = Transform.convert(p, UserCourseDetailDto.class);
  1271. Collection recordIds = Transform.getIds(p, UserOrderRecord.class,"id");
  1272. // 绑定课程
  1273. Collection courseIds = Transform.getIds(p, UserOrderRecord.class, "productId");
  1274. List<Course> courseList = courseService.select(courseIds);
  1275. Transform.combine(pr, courseList, UserCourseDetailDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  1276. // 绑定课时、预约、进度
  1277. Map<Object, Collection<CourseNo>> courseNoMap = courseNoService.groupByCourseId(courseIds);
  1278. Transform.combine(pr, courseNoMap, UserCourseDetailDto.class, "productId", "courseNos", CourseNoExtendDto.class);
  1279. Map<Object, Collection<UserCourseAppointment>> appointmentMap = userCourseAppointmentService.groupByRecordId(recordIds);
  1280. Transform.combine(pr, appointmentMap, UserCourseDetailDto.class, "productId", "appointments", UserCourseAppointmentExtendDto.class);
  1281. Map<Object, Collection<UserCourseProgress>> progressMap = userCourseProgressService.groupByRecordId(recordIds);
  1282. for(UserCourseDetailDto dto : pr){
  1283. Collection<UserCourseProgress> list = progressMap.get(dto.getId());
  1284. if (list == null || list.size() == 0) continue;
  1285. Collection<CourseNo> courseNos = courseNoMap.get(dto.getProductId());
  1286. dto.setCurrentNo(courseExtendService.computeCourseNoCurrent(courseNos, list));
  1287. }
  1288. // 获取每个科目的所有作业
  1289. Map<Object, Collection<UserPreviewPaperRelation>> previewMap = previewService.groupByCourseId(user.getId(), recordIds, 1000);
  1290. Transform.combine(pr, previewMap, UserCourseDetailDto.class, "productId", "papers", UserPaperBaseExtendDto.class);
  1291. // 绑定老师
  1292. Collection teacherIds = Transform.getIds(p, UserOrderRecord.class, "teacherId");
  1293. List<CourseTeacher> teacherList = courseTeacherService.select(teacherIds);
  1294. Transform.combine(pr, teacherList, UserCourseDetailDto.class, "teacherId", "teacher", CourseTeacher.class, "id", CourseTeacherExtendDto.class);
  1295. return ResponseHelp.success(pr, page, size, p.getTotal());
  1296. }
  1297. @RequestMapping(value = "/course/suspend", method = RequestMethod.POST)
  1298. @ApiOperation(value = "申请停课", notes = "申请停课", httpMethod = "POST")
  1299. public Response<Boolean> suspendCourse(@RequestBody @Validated CourseSuspendDto dto) {
  1300. User user = (User) shiroHelp.getLoginUser();
  1301. courseExtendService.suspendCourse(user.getId(), dto.getRecordId());
  1302. return ResponseHelp.success(true);
  1303. }
  1304. @RequestMapping(value = "/course/restore", method = RequestMethod.POST)
  1305. @ApiOperation(value = "恢复停课", notes = "恢复停课", httpMethod = "POST")
  1306. public Response<Boolean> restoreCourse(@RequestBody @Validated CourseRestoreDto dto) {
  1307. User user = (User) shiroHelp.getLoginUser();
  1308. courseExtendService.restoreCourse(user.getId(), dto.getRecordId());
  1309. return ResponseHelp.success(true);
  1310. }
  1311. @RequestMapping(value = "/course/time", method = RequestMethod.GET)
  1312. @ApiOperation(value = "时间表", notes = "时间表", httpMethod = "GET")
  1313. public Response<List<UserCourseTimeDto>> timeCourse(int id) {
  1314. User user = (User) shiroHelp.getLoginUser();
  1315. List<UserCourseTimeDto> dtos = new ArrayList<>();
  1316. UserOrderRecord record = userOrderRecordService.get(id);
  1317. if (record == null){
  1318. throw new ParameterException("记录不存在");
  1319. }
  1320. if (!record.getUserId().equals(user.getId())){
  1321. throw new ParameterException("记录不存在");
  1322. }
  1323. // 获取停课记录
  1324. Date suspend = record.getSuspendTime();
  1325. if (suspend != null){
  1326. Date restore = record.getRestoreTime();
  1327. if (restore == null) restore = new Date();
  1328. while(suspend.before(restore)){
  1329. UserCourseTimeDto dto = new UserCourseTimeDto();
  1330. dto.setType("stop");
  1331. dto.setDay(Tools.day(suspend));
  1332. dtos.add(dto);
  1333. suspend = Tools.addDate(suspend, 1);
  1334. }
  1335. }
  1336. // todo 获取听课记录
  1337. return ResponseHelp.success(dtos);
  1338. }
  1339. }