package cn.stylefeng.rest.modular.user.controller; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.stylefeng.guns.modular.business.dto.CourseOrderResponseDTO; import cn.stylefeng.guns.modular.business.dto.CourseResponseDTO; import cn.stylefeng.guns.modular.business.dto.request.CourseOrderRequest; import cn.stylefeng.guns.modular.business.dto.request.CoursePlaceOrderRequest; import cn.stylefeng.guns.modular.business.dto.request.CourseRequest; import cn.stylefeng.guns.modular.business.entity.*; import cn.stylefeng.guns.modular.business.service.*; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.customer.modular.entity.Customer; import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService; import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.rule.annotation.BusinessLog; import cn.stylefeng.roses.kernel.rule.enums.ResBizTypeEnum; import cn.stylefeng.roses.kernel.rule.pojo.response.ErrorResponseData; import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData; import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData; import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource; import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource; import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource; import com.alibaba.druid.sql.visitor.functions.If; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.catalina.security.SecurityUtil; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 课程管理管理类 * @author guo */ @RestController @Api(tags = "课程管理管理类") @ApiResource(name = "课程管理管理类", resBizType = ResBizTypeEnum.BUSINESS) @RequestMapping("/course") public class CourseController { @Resource private ICourseService courseService; @Resource private ICourseChapterService courseChapterService; @Resource private ICourseTagService courseTagService; @Resource private ICourseOrderService courseOrderService; @Resource private ICourseStudyNoteService courseStudyNoteService; @Resource private ICouserChapterLearningRateService couserChapterLearningRateService; @Resource private ICourseUserLearnedService courseUserLearnedService; @Resource private CustomerService customerService; /** * 获取课程管理详情 */ @ApiOperation("获取课程管理详情") @GetResource(name = "获取课程管理详情", path = "/detail/{id}", requiredPermission = false) public ResponseData detail(@PathVariable("id") Long id) { Course course = this.courseService.getById(id); //查询课程章节信息 course.setCourseChapterList(this.courseChapterService.getAllByCourseId(course.getId())); //获取课程标签名称 LambdaQueryWrapper courseTagLambdaQueryWrapper = new QueryWrapper().select(" GROUP_CONCAT(tag_name) tagName ").lambda(); Map map = courseTagService.getMap(courseTagLambdaQueryWrapper.in(CourseTag::getId,course.getCourseTagIds().split(","))); if (ObjectUtil.isNotEmpty(map)){ course.setCourseTagNames(map.get("tagName").toString()); } //获取课程节数 long chapterNum = this.courseChapterService.count(new LambdaQueryWrapper().eq(CourseChapter::getCourseId,course.getId()).eq(CourseChapter::getIsDelete,false) .eq(CourseChapter::getParentId,0L)); if (chapterNum > 0){ long chapterCourseNum = this.courseChapterService.count(new LambdaQueryWrapper().eq(CourseChapter::getCourseId,course.getId()).eq(CourseChapter::getIsDelete,false) .ne(CourseChapter::getParentId,0L)); course.setCourseContentInfos("共"+chapterNum+"章"+chapterCourseNum+"节课"); }else{ course.setCourseContentInfos("无"); } CourseOrder courseOrder = this.courseOrderService.getOne(new LambdaQueryWrapper().select(CourseOrder::getId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag,1) .eq(CourseOrder::getCourseId,id).orderByAsc(CourseOrder::getPayTime) .last(" limit 1 ")); if(courseOrder != null){ course.setCourseOrderId(courseOrder.getId()); } return new SuccessResponseData<>(course); } @Resource private CacheOperatorApi> roleInfoCacheApi; /** * 获取课程管理列表(分页) */ @ApiOperation("获取课程管理列表(分页)") @GetResource(name = "获取课程管理列表(分页)", path = "/page", requiredPermission = false) public ResponseData> page(CourseRequest courseRequest) { // if (roleInfoCacheApi.get("course:"+LoginContext.me().getLoginUser().getUserId())!=null){ // return new SuccessResponseData<>(roleInfoCacheApi.get("course:"+LoginContext.me().getLoginUser().getUserId())); // }else { // LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper().eq(Course::getIsDelete, false) // .orderByDesc(Course::getSort, Course::getCreateTime); // if (courseRequest.getListingStatus() != null) { // lambdaQueryWrapper.eq(Course::getListingStatus, courseRequest.getListingStatus()); // } else { // lambdaQueryWrapper.eq(Course::getListingStatus, 1); // } // lambdaQueryWrapper.like(StrUtil.isNotBlank(courseRequest.getCourseName()), Course::getCourseName, courseRequest.getCourseName()); // List page = this.courseService.list( lambdaQueryWrapper); // // if (CollectionUtil.isNotEmpty(page)) { // List courseResponseDTOList = BeanUtil.copyToList(page, CourseResponseDTO.class, CopyOptions.create()); // //查询当前人是否购买过课程 // List courseOrderList = this.courseOrderService.list(new LambdaQueryWrapper().select(CourseOrder::getCourseId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag, 1)); // if (CollectionUtil.isNotEmpty(courseOrderList)) { // List courseIds = courseOrderList.stream().map(CourseOrder::getCourseId).collect(Collectors.toList()); // courseResponseDTOList.forEach(course1 -> { // if (courseIds.contains(course1.getId())) { // course1.setIsBuy(true); // CourseOrder courseOrder = this.courseOrderService.getOne(new LambdaQueryWrapper().select(CourseOrder::getId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag, 1) // .eq(CourseOrder::getCourseId, course1.getId()).orderByAsc(CourseOrder::getPayTime) // .last(" limit 1 ")); // if (courseOrder != null) { // course1.setCourseOrderId(courseOrder.getId()); // } // } else { // course1.setIsBuy(false); // } // }); // } // roleInfoCacheApi.put("course:"+LoginContext.me().getLoginUser().getUserId(),courseResponseDTOList,600L); // return new SuccessResponseData<>(courseResponseDTOList); // } // // } // return new SuccessResponseData<>(); //缓存 // // List course = roleInfoCacheApi.get("course"); // return new SuccessResponseData<>(course); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper().eq(Course::getIsDelete,false) .orderByDesc(Course::getSort,Course::getCreateTime); if (courseRequest.getListingStatus() != null){ lambdaQueryWrapper.eq(Course::getListingStatus,courseRequest.getListingStatus()); }else { lambdaQueryWrapper.eq(Course::getListingStatus,1); } lambdaQueryWrapper.like(StrUtil.isNotBlank(courseRequest.getCourseName()),Course::getCourseName,courseRequest.getCourseName()); Page page = this.courseService.page(PageFactory.defaultPage(), lambdaQueryWrapper); if (CollectionUtil.isNotEmpty(page.getRecords())){ List courseResponseDTOList = BeanUtil.copyToList(page.getRecords(),CourseResponseDTO.class, CopyOptions.create()); //查询当前人是否购买过课程 List courseOrderList = this.courseOrderService.list(new LambdaQueryWrapper().select(CourseOrder::getCourseId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag,1)); if (CollectionUtil.isNotEmpty(courseOrderList)){ List courseIds = courseOrderList.stream().map(CourseOrder::getCourseId).collect(Collectors.toList()); courseResponseDTOList.forEach(course1 -> { //不返回内容 内容文件太大 course1.setCourseContent(null); if (courseIds.contains(course1.getId())){ course1.setIsBuy(true); CourseOrder courseOrder = this.courseOrderService.getOne(new LambdaQueryWrapper().select(CourseOrder::getId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag,1) .eq(CourseOrder::getCourseId,course1.getId()).orderByAsc(CourseOrder::getPayTime) .last(" limit 1 ")); if(courseOrder != null){ course1.setCourseOrderId(courseOrder.getId()); } }else{ course1.setIsBuy(false); } }); }else{ courseResponseDTOList.forEach(course1 -> { //不返回内容 内容文件太大 course1.setCourseContent(null); course1.setIsBuy(false); }); } return new SuccessResponseData<>(PageResultFactory.createPageResult(courseResponseDTOList,page.getTotal(), Convert.toInt(page.getSize()),Convert.toInt(page.getCurrent()))); } return new SuccessResponseData<>(PageResultFactory.createPageResult(new ArrayList(),page.getTotal(), Convert.toInt(page.getSize()),Convert.toInt(page.getCurrent()))); } @ApiOperation("创建课程订单信息") @PostResource(name = "创建课程订单信息", path = "/createCourseOrder") @BusinessLog public ResponseData createCourseOrder(@RequestBody CoursePlaceOrderRequest coursePlaceOrderRequest) { coursePlaceOrderRequest.setUserId(LoginContext.me().getLoginUser().getUserId()); coursePlaceOrderRequest.setIsBack(false); Customer customer = this.customerService.getById(LoginContext.me().getLoginUser().getUserId()); if (customer.getStatusFlag() != null &&customer.getStatusFlag() !=1){ return new ErrorResponseData<>("账号已被冻结或者被注销,无法进行下单"); } CourseOrder courseOrder = this.courseOrderService.createCourseOrder(coursePlaceOrderRequest); return new SuccessResponseData<>(courseOrder); } @ApiOperation("获取我的课程信息详情") @GetResource(name = "获取我的课程信息详情", path = "/detailOrder/{id}", requiredPermission = false) public ResponseData detailOrder(@PathVariable("id") Long id) { CourseOrderResponseDTO courseOrderResponseDTO = this.courseOrderService.getCourseChapterInfoByOrderId(id); //获取课程节数 long chapterNum = this.courseChapterService.count(new LambdaQueryWrapper().eq(CourseChapter::getCourseId,courseOrderResponseDTO.getCourseId()).eq(CourseChapter::getIsDelete,false) .eq(CourseChapter::getParentId,0L)); if (chapterNum > 0){ long chapterCourseNum = this.courseChapterService.count(new LambdaQueryWrapper().eq(CourseChapter::getCourseId,courseOrderResponseDTO.getCourseId()).eq(CourseChapter::getIsDelete,false) .ne(CourseChapter::getParentId,0L)); courseOrderResponseDTO.setCourseContent("共"+chapterNum+"章"+chapterCourseNum+"节课"); }else{ courseOrderResponseDTO.setCourseContent("无"); } courseOrderResponseDTO.setUserName(this.customerService.getById(courseOrderResponseDTO.getUserId()).getNickName()); //最近一次课程章节id CourseUserLearned courseUserLearned = this.courseUserLearnedService.getOne(new LambdaQueryWrapper().eq(CourseUserLearned::getCourseId,courseOrderResponseDTO.getCourseId()) .eq(CourseUserLearned::getCourseOrderId,id).orderByDesc(CourseUserLearned::getUpdateTime).last(" limit 1")); if (courseUserLearned != null){ courseOrderResponseDTO.setLastLookCourseChapterId(courseUserLearned.getCourseChapterId()); } return new SuccessResponseData<>(courseOrderResponseDTO); } @ApiOperation("获取课程学习笔记列表") @GetResource(name = "获取课程学习笔记列表", path = "/courseStudyNoteList", requiredPermission = false) @ApiImplicitParams({ @ApiImplicitParam(name = "courseId", value = "课程id", dataTypeClass = Long.class, paramType = "query",required = true), @ApiImplicitParam(name = "userId", value = "用户id 不传默认当前用户id", dataTypeClass = Long.class, paramType = "query") } ) public ResponseData> courseStudyNoteList(Long courseId,Long userId) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper().eq(CourseStudyNote::getIsDelete,false) .orderByDesc(CourseStudyNote::getId); if (userId == null){ userId = LoginContext.me().getLoginUser().getUserId(); } lambdaQueryWrapper.eq(CourseStudyNote::getUserId,userId); lambdaQueryWrapper.eq(CourseStudyNote::getCourseId,courseId); return new SuccessResponseData<>(courseStudyNoteService.list(lambdaQueryWrapper)); } @ApiOperation("删除课程学习笔记") @PostResource(name = "删除课程学习笔记", path = "/courseStudyNote/delete", requiredPermission = false) public ResponseData delete(Long courseStduyNoteId) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper().set(CourseStudyNote::getIsDelete,true); lambdaUpdateWrapper.eq(CourseStudyNote::getId, courseStduyNoteId); this.courseStudyNoteService.update(lambdaUpdateWrapper); return new SuccessResponseData<>(); } @ApiOperation("添加课程学习笔记") @PostResource(name = "添加课程学习笔记", path = "/saveOrUpdateCourseStudyNote") public ResponseData saveOrUpdateCourseStudyNote(@RequestBody CourseStudyNote courseStudyNote) { courseStudyNote.setUserId(LoginContext.me().getLoginUser().getUserId()); this.courseStudyNoteService.saveOrUpdate(courseStudyNote); return new SuccessResponseData(courseStudyNote); } @ApiOperation("添加或者更新课程学习记录(每次新进入课程学习需要创建新的课程学习记录)") @PostResource(name = "添加课程学习记录", path = "/courseUserLearned/addOrUpdate") public ResponseData addOrUpdate(@RequestBody CourseUserLearned courseUserLearned) { courseUserLearned.setUserId(LoginContext.me().getLoginUser().getUserId()); //本次学习时长 long studyTime = 0l; if (courseUserLearned.getId() != null){ CourseUserLearned courseUserLearnedOld = this.courseUserLearnedService.getById(courseUserLearned.getId()); studyTime = DateUtil.between(courseUserLearnedOld.getEndTime(),new Date(),DateUnit.SECOND); courseUserLearnedOld.setCourseStudyTime(courseUserLearned.getCourseStudyTime()); courseUserLearnedOld.setEndTime(new Date()); courseUserLearnedOld.setStudyTime(DateUtil.between(courseUserLearnedOld.getBeginTime(),courseUserLearnedOld.getEndTime(), DateUnit.SECOND)); this.courseUserLearnedService.updateById(courseUserLearnedOld); courseUserLearned = courseUserLearnedOld; }else{ courseUserLearned.setCourseStudyTime(courseUserLearned.getCourseStudyTime()); courseUserLearned.setBeginTime(new Date()); courseUserLearned.setEndTime(new Date()); courseUserLearned.setStudyTime(DateUtil.between(courseUserLearned.getBeginTime(),courseUserLearned.getEndTime(), DateUnit.SECOND)); this.courseUserLearnedService.save(courseUserLearned); } boolean changeState = false; //判断是否第一次学习,生成课程学习进度 CouserChapterLearningRate couserChapterLearningRate = this.couserChapterLearningRateService.getOne(new LambdaQueryWrapper().eq(CouserChapterLearningRate::getCourseChapterId,courseUserLearned.getCourseChapterId()).eq(CouserChapterLearningRate::getUserId,courseUserLearned.getUserId()) .eq(CouserChapterLearningRate::getCourseOrderId,courseUserLearned.getCourseOrderId())); if (couserChapterLearningRate == null ){ couserChapterLearningRate = new CouserChapterLearningRate(); couserChapterLearningRate.setCourseId(courseUserLearned.getCourseId()); couserChapterLearningRate.setUserId(courseUserLearned.getUserId()); couserChapterLearningRate.setCourseChapterId(courseUserLearned.getCourseChapterId()); couserChapterLearningRate.setCourseOrderId(courseUserLearned.getCourseOrderId()); couserChapterLearningRate.setStudyStatus(1); couserChapterLearningRate.setLearnedTime(0l); couserChapterLearningRate.setCourseStudyTime(0l); couserChapterLearningRate.setLastStudyTime(0l); CourseChapter courseChapter = this.courseChapterService.getById(courseUserLearned.getCourseChapterId()); couserChapterLearningRate.setTotalTime(courseChapter.getTotalSecondNum().longValue()); changeState = true; }else{ //如果学习进度大于当前进度就更新章节整个进度 if (couserChapterLearningRate.getLearnedTime().longValue() <= courseUserLearned.getCourseStudyTime().longValue()){ couserChapterLearningRate.setLearnedTime(courseUserLearned.getCourseStudyTime()); changeState = true; } couserChapterLearningRate.setCourseStudyTime(couserChapterLearningRate.getCourseStudyTime().longValue()+ studyTime); couserChapterLearningRate.setLastStudyTime(courseUserLearned.getCourseStudyTime());; } this.couserChapterLearningRateService.saveOrUpdate(couserChapterLearningRate); if (changeState){ //更新课程订单学习时长 Map numMap = this.couserChapterLearningRateService.getMap(new QueryWrapper().select(" IFNULL(SUM(learned_time),0) num ").lambda() .eq(CouserChapterLearningRate::getCourseChapterId,courseUserLearned.getCourseChapterId()).eq(CouserChapterLearningRate::getUserId,courseUserLearned.getUserId()) .eq(CouserChapterLearningRate::getCourseOrderId,courseUserLearned.getCourseOrderId())); //学习进度更新 if (numMap.get("num") != null){ CourseOrder courseOrder = this.courseOrderService.getById(couserChapterLearningRate.getCourseOrderId()); courseOrder.setLearnedTime(Long.parseLong(numMap.get("num").toString())); this.courseOrderService.updateById(courseOrder); } } return new SuccessResponseData<>(courseUserLearned); } @ApiOperation("获取课程章节学习进度详情") @GetResource(name = "获取课程章节学习进度详情", path = "/getCouserChapterLearningRate", requiredPermission = false) @ApiImplicitParams({ @ApiImplicitParam(name = "courseId", value = "课程id", dataTypeClass = Long.class, paramType = "query",required = true), @ApiImplicitParam(name = "userId", value = "用户id 不传默认当前用户id", dataTypeClass = Long.class, paramType = "query"), @ApiImplicitParam(name = "courseChapterId", value = "课程章节id", dataTypeClass = Long.class, paramType = "query",required = true), @ApiImplicitParam(name = "courseOrderId", value = "课程订单id", dataTypeClass = Long.class, paramType = "query",required = true) } ) public ResponseData getCouserChapterLearningRate(Long courseId,Long userId,Long courseChapterId,Long courseOrderId) { if (userId == null){ userId = LoginContext.me().getLoginUser().getUserId(); } CouserChapterLearningRate couserChapterLearningRate = this.couserChapterLearningRateService.getOne(new LambdaQueryWrapper() .eq(CouserChapterLearningRate::getCourseChapterId,courseChapterId).eq(CouserChapterLearningRate::getUserId,userId) .eq(CouserChapterLearningRate::getCourseOrderId,courseOrderId).eq(CouserChapterLearningRate::getCourseId,courseId)); return new SuccessResponseData<>(couserChapterLearningRate); } @ApiOperation("获取课程订单信息列表(分页)") @GetResource(name = "获取课程订单信息列表(分页)", path = "/courseOrder/page", requiredPermission = false) public ResponseData> courseOrderPage(CourseOrderRequest courseOrderRequest) { courseOrderRequest.setUserId(LoginContext.me().getLoginUser().getUserId()); Page page = this.courseOrderService.findCounseOrderPage(PageFactory.defaultPage(), courseOrderRequest); if (CollectionUtil.isNotEmpty(page.getRecords())){ page.getRecords().forEach(courseOrderResponseDTO -> { if (courseOrderResponseDTO.getStatusFlag().intValue() ==1 || courseOrderResponseDTO.getStatusFlag().intValue() == 2){ //查询章节学习进度 List couserChapterLearningRates = this.couserChapterLearningRateService.list(new LambdaQueryWrapper().eq(CouserChapterLearningRate::getCourseId,courseOrderResponseDTO.getCourseId()) .eq(CouserChapterLearningRate::getCourseOrderId,courseOrderResponseDTO.getId())); Map learnMap = new HashMap<>(); if (CollectionUtil.isNotEmpty(couserChapterLearningRates)){ learnMap = couserChapterLearningRates.stream().collect(Collectors.toMap(CouserChapterLearningRate::getCourseChapterId, Function.identity())); courseOrderResponseDTO.setStudyCourseChapter(learnMap.size()); } //查询总课程章节 long totalChapter = this.courseChapterService.count(new LambdaQueryWrapper().eq(CourseChapter::getCourseId,courseOrderResponseDTO.getCourseId()) .eq(CourseChapter::getIsDelete,false).ne(CourseChapter::getParentId,0).isNotNull(CourseChapter::getMinuteNum)); courseOrderResponseDTO.setTotalCourseChapter(Integer.parseInt(totalChapter+"")); } }); } return new SuccessResponseData<>(PageResultFactory.createPageResult(page)); } @ApiOperation("删除课程订单信息") @PostResource(name = "删除课程订单信息", path = "/courseOrder/delete") public ResponseData courseOrderDelete(Long courseOrderId) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper().set(CourseOrder::getIsDelete,true); lambdaUpdateWrapper.eq(CourseOrder::getId, courseOrderId); this.courseOrderService.update(lambdaUpdateWrapper); return new SuccessResponseData<>(); } }