Browse Source

Merge remote-tracking branch 'origin/master'

weifanli 2 years ago
parent
commit
7019c9fb72
18 changed files with 357 additions and 109 deletions
  1. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java
  2. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java
  3. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java
  4. 0 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  5. 1 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java
  6. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CoursePlan.java
  7. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  8. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  9. 169 37
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  10. 7 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  11. 49 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherCourseGroupVo.java
  12. 6 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentDetailVo.java
  13. 46 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  14. 0 29
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  15. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  16. 34 4
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseGroupController.java
  17. 2 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java
  18. 2 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java

@@ -31,7 +31,7 @@ public class VideoLessonController extends BaseController {
     * @Date: 2022/4/2
     */
     @ApiOperation(value = "查询学员购买视频课")
-    @PostMapping(value = "/selectStudentPage")
+    @PostMapping(value = "/student/page")
     public HttpResponseResult<PageInfo<VideoLessonStudentDetailVo>> selectStudentPage(@RequestBody VideoLessonSearch query) {
         return succeed(PageUtil.pageInfo(lessonGroupService.selectStudentPage(PageUtil.getPage(query), query)));
     }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java

@@ -3,7 +3,8 @@ package com.yonge.cooleshow.biz.dal.constant;
 public interface CourseConstant {
     /**
      * 未正式写入数据库的排课时间临时数据
-     * <p>用途将未写入数据库的排课数据写入缓存,然后生成日历及陪练课买课时校验课时将缓存时间拿出来比对</p>
+     * <p>用途将未写入数据库的排课数据写入缓存,然后生成日历及陪练课买课时校验课时将缓存时间拿出来比对
+     * <p>返回结果 List<CourseTimeEntity>
      */
     String LOCK_COURSE_TIME_INFO = "LOCK_COURSE_TIME_INFO";
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程组表(CourseGroup)表数据库访问层
@@ -16,5 +19,10 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
 
     int insertBatch(@Param("entities") List<CourseGroup> entities);
 
+    /**
+     * 分页查询课程组信息
+     */
+    <T> IPage<T> queryTeacherCourseGroup(Page<T> page, @Param("param") Map<String, Object> param);
+
 }
 

+ 0 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -45,7 +45,5 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
      */
     List<CourseSchedule> queryStudentCourse(@Param("studentId") Long studentId, @Param("classDate") String classDate);
 
-    <T> IPage<T> queryTeacherCourse(Page<T> page, @Param("param") Map<String, Object> param);
-
 }
 

+ 1 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java

@@ -23,10 +23,6 @@ public class LiveCourseGroupDto implements Serializable {
     @ApiModelProperty(value = "主键")
     private Long id;
 
-    @NotBlank(message = "课程类型不能为空")
-    @ApiModelProperty(value = "类型 practice陪练课 live直播课")
-    private String type;
-
     @NotNull(message = "授课老师不能为空")
     @ApiModelProperty(value = "授课老师")
     private Long teacherId;
@@ -79,7 +75,7 @@ public class LiveCourseGroupDto implements Serializable {
     private List<CoursePlanDto> CoursePlanList;
 
     @ApiModel(value = "课程详情接收类")
-    static class CoursePlanDto extends CourseTimeEntity implements Serializable {
+    public static class CoursePlanDto extends CourseTimeEntity implements Serializable {
 
         @NotNull(message = "课堂编号不能为空")
         @ApiModelProperty(value = "课堂编号-第几堂课")
@@ -115,14 +111,6 @@ public class LiveCourseGroupDto implements Serializable {
         this.id = id;
     }
 
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
     public Long getTeacherId() {
         return teacherId;
     }

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CoursePlan.java

@@ -24,7 +24,7 @@ public class CoursePlan implements Serializable {
 
     @TableField("course_group_id_")
     @ApiModelProperty(value = "课程组id")
-    private Integer courseGroupId;
+    private Long courseGroupId;
 
     @TableField("class_num_")
     @ApiModelProperty(value = "课堂编号-第几堂课")
@@ -47,11 +47,11 @@ public class CoursePlan implements Serializable {
         this.id = id;
     }
 
-    public Integer getCourseGroupId() {
+    public Long getCourseGroupId() {
         return courseGroupId;
     }
 
-    public void setCourseGroupId(Integer courseGroupId) {
+    public void setCourseGroupId(Long courseGroupId) {
         this.courseGroupId = courseGroupId;
     }
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -3,10 +3,14 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
+import com.yonge.cooleshow.common.page.PageInfo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程组表(CourseGroup)表服务接口
@@ -19,9 +23,27 @@ public interface CourseGroupService extends IService<CourseGroup> {
     CourseGroupDao getDao();
 
     /**
+     * 分页查询课程组列表
+     *
+     * @param param 传入参数
+     *              <p> - teacherId    老师id
+     *              <p> - groupStatus  课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)
+     *              <p> - row 条数
+     *              <p> - page 页数
+     */
+    PageInfo<TeacherCourseGroupVo> queryPageLiveCourseGroup(Map<String, Object> param);
+
+    void addLiveCourse(LiveCourseGroupDto dto);
+
+    /**
      * 创建直播课程组时将课时写到缓存当作锁定的时间
      */
     List<CourseTimeEntity> lockCourseToCache(CheckLiveCourseTimeDto dto);
 
+    /**
+     * 创建直播课程组-解除锁定课程时间-删除写到缓存当作锁定的课时
+     */
+   void unlockCourseToCache(Long teacherId);
+
 }
 

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -3,7 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
-import com.yonge.cooleshow.biz.dal.vo.TeacherCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
 import com.yonge.cooleshow.common.page.PageInfo;
 
 import javax.validation.Valid;
@@ -32,7 +32,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      *              <p> - page 页数
      *              <p> - status 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成
      */
-    PageInfo<TeacherCourseVo> queryTeacherLiveCourse(Map<String, Object> param);
+    PageInfo<TeacherCourseGroupVo> queryTeacherLiveCourse(Map<String, Object> param);
 
     /**
      * 校验该学生大于当前时间并未开始的课程时间和传入时间段有没有交集
@@ -82,14 +82,14 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
                                 Date startTime, Date endTime);
 
     /**
-     * 锁定课时
+     * 修改-锁定课时
      *
      * @param id 课程id
      */
     void lockCourseTime(Long id);
 
     /**
-     * 解锁
+     * 修改-解锁课时
      *
      * @param id 课程id
      */

+ 169 - 37
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -9,12 +11,21 @@ import com.yonge.cooleshow.biz.dal.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
+import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.CoursePlan;
+import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CoursePlanService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
 import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RMap;
@@ -25,14 +36,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -53,6 +62,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     @Autowired
     private CourseScheduleService courseScheduleService;
     @Autowired
+    private CoursePlanService coursePlanService;
+    @Autowired
     private SysConfigService sysConfigService;
 
     @Override
@@ -61,18 +72,104 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     }
 
     /**
+     * 查询课程组详情-直播课详情
+     *
+     * @param groupId
+     */
+    public void queryLiveCourseInfo(Long groupId) {
+
+    }
+
+    /**
+     * 分页查询课程组列表
+     *
+     * @param param 传入参数
+     *              <p> - teacherId    老师id
+     *              <p> - groupStatus  课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)
+     *              <p> - row 条数
+     *              <p> - page 页数
+     */
+    public PageInfo<TeacherCourseGroupVo> queryPageLiveCourseGroup(Map<String, Object> param) {
+        //查询该月的所有课程
+        param.put("teacherId", param.get("teacherId"));
+        param.put("groupStatus", param.get("groupStatus"));
+        param.put("type", CourseScheduleEnum.LIVE.getCode());
+        Page<TeacherCourseGroupVo> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setAsc("a.start_time_");
+        IPage<TeacherCourseGroupVo> page = baseMapper.queryTeacherCourseGroup(pageInfo, param);
+        return PageUtil.pageInfo(page);
+    }
+
+    /**
      * 新增课程组
      *
-     * @param dto
+     * @param dto 创建直播课课程组参数
      */
     @Transactional(rollbackFor = Exception.class)
-    public void add(LiveCourseGroupDto dto) {
-        //1.查询该老师没有用缓存的课时
+    @Override
+    public void addLiveCourse(LiveCourseGroupDto dto) {
+        //批量检查老师课时在数据库是否重复
+        batchCheckTeacherCourseTime(dto.getTeacherId(), dto.getCoursePlanList(), CoursePlanDto::getStartTime, CoursePlanDto::getEndTime);
+        //获取锁定课时缓存,没有问题就刷新缓存
+        RMap<Long, List<CourseTimeEntity>> cacheTime = getExpireLockTimeCache(dto.getTeacherId());
+        List<CourseTimeEntity> timeEntities = new ArrayList<>();
+        dto.getCoursePlanList().forEach(o -> {
+            CourseTimeEntity time = new CourseTimeEntity();
+            time.setStartTime(o.getStartTime());
+            time.setEndTime(o.getEndTime());
+            timeEntities.add(time);
+        });
+        cacheTime.fastPut(dto.getTeacherId(), timeEntities);
+        Date now = new Date();
+        String live = CourseScheduleEnum.LIVE.getCode();
+        //写入课程组表
+        CourseGroup group = new CourseGroup();
+        group.setType(live);
+        group.setTeacherId(dto.getTeacherId());
+        group.setName(dto.getName());
+        group.setSubjectId(dto.getSubjectId());
+        group.setSingleCourseMinutes(dto.getSingleCourseMinutes());
+        group.setCourseNum(dto.getCourseNum());
+        group.setCourseIntroduce(dto.getCourseIntroduce());
+        group.setCoursePrice(dto.getCoursePrice());
+        group.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+        group.setSalesStartDate(dto.getSalesStartDate());
+        group.setSalesEndDate(dto.getSalesEndDate());
+        group.setBackgroundPic(dto.getBackgroundPic());
+        group.setMixStudentNum(dto.getMixStudentNum());
+        group.setCreatedBy(dto.getTeacherId());
+        group.setCreatedTime(now);
+        this.save(group);
 
-        //1.1 有缓存课时
+        //写入课程表及课程计划表
+        List<CourseSchedule> courseList = new ArrayList<>();
+        List<CoursePlan> planList = new ArrayList<>();
+        dto.getCoursePlanList().forEach(o -> {
+            CourseSchedule course = new CourseSchedule();
+            course.setCourseGroupId(group.getId());
+            course.setType(live);
+            course.setClassNum(o.getClassNum());
+            course.setTeacherId(dto.getTeacherId());
+            course.setClassDate(o.getStartTime());
+            course.setStartTime(o.getStartTime());
+            course.setEndTime(o.getEndTime());
+            course.setCreatedBy(dto.getTeacherId());
+            course.setCreatedTime(now);
+            course.setStatus(CourseScheduleEnum.NOT_START.getCode());
+            courseList.add(course);
 
-        //1.2 没有缓存课时
+            CoursePlan plan = new CoursePlan();
+            plan.setCourseGroupId(group.getId());
+            plan.setClassNum(o.getClassNum());
+            plan.setPlan(o.getPlan());
+            plan.setCreatedTime(now);
+            planList.add(plan);
+        });
+        courseScheduleService.getDao().insertBatch(courseList);
+        coursePlanService.getDao().insertBatch(planList);
 
+        //课程组完成删除缓存
+        cacheTime.delete();
     }
 
     /**
@@ -86,61 +183,66 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 if (i == timeList.size() - 1) {
                     break;
                 }
-                CourseTimeEntity o1 = timeList.get(i);
+                CourseTimeEntity o = timeList.get(i);
                 List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
-                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o1.getStartTime(), o1.getEndTime());
+                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
                 if (checkParamTime) {
-                    throw new BizException(DateUtil.dateToString(o1.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
+                    throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
                 }
             }
         }
-
-        //再校验数据库中课程时间和传入时间是否有交集
-        timeList.forEach(o -> {
-            boolean checkDataTime = courseScheduleService.checkTeacherCourseTime(dto.getTeacherId(), o.getStartTime(), o.getEndTime());
-            if (checkDataTime) {
-                throw new BizException("预计安排在" + DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程已被学员选择!");
-            }
-        });
-        //先将当前验证通过课程时间锁住
-        String key = String.join(":", LiveRoomConstant.COOLESHOW, CourseConstant.LOCK_COURSE_TIME_INFO, dto.getTeacherId().toString());
-        RMap<Long, List<CourseTimeEntity>> map = redissonClient.getMap(key);
-        map.expire(1L, TimeUnit.DAYS);
+        //批量检查老师课时在数据库是否重复
+        batchCheckTeacherCourseTime(dto.getTeacherId(), timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        //获取老师锁课缓存并添加课时数据
+        RMap<Long, List<CourseTimeEntity>> map = getExpireLockTimeCache(dto.getTeacherId());
         map.fastPut(dto.getTeacherId(), timeList);
 
         //需要自动补全课时
         if (dto.getLoop() == 1) {
-            //获取总课程数量
-            Integer totalCourseNum = dto.getCourseNum();
-            //获取当前课程
-            int nowCourseNum = timeList.size();
             //自动排课,获取排课后所有的课程时间
-            List<CourseTimeEntity> allCourseTime = teacherAutoPlanningLiveCourseTime(dto.getTeacherId(), totalCourseNum, nowCourseNum, timeList);
+            List<CourseTimeEntity> allCourseTime = teacherAutoPlanningLiveCourseTime(dto.getTeacherId(), dto.getCourseNum(), timeList);
             allCourseTime.sort(Comparator.comparing(CourseTimeEntity::getStartTime));
             //替换掉原有的课时
             dto.setTimeList(allCourseTime);
             //将自动排课后的课时写入缓存覆盖原有的
-            map.fastPut(dto.getTeacherId(), allCourseTime);
+            map.fastPut(dto.getTeacherId(), dto.getTimeList());
         }
         return dto.getTimeList();
     }
 
     /**
+     * 批量检查老师课时在数据库是否重复
+     *
+     * @param teacherId 老师id
+     * @param timeList  时间集合
+     */
+    private <T> void batchCheckTeacherCourseTime(Long teacherId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
+        //再校验数据库中课程时间和传入时间是否有交集
+        timeList.forEach(o -> {
+            boolean checkDataTime = courseScheduleService.checkTeacherCourseTime(teacherId, startTimeFun.apply(o), endTimeFun.apply(o));
+            if (checkDataTime) {
+                throw new BizException("预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程已被学员选择!");
+            }
+        });
+    }
+
+    /**
      * 老师创建直播课自动排课
      * <p>自动排课规则及场景:总5节课,填入2节,需要自动补3节
      * <p>1.把前面2节课的时间循环+1周直到填满5节课为止
      * <p>2.如果自动排课时的时间和未来课程时间有冲突则继续往后面延续一周
      *
      * @param totalCourseNum 总课程数量
-     * @param nowCourseNum   当前选择的课程数量
      * @param paramTimeList  当前课程的时间段
      * @return 自动排课后的全部课时
      */
-    private List<CourseTimeEntity> teacherAutoPlanningLiveCourseTime(Long teacherId, int totalCourseNum, int nowCourseNum, List<CourseTimeEntity> paramTimeList) {
+    private List<CourseTimeEntity> teacherAutoPlanningLiveCourseTime(Long teacherId, int totalCourseNum, List<CourseTimeEntity> paramTimeList) {
+        //获取当前课程
+        int nowCourseNum = paramTimeList.size();
         //获取总课程数量 - 获取当前选择的课程数量 = 要自动排课的课程数量
         int diffCourse = totalCourseNum - nowCourseNum;
         //获取课程时间,并按开始时间排序
-        List<CourseTimeEntity> sortCourseTime = paramTimeList.stream()
+        List<CourseTimeEntity> resultCourseTime = paramTimeList.stream()
                 .sorted(Comparator.comparing(CourseTimeEntity::getStartTime))
                 .collect(Collectors.toList());
         //获取最大排课周
@@ -163,7 +265,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     //进入新的循环周数+1
                     week.getAndIncrement();
                 }
-                CourseTimeEntity timeDto = sortCourseTime.get(index);
+                CourseTimeEntity timeDto = resultCourseTime.get(index);
                 if (week.get() > maxWeek) {
                     throw new BizException("系统自动排课时发现当前时间往后" + maxWeek + "周的课程时间已排满,请手动排课!");
                 }
@@ -184,7 +286,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 boolean checkTime;
 
                 //若:传入时间是1号10点和8号10点,然后1号10点自动生成的课时是8号10点那么就和传入的8号10点冲突了,这种情况需要继续往后延续1周
-                checkTime = courseScheduleService.checkCourseTime(sortCourseTime, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, autoStartDate, autoEndDate);
+                checkTime = courseScheduleService.checkCourseTime(resultCourseTime, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, autoStartDate, autoEndDate);
                 con.accept(checkTime);
                 //如果和传入时间冲突则跳过
                 if (flag.get()) {
@@ -203,11 +305,41 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 CourseTimeEntity autoTimeDto = new CourseTimeEntity();
                 autoTimeDto.setStartTime(autoStartDate);
                 autoTimeDto.setEndTime(autoEndDate);
-                sortCourseTime.add(autoTimeDto);
+                resultCourseTime.add(autoTimeDto);
             }
             index++;
         }
-        return sortCourseTime;
+        return resultCourseTime;
+    }
+
+    /**
+     * 创建直播课程组-解除锁定课程时间-删除写到缓存当作锁定的课时
+     *
+     * @param teacherId 老师id
+     */
+    @Override
+    public void unlockCourseToCache(Long teacherId) {
+        Optional.ofNullable(teacherId)
+                .ifPresent(id -> getLockTimeCache(id).delete());
+    }
+
+    /**
+     * 获取老师锁定课时数据的缓存
+     *
+     * @param teacherId 老师id
+     * @return 缓存
+     */
+    private RMap<Long, List<CourseTimeEntity>> getExpireLockTimeCache(Long teacherId) {
+        String lockMinuteStr = sysConfigService.findConfigValue(SysConfigConstant.CREATE_LIVE_TIME_LOCK_MINUTE);
+        long lockMinute = StringUtils.isBlank(lockMinuteStr) ? 15L : Long.parseLong(lockMinuteStr);
+        RMap<Long, List<CourseTimeEntity>> cache = getLockTimeCache(teacherId);
+        cache.expire(lockMinute, TimeUnit.MINUTES);
+        return cache;
+    }
+
+    private RMap<Long, List<CourseTimeEntity>> getLockTimeCache(Long teacherId) {
+        String key = String.join(":", LiveRoomConstant.COOLESHOW, CourseConstant.LOCK_COURSE_TIME_INFO, teacherId.toString());
+        return redissonClient.getMap(key);
     }
 
     private SysUser getSysUser(Long userId) {

+ 7 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -9,10 +9,11 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
-import com.yonge.cooleshow.biz.dal.vo.TeacherCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -47,6 +48,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private CourseGroupService courseGroupService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -64,7 +67,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      *              <p> - status 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成
      *              <p> - subjectId 声部id
      */
-    public PageInfo<TeacherCourseVo> queryTeacherLiveCourse(Map<String, Object> param) {
+    public PageInfo<TeacherCourseGroupVo> queryTeacherLiveCourse(Map<String, Object> param) {
         String status = WrapperUtil.toStr(param, "status", "课程状态不能为空!");
         CourseScheduleEnum.existCourseState(status, "查询条件错误,课程状态不正确");
         Integer year = WrapperUtil.toInt(param, "year", "查询时间年份不能为空!");
@@ -78,9 +81,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         param.put("endDate", lastDay.toString());
         param.put("teacherId", getSysUser().getId());
         param.put("type", CourseScheduleEnum.LIVE.getCode());
-        Page<TeacherCourseVo> pageInfo = PageUtil.getPageInfo(param);
+        Page<TeacherCourseGroupVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("a.start_time_");
-        IPage<TeacherCourseVo> page = baseMapper.queryTeacherCourse(pageInfo, param);
+        IPage<TeacherCourseGroupVo> page = courseGroupService.getDao().queryTeacherCourseGroup(pageInfo, param);
         return PageUtil.pageInfo(page);
     }
 

+ 49 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherCourseVo.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherCourseGroupVo.java

@@ -1,16 +1,20 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
+ *
  * @author hgw
  * Created by 2022-03-29
  */
-public class TeacherCourseVo implements Serializable {
+@ApiModel(value = "TeacherCourseGroupVo", description = "课程组信息")
+public class TeacherCourseGroupVo implements Serializable {
 
     @ApiModelProperty(value = "课程组id")
     private Long courseGroupId;
@@ -38,6 +42,18 @@ public class TeacherCourseVo implements Serializable {
     @ApiModelProperty(value = "课程图片")
     private String backgroundPic;
 
+    @ApiModelProperty(value = "老师id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "老师名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程组售价")
+    private BigDecimal coursePrice;
+
+    @ApiModelProperty(value = "课程数")
+    private Integer courseNum;
+
     public Long getCourseGroupId() {
         return courseGroupId;
     }
@@ -101,4 +117,36 @@ public class TeacherCourseVo implements Serializable {
     public void setBackgroundPic(String backgroundPic) {
         this.backgroundPic = backgroundPic;
     }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public BigDecimal getCoursePrice() {
+        return coursePrice;
+    }
+
+    public void setCoursePrice(BigDecimal coursePrice) {
+        this.coursePrice = coursePrice;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
 }

+ 6 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentDetailVo.java

@@ -22,8 +22,8 @@ public class VideoLessonStudentDetailVo extends BaseEntity {
     @ApiModelProperty("课程数")
     private Integer lessonCount;
 
-    @ApiModelProperty("课程价格")
-    private String lessonPrice;
+    @ApiModelProperty("支付金额")
+    private String payMoney;
 
     @ApiModelProperty("订单号")
     private String orderNo;
@@ -63,12 +63,12 @@ public class VideoLessonStudentDetailVo extends BaseEntity {
         this.lessonCount = lessonCount;
     }
 
-    public String getLessonPrice() {
-        return lessonPrice;
+    public String getPayMoney() {
+        return payMoney;
     }
 
-    public void setLessonPrice(String lessonPrice) {
-        this.lessonPrice = lessonPrice;
+    public void setPayMoney(String payMoney) {
+        this.payMoney = payMoney;
     }
 
     public String getOrderNo() {

+ 46 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -43,4 +43,50 @@
         </foreach>
     </insert>
 
+    <select id="queryTeacherCourseGroup" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo">
+        select
+        b.id_                         as courseGroupId,
+        b.name_                       as courseGroupName,
+        s.name_                       as subjectName,
+        a.teacher_id_                 as teacherId,
+        u.real_name_                  as teacherName,
+        a.start_time_                 as startTime,
+        a.end_time_                   as endTime,
+        a.status_                     as `status`,
+        ifnull(a.pre_student_num_, 0) as studentCount,
+        b.background_pic_             as backgroundPic,
+        b.course_price_               as coursePrice,
+        b.course_num_                 as courseNum
+        from course_group as b
+        left join course_schedule as a on a.course_group_id_ = b.id_
+        left join subject as s on b.subject_id_ = s.id_
+        left join sys_user as u on a.teacher_id_ = u.id_
+        <where>
+            a.lock_ = 0
+            <if test="param.teacherId != null">
+                and b.teacher_id_ = #{param.teacherId}
+            </if>
+            <if test="param.status != null">
+                and a.status_ = #{param.status}
+            </if>
+            <if test="param.groupStatus != null">
+                and b.status_ = #{param.groupStatus}
+            </if>
+            <if test="param.type_ != null">
+                and a.type_ = #{param.type}
+            </if>
+            <if test="param.startDate != null">
+                AND <![CDATA[ a.class_date_  >= #{param.startDate} ]]>
+            </if>
+            <if test="param.endDate != null">
+                AND <![CDATA[ a.class_date_  <= #{param.endDate} ]]>
+            </if>
+            <if test="param.subjectId != null">
+                AND b.subject_id_ = #{param.subjectId}
+            </if>
+        </where>
+    </select>
+
+
+
 </mapper>

+ 0 - 29
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -100,33 +100,4 @@
         order by b.start_time_ desc
     </select>
 
-
-    <select id="queryTeacherCourse" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherCourseVo">
-        select
-               b.id_  as courseGroupId,
-               b.name_             as courseGroupName,
-               s.name_             as subjectName,
-               a.start_time_ as startTime,
-               a.end_time_ as endTime,
-               a.status_           as `status`,
-               a.pre_student_num_  as studentCount,
-               b.background_pic_   as backgroundPic
-        from course_schedule as a
-                 left join course_group as b on a.course_group_id_ = b.id_
-                 left join subject as s on b.subject_id_ = s.id_
-        where b.teacher_id_ = #{param.teacherId}
-          and a.lock_ = 0
-          and a.status_ = #{param.status}
-          and a.type_ = #{param.type}
-        <![CDATA[
-          AND a.class_date_  >= #{param.startDate}
-          AND a.class_date_  <= #{param.endDate}
-            # ]]>
-        <if test="param.subjectId != null">
-            AND b.subject_id_ = #{param.subjectId}
-        </if>
-
-    </select>
-
-
 </mapper>

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml

@@ -79,7 +79,7 @@
 			g.lesson_name_ AS lessonName,
 			g.lesson_subject_ AS lessonSubject,
 			g.lesson_count_ AS lessonCount,
-			g.lesson_price_ AS lessonPrice,
+			p.pay_money_ AS payMoney,
 			p.order_no_ AS orderNo,
 			p.purchase_time_ AS purchaseTime
 		FROM video_lesson_group g

+ 34 - 4
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseGroupController.java

@@ -2,19 +2,22 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程组表(CourseGroup)表控制层
@@ -32,11 +35,38 @@ public class CourseGroupController extends BaseController {
     @Resource
     private CourseGroupService courseGroupService;
 
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
+            @ApiImplicitParam(name = "groupStatus", dataType = "String", value = "课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询课程组列表")
+    @PostMapping("/queryPageCourseGroup")
+    public HttpResponseResult<PageInfo<TeacherCourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
+        return succeed(courseGroupService.queryPageLiveCourseGroup(param));
+    }
+
+    @ApiOperation("创建直播课程组-新增课程组")
+    @PostMapping("/lockCourseTime")
+    public HttpResponseResult<Object> addLiveCourse(@RequestBody LiveCourseGroupDto dto) {
+        courseGroupService.addLiveCourse(dto);
+        return succeed();
+    }
+
     @ApiOperation("创建直播课程组-锁定课程时间-将课时写到缓存当作锁定的时间")
     @PostMapping("/lockCourseTime")
     public HttpResponseResult<List<CourseTimeEntity>> lockCourseToCache(@RequestBody CheckLiveCourseTimeDto dto) {
         return succeed(courseGroupService.lockCourseToCache(dto));
     }
 
+    @ApiOperation("创建直播课程组-解除锁定课程时间-删除写到缓存当作锁定的课时")
+    @GetMapping("/unlockCourseToCache")
+    public HttpResponseResult<Object> unlockCourseToCache(@RequestParam("teacherId") Long teacherId) {
+        courseGroupService.unlockCourseToCache(teacherId);
+        return succeed();
+    }
+
 }
 

+ 2 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java

@@ -2,7 +2,7 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.vo.TeacherCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherCourseGroupVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -44,7 +44,7 @@ public class CourseScheduleController extends BaseController {
     })
     @ApiOperation("老师端-首页-我的课程-直播课")
     @PostMapping("/queryTeacherLiveCourse")
-    public HttpResponseResult<PageInfo<TeacherCourseVo>> queryTeacherLiveCourse(@RequestBody Map<String, Object> param) {
+    public HttpResponseResult<PageInfo<TeacherCourseGroupVo>> queryTeacherLiveCourse(@RequestBody Map<String, Object> param) {
         return succeed(courseScheduleService.queryTeacherLiveCourse(param));
     }
 

+ 2 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

@@ -99,7 +99,8 @@ public class VideoLessonGroupController extends BaseController {
     @PostMapping(value = "/add", consumes = "application/json", produces = "application/json")
     public HttpResponseResult<Object> add(@Validated @RequestBody VideoLessonVo lessonVo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
+
+        if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
         if (lessonVo.getLessonList().isEmpty()) {