Browse Source

Merge remote-tracking branch 'origin/master'

weifanli 3 years ago
parent
commit
be8818b9e3
67 changed files with 2528 additions and 644 deletions
  1. 107 32
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java
  2. 1 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  3. 13 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicTagController.java
  4. 0 150
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonGroupController.java
  5. 0 108
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonGroupDetailController.java
  6. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java
  7. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/SysConfigConstant.java
  8. 16 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  9. 15 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  10. 5 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java
  11. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDetailDao.java
  12. 65 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CheckLiveCourseTimeDto.java
  13. 12 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java
  14. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java
  15. 55 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java
  16. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  17. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java
  18. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonSearch.java
  19. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseTimeEntity.java
  20. 1 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java
  21. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserStateSync.java
  22. 21 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java
  23. 90 117
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  24. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysConfig.java
  25. 11 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java
  26. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AlbumMusicRelateService.java
  27. 9 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  28. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  29. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  30. 64 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java
  31. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  32. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicTagService.java
  33. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupDetailService.java
  34. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  35. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AlbumMusicRelateServiceImpl.java
  36. 186 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  37. 12 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  38. 71 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  39. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  40. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  41. 35 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  42. 108 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupDetailServiceImpl.java
  43. 32 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  44. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/AddGroup.java
  45. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/DeleteGroup.java
  46. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/ListValue.java
  47. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/UpdateGroup.java
  48. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/impl/ListValueValidator.java
  49. 138 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/impl/ValidList.java
  50. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java
  51. 36 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java
  52. 107 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupDetailUpVo.java
  53. 0 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupDetailVo.java
  54. 139 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupUpVo.java
  55. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupVo.java
  56. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseStudent.java
  57. 52 23
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  58. 49 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  59. 11 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  60. 9 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysConfigMapper.xml
  61. 78 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml
  62. 35 55
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  63. 3 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java
  64. 13 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseGroupController.java
  65. 23 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/LiveRoomController.java
  66. 91 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  67. 119 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupDetailController.java

+ 107 - 32
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java

@@ -1,12 +1,18 @@
 package com.yonge.cooleshow.admin.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
 import javax.validation.Valid;
-import com.yonge.cooleshow.biz.dal.dto.MusicAlbumDto;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.toolset.utils.string.StringUtil;
+import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,6 +23,8 @@ import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 
+import java.util.Date;
+
 /**
  * 专辑表 web 控制层
  * @author yzp
@@ -41,9 +49,10 @@ public class MusicAlbumController extends BaseController {
             return failed("用户信息获取失败");
         }
 
-        //musicAlbum.setCreateBy(sysUser.getId());
-        //musicAlbum.setCreateTime(new Date());
-        musicAlbumService.save(musicAlbum);
+        musicAlbum.setCreateBy(sysUser.getId());
+        musicAlbum.setCreateTime(new Date());
+        musicAlbum.setAlbumStatus(StateEnum.STOP);
+        musicAlbumService.createMusicAlbum(musicAlbum);
         return succeed();
     }
 
@@ -70,39 +79,105 @@ public class MusicAlbumController extends BaseController {
             return failed("缺少ID");
         }
 
-        //musicAlbum.setUpdateBy(sysUser.getId());
-        //musicAlbum.setUpdateTime(new Date());
-        musicAlbumService.updateById(musicAlbum);
+        musicAlbum.setUpdateBy(sysUser.getId());
+        musicAlbum.setUpdateTime(new Date());
+        musicAlbumService.updateMusicAlbum(musicAlbum);
         return succeed();
     }
 
     @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> list(@RequestBody MusicAlbumDto musicAlbumDto) {
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> list(@RequestBody MusicAlbumSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectPage(Condition.getPage(query),query);
+        return succeed(Condition.pageInfo(iPage));
+    }
+
+    /**
+     * 启用/停用
+     */
+    @PostMapping("/state")
+    @ApiOperation(value = "启用/停用", notes = "传入id")
+    public HttpResponseResult<Boolean> state(@ApiParam(value = "专辑编号", required = true) @RequestParam Long id) {
+        if (StringUtil.isEmpty(id)) {
+            return failed("参数不能为空");
+        }
+        return status(musicAlbumService.state(id));
+    }
+
+
+    /**
+     * 专辑详情
+     */
+    @PostMapping("/detail")
+    @ApiOperation(value = "专辑详情", consumes="application/json", produces="application/json")
+    public HttpResponseResult<AlbumDetailVo> detail(@Valid @RequestBody MusicAlbumDetailSearch query) {
+
+        query.setType(2);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(Condition.getPage(query),query);
+        return succeed(albumDetailVo);
+    }
+
+
+    /**
+     * 专辑详情能新增的曲目列表
+     */
+    @PostMapping("/detail/canAddMusicSheet")
+    @ApiOperation(value = "专辑详情能新增的曲目列表")
+    public HttpResponseResult<AlbumDetailVo> detailAddMusicSheet(@Valid @RequestBody MusicAlbumDetailSearch query) {
+
+        query.setType(1);
+        query.setState(StateEnum.ENABLE);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(Condition.getPage(query),query);
+        return succeed(albumDetailVo);
+    }
+
+
+    /**
+     * 专辑详情删除曲目列表
+     */
+    @PostMapping("/detail/delMusicSheet")
+    @ApiOperation(value = "专辑详情删除曲目列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "albumId",value = "专辑编号ID", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "musicSheetIds",value = "删除曲目编号,多个逗号隔开", required = true, dataType = "String")
+    })
+    public HttpResponseResult<Boolean> detailDelMusicSheet(Long albumId, String musicSheetIds) {
+        if (StringUtil.isEmpty(albumId)) {
+            return failed("专辑编号ID不能为空");
+        }
+        if (StringUtil.isEmpty(musicSheetIds)) {
+            return failed("曲目编号不能为空");
+        }
+        return status(musicAlbumService.delMusicSheet(albumId,musicSheetIds));
+    }
+
 
-        int pageNo = musicAlbumDto.getPageNo();
-        int pageSize = musicAlbumDto.getPageSize();
-
-        try {
-            if (pageNo==0) {
-                pageNo = 1;
-            }
-            if (pageSize==0) {
-                pageSize = 10;
-            }
-
-            LambdaQueryWrapper<MusicAlbum> lambdaQueryWrapper = Wrappers.lambdaQuery();
-            //lambdaQueryWrapper.like(MusicAlbum::getName , "k");
-
-            Page<MusicAlbum> page = new Page<>(pageNo,pageSize);
-            return succeed(musicAlbumService.page(page, lambdaQueryWrapper));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return HttpResponseResult.failed(e.getMessage());
+
+    /**
+     * 专辑详情添加曲目列表
+     */
+    @PostMapping("/detail/addMusicSheet")
+    @ApiOperation(value = "专辑详情添加曲目列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "albumId",value = "专辑编号ID", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "musicSheetIds",value = "添加曲目编号,多个逗号隔开", required = true, dataType = "String")
+    })
+    public HttpResponseResult<Boolean> detailAddMusicSheet(Long albumId, String musicSheetIds) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
         }
+        if (StringUtil.isEmpty(albumId)) {
+            return failed("专辑编号ID不能为空");
+        }
+        if (StringUtil.isEmpty(musicSheetIds)) {
+            return failed("曲目编号不能为空");
+        }
+        return status(musicAlbumService.addMusicSheet(albumId,musicSheetIds,sysUser.getId()));
     }
+
 }

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

@@ -71,13 +71,12 @@ public class MusicSheetController extends BaseController {
             BeanUtils.copyProperties(musicSheetDto, musicSheet);
             musicSheet.setAuditStatus(AuditEnum.AUDITING);
             musicSheet.setCreateBy(sysUser.getId());
-            musicSheet.setUserId(sysUser.getId());
+            musicSheet.setUserId(0L);
             musicSheet.setCreateTime(new Date());
             musicSheet.setState(StateEnum.STOP);
             musicSheetService.save(musicSheet);
         }
 
-
         return succeed("新增曲谱成功");
 
     }

+ 13 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicTagController.java

@@ -17,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/MusicTag")
 @Api(value = "音乐标签表", tags = "音乐标签表")
@@ -44,6 +46,17 @@ public class MusicTagController extends BaseController {
 		return succeed(Condition.pageInfo(pages));
 	}
 
+
+	/**
+	 * 查询分页tree
+	 */
+	@GetMapping("/tree")
+	@ApiOperation(value = "查询标签树列表", notes = "传入musicTag")
+	public HttpResponseResult<List<MusicTagVo>> tree() {
+		List<MusicTagVo> treeList = musicTagService.selectMusicTagTree();
+		return succeed(treeList);
+	}
+
     /**
 	 * 新增
 	 */

+ 0 - 150
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonGroupController.java

@@ -1,150 +0,0 @@
-package com.yonge.cooleshow.admin.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import javax.validation.Valid;
-import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDto;
-import com.yonge.cooleshow.biz.dal.dto.search.AuthEntryRecordSearch;
-import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.support.Condition;
-import com.yonge.cooleshow.biz.dal.support.Query;
-import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
-import com.yonge.cooleshow.common.page.PageInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
-import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * 视频课基本信息表 web 控制层
- * @author yzp
- * @date 2022-03-26 00:21:46
- * @version v1.0
- **/
-@RestController
-@RequestMapping("/video/lesson/group")
-@Api(tags = "视频课基本信息表 API接口")
-public class VideoLessonGroupController extends BaseController {
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-
-	@Autowired
-	private VideoLessonGroupService videoLessonGroupService;
-
-    /**
-     * 新增视频课组
-     */
-	@ApiOperation(value = "新增视频课组", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping(value="/create", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> create(@Valid @RequestBody VideoLessonGroup videoLessonGroup) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        videoLessonGroup.setTeacherId(sysUser.getId());
-        videoLessonGroupService.save(videoLessonGroup);
-        return succeed();
-    }
-
-    @ApiOperation(value = "删除", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping("/delete/{id}")
-    public Object delete(@PathVariable Long id) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        videoLessonGroupService.removeById(id);
-        return succeed();
-    }
-
-    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping(value="/update", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> update(@Valid @RequestBody VideoLessonGroup videoLessonGroup) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-        if (videoLessonGroup.getId()==null){
-            return failed("缺少ID");
-        }
-
-        //videoLessonGroup.setUpdateBy(sysUser.getId());
-        //videoLessonGroup.setUpdateTime(new Date());
-        videoLessonGroupService.updateById(videoLessonGroup);
-        return succeed();
-    }
-
-    /**
-     * 教师端视频课-首页分页
-     * 可根据审核状态筛选
-     */
-    @ApiOperation(value = "教师端视频课-首页分页")
-    @GetMapping(value="/page")
-    public HttpResponseResult<PageInfo<VideoLessonGroupVo>> page(VideoLessonGroupSearch search, Query query) {
-        IPage<VideoLessonGroupVo> pages = videoLessonGroupService.selectPage(Condition.getPage(query),search);
-        return succeed(Condition.pageInfo(pages));
-/*        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        int pageNo = videoLessonGroupDto.getPageNo();
-        int pageSize = videoLessonGroupDto.getPageSize();
-
-        try {
-            if (pageNo==0) {
-                pageNo = 1;
-            }
-            if (pageSize==0) {
-                pageSize = 10;
-            }
-
-            String search;
-            if(videoLessonGroupDto.getSearch()==null){
-                search = "";
-            } else {
-                search = videoLessonGroupDto.getSearch();
-            }
-            LambdaQueryWrapper<VideoLessonGroup> lambdaQueryWrapper = Wrappers.lambdaQuery();
-            lambdaQueryWrapper.or().like(VideoLessonGroup::getLessonName , search);
-            lambdaQueryWrapper.or().like(VideoLessonGroup::getLessonSubject , search);
-            lambdaQueryWrapper.or().like(VideoLessonGroup::getLessonTag , search);
-            Page<VideoLessonGroup> page = new Page<>(pageNo,pageSize);
-            videoLessonGroupService.selectPage(page,)
-            return succeed(videoLessonGroupService.page(page, lambdaQueryWrapper));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return HttpResponseResult.failed(e.getMessage());
-        }*/
-    }
-
-    /**
-     * 教师端视频课-查询详情
-     * 根据组id查组内课程及购买人员信息
-     */
-    @ApiOperation(value = "教师端视频课-查询详情")
-    @GetMapping("/detail")
-    public HttpResponseResult<VideoLessonGroupDetailVo> detail(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
-        VideoLessonGroupDetailVo detail = videoLessonGroupService.detail(id);
-        return succeed(detail);
-    }
-}

+ 0 - 108
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonGroupDetailController.java

@@ -1,108 +0,0 @@
-package com.yonge.cooleshow.admin.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import javax.validation.Valid;
-import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
-import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-
-/**
- * 视频课明细表 web 控制层
- * @author yzp
- * @date 2022-03-26 00:21:46
- * @version v1.0
- **/
-@RestController
-@RequestMapping("/video/lesson/group/detail")
-@Api(tags = "视频课明细表 API接口")
-public class VideoLessonGroupDetailController extends BaseController {
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-
-	@Autowired
-	private VideoLessonGroupDetailService videoLessonGroupDetailService;
-
-	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping(value="/create", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> create(@Valid @RequestBody VideoLessonGroupDetail videoLessonGroupDetail) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        //videoLessonGroupDetail.setCreateBy(sysUser.getId());
-        //videoLessonGroupDetail.setCreateTime(new Date());
-        videoLessonGroupDetailService.save(videoLessonGroupDetail);
-        return succeed();
-    }
-
-    @ApiOperation(value = "删除", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping("/delete/{id}")
-    public Object delete(@PathVariable Long id) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        videoLessonGroupDetailService.removeById(id);
-        return succeed();
-    }
-
-    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping(value="/update", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> update(@Valid @RequestBody VideoLessonGroupDetail videoLessonGroupDetail) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-        if (videoLessonGroupDetail.getId()==null){
-            return failed("缺少ID");
-        }
-
-        //videoLessonGroupDetail.setUpdateBy(sysUser.getId());
-        //videoLessonGroupDetail.setUpdateTime(new Date());
-        videoLessonGroupDetailService.updateById(videoLessonGroupDetail);
-        return succeed();
-    }
-
-    @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
-    @PostMapping(value="/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<Object> list(@RequestBody VideoLessonGroupDetailDto videoLessonGroupDetailDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
-        int pageNo = videoLessonGroupDetailDto.getPageNo();
-        int pageSize = videoLessonGroupDetailDto.getPageSize();
-
-        try {
-            if (pageNo==0) {
-                pageNo = 1;
-            }
-            if (pageSize==0) {
-                pageSize = 10;
-            }
-
-            LambdaQueryWrapper<VideoLessonGroupDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
-            //lambdaQueryWrapper.like(VideoLessonGroupDetail::getName , "k");
-
-            Page<VideoLessonGroupDetail> page = new Page<>(pageNo,pageSize);
-            return succeed(videoLessonGroupDetailService.page(page, lambdaQueryWrapper));
-        } catch (Exception e) {
-            e.printStackTrace();
-            return HttpResponseResult.failed(e.getMessage());
-        }
-    }
-}

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java

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

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/SysConfigConstant.java

@@ -67,6 +67,36 @@ public interface SysConfigConstant {
     String COURSE_SETTLEMENT_TIME_DAY = "course_settlement_time_day";
 
     /**
+     * 创建直播课可选时间设定
+     */
+    String LIVE_TIME_SETTING = "live_time_setting";
+
+    /**
+     * 学生购买陪练课时间段锁定时间
+     */
+    String STUDENT_BUY_PRACTICE_TIME_LOCK_MINUTE = "student_buy_practice_time_lock_minute";
+
+    /**
+     * 老师创建直播课选择课程时间段锁定的时间
+     */
+    String CREATE_LIVE_TIME_LOCK_MINUTE = "create_live_time_lock_minute";
+
+    /**
+     * 课程开始时间
+     */
+    String COURSE_START_SETTING = "course_start_setting";
+
+    /**
+     * 课程结束时间
+     */
+    String COURSE_END_SETTING = "course_end_setting";
+
+    /**
+     * 自动规划课程最大周数
+     */
+    String AUTO_PLANNING_COURSE_MAX_WEEK = "auto_planning_course_max_week";
+
+    /**
      * 管理端默认头像
      */
     String DEFAULT_HEARD_ADMIN = "default_heard_admin";

+ 16 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -1,14 +1,29 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * MusicAlbumDao数据库访问类
+ *
  * @author yzp
- * @date 2022-03-25 23:46:28
  * @version v1.0
+ * @date 2022-03-25 23:46:28
  **/
 public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
 
+    /**
+     * 专辑查询
+     *
+     * @param page  分页信息
+     * @param query 查询条件
+     * @return page
+     */
+    List<MusicAlbumVo> selectPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query);
 }

+ 15 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -1,21 +1,21 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
-import com.yonge.cooleshow.biz.dal.dto.search.MusicTagSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
-import com.yonge.cooleshow.biz.dal.vo.MusicTagVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * MusicSheetDao数据库访问类
+ *
  * @author yzp
- * @date 2022-03-25 23:46:28
  * @version v1.0
+ * @date 2022-03-25 23:46:28
  **/
 public interface MusicSheetDao extends BaseMapper<MusicSheet> {
     /**
@@ -23,5 +23,15 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      *
      * @return com.yonge.cooleshow.biz.dal.vo.MusicSheetVo
      */
-    List<MusicSheetVo> selectPage(@Param("page") IPage page, @Param("param") MusicSheetSearch query);
+    List<MusicSheetVo> selectPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") MusicSheetSearch query);
+
+    /**
+     * 分页查询专辑详情里的曲目
+     *
+     * @param page  分页
+     * @param query 查询条件
+     * @return
+     */
+    List<MusicSheet> selectAlbumDetailPage(@Param("page") IPage<MusicSheet> page,
+                                           @Param("param") MusicAlbumDetailSearch query);
 }

+ 5 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java

@@ -4,8 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,12 +17,9 @@ import java.util.List;
  * @version v1.0
  **/
 public interface VideoLessonGroupDao extends BaseMapper<VideoLessonGroup> {
-    //查询视频课组-分页
-    List<VideoLessonGroupVo> selectPage(IPage page,@Param("param")  VideoLessonGroupSearch search);
+    //查询视频课组
+    List<VideoLessonGroupVo> selectPage(IPage page,@Param("param")  VideoLessonGroupSearch query);
 
-    //根据组id查视频课详情
-    List<VideoLessonGroupDetail> selectDetail(Long id);
-
-    //根据组id查询购买学员信息
-    List<VideoLessonPurchaseStudent> selectStudent(Long id);
+    //修改视频课组
+    void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo);
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDetailDao.java

@@ -1,7 +1,14 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * VideoLessonGroupDetailDao数据库访问类
@@ -10,5 +17,18 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @version v1.0
  **/
 public interface VideoLessonGroupDetailDao extends BaseMapper<VideoLessonGroupDetail> {
+    //查询视频课
+    List<VideoLessonGroupDetail> selectPage(IPage page,@Param("param") VideoLessonSearch query);
+
+    //根据组id查询购买用户
+    List<VideoLessonPurchaseStudent> selectPageStudent(IPage page,@Param("param")  VideoLessonSearch query);
+
+    //新增视频课
+    void insertVideoLesson(List<VideoLessonGroupDetail> list);
+
+    //修改视频课
+    void updateDetail(VideoLessonGroupDetailUpVo detailUpVo);
 
+    //根据组id删除视频课
+    void deleteByGroupId(Long groupId);
 }

+ 65 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CheckLiveCourseTimeDto.java

@@ -0,0 +1,65 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author hgw
+ * Created by 2022-03-30
+ */
+@ApiModel(value = "创建直播课组验校时间接收类")
+public class CheckLiveCourseTimeDto implements Serializable {
+
+    @NotNull(message = "老师Id不能为空")
+    @ApiModelProperty(value = "老师Id")
+    private Long teacherId;
+
+    @NotNull(message = "是否需要自动排课不能为空")
+    @ApiModelProperty(value = "是否需要循环 0:不需要 1:需要")
+    private Integer loop;
+
+    @NotNull(message = "课程数不能为空")
+    @ApiModelProperty(value = "课程数")
+    private Integer courseNum;
+
+    @NotNull(message = "课程时间不能为空")
+    @ApiModelProperty(value = "课程时间接收类")
+    private List<CourseTimeEntity> timeList;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Integer getLoop() {
+        return loop;
+    }
+
+    public void setLoop(Integer loop) {
+        this.loop = loop;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public List<CourseTimeEntity> getTimeList() {
+        return timeList;
+    }
+
+    public void setTimeList(List<CourseTimeEntity> timeList) {
+        this.timeList = timeList;
+    }
+}

+ 12 - 33
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseGroupDto.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -16,8 +17,8 @@ import java.util.List;
  * @author hgw
  * Created by 2022-03-21
  */
-@ApiModel(value = "课程组接收类")
-public class CourseGroupDto implements Serializable {
+@ApiModel(value = "创建直播课接收类")
+public class LiveCourseGroupDto implements Serializable {
 
     @ApiModelProperty(value = "主键")
     private Long id;
@@ -69,23 +70,16 @@ public class CourseGroupDto implements Serializable {
     @ApiModelProperty(value = "直播背景图")
     private String backgroundPic;
 
-    @NotNull(message = "课程数不能为空")
-    @Positive(message = "课程数必须大于0")
+    @NotNull(message = "最少成课人数不能为空")
+    @Positive(message = "最少成课人数必须大于0")
     @ApiModelProperty(value = "最少成课人数")
     private Integer mixStudentNum;
 
     @ApiModelProperty(value = "课时及教学计划")
-    private List<CourseInfoDto> courseInfo;
+    private List<CoursePlanDto> CoursePlanList;
 
     @ApiModel(value = "课程详情接收类")
-    static class CourseInfoDto implements Serializable{
-        @NotNull(message = "上课时间不能为空")
-        @ApiModelProperty(value = "上课时间")
-        private Date startTime;
-
-        @NotNull(message = "下课时间不能为空")
-        @ApiModelProperty(value = "下课时间")
-        private Date endTime;
+    static class CoursePlanDto extends CourseTimeEntity implements Serializable {
 
         @NotNull(message = "课堂编号不能为空")
         @ApiModelProperty(value = "课堂编号-第几堂课")
@@ -96,22 +90,6 @@ public class CourseGroupDto implements Serializable {
         @ApiModelProperty(value = "教学计划/最多200字")
         private String plan;
 
-        public Date getStartTime() {
-            return startTime;
-        }
-
-        public void setStartTime(Date startTime) {
-            this.startTime = startTime;
-        }
-
-        public Date getEndTime() {
-            return endTime;
-        }
-
-        public void setEndTime(Date endTime) {
-            this.endTime = endTime;
-        }
-
         public Integer getClassNum() {
             return classNum;
         }
@@ -233,11 +211,12 @@ public class CourseGroupDto implements Serializable {
         this.mixStudentNum = mixStudentNum;
     }
 
-    public List<CourseInfoDto> getCourseInfo() {
-        return courseInfo;
+    public List<CoursePlanDto> getCoursePlanList() {
+        return CoursePlanList;
     }
 
-    public void setCourseInfo(List<CourseInfoDto> courseInfo) {
-        this.courseInfo = courseInfo;
+    public void setCoursePlanList(List<CoursePlanDto> coursePlanList) {
+        CoursePlanList = coursePlanList;
     }
+
 }

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description 专辑详情下的曲目查询
+ *
+ * @author liujunchi
+ * @date 2022-03-31
+ */
+@ApiModel(value = "MusicAlbumDetailSearch", description = "专辑详情查询")
+public class MusicAlbumDetailSearch extends MusicSheetSearch {
+
+    @NotNull(message = "专辑编号ID不能为空")
+    @ApiModelProperty("专辑编号ID")
+    private Long id;
+
+    /**
+     * 1:新增曲目,2:已有曲目
+     */
+    @ApiModelProperty(hidden = true,value = "1:新增曲目,2:已有曲目1:新增曲目,2:已有曲目")
+    private Integer type;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.support.Query;
+import com.yonge.toolset.utils.string.StringUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * Description 专辑查询
+ *
+ * @author: liujunchi
+ * @date: 2022-03-31
+ */
+@ApiModel(value = "MusicAlbumSearch", description = "专辑列表查询")
+public class MusicAlbumSearch extends Query {
+
+    @ApiModelProperty("专辑编号/名称")
+    private String idAndName;
+
+    @ApiModelProperty("标签id,多个逗号隔开")
+    private String albumTagIds;
+
+    @ApiModelProperty(hidden = true)
+    private List<Long> albumTagIdList;
+
+    public String getIdAndName() {
+        return idAndName;
+    }
+
+    public void setIdAndName(String idAndName) {
+        this.idAndName = idAndName;
+    }
+
+    public String getAlbumTagIds() {
+        return albumTagIds;
+    }
+
+    public void setAlbumTagIds(String albumTagIds) {
+        this.albumTagIds = albumTagIds;
+        if (StringUtils.isNotBlank(albumTagIds)) {
+            this.albumTagIdList = StringUtil.toLongList(albumTagIds);
+        }
+    }
+
+    public List<Long> getAlbumTagIdList() {
+        return albumTagIdList;
+    }
+
+    public void setAlbumTagIdList(List<Long> albumTagIdList) {
+        this.albumTagIdList = albumTagIdList;
+    }
+}

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java

@@ -2,8 +2,12 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.support.Query;
+import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
 
 /**
  * Description
@@ -20,9 +24,14 @@ public class MusicSheetSearch  extends Query {
     @ApiModelProperty("标签id(多个逗号隔开)")
     private String musicTagIds;
 
+    @ApiModelProperty(hidden = true)
+    private List<Long> musicTagIdList;
+
     @ApiModelProperty("声部id(多个逗号隔开)")
     private String subjectIds;
 
+    @ApiModelProperty(hidden = true)
+    private List<Long> subjectIdList;
 
     @ApiModelProperty("曲目状态(0:停用,1:启用))")
     private StateEnum state;
@@ -35,12 +44,31 @@ public class MusicSheetSearch  extends Query {
         this.idAndName = idAndName;
     }
 
+    public List<Long> getMusicTagIdList() {
+        return musicTagIdList;
+    }
+
+    public void setMusicTagIdList(List<Long> musicTagIdList) {
+        this.musicTagIdList = musicTagIdList;
+    }
+
+    public List<Long> getSubjectIdList() {
+        return this.subjectIdList;
+    }
+
+    public void setSubjectIdList(List<Long> subjectIdList) {
+        this.subjectIdList = subjectIdList;
+    }
+
     public String getMusicTagIds() {
         return musicTagIds;
     }
 
     public void setMusicTagIds(String musicTagIds) {
         this.musicTagIds = musicTagIds;
+        if (StringUtils.isNotBlank(musicTagIds)) {
+            this.musicTagIdList = StringUtil.toLongList(musicTagIds);
+        }
     }
 
     public String getSubjectIds() {
@@ -49,6 +77,9 @@ public class MusicSheetSearch  extends Query {
 
     public void setSubjectIds(String subjectIds) {
         this.subjectIds = subjectIds;
+        if (StringUtils.isNotBlank(subjectIds)) {
+            this.subjectIdList = StringUtil.toLongList(subjectIds);
+        }
     }
 
     public StateEnum getState() {

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonGroupSearch.java

@@ -1,10 +1,15 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.support.Query;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
-@ApiModel(value = "VideoLessonGroupSearch", description = "视频课列表查询")
-public class VideoLessonGroupSearch {
+/**
+ * @author: cy
+ * @date: 2022/3/30 11:32
+ */
+@ApiModel(value = "VideoLessonGroupSearch", description = "视频课组列表查询")
+public class VideoLessonGroupSearch extends Query {
     @ApiModelProperty(value = "审核状态(0:待审核 1:通过 2:未通过)")
     private Integer auditStatus;
 

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VideoLessonSearch.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.support.Query;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author: cy
+ * @date: 2022/3/30 11:32
+ */
+@ApiModel(value = "VideoLessonGroupSearch", description = "视频课组列表查询")
+public class VideoLessonSearch extends Query {
+    @ApiModelProperty(value = "视频组id")
+    private Long videoLessonGroupId;
+
+    public Long getVideoLessonGroupId() {
+        return videoLessonGroupId;
+    }
+
+    public void setVideoLessonGroupId(Long videoLessonGroupId) {
+        this.videoLessonGroupId = videoLessonGroupId;
+    }
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseTimeEntity.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author hgw
+ * Created by 2022-03-31
+ */
+@ApiModel(value = "课程时间类")
+public class CourseTimeEntity implements Serializable {
+
+    @NotNull(message = "上课时间不能为空")
+    @ApiModelProperty(value = "上课时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    @NotNull(message = "下课时间不能为空")
+    @ApiModelProperty(value = "下课时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 1 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java

@@ -6,11 +6,8 @@ package com.yonge.cooleshow.biz.dal.entity;
  */
 public class ImRoomMessage extends BaseMessage {
 
-    //objectName 类型-将所有人强制踢出房间
-    public static final String FORCED_OFFLINE = "RC:ForcedOffline";
-
     //objectName 类型-观看者退出房间
-    public static final String LOOKER_LOGIN_OUT = "RC:LookerLoginOut";
+    public static final String RC_CHATROOM_LEAVE = "RC:Chatroom:Leave";
 
     /**
      * 消息类型

+ 69 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserStateSync.java

@@ -0,0 +1,69 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * 监听融云用户状态变更实体类
+ *
+ * @author hgw
+ * Created by 2022-02-18
+ */
+public class ImUserStateSync implements Serializable {
+
+    @ApiModelProperty(value = "用户 Id")
+    private String userid;
+
+    @ApiModelProperty(value = "状态:0:online 上线、1:offline 离线、2:logout 登出 3:退出直播间")
+    private String status;
+
+    @ApiModelProperty(value = "操作系统:iOS、Android、Websocket、PC、MiniProgram(小程序),用户上线时同步")
+    private String os;
+
+    @ApiModelProperty(value = "发生时间")
+    private Long time;
+
+    @ApiModelProperty(value = "用户当前的 IP 地址及端口")
+    private String clientIp;
+
+    public String getUserid() {
+        return userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
+
+    public Long getTime() {
+        return time;
+    }
+
+    public void setTime(Long time) {
+        this.time = time;
+    }
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp;
+    }
+}

+ 21 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -7,7 +9,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
-import java.util.Date;
+
+import javax.validation.constraints.NotBlank;
 
 /**
  * 专辑表
@@ -23,24 +26,28 @@ public class MusicAlbum extends BaseEntity {
     private Long id;  //主键ID
 
     @TableField("album_name_")
-    @ApiModelProperty(value = "专辑名称")
+	@NotBlank(message = "专辑名称不能为空 ")
+    @ApiModelProperty(value = "专辑名称",required = true)
     private String albumName;  //专辑名称
 
     @TableField("album_desc_")
-    @ApiModelProperty(value = "专辑简介")
+	@NotBlank(message = "专辑简介不能为空 ")
+    @ApiModelProperty(value = "专辑简介",required = true)
     private String albumDesc;  //专辑简介
 
     @TableField("album_tag_")
-    @ApiModelProperty(value = "专辑标签(多个标签以逗号分开)")
+	@NotBlank(message = "专辑标签不能为空 ")
+    @ApiModelProperty(value = "专辑标签(多个标签以逗号分开)",required = true)
     private String albumTag;  //专辑标签(多个标签以逗号分开)
 
     @TableField("album_cover_url_")
-    @ApiModelProperty(value = "专辑封面图片URL")
+	@NotBlank(message = "专辑封面图片不能为空 ")
+    @ApiModelProperty(value = "专辑封面图片URL",required = true)
     private String albumCoverUrl;  //专辑封面图片URL
 
     @TableField("album_status_")
     @ApiModelProperty(value = "专辑状态(1:启用;0:停用)")
-    private Integer albumStatus;  //专辑状态(1:启用;0:停用)
+    private StateEnum albumStatus;  //专辑状态(1:启用;0:停用)
 
     @TableField("sort_number_")
     @ApiModelProperty(value = "排序号")
@@ -48,11 +55,11 @@ public class MusicAlbum extends BaseEntity {
 
     @TableField("hot_flag_")
     @ApiModelProperty(value = "是否热门专辑(1:是;0:否)")
-    private Integer hotFlag;  //是否热门专辑(1:是;0:否)
+    private YesOrNoEnum hotFlag;  //是否热门专辑(1:是;0:否)
 
     @TableField("top_flag_")
     @ApiModelProperty(value = "是否置顶(1:是;0:否)")
-    private Integer topFlag;  //是否置顶(1:是;0:否)
+    private YesOrNoEnum topFlag;  //是否置顶(1:是;0:否)
 
     @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")
@@ -116,12 +123,12 @@ public class MusicAlbum extends BaseEntity {
 	    return this.albumCoverUrl;
 	}
 
-	public MusicAlbum setAlbumStatus(Integer albumStatus) {
+	public MusicAlbum setAlbumStatus(StateEnum albumStatus) {
 	    this.albumStatus = albumStatus;
 	    return this;
 	}
 
-	public Integer getAlbumStatus() {
+	public StateEnum getAlbumStatus() {
 	    return this.albumStatus;
 	}
 
@@ -134,21 +141,21 @@ public class MusicAlbum extends BaseEntity {
 	    return this.sortNumber;
 	}
 
-	public MusicAlbum setHotFlag(Integer hotFlag) {
+	public MusicAlbum setHotFlag(YesOrNoEnum hotFlag) {
 	    this.hotFlag = hotFlag;
 	    return this;
 	}
 
-	public Integer getHotFlag() {
+	public YesOrNoEnum getHotFlag() {
 	    return this.hotFlag;
 	}
 
-	public MusicAlbum setTopFlag(Integer topFlag) {
+	public MusicAlbum setTopFlag(YesOrNoEnum topFlag) {
 	    this.topFlag = topFlag;
 	    return this;
 	}
 
-	public Integer getTopFlag() {
+	public YesOrNoEnum getTopFlag() {
 	    return this.topFlag;
 	}
 

+ 90 - 117
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -1,17 +1,20 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -21,7 +24,7 @@ import java.util.Date;
  * @version v1.0
  **/
 @ApiModel(value = "music_sheet-曲谱表")
-public class MusicSheet extends BaseEntity {
+public class MusicSheet implements Serializable {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
@@ -134,234 +137,204 @@ public class MusicSheet extends BaseEntity {
     @ApiModelProperty(value = "备注")
     private String remark;  //备注,填写未通过审核的原因
 
-
-	public MusicSheet setId(Long id) {
-	    this.id = id;
-	    return this;
-	}
-
 	public Long getId() {
-	    return this.id;
+		return id;
 	}
 
-	public MusicSheet setMusicSheetName(String musicSheetName) {
-	    this.musicSheetName = musicSheetName;
-	    return this;
+	public void setId(Long id) {
+		this.id = id;
 	}
 
 	public String getMusicSheetName() {
-	    return this.musicSheetName;
+		return musicSheetName;
 	}
 
-	public MusicSheet setUserId(Long userId) {
-	    this.userId = userId;
-	    return this;
+	public void setMusicSheetName(String musicSheetName) {
+		this.musicSheetName = musicSheetName;
 	}
 
 	public Long getUserId() {
-	    return this.userId;
+		return userId;
 	}
 
-	public MusicSheet setComposer(String composer) {
-	    this.composer = composer;
-	    return this;
+	public void setUserId(Long userId) {
+		this.userId = userId;
 	}
 
 	public String getComposer() {
-	    return this.composer;
+		return composer;
 	}
 
-	public MusicSheet setMusicSubject(String musicSubject) {
-	    this.musicSubject = musicSubject;
-	    return this;
+	public void setComposer(String composer) {
+		this.composer = composer;
 	}
 
 	public String getMusicSubject() {
-	    return this.musicSubject;
+		return musicSubject;
 	}
 
-	public MusicSheet setAudioType(String audioType) {
-	    this.audioType = audioType;
-	    return this;
+	public void setMusicSubject(String musicSubject) {
+		this.musicSubject = musicSubject;
 	}
 
 	public String getAudioType() {
-	    return this.audioType;
+		return audioType;
 	}
 
-	public MusicSheet setMusicTag(String musicTag) {
-	    this.musicTag = musicTag;
-	    return this;
+	public void setAudioType(String audioType) {
+		this.audioType = audioType;
 	}
 
 	public String getMusicTag() {
-	    return this.musicTag;
+		return musicTag;
 	}
 
-	public MusicSheet setPlaySpeed(Integer playSpeed) {
-	    this.playSpeed = playSpeed;
-	    return this;
+	public void setMusicTag(String musicTag) {
+		this.musicTag = musicTag;
 	}
 
 	public Integer getPlaySpeed() {
-	    return this.playSpeed;
+		return playSpeed;
 	}
 
-	public MusicSheet setCanEvaluate(YesOrNoEnum canEvaluate) {
-	    this.canEvaluate = canEvaluate;
-	    return this;
+	public void setPlaySpeed(Integer playSpeed) {
+		this.playSpeed = playSpeed;
 	}
 
 	public YesOrNoEnum getCanEvaluate() {
-	    return this.canEvaluate;
+		return canEvaluate;
 	}
 
-	public MusicSheet setShowFingering(YesOrNoEnum showFingering) {
-	    this.showFingering = showFingering;
-	    return this;
+	public void setCanEvaluate(YesOrNoEnum canEvaluate) {
+		this.canEvaluate = canEvaluate;
 	}
 
 	public YesOrNoEnum getShowFingering() {
-	    return this.showFingering;
+		return showFingering;
 	}
 
-	public MusicSheet setChargeType(ChargeTypeEnum chargeType) {
-	    this.chargeType = chargeType;
-	    return this;
+	public void setShowFingering(YesOrNoEnum showFingering) {
+		this.showFingering = showFingering;
 	}
 
 	public ChargeTypeEnum getChargeType() {
-	    return this.chargeType;
+		return chargeType;
+	}
+
+	public void setChargeType(ChargeTypeEnum chargeType) {
+		this.chargeType = chargeType;
+	}
+
+	public StateEnum getState() {
+		return state;
 	}
 
-	public MusicSheet setAuditStatus(AuditEnum auditStatus) {
-	    this.auditStatus = auditStatus;
-	    return this;
+	public void setState(StateEnum state) {
+		this.state = state;
 	}
 
 	public AuditEnum getAuditStatus() {
-	    return this.auditStatus;
+		return auditStatus;
 	}
 
-	public MusicSheet setSortNumber(Integer sortNumber) {
-	    this.sortNumber = sortNumber;
-	    return this;
+	public void setAuditStatus(AuditEnum auditStatus) {
+		this.auditStatus = auditStatus;
 	}
 
 	public Integer getSortNumber() {
-	    return this.sortNumber;
+		return sortNumber;
 	}
 
-	public MusicSheet setTopFlag(YesOrNoEnum topFlag) {
-	    this.topFlag = topFlag;
-	    return this;
+	public void setSortNumber(Integer sortNumber) {
+		this.sortNumber = sortNumber;
 	}
 
 	public YesOrNoEnum getTopFlag() {
-	    return this.topFlag;
+		return topFlag;
 	}
 
-	public MusicSheet setHotFlag(YesOrNoEnum hotFlag) {
-	    this.hotFlag = hotFlag;
-	    return this;
+	public void setTopFlag(YesOrNoEnum topFlag) {
+		this.topFlag = topFlag;
 	}
 
 	public YesOrNoEnum getHotFlag() {
-	    return this.hotFlag;
+		return hotFlag;
 	}
 
-	public MusicSheet setMusicPrice(java.math.BigDecimal musicPrice) {
-	    this.musicPrice = musicPrice;
-	    return this;
+	public void setHotFlag(YesOrNoEnum hotFlag) {
+		this.hotFlag = hotFlag;
 	}
 
-	public java.math.BigDecimal getMusicPrice() {
-	    return this.musicPrice;
+	public BigDecimal getMusicPrice() {
+		return musicPrice;
 	}
 
-	public MusicSheet setAudioFileUrl(String audioFileUrl) {
-	    this.audioFileUrl = audioFileUrl;
-	    return this;
+	public void setMusicPrice(BigDecimal musicPrice) {
+		this.musicPrice = musicPrice;
 	}
 
 	public String getAudioFileUrl() {
-	    return this.audioFileUrl;
+		return audioFileUrl;
 	}
 
-	public MusicSheet setXmlFileUrl(String xmlFileUrl) {
-	    this.xmlFileUrl = xmlFileUrl;
-	    return this;
+	public void setAudioFileUrl(String audioFileUrl) {
+		this.audioFileUrl = audioFileUrl;
 	}
 
 	public String getXmlFileUrl() {
-	    return this.xmlFileUrl;
+		return xmlFileUrl;
 	}
 
-	public MusicSheet setHasBeat(YesOrNoEnum hasBeat) {
-	    this.hasBeat = hasBeat;
-	    return this;
+	public void setXmlFileUrl(String xmlFileUrl) {
+		this.xmlFileUrl = xmlFileUrl;
 	}
 
 	public YesOrNoEnum getHasBeat() {
-	    return this.hasBeat;
+		return hasBeat;
 	}
 
-	public MusicSheet setCreateTime(java.util.Date createTime) {
-	    this.createTime = createTime;
-	    return this;
+	public void setHasBeat(YesOrNoEnum hasBeat) {
+		this.hasBeat = hasBeat;
 	}
 
-	public java.util.Date getCreateTime() {
-	    return this.createTime;
+	public Date getCreateTime() {
+		return createTime;
 	}
 
-	public MusicSheet setCreateBy(Long createBy) {
-	    this.createBy = createBy;
-	    return this;
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
 	}
 
 	public Long getCreateBy() {
-	    return this.createBy;
+		return createBy;
 	}
 
-	public MusicSheet setUpdateTime(java.util.Date updateTime) {
-	    this.updateTime = updateTime;
-	    return this;
+	public void setCreateBy(Long createBy) {
+		this.createBy = createBy;
 	}
 
-	public java.util.Date getUpdateTime() {
-	    return this.updateTime;
+	public Date getUpdateTime() {
+		return updateTime;
 	}
 
-	public MusicSheet setUpdateBy(Long updateBy) {
-	    this.updateBy = updateBy;
-	    return this;
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
 	}
 
 	public Long getUpdateBy() {
-	    return this.updateBy;
+		return updateBy;
 	}
 
-	public MusicSheet setRemark(String remark) {
-	    this.remark = remark;
-	    return this;
+	public void setUpdateBy(Long updateBy) {
+		this.updateBy = updateBy;
 	}
 
 	public String getRemark() {
-	    return this.remark;
+		return remark;
 	}
 
-	public StateEnum getState() {
-		return state;
+	public void setRemark(String remark) {
+		this.remark = remark;
 	}
 
-	public void setState(StateEnum state) {
-		this.state = state;
-	}
-
-	@Override
-    public String toString() {
-        return ToStringBuilder.reflectionToString(this);
-    }
-
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysConfig.java

@@ -32,6 +32,8 @@ public class SysConfig extends BaseEntity {
 	/** 修改时间 */
 	private java.util.Date modifyOn;
 	
+	private Long modifyBy;
+	
 	@ApiModelProperty(value = "消息组", required = true)
 	private String group;
 	
@@ -99,6 +101,14 @@ public class SysConfig extends BaseEntity {
 		this.group = group;
 	}
 
+	public Long getModifyBy() {
+		return modifyBy;
+	}
+
+	public void setModifyBy(Long modifyBy) {
+		this.modifyBy = modifyBy;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 11 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java

@@ -7,7 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
-import java.util.Date;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 /**
  * 视频课明细表
@@ -23,19 +25,23 @@ public class VideoLessonGroupDetail extends BaseEntity {
     private Long id;  //主键ID
 
     @TableField("video_lesson_group_id_")
-    @ApiModelProperty(value = "课程组ID")
+    @ApiModelProperty(value = "课程组ID", required = true)
+    @NotNull(message = "课程组id不能为空;")
     private Long videoLessonGroupId;  //课程组ID
 
     @TableField("video_title_")
-    @ApiModelProperty(value = "视频标题")
+    @ApiModelProperty(value = "视频标题", required = true)
+    @NotBlank(message = "课程标题不能为空;")
     private String videoTitle;  //视频标题
 
     @TableField("video_content_")
-    @ApiModelProperty(value = "视频内容")
+    @ApiModelProperty(value = "视频内容", required = true)
+    @NotBlank(message = "课程内容不能为空;")
     private String videoContent;  //视频内容
 
     @TableField("video_url_")
-    @ApiModelProperty(value = "视频文件URL")
+    @ApiModelProperty(value = "视频文件URL", required = true)
+    @NotBlank(message = "课程视频URL不能为空;")
     private String videoUrl;  //视频文件URL
 
     @TableField("cover_url_")

+ 21 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AlbumMusicRelateService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.yonge.cooleshow.biz.dal.entity.AlbumMusicRelate;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * AlbumMusicRelateService服务类
  * @author yzp
@@ -11,4 +13,23 @@ import com.baomidou.mybatisplus.extension.service.IService;
  **/
 public interface AlbumMusicRelateService extends IService<AlbumMusicRelate> {
 
+    /**
+     * 删除专辑关联曲目关系
+     *
+     * @param albumId 专辑第
+     * @param musicSheetIdList 曲目id集合
+     * @return boolean
+     */
+    boolean delMusicSheet(Long albumId, List<Long> musicSheetIdList);
+
+    /**
+     * 添加专辑关联曲目关系
+     *
+     * @param albumId 专辑第
+     * @param musicSheetIdList 曲目id集合
+     * @param userId 操作用户id
+     * @return boolean
+     */
+    boolean addMusicSheet(Long albumId, List<Long> musicSheetIdList, Long userId);
+
 }

+ 9 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -2,8 +2,11 @@ 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.CourseGroupDto;
+import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+
+import java.util.List;
 
 /**
  * 课程组表(CourseGroup)表服务接口
@@ -15,6 +18,10 @@ public interface CourseGroupService extends IService<CourseGroup> {
 
     CourseGroupDao getDao();
 
-    void add(CourseGroupDto dto);
+    /**
+     * 创建直播课程组时将课时写到缓存当作锁定的时间
+     */
+    List<CourseTimeEntity> lockCourseToCache(CheckLiveCourseTimeDto dto);
+
 }
 

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

@@ -10,6 +10,7 @@ import javax.validation.Valid;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 /**
  * 老师课程表(CourseSchedule)表服务接口
@@ -34,6 +35,53 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     PageInfo<TeacherCourseVo> queryTeacherLiveCourse(Map<String, Object> param);
 
     /**
+     * 校验该学生大于当前时间并未开始的课程时间和传入时间段有没有交集
+     *
+     * @param studentId 学生id
+     * @param startTime 新增课程 开始时间
+     * @param endTime   新增课程 结束时间
+     * @return true 被占用 false 没有被占用
+     */
+    boolean checkStudentCourseTime(Long studentId, Date startTime, Date endTime);
+
+    /**
+     * 校验老师这个时间段有没有被占用-校验课时
+     *
+     * @param teacherId 老师id
+     * @param startTime 新增课程 开始时间
+     * @param endTime   新增课程 结束时间
+     * @return true 被占用 false 没有被占用
+     */
+    boolean checkTeacherCourseTime(Long teacherId, Date startTime, Date endTime);
+
+    /**
+     * 查询这个课程列表中时间是否有重叠
+     * <p>案例:1
+     * <p>已有9:00~ 10:00 课程
+     * <p>新增课程 09:10~ 09:40
+     * <p>返回 true
+     *
+     * <p>案例:2
+     * <p>已有9:00~ 10:00 课程
+     * <p>新增课程 08:45~ 09:40
+     * <p>返回 true
+     *
+     * <p>案例:3
+     * <p>已有9:00~ 10:00 课程
+     * <p>新增课程 10:00~ 10:40
+     * <p>返回 false
+     *
+     * @param list         时间列表
+     * @param startTimeFun 获取现课程开始时间
+     * @param endTimeFun   获取现课程结束时间
+     * @param startTime    新增课程开始时间
+     * @param endTime      新增课程结束时间
+     * @return true 被占用 false 没有被占用
+     */
+    <T> boolean checkCourseTime(List<T> list, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun,
+                                Date startTime, Date endTime);
+
+    /**
      * 锁定课时
      *
      * @param id 课程id

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

@@ -57,5 +57,9 @@ public interface LiveRoomService extends IService<LiveRoom> {
      */
     List<RoomUserInfoCache> queryRoomUserInfo(String roomUid);
 
+    /**
+     * 方便测试观察房间数据的方法
+     */
+    Map<String, Object> test(String roomUid);
 }
 

+ 64 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java

@@ -1,7 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 
 /**
  * MusicAlbumService服务类
@@ -11,4 +17,62 @@ import com.baomidou.mybatisplus.extension.service.IService;
  **/
 public interface MusicAlbumService extends IService<MusicAlbum> {
 
+    /**
+     * 专辑查询
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return page
+     */
+    IPage<MusicAlbumVo> selectPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query);
+
+    /**
+     * 启用/停用 专辑
+     *
+     * @param id 专辑id
+     * @return
+     */
+    boolean state(Long id);
+
+    /**
+     * 专辑详情信息
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return AlbumDetailVo
+     */
+    AlbumDetailVo detail(IPage<MusicSheet> page, MusicAlbumDetailSearch query);
+
+    /**
+     * 删除专辑详情关联曲目
+     *
+     * @param albumId 专辑id
+     * @param musicSheetIds 曲目id
+     * @return boolean
+     */
+    boolean delMusicSheet(Long albumId, String musicSheetIds);
+
+    /**
+     * 添加专辑详情关联曲目
+     *
+     * @param albumId 专辑id
+     * @param musicSheetIds 曲目id
+     * @param userId 操作用户id
+     * @return boolean
+     */
+    boolean addMusicSheet(Long albumId, String musicSheetIds, Long userId);
+
+    /**
+     * 创建专辑
+     *
+     * @param musicAlbum 专辑对象
+     */
+    void createMusicAlbum(MusicAlbum musicAlbum);
+
+    /**
+     * 修改专辑
+     *
+     * @param musicAlbum 专辑对象
+     */
+    void updateMusicAlbum(MusicAlbum musicAlbum);
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -39,4 +40,13 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @return boolean
      */
     boolean state(Long id);
+
+    /**
+     * 获取专辑详情曲目信息
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return MusicSheet
+     */
+    IPage<MusicSheet> selectAlbumDetailPage(IPage<MusicSheet> page, MusicAlbumDetailSearch query);
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicTagService.java

@@ -7,6 +7,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicTagSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicTag;
 import com.yonge.cooleshow.biz.dal.vo.MusicTagVo;
 
+import java.util.List;
+
 /**
  * 音乐标签表 服务类
  * @author liweifan
@@ -58,4 +60,10 @@ public interface MusicTagService extends IService<MusicTag>  {
 	 */
 	void updateMusicTag(MusicTagSaveDto musicTagSaveDto);
 
+	/**
+	 * 获取标签树
+	 *
+	 * @return list
+	 */
+    List<MusicTagVo> selectMusicTagTree();
 }

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupDetailService.java

@@ -1,7 +1,14 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent;
+
+import java.util.List;
 
 /**
  * VideoLessonGroupDetailService服务类
@@ -10,5 +17,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @version v1.0
  **/
 public interface VideoLessonGroupDetailService extends IService<VideoLessonGroupDetail> {
+    IPage<VideoLessonGroupDetail> selectPage(IPage<VideoLessonGroupDetail> page, VideoLessonSearch query);
+
+    IPage<VideoLessonPurchaseStudent> selectPageStudent(IPage<VideoLessonPurchaseStudent> page, VideoLessonSearch query);
+
+    void insertVideoLesson(List<VideoLessonGroupDetail> videoLessonList, SysUser sysUser);
+
+    void updateDetail(VideoLessonGroupDetailUpVo detailUpVo, SysUser sysUser);
 
+    void deleteDetail(Long id);
 }

+ 5 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java

@@ -1,12 +1,10 @@
 package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.biz.dal.dto.search.AuthEntryRecordSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
 
 /**
@@ -16,7 +14,9 @@ import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
  * @version v1.0
  **/
 public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
-    IPage<VideoLessonGroupVo> selectPage(IPage<VideoLessonGroupVo> page, VideoLessonGroupSearch search);
+    IPage<VideoLessonGroupVo> selectPage(IPage<VideoLessonGroupVo> page, VideoLessonGroupSearch query);
 
-    VideoLessonGroupDetailVo detail(Long id);
+    void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo);
+
+    void deleteGroup(Long id);
 }

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AlbumMusicRelateServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 import com.yonge.cooleshow.biz.dal.entity.AlbumMusicRelate;
 import com.yonge.cooleshow.biz.dal.dao.AlbumMusicRelateDao;
 import com.yonge.cooleshow.biz.dal.service.AlbumMusicRelateService;
@@ -8,6 +9,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * AlbumMusicRelateService服务实现类
@@ -26,4 +32,40 @@ public class AlbumMusicRelateServiceImpl extends ServiceImpl<AlbumMusicRelateDao
     public AlbumMusicRelateDao getDao() {
         return albumMusicRelateDao;
     }
+
+    @Override
+    public boolean delMusicSheet(Long albumId, List<Long> musicSheetIdList) {
+        List<AlbumMusicRelate> list = this.lambdaQuery()
+                                          .eq(AlbumMusicRelate::getAlbumId, albumId)
+                                          .in(AlbumMusicRelate::getMusicSheetId, musicSheetIdList)
+                                          .list();
+        if (!CollectionUtils.isEmpty(list)) {
+            List<Long> albumMusicRelateIdList = list.stream().map(AlbumMusicRelate::getId).collect(Collectors.toList());
+            return this.removeByIds(albumMusicRelateIdList);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean addMusicSheet(Long albumId, List<Long> musicSheetIdList, Long userId) {
+        List<AlbumMusicRelate> list = this.lambdaQuery()
+                                          .eq(AlbumMusicRelate::getAlbumId, albumId)
+                                          .in(AlbumMusicRelate::getMusicSheetId, musicSheetIdList)
+                                          .list();
+        List<Long> musicSheetIds = list.stream().map(AlbumMusicRelate::getMusicSheetId).collect(Collectors.toList());
+
+        // 去除已有的曲目
+        List<AlbumMusicRelate> albumMusicRelateList = musicSheetIdList.stream()
+                                                                      .filter(id -> !musicSheetIds.contains(id))
+                                                                      .map(id -> {
+            AlbumMusicRelate albumMusicRelate = new AlbumMusicRelate();
+            albumMusicRelate.setAlbumId(albumId);
+            albumMusicRelate.setMusicSheetId(id);
+            albumMusicRelate.setCreateTime(new Date());
+            albumMusicRelate.setCreateBy(userId);
+            return albumMusicRelate;
+        }).collect(Collectors.toList());
+
+        return this.saveBatch(albumMusicRelateList);
+    }
 }

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

@@ -1,17 +1,40 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.constant.CourseConstant;
+import com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant;
+import com.yonge.cooleshow.biz.dal.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
-import com.yonge.cooleshow.biz.dal.dto.CourseGroupDto;
+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.service.CourseGroupService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.utils.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+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.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
 /**
  * 课程组表(CourseGroup)表服务实现类
  *
@@ -23,6 +46,15 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     private final static Logger log = LoggerFactory.getLogger(CourseGroupServiceImpl.class);
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public CourseGroupDao getDao() {
         return this.baseMapper;
@@ -30,15 +62,163 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     /**
      * 新增课程组
+     *
      * @param dto
      */
     @Transactional(rollbackFor = Exception.class)
-    @Override
-    public void add(CourseGroupDto dto){
+    public void add(LiveCourseGroupDto dto) {
+        //1.查询该老师没有用缓存的课时
+
+        //1.1 有缓存课时
+
+        //1.2 没有缓存课时
+
+    }
+
+    /**
+     * 创建直播课程组时将课时写到缓存当作锁定的时间
+     */
+    public List<CourseTimeEntity> lockCourseToCache(CheckLiveCourseTimeDto dto) {
+        //先自校验传入时间是否交集
+        List<CourseTimeEntity> timeList = dto.getTimeList();
+        if (timeList.size() > 1) {
+            for (int i = 0; i < timeList.size(); i++) {
+                if (i == timeList.size() - 1) {
+                    break;
+                }
+                CourseTimeEntity o1 = 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());
+                if (checkParamTime) {
+                    throw new BizException(DateUtil.dateToString(o1.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);
+        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);
+            allCourseTime.sort(Comparator.comparing(CourseTimeEntity::getStartTime));
+            //替换掉原有的课时
+            dto.setTimeList(allCourseTime);
+            //将自动排课后的课时写入缓存覆盖原有的
+            map.fastPut(dto.getTeacherId(), allCourseTime);
+        }
+        return dto.getTimeList();
     }
 
+    /**
+     * 老师创建直播课自动排课
+     * <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) {
+        //获取总课程数量 - 获取当前选择的课程数量 = 要自动排课的课程数量
+        int diffCourse = totalCourseNum - nowCourseNum;
+        //获取课程时间,并按开始时间排序
+        List<CourseTimeEntity> sortCourseTime = paramTimeList.stream()
+                .sorted(Comparator.comparing(CourseTimeEntity::getStartTime))
+                .collect(Collectors.toList());
+        //获取最大排课周
+        String maxWeekStr = sysConfigService.findConfigValue(SysConfigConstant.AUTO_PLANNING_COURSE_MAX_WEEK);
+        int maxWeek = 26;//默认 26周
+        if (StringUtils.isBlank(maxWeekStr)) {
+            maxWeek = Integer.parseInt(maxWeekStr);
+        }
+        int index = 0;
+        //自动补全课时
+        for (int i = 0; i < diffCourse; i++) {
+            //需要增加的周数
+            AtomicInteger week = new AtomicInteger(1);
+            //是否要一直生成课程 true 一直增加周数并生成到不冲突的时间为止
+            AtomicBoolean flag = new AtomicBoolean(true);
+            //生成课程
+            while (flag.get()) {
+                if (index == nowCourseNum) {
+                    index = 0;
+                    //进入新的循环周数+1
+                    week.getAndIncrement();
+                }
+                CourseTimeEntity timeDto = sortCourseTime.get(index);
+                if (week.get() > maxWeek) {
+                    throw new BizException("系统自动排课时发现当前时间往后" + maxWeek + "周的课程时间已排满,请手动排课!");
+                }
+                Date autoStartDate = DateUtil.addWeeks(timeDto.getStartTime(), week.get());
+                Date autoEndDate = DateUtil.addWeeks(timeDto.getEndTime(), week.get());
+
+                //true  flag = true 并且 周数+1
+                Consumer<Boolean> con = (check) -> {
+                    //check = true ,有交集延续1周后继续生成时间
+                    if (check) {
+                        week.getAndIncrement();
+                        flag.set(true);
+                    } else {
+                        flag.set(false);
+                    }
+                };
+
+                boolean checkTime;
 
+                //若:传入时间是1号10点和8号10点,然后1号10点自动生成的课时是8号10点那么就和传入的8号10点冲突了,这种情况需要继续往后延续1周
+                checkTime = courseScheduleService.checkCourseTime(sortCourseTime, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, autoStartDate, autoEndDate);
+                con.accept(checkTime);
+                //如果和传入时间冲突则跳过
+                if (flag.get()) {
+                    continue;
+                }
 
+                //校验当前生成时间是否和未来的课程时间是否交集
+                checkTime = courseScheduleService.checkTeacherCourseTime(teacherId, autoStartDate, autoEndDate);
+                con.accept(checkTime);
+                //如果和未来时间冲突则跳过
+                if (flag.get()) {
+                    continue;
+                }
+
+                //将自动生成时间收入集合
+                CourseTimeEntity autoTimeDto = new CourseTimeEntity();
+                autoTimeDto.setStartTime(autoStartDate);
+                autoTimeDto.setEndTime(autoEndDate);
+                sortCourseTime.add(autoTimeDto);
+            }
+            index++;
+        }
+        return sortCourseTime;
+    }
+
+    private SysUser getSysUser(Long userId) {
+        return Optional.ofNullable(userId)
+                .map(sysUserFeignService::queryUserById)
+                .orElseThrow(() -> new BizException("用户不存在"));
+    }
+
+    private SysUser getSysUser() {
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户不存在"));
+    }
 }
 

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

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -18,7 +17,6 @@ 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.collections.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +31,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 
 /**
  * 老师课程表(CourseSchedule)表服务实现类
@@ -100,7 +99,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String ymd = DateUtil.format(startTime, DateUtil.DEFAULT_PATTERN);
         //查询大于当前时间并未开始的课程
         List<CourseSchedule> list = baseMapper.queryStudentCourse(studentId, ymd);
-        return checkCourseTime(list, startTime, endTime);
+        return checkCourseTime(list, CourseSchedule::getStartTime, CourseSchedule::getEndTime, startTime, endTime);
     }
 
     /**
@@ -120,7 +119,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<CourseSchedule> list = this.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getTeacherId, teacherId)
                 .eq(CourseSchedule::getClassDate, ymd));
-        return checkCourseTime(list, startTime, endTime);
+        return checkCourseTime(list, CourseSchedule::getStartTime, CourseSchedule::getEndTime, startTime, endTime);
     }
 
     /**
@@ -140,12 +139,15 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * <p>新增课程 10:00~ 10:40
      * <p>返回 false
      *
-     * @param list      课程列表
-     * @param startTime 新增课程 开始时间
-     * @param endTime   新增课程 结束时间
+     * @param list         时间列表
+     * @param startTimeFun 获取现课程开始时间
+     * @param endTimeFun   获取现课程结束时间
+     * @param startTime    新增课程开始时间
+     * @param endTime      新增课程结束时间
      * @return true 被占用 false 没有被占用
      */
-    public boolean checkCourseTime(List<CourseSchedule> list, Date startTime, Date endTime) {
+    public <T> boolean checkCourseTime(List<T> list, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun,
+                                       Date startTime, Date endTime) {
         WrapperUtil.checkObj(startTime, "开始时间不能为空!");
         WrapperUtil.checkObj(endTime, "结束时间不能为空!");
         // 如果没有课程,直接返回false
@@ -154,8 +156,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         boolean result;
         //匹配时间是否有交集
-        for (CourseSchedule course : list) {
-            result = WrapperUtil.inInterSection(course.getStartTime(), course.getEndTime(), startTime, endTime);
+        for (T t : list) {
+            result = WrapperUtil.inInterSection(startTimeFun.apply(t), endTimeFun.apply(t), startTime, endTime);
             if (result) {
                 return true;
             }

+ 71 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
+import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
@@ -483,5 +484,75 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         return roomUserInfoCaches.size();
     }
 
+    /**
+     * 方便测试观察房间数据的方法
+     */
+    public Map<String, Object> test(String roomUid) {
+        //result
+        Map<String, Object> result = new HashMap<>();
+        //模拟排课数据 测试用
+        CheckLiveCourseTimeDto dto = new CheckLiveCourseTimeDto();
+        dto.setTeacherId(99L);
+        dto.setCourseNum(6);
+        dto.setLoop(1);
+
+        List<CourseTimeEntity> timeList = new ArrayList<>();
+        CourseTimeEntity c1 = new CourseTimeEntity();
+        c1.setStartTime(DateUtil.stringToDate("2022-04-01 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        c1.setEndTime(DateUtil.stringToDate("2022-04-01 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        CourseTimeEntity c2 = new CourseTimeEntity();
+        c2.setStartTime(DateUtil.stringToDate("2022-04-08 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        c2.setEndTime(DateUtil.stringToDate("2022-04-08 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        CourseTimeEntity c3 = new CourseTimeEntity();
+        c3.setStartTime(DateUtil.stringToDate("2022-04-02 09:00:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        c3.setEndTime(DateUtil.stringToDate("2022-04-02 09:30:00", DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        timeList.add(c3);
+        timeList.add(c1);
+        timeList.add(c2);
+        dto.setTimeList(timeList);
+        List<CourseTimeEntity> courseTimeEntities = courseGroupService.lockCourseToCache(dto);
+        result.put("自动生成课时", courseTimeEntities);
+
+        //获取房间信息
+        RBucket<RoomInfoCache> speakerCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
+        if (speakerCache.isExists()) {
+            result.put("房间信息信息", speakerCache.get());
+        } else {
+            result.put("房间信息", "房间信息不存在");
+        }
+
+        //点赞数
+        Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
+        if (Objects.isNull(like)) {
+            like = 0;
+        }
+        result.put("点赞数", like);
+
+        int totalLook = 0;
+        int look = 0;
+        List<RoomUserInfoCache> inRoomUserInfo;
+
+        //累计总观看的用户数量
+        List<RoomUserInfoCache> totalUserInfo = queryTotalRoomUserInfo(roomUid);
+        if (CollectionUtils.isNotEmpty(totalUserInfo)) {
+            //正在房间观看的用户数据
+            inRoomUserInfo = queryRoomUserInfo(totalUserInfo);
+            if (CollectionUtils.isNotEmpty(inRoomUserInfo)) {
+                look = inRoomUserInfo.size();
+                result.put("正在观看的人员信息", inRoomUserInfo);
+            } else {
+                result.put("正在观看的人员信息", "没有正在观看的人员数据");
+            }
+            totalLook = totalUserInfo.size();
+            result.put("总人员数据", totalUserInfo);
+        } else {
+            result.put("总人员数据", "没有人员数据");
+        }
+
+        result.put("总观看人数", totalLook);
+        result.put("实时观看数", look);
+        return result;
+    }
+
 }
 

+ 102 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java

@@ -1,14 +1,31 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.entity.MusicTag;
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.AlbumMusicRelateService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.List;
+
 /**
  * MusicAlbumService服务实现类
  * @author yzp
@@ -23,7 +40,92 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     @Autowired
     private MusicAlbumDao musicAlbumDao;
 
+    @Autowired
+    private AlbumMusicRelateService albumMusicRelateService;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
     public MusicAlbumDao getDao() {
         return musicAlbumDao;
     }
+
+    @Override
+    public IPage<MusicAlbumVo> selectPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query) {
+        return page.setRecords(baseMapper.selectPage(page,query));
+    }
+
+    @Override
+    public boolean state(Long id) {
+        MusicAlbum musicAlbum = this.getById(id);
+        if (musicAlbum == null) {
+            throw  new BizException("未找到专辑信息");
+        }
+        if (StateEnum.STOP.getCode().equals(musicAlbum.getAlbumStatus().getCode())) {
+            musicAlbum.setAlbumStatus(StateEnum.ENABLE);
+        } else {
+            musicAlbum.setAlbumStatus(StateEnum.STOP);
+        }
+        return this.updateById(musicAlbum);
+    }
+
+    @Override
+    public AlbumDetailVo detail(IPage<MusicSheet> page, MusicAlbumDetailSearch query) {
+        MusicAlbum musicAlbum = this.getById(query.getId());
+        if (musicAlbum == null) {
+            throw  new BizException("未找到专辑信息");
+        }
+        AlbumDetailVo albumDetailVo = new AlbumDetailVo();
+        albumDetailVo.setId(musicAlbum.getId());
+        albumDetailVo.setAlbumName(musicAlbum.getAlbumName());
+
+        IPage<MusicSheet> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);
+        albumDetailVo.setMusicSheetList(Condition.pageInfo(musicSheetVoIPage));
+        return albumDetailVo;
+    }
+
+    @Override
+    public boolean delMusicSheet(Long albumId, String musicSheetIds) {
+        MusicAlbum musicAlbum = this.getById(albumId);
+        if (musicAlbum == null) {
+            throw  new BizException("未找到专辑信息");
+        }
+        List<Long> musicSheetIdList = StringUtil.toLongList(musicSheetIds);
+        return albumMusicRelateService.delMusicSheet(albumId,musicSheetIdList);
+    }
+
+    @Override
+    public boolean addMusicSheet(Long albumId, String musicSheetIds, Long userId) {
+        MusicAlbum musicAlbum = this.getById(albumId);
+        if (musicAlbum == null) {
+            throw  new BizException("未找到专辑信息");
+        }
+        List<Long> musicSheetIdList = StringUtil.toLongList(musicSheetIds);
+        return albumMusicRelateService.addMusicSheet(albumId,musicSheetIdList,userId);
+    }
+
+    @Override
+    public void createMusicAlbum(MusicAlbum musicAlbum) {
+        if (checkNameRepeat(musicAlbum.getAlbumName(),musicAlbum.getId())) {
+            throw new BizException("专辑名称重复");
+        }
+        this.save(musicAlbum);
+    }
+
+    @Override
+    public void updateMusicAlbum(MusicAlbum musicAlbum) {
+        if (checkNameRepeat(musicAlbum.getAlbumName(),musicAlbum.getId())) {
+            throw new BizException("专辑名称重复");
+        }
+        this.updateById(musicAlbum);
+    }
+
+    private boolean checkNameRepeat(String albumName, Long id) {
+        LambdaQueryChainWrapper<MusicAlbum> eq = this.lambdaQuery()
+                                                   .eq(MusicAlbum::getAlbumName, albumName);
+        if (id != null) {
+            eq.ne(MusicAlbum::getId,id);
+        }
+        return eq.count() != 0;
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetAccompanimentDao;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
@@ -13,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetAccompanimentService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.common.exception.BizException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -54,6 +56,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         musicSheet.setAuditStatus(AuditEnum.AUDITING);
         musicSheet.setCreateBy(sysUser.getId());
         musicSheet.setUserId(sysUser.getId());
+        musicSheet.setUserId(0L);
+        musicSheet.setState(StateEnum.STOP);
         musicSheet.setCreateTime(new Date());
         int count = musicSheetDao.insert(musicSheet);
 
@@ -75,6 +79,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Override
     public boolean state(Long id) {
         MusicSheet musicSheet = this.getById(id);
+        if (musicSheet == null) {
+            throw  new BizException("未找到曲目信息");
+        }
         if (StateEnum.STOP.getCode().equals(musicSheet.getState().getCode())) {
             musicSheet.setState(StateEnum.ENABLE);
         } else {
@@ -83,4 +90,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         return this.updateById(musicSheet);
 
     }
+
+    @Override
+    public IPage<MusicSheet> selectAlbumDetailPage(IPage<MusicSheet> page, MusicAlbumDetailSearch query) {
+        return page.setRecords(baseMapper.selectAlbumDetailPage(page, query));
+    }
 }

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

@@ -16,13 +16,11 @@ import com.yonge.cooleshow.biz.dal.service.MusicTagService;
 import com.yonge.cooleshow.biz.dal.vo.MusicTagVo;
 import com.yonge.cooleshow.common.exception.BizException;
 import jodd.util.StringUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -162,5 +160,38 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         this.updateById(musicTag);
     }
 
+    @Override
+    public List<MusicTagVo> selectMusicTagTree() {
+        List<MusicTag> list = this.lambdaQuery()
+                .eq(MusicTag::getDelFlag,YesOrNoEnum.NO.getCode())
+                .eq(MusicTag::getState,StateEnum.ENABLE.getCode())
+                .list();
+        if (list == null) {
+            return new ArrayList<>();
+        }
+        List<MusicTagVo> musicTagVoList = list.stream().map(musicTag -> {
+            MusicTagVo musicTagVo = new MusicTagVo();
+            BeanUtils.copyProperties(musicTag, musicTagVo);
+            return musicTagVo;
+        }).collect(Collectors.toList());
+
+        List<MusicTagVo> tree = new ArrayList<>();
+        for (MusicTagVo musicTagVo : musicTagVoList) {
+            if (musicTagVo.getParentTagId() == null || musicTagVo.getParentTagId() == 0) {
+                tree.add(musicTagVo);
+            }
+            for (MusicTagVo tagVo : musicTagVoList) {
+                if (tagVo.getParentTagId() != null && tagVo.getParentTagId() != 0
+                        && tagVo.getParentTagId().equals(musicTagVo.getId())) {
+                    if (musicTagVo.getChildren() == null) {
+                        musicTagVo.setChildren(new ArrayList<>());
+                    }
+                    musicTagVo.getChildren().add(tagVo);
+                }
+            }
+        }
+        return tree;
+    }
+
 
 }

+ 108 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupDetailServiceImpl.java

@@ -1,13 +1,27 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDetailDao;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * VideoLessonGroupDetailService服务实现类
@@ -22,8 +36,102 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
 
     @Autowired
     private VideoLessonGroupDetailDao videoLessonGroupDetailDao;
+    @Autowired
+    private VideoLessonGroupDao videoLessonGroupDao;
 
     public VideoLessonGroupDetailDao getDao() {
         return videoLessonGroupDetailDao;
     }
+
+    /**
+    * @Description: 查询视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @Override
+    public IPage<VideoLessonGroupDetail> selectPage(IPage<VideoLessonGroupDetail> page, VideoLessonSearch query) {
+        return page.setRecords(baseMapper.selectPage(page,query));
+    }
+
+    /**
+    * @Description: 根据组id查询购买用户
+    * @Author: cy
+    * @Date: 2022/4/1
+    */
+    @Override
+    public IPage<VideoLessonPurchaseStudent> selectPageStudent(IPage<VideoLessonPurchaseStudent> page, VideoLessonSearch query) {
+        return page.setRecords(baseMapper.selectPageStudent(page,query));
+    }
+
+    /**
+    * @Description: 新增视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void insertVideoLesson(List<VideoLessonGroupDetail> videoLessonList, SysUser sysUser) {
+        Set<Long> synSet = Collections.synchronizedSet(new HashSet<>());
+        for (VideoLessonGroupDetail detail : videoLessonList) {
+            detail.setTeacherId(sysUser.getId());
+            synSet.add(detail.getVideoLessonGroupId());
+        }
+        if (synSet.size()!=1){
+            throw new RuntimeException("创建课程必须属于同组");
+        }
+
+        VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(synSet.iterator().next());
+        if (lessonGroup==null){
+            throw new RuntimeException("视频课组不存在");
+        }
+
+        //添加课程
+        videoLessonGroupDetailDao.insertVideoLesson(videoLessonList);
+        //刷新统计
+        refreshLessonCount(synSet.iterator().next());
+    }
+
+    /**
+    * @Description: 修改视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateDetail(VideoLessonGroupDetailUpVo detailUpVo, SysUser sysUser) {
+        //跟新课程
+        detailUpVo.setUpdateBy(sysUser.getId());
+        videoLessonGroupDetailDao.updateDetail(detailUpVo);
+
+        //刷新统计
+        if (detailUpVo.getVideoLessonGroupId()!=null){
+            refreshLessonCount(detailUpVo.getVideoLessonGroupId());
+        }
+    }
+
+    /**
+    * @Description: 删除视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteDetail(Long id) {
+        VideoLessonGroupDetail videoLessonDetail = videoLessonGroupDetailDao.selectById(id);
+        if (videoLessonDetail !=null){
+            videoLessonGroupDetailDao.deleteById(id);
+            refreshLessonCount(videoLessonDetail.getVideoLessonGroupId());
+        }
+    }
+
+    /**
+    * @Description: 刷新组内lesson_count_
+    * @Author: cy 
+    * @Date: 2022/3/31 
+    */
+    public void refreshLessonCount(Long groupId){
+        VideoLessonGroupUpVo groupUpVo = new VideoLessonGroupUpVo();
+        groupUpVo.setId(groupId);
+        videoLessonGroupDao.updateGroup(groupUpVo);
+    }
 }

+ 32 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java

@@ -1,17 +1,19 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDetailDao;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * VideoLessonGroupService服务实现类
@@ -26,21 +28,43 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
 
     @Autowired
     private VideoLessonGroupDao videoLessonGroupDao;
+    @Autowired
+    private VideoLessonGroupDetailDao videoLessonGroupDetailDao;
 
     public VideoLessonGroupDao getDao() {
         return videoLessonGroupDao;
     }
 
+    /**
+    * @Description: 查询视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @Override
+    public IPage<VideoLessonGroupVo> selectPage(IPage<VideoLessonGroupVo> page, VideoLessonGroupSearch query) {
+        return page.setRecords(baseMapper.selectPage(page,query));
+    }
+
+    /**
+    * @Description: 修改视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
     @Override
-    public IPage<VideoLessonGroupVo> selectPage(IPage<VideoLessonGroupVo> page, VideoLessonGroupSearch search) {
-        return page.setRecords(baseMapper.selectPage(page,search));
+    @Transactional(rollbackFor = Exception.class)
+    public void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo) {
+        videoLessonGroupDao.updateGroup(lessonGroupUpVo);
     }
 
+    /**
+    * @Description: 删除视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
     @Override
-    public VideoLessonGroupDetailVo detail(Long id) {
-        VideoLessonGroupDetailVo detailVo = new VideoLessonGroupDetailVo();
-        detailVo.setGroupDetailList(videoLessonGroupDao.selectDetail(id));
-        detailVo.setPurchaseStudent(videoLessonGroupDao.selectStudent(id));
-        return detailVo;
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteGroup(Long id) {
+        videoLessonGroupDao.deleteById(id);
+        videoLessonGroupDetailDao.deleteByGroupId(id);
     }
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/AddGroup.java

@@ -0,0 +1,8 @@
+package com.yonge.cooleshow.biz.dal.valid;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+public interface AddGroup {
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/DeleteGroup.java

@@ -0,0 +1,8 @@
+package com.yonge.cooleshow.biz.dal.valid;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+public interface DeleteGroup {
+}

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/ListValue.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.valid;
+
+import com.yonge.cooleshow.biz.dal.valid.impl.ListValueValidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+@Documented
+@Constraint(validatedBy = {ListValueValidator.class})
+@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
+@Retention(RUNTIME)
+public @interface ListValue {
+    String message() default "必须提交指定的值";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    int[] vals() default {};
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/UpdateGroup.java

@@ -0,0 +1,8 @@
+package com.yonge.cooleshow.biz.dal.valid;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+public interface UpdateGroup {
+}

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/impl/ListValueValidator.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.biz.dal.valid.impl;
+
+import com.yonge.cooleshow.biz.dal.valid.ListValue;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+public class ListValueValidator implements ConstraintValidator<ListValue, Integer> {
+    private Set<Integer> set = new HashSet<>();
+
+    @Override
+    public void initialize(ListValue constraintAnnotation) {
+        int[] vals = constraintAnnotation.vals();
+        for (int val : vals) {
+            set.add(null);
+            set.add(val);
+        }
+    }
+
+    @Override
+    public boolean isValid(Integer value, ConstraintValidatorContext context) {
+        if (value==null){
+            return true;
+        }
+        return set.contains(value);
+    }
+}

+ 138 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/valid/impl/ValidList.java

@@ -0,0 +1,138 @@
+package com.yonge.cooleshow.biz.dal.valid.impl;
+
+import javax.validation.Valid;
+import java.util.*;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 09:54
+ */
+public class ValidList<E> implements List<E> {
+
+    @Valid
+    private List<E> list = new LinkedList<>();
+
+    @Override
+    public int size() {
+        return list.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return list.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return list.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return list.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+        return list.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+        return list.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return list.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return list.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+        return list.addAll(c);
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends E> c) {
+        return list.addAll(index, c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return list.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return list.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        list.clear();
+    }
+
+    @Override
+    public E get(int index) {
+        return list.get(index);
+    }
+
+    @Override
+    public E set(int index, E element) {
+        return list.set(index, element);
+    }
+
+    @Override
+    public void add(int index, E element) {
+        list.add(index, element);
+    }
+
+    @Override
+    public E remove(int index) {
+        return list.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return list.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return list.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<E> listIterator() {
+        return list.listIterator();
+    }
+
+    @Override
+    public ListIterator<E> listIterator(int index) {
+        return list.listIterator(index);
+    }
+
+    @Override
+    public List<E> subList(int fromIndex, int toIndex) {
+        return list.subList(fromIndex, toIndex);
+    }
+
+    public List<E> getList() {
+        return list;
+    }
+
+    public void setList(List<E> list) {
+        this.list = list;
+    }
+
+}

+ 48 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java

@@ -0,0 +1,48 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.common.page.PageInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 专辑详情展示信息
+ *
+ * @author: liujunchi
+ * @date: 2022-03-31
+ */
+public class AlbumDetailVo {
+
+    @ApiModelProperty(value = "主键id")
+    private Long id;
+
+    @ApiModelProperty(value = "专辑名称")
+    private String albumName;
+
+    @ApiModelProperty("专辑详情曲目")
+    private PageInfo<MusicSheet> musicSheetList;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAlbumName() {
+        return albumName;
+    }
+
+    public void setAlbumName(String albumName) {
+        this.albumName = albumName;
+    }
+
+    public PageInfo<MusicSheet> getMusicSheetList() {
+        return musicSheetList;
+    }
+
+    public void setMusicSheetList(PageInfo<MusicSheet> musicSheetList) {
+        this.musicSheetList = musicSheetList;
+    }
+}

+ 36 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 专辑查询展示
+ *
+ * @author: liujunchi
+ * @date: 2022-03-31
+ */
+public class MusicAlbumVo extends MusicAlbum {
+
+    @ApiModelProperty("教材标签")
+    private String musicTagNames;
+
+    @ApiModelProperty("曲目数量")
+    private Integer musicSheetCount;
+
+
+    public String getMusicTagNames() {
+        return musicTagNames;
+    }
+
+    public void setMusicTagNames(String musicTagNames) {
+        this.musicTagNames = musicTagNames;
+    }
+
+    public Integer getMusicSheetCount() {
+        return musicSheetCount;
+    }
+
+    public void setMusicSheetCount(Integer musicSheetCount) {
+        this.musicSheetCount = musicSheetCount;
+    }
+}

+ 107 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupDetailUpVo.java

@@ -0,0 +1,107 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.biz.dal.valid.AddGroup;
+import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 11:39
+ */
+@ApiModel(value = "VideoLessonGroupDetailUpVo视频课")
+public class VideoLessonGroupDetailUpVo extends BaseEntity {
+
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键id")
+    @NotNull(message = "视频课id不能为空")
+	private Long id;
+
+    @TableField("video_lesson_group_id_")
+    @ApiModelProperty(value = "课程组ID")
+    private Long videoLessonGroupId;
+
+    @TableField("video_title_")
+    @ApiModelProperty(value = "视频标题")
+    private String videoTitle;
+
+    @TableField("video_content_")
+    @ApiModelProperty(value = "视频内容")
+    private String videoContent;
+
+    @TableField("video_url_")
+    @ApiModelProperty(value = "视频文件URL")
+    private String videoUrl;
+
+    @TableField("cover_url_")
+    @ApiModelProperty(value = "视频封面图片URL")
+    private String coverUrl;
+
+    @TableField("update_by_")
+    @ApiModelProperty(value = "更新人")
+    private Long updateBy;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getVideoLessonGroupId() {
+        return videoLessonGroupId;
+    }
+
+    public void setVideoLessonGroupId(Long videoLessonGroupId) {
+        this.videoLessonGroupId = videoLessonGroupId;
+    }
+
+    public String getVideoTitle() {
+        return videoTitle;
+    }
+
+    public void setVideoTitle(String videoTitle) {
+        this.videoTitle = videoTitle;
+    }
+
+    public String getVideoContent() {
+        return videoContent;
+    }
+
+    public void setVideoContent(String videoContent) {
+        this.videoContent = videoContent;
+    }
+
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    public String getCoverUrl() {
+        return coverUrl;
+    }
+
+    public void setCoverUrl(String coverUrl) {
+        this.coverUrl = coverUrl;
+    }
+
+    public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+}

+ 0 - 33
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupDetailVo.java

@@ -1,33 +0,0 @@
-package com.yonge.cooleshow.biz.dal.vo;
-
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.util.List;
-
-@ApiModel(value = "VideoLessonGroupDetailVo对象", description = "视频课组详情")
-public class VideoLessonGroupDetailVo{
-
-    @ApiModelProperty(value = "组内课程")
-    private List<VideoLessonGroupDetail> groupDetailList;
-
-    @ApiModelProperty(value = "购买学生")
-    private List<VideoLessonPurchaseStudent> purchaseStudent;
-
-    public List<VideoLessonGroupDetail> getGroupDetailList() {
-        return groupDetailList;
-    }
-
-    public void setGroupDetailList(List<VideoLessonGroupDetail> groupDetailList) {
-        this.groupDetailList = groupDetailList;
-    }
-
-    public List<VideoLessonPurchaseStudent> getPurchaseStudent() {
-        return purchaseStudent;
-    }
-
-    public void setPurchaseStudent(List<VideoLessonPurchaseStudent> purchaseStudent) {
-        this.purchaseStudent = purchaseStudent;
-    }
-}

+ 139 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupUpVo.java

@@ -0,0 +1,139 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.valid.ListValue;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author: cy
+ * @date: 2022/3/31 11:32
+ */
+@ApiModel(value = "VideoLessonGroupUpVo对象", description = "视频课组")
+public class VideoLessonGroupUpVo extends BaseEntity {
+
+    @ApiModelProperty(value = "主键id")
+    @NotNull(message = "视频组id不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "课程名称")
+    private String lessonName;
+
+    @ApiModelProperty(value = "课程声部")
+    private String lessonSubject;
+
+    @ApiModelProperty(value = "课程介绍")
+    private String lessonDesc;
+
+    @ApiModelProperty(value = "课程价格")
+    private Integer lessonPrice;
+
+    @ApiModelProperty(value = "课程封面图片URL")
+    private String lessonCoverUrl;
+
+    @ApiModelProperty(value = "排序号")
+    private Integer sortNumber;
+
+    @ApiModelProperty(value = "课程标签")
+    private String lessonTag;
+
+    @ApiModelProperty(value = "是否置顶")
+    private Integer topFlag;
+
+    @ApiModelProperty(value = "是否热门课程")
+    private Integer hotFlag;
+
+    @ApiModelProperty(value = "审核状态(0:待审核;1:通过;2:未通过)")
+    @ListValue(vals = {0, 1, 2}, message = "审核状态必须提交指定值")
+    private Integer auditStatus;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLessonName() {
+        return lessonName;
+    }
+
+    public void setLessonName(String lessonName) {
+        this.lessonName = lessonName;
+    }
+
+    public String getLessonSubject() {
+        return lessonSubject;
+    }
+
+    public void setLessonSubject(String lessonSubject) {
+        this.lessonSubject = lessonSubject;
+    }
+
+    public String getLessonDesc() {
+        return lessonDesc;
+    }
+
+    public void setLessonDesc(String lessonDesc) {
+        this.lessonDesc = lessonDesc;
+    }
+
+    public Integer getLessonPrice() {
+        return lessonPrice;
+    }
+
+    public void setLessonPrice(Integer lessonPrice) {
+        this.lessonPrice = lessonPrice;
+    }
+
+    public String getLessonCoverUrl() {
+        return lessonCoverUrl;
+    }
+
+    public void setLessonCoverUrl(String lessonCoverUrl) {
+        this.lessonCoverUrl = lessonCoverUrl;
+    }
+
+    public Integer getSortNumber() {
+        return sortNumber;
+    }
+
+    public void setSortNumber(Integer sortNumber) {
+        this.sortNumber = sortNumber;
+    }
+
+    public String getLessonTag() {
+        return lessonTag;
+    }
+
+    public void setLessonTag(String lessonTag) {
+        this.lessonTag = lessonTag;
+    }
+
+    public Integer getTopFlag() {
+        return topFlag;
+    }
+
+    public void setTopFlag(Integer topFlag) {
+        this.topFlag = topFlag;
+    }
+
+    public Integer getHotFlag() {
+        return hotFlag;
+    }
+
+    public void setHotFlag(Integer hotFlag) {
+        this.hotFlag = hotFlag;
+    }
+
+    public Integer getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(Integer auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonGroupVo.java

@@ -4,6 +4,10 @@ import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+/**
+ * @author: cy
+ * @date: 2022/3/31 11:39
+ */
 @ApiModel(value = "VideoLessonGroupVo对象", description = "视频课组列表")
 public class VideoLessonGroupVo extends VideoLessonGroup {
 

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

@@ -1,12 +1,17 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
+/**
+ * @author: cy
+ * @date: 2022/3/30 11:39
+ */
 @ApiModel(value = "VideoLessonPurchaseStudent对象")
-public class VideoLessonPurchaseStudent {
+public class VideoLessonPurchaseStudent extends BaseEntity {
     @ApiModelProperty("头像地址")
     private String avatar;
 

+ 52 - 23
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -1,28 +1,57 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
-    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao">
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.MusicAlbum">
+        <id column="id_" jdbcType="BIGINT" property="id"/>
+        <result column="album_name_" jdbcType="VARCHAR" property="albumName"/>
+        <result column="album_desc_" jdbcType="VARCHAR" property="albumDesc"/>
+        <result column="album_tag_" jdbcType="VARCHAR" property="albumTag"/>
+        <result column="album_cover_url_" jdbcType="VARCHAR" property="albumCoverUrl"/>
+        <result column="album_status_" jdbcType="TINYINT" property="albumStatus"/>
+        <result column="sort_number_" jdbcType="INTEGER" property="sortNumber"/>
+        <result column="hot_flag_" jdbcType="TINYINT" property="hotFlag"/>
+        <result column="top_flag_" jdbcType="TINYINT" property="topFlag"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="create_by_" jdbcType="BIGINT" property="createBy"/>
+        <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="update_by_" jdbcType="BIGINT" property="updateBy"/>
+    </resultMap>
 
-	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.MusicAlbum">
-	     <id column="id_" jdbcType="BIGINT" property="id" />
-		 <result column="album_name_" jdbcType="VARCHAR" property="albumName" />
-		 <result column="album_desc_" jdbcType="VARCHAR" property="albumDesc" />
-		 <result column="album_tag_" jdbcType="VARCHAR" property="albumTag" />
-		 <result column="album_cover_url_" jdbcType="VARCHAR" property="albumCoverUrl" />
-		 <result column="album_status_" jdbcType="TINYINT" property="albumStatus" />
-		 <result column="sort_number_" jdbcType="INTEGER" property="sortNumber" />
-		 <result column="hot_flag_" jdbcType="TINYINT" property="hotFlag" />
-		 <result column="top_flag_" jdbcType="TINYINT" property="topFlag" />
-		 <result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
-		 <result column="create_by_" jdbcType="BIGINT" property="createBy" />
-		 <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
-		 <result column="update_by_" jdbcType="BIGINT" property="updateBy" />
-	</resultMap>
-
-	<sql id="Base_Column_List">
-		id_, album_name_, album_desc_, album_tag_, album_cover_url_, album_status_, sort_number_, hot_flag_, top_flag_, create_time_, create_by_, update_time_, update_by_
-	</sql>
-
-
+    <sql id="Base_Column_List">
+        t.id_,
+        t.album_name_,
+        t.album_desc_,
+        t.album_tag_,
+        t.album_cover_url_,
+        t.album_status_,
+        t.sort_number_,
+        t.hot_flag_,
+        t.top_flag_,
+        t.create_time_,
+        t.create_by_,
+        t.update_time_,
+        t.update_by_
+    </sql>
 
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
+        select <include refid="Base_Column_List"/>
+        ,(select group_concat(mt.name_) from music_tag mt
+            where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0) as musicTagNames
+        , t1.num as musicSheetCount
+        from music_album t
+        left join (select count(1) as num,amr.album_id_ from album_music_relate amr group by amr.album_id_) t1 on t1.album_id_ = t.id_
+        <where>
+            <if test="query.idAndName != null and query.idAndName != ''">
+                and (t.id_ like concat('%',#{query.idAndName},'%') or
+                    t.album_name_ like concat('%',#{query.idAndName},'%'))
+            </if>
+            <if test="query.albumTagIdList != null and query.albumTagIdList != ''">
+                and
+                <foreach collection="query.albumTagIdList" separator="and" item="item">
+                    find_in_set(#{item},t.album_tag_)
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>

+ 49 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -60,23 +60,67 @@
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
         select <include refid="Base_Column_List"/>
         ,su.username_ as addName
-        ,(select group_concat(mt.name_,',') from music_tag mt where mt.id_ in ( t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
-        ,(select group_concat(s.name_,',') from subject s where s.id_ in ( t.music_subject_ )) as subjectNames
+        ,(select group_concat(mt.name_) from music_tag mt
+            where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
+        ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
         from music_sheet t
         left join sys_user su on t.create_by_ = su.id_
         <where>
             <if test="param.idAndName != null and param.idAndName != ''">
-                and t.id_ like concat('%',#{param.idAndName},'%')
+                and (t.id_ like concat('%',#{param.idAndName},'%') or
+                t.music_sheet_name_ like concat('%',#{param.idAndName},'%'))
             </if>
             <if test="param.musicTagIds != null and param.musicTagIds != ''">
-                and t.music_tag_ like concat('%',#{param.musicTagIds},'%')
+                and
+                <foreach collection="param.musicTagIdList" separator="and" item="item">
+                    find_in_set(#{item},t.music_tag_)
+                </foreach>
             </if>
             <if test="param.subjectIds != null and param.subjectIds != ''">
-                and t.music_subject_ like concat('%',#{param.subjectIds},'%')
+                and
+                <foreach collection="param.subjectIdList" separator="and" item="item">
+                    find_in_set(#{item},t.music_subject_)
+                </foreach>
             </if>
             <if test="param.state != null">
                 and t.state_ = #{param.state}
             </if>
         </where>
     </select>
+
+    <select id="selectAlbumDetailPage" resultType="com.yonge.cooleshow.biz.dal.entity.MusicSheet">
+        select <include refid="Base_Column_List"/>
+        from music_sheet t
+        left join album_music_relate amr on t.id_ = amr.music_sheet_id_
+        <where>
+            <if test="param.idAndName != null and param.idAndName != ''">
+                and (t.id_ like concat('%',#{param.idAndName},'%') or
+                t.music_sheet_name_ like concat('%',#{param.idAndName},'%'))
+            </if>
+            <if test="param.musicTagIds != null and param.musicTagIds != ''">
+                and
+                <foreach collection="param.musicTagIdList" separator="and" item="item">
+                    find_in_set(#{item},t.music_tag_)
+                </foreach>
+            </if>
+            <if test="param.subjectIds != null and param.subjectIds != ''">
+                and
+                <foreach collection="param.subjectIdList" separator="and" item="item">
+                    find_in_set(#{item},t.music_subject_)
+                </foreach>
+            </if>
+            <if test="param.state != null">
+                and t.state_ = #{param.state}
+            </if>
+            <if test="param.id != null">
+                <if test="param.type == 2">
+                    and amr.album_id_ = #{param.id}
+                    order by amr.create_time_
+                </if>
+                <if test="param.type == 1">
+                    and (amr.album_id_ &lt;&gt;  #{param.id} or amr.album_id_ is null)
+                </if>
+            </if>
+        </where>
+    </select>
 </mapper>

+ 11 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml

@@ -83,7 +83,15 @@
 	</select>
 
     <select id="findByParentId" resultMap="Subject">
-        SELECT * FROM subject <include refid="querySubPageSql"/>
+        SELECT * FROM subject
+        <where>
+            <if test="parentId != null">
+                AND parent_subject_id_ = #{parentId}
+            </if>
+            <if test="delFlag != null">
+                AND del_flag_ = #{delFlag,typeHandler=com.yonge.cooleshow.common.dal.CustomEnumTypeHandler}
+            </if>
+        </where>
     </select>
 
     <select id="queryNameByIds" resultType="java.util.Map">
@@ -98,10 +106,10 @@
             <if test="delFlag != null">
                 AND del_flag_ = #{delFlag,typeHandler=com.yonge.cooleshow.common.dal.CustomEnumTypeHandler}
             </if>
-            <if test="queryType == 'category'">
+            <if test="queryType != null and queryType == 'category'">
             	and (parent_subject_id_ = 0 or parent_subject_id_ is null)
             </if>
-            <if test="queryType == 'list'">
+            <if test="queryType != null and queryType == 'list'">
             	and parent_subject_id_ > 0
             </if>
         </where>

+ 9 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysConfigMapper.xml

@@ -11,6 +11,7 @@
 		<result column="create_on_" property="createOn" />
 		<result column="modify_on_" property="modifyOn" />
 		<result column="group_" property="group" />
+		<result column="modify_by_" property="modifyBy" />
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -33,8 +34,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO sys_config
-		(id_,param_name_,param_value_,description_,create_on_,modify_on_,group_)
-		VALUES(#{id},#{paramName},#{paramValue},#{description},#{createOn},#{modifyOn},#{group})
+		(id_,param_name_,param_value_,description_,create_on_,modify_on_,group_,modify_by_)
+		VALUES(#{id},#{paramName},#{paramValue},#{description},#{createOn},#{modifyOn},#{group},#{modifyBy})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -56,6 +57,9 @@
 			<if test="group != null">
 				group_ = #{group},
 			</if>
+			<if test="modifyBy != null">
+				modify_by_ = #{modifyBy},
+			</if>
 		</set>
 		WHERE id_ = #{id}
 	</update>
@@ -75,6 +79,9 @@
 				<if test="config.group != null">
 					group_ = #{config.group},
 				</if>
+				<if test="config.modifyBy != null">
+					modify_by_ = #{config.modifyBy},
+				</if>
 					modify_on_ = NOW()
 			</set>
 				WHERE id_ = #{config.id}

+ 78 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml

@@ -2,7 +2,6 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDetailDao">
-
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail">
 	     <id column="id_" jdbcType="BIGINT" property="id" />
 		 <result column="video_lesson_group_id_" jdbcType="BIGINT" property="videoLessonGroupId" />
@@ -18,10 +17,85 @@
 		 <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
 	</resultMap>
 
-	<sql id="Base_Column_List">
-		id_, video_lesson_group_id_, video_title_, video_content_, video_url_, cover_url_, charge_flag_, sort_number_, teacher_id_, create_time_, update_by_, update_time_
+	<sql id="baseColumns">
+		id_ AS id,
+		video_lesson_group_id_ AS videoLessonGroupId,
+		video_title_ AS videoTitle,
+		video_content_ AS videoContent,
+		video_url_ AS videoUrl,
+		cover_url_ AS coverUrl,
+		charge_flag_ AS chargeFlag,
+		sort_number_ AS sortNumber,
+		teacher_id_ AS teacherId,
+		create_time_ AS createTime,
+		update_by_ AS updateBy,
+		update_time_ AS updateTime
+	</sql>
+	<sql id="groupDetail">
+		id_ AS id,
+		video_lesson_group_id_ AS videoLessonGroupId,
+		video_title_ AS videoTitle,
+		video_content_ AS videoContent,
+		video_url_ AS videoUrl,
+		cover_url_ AS coverUrl,
+		charge_flag_ AS chargeFlag,
+		sort_number_ AS sortNumber,
+		teacher_id_ AS teacherId,
+		create_time_ AS createTime,
+		update_by_ AS updateBy,
+		update_time_ AS updateTime
+	</sql>
+	<sql id="userDetail">
+		username_ AS username,
+		avatar_ AS avatar,
+		gender_ AS gender,
+		create_time_ AS createTime
 	</sql>
 
-
+	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail">
+		SELECT
+		<include refid="baseColumns"/>
+		FROM video_lesson_group_detail
+		<where>
+			<if test="param.videoLessonGroupId !=null">
+				AND video_lesson_group_id_ = #{param.videoLessonGroupId}
+			</if>
+		</where>
+	</select>
+	<select id="selectPageStudent" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent">
+		SELECT
+		<include refid="userDetail"/>
+		FROM sys_user
+		WHERE id_ IN
+		(SELECT student_id_
+		FROM video_lesson_purchase_record
+		WHERE video_lesson_group_id_ = #{param.videoLessonGroupId})
+	</select>
+	<insert id="insertVideoLesson" parameterType="java.util.List">
+		INSERT INTO video_lesson_group_detail (video_lesson_group_id_,video_title_,video_content_,video_url_,cover_url_,teacher_id_)
+		VALUES
+		<foreach collection="list" item="item" index="index" separator=",">
+			(#{item.videoLessonGroupId}, #{item.videoTitle}, #{item.videoContent},
+			#{item.videoUrl}, #{item.coverUrl}, #{item.teacherId})
+		</foreach>
+	</insert>
+	<update id="updateDetail" parameterType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailUpVo">
+		UPDATE video_lesson_group_detail
+		<set>
+			<if test="videoLessonGroupId !=null">video_lesson_group_id_ = #{videoLessonGroupId},</if>
+			<if test="videoTitle !=null and videoTitle !=''">video_title_ = #{videoTitle},</if>
+			<if test="videoContent !=null and videoContent !=''">video_content_ = #{videoContent},</if>
+			<if test="videoUrl !=null and videoUrl !=''">video_url_ = #{videoUrl},</if>
+			<if test="coverUrl !=null and coverUrl !=''">cover_url_ = #{coverUrl},</if>
+			<if test="updateBy !=null">update_by_ = #{updateBy},</if>
+			update_time_ = SYSDATE()
+		</set>
+		WHERE id_ = #{id}
+	</update>
+	<delete id="deleteByGroupId" parameterType="java.lang.Long">
+		DELETE
+		FROM video_lesson_group_detail
+		WHERE video_lesson_group_id_ = #{groupId}
+	</delete>
 
 </mapper>

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

@@ -2,25 +2,24 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao">
-
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup">
-	     <id column="id_" jdbcType="BIGINT" property="id" />
-		 <result column="lesson_name_" jdbcType="VARCHAR" property="lessonName" />
-		 <result column="lesson_subject_" jdbcType="VARCHAR" property="lessonSubject" />
-		 <result column="lesson_desc_" jdbcType="VARCHAR" property="lessonDesc" />
-		 <result column="lesson_price_" jdbcType="INTEGER" property="lessonPrice" />
-		 <result column="lesson_cover_url_" jdbcType="VARCHAR" property="lessonCoverUrl" />
-		 <result column="teacher_id_" jdbcType="BIGINT" property="teacherId" />
-		 <result column="lesson_count_" jdbcType="INTEGER" property="lessonCount" />
-		 <result column="sort_number_" jdbcType="INTEGER" property="sortNumber" />
-		 <result column="lesson_tag_" jdbcType="VARCHAR" property="lessonTag" />
-		 <result column="top_flag_" jdbcType="TINYINT" property="topFlag" />
-		 <result column="hot_flag_" jdbcType="TINYINT" property="hotFlag" />
-		 <result column="audit_status_" jdbcType="TINYINT" property="auditStatus" />
-		 <result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
-		 <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
+		<id column="id_" jdbcType="BIGINT" property="id" />
+		<result column="lesson_name_" jdbcType="VARCHAR" property="lessonName" />
+		<result column="lesson_subject_" jdbcType="VARCHAR" property="lessonSubject" />
+		<result column="lesson_desc_" jdbcType="VARCHAR" property="lessonDesc" />
+		<result column="lesson_price_" jdbcType="INTEGER" property="lessonPrice" />
+		<result column="lesson_cover_url_" jdbcType="VARCHAR" property="lessonCoverUrl" />
+		<result column="teacher_id_" jdbcType="BIGINT" property="teacherId" />
+		<result column="lesson_count_" jdbcType="INTEGER" property="lessonCount" />
+		<result column="sort_number_" jdbcType="INTEGER" property="sortNumber" />
+		<result column="lesson_tag_" jdbcType="VARCHAR" property="lessonTag" />
+		<result column="top_flag_" jdbcType="TINYINT" property="topFlag" />
+		<result column="hot_flag_" jdbcType="TINYINT" property="hotFlag" />
+		<result column="audit_status_" jdbcType="TINYINT" property="auditStatus" />
+		<result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
+		<result column="update_time_" jdbcType="TIMESTAMP" property="updateTime" />
 	</resultMap>
-	
+
 	<sql id="baseColumns">
 		g.id_ AS id,
 		g.lesson_name_ AS lessonName,
@@ -38,28 +37,26 @@
 		g.create_time_ AS createTime,
 		g.update_time_ AS updateTime
 	</sql>
-	<sql id="groupDetail">
-		id_ AS id,
-		video_lesson_group_id_ AS videoLessonGroupId,
-		video_title_ AS videoTitle,
-		video_content_ AS videoContent,
-		video_url_ AS videoUrl,
-		cover_url_ AS coverUrl,
-		charge_flag_ AS chargeFlag,
-		sort_number_ AS sortNumber,
-		teacher_id_ AS teacherId,
-		create_time_ AS createTime,
-		update_by_ AS updateBy,
-		update_time_ AS updateTime
-	</sql>
-	<sql id="userDetail">
-		username_ AS username,
-		avatar_ AS avatar,
-		gender_ AS gender,
-		create_time_ AS createTime
-	</sql>
 
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo">
+	<update id="updateGroup" parameterType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo">
+		UPDATE video_lesson_group
+		<set>
+			<if test="lessonName !=null and lessonName !=''">lesson_name_ = #{lessonName},</if>
+			<if test="lessonSubject !=null and lessonSubject !=''">lesson_subject_ = #{lessonSubject},</if>
+			<if test="lessonDesc !=null and lessonDesc !=''">lesson_desc_ = #{lessonDesc},</if>
+			<if test="lessonPrice !=null and lessonPrice !=''">lesson_price_ = #{lessonPrice},</if>
+			<if test="lessonCoverUrl !=null and lessonCoverUrl !=''">lesson_cover_url_ = #{lessonCoverUrl},</if>
+			<if test="sortNumber !=null">sort_number_ = #{sortNumber},</if>
+			<if test="lessonTag !=null and lessonTag !=''">lesson_tag_ = #{lessonTag},</if>
+			<if test="topFlag !=null">top_flag_ = #{topFlag},</if>
+			<if test="hotFlag !=null">hot_flag_ = #{hotFlag},</if>
+			<if test="auditStatus !=null">audit_status_ = #{auditStatus},</if>
+			update_time_ = SYSDATE(),
+			lesson_count_ = (SELECT COUNT(1) FROM video_lesson_group_detail WHERE video_lesson_group_id_ = #{id})
+		</set>
+		WHERE id_ = #{id}
+	</update>
+	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo">
 		SELECT
 			<include refid="baseColumns"/>,
 			s.username_ AS username,
@@ -73,21 +70,4 @@
 			</if>
 		</where>
 	</select>
-	<select id="selectDetail" resultType="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail"
-			parameterType="java.lang.Long">
-		SELECT
-			<include refid="groupDetail"/>
-		FROM video_lesson_group_detail
-		WHERE video_lesson_group_id_ = #{id}
-	</select>
-	<select id="selectStudent" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent"
-			parameterType="java.lang.Long">
-		SELECT
-			<include refid="userDetail"/>
-		FROM sys_user
-		WHERE id_ IN
-			  (SELECT student_id_
-			   FROM video_lesson_purchase_record
-			   WHERE video_lesson_group_id_ = #{id})
-	</select>
 </mapper>

+ 3 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java

@@ -31,7 +31,9 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 				.authenticationEntryPoint(baseAuthenticationEntryPoint)
 				.and()
 				.authorizeRequests()
-				.antMatchers("/v2/api-docs", "/code/*").permitAll().anyRequest().authenticated().and().httpBasic();
+				.antMatchers("/v2/api-docs", "/code/*",
+                        "/liveRoom/test","/liveRoom/syncUserStatus")
+                .permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 13 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseGroupController.java

@@ -1,13 +1,20 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.yonge.cooleshow.biz.dal.dto.CheckLiveCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
+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 javax.annotation.Resource;
+import java.util.List;
 
 /**
  * 课程组表(CourseGroup)表控制层
@@ -25,5 +32,11 @@ public class CourseGroupController extends BaseController {
     @Resource
     private CourseGroupService courseGroupService;
 
+    @ApiOperation("创建直播课程组-锁定课程时间-将课时写到缓存当作锁定的时间")
+    @PostMapping("/lockCourseTime")
+    public HttpResponseResult<List<CourseTimeEntity>> lockCourseToCache(@RequestBody CheckLiveCourseTimeDto dto) {
+        return succeed(courseGroupService.lockCourseToCache(dto));
+    }
+
 }
 

+ 23 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/LiveRoomController.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import com.yonge.cooleshow.biz.dal.vo.RoomVo;
@@ -10,9 +12,12 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,6 +30,7 @@ import java.util.Map;
 @RestController
 @RequestMapping("/liveRoom")
 public class LiveRoomController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(LiveRoomController.class);
     /**
      * 服务对象
      */
@@ -68,5 +74,22 @@ public class LiveRoomController extends BaseController {
     public void destroyExpiredLiveRoom() {
         liveRoomService.destroyExpiredLiveRoom();
     }
+
+    /**
+     * 同步融云用户状态变更
+     *
+     * @param userState
+     */
+    @PostMapping(value = "/syncUserStatus")
+    public void statusImUser(@RequestBody List<ImUserStateSync> userState) {
+        log.info("statusImUser >>>>> : {}", JSONObject.toJSONString(userState));
+    }
+
+    @ApiOperation("方便测试观察房间数据的方法")
+    @GetMapping("/test")
+    public Object destroyExpiredLiveRoom(@RequestParam("roomUid") String roomUid) {
+        return liveRoomService.test(roomUid);
+    }
+
 }
 

+ 91 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

@@ -0,0 +1,91 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
+import com.yonge.cooleshow.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+
+/**
+ * 视频课基本信息表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("/videoLessonGroup")
+@Api(tags = "视频课组")
+public class VideoLessonGroupController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    /**
+    * @Description: 查询视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "查询视频课组")
+    @PostMapping(value = "/page")
+    public HttpResponseResult<PageInfo<VideoLessonGroupVo>> page(@RequestBody VideoLessonGroupSearch query) {
+        IPage<VideoLessonGroupVo> pages = videoLessonGroupService.selectPage(Condition.getPage(query), query);
+        return succeed(Condition.pageInfo(pages));
+    }
+
+    /**
+    * @Description: 新增视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "新增视频课组", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/create", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> create(@Validated @RequestBody VideoLessonGroup videoLessonGroup) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+
+        videoLessonGroup.setTeacherId(sysUser.getId());
+        videoLessonGroupService.save(videoLessonGroup);
+        return succeed();
+    }
+
+    /**
+    * @Description: 修改视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "修改视频课组", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/update", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> update(@Validated @RequestBody VideoLessonGroupUpVo lessonGroupUpVo) {
+        videoLessonGroupService.updateGroup(lessonGroupUpVo);
+        return succeed();
+    }
+
+    /**
+    * @Description: 删除视频课组
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "删除视频课组", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping("/delete/{id}")
+    public Object delete(@PathVariable Long id) {
+        videoLessonGroupService.deleteGroup(id);
+        return succeed();
+    }
+}

+ 119 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupDetailController.java

@@ -0,0 +1,119 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import javax.validation.Valid;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.support.Query;
+import com.yonge.cooleshow.biz.dal.valid.AddGroup;
+import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
+import com.yonge.cooleshow.biz.dal.valid.impl.ValidList;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupDetailUpVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent;
+import com.yonge.cooleshow.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+
+/**
+ * 视频课明细表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("/videoLesson")
+@Api(tags = "视频课")
+public class VideoLessonGroupDetailController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private VideoLessonGroupDetailService videoLessonGroupDetailService;
+
+    /**
+     * @Description: 查询视频课
+     * @Author: cy
+     * @Date: 2022/3/31
+     */
+    @ApiOperation(value = "查询视频课", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/page", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<VideoLessonGroupDetail>> page(@RequestBody VideoLessonSearch query) {
+        IPage<VideoLessonGroupDetail> pages = videoLessonGroupDetailService.selectPage(Condition.getPage(query), query);
+        return succeed(Condition.pageInfo(pages));
+    }
+
+    /**
+    * @Description: 根据组id查询购买用户
+    * @Author: cy
+    * @Date: 2022/4/1
+    */
+    @ApiOperation(value = "根据组id查询购买用户", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/pageStudent", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<VideoLessonPurchaseStudent>> pageStudent(@RequestBody VideoLessonSearch query) {
+        IPage<VideoLessonPurchaseStudent> pages = videoLessonGroupDetailService.selectPageStudent(Condition.getPage(query), query);
+        return succeed(Condition.pageInfo(pages));
+    }
+
+    /**
+    * @Description: 新增视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+	@ApiOperation(value = "新增视频课", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/create", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Object> create(@Validated @RequestBody ValidList<VideoLessonGroupDetail> videoLessonList) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+
+        videoLessonGroupDetailService.insertVideoLesson(videoLessonList,sysUser);
+        return succeed();
+    }
+
+    /** 
+    * @Description: 修改视频课 
+    * @Author: cy 
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "修改视频课", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/update", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Object> update(@Validated @RequestBody VideoLessonGroupDetailUpVo detailUpVo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+
+        videoLessonGroupDetailService.updateDetail(detailUpVo,sysUser);
+        return succeed();
+    }
+
+    /**
+    * @Description: 删除视频课
+    * @Author: cy
+    * @Date: 2022/3/31
+    */
+    @ApiOperation(value = "删除视频课", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping("/delete/{id}")
+    public Object delete(@PathVariable Long id) {
+        videoLessonGroupDetailService.deleteDetail(id);
+        return succeed();
+    }
+}