CourseController.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  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.ProductType;
  10. import com.qxgmat.data.constants.enums.module.VsCourseType;
  11. import com.qxgmat.data.constants.enums.status.AnswerStatus;
  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.relation.entity.UserAskCourseStatRelation;
  16. import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
  17. import com.qxgmat.dto.extend.*;
  18. import com.qxgmat.dto.request.*;
  19. import com.qxgmat.dto.response.*;
  20. import com.qxgmat.help.ShiroHelp;
  21. import com.qxgmat.service.UserCollectExperienceService;
  22. import com.qxgmat.service.UserNoteCourseService;
  23. import com.qxgmat.service.UsersService;
  24. import com.qxgmat.service.extend.CourseExtendService;
  25. import com.qxgmat.service.extend.PreviewService;
  26. import com.qxgmat.service.inline.*;
  27. import io.swagger.annotations.Api;
  28. import io.swagger.annotations.ApiOperation;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.validation.annotation.Validated;
  31. import org.springframework.web.bind.annotation.*;
  32. import javax.servlet.http.HttpSession;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. @RestController
  36. @RequestMapping("/api/course")
  37. @Api(tags = "课程", description = "课程接口")
  38. public class CourseController {
  39. @Autowired
  40. private ShiroHelp shiroHelp;
  41. @Autowired
  42. private CommentService commentService;
  43. @Autowired
  44. private FaqService faqService;
  45. @Autowired
  46. private CourseService courseService;
  47. @Autowired
  48. private CourseNoService courseNoService;
  49. @Autowired
  50. private CourseDataService courseDataService;
  51. @Autowired
  52. private CourseDataHistoryService courseDataHistoryService;
  53. @Autowired
  54. private CoursePackageService coursePackageService;
  55. @Autowired
  56. private CourseTeacherService courseTeacherService;
  57. @Autowired
  58. private CourseExperienceService courseExperienceService;
  59. @Autowired
  60. private PreviewService previewService;
  61. @Autowired
  62. private CourseExtendService courseExtendService;
  63. @Autowired
  64. private PreviewPaperService previewPaperService;
  65. @Autowired
  66. private QuestionNoService questionNoService;
  67. @Autowired
  68. private QuestionService questionService;
  69. @Autowired
  70. private UserCourseService userCourseService;
  71. @Autowired
  72. private UserCourseProgressService userCourseProgressService;
  73. @Autowired
  74. private UserCourseRecordService userCourseRecordService;
  75. @Autowired
  76. private UserAskCourseService userAskCourseService;
  77. @Autowired
  78. private UserNoteCourseService userNoteCourseService;
  79. @Autowired
  80. private UserOrderRecordService userOrderRecordService;
  81. @Autowired
  82. private UserOrderCheckoutService userOrderCheckoutService;
  83. @Autowired
  84. private UserCourseDataSubscribeService userCourseDataSubscribeService;
  85. @Autowired
  86. private UserCollectExperienceService userCollectExperienceService;
  87. @Autowired
  88. private UsersService usersService;
  89. @RequestMapping(value = "/vs", method = RequestMethod.GET)
  90. @ApiOperation(value = "获取1v1课程信息", notes = "获取1v1课程信息", httpMethod = "GET")
  91. public Response<List<CourseListDto>> vs() {
  92. User user = (User) shiroHelp.getLoginUser();
  93. List<Course> p = courseService.all(CourseModule.VS);
  94. List<CourseListDto> pr = Transform.convert(p, CourseListDto.class);
  95. Collection ids = Transform.getIds(pr, CourseListDto.class, "id");
  96. if(user != null){
  97. // 已购买: 查看当前服务
  98. List<UserCourse> userCourseList = userCourseService.listByCourse(user.getId(), ids);
  99. Map userCourseMap = Transform.getMap(userCourseList, UserCourse.class, "courseId");
  100. // 添加购物车
  101. List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE, ids);
  102. Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId");
  103. for(CourseListDto dto : pr){
  104. dto.setHave(userCourseMap.containsKey(dto.getId()));
  105. dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId()));
  106. }
  107. }
  108. return ResponseHelp.success(pr);
  109. }
  110. @RequestMapping(value = "/video/list", method = RequestMethod.GET)
  111. @ApiOperation(value = "在线课程列表", httpMethod = "GET")
  112. public Response<PageMessage<CourseListDto>> listVideo(
  113. @RequestParam(required = false, defaultValue = "1") int page,
  114. @RequestParam(required = false, defaultValue = "100") int size,
  115. @RequestParam(required = false) Integer structId,
  116. @RequestParam(required = false, defaultValue = "id") String order,
  117. @RequestParam(required = false, defaultValue = "desc") String direction,
  118. HttpSession session) {
  119. User user = (User) shiroHelp.getLoginUser();
  120. Page<Course> p = courseService.list(page, size, CourseModule.VIDEO, structId, order, DirectionStatus.ValueOf(direction));
  121. List<CourseListDto> pr = Transform.convert(p, CourseListDto.class);
  122. Collection ids = Transform.getIds(pr, CourseListDto.class, "id");
  123. // 评论
  124. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-video", ids, 1);
  125. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  126. // 优质问答
  127. List<UserAskCourseStatRelation> relationList = userAskCourseService.statGroupCourse(ids, 1);
  128. Map relationMap = Transform.getMap(relationList, UserAskCourseStatRelation.class, "courseId");
  129. for(CourseListDto dto : pr){
  130. UserAskCourseStatRelation relation = (UserAskCourseStatRelation) relationMap.getOrDefault(dto.getId(), null);
  131. if (relation != null){
  132. dto.setAskNumber(relation.getNumber());
  133. }
  134. }
  135. if(user != null){
  136. // 已购买: 查看当前服务
  137. List<UserCourse> userCourseList = userCourseService.listByCourse(user.getId(), ids);
  138. Map userCourseMap = Transform.getMap(userCourseList, UserCourse.class, "courseId");
  139. // 添加购物车
  140. List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE, ids);
  141. Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId");
  142. for(CourseListDto dto : pr){
  143. dto.setHave(userCourseMap.containsKey(dto.getId()));
  144. dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId()));
  145. }
  146. }
  147. return ResponseHelp.success(pr, page, size, p.getTotal());
  148. }
  149. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  150. @ApiOperation(value = "课程详情", httpMethod = "GET")
  151. public Response<CourseDetailDto> detail(
  152. @RequestParam(required = true) Integer courseId
  153. ) {
  154. User user = (User) shiroHelp.getLoginUser();
  155. Course course = courseService.get(courseId);
  156. CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class);
  157. // 课时
  158. List<CourseNo> courseNoList = courseNoService.allCourse(course.getId());
  159. courseExtendService.refreshNoResource(user, course.getId(), courseNoList);
  160. dto.setCourseNos(Transform.convert(courseNoList, CourseNoExtendDto.class));
  161. // 评论
  162. List<Comment> commentList = commentService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString());
  163. Collection userIds = Transform.getIds(commentList, Comment.class, "userId");
  164. List<User> userList = usersService.select(userIds);
  165. commentService.replaceUser(commentList, userList);
  166. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  167. // faq
  168. List<Faq> faqList = faqService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString());
  169. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  170. // 优质问答
  171. UserAskCourseStatRelation askCourseStatRelation = userAskCourseService.statCourse(courseId, 1);
  172. if (askCourseStatRelation != null){
  173. dto.setAskSpecialNumber(askCourseStatRelation.getNumber());
  174. }
  175. if(user != null){
  176. // 已购买
  177. UserCourse userCourse = userCourseService.getCourse(user.getId(), courseId);
  178. // 购物车
  179. UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE, courseId);
  180. dto.setHave(userCourse != null);
  181. dto.setAdd(userOrderCheckout != null);
  182. if (userCourse != null){
  183. // 进度信息
  184. Collection<UserCourseProgress> progressList = userCourseProgressService.getByRecordId(userCourse.getRecordId());
  185. dto.setCurrentNo(courseExtendService.computeCourseNoCurrent(courseNoList, progressList));
  186. dto.setProgress(Transform.convert(progressList, UserCourseProgressExtendDto.class));
  187. // 获取每个科目的所有作业
  188. Collection<UserPreviewPaperRelation> previewList = previewService.getByRecordId(user.getId(), userCourse.getRecordId(), 1000);
  189. dto.setPapers(Transform.convert(previewList, BasePaperExtendDto.class));
  190. int finish = 0;
  191. for(UserPreviewPaperRelation relation : previewList){
  192. if (relation.getPaper() == null) continue;
  193. UserPaper paper = relation.getPaper();
  194. if (paper.getTimes() > 0){
  195. finish += 1;
  196. }
  197. }
  198. dto.setPreviewProgress(previewList.size()> 0 ? finish * 100 / previewList.size(): 0);
  199. // 提问数、笔记数
  200. Collection<UserAskCourse> askList = userAskCourseService.getByRecordId(userCourse.getRecordId());
  201. Collection<UserNoteCourse> noteList = userNoteCourseService.getByCourse(user.getId(), courseId);
  202. Map<Object, List<UserAskCourse>> askListMap = Transform.getMapList(askList, UserAskCourse.class, "courseNoId");
  203. Map notes = Transform.getMap(noteList, UserNoteCourse.class, "courseNoId");
  204. Collection<CourseNoExtendDto> courseNos = dto.getCourseNos();
  205. int noteNumber = 0;
  206. int askNumber = askList == null ? 0: askList.size();
  207. int answerNumber = askList == null ? 0 : (int)askList.stream().filter(r->r.getAnswerStatus()== AnswerStatus.ANSWER.index).count();
  208. for(CourseNoExtendDto courseNo : courseNos){
  209. if (notes.get(courseNo.getId()) != null){
  210. courseNo.setNote(true);
  211. noteNumber += 1;
  212. }
  213. List<UserAskCourse> askListNo = askListMap.get(courseNo.getId());
  214. if (askListNo != null){
  215. courseNo.setAskNumber(askListNo.size());
  216. courseNo.setAnswerNumber((int)askListNo.stream().filter(r->r.getAnswerStatus()== AnswerStatus.ANSWER.index).count());
  217. }
  218. }
  219. dto.setNoteNumber(noteNumber);
  220. dto.setAskNumber(askNumber);
  221. dto.setAnswerNumber(answerNumber);
  222. }
  223. }
  224. return ResponseHelp.success(dto);
  225. }
  226. @RequestMapping(value = "/simple", method = RequestMethod.GET)
  227. @ApiOperation(value = "课程基本信息", httpMethod = "GET")
  228. public Response<CourseDetailDto> simple(
  229. @RequestParam(required = true) Integer courseId
  230. ) {
  231. User user = (User) shiroHelp.getLoginUser();
  232. Course course = courseService.get(courseId);
  233. CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class);
  234. // 课时
  235. List<CourseNo> courseNoList = courseNoService.allCourse(course.getId());
  236. courseExtendService.refreshNoResource(user, course.getId(), courseNoList);
  237. dto.setCourseNos(Transform.convert(courseNoList, CourseNoExtendDto.class));
  238. return ResponseHelp.success(dto);
  239. }
  240. @RequestMapping(value = "/ask/list", method = RequestMethod.GET)
  241. @ApiOperation(value = "精选问答", httpMethod = "GET")
  242. public Response<PageMessage<UserAskCourse>> listAsk(
  243. @RequestParam(required = false, defaultValue = "1") int page,
  244. @RequestParam(required = false, defaultValue = "100") int size,
  245. @RequestParam(required = false) String keyword,
  246. @RequestParam(required = false) Integer courseId,
  247. @RequestParam(required = false) Integer courseNoId,
  248. @RequestParam(required = false) Integer position,
  249. @RequestParam(required = false) String order, // create_time, answer_time
  250. @RequestParam(required = false, defaultValue = "desc") String direction
  251. ) {
  252. User user = (User) shiroHelp.getLoginUser();
  253. Page<UserAskCourse> pr = userAskCourseService.listByCourse(page, size, keyword, courseId, courseNoId, position, true, order, DirectionStatus.ValueOf(direction));
  254. return ResponseHelp.success(pr, page, size, pr.getTotal());
  255. }
  256. @RequestMapping(value = "/ask/view", method = RequestMethod.POST)
  257. @ApiOperation(value = "精选问答查看", httpMethod = "POST")
  258. public Response<Boolean> viewAsk(@RequestBody @Validated AskCourseViewDto dto, HttpSession session) {
  259. userAskCourseService.accumulation(dto.getId(), 1);
  260. return ResponseHelp.success(true);
  261. }
  262. @RequestMapping(value = "/no/progress", method = RequestMethod.PUT)
  263. @ApiOperation(value = "更新课时进度", httpMethod = "PUT")
  264. public Response<Boolean> noProgress(@RequestBody @Validated UserCourseNoProgressDto dto) {
  265. UserSentenceProgress entity = Transform.dtoToEntity(dto);
  266. User user = (User) shiroHelp.getLoginUser();
  267. if (user == null) throw new AuthException("需要登录");
  268. UserCourse userCourse = userCourseService.getCourse(user.getId(), dto.getCourseId());
  269. if (userCourse == null) throw new AuthException("无访问权限");
  270. // 添加课时访问记录
  271. if (dto.getCurrentCourseNoId() != null && dto.getTime() != null && dto.getTime() > 0){
  272. userCourseRecordService.add(UserCourseRecord.builder()
  273. .userId(user.getId())
  274. .courseId(dto.getCourseId())
  275. .courseNoId(dto.getCurrentCourseNoId())
  276. .recordId(userCourse.getRecordId())
  277. .userTime(dto.getTime())
  278. .build());
  279. }
  280. // 更新课程进度
  281. userCourseProgressService.updateProgress(user.getId(), dto.getCourseId(), dto.getCourseNoId(), dto.getProgress(), userCourse.getRecordId());
  282. return ResponseHelp.success(true);
  283. }
  284. @RequestMapping(value = "/trail/view", method = RequestMethod.POST)
  285. @ApiOperation(value = "课程试用", httpMethod = "POST")
  286. public Response<Boolean> viewTrail(@RequestBody @Validated CourseTrailViewDto dto, HttpSession session) {
  287. courseService.accumulation(dto.getId(), 1, 0, 0);
  288. return ResponseHelp.success(true);
  289. }
  290. @RequestMapping(value = "/package/list", method = RequestMethod.GET)
  291. @ApiOperation(value = "套餐列表", httpMethod = "GET")
  292. public Response<PageMessage<CoursePackageListDto>> listPackage(
  293. @RequestParam(required = false, defaultValue = "1") int page,
  294. @RequestParam(required = false, defaultValue = "100") int size,
  295. @RequestParam(required = false) Integer structId,
  296. @RequestParam(required = false) Boolean isSpecial,
  297. @RequestParam(required = false, defaultValue = "id") String order,
  298. @RequestParam(required = false, defaultValue = "desc") String direction,
  299. HttpSession session) {
  300. User user = (User) shiroHelp.getLoginUser();
  301. Page<CoursePackage> p = coursePackageService.list(page, size, structId, isSpecial, order, DirectionStatus.ValueOf(direction));
  302. List<CoursePackageListDto> pr = Transform.convert(p, CoursePackageListDto.class);
  303. Collection ids = Transform.getIds(pr, CoursePackageListDto.class, "id");
  304. Map<Integer, Integer[]> courseIdsMap = new HashMap<>();
  305. for(CoursePackage cp : p){
  306. courseIdsMap.put(cp.getId(), cp.getCourseIds());
  307. }
  308. Map courseMap = courseService.groupByMap(courseIdsMap);
  309. Transform.combine(pr, courseMap, CoursePackageListDto.class, "id", "courses", CourseExtendDto.class);
  310. // 评论
  311. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-package", ids, 1);
  312. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  313. if(user != null){
  314. // 添加购物车
  315. List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE_PACKAGE, ids);
  316. Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId");
  317. for(CoursePackageListDto dto : pr){
  318. dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId()));
  319. }
  320. }
  321. return ResponseHelp.success(pr, page, size, p.getTotal());
  322. }
  323. @RequestMapping(value = "/package/detail", method = RequestMethod.GET)
  324. @ApiOperation(value = "套餐详情", httpMethod = "GET")
  325. public Response<CoursePackageDetailDto> detailPackage(
  326. @RequestParam(required = true) Integer packageId
  327. ) {
  328. User user = (User) shiroHelp.getLoginUser();
  329. CoursePackage coursePackage = coursePackageService.get(packageId);
  330. CoursePackageDetailDto dto = Transform.convert(coursePackage, CoursePackageDetailDto.class);
  331. List<Course> courseList = courseService.select(coursePackage.getCourseIds());
  332. dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
  333. // 评论
  334. List<Comment> commentList = commentService.list(1, 10, "course-package", coursePackage.getId().toString());
  335. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  336. // faq
  337. List<Faq> faqList = faqService.list(1, 10, "course-package", coursePackage.getId().toString());
  338. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  339. if(user != null){
  340. // 购物车
  341. UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE_PACKAGE, packageId);
  342. dto.setAdd(userOrderCheckout != null);
  343. }
  344. return ResponseHelp.success(dto);
  345. }
  346. @RequestMapping(value = "/data/list", method = RequestMethod.GET)
  347. @ApiOperation(value = "资料列表", httpMethod = "GET")
  348. public Response<PageMessage<CourseDataListDto>> listData(
  349. @RequestParam(required = false, defaultValue = "1") int page,
  350. @RequestParam(required = false, defaultValue = "100") int size,
  351. @RequestParam(required = false) Integer structId,
  352. @RequestParam(required = false) String dataType,
  353. @RequestParam(required = false) Boolean isNovice,
  354. @RequestParam(required = false) Boolean isOriginal,
  355. @RequestParam(required = false, defaultValue = "id") String order,
  356. @RequestParam(required = false, defaultValue = "desc") String direction,
  357. HttpSession session) {
  358. User user = (User) shiroHelp.getLoginUser();
  359. Page<CourseData> p = courseDataService.list(page, size, structId, DataType.ValueOf(dataType), isNovice, isOriginal, order, DirectionStatus.ValueOf(direction));
  360. courseExtendService.refreshDataResource(user, p);
  361. List<CourseDataListDto> pr = Transform.convert(p, CourseDataListDto.class);
  362. Collection ids = Transform.getIds(pr, CourseDataListDto.class, "id");
  363. // 评论
  364. Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course_data", ids, 1);
  365. Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class);
  366. // 订阅
  367. if (user != null){
  368. List<UserCourseDataSubscribe> subscribeList = userCourseDataSubscribeService.listWithData(user.getId(), ids);
  369. Map subscribeMap = Transform.getMap(subscribeList, UserCourseDataSubscribe.class, "dataId");
  370. for(CourseDataListDto dto : pr){
  371. dto.setSubscribe(subscribeMap.containsKey(dto.getId()));
  372. }
  373. }
  374. if(user != null){
  375. // 已购买: 查看当前服务
  376. List<UserOrderRecord> userOrderRecordList = userOrderRecordService.listWithUserData(user.getId(), ids);
  377. Map userOrderRecordMap = Transform.getMap(userOrderRecordList, UserOrderRecord.class, "productId");
  378. // 添加购物车
  379. List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.DATA, ids);
  380. Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId");
  381. for(CourseDataListDto dto : pr){
  382. dto.setHave(userOrderRecordMap.containsKey(dto.getId()));
  383. dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId()));
  384. }
  385. }
  386. return ResponseHelp.success(pr, page, size, p.getTotal());
  387. }
  388. @RequestMapping(value = "/data/detail", method = RequestMethod.GET)
  389. @ApiOperation(value = "资料详情", httpMethod = "GET")
  390. public Response<CourseDataDetailDto> detailData(
  391. @RequestParam(required = true) Integer dataId
  392. ) {
  393. User user = (User) shiroHelp.getLoginUser();
  394. CourseData courseData = courseDataService.get(dataId);
  395. courseExtendService.refreshDataResource(user, courseData);
  396. CourseDataDetailDto dto = Transform.convert(courseData, CourseDataDetailDto.class);
  397. // 评论
  398. List<Comment> commentList = commentService.list(1, 10, "course_data", courseData.getId().toString());
  399. Collection userIds = Transform.getIds(commentList, Comment.class, "userId");
  400. List<User> userList = usersService.select(userIds);
  401. commentService.replaceUser(commentList, userList);
  402. dto.setComments(Transform.convert(commentList, CommentExtendDto.class));
  403. // faq
  404. List<Faq> faqList = faqService.list(1, 10, "course_data", courseData.getId().toString());
  405. dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class));
  406. // 订阅
  407. if (user != null){
  408. UserCourseDataSubscribe subscribe = userCourseDataSubscribeService.getByData(user.getId(), dataId);
  409. dto.setSubscribe(subscribe != null);
  410. }
  411. if(user != null){
  412. // 已购买: 查看当前服务
  413. UserOrderRecord userOrderRecord = userOrderRecordService.getWithUserData(user.getId(), dataId);
  414. // 添加购物车
  415. UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE_PACKAGE, dataId);
  416. dto.setHave(userOrderRecord != null);
  417. dto.setAdd(userOrderCheckout != null);
  418. }
  419. return ResponseHelp.success(dto);
  420. }
  421. @RequestMapping(value = "/data/view", method = RequestMethod.POST)
  422. @ApiOperation(value = "资料查看", httpMethod = "POST")
  423. public Response<Boolean> viewData(@RequestBody @Validated CourseDataViewDto dto, HttpSession session) {
  424. courseDataService.accumulation(dto.getId(), 0, 1);
  425. return ResponseHelp.success(true);
  426. }
  427. @RequestMapping(value = "/data/history", method = RequestMethod.GET)
  428. @ApiOperation(value = "资料详情", httpMethod = "GET")
  429. public Response<PageMessage<CourseDataHistory>> historyData(
  430. @RequestParam(required = false, defaultValue = "1") int page,
  431. @RequestParam(required = false, defaultValue = "100") int size,
  432. @RequestParam(required = true) Integer dataId
  433. ) {
  434. User user = (User) shiroHelp.getLoginUser();
  435. Page<CourseDataHistory> p = courseDataHistoryService.listByData(page, size, dataId);
  436. return ResponseHelp.success(p, page, size, p.getTotal());
  437. }
  438. @RequestMapping(value = "/teacher/all", method = RequestMethod.GET)
  439. @ApiOperation(value = "资料列表", httpMethod = "GET")
  440. public Response<List<CourseTeacher>> allTeacher(
  441. @RequestParam(required = false) Integer courseId,
  442. HttpSession session) {
  443. List<CourseTeacher> p = courseTeacherService.allByCourse(courseId);
  444. return ResponseHelp.success(p);
  445. }
  446. @RequestMapping(value = "/experience/list", method = RequestMethod.GET)
  447. @ApiOperation(value = "心经列表", httpMethod = "GET")
  448. public Response<PageMessage<CourseExperienceListDto>> listExperience(
  449. @RequestParam(required = false, defaultValue = "1") int page,
  450. @RequestParam(required = false, defaultValue = "100") int size,
  451. @RequestParam(required = false) String prepareStatus,
  452. @RequestParam(required = false) String experienceDay,
  453. @RequestParam(required = false) String experienceScore,
  454. @RequestParam(required = false) String experiencePercent,
  455. @RequestParam(required = false, defaultValue = "id") String order,
  456. @RequestParam(required = false, defaultValue = "desc") String direction,
  457. HttpSession session) {
  458. User user = (User) shiroHelp.getLoginUser();
  459. Page<CourseExperience> p = courseExperienceService.list(page, size, prepareStatus, ExperienceScoreRange.ValueOf(experienceScore), ExperienceDayRange.ValueOf(experienceDay), experiencePercent, order, DirectionStatus.ValueOf(direction));
  460. Collection ids = Transform.getIds(p, CourseExperience.class, "id");
  461. // 绑定用户
  462. Collection userIds = Transform.getIds(p, CourseExperience.class, "userId");
  463. List<User> userList = usersService.select(userIds);
  464. courseExperienceService.replaceUser(p, userList);
  465. List<CourseExperienceListDto> pr = Transform.convert(p, CourseExperienceListDto.class);
  466. if(user != null){
  467. List<UserCollectExperience> userCollectExperienceList = userCollectExperienceService.listByUserAndExperiences(user.getId(), ids);
  468. Map userCollectExperienceMap = Transform.getMap(userCollectExperienceList, UserCollectExperience.class, "experienceId");
  469. for(CourseExperienceListDto dto : pr){
  470. dto.setCollect(userCollectExperienceMap.containsKey(dto.getId()));
  471. }
  472. }
  473. return ResponseHelp.success(pr, page, size, p.getTotal());
  474. }
  475. @RequestMapping(value = "/experience/detail", method = RequestMethod.GET)
  476. @ApiOperation(value = "心经查看", httpMethod = "GET")
  477. public Response<CourseExperienceDetailDto> detailExperience(int experienceId, HttpSession session) {
  478. User user = (User) shiroHelp.getLoginUser();
  479. CourseExperience entity = courseExperienceService.get(experienceId);
  480. if(entity.getUserId() > 0){
  481. User target = usersService.get(entity.getUserId());
  482. entity.setNickname(target.getNickname());
  483. }
  484. CourseExperienceDetailDto dto = Transform.convert(entity, CourseExperienceDetailDto.class);
  485. if (user != null){
  486. UserCollectExperience userCollectExperience = userCollectExperienceService.getByUserAndExperience(user.getId(), experienceId);
  487. dto.setCollect(userCollectExperience != null);
  488. }
  489. return ResponseHelp.success(dto);
  490. }
  491. @RequestMapping(value = "/experience/view", method = RequestMethod.POST)
  492. @ApiOperation(value = "心经阅读", httpMethod = "POST")
  493. public Response<Boolean> viewExperience(@RequestBody @Validated ExperienceViewDto dto, HttpSession session) {
  494. courseExperienceService.accumulation(dto.getId(), 1, 0);
  495. return ResponseHelp.success(true);
  496. }
  497. @RequestMapping(value = "/record", method = RequestMethod.GET)
  498. @ApiOperation(value = "获取课程记录信息", notes = "获取课程记录信息", httpMethod = "GET")
  499. public Response<UserCourseDetailDto> record(
  500. @RequestParam(required = true) Integer recordId
  501. ) {
  502. User user = (User) shiroHelp.getLoginUser();
  503. UserOrderRecord userOrderRecord = userOrderRecordService.get(recordId);
  504. if (userOrderRecord == null){
  505. throw new ParameterException("记录不存在");
  506. }
  507. if (!userOrderRecord.getUserId().equals(user.getId())){
  508. throw new ParameterException("记录不存在");
  509. }
  510. UserCourseDetailDto dto = Transform.convert(userOrderRecord, UserCourseDetailDto.class);
  511. Course course = courseService.get(userOrderRecord.getProductId());
  512. dto.setCourse(Transform.convert(course, CourseExtendDto.class));
  513. return ResponseHelp.success(dto);
  514. }
  515. @RequestMapping(value = "/progress", method = RequestMethod.GET)
  516. @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
  517. public Response<List<UserCourseProgressDto>> progress(
  518. @RequestParam(required = false) String courseModule,
  519. @RequestParam(required = false) Integer structId,
  520. @RequestParam(required = false) Integer courseId
  521. ) {
  522. User user = (User) shiroHelp.getLoginUser();
  523. if (user == null){
  524. throw new ParameterException("登录后查看作业");
  525. }
  526. List<UserOrderRecord> userOrderRecordList;
  527. CourseModule module = CourseModule.ValueOf(courseModule);
  528. if (module == CourseModule.ONLINE){
  529. // 在线课程包含:视频课程、小班课程
  530. userOrderRecordList = userOrderRecordService.listWithStudyAdmin(1, 1000, new String[]{CourseModule.VIDEO.key, CourseModule.ONLINE.key}, structId, courseId, user.getId(), null,null, null);
  531. } else if (module == CourseModule.VS){
  532. // 1v1课程:只有系统授课有作业
  533. userOrderRecordList = userOrderRecordService.listWithVs(1, 1000, VsCourseType.SYSTEM, courseId, user.getId(), null, null);
  534. }else{
  535. throw new ParameterException("课程类型错误");
  536. }
  537. List<UserCourseProgressDto> dtos = Transform.convert(userOrderRecordList, UserCourseProgressDto.class);
  538. // 绑定课程
  539. Collection courseIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "productId");
  540. List<Course> courseList = courseService.select(courseIds);
  541. Transform.combine(dtos, courseList, UserCourseProgressDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  542. // 获取每个科目的最后2次作业: 正在进行中的
  543. Date now = new Date();
  544. List<UserOrderRecord> processList = userOrderRecordList.stream().filter(row-> row.getIsUsed() > 0 && row.getUseEndTime().after(now)).collect(Collectors.toList());
  545. Collection processIds = Transform.getIds(processList, UserOrderRecord.class, "id");
  546. Map<Object, Collection<UserPreviewPaperRelation>> previewMap = previewService.groupByRecordId(user.getId(), processIds, 2);
  547. Transform.combine(dtos, previewMap, UserCourseProgressDto.class, "productId", "papers", UserPaperBaseExtendDto.class);
  548. // 绑定老师
  549. Collection teacherIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "teacherId");
  550. List<CourseTeacher> teacherList = courseTeacherService.select(teacherIds);
  551. Transform.combine(dtos, teacherList, UserCourseProgressDto.class, "teacherId", "teacher", CourseTeacher.class, "id", CourseTeacherExtendDto.class);
  552. return ResponseHelp.success(dtos);
  553. }
  554. @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
  555. @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
  556. public Response<List<UserExercisePaperDto>> listPreview(
  557. @RequestParam(required = false, defaultValue = "1") int page,
  558. @RequestParam(required = false, defaultValue = "100") int size,
  559. @RequestParam(required = false) Integer recordId,
  560. @RequestParam(required = false) String endTime,
  561. @RequestParam(required = false) Integer times
  562. ) {
  563. User user = (User) shiroHelp.getLoginUser();
  564. if (user == null){
  565. throw new ParameterException("登录后查看作业");
  566. }
  567. List<UserPreviewPaperRelation> p = previewService.list(page, size, recordId, user.getId(), endTime, times);
  568. List<UserExercisePaperDto> pr = Transform.convert(p, UserExercisePaperDto.class);
  569. // 获取试卷统计信息
  570. Map map = Transform.getMap(p, UserPreviewPaperRelation.class, "id", "paper");
  571. Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
  572. for(Object value : map.keySet()){
  573. Integer key = (Integer) value;
  574. PreviewPaper preview = (PreviewPaper) map.get(key);
  575. questionNoIdsMap.put(key, preview.getQuestionNoIds());
  576. }
  577. Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
  578. Transform.combine(pr, statMap, UserExercisePaperDto.class, "id", "stat");
  579. return ResponseHelp.success(pr);
  580. }
  581. }