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.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);
|
}
|
|
/**
|
* 获取课程管理列表(分页)
|
*/
|
@ApiOperation("获取课程管理列表(分页)")
|
@GetResource(name = "获取课程管理列表(分页)", path = "/page", requiredPermission = false)
|
public ResponseData<PageResult<CourseResponseDTO>> page(CourseRequest courseRequest) {
|
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 -> {
|
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);
|
}
|
});
|
}
|
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<>();
|
}
|
|
}
|