MyController.java 99 KB

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