CourseController.java 19 KB

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