package com.qxgmat.controller.api; import com.github.pagehelper.Page; import com.nuliji.tools.*; import com.nuliji.tools.exception.AuthException; 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.ProductType; import com.qxgmat.data.constants.enums.module.VsCourseType; import com.qxgmat.data.constants.enums.status.AnswerStatus; 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.UserAskCourseStatRelation; import com.qxgmat.data.relation.entity.UserPreviewPaperRelation; import com.qxgmat.dto.extend.*; import com.qxgmat.dto.request.*; import com.qxgmat.dto.response.*; import com.qxgmat.help.ShiroHelp; import com.qxgmat.service.UserCollectExperienceService; import com.qxgmat.service.UserNoteCourseService; import com.qxgmat.service.UsersService; import com.qxgmat.service.extend.CourseExtendService; 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 CourseNoService courseNoService; @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 CourseExtendService courseExtendService; @Autowired private PreviewPaperService previewPaperService; @Autowired private QuestionNoService questionNoService; @Autowired private QuestionService questionService; @Autowired private UserCourseService userCourseService; @Autowired private UserCourseProgressService userCourseProgressService; @Autowired private UserCourseRecordService userCourseRecordService; @Autowired private UserAskCourseService userAskCourseService; @Autowired private UserNoteCourseService userNoteCourseService; @Autowired private UserOrderRecordService userOrderRecordService; @Autowired private UserOrderCheckoutService userOrderCheckoutService; @Autowired private UserCourseDataSubscribeService userCourseDataSubscribeService; @Autowired private UserCollectExperienceService userCollectExperienceService; @Autowired private UsersService usersService; @RequestMapping(value = "/vs", method = RequestMethod.GET) @ApiOperation(value = "获取1v1课程信息", notes = "获取1v1课程信息", httpMethod = "GET") public Response<List<CourseListDto>> vs() { User user = (User) shiroHelp.getLoginUser(); List<Course> p = courseService.all(CourseModule.VS); List<CourseListDto> pr = Transform.convert(p, CourseListDto.class); Collection ids = Transform.getIds(pr, CourseListDto.class, "id"); if(user != null){ // 已购买: 查看当前服务 List<UserCourse> userCourseList = userCourseService.listByCourse(user.getId(), ids); Map userCourseMap = Transform.getMap(userCourseList, UserCourse.class, "courseId"); // 添加购物车 List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE, ids); Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId"); for(CourseListDto dto : pr){ dto.setHave(userCourseMap.containsKey(dto.getId())); dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId())); } } return ResponseHelp.success(pr); } @RequestMapping(value = "/video/list", method = RequestMethod.GET) @ApiOperation(value = "在线课程列表", httpMethod = "GET") public Response<PageMessage<CourseListDto>> 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) { User user = (User) shiroHelp.getLoginUser(); Page<Course> p = courseService.list(page, size, CourseModule.VIDEO, structId, order, DirectionStatus.ValueOf(direction)); List<CourseListDto> pr = Transform.convert(p, CourseListDto.class); Collection ids = Transform.getIds(pr, CourseListDto.class, "id"); // 评论 Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-video", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); // 优质问答 List<UserAskCourseStatRelation> relationList = userAskCourseService.statGroupCourse(ids, 1); Map relationMap = Transform.getMap(relationList, UserAskCourseStatRelation.class, "courseId"); for(CourseListDto dto : pr){ UserAskCourseStatRelation relation = (UserAskCourseStatRelation) relationMap.getOrDefault(dto.getId(), null); if (relation != null){ dto.setAskNumber(relation.getNumber()); } } if(user != null){ // 已购买: 查看当前服务 List<UserCourse> userCourseList = userCourseService.listByCourse(user.getId(), ids); Map userCourseMap = Transform.getMap(userCourseList, UserCourse.class, "courseId"); // 添加购物车 List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE, ids); Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId"); for(CourseListDto dto : pr){ dto.setHave(userCourseMap.containsKey(dto.getId())); dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId())); } } return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/detail", method = RequestMethod.GET) @ApiOperation(value = "课程详情", httpMethod = "GET") public Response<CourseDetailDto> detail( @RequestParam(required = true) Integer courseId ) { User user = (User) shiroHelp.getLoginUser(); Course course = courseService.get(courseId); CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class); // 课时 List<CourseNo> courseNoList = courseNoService.allCourse(course.getId()); courseExtendService.refreshNoResource(user, course.getId(), courseNoList); dto.setCourseNos(Transform.convert(courseNoList, CourseNoExtendDto.class)); // 评论 List<Comment> commentList = commentService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString()); Collection userIds = Transform.getIds(commentList, Comment.class, "userId"); List<User> userList = usersService.select(userIds); commentService.replaceUser(commentList, userList); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List<Faq> faqList = faqService.list(1, 10, "course-"+course.getCourseModule(), course.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); // 优质问答 UserAskCourseStatRelation askCourseStatRelation = userAskCourseService.statCourse(courseId, 1); if (askCourseStatRelation != null){ dto.setAskSpecialNumber(askCourseStatRelation.getNumber()); } if(user != null){ // 已购买 UserCourse userCourse = userCourseService.getCourse(user.getId(), courseId); // 购物车 UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE, courseId); dto.setHave(userCourse != null); dto.setAdd(userOrderCheckout != null); if (userCourse != null){ // 进度信息 Collection<UserCourseProgress> progressList = userCourseProgressService.getByRecordId(userCourse.getRecordId()); dto.setCurrentNo(courseExtendService.computeCourseNoCurrent(courseNoList, progressList)); dto.setProgress(Transform.convert(progressList, UserCourseProgressExtendDto.class)); // 获取每个科目的所有作业 Collection<UserPreviewPaperRelation> previewList = previewService.getByRecordId(user.getId(), userCourse.getRecordId(), 1000); dto.setPapers(Transform.convert(previewList, BasePaperExtendDto.class)); int finish = 0; for(UserPreviewPaperRelation relation : previewList){ if (relation.getPaper() == null) continue; UserPaper paper = relation.getPaper(); if (paper.getTimes() > 0){ finish += 1; } } dto.setPreviewProgress(previewList.size()> 0 ? finish * 100 / previewList.size(): 0); // 提问数、笔记数 Collection<UserAskCourse> askList = userAskCourseService.getByRecordId(userCourse.getRecordId()); Collection<UserNoteCourse> noteList = userNoteCourseService.getByCourse(user.getId(), courseId); Map<Object, List<UserAskCourse>> askListMap = Transform.getMapList(askList, UserAskCourse.class, "courseNoId"); Map notes = Transform.getMap(noteList, UserNoteCourse.class, "courseNoId"); Collection<CourseNoExtendDto> courseNos = dto.getCourseNos(); int noteNumber = 0; int askNumber = askList == null ? 0: askList.size(); int answerNumber = askList == null ? 0 : (int)askList.stream().filter(r->r.getAnswerStatus()== AnswerStatus.ANSWER.index).count(); for(CourseNoExtendDto courseNo : courseNos){ if (notes.get(courseNo.getId()) != null){ courseNo.setNote(true); noteNumber += 1; } List<UserAskCourse> askListNo = askListMap.get(courseNo.getId()); if (askListNo != null){ courseNo.setAskNumber(askListNo.size()); courseNo.setAnswerNumber((int)askListNo.stream().filter(r->r.getAnswerStatus()== AnswerStatus.ANSWER.index).count()); } } dto.setNoteNumber(noteNumber); dto.setAskNumber(askNumber); dto.setAnswerNumber(answerNumber); } } return ResponseHelp.success(dto); } @RequestMapping(value = "/simple", method = RequestMethod.GET) @ApiOperation(value = "课程基本信息", httpMethod = "GET") public Response<CourseDetailDto> simple( @RequestParam(required = true) Integer courseId ) { User user = (User) shiroHelp.getLoginUser(); Course course = courseService.get(courseId); CourseDetailDto dto = Transform.convert(course, CourseDetailDto.class); // 课时 List<CourseNo> courseNoList = courseNoService.allCourse(course.getId()); courseExtendService.refreshNoResource(user, course.getId(), courseNoList); dto.setCourseNos(Transform.convert(courseNoList, CourseNoExtendDto.class)); return ResponseHelp.success(dto); } @RequestMapping(value = "/ask/list", method = RequestMethod.GET) @ApiOperation(value = "精选问答", httpMethod = "GET") public Response<PageMessage<UserAskCourse>> listAsk( @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "100") int size, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer courseId, @RequestParam(required = false) Integer courseNoId, @RequestParam(required = false) Integer position, @RequestParam(required = false) String order, // create_time, answer_time @RequestParam(required = false, defaultValue = "desc") String direction ) { User user = (User) shiroHelp.getLoginUser(); Page<UserAskCourse> pr = userAskCourseService.listByCourse(page, size, keyword, courseId, courseNoId, position, true, order, DirectionStatus.ValueOf(direction)); return ResponseHelp.success(pr, page, size, pr.getTotal()); } @RequestMapping(value = "/ask/view", method = RequestMethod.POST) @ApiOperation(value = "精选问答查看", httpMethod = "POST") public Response<Boolean> viewAsk(@RequestBody @Validated AskCourseViewDto dto, HttpSession session) { userAskCourseService.accumulation(dto.getId(), 1); return ResponseHelp.success(true); } @RequestMapping(value = "/no/progress", method = RequestMethod.PUT) @ApiOperation(value = "更新课时进度", httpMethod = "PUT") public Response<Boolean> noProgress(@RequestBody @Validated UserCourseNoProgressDto dto) { User user = (User) shiroHelp.getLoginUser(); if (user == null) throw new AuthException("需要登录"); UserCourse userCourse = userCourseService.getCourse(user.getId(), dto.getCourseId()); if (userCourse == null) throw new AuthException("无访问权限"); // 添加课时访问记录 if (dto.getCurrentCourseNoId() != null && dto.getTime() != null && dto.getTime() > 0){ userCourseRecordService.add(UserCourseRecord.builder() .userId(user.getId()) .courseId(dto.getCourseId()) .courseNoId(dto.getCurrentCourseNoId()) .recordId(userCourse.getRecordId()) .userTime(dto.getTime()) .build()); } // 更新课程进度 userCourseProgressService.updateProgress(user.getId(), dto.getCourseId(), dto.getCourseNoId(), dto.getProgress(), userCourse.getRecordId()); return ResponseHelp.success(true); } @RequestMapping(value = "/trail/view", method = RequestMethod.POST) @ApiOperation(value = "课程试用", httpMethod = "POST") public Response<Boolean> 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<PageMessage<CoursePackageListDto>> 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) { User user = (User) shiroHelp.getLoginUser(); Page<CoursePackage> p = coursePackageService.list(page, size, structId, isSpecial, order, DirectionStatus.ValueOf(direction)); List<CoursePackageListDto> pr = Transform.convert(p, CoursePackageListDto.class); Collection ids = Transform.getIds(pr, CoursePackageListDto.class, "id"); Map<Integer, Integer[]> 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<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course-package", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); if(user != null){ // 添加购物车 List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.COURSE_PACKAGE, ids); Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId"); for(CoursePackageListDto dto : pr){ dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId())); } } return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/package/detail", method = RequestMethod.GET) @ApiOperation(value = "套餐详情", httpMethod = "GET") public Response<CoursePackageDetailDto> detailPackage( @RequestParam(required = true) Integer packageId ) { User user = (User) shiroHelp.getLoginUser(); CoursePackage coursePackage = coursePackageService.get(packageId); CoursePackageDetailDto dto = Transform.convert(coursePackage, CoursePackageDetailDto.class); List<Course> courseList = courseService.select(coursePackage.getCourseIds()); dto.setCourses(Transform.convert(courseList, CourseExtendDto.class)); // 评论 List<Comment> commentList = commentService.list(1, 10, "course-package", coursePackage.getId().toString()); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List<Faq> faqList = faqService.list(1, 10, "course-package", coursePackage.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); if(user != null){ // 购物车 UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE_PACKAGE, packageId); dto.setAdd(userOrderCheckout != null); } return ResponseHelp.success(dto); } @RequestMapping(value = "/data/list", method = RequestMethod.GET) @ApiOperation(value = "资料列表", httpMethod = "GET") public Response<PageMessage<CourseDataListDto>> 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) { User user = (User) shiroHelp.getLoginUser(); Page<CourseData> p = courseDataService.list(page, size, structId, DataType.ValueOf(dataType), isNovice, isOriginal, order, DirectionStatus.ValueOf(direction)); courseExtendService.refreshDataResource(user, p); List<CourseDataListDto> pr = Transform.convert(p, CourseDataListDto.class); Collection ids = Transform.getIds(pr, CourseDataListDto.class, "id"); // 评论 Map<Object, Collection<Comment>> commentMap = commentService.groupByPosition("course_data", ids, 1); Transform.combine(pr, commentMap, CourseListDto.class, "id", "comments", CommentExtendDto.class); // 订阅 if (user != null){ List<UserCourseDataSubscribe> subscribeList = userCourseDataSubscribeService.listWithData(user.getId(), ids); Map subscribeMap = Transform.getMap(subscribeList, UserCourseDataSubscribe.class, "dataId"); for(CourseDataListDto dto : pr){ dto.setSubscribe(subscribeMap.containsKey(dto.getId())); } } if(user != null){ // 已购买: 查看当前服务 List<UserOrderRecord> userOrderRecordList = userOrderRecordService.listWithUserData(user.getId(), ids); Map userOrderRecordMap = Transform.getMap(userOrderRecordList, UserOrderRecord.class, "productId"); // 添加购物车 List<UserOrderCheckout> userOrderCheckoutList = userOrderCheckoutService.listWithProduct(user.getId(), ProductType.DATA, ids); Map userOrderCheckoutMap = Transform.getMap(userOrderCheckoutList, UserOrderCheckout.class, "productId"); for(CourseDataListDto dto : pr){ dto.setHave(userOrderRecordMap.containsKey(dto.getId())); dto.setAdd(userOrderCheckoutMap.containsKey(dto.getId())); } } return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/data/detail", method = RequestMethod.GET) @ApiOperation(value = "资料详情", httpMethod = "GET") public Response<CourseDataDetailDto> detailData( @RequestParam(required = true) Integer dataId ) { User user = (User) shiroHelp.getLoginUser(); CourseData courseData = courseDataService.get(dataId); courseExtendService.refreshDataResource(user, courseData); CourseDataDetailDto dto = Transform.convert(courseData, CourseDataDetailDto.class); // 评论 List<Comment> commentList = commentService.list(1, 10, "course_data", courseData.getId().toString()); Collection userIds = Transform.getIds(commentList, Comment.class, "userId"); List<User> userList = usersService.select(userIds); commentService.replaceUser(commentList, userList); dto.setComments(Transform.convert(commentList, CommentExtendDto.class)); // faq List<Faq> faqList = faqService.list(1, 10, "course_data", courseData.getId().toString()); dto.setFaqs(Transform.convert(faqList, FaqExtendDto.class)); // 订阅 if (user != null){ UserCourseDataSubscribe subscribe = userCourseDataSubscribeService.getByData(user.getId(), dataId); dto.setSubscribe(subscribe != null); } if(user != null){ // 已购买: 查看当前服务 UserOrderRecord userOrderRecord = userOrderRecordService.getWithUserData(user.getId(), dataId); // 添加购物车 UserOrderCheckout userOrderCheckout = userOrderCheckoutService.getWithProduct(user.getId(), ProductType.COURSE_PACKAGE, dataId); dto.setHave(userOrderRecord != null); dto.setAdd(userOrderCheckout != null); } return ResponseHelp.success(dto); } @RequestMapping(value = "/data/view", method = RequestMethod.POST) @ApiOperation(value = "资料查看", httpMethod = "POST") public Response<Boolean> viewData(@RequestBody @Validated CourseDataViewDto dto, HttpSession session) { courseDataService.accumulation(dto.getId(), 0, 1); return ResponseHelp.success(true); } @RequestMapping(value = "/data/history", method = RequestMethod.GET) @ApiOperation(value = "资料详情", httpMethod = "GET") public Response<PageMessage<CourseDataHistory>> 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<CourseDataHistory> p = courseDataHistoryService.listByData(page, size, dataId); return ResponseHelp.success(p, page, size, p.getTotal()); } @RequestMapping(value = "/teacher/all", method = RequestMethod.GET) @ApiOperation(value = "资料列表", httpMethod = "GET") public Response<List<CourseTeacher>> allTeacher( @RequestParam(required = false) Integer courseId, HttpSession session) { List<CourseTeacher> p = courseTeacherService.allByCourse(courseId); return ResponseHelp.success(p); } @RequestMapping(value = "/experience/list", method = RequestMethod.GET) @ApiOperation(value = "心经列表", httpMethod = "GET") public Response<PageMessage<CourseExperienceListDto>> 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) { User user = (User) shiroHelp.getLoginUser(); Page<CourseExperience> p = courseExperienceService.list(page, size, prepareStatus, ExperienceScoreRange.ValueOf(experienceScore), ExperienceDayRange.ValueOf(experienceDay), experiencePercent, order, DirectionStatus.ValueOf(direction)); Collection ids = Transform.getIds(p, CourseExperience.class, "id"); // 绑定用户 Collection userIds = Transform.getIds(p, CourseExperience.class, "userId"); List<User> userList = usersService.select(userIds); courseExperienceService.replaceUser(p, userList); List<CourseExperienceListDto> pr = Transform.convert(p, CourseExperienceListDto.class); if(user != null){ List<UserCollectExperience> userCollectExperienceList = userCollectExperienceService.listByUserAndExperiences(user.getId(), ids); Map userCollectExperienceMap = Transform.getMap(userCollectExperienceList, UserCollectExperience.class, "experienceId"); for(CourseExperienceListDto dto : pr){ dto.setCollect(userCollectExperienceMap.containsKey(dto.getId())); } } return ResponseHelp.success(pr, page, size, p.getTotal()); } @RequestMapping(value = "/experience/detail", method = RequestMethod.GET) @ApiOperation(value = "心经查看", httpMethod = "GET") public Response<CourseExperienceDetailDto> detailExperience(int experienceId, HttpSession session) { User user = (User) shiroHelp.getLoginUser(); CourseExperience entity = courseExperienceService.get(experienceId); if(entity.getUserId() > 0){ User target = usersService.get(entity.getUserId()); entity.setNickname(target.getNickname()); } CourseExperienceDetailDto dto = Transform.convert(entity, CourseExperienceDetailDto.class); if (user != null){ UserCollectExperience userCollectExperience = userCollectExperienceService.getByUserAndExperience(user.getId(), experienceId); dto.setCollect(userCollectExperience != null); } return ResponseHelp.success(dto); } @RequestMapping(value = "/experience/view", method = RequestMethod.POST) @ApiOperation(value = "心经阅读", httpMethod = "POST") public Response<Boolean> 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<UserCourseDetailDto> 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<List<UserCourseProgressDto>> 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<UserOrderRecord> 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.SYSTEM, courseId, user.getId(), null, null); }else{ throw new ParameterException("课程类型错误"); } List<UserCourseProgressDto> dtos = Transform.convert(userOrderRecordList, UserCourseProgressDto.class); // 绑定课程 Collection courseIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "productId"); List<Course> courseList = courseService.select(courseIds); Transform.combine(dtos, courseList, UserCourseProgressDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class); // 获取每个科目的最后2次作业: 正在进行中的 Date now = new Date(); List<UserOrderRecord> processList = userOrderRecordList.stream().filter(row-> row.getIsUsed() > 0 && row.getUseEndTime().after(now)).collect(Collectors.toList()); Collection processIds = Transform.getIds(processList, UserOrderRecord.class, "id"); Map<Object, Collection<UserPreviewPaperRelation>> previewMap = previewService.groupByRecordId(user.getId(), processIds, 2); Transform.combine(dtos, previewMap, UserCourseProgressDto.class, "productId", "papers", UserPaperBaseExtendDto.class); // 绑定老师 Collection teacherIds = Transform.getIds(userOrderRecordList, UserOrderRecord.class, "teacherId"); List<CourseTeacher> 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<List<UserExercisePaperDto>> 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<UserPreviewPaperRelation> p = previewService.list(page, size, recordId, user.getId(), endTime, times); List<UserExercisePaperDto> pr = Transform.convert(p, UserExercisePaperDto.class); // 获取试卷统计信息 Map map = Transform.getMap(p, UserPreviewPaperRelation.class, "id", "paper"); Map<Integer, Integer[]> 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); } }