package com.qxgmat.controller.api; import com.github.pagehelper.Page; import com.nuliji.tools.*; import com.nuliji.tools.exception.ParameterException; import com.qxgmat.data.constants.enums.ExperienceDayRange; import com.qxgmat.data.constants.enums.ExperienceScoreRange; import com.qxgmat.data.constants.enums.module.CourseModule; import com.qxgmat.data.constants.enums.module.VsCourseType; import com.qxgmat.data.constants.enums.status.DirectionStatus; import com.qxgmat.data.constants.enums.user.DataType; import com.qxgmat.data.dao.entity.*; import com.qxgmat.data.relation.entity.UserPreviewPaperRelation; import com.qxgmat.dto.extend.*; import com.qxgmat.dto.request.CourseTrailViewDto; import com.qxgmat.dto.request.ExperienceViewDto; import com.qxgmat.dto.response.*; import com.qxgmat.help.ShiroHelp; import com.qxgmat.service.UsersService; import com.qxgmat.service.extend.PreviewService; import com.qxgmat.service.inline.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping("/api/course") @Api(tags = "课程", description = "课程接口") public class CourseController { @Autowired private ShiroHelp shiroHelp; @Autowired private CommentService commentService; @Autowired private FaqService faqService; @Autowired private CourseService courseService; @Autowired private CourseDataService courseDataService; @Autowired private CourseDataHistoryService courseDataHistoryService; @Autowired private CoursePackageService coursePackageService; @Autowired private CourseTeacherService courseTeacherService; @Autowired private CourseExperienceService courseExperienceService; @Autowired private PreviewService previewService; @Autowired private PreviewPaperService previewPaperService; @Autowired private QuestionNoService questionNoService; @Autowired private QuestionService questionService; @Autowired private UserCourseService userCourseService; @Autowired private UserOrderRecordService userOrderRecordService; @Autowired private UsersService usersService; @RequestMapping(value = "/vs", method = RequestMethod.GET) @ApiOperation(value = "获取1v1课程信息", notes = "获取1v1课程信息", httpMethod = "GET") public Response> vs() { List p = courseService.all(CourseModule.VS); List pr = Transform.convert(p, CourseListDto.class); return ResponseHelp.success(pr); } @RequestMapping(value = "/video/list", method = RequestMethod.GET) @ApiOperation(value = "在线课程列表", httpMethod = "GET") public Response> listVideo( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) Integer structId, @RequestParam(required = false, defaultValue = "id") String order, @RequestParam(required = false, defaultValue = "desc") String direction, HttpSession session) { Page p = courseService.list(page, size, CourseModule.VIDEO, structId, order, DirectionStatus.ValueOf(direction)); List pr = Transform.convert(p, CourseListDto.class); Collection ids = Transform.getIds(pr, CourseListDto.class, "id"); // 评论 Map> commentMap = commentService.groupByPosition("course-video", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/detail", method = RequestMethod.GET) @ApiOperation(value = "课程详情", httpMethod = "GET") public Response detail( @RequestParam(required = true) Integer courseId ) { User user = (User) shiroHelp.getLoginUser(); Course course = courseService.get(courseId); CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class); // 评论 List commentList = commentService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString()); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List faqList = faqService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); return ResponseHelp.success(dto); } @RequestMapping(value = "/simple", method = RequestMethod.GET) @ApiOperation(value = "课程基本信息", httpMethod = "GET") public Response simple( @RequestParam(required = true) Integer courseId ) { User user = (User) shiroHelp.getLoginUser(); Course course = courseService.get(courseId); return ResponseHelp.success(course); } @RequestMapping(value = "/trail/view", method = RequestMethod.POST) @ApiOperation(value = "课程试用", httpMethod = "POST") public Response viewTrail(@RequestBody @Validated CourseTrailViewDto dto, HttpSession session) { courseService.accumulation(dto.getId(), 1, 0, 0); return ResponseHelp.success(true); } @RequestMapping(value = "/package/list", method = RequestMethod.GET) @ApiOperation(value = "套餐列表", httpMethod = "GET") public Response> listPackage( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) Integer structId, @RequestParam(required = false) Boolean isSpecial, @RequestParam(required = false, defaultValue = "id") String order, @RequestParam(required = false, defaultValue = "desc") String direction, HttpSession session) { Page p = coursePackageService.list(page, size, structId, isSpecial, order, DirectionStatus.ValueOf(direction)); List pr = Transform.convert(p, CoursePackageListDto.class); Collection ids = Transform.getIds(pr, CoursePackageListDto.class, "id"); Map courseIdsMap = new HashMap<>(); for(CoursePackage cp : p){ courseIdsMap.put(cp.getId(), cp.getCourseIds()); } Map courseMap = courseService.groupByMap(courseIdsMap); Transform.combine(pr, courseMap, CoursePackageListDto.class, "id", "courses", CourseExtendDto.class); // 评论 Map> commentMap = commentService.groupByPosition("course-package", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/package/detail", method = RequestMethod.GET) @ApiOperation(value = "套餐详情", httpMethod = "GET") public Response detailPackage( @RequestParam(required = true) Integer packageId ) { User user = (User) shiroHelp.getLoginUser(); CoursePackage coursePackage = coursePackageService.get(packageId); CoursePackageDetailDto dto = Transform.convert(coursePackage, CoursePackageDetailDto.class); List courseList = courseService.select(coursePackage.getCourseIds()); dto.setCourses(Transform.convert(courseList, CourseExtendDto.class)); // 评论 List commentList = commentService.list(1, 10, "course-package", coursePackage.getId().toString()); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List faqList = faqService.list(1, 10, "course-package", coursePackage.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); return ResponseHelp.success(dto); } @RequestMapping(value = "/data/list", method = RequestMethod.GET) @ApiOperation(value = "资料列表", httpMethod = "GET") public Response> listData( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) Integer structId, @RequestParam(required = false) String dataType, @RequestParam(required = false) Boolean isNovice, @RequestParam(required = false) Boolean isOriginal, @RequestParam(required = false, defaultValue = "id") String order, @RequestParam(required = false, defaultValue = "desc") String direction, HttpSession session) { Page p = courseDataService.list(page, size, structId, DataType.ValueOf(dataType), isNovice, isOriginal, order, DirectionStatus.ValueOf(direction)); List pr = Transform.convert(p, CourseDataListDto.class); Collection ids = Transform.getIds(pr, CourseDataListDto.class, "id"); // 评论 Map> commentMap = commentService.groupByPosition("course_data", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/data/detail", method = RequestMethod.GET) @ApiOperation(value = "资料详情", httpMethod = "GET") public Response detailData( @RequestParam(required = true) Integer dataId ) { User user = (User) shiroHelp.getLoginUser(); CourseData courseData = courseDataService.get(dataId); CourseDataDetailDto dto = Transform.convert(courseData, CourseDataDetailDto.class); // 评论 List commentList = commentService.list(1, 10, "course_package", courseData.getId().toString()); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List faqList = faqService.list(1, 10, "course_package", courseData.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); return ResponseHelp.success(dto); } @RequestMapping(value = "/data/history", method = RequestMethod.GET) @ApiOperation(value = "资料详情", httpMethod = "GET") public Response> historyData( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = true) Integer dataId ) { User user = (User) shiroHelp.getLoginUser(); Page p = courseDataHistoryService.listByData(page, size, dataId); return ResponseHelp.success(p, page, size, p.getTotal()); } @RequestMapping(value = "/teacher/list", method = RequestMethod.GET) @ApiOperation(value = "资料列表", httpMethod = "GET") public Response> listTeacher( @RequestParam(required = false) Integer courseId, HttpSession session) { List p = courseTeacherService.allByCourse(courseId); return ResponseHelp.success(p); } @RequestMapping(value = "/experience/list", method = RequestMethod.GET) @ApiOperation(value = "心经列表", httpMethod = "GET") public Response> listExperience( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) String prepareStatus, @RequestParam(required = false) String experienceDay, @RequestParam(required = false) String experienceScore, @RequestParam(required = false) String experiencePercent, @RequestParam(required = false, defaultValue = "id") String order, @RequestParam(required = false, defaultValue = "desc") String direction, HttpSession session) { Page p = courseExperienceService.list(page, size, prepareStatus, ExperienceScoreRange.ValueOf(experienceScore), ExperienceDayRange.ValueOf(experienceDay), experiencePercent, order, DirectionStatus.ValueOf(direction)); List pr = Transform.convert(p, CourseExperienceListDto.class); // 绑定用户 Collection userIds = Transform.getIds(pr, CourseExperienceListDto.class, "userId"); List userList = usersService.select(userIds); Transform.combine(pr, userList, CourseExperienceListDto.class, "userId", "user", User.class, "id", UserExtendDto.class); return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/experience/detail", method = RequestMethod.GET) @ApiOperation(value = "心经查看", httpMethod = "GET") public Response detailExperience(int id, HttpSession session) { CourseExperience entity = courseExperienceService.get(id); if(entity.getUserId() > 0){ CourseExperienceDetailDto dto = Transform.convert(entity, CourseExperienceDetailDto.class); User user = usersService.get(dto.getUserId()); dto.setUser(Transform.convert(user, UserExtendDto.class)); } return ResponseHelp.success(entity); } @RequestMapping(value = "/experience/view", method = RequestMethod.POST) @ApiOperation(value = "心经阅读", httpMethod = "POST") public Response viewExperience(@RequestBody @Validated ExperienceViewDto dto, HttpSession session) { courseExperienceService.accumulation(dto.getId(), 1, 0); return ResponseHelp.success(true); } @RequestMapping(value = "/record", method = RequestMethod.GET) @ApiOperation(value = "获取课程记录信息", notes = "获取所有课程及状态进度", httpMethod = "GET") public Response record( @RequestParam(required = true) Integer recordId ) { User user = (User) shiroHelp.getLoginUser(); UserOrderRecord userOrderRecord = userOrderRecordService.get(recordId); if (userOrderRecord == null){ throw new ParameterException("记录不存在"); } if (!userOrderRecord.getUserId().equals(user.getId())){ throw new ParameterException("记录不存在"); } UserCourseDetailDto dto = Transform.convert(userOrderRecord, UserCourseDetailDto.class); Course course = courseService.get(userOrderRecord.getProductId()); dto.setCourse(Transform.convert(course, CourseExtendDto.class)); return ResponseHelp.success(dto); } @RequestMapping(value = "/progress", method = RequestMethod.GET) @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET") public Response> progress( @RequestParam(required = false) String courseModule, @RequestParam(required = false) Integer structId, @RequestParam(required = false) Integer courseId ) { User user = (User) shiroHelp.getLoginUser(); if (user == null){ throw new ParameterException("登录后查看作业"); } List userOrderRecordList; CourseModule module = CourseModule.ValueOf(courseModule); if (module == CourseModule.ONLINE){ // 在线课程包含:视频课程、小班课程 userOrderRecordList = userOrderRecordService.listWithStudyAdmin(1, 1000, new String[]{CourseModule.VIDEO.key, CourseModule.ONLINE.key}, structId, courseId, user.getId(), null,null, null); } else if (module == CourseModule.VS){ // 1v1课程:只有系统授课有作业 userOrderRecordList = userOrderRecordService.listWithVs(1, 1000, VsCourseType.COACH, courseId, user.getId(), null, null); }else{ throw new ParameterException("课程类型错误"); } List dtos = Transform.convert(userOrderRecordList, UserCourseProgressDto.class); // 绑定课程 Collection courseIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "productId"); List courseList = courseService.select(courseIds); Transform.combine(dtos, courseList, UserCourseProgressDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class); // 获取每个科目的最后2次作业: 正在进行中的 Date now = new Date(); List processList = userOrderRecordList.stream().filter(row-> row.getIsUsed() > 0 && row.getUseEndTime().after(now)).collect(Collectors.toList()); Collection processIds = Transform.getIds(processList, UserOrderRecord.class, "id"); Map> previewMap = previewService.groupByCourseId(user.getId(), processIds, 2); Transform.combine(dtos, previewMap, UserCourseProgressDto.class, "productId", "papers", UserPaperBaseExtendDto.class); // 绑定老师 Collection teacherIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "teacherId"); List teacherList = courseTeacherService.select(teacherIds); Transform.combine(dtos, teacherList, UserCourseProgressDto.class, "teacherId", "teacher", CourseTeacher.class, "id", CourseTeacherExtendDto.class); return ResponseHelp.success(dtos); } @RequestMapping(value = "/preview/list", method = RequestMethod.GET) @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET") public Response> listPreview( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) Integer recordId, @RequestParam(required = false) String endTime, @RequestParam(required = false) Integer times ) { User user = (User) shiroHelp.getLoginUser(); if (user == null){ throw new ParameterException("登录后查看作业"); } List p = previewService.list(page, size, recordId, user.getId(), endTime, times); List pr = Transform.convert(p, UserExercisePaperDto.class); // 获取试卷统计信息 Map map = Transform.getMap(p, UserPreviewPaperRelation.class, "id", "paper"); Map questionNoIdsMap = new HashMap<>(); for(Object value : map.keySet()){ Integer key = (Integer) value; PreviewPaper preview = (PreviewPaper) map.get(key); questionNoIdsMap.put(key, preview.getQuestionNoIds()); } Map statMap = questionNoService.statPaperMap(questionNoIdsMap); Transform.combine(pr, statMap, UserExercisePaperDto.class, "id", "stat"); return ResponseHelp.success(pr); } }