| 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<Course> detail(@PathVariable("id") Long id) { | 
|         Course course = this.courseService.getById(id); | 
|         //查询课程章节信息 | 
|         course.setCourseChapterList(this.courseChapterService.getAllByCourseId(course.getId())); | 
|         //获取课程标签名称 | 
|         LambdaQueryWrapper<CourseTag> courseTagLambdaQueryWrapper = new QueryWrapper<CourseTag>().select(" GROUP_CONCAT(tag_name)  tagName ").lambda(); | 
|         Map<String,Object> 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<CourseChapter>().eq(CourseChapter::getCourseId,course.getId()).eq(CourseChapter::getIsDelete,false) | 
|                 .eq(CourseChapter::getParentId,0L)); | 
|         if (chapterNum > 0){ | 
|             long chapterCourseNum = this.courseChapterService.count(new LambdaQueryWrapper<CourseChapter>().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<CourseOrder>().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<List<CourseResponseDTO>> roleInfoCacheApi; | 
|     /** | 
|      * 获取课程管理列表(分页) | 
|      */ | 
|     @ApiOperation("获取课程管理列表(分页)") | 
|     @GetResource(name = "获取课程管理列表(分页)", path = "/page", requiredPermission = false) | 
|     public ResponseData<PageResult<CourseResponseDTO>> page(CourseRequest courseRequest) { | 
|   | 
| //        if (roleInfoCacheApi.get("course:"+LoginContext.me().getLoginUser().getUserId())!=null){ | 
| //                return  new SuccessResponseData<>(roleInfoCacheApi.get("course:"+LoginContext.me().getLoginUser().getUserId())); | 
| //        }else { | 
| //            LambdaQueryWrapper<Course> lambdaQueryWrapper = new LambdaQueryWrapper<Course>().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<Course> page = this.courseService.list( lambdaQueryWrapper); | 
| // | 
| //            if (CollectionUtil.isNotEmpty(page)) { | 
| //                List<CourseResponseDTO> courseResponseDTOList = BeanUtil.copyToList(page, CourseResponseDTO.class, CopyOptions.create()); | 
| //                //查询当前人是否购买过课程 | 
| //                List<CourseOrder> courseOrderList = this.courseOrderService.list(new LambdaQueryWrapper<CourseOrder>().select(CourseOrder::getCourseId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag, 1)); | 
| //                if (CollectionUtil.isNotEmpty(courseOrderList)) { | 
| //                    List<Long> 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<CourseOrder>().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<Object> course = roleInfoCacheApi.get("course"); | 
| //        return new SuccessResponseData<>(course); | 
|   | 
|         LambdaQueryWrapper<Course> lambdaQueryWrapper = new LambdaQueryWrapper<Course>().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<Course> page = this.courseService.page(PageFactory.defaultPage(), lambdaQueryWrapper); | 
|   | 
|         if (CollectionUtil.isNotEmpty(page.getRecords())){ | 
|             List<CourseResponseDTO> courseResponseDTOList = BeanUtil.copyToList(page.getRecords(),CourseResponseDTO.class, CopyOptions.create()); | 
|             //查询当前人是否购买过课程 | 
|             List<CourseOrder> courseOrderList = this.courseOrderService.list(new LambdaQueryWrapper<CourseOrder>().select(CourseOrder::getCourseId).eq(CourseOrder::getUserId, LoginContext.me().getLoginUser().getUserId()).eq(CourseOrder::getStatusFlag,1)); | 
|             if (CollectionUtil.isNotEmpty(courseOrderList)){ | 
|                 List<Long> 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<CourseOrder>().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<CourseResponseDTO>(),page.getTotal(), Convert.toInt(page.getSize()),Convert.toInt(page.getCurrent()))); | 
|     } | 
|   | 
|   | 
|     @ApiOperation("创建课程订单信息") | 
|     @PostResource(name = "创建课程订单信息", path = "/createCourseOrder") | 
|     @BusinessLog | 
|     public ResponseData<CourseOrder> 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<CourseOrderResponseDTO> detailOrder(@PathVariable("id") Long id) { | 
|         CourseOrderResponseDTO courseOrderResponseDTO = this.courseOrderService.getCourseChapterInfoByOrderId(id); | 
|         //获取课程节数 | 
|         long chapterNum = this.courseChapterService.count(new LambdaQueryWrapper<CourseChapter>().eq(CourseChapter::getCourseId,courseOrderResponseDTO.getCourseId()).eq(CourseChapter::getIsDelete,false) | 
|                 .eq(CourseChapter::getParentId,0L)); | 
|         if (chapterNum > 0){ | 
|             long chapterCourseNum = this.courseChapterService.count(new LambdaQueryWrapper<CourseChapter>().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<CourseUserLearned>().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<List<CourseStudyNote>> courseStudyNoteList(Long courseId,Long userId) { | 
|         LambdaQueryWrapper<CourseStudyNote> lambdaQueryWrapper = new LambdaQueryWrapper<CourseStudyNote>().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<CourseStudyNote> lambdaUpdateWrapper = new LambdaUpdateWrapper<CourseStudyNote>().set(CourseStudyNote::getIsDelete,true); | 
|         lambdaUpdateWrapper.eq(CourseStudyNote::getId, courseStduyNoteId); | 
|         this.courseStudyNoteService.update(lambdaUpdateWrapper); | 
|         return new SuccessResponseData<>(); | 
|     } | 
|   | 
|     @ApiOperation("添加课程学习笔记") | 
|     @PostResource(name = "添加课程学习笔记", path = "/saveOrUpdateCourseStudyNote") | 
|     public ResponseData<CourseStudyNote> saveOrUpdateCourseStudyNote(@RequestBody CourseStudyNote courseStudyNote) { | 
|         courseStudyNote.setUserId(LoginContext.me().getLoginUser().getUserId()); | 
|         this.courseStudyNoteService.saveOrUpdate(courseStudyNote); | 
|         return new SuccessResponseData<CourseStudyNote>(courseStudyNote); | 
|     } | 
|   | 
|   | 
|     @ApiOperation("添加或者更新课程学习记录(每次新进入课程学习需要创建新的课程学习记录)") | 
|     @PostResource(name = "添加课程学习记录", path = "/courseUserLearned/addOrUpdate") | 
|     public ResponseData<CourseUserLearned> 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<CouserChapterLearningRate>().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<String,Object> numMap =  this.couserChapterLearningRateService.getMap(new QueryWrapper<CouserChapterLearningRate>().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<CouserChapterLearningRate> getCouserChapterLearningRate(Long courseId,Long userId,Long courseChapterId,Long courseOrderId) { | 
|         if (userId == null){ | 
|             userId = LoginContext.me().getLoginUser().getUserId(); | 
|         } | 
|         CouserChapterLearningRate couserChapterLearningRate = this.couserChapterLearningRateService.getOne(new LambdaQueryWrapper<CouserChapterLearningRate>() | 
|                 .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<PageResult<CourseOrderResponseDTO>> courseOrderPage(CourseOrderRequest courseOrderRequest) { | 
|         courseOrderRequest.setUserId(LoginContext.me().getLoginUser().getUserId()); | 
|         Page<CourseOrderResponseDTO> 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<CouserChapterLearningRate> couserChapterLearningRates = this.couserChapterLearningRateService.list(new LambdaQueryWrapper<CouserChapterLearningRate>().eq(CouserChapterLearningRate::getCourseId,courseOrderResponseDTO.getCourseId()) | 
|                             .eq(CouserChapterLearningRate::getCourseOrderId,courseOrderResponseDTO.getId())); | 
|                     Map<Long,CouserChapterLearningRate> 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<CourseChapter>().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<CourseOrder> lambdaUpdateWrapper = new LambdaUpdateWrapper<CourseOrder>().set(CourseOrder::getIsDelete,true); | 
|         lambdaUpdateWrapper.eq(CourseOrder::getId, courseOrderId); | 
|         this.courseOrderService.update(lambdaUpdateWrapper); | 
|         return new SuccessResponseData<>(); | 
|     } | 
|   | 
| } |