CourseController.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. package com.qxgmat.controller.api;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.*;
  4. import com.nuliji.tools.exception.AuthException;
  5. import com.nuliji.tools.exception.ParameterException;
  6. import com.qxgmat.data.constants.enums.ExperienceDayRange;
  7. import com.qxgmat.data.constants.enums.ExperienceScoreRange;
  8. import com.qxgmat.data.constants.enums.module.CourseModule;
  9. import com.qxgmat.data.constants.enums.module.VsCourseType;
  10. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  11. import com.qxgmat.data.constants.enums.user.DataType;
  12. import com.qxgmat.data.dao.entity.*;
  13. import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
  14. import com.qxgmat.dto.extend.*;
  15. import com.qxgmat.dto.request.CourseDataViewDto;
  16. import com.qxgmat.dto.request.CourseTrailViewDto;
  17. import com.qxgmat.dto.request.ExperienceViewDto;
  18. import com.qxgmat.dto.request.UserCourseNoProgressDto;
  19. import com.qxgmat.dto.response.*;
  20. import com.qxgmat.help.ShiroHelp;
  21. import com.qxgmat.service.UsersService;
  22. import com.qxgmat.service.extend.CourseExtendService;
  23. import com.qxgmat.service.extend.PreviewService;
  24. import com.qxgmat.service.inline.*;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.validation.annotation.Validated;
  29. import org.springframework.web.bind.annotation.*;
  30. import javax.servlet.http.HttpSession;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. @RestController
  34. @RequestMapping("/api/course")
  35. @Api(tags = "课程", description = "课程接口")
  36. public class CourseController {
  37. @Autowired
  38. private ShiroHelp shiroHelp;
  39. @Autowired
  40. private CommentService commentService;
  41. @Autowired
  42. private FaqService faqService;
  43. @Autowired
  44. private CourseService courseService;
  45. @Autowired
  46. private CourseNoService courseNoService;
  47. @Autowired
  48. private CourseDataService courseDataService;
  49. @Autowired
  50. private CourseDataHistoryService courseDataHistoryService;
  51. @Autowired
  52. private CoursePackageService coursePackageService;
  53. @Autowired
  54. private CourseTeacherService courseTeacherService;
  55. @Autowired
  56. private CourseExperienceService courseExperienceService;
  57. @Autowired
  58. private PreviewService previewService;
  59. @Autowired
  60. private CourseExtendService courseExtendService;
  61. @Autowired
  62. private PreviewPaperService previewPaperService;
  63. @Autowired
  64. private QuestionNoService questionNoService;
  65. @Autowired
  66. private QuestionService questionService;
  67. @Autowired
  68. private UserCourseService userCourseService;
  69. @Autowired
  70. private UserCourseProgressService userCourseProgressService;
  71. @Autowired
  72. private UserCourseRecordService userCourseRecordService;
  73. @Autowired
  74. private UserOrderRecordService userOrderRecordService;
  75. @Autowired
  76. private UsersService usersService;
  77. @RequestMapping(value = "/vs", method = RequestMethod.GET)
  78. @ApiOperation(value = "获取1v1课程信息", notes = "获取1v1课程信息", httpMethod = "GET")
  79. public Response<List<CourseListDto>> vs() {
  80. List<Course> p = courseService.all(CourseModule.VS);
  81. List<CourseListDto> pr = Transform.convert(p, CourseListDto.class);
  82. return ResponseHelp.success(pr);
  83. }
  84. @RequestMapping(value = "/video/list", method = RequestMethod.GET)
  85. @ApiOperation(value = "在线课程列表", httpMethod = "GET")
  86. public Response<PageMessage<CourseListDto>> listVideo(
  87. @RequestParam(required = false, defaultValue = "1") int page,
  88. @RequestParam(required = false, defaultValue = "100") int size,
  89. @RequestParam(required = false) Integer structId,
  90. @RequestParam(required = false, defaultValue = "id") String order,
  91. @RequestParam(required = false, defaultValue = "desc") String direction,
  92. HttpSession session) {
  93. Page<Course> p = courseService.list(page, size, CourseModule.VIDEO, structId, order, DirectionStatus.ValueOf(direction));
  94. List<CourseListDto> pr = Transform.convert(p, CourseListDto.class);
  95. Collection ids = Transform.getIds(pr, CourseListDto.class, "id");
  96. // 评论
  97. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-video", ids, 1);
  98. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  99. return ResponseHelp.success(pr, page, size, p.getTotal());
  100. }
  101. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  102. @ApiOperation(value = "课程详情", httpMethod = "GET")
  103. public Response<CourseDetailDto> detail(
  104. @RequestParam(required = true) Integer courseId
  105. ) {
  106. User user = (User) shiroHelp.getLoginUser();
  107. Course course = courseService.get(courseId);
  108. CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class);
  109. // 课时
  110. List<CourseNo> courseNoList = courseNoService.allCourse(course.getId());
  111. courseExtendService.refreshNoResource(user, course.getId(), courseNoList);
  112. dto.setCourseNos(Transform.convert(courseNoList, CourseNoExtendDto.class));
  113. // 评论
  114. List<Comment> commentList = commentService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString());
  115. Collection userIds = Transform.getIds(commentList, Comment.class, "userId");
  116. List<User> userList = usersService.select(userIds);
  117. commentService.replaceUser(commentList, userList);
  118. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  119. // faq
  120. List<Faq> faqList = faqService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString());
  121. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  122. return ResponseHelp.success(dto);
  123. }
  124. @RequestMapping(value = "/simple", method = RequestMethod.GET)
  125. @ApiOperation(value = "课程基本信息", httpMethod = "GET")
  126. public Response<Course> simple(
  127. @RequestParam(required = true) Integer courseId
  128. ) {
  129. User user = (User) shiroHelp.getLoginUser();
  130. Course course = courseService.get(courseId);
  131. return ResponseHelp.success(course);
  132. }
  133. @RequestMapping(value = "/no/progress", method = RequestMethod.PUT)
  134. @ApiOperation(value = "更新课时进度", httpMethod = "PUT")
  135. public Response<Boolean> noProgress(@RequestBody @Validated UserCourseNoProgressDto dto) {
  136. UserSentenceProgress entity = Transform.dtoToEntity(dto);
  137. User user = (User) shiroHelp.getLoginUser();
  138. if (user == null) throw new AuthException("需要登录");
  139. UserCourse userCourse = userCourseService.getCourse(user.getId(), dto.getCourseId());
  140. if (userCourse == null) throw new AuthException("无访问权限");
  141. // 添加课时访问记录
  142. if (dto.getCurrentCourseNoId() != null && dto.getTime() != null && dto.getTime() > 0){
  143. userCourseRecordService.add(UserCourseRecord.builder()
  144. .userId(user.getId())
  145. .courseId(dto.getCourseId())
  146. .courseNoId(dto.getCurrentCourseNoId())
  147. .recordId(userCourse.getRecordId())
  148. .build());
  149. }
  150. // 更新课程进度
  151. userCourseProgressService.updateProgress(user.getId(), dto.getCourseId(), dto.getCourseNoId(), dto.getProgress(), userCourse.getRecordId());
  152. return ResponseHelp.success(true);
  153. }
  154. @RequestMapping(value = "/trail/view", method = RequestMethod.POST)
  155. @ApiOperation(value = "课程试用", httpMethod = "POST")
  156. public Response<Boolean> viewTrail(@RequestBody @Validated CourseTrailViewDto dto, HttpSession session) {
  157. courseService.accumulation(dto.getId(), 1, 0, 0);
  158. return ResponseHelp.success(true);
  159. }
  160. @RequestMapping(value = "/package/list", method = RequestMethod.GET)
  161. @ApiOperation(value = "套餐列表", httpMethod = "GET")
  162. public Response<PageMessage<CoursePackageListDto>> listPackage(
  163. @RequestParam(required = false, defaultValue = "1") int page,
  164. @RequestParam(required = false, defaultValue = "100") int size,
  165. @RequestParam(required = false) Integer structId,
  166. @RequestParam(required = false) Boolean isSpecial,
  167. @RequestParam(required = false, defaultValue = "id") String order,
  168. @RequestParam(required = false, defaultValue = "desc") String direction,
  169. HttpSession session) {
  170. Page<CoursePackage> p = coursePackageService.list(page, size, structId, isSpecial, order, DirectionStatus.ValueOf(direction));
  171. List<CoursePackageListDto> pr = Transform.convert(p, CoursePackageListDto.class);
  172. Collection ids = Transform.getIds(pr, CoursePackageListDto.class, "id");
  173. Map<Integer, Integer[]> courseIdsMap = new HashMap<>();
  174. for(CoursePackage cp : p){
  175. courseIdsMap.put(cp.getId(), cp.getCourseIds());
  176. }
  177. Map courseMap = courseService.groupByMap(courseIdsMap);
  178. Transform.combine(pr, courseMap, CoursePackageListDto.class, "id", "courses", CourseExtendDto.class);
  179. // 评论
  180. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-package", ids, 1);
  181. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  182. return ResponseHelp.success(pr, page, size, p.getTotal());
  183. }
  184. @RequestMapping(value = "/package/detail", method = RequestMethod.GET)
  185. @ApiOperation(value = "套餐详情", httpMethod = "GET")
  186. public Response<CoursePackageDetailDto> detailPackage(
  187. @RequestParam(required = true) Integer packageId
  188. ) {
  189. User user = (User) shiroHelp.getLoginUser();
  190. CoursePackage coursePackage = coursePackageService.get(packageId);
  191. CoursePackageDetailDto dto = Transform.convert(coursePackage, CoursePackageDetailDto.class);
  192. List<Course> courseList = courseService.select(coursePackage.getCourseIds());
  193. dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
  194. // 评论
  195. List<Comment> commentList = commentService.list(1, 10, "course-package", coursePackage.getId().toString());
  196. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  197. // faq
  198. List<Faq> faqList = faqService.list(1, 10, "course-package", coursePackage.getId().toString());
  199. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  200. return ResponseHelp.success(dto);
  201. }
  202. @RequestMapping(value = "/data/list", method = RequestMethod.GET)
  203. @ApiOperation(value = "资料列表", httpMethod = "GET")
  204. public Response<PageMessage<CourseDataListDto>> listData(
  205. @RequestParam(required = false, defaultValue = "1") int page,
  206. @RequestParam(required = false, defaultValue = "100") int size,
  207. @RequestParam(required = false) Integer structId,
  208. @RequestParam(required = false) String dataType,
  209. @RequestParam(required = false) Boolean isNovice,
  210. @RequestParam(required = false) Boolean isOriginal,
  211. @RequestParam(required = false, defaultValue = "id") String order,
  212. @RequestParam(required = false, defaultValue = "desc") String direction,
  213. HttpSession session) {
  214. Page<CourseData> p = courseDataService.list(page, size, structId, DataType.ValueOf(dataType), isNovice, isOriginal, order, DirectionStatus.ValueOf(direction));
  215. List<CourseDataListDto> pr = Transform.convert(p, CourseDataListDto.class);
  216. Collection ids = Transform.getIds(pr, CourseDataListDto.class, "id");
  217. // 评论
  218. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course_data", ids, 1);
  219. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  220. return ResponseHelp.success(pr, page, size, p.getTotal());
  221. }
  222. @RequestMapping(value = "/data/detail", method = RequestMethod.GET)
  223. @ApiOperation(value = "资料详情", httpMethod = "GET")
  224. public Response<CourseDataDetailDto> detailData(
  225. @RequestParam(required = true) Integer dataId
  226. ) {
  227. User user = (User) shiroHelp.getLoginUser();
  228. CourseData courseData = courseDataService.get(dataId);
  229. courseExtendService.refreshDataResource(user, courseData);
  230. CourseDataDetailDto dto = Transform.convert(courseData, CourseDataDetailDto.class);
  231. // 评论
  232. List<Comment> commentList = commentService.list(1, 10, "course_data", courseData.getId().toString());
  233. Collection userIds = Transform.getIds(commentList, Comment.class, "userId");
  234. List<User> userList = usersService.select(userIds);
  235. commentService.replaceUser(commentList, userList);
  236. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  237. // faq
  238. List<Faq> faqList = faqService.list(1, 10, "course_data", courseData.getId().toString());
  239. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  240. return ResponseHelp.success(dto);
  241. }
  242. @RequestMapping(value = "/data/view", method = RequestMethod.POST)
  243. @ApiOperation(value = "资料查看", httpMethod = "POST")
  244. public Response<Boolean> viewData(@RequestBody @Validated CourseDataViewDto dto, HttpSession session) {
  245. courseDataService.accumulation(dto.getId(), 0, 1);
  246. return ResponseHelp.success(true);
  247. }
  248. @RequestMapping(value = "/data/history", method = RequestMethod.GET)
  249. @ApiOperation(value = "资料详情", httpMethod = "GET")
  250. public Response<PageMessage<CourseDataHistory>> historyData(
  251. @RequestParam(required = false, defaultValue = "1") int page,
  252. @RequestParam(required = false, defaultValue = "100") int size,
  253. @RequestParam(required = true) Integer dataId
  254. ) {
  255. User user = (User) shiroHelp.getLoginUser();
  256. Page<CourseDataHistory> p = courseDataHistoryService.listByData(page, size, dataId);
  257. return ResponseHelp.success(p, page, size, p.getTotal());
  258. }
  259. @RequestMapping(value = "/teacher/list", method = RequestMethod.GET)
  260. @ApiOperation(value = "资料列表", httpMethod = "GET")
  261. public Response<List<CourseTeacher>> listTeacher(
  262. @RequestParam(required = false) Integer courseId,
  263. HttpSession session) {
  264. List<CourseTeacher> p = courseTeacherService.allByCourse(courseId);
  265. return ResponseHelp.success(p);
  266. }
  267. @RequestMapping(value = "/experience/list", method = RequestMethod.GET)
  268. @ApiOperation(value = "心经列表", httpMethod = "GET")
  269. public Response<PageMessage<CourseExperienceListDto>> listExperience(
  270. @RequestParam(required = false, defaultValue = "1") int page,
  271. @RequestParam(required = false, defaultValue = "100") int size,
  272. @RequestParam(required = false) String prepareStatus,
  273. @RequestParam(required = false) String experienceDay,
  274. @RequestParam(required = false) String experienceScore,
  275. @RequestParam(required = false) String experiencePercent,
  276. @RequestParam(required = false, defaultValue = "id") String order,
  277. @RequestParam(required = false, defaultValue = "desc") String direction,
  278. HttpSession session) {
  279. Page<CourseExperience> p = courseExperienceService.list(page, size, prepareStatus, ExperienceScoreRange.ValueOf(experienceScore), ExperienceDayRange.ValueOf(experienceDay), experiencePercent, order, DirectionStatus.ValueOf(direction));
  280. // 绑定用户
  281. Collection userIds = Transform.getIds(p, CourseExperienceListDto.class, "userId");
  282. List<User> userList = usersService.select(userIds);
  283. courseExperienceService.replaceUser(p, userList);
  284. List<CourseExperienceListDto> pr = Transform.convert(p, CourseExperienceListDto.class);
  285. return ResponseHelp.success(pr, page, size, p.getTotal());
  286. }
  287. @RequestMapping(value = "/experience/detail", method = RequestMethod.GET)
  288. @ApiOperation(value = "心经查看", httpMethod = "GET")
  289. public Response<CourseExperience> detailExperience(int experienceId, HttpSession session) {
  290. CourseExperience entity = courseExperienceService.get(experienceId);
  291. if(entity.getUserId() > 0){
  292. User user = usersService.get(entity.getUserId());
  293. entity.setNickname(user.getNickname());
  294. }
  295. return ResponseHelp.success(entity);
  296. }
  297. @RequestMapping(value = "/experience/view", method = RequestMethod.POST)
  298. @ApiOperation(value = "心经阅读", httpMethod = "POST")
  299. public Response<Boolean> viewExperience(@RequestBody @Validated ExperienceViewDto dto, HttpSession session) {
  300. courseExperienceService.accumulation(dto.getId(), 1, 0);
  301. return ResponseHelp.success(true);
  302. }
  303. @RequestMapping(value = "/record", method = RequestMethod.GET)
  304. @ApiOperation(value = "获取课程记录信息", notes = "获取课程记录信息", httpMethod = "GET")
  305. public Response<UserCourseDetailDto> record(
  306. @RequestParam(required = true) Integer recordId
  307. ) {
  308. User user = (User) shiroHelp.getLoginUser();
  309. UserOrderRecord userOrderRecord = userOrderRecordService.get(recordId);
  310. if (userOrderRecord == null){
  311. throw new ParameterException("记录不存在");
  312. }
  313. if (!userOrderRecord.getUserId().equals(user.getId())){
  314. throw new ParameterException("记录不存在");
  315. }
  316. UserCourseDetailDto dto = Transform.convert(userOrderRecord, UserCourseDetailDto.class);
  317. Course course = courseService.get(userOrderRecord.getProductId());
  318. dto.setCourse(Transform.convert(course, CourseExtendDto.class));
  319. return ResponseHelp.success(dto);
  320. }
  321. @RequestMapping(value = "/progress", method = RequestMethod.GET)
  322. @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
  323. public Response<List<UserCourseProgressDto>> progress(
  324. @RequestParam(required = false) String courseModule,
  325. @RequestParam(required = false) Integer structId,
  326. @RequestParam(required = false) Integer courseId
  327. ) {
  328. User user = (User) shiroHelp.getLoginUser();
  329. if (user == null){
  330. throw new ParameterException("登录后查看作业");
  331. }
  332. List<UserOrderRecord> userOrderRecordList;
  333. CourseModule module = CourseModule.ValueOf(courseModule);
  334. if (module == CourseModule.ONLINE){
  335. // 在线课程包含:视频课程、小班课程
  336. userOrderRecordList = userOrderRecordService.listWithStudyAdmin(1, 1000, new String[]{CourseModule.VIDEO.key, CourseModule.ONLINE.key}, structId, courseId, user.getId(), null,null, null);
  337. } else if (module == CourseModule.VS){
  338. // 1v1课程:只有系统授课有作业
  339. userOrderRecordList = userOrderRecordService.listWithVs(1, 1000, VsCourseType.COACH, courseId, user.getId(), null, null);
  340. }else{
  341. throw new ParameterException("课程类型错误");
  342. }
  343. List<UserCourseProgressDto> dtos = Transform.convert(userOrderRecordList, UserCourseProgressDto.class);
  344. // 绑定课程
  345. Collection courseIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "productId");
  346. List<Course> courseList = courseService.select(courseIds);
  347. Transform.combine(dtos, courseList, UserCourseProgressDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  348. // 获取每个科目的最后2次作业: 正在进行中的
  349. Date now = new Date();
  350. List<UserOrderRecord> processList = userOrderRecordList.stream().filter(row-> row.getIsUsed() > 0 && row.getUseEndTime().after(now)).collect(Collectors.toList());
  351. Collection processIds = Transform.getIds(processList, UserOrderRecord.class, "id");
  352. Map<Object, Collection<UserPreviewPaperRelation>> previewMap = previewService.groupByRecordId(user.getId(), processIds, 2);
  353. Transform.combine(dtos, previewMap, UserCourseProgressDto.class, "productId", "papers", UserPaperBaseExtendDto.class);
  354. // 绑定老师
  355. Collection teacherIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "teacherId");
  356. List<CourseTeacher> teacherList = courseTeacherService.select(teacherIds);
  357. Transform.combine(dtos, teacherList, UserCourseProgressDto.class, "teacherId", "teacher", CourseTeacher.class, "id", CourseTeacherExtendDto.class);
  358. return ResponseHelp.success(dtos);
  359. }
  360. @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
  361. @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
  362. public Response<List<UserExercisePaperDto>> listPreview(
  363. @RequestParam(required = false, defaultValue = "1") int page,
  364. @RequestParam(required = false, defaultValue = "100") int size,
  365. @RequestParam(required = false) Integer recordId,
  366. @RequestParam(required = false) String endTime,
  367. @RequestParam(required = false) Integer times
  368. ) {
  369. User user = (User) shiroHelp.getLoginUser();
  370. if (user == null){
  371. throw new ParameterException("登录后查看作业");
  372. }
  373. List<UserPreviewPaperRelation> p = previewService.list(page, size, recordId, user.getId(), endTime, times);
  374. List<UserExercisePaperDto> pr = Transform.convert(p, UserExercisePaperDto.class);
  375. // 获取试卷统计信息
  376. Map map = Transform.getMap(p, UserPreviewPaperRelation.class, "id", "paper");
  377. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  378. for(Object value : map.keySet()){
  379. Integer key = (Integer) value;
  380. PreviewPaper preview = (PreviewPaper) map.get(key);
  381. questionNoIdsMap.put(key, preview.getQuestionNoIds());
  382. }
  383. Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
  384. Transform.combine(pr, statMap, UserExercisePaperDto.class, "id", "stat");
  385. return ResponseHelp.success(pr);
  386. }
  387. }