liujunchi 2 rokov pred
rodič
commit
fd6fb64a33
65 zmenil súbory, kde vykonal 2575 pridanie a 157 odobranie
  1. 16 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java
  2. 156 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java
  3. 28 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java
  4. 166 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/course/CourseRelationVo.java
  5. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseRelationMusicAlbumDao.java
  6. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  7. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetPurchaseRecordDao.java
  8. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java
  9. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDetailDao.java
  10. 58 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseMusicAlbumRelationDto.java
  11. 30 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/VideoLessonGroupDetailDto.java
  12. 24 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java
  13. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicAlbumSearch.java
  14. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetOrderSearch.java
  15. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  16. 166 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseRelationMusicAlbum.java
  17. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java
  18. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java
  19. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java
  20. 32 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupLog.java
  21. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/CourseRelationTypeEnum.java
  22. 53 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/CourseTypeEnum.java
  23. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/RelationMusicAlbumEnum.java
  24. 58 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CourseRelationQueryInfo.java
  25. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseRelationMusicAlbumService.java
  26. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java
  27. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  28. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupDetailService.java
  29. 14 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  30. 17 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  31. 240 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRelationMusicAlbumServiceImpl.java
  32. 22 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  33. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  34. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  35. 133 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupDetailServiceImpl.java
  36. 369 53
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  37. 67 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  38. 49 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVideoVo.java
  39. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java
  40. 92 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentMusicAlbumOrderVo.java
  41. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonAuthGroup.java
  42. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonExamineVo.java
  43. 17 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java
  44. 27 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonVo.java
  45. 163 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/course/CourseRelationWrapper.java
  46. 13 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  47. 58 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseRelationMusicAlbumMapper.xml
  48. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  49. 43 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  50. 9 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  51. 19 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPurchaseRecordMapper.xml
  52. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml
  53. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupLogMapper.xml
  54. 10 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  55. 10 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java
  56. 15 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  57. 10 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java
  58. 6 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  59. 6 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  60. 2 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupDetailController.java
  61. 11 1
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java
  62. 18 3
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java
  63. 6 4
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/VideoGroupController.java
  64. 2 1
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/VideoLessonGroupDetailController.java
  65. 2 2
      service.md

+ 16 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java

@@ -8,11 +8,19 @@ import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetSortDto;
 import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
@@ -237,6 +245,14 @@ public class MusicAlbumController extends BaseController {
         return succeed();
     }
 
+    /**
+     * 学生详情-乐谱
+     */
+    @PostMapping(value = "/student", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "学生详情-专辑", httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<StudentMusicAlbumOrderVo>> student(@Valid @RequestBody StudentMusicSheetOrderSearch query) {
+        return succeed(PageUtil.pageInfo(musicAlbumService.selectStudentOrderPage(PageUtil.getPage(query),query)));
+    }
 
 
 }

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

@@ -1,15 +1,28 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
+import com.yonge.cooleshow.admin.io.request.course.CourseRelationVo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
@@ -22,16 +35,21 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.List;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
+
 /**
  * @Author: cy
  * @Date: 2022/4/2
@@ -115,6 +133,18 @@ public class VideoLessonController extends BaseController {
         return succeed(PageUtil.pageInfo(lessonGroupService.queryGroupHistoryList(PageUtil.getPage(search), search)));
     }
 
+    @ApiOperation(value = "老师详情-视频课详情-推荐/赠送内容", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/queryRelationMusicAlbum", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<PageInfo<CourseRelationWrapper.MusicAlbumInfo>> queryRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
+
+        query.setCourseType(CourseTypeEnum.VIDEO);
+        IPage<CourseRelationWrapper.MusicAlbumInfo> iPage = lessonGroupService
+                .queryRelationMusicAlbum(PageUtil.getPage(query), CourseRelationQueryInfo.from(query.jsonString()));
+        return succeed(PageUtil.pageInfo(iPage));
+
+    }
+
+
     /**
      * @Description: 审核-根据视频课组id查视频课详情
      * @Author: cy
@@ -175,9 +205,15 @@ public class VideoLessonController extends BaseController {
         if (shelvesVo.getShelvesFlag() == 0 && StringUtil.isEmpty(shelvesVo.getShelvesReason())) {
             return failed( "下架必须要有下架原因");
         }
+        VideoLessonGroup videoLessonGroup = lessonGroupService.getById(shelvesVo.getId());
+        if (videoLessonGroup.getAuditStatus() ==null || !videoLessonGroup.getAuditStatus().equals(AuthStatusEnum.PASS)) {
+            return failed("审核通过才能上架");
+        }
 
         shelvesVo.setShelvesId(user.getId());
-        shelvesVo.setShelvesTime(new Date());
+        if (shelvesVo.getShelvesFlag() == 1) {
+            shelvesVo.setShelvesTime(new Date());
+        }
         shelvesVo.setClientType(ClientEnum.SYSTEM);
         lessonGroupService.updateShelves(shelvesVo);
         return succeed();
@@ -188,4 +224,123 @@ public class VideoLessonController extends BaseController {
     public HttpResponseResult<CountVideoGroupVo> countVideoGroup() {
         return succeed(lessonGroupService.countVideoGroup());
     }
+
+
+    /**
+     * @Description: 新增视频课组&视频课
+     * @Author: cy
+     * @Date: 2022/4/1
+     */
+    @ApiOperation(value = "新增视频课组&视频课", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/add", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> add( @RequestBody VideoLessonVo lessonVo) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        lessonVo.setUserBy(user.getId());
+        if (lessonVo.getLessonGroup().getTeacherId() == null) {
+            return failed("请设置所属老师");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(lessonVo.getLessonGroup().getTeacherId());
+
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (lessonVo.getLessonGroup().getDraftFlag().equals(YesOrNoEnum.NO) && CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+            return failed("课程不能为空");
+        }
+        Long add = lessonGroupService.add(lessonVo, sysUser);
+        return succeed(add);
+    }
+
+    /**
+     * @Description: 修改视频课组&视频课
+     * @Author: cy
+     * @Date: 2022/4/7
+     */
+    @ApiOperation(value = "修改视频课组&视频课", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/update", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> update(@RequestBody VideoLessonVo lessonVo) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        lessonVo.setUserBy(user.getId());
+
+        if (lessonVo.getLessonGroup().getTeacherId() == null) {
+            return failed("请设置所属老师");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(lessonVo.getLessonGroup().getTeacherId());
+
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (lessonVo.getLessonGroup().getDraftFlag().equals(YesOrNoEnum.NO) && CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+            return failed("课程不能为空");
+        }
+        return succeed(lessonGroupService.update(lessonVo, sysUser));
+    }
+
+
+
+    /**
+     * 置顶
+     */
+    @PostMapping("/top/{id}")
+    @ApiOperation(value = "置顶", notes = "传入id")
+    public HttpResponseResult<Boolean> top(@ApiParam(value = "视频课编号", required = true)  @PathVariable Long id) {
+        if (StringUtil.isEmpty(id)) {
+            return failed("参数不能为空");
+        }
+        return status(lessonGroupService.top(id));
+    }
+
+
+
+    /**
+     * @Description: 根据组id查询视频课&视频课组
+     * @Author: cy
+     * @Date: 2022/4/2
+     */
+    @ApiOperation(value = "根据组id查询视频课&视频课组")
+    @GetMapping(value = "/selectVideoLesson")
+    public HttpResponseResult<VideoLessonStudentVo> selectVideoLesson(@NotNull(message = "视频组id不能为空") Long groupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        VideoLessonStudentVo videoLessonStudentVo = lessonGroupService.selectVideoLesson(groupId);
+        if (videoLessonStudentVo.getLessonGroup().getTeacherId().equals(sysUser.getId())) {
+            videoLessonStudentVo.setMyself(true);
+        } else {
+            videoLessonStudentVo.setMyself(false);
+        }
+        if (videoLessonStudentVo.getLessonGroup() != null && sysUser.getId().equals(videoLessonStudentVo.getLessonGroup().getId())) {
+            videoLessonStudentVo.setAlreadyBuy(true);
+        } else {
+            videoLessonStudentVo.setAlreadyBuy(false);
+        }
+        return succeed(videoLessonStudentVo);
+    }
+
+    /**
+     * 设置排序值 和加精
+     */
+    @PostMapping("/adjust")
+    @ApiOperation(value = "视频课调整排序")
+    public HttpResponseResult<Boolean> adjust(@RequestBody @Valid AdjustModel model) {
+
+        VideoLessonGroup videoLessonGroup = new VideoLessonGroup();
+        videoLessonGroup.setId(model.getId());
+        videoLessonGroup.setSortNumber(model.getSort());
+
+        lessonGroupService.updateById(videoLessonGroup);
+
+        return succeed();
+    }
+
 }

+ 28 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java

@@ -1,14 +1,17 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.yonge.cooleshow.admin.io.request.course.CourseRelationVo;
 import com.yonge.cooleshow.admin.io.request.im.IMNotifyMessageVO;
 import com.yonge.cooleshow.admin.io.request.im.UserFriendInfoVO;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 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.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -16,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.Objects;
 
 /**
  * 用户通讯录表(ImUserFriend)表控制层
@@ -25,7 +29,7 @@ import javax.annotation.Resource;
  */
 @Api(tags = "用户通讯录表")
 @RestController
-@RequestMapping("/open/im")
+@RequestMapping("/open")
 public class ImUserFriendController extends BaseController {
 
     /**
@@ -33,9 +37,11 @@ public class ImUserFriendController extends BaseController {
      */
     @Resource
     private ImUserFriendService imUserFriendService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
 
     @ApiOperation("新用户添加客服")
-    @PostMapping(value = "/customerService")
+    @PostMapping(value = "/im/customerService")
     public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
 
         if (info.invalidRequestParam()) {
@@ -54,7 +60,7 @@ public class ImUserFriendController extends BaseController {
      * @param info IMNotifyMessageVO
      * @return HttpResponseResult<Boolean>
      */
-    @PostMapping(value = "/message")
+    @PostMapping(value = "/im/message")
     public HttpResponseResult<Boolean> sendSysCustomerServiceMessage(@RequestBody IMNotifyMessageVO info) {
 
         if (info.invalidRequestParam()) {
@@ -67,5 +73,24 @@ public class ImUserFriendController extends BaseController {
 
         return succeed();
     }
+
+    /**
+     * 同步用户购买课程赠送数据
+     * @param query CourseRelationVo.CourseRelationQuery
+     * @return HttpResponseResult<Boolean>
+     */
+    @ApiOperation("已购买课程赠送同步")
+    @PostMapping(value = "/course/sync")
+    public HttpResponseResult<Boolean> syncUserPurchaseRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
+
+        if (Objects.isNull(query.getCourseGroupId()) || Objects.isNull(query.getCourseType())) {
+            return failed("无效的请求参数");
+        }
+
+        // 同步数据
+        courseRelationMusicAlbumService.asyncUpdateCourseRelationMusicAlbumInfo(query.getCourseGroupId(), query.getCourseType());
+
+        return succeed();
+    }
 }
 

+ 166 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/course/CourseRelationVo.java

@@ -0,0 +1,166 @@
+package com.yonge.cooleshow.admin.io.request.course;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-25
+ */
+public class CourseRelationVo {
+
+    @ApiModel("CourseRelationQuery-课程推荐/赠送内容查询")
+    public static class CourseRelationQuery extends QueryInfo{
+
+        @ApiModelProperty("课程组id")
+        private Long courseGroupId;
+
+        @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+        private RelationMusicAlbumEnum relationType;
+
+
+        @ApiModelProperty("课程类型 ")
+        private CourseTypeEnum courseType;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+
+        public Long getCourseGroupId() {
+            return courseGroupId;
+        }
+
+        public void setCourseGroupId(Long courseGroupId) {
+            this.courseGroupId = courseGroupId;
+        }
+
+        public RelationMusicAlbumEnum getRelationType() {
+            return relationType;
+        }
+
+        public void setRelationType(RelationMusicAlbumEnum relationType) {
+            this.relationType = relationType;
+        }
+
+        public CourseTypeEnum getCourseType() {
+            return courseType;
+        }
+
+        public void setCourseType(CourseTypeEnum courseType) {
+            this.courseType = courseType;
+        }
+    }
+
+    @ApiModel("CourseRelationList-课程推荐/赠送内容列表")
+    public static class CourseRelationList {
+
+        @ApiModelProperty("编号")
+        private Long id;
+
+        @ApiModelProperty("封面")
+        private String img;
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("标签")
+        private String tagName;
+
+        @ApiModelProperty("声部")
+        private String subjectName;
+
+        @ApiModelProperty("收费类型  VIP:会员,FREE:免费 CHARGE:购买")
+        private String paymentType;
+
+        @ApiModelProperty("价格")
+        private BigDecimal price;
+
+        @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+        private RelationMusicAlbumEnum relationType;
+
+        @ApiModelProperty("课程名")
+        private String courseName;
+
+        public Long getId() {
+            return id;
+        }
+
+        public void setId(Long id) {
+            this.id = id;
+        }
+
+        public String getImg() {
+            return img;
+        }
+
+        public void setImg(String img) {
+            this.img = img;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getTagName() {
+            return tagName;
+        }
+
+        public void setTagName(String tagName) {
+            this.tagName = tagName;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public String getPaymentType() {
+            return paymentType;
+        }
+
+        public void setPaymentType(String paymentType) {
+            this.paymentType = paymentType;
+        }
+
+        public BigDecimal getPrice() {
+            return price;
+        }
+
+        public void setPrice(BigDecimal price) {
+            this.price = price;
+        }
+
+        public RelationMusicAlbumEnum getRelationType() {
+            return relationType;
+        }
+
+        public void setRelationType(RelationMusicAlbumEnum relationType) {
+            this.relationType = relationType;
+        }
+
+        public String getCourseName() {
+            return courseName;
+        }
+
+        public void setCourseName(String courseName) {
+            this.courseName = courseName;
+        }
+    }
+}

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseRelationMusicAlbumDao.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+public interface CourseRelationMusicAlbumDao extends BaseMapper<CourseRelationMusicAlbum>{
+
+
+    /**
+     * 课程用户购买记录
+     * @param page Page<UserOrder>
+     * @param queryInfo CourseRelationWrapper.PurchaseRecordQueryInfo
+     * @return List<UserOrder>
+     */
+    List<UserOrder> selectCoursePurchaseUserInfo(@Param("page") Page<UserOrder> page, @Param("record") CourseRelationWrapper.PurchaseRecordQueryInfo queryInfo);
+}

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -3,11 +3,13 @@ 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.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -74,4 +76,7 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return List<StatGroupWrapper>
      */
     List<StatGroupWrapper> selectAlbumMusicSheetStatInfo(@Param("albumId") Long albumId, @Param("paymentType") ChargeTypeEnum paymentType);
+
+    List<StudentMusicAlbumOrderVo> selectStudentOrderPage(@Param("page") IPage<StudentMusicAlbumOrderVo> page, @Param(
+            "param") StudentMusicSheetOrderSearch query);
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetPurchaseRecordDao.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * MusicSheetPurchaseRecordDao数据库访问类
@@ -11,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  **/
 public interface MusicSheetPurchaseRecordDao extends BaseMapper<MusicSheetPurchaseRecord> {
 
+    void updateCourseMusicAlbum(@Param("items") List<CourseRelationMusicAlbum> updateCourseRelationMusicAlbums);
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java

@@ -2,6 +2,9 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import java.util.List;
 
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;

+ 4 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDetailDao.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -19,13 +20,13 @@ import java.util.List;
  **/
 public interface VideoLessonGroupDetailDao extends BaseMapper<VideoLessonGroupDetail> {
     //查询视频课
-    List<VideoLessonGroupDetail> selectPage(IPage page,@Param("param") VideoLessonSearch query);
+    List<VideoLessonGroupDetailDto> selectPage(IPage page,@Param("param") VideoLessonSearch query);
 
     //根据组id查询购买用户
     List<VideoLessonPurchaseStudent> selectPageStudent(IPage page,@Param("param")  VideoLessonSearch query);
 
     //新增视频课
-    void insertVideoLesson(List<VideoLessonGroupDetail> list);
+    void insertVideoLesson(List<VideoLessonGroupDetailDto> list);
 
     //修改视频课
     void updateDetail(VideoLessonGroupDetailUpVo detailUpVo);
@@ -35,5 +36,5 @@ public interface VideoLessonGroupDetailDao extends BaseMapper<VideoLessonGroupDe
 
     List<VideoLessonGroupDetailVo> selectPageAuth(IPage page, @Param("param") VideoLessonSearch query);
     
-    List<VideoLessonGroupDetail> queryByVideoLessonGroupId(Long videoLessonGroupId);
+    List<VideoLessonGroupDetailDto> queryByVideoLessonGroupId(Long videoLessonGroupId);
 }

+ 58 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseMusicAlbumRelationDto.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-24
+ */
+public class CourseMusicAlbumRelationDto {
+
+    @ApiModelProperty("关联id")
+    private Long relationId;
+
+    @ApiModelProperty("曲目或专辑id")
+    private Long musicAlbumId;
+
+    @ApiModelProperty("关联类型 RECOMMEND:推荐 GIFT:赠品")
+    private CourseRelationTypeEnum useRelationType;
+
+    @ApiModelProperty("类型 MUSIC:曲目 ALBUM:专辑")
+    private RelationMusicAlbumEnum relationMusicAlbum;
+
+    public CourseRelationTypeEnum getUseRelationType() {
+        return useRelationType;
+    }
+
+    public void setUseRelationType(CourseRelationTypeEnum useRelationType) {
+        this.useRelationType = useRelationType;
+    }
+
+    public Long getRelationId() {
+        return relationId;
+    }
+
+    public void setRelationId(Long relationId) {
+        this.relationId = relationId;
+    }
+
+    public Long getMusicAlbumId() {
+        return musicAlbumId;
+    }
+
+    public void setMusicAlbumId(Long musicAlbumId) {
+        this.musicAlbumId = musicAlbumId;
+    }
+
+    public RelationMusicAlbumEnum getRelationMusicAlbum() {
+        return relationMusicAlbum;
+    }
+
+    public void setRelationMusicAlbum(RelationMusicAlbumEnum relationMusicAlbum) {
+        this.relationMusicAlbum = relationMusicAlbum;
+    }
+}

+ 30 - 22
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/VideoLessonGroupDetailDto.java

@@ -1,40 +1,48 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
 
-/**
- * VideoLessonGroupDetailDto
- * @author yzp
- * @date   2022-03-25 23:46:28
- * @version v1.0
- **/
 public class VideoLessonGroupDetailDto extends VideoLessonGroupDetail {
-    private Integer pageNo;
-    private Integer pageSize;
-    private String search;
 
-    public int getPageNo() {
-        return pageNo;
-    }
+    @ApiModelProperty("关联信息(更新或新增)")
+    private List<CourseMusicAlbumRelationDto> relationList;
+
+    @ApiModelProperty("关联曲目/专辑信息(查看) ")
+    private List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos;
 
-    public void setPageNo(int pageNo) {
-        this.pageNo = pageNo;
+
+    @ApiModelProperty(value = "数据库保存json数据",hidden = true)
+    private List<CourseRelationMusicAlbum> courseRelationMusicAlbumList = new ArrayList<>();
+
+
+    public List<CourseRelationMusicAlbum> getCourseRelationMusicAlbumList() {
+        return courseRelationMusicAlbumList;
     }
 
-    public int getPageSize() {
-        return pageSize;
+    public void setCourseRelationMusicAlbumList(List<CourseRelationMusicAlbum> courseRelationMusicAlbumList) {
+        this.courseRelationMusicAlbumList = courseRelationMusicAlbumList;
     }
 
-    public void setPageSize(int pageSize) {
-        this.pageSize = pageSize;
+    public List<CourseMusicAlbumRelationDto> getRelationList() {
+        return relationList;
     }
 
-    public String getSearch() {
-        return search;
+    public void setRelationList(List<CourseMusicAlbumRelationDto> relationList) {
+        this.relationList = relationList;
     }
 
-    public void setSearch(String search) {
-        this.search = search;
+    public List<CourseRelationWrapper.MusicAlbumInfo> getMusicAlbumInfos() {
+        return musicAlbumInfos;
     }
 
+    public void setMusicAlbumInfos(List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos) {
+        this.musicAlbumInfos = musicAlbumInfos;
+    }
 }

+ 24 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,7 +27,7 @@ public class CourseGroupSearch extends QueryInfo {
     @ApiModelProperty("课程id")
     private Long courseId;
 
-    @ApiModelProperty(value = "课程状态")
+    @ApiModelProperty(value = "课程状态 DOING UNPASS PASS")
     private String status;
 
     @ApiModelProperty(value = "结算状态")
@@ -51,9 +52,31 @@ public class CourseGroupSearch extends QueryInfo {
     @ApiModelProperty(value = "老师id")
     private Long teacherId;
 
+    @ApiModelProperty("置顶")
+    private YesOrNoEnum topFlag;
+
     @ApiModelProperty(value = "是否上架 (0:否  1:是)")
     private Integer shelvesFlag;
 
+    @ApiModelProperty(value = "是否草稿 (0:否  1:是)",hidden = true)
+    private Integer draftFlag;
+
+    public YesOrNoEnum getTopFlag() {
+        return topFlag;
+    }
+
+    public void setTopFlag(YesOrNoEnum topFlag) {
+        this.topFlag = topFlag;
+    }
+
+    public Integer getDraftFlag() {
+        return draftFlag;
+    }
+
+    public void setDraftFlag(Integer draftFlag) {
+        this.draftFlag = draftFlag;
+    }
+
     public Long getStudentId() {
         return studentId;
     }

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

@@ -29,6 +29,9 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     @ApiModelProperty(value = "购买类型 ", hidden = true)
     private PurchaseRecordTypeEnum purchaseType;
 
+    @ApiModelProperty("课程赠品 0:购买 1:赠品")
+    private Integer courseGift;
+
     @ApiModelProperty(value = "用户类型 TEACHER:老师,STUDENT:学生", hidden = true)
     private ClientEnum clientType;
 
@@ -81,6 +84,14 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     }
 
 
+    public Integer getCourseGift() {
+        return courseGift;
+    }
+
+    public void setCourseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+    }
+
     public StudentMusicAlbumSearch studentId(Long studentId) {
         this.studentId = studentId;
         return this;
@@ -110,4 +121,9 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
         this.clientType = clientType;
         return this;
     }
+
+    public StudentMusicAlbumSearch courseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+        return this;
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
@@ -24,13 +25,13 @@ public class StudentMusicSheetOrderSearch extends QueryInfo {
     @NotNull(message = "学生编号不能为空")
     private Long studentId;
 
-    @ApiModelProperty("曲目编号/名称")
+    @ApiModelProperty("编号/名称")
     private String idAndName;
 
     @ApiModelProperty("订单号")
     private String orderNo;
 
-    @ApiModelProperty("曲目标签id,多个逗号隔开")
+    @ApiModelProperty("标签id,多个逗号隔开")
     private String musicTagIds;
 
     @ApiModelProperty(hidden = true)

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -24,7 +25,11 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     @ApiModelProperty(value = "用户类型",hidden = true)
     private ClientEnum userType;
 
+    @ApiModelProperty("购买类型 ")
+    private PurchaseRecordTypeEnum purchaseType;
 
+    @ApiModelProperty("课程赠品 0:购买 1:赠品")
+    private Integer courseGift;
 
     @ApiModelProperty(value = "版本号")
     private String version;
@@ -92,4 +97,20 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     public void setClientType(ClientEnum clientType) {
         this.clientType = clientType;
     }
+
+    public PurchaseRecordTypeEnum getPurchaseType() {
+        return purchaseType;
+    }
+
+    public void setPurchaseType(PurchaseRecordTypeEnum purchaseType) {
+        this.purchaseType = purchaseType;
+    }
+
+    public Integer getCourseGift() {
+        return courseGift;
+    }
+
+    public void setCourseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+    }
 }

+ 166 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseRelationMusicAlbum.java

@@ -0,0 +1,166 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 课程关联曲目专辑
+ */
+@TableName("course_relation_music_album")
+@ApiModel(value = "CourseRelationMusicAlbum对象", description = "课程关联曲目专辑")
+public class CourseRelationMusicAlbum implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("课程组id ")
+	@TableField(value = "course_group_id_")
+    private Long courseGroupId;
+    @ApiModelProperty("课程ID ")
+	@TableField(value = "course_id_")
+    private Long courseId;
+    @ApiModelProperty("课程类型 ")
+	@TableField(value = "course_type_")
+    private CourseTypeEnum courseType;
+    @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+	@TableField(value = "relation_type_")
+    private RelationMusicAlbumEnum relationType;
+
+    @ApiModelProperty("关联类型,RECOMMEND:推荐  GIFT:赠品 ")
+    @TableField(value = "use_relation_type_")
+    private CourseRelationTypeEnum useRelationType;
+
+    @ApiModelProperty("关联曲目专辑ID ")
+	@TableField(value = "music_album_id_")
+    private Long musicAlbumId;
+
+    @ApiModelProperty(" 0 :删除 1:更新 2: 新增")
+    @TableField(value = "del_flag_")
+    private Integer delFlog;
+    @ApiModelProperty("更新用户 ")
+	@TableField(value = "update_by_")
+    private Long updateBy;
+    @ApiModelProperty("更新时间 ")
+	@TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    @ApiModelProperty("创建用户 ")
+	@TableField(value = "create_by_")
+    private Long createBy;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    public CourseRelationTypeEnum getUseRelationType() {
+        return useRelationType;
+    }
+
+    public void setUseRelationType(CourseRelationTypeEnum useRelationType) {
+        this.useRelationType = useRelationType;
+    }
+
+    public Integer getDelFlog() {
+        return delFlog;
+    }
+
+    public void setDelFlog(Integer delFlog) {
+        this.delFlog = delFlog;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+    
+	public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public CourseTypeEnum getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseTypeEnum courseType) {
+        this.courseType = courseType;
+    }
+
+    public RelationMusicAlbumEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(RelationMusicAlbumEnum relationType) {
+        this.relationType = relationType;
+    }
+
+    public Long getMusicAlbumId() {
+        return musicAlbumId;
+    }
+
+    public void setMusicAlbumId(Long musicAlbumId) {
+        this.musicAlbumId = musicAlbumId;
+    }
+    
+	public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+    
+	public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+    
+	public Long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+    
+	public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    
+}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java

@@ -68,10 +68,23 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
 
+
+	@TableField("course_music_album_id_")
+	@ApiModelProperty(value = "课程关联曲目专辑ID")
+	private  Long courseMusicAlbumId;
+
 	@TableField("purchase_type_")
 	@ApiModelProperty("购买类型 ")
 	private PurchaseRecordTypeEnum purchaseType;
 
+	public Long getCourseMusicAlbumId() {
+		return courseMusicAlbumId;
+	}
+
+	public void setCourseMusicAlbumId(Long courseMusicAlbumId) {
+		this.courseMusicAlbumId = courseMusicAlbumId;
+	}
+
 	public ClientEnum getClientType() {
 		return clientType;
 	}

+ 28 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -123,10 +125,36 @@ public class VideoLessonGroup extends BaseEntity {
     @ApiModelProperty(value = "审批人id")
     private Integer auditId;
 
+
+    @TableField("draft_flag_")
+    @ApiModelProperty(value = "草稿状态, 0正式1草稿")
+    private YesOrNoEnum draftFlag;
+
+
+    @TableField("relation_type_")
+    @ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+    private CourseRelationTypeEnum relationType;
+
     @TableField("audit_version_")
     @ApiModelProperty(value = "是否审核时可见 (0:否  1:是)")
     private YesOrNoEnum auditVersion = YesOrNoEnum.NO;
 
+    public YesOrNoEnum getDraftFlag() {
+        return draftFlag;
+    }
+
+    public void setDraftFlag(YesOrNoEnum draftFlag) {
+        this.draftFlag = draftFlag;
+    }
+
+    public CourseRelationTypeEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(CourseRelationTypeEnum relationType) {
+        this.relationType = relationType;
+    }
+
     public Long getId() {
         return id;
     }

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
 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.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -20,7 +22,7 @@ import javax.validation.constraints.NotNull;
  * @version v1.0
  **/
 @ApiModel(value = "video_lesson_group_detail-视频课明细表")
-public class 	VideoLessonGroupDetail extends BaseEntity {
+public class VideoLessonGroupDetail extends BaseEntity {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
@@ -73,7 +75,6 @@ public class 	VideoLessonGroupDetail extends BaseEntity {
     @ApiModelProperty(value = "更新时间")
     private java.util.Date updateTime;  //更新时间
 
-
 	public VideoLessonGroupDetail setId(Long id) {
 	    this.id = id;
 	    return this;

+ 32 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupLog.java

@@ -2,6 +2,10 @@ package com.yonge.cooleshow.biz.dal.entity;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import io.swagger.annotations.ApiModelProperty;
@@ -75,14 +79,37 @@ public class VideoLessonGroupLog {
 	
 	@ApiModelProperty(value = "更新时间",required = false)
 	private java.util.Date updateTime;
-	
+
+	@ApiModelProperty(value = "草稿状态, 0正式1草稿")
+	private YesOrNoEnum draftFlag;
+
+
+	@ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+	private CourseRelationTypeEnum relationType;
+
 	private Long version;
 	
 	@ApiModelProperty(value = "视频课明细json串",required = false)
 	private String videoDetailJson;
 	
-    private List<VideoLessonGroupDetail> videoList;
-	
+    private List<VideoLessonGroupDetailDto> videoList;
+
+	public YesOrNoEnum getDraftFlag() {
+		return draftFlag;
+	}
+
+	public void setDraftFlag(YesOrNoEnum draftFlag) {
+		this.draftFlag = draftFlag;
+	}
+
+	public CourseRelationTypeEnum getRelationType() {
+		return relationType;
+	}
+
+	public void setRelationType(CourseRelationTypeEnum relationType) {
+		this.relationType = relationType;
+	}
+
 	public VideoLessonGroupLog setId(Long id){
 		this.id = id;
 		return this;
@@ -295,11 +322,11 @@ public class VideoLessonGroupLog {
 		this.videoDetailJson = videoDetailJson;
 	}
 
-	public List<VideoLessonGroupDetail> getVideoList() {
+	public List<VideoLessonGroupDetailDto> getVideoList() {
 		return videoList;
 	}
 
-	public void setVideoList(List<VideoLessonGroupDetail> videoList) {
+	public void setVideoList(List<VideoLessonGroupDetailDto> videoList) {
 		this.videoList = videoList;
 	}
 

+ 51 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/CourseRelationTypeEnum.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.biz.dal.enums.course;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 课程关联类型
+ * @author: Eric
+ * @date: 2022-03-30
+ */
+public enum CourseRelationTypeEnum implements BaseEnum<String, CourseRelationTypeEnum> {
+
+    RECOMMEND("推荐"),
+    GIFT("赠品"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CourseRelationTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * 类型匹配
+     * @param name 类型
+     * @return boolean
+     */
+    public static boolean match(String name) {
+
+        CourseRelationTypeEnum[] values = CourseRelationTypeEnum.values();
+        for (CourseRelationTypeEnum item : values) {
+
+            if (item.name().equals(name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 53 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/CourseTypeEnum.java

@@ -0,0 +1,53 @@
+package com.yonge.cooleshow.biz.dal.enums.course;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 课程类型
+ * @author: Eric
+ * @date: 2022-03-30
+ */
+public enum CourseTypeEnum implements BaseEnum<String, CourseTypeEnum> {
+
+    PRACTICE("陪练课"),
+    LIVE("直播课"),
+    PIANO_ROOM_CLASS("琴房课"),
+    VIDEO("视频课"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CourseTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * 类型匹配
+     * @param name 类型
+     * @return boolean
+     */
+    public static boolean match(String name) {
+
+        CourseTypeEnum[] values = CourseTypeEnum.values();
+        for (CourseTypeEnum item : values) {
+
+            if (item.name().equals(name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 51 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/RelationMusicAlbumEnum.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.biz.dal.enums.course;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 课程关联曲目、专辑类型
+ * @author: Eric
+ * @date: 2022-03-30
+ */
+public enum RelationMusicAlbumEnum implements BaseEnum<String, RelationMusicAlbumEnum> {
+
+    MUSIC("曲目"),
+    ALBUM("专辑"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    RelationMusicAlbumEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * 类型匹配
+     * @param name 类型
+     * @return boolean
+     */
+    public static boolean match(String name) {
+
+        RelationMusicAlbumEnum[] values = RelationMusicAlbumEnum.values();
+        for (RelationMusicAlbumEnum item : values) {
+
+            if (item.name().equals(name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 58 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CourseRelationQueryInfo.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-25
+ */
+public class CourseRelationQueryInfo {
+
+
+    // 课程组id
+    private Long courseGroupId;
+
+    // 关联类型, MUSIC, ALBUM
+    private RelationMusicAlbumEnum relationType;
+
+
+    // 课程类型
+    private CourseTypeEnum courseType;
+
+
+
+    public static CourseRelationQueryInfo from(String recv) {
+
+        return JSON.parseObject(recv, CourseRelationQueryInfo.class);
+    }
+
+
+    public RelationMusicAlbumEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(RelationMusicAlbumEnum relationType) {
+        this.relationType = relationType;
+    }
+
+    public CourseTypeEnum getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseTypeEnum courseType) {
+        this.courseType = courseType;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+}

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

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+
+/**
+ * 课程关联曲目专辑 服务类
+ * @author liweifan
+ * @date 2022-10-24
+ */
+public interface CourseRelationMusicAlbumService extends IService<CourseRelationMusicAlbum> {
+
+    /**
+     * 异常更新课程关联曲目专辑
+     * @param groupId 课程组ID
+     * @param courseType 课程组类型
+     */
+    void asyncUpdateCourseRelationMusicAlbumInfo(Long groupId, CourseTypeEnum courseType);
+
+}

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

@@ -8,12 +8,15 @@ import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetSortDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 
 import java.util.List;
@@ -147,4 +150,6 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
      * 专辑分享分润
      */
     ShareProfitVo albumShareProfit(SysUser sysUser, Long albumId);
+
+    IPage<StudentMusicAlbumOrderVo>  selectStudentOrderPage(IPage<StudentMusicAlbumOrderVo> page, StudentMusicSheetOrderSearch query);
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java

@@ -1,9 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * MusicSheetPurchaseRecordService服务类
@@ -21,4 +25,9 @@ public interface MusicSheetPurchaseRecordService extends IService<MusicSheetPurc
      * @return boolean
      */
     MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType, PurchaseRecordTypeEnum purchaseType);
+
+    /**
+     * 更新赠送记录
+     */
+    void updateCourseMusicAlbum( List<CourseRelationMusicAlbum> updateCourseRelationMusicAlbums);
 }

+ 19 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupDetailService.java

@@ -2,10 +2,13 @@ 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.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 
 import java.util.List;
 
@@ -20,7 +23,7 @@ public interface VideoLessonGroupDetailService extends IService<VideoLessonGroup
 
     IPage<VideoLessonPurchaseStudent> selectPageStudent(IPage<VideoLessonPurchaseStudent> page, VideoLessonSearch query);
 
-    void insertVideoLesson(List<VideoLessonGroupDetail> videoLessonList, SysUser sysUser);
+    void insertVideoLesson(List<VideoLessonGroupDetailDto> videoLessonList, SysUser sysUser);
 
     void updateDetail(VideoLessonGroupDetailUpVo detailUpVo, SysUser sysUser);
 
@@ -28,4 +31,19 @@ public interface VideoLessonGroupDetailService extends IService<VideoLessonGroup
 
     VideoLessonStudentVo selectVideoLesson(Long groupId,Long userId);
 
+    /**
+     * 课程关联曲目/专辑信息
+     * @param recordInfos
+     * @return List<CourseRelationWrapper.MusicAlbumInfo>
+     */
+    List<CourseRelationWrapper.MusicAlbumInfo> getCourseRelationMusicAlbumInfos(List<CourseRelationMusicAlbum> recordInfos);
+
+    /**
+     * 填充课程关联曲目、专辑信息
+     * @param lessonStudentVo VideoLessonStudentVo
+     * @param musicAlbumInfos List<CourseRelationWrapper.MusicAlbumInfo>
+     */
+    void updateCourseRelationMusicAlbumInfo(List<VideoLessonGroupDetailDto> lessonStudentVo,
+                                            List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos);
+
 }

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

@@ -7,7 +7,9 @@ import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 
 import java.util.List;
 
@@ -36,7 +38,7 @@ public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
 
     void deleteGroup(Long id);
 
-    void add(VideoLessonVo lessonVo, SysUser sysUser);
+    Long add(VideoLessonVo lessonVo, SysUser sysUser);
 
     IPage<VideoLessonStudentDetailVo> selectStudentPage(IPage<VideoLessonStudentDetailVo> page, VideoLessonSearch search);
 
@@ -46,7 +48,7 @@ public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
 
     VideoLessonStudentVo selectVideoLesson(Long groupId);
 
-    void update(VideoLessonVo lessonVo, SysUser sysUser);
+    VideoLessonVo update(VideoLessonVo lessonVo, SysUser sysUser);
 
     IPage<LessonGroupVo> selectLessonGroup(IPage<LessonGroupVo> page, VideoLessonGroupSearch query);
 
@@ -70,4 +72,14 @@ public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
     ShareProfitVo shareVideoCourseProfit(SysUser sysUser, Long videoGroupId);
 
 
+    /**
+     * 置顶视频课
+     *
+     */
+    Boolean top(Long videoLessonGroupId);
+
+    /**
+     * 课程关联的曲目 /专辑信息
+     */
+    IPage<CourseRelationWrapper.MusicAlbumInfo> queryRelationMusicAlbum(IPage<CourseRelationWrapper.MusicAlbumInfo> page, CourseRelationQueryInfo queryInfo);
 }

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

@@ -26,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.string.MessageFormatter;
@@ -1085,8 +1086,22 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     @Override
     public IPage<CourseGroupVideoVo> selectVideoGroup(IPage<CourseGroupVideoVo> page, CourseGroupSearch search) {
-        search.setStatus(AuthStatusEnum.PASS.getCode());
-        return baseMapper.selectVideoGroup(page, search);
+        // 转换草稿参数
+        if (search.getShelvesFlag() != null && search.getShelvesFlag() ==2) {
+            search.setDraftFlag(1);
+            search.setShelvesFlag(null);
+        } else if (search.getShelvesFlag() != null){
+            search.setDraftFlag(0);
+        }
+        // search.setStatus(AuthStatusEnum.PASS.getCode());
+        IPage<CourseGroupVideoVo> courseGroupVideoVoIPage = baseMapper.selectVideoGroup(page, search);
+        for (CourseGroupVideoVo record : courseGroupVideoVoIPage.getRecords()) {
+            if (record.getDraftFlag() != null && record.getDraftFlag().equals(YesOrNoEnum.YES)) {
+                record.setShelvesFlag(2);
+            }
+        }
+        return courseGroupVideoVoIPage;
+
     }
 
     @Override

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

@@ -0,0 +1,240 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.dao.CourseRelationMusicAlbumDao;
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.common.enums.EStatus;
+import com.yonge.toolset.base.util.ThreadPool;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Service
+public class CourseRelationMusicAlbumServiceImpl extends ServiceImpl<CourseRelationMusicAlbumDao, CourseRelationMusicAlbum> implements CourseRelationMusicAlbumService {
+
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    /**
+     * 异常更新课程关联曲目专辑
+     *
+     * @param groupId 课程组ID
+     * @param courseType 课程组类型
+     */
+    @Override
+    public void asyncUpdateCourseRelationMusicAlbumInfo(Long groupId, CourseTypeEnum courseType) {
+
+        // 课程组关联曲目、专辑信息
+        List<CourseRelationMusicAlbum> musicAlbums = lambdaQuery()
+                .eq(CourseRelationMusicAlbum::getCourseGroupId, groupId)
+                .list();
+
+        if (CollectionUtils.isEmpty(musicAlbums)) {
+            return;
+        }
+
+        ThreadPool.getExecutor().submit(() -> {
+
+            try {
+
+                Map<CourseRelationTypeEnum, List<CourseRelationMusicAlbum>> musicAlbumGroupMap = musicAlbums.stream()
+                        .collect(Collectors.groupingBy(CourseRelationMusicAlbum::getUseRelationType));
+
+                // 推荐类型直接删除购买记录
+                if (musicAlbumGroupMap.containsKey(CourseRelationTypeEnum.RECOMMEND)) {
+
+                    List<Long> deleteRelationIds = musicAlbumGroupMap.get(CourseRelationTypeEnum.RECOMMEND).stream()
+                            .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
+
+                    // 删除用户购买关系
+                    if (CollectionUtils.isNotEmpty(deleteRelationIds)) {
+
+                        musicSheetPurchaseRecordService.lambdaUpdate()
+                                .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, deleteRelationIds)
+                                .remove();
+                    }
+
+                }
+
+                // 赠送按状态进行数据同步更新
+                if (musicAlbumGroupMap.containsKey(CourseRelationTypeEnum.GIFT)) {
+
+                    Map<Integer, List<CourseRelationMusicAlbum>> collect = musicAlbumGroupMap.get(CourseRelationTypeEnum.GIFT).stream()
+                            .collect(Collectors.groupingBy(CourseRelationMusicAlbum::getDelFlog));
+
+                    for (Map.Entry<Integer, List<CourseRelationMusicAlbum>> entry : collect.entrySet()) {
+
+                        if (EStatus.DISABLE.match(entry.getKey())) {
+
+                            // 删除购买关系
+                            List<Long> deleteIds = entry.getValue().stream()
+                                    .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
+
+                            if (CollectionUtils.isNotEmpty(deleteIds)) {
+
+                                // 删除用户购买关系
+                                musicSheetPurchaseRecordService.lambdaUpdate()
+                                        .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, deleteIds)
+                                        .remove();
+                            }
+                        }
+
+                        if (EStatus.ENABLE.match(entry.getKey())) {
+
+                            // 更新购买关系
+                            for (CourseRelationMusicAlbum item : entry.getValue()) {
+
+                                musicSheetPurchaseRecordService.lambdaUpdate()
+                                        .eq(MusicSheetPurchaseRecord::getCourseMusicAlbumId, item.getCourseId())
+                                        .set(MusicSheetPurchaseRecord::getMusicSheetId, item.getMusicAlbumId())
+                                        .set(MusicSheetPurchaseRecord::getPurchaseType, PurchaseRecordTypeEnum.valueOf(item.getRelationType().getCode()))
+                                        .update();
+                            }
+                        }
+
+                        if (EStatus.SELECTED.match(entry.getKey())) {
+
+                            List<Long> giftIds = entry.getValue().stream()
+                                    .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
+
+                            if (CollectionUtils.isNotEmpty(giftIds)) {
+
+                                // 同步更新课程购买用户数据
+                                saveCoursePurchaseUserRecordInfo(groupId, courseType, giftIds, entry);
+                            }
+
+                        }
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error("asyncUpdateCourseRelationMusicAlbumInfo groupId={}, courseType={}", groupId, courseType, e);
+            }
+
+        });
+
+    }
+
+    /**
+     * 更新课程购买用户数据
+     * @param groupId 课程组ID
+     * @param courseType CourseTypeEnum
+     * @param giftIds 课程赠送关联ID
+     * @param entry Map.Entry<Integer, List<CourseRelationMusicAlbum>>
+     */
+    private void saveCoursePurchaseUserRecordInfo(Long groupId, CourseTypeEnum courseType, List<Long> giftIds,
+                                                     Map.Entry<Integer, List<CourseRelationMusicAlbum>> entry) {
+
+        long teacherId;
+        // 给已购买用户重新添加购买数据
+        if (CourseTypeEnum.VIDEO == courseType) {
+            // 视频课购买
+            teacherId = Optional.ofNullable(videoLessonGroupService.getById(groupId))
+                    .map(VideoLessonGroup::getId).orElse(0L);
+        } else {
+            // 其他课程购买
+            teacherId = Optional.ofNullable(courseGroupService.getById(groupId))
+                    .map(CourseGroup::getTeacherId).orElse(0L);
+        }
+
+        CourseRelationWrapper.PurchaseRecordQueryInfo queryInfo = CourseRelationWrapper.PurchaseRecordQueryInfo
+                .builder()
+                .courseType(courseType)
+                .orderStatus(OrderStatusEnum.PAID)
+                .groupId(groupId)
+                .build();
+
+        // 分页查询课程用户购买信息
+        Page<UserOrder> pageInfo = new Page<>(1, 10);
+        getBaseMapper().selectCoursePurchaseUserInfo(pageInfo, queryInfo);
+
+        int limit = 100;
+        int pages = ((int) pageInfo.getTotal() - 1) / limit + 1;
+
+        List<UserOrder> records;
+        List<CourseRelationWrapper.MusicAlbumRecord> musicAlbumRecords;
+        Map<Long, Long> purchaseIdMap;
+        for (int page = 1; page <= pages; page++) {
+
+            records = getBaseMapper().selectCoursePurchaseUserInfo(new Page<>(page, limit), queryInfo);
+
+            for (UserOrder record : records) {
+
+                // 查询用户购买记录
+                purchaseIdMap = musicSheetPurchaseRecordService.lambdaQuery()
+                        .eq(MusicSheetPurchaseRecord::getStudentId, record.getUserId())
+                        .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
+                        .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, giftIds)
+                        .list().stream()
+                        .collect(Collectors.toMap(MusicSheetPurchaseRecord::getCourseMusicAlbumId, MusicSheetPurchaseRecord::getId, (o, n) -> n));
+
+                musicAlbumRecords = Lists.newArrayList();
+                // 补录用户购买赠送曲目、专辑
+                for (CourseRelationMusicAlbum item : entry.getValue()) {
+
+                    musicAlbumRecords.add(CourseRelationWrapper.MusicAlbumRecord
+                            .builder()
+                            .clientType(record.getOrderClient())
+                            .musicSheetId(item.getMusicAlbumId())
+                            .orderNo(record.getOrderNo())
+                            .purchasePrice(BigDecimal.ZERO)
+                            .purchaseTime(DateTime.now().toDate())
+                            .teacherId(teacherId)
+                            .originalPrice(BigDecimal.ZERO)
+                            .musicSheetServiceFee(BigDecimal.ZERO)
+                            .orderStatus(OrderStatusEnum.PAID)
+                            .studentId(record.getUserId())
+                            .purchaseType(PurchaseRecordTypeEnum.valueOf(item.getRelationType().getCode()))
+                            .courseMusicAlbumId(item.getId())
+                            .id(purchaseIdMap.get(item.getId()))
+                            .build());
+                }
+
+                if (CollectionUtils.isNotEmpty(musicAlbumRecords)) {
+
+                    // 批量插入课程赠送曲目、专辑数据
+                    musicSheetPurchaseRecordService.saveBatch(JSON.parseArray(JSON.toJSONString(musicAlbumRecords),
+                            MusicSheetPurchaseRecord.class), 30);
+                }
+            }
+        }
+
+        // 更新课程关联曲目状态
+        lambdaUpdate()
+                .in(CourseRelationMusicAlbum::getId, giftIds)
+                .set(CourseRelationMusicAlbum::getDelFlog, EStatus.ENABLE.getValue())
+                .update();
+    }
+
+
+}

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

@@ -3,12 +3,14 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
@@ -21,6 +23,7 @@ import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.ActivityShareEnum;
 import org.apache.commons.collections.CollectionUtils;
@@ -327,10 +330,21 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
             return iPage;
         }
         List<MusicAlbumVo> favoriteNumAndMusicNumList =baseMapper.selectFavoriteNumAndMusicNum(records);
+        Map<Long, List<MusicAlbumVo>> collect = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(favoriteNumAndMusicNumList)) {
+            collect = favoriteNumAndMusicNumList.stream().collect(Collectors.groupingBy(
+                                                                                      MusicAlbumVo::getId));
+        }
 
-        for (int i = 0; i < records.size(); i++) {
-            records.get(i).setAlbumFavoriteCount(favoriteNumAndMusicNumList.get(i).getAlbumFavoriteCount());
-            records.get(i).setMusicSheetCount(favoriteNumAndMusicNumList.get(i).getMusicSheetCount());
+        for (MusicAlbumVo record : records) {
+            List<MusicAlbumVo> musicAlbumVos = collect.get(record.getId());
+            if (CollectionUtils.isNotEmpty(musicAlbumVos)) {
+                record.setAlbumFavoriteCount(musicAlbumVos.get(0).getAlbumFavoriteCount());
+                record.setAlbumFavoriteCount(musicAlbumVos.get(0).getMusicSheetCount());
+            } else {
+                record.setAlbumFavoriteCount(0);
+                record.setMusicSheetCount(0);
+            }
         }
         return iPage;
     }
@@ -406,6 +420,11 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         return shareProfitVo;
     }
 
+    @Override
+    public IPage<StudentMusicAlbumOrderVo>  selectStudentOrderPage(IPage<StudentMusicAlbumOrderVo> page, StudentMusicSheetOrderSearch query) {
+        return page.setRecords(baseMapper.selectStudentOrderPage(page, query));
+    }
+
     private boolean checkNameRepeat(String albumName, Long id) {
         LambdaQueryChainWrapper<MusicAlbum> eq = this.lambdaQuery()
                                                      .eq(MusicAlbum::getDelFlag,0)

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
@@ -45,4 +46,9 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
         }
         return list.get(0);
     }
+
+    @Override
+    public void updateCourseMusicAlbum(List<CourseRelationMusicAlbum> updateCourseRelationMusicAlbums) {
+        musicSheetPurchaseRecordDao.updateCourseMusicAlbum(updateCourseRelationMusicAlbums);
+    }
 }

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

@@ -613,6 +613,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     public boolean del(Long id) {
 
         MusicSheet musicSheet = super.getById(id);
+        if (musicSheet == null) {
+            throw new BizException("曲目不存在");
+        }
         if (YesOrNoEnum.YES.getCode().equals(musicSheet.getState().getCode())) {
             throw new BizException("启用状态下,不可删除");
         }
@@ -719,6 +722,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             return;
         }
         MusicSheet musicSheet = this.getById(id);
+        if (musicSheet == null) {
+            throw new BizException("曲目不存在");
+        }
         if (musicSheet.getMusicSubject().equals(subjectId)) {
             return;
         }
@@ -948,6 +954,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheetPurchaseRecord.setOrderStatus(OrderStatusEnum.PAID);
         musicSheetPurchaseRecord.setStudentId(userOrderDetailVo.getUserId());
         musicSheetPurchaseRecord.setPurchaseType(PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getGoodType().getCode()));
+        musicSheetPurchaseRecord.setCourseMusicAlbumId(0L);
         musicSheetPurchaseRecordService.saveOrUpdate(musicSheetPurchaseRecord);
     }
 
@@ -1138,6 +1145,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Override
     public MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser, ClientEnum clientType) {
         MusicSheetDetailVo detail = detail(musicSheetId, null, null);
+        if (detail == null) {
+            throw new BizException("曲目不存在");
+        }
         MusicSheetWebsiteDetailVo musicSheetWebsiteDetailVo = new MusicSheetWebsiteDetailVo();
         BeanUtils.copyProperties(detail, musicSheetWebsiteDetailVo);
 
@@ -1170,7 +1180,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 musicSheetWebsiteDetailVo.setFavorite(YesOrNoEnum.YES);
             }
         }
-        musicSheetWebsiteDetailVo.setFavoriteNum(Long.valueOf(detail.getFavoriteCount()));
+        Integer favoriteCount = detail.getFavoriteCount();
+        if (favoriteCount == null) {
+            favoriteCount = 0;
+        }
+        musicSheetWebsiteDetailVo.setFavoriteNum(Long.valueOf(favoriteCount));
 
         // 老师的曲目
         MusicSheetSearch musicSheetSearch = new MusicSheetSearch();
@@ -1242,6 +1256,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     public Boolean top(Long musicSheetId) {
         MusicSheet musicSheet = getById(musicSheetId);
 
+        if (musicSheet == null) {
+            throw new BizException("曲目不存在");
+        }
+
         if (YesOrNoEnum.NO.equals(musicSheet.getState())) {
             throw new BizException("下架的曲目不能置顶");
         }

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

@@ -3,8 +3,26 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.yonge.cooleshow.biz.dal.dto.CourseMusicAlbumRelationDto;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import org.apache.commons.collections.CollectionUtils;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -13,7 +31,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -44,7 +61,7 @@ import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentVo;
 import com.yonge.toolset.utils.json.JsonUtil;
 
 /**
- * VideoLessonGroupDetailService服务实现类
+ * VideoLessonGroupDetailService服务实现类ø
  * @author yzp
  * @date 2022-03-26 00:01:38
  * @version v1.0
@@ -71,6 +88,12 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
 
     @Autowired
     private TeacherService teacherService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
+    @Autowired
+    private MusicSheetService musicSheetService;
+    @Autowired
+    private MusicAlbumService musicAlbumService;
 
     public VideoLessonGroupDetailDao getDao() {
         return videoLessonGroupDetailDao;
@@ -103,7 +126,7 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void insertVideoLesson(List<VideoLessonGroupDetail> videoLessonList, SysUser sysUser) {
+    public void insertVideoLesson(List<VideoLessonGroupDetailDto> videoLessonList, SysUser sysUser) {
         Set<Long> synSet = Collections.synchronizedSet(new HashSet<>());
         for (VideoLessonGroupDetail detail : videoLessonList) {
             detail.setTeacherId(sysUser.getId());
@@ -214,11 +237,117 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
 
         VideoLessonSearch search = new VideoLessonSearch();
         search.setVideoLessonGroupId(groupId);
-        lessonStudentVo.setDetailList(JsonUtil.parseArray(videoLessonGroupLog.getVideoDetailJson(), VideoLessonGroupDetail.class));
+        lessonStudentVo.setDetailList(JsonUtil.parseArray(videoLessonGroupLog.getVideoDetailJson(), VideoLessonGroupDetailDto.class));
+
+        List<CourseRelationMusicAlbum> recordInfos = lessonStudentVo.getDetailList().stream()
+                .filter(x -> CollectionUtils.isNotEmpty(x.getCourseRelationMusicAlbumList()))
+                .flatMap(x -> x.getCourseRelationMusicAlbumList().stream()).collect(Collectors.toList());
+        // // 课程关联曲目、专辑信息
+        // List<CourseRelationMusicAlbum> recordInfos = JSON.parseArray(JSON.toJSONString(relationMusicAlbums),
+        //         CourseRelationMusicAlbum.class);
+
+        List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos;
+        if (CollectionUtils.isNotEmpty(recordInfos)) {
+
+            musicAlbumInfos = getCourseRelationMusicAlbumInfos(recordInfos);
+
+            // 填充课程关联曲目、专辑信息
+            updateCourseRelationMusicAlbumInfo(lessonStudentVo.getDetailList(), musicAlbumInfos);
+        }
+        //lessonStudentVo.setMusicAlbumInfos(musicAlbumInfos);
+
+
         return lessonStudentVo;
     }
 
     /**
+     * 填充课程关联曲目、专辑信息
+     * @param lessonStudentVo VideoLessonStudentVo
+     * @param musicAlbumInfos List<CourseRelationWrapper.MusicAlbumInfo>
+     */
+    @Override
+    public void updateCourseRelationMusicAlbumInfo(List<VideoLessonGroupDetailDto> lessonStudentVo,
+                                                   List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos) {
+
+        Map<Long, List<CourseRelationWrapper.MusicAlbumInfo>> collect = musicAlbumInfos.stream()
+                .collect(Collectors.groupingBy(CourseRelationWrapper.MusicAlbumInfo::getCourseId));
+
+        if (CollectionUtils.isNotEmpty(lessonStudentVo)) {
+
+            for (VideoLessonGroupDetailDto item : lessonStudentVo) {
+
+                item.setMusicAlbumInfos(collect.getOrDefault(item.getId(), Lists.newArrayList()));
+            }
+        }
+    }
+
+    /**
+     * 课程关联曲目/专辑信息
+     * @param recordInfos
+     * @return List<CourseRelationWrapper.MusicAlbumInfo>
+     */
+    @Override
+    public List<CourseRelationWrapper.MusicAlbumInfo> getCourseRelationMusicAlbumInfos(List<CourseRelationMusicAlbum> recordInfos) {
+
+        List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos = JSON.parseArray(JSON.toJSONString(recordInfos),
+                CourseRelationWrapper.MusicAlbumInfo.class);
+
+        // 分别查询曲目/专辑信息
+        Map<String, List<Long>> collect = musicAlbumInfos.stream()
+                .collect(Collectors.groupingBy(x -> x.getRelationType().getCode(),
+                        Collectors.mapping(CourseRelationWrapper.MusicAlbumInfo::getMusicAlbumId, Collectors.toList())));
+
+        Map<Long, MusicSheet> musicInfoMap = Maps.newHashMap();
+        // 曲目信息
+        if (collect.containsKey(RelationMusicAlbumEnum.MUSIC.name())) {
+
+            List<Long> musicIds = collect.get(RelationMusicAlbumEnum.MUSIC.name());
+
+            musicInfoMap = musicSheetService.listByIds(musicIds).stream()
+                    .collect(Collectors.toMap(MusicSheet::getId, Function.identity(), (o, n) -> n));
+        }
+
+        Map<Long, MusicAlbum> albumInfoMap = Maps.newHashMap();
+        // 专辑信息
+        if (collect.containsKey(RelationMusicAlbumEnum.ALBUM.name())) {
+
+            List<Long> albumIds = collect.get(RelationMusicAlbumEnum.ALBUM.name());
+
+            albumInfoMap = musicAlbumService.listByIds(albumIds).stream()
+                    .collect(Collectors.toMap(MusicAlbum::getId, Function.identity(), (o, n) -> n));
+        }
+
+        for (CourseRelationWrapper.MusicAlbumInfo item : musicAlbumInfos) {
+
+            item.name("").cover("");
+            if (RelationMusicAlbumEnum.MUSIC == item.getRelationType()
+                    && musicInfoMap.containsKey(item.getMusicAlbumId())) {
+
+                MusicSheet music = musicInfoMap.get(item.getMusicAlbumId());
+
+                item.name(music.getMusicSheetName())
+                        .cover(music.getTitleImg());
+                item.setRemark(music.getComposer());
+                item.setTagIds(music.getMusicTag());
+                item.setStatus(YesOrNoEnum.YES);
+            }
+
+            if (RelationMusicAlbumEnum.ALBUM == item.getRelationType()
+                    && albumInfoMap.containsKey(item.getMusicAlbumId())) {
+
+                MusicAlbum album = albumInfoMap.get(item.getMusicAlbumId());
+
+                item.name(album.getAlbumName())
+                        .cover(album.getAlbumCoverUrl());
+                item.setRemark(album.getAlbumDesc());
+                item.setTagIds(album.getAlbumTag());
+                item.setStatus(album.getAlbumStatus());
+            }
+        }
+        return musicAlbumInfos;
+    }
+
+    /**
     * @Description: 刷新组内lesson_count_
     * @Author: cy 
     * @Date: 2022/3/31 

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

@@ -1,12 +1,31 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.dto.CourseMusicAlbumRelationDto;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.MusicTag;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.service.MusicTagService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -76,6 +95,9 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     private final static Logger log = LoggerFactory.getLogger(VideoLessonGroupServiceImpl.class);
 
     @Autowired
+    private MusicTagService musicTagService;
+
+    @Autowired
     private VideoLessonGroupDao videoLessonGroupDao;
     @Autowired
     private VideoLessonGroupDetailDao videoLessonGroupDetailDao;
@@ -96,6 +118,17 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     
     @Autowired
     private VideoLessonGroupLogService videoLessonGroupLogService;
+    @Autowired
+    private VideoLessonGroupDetailService videoLessonGroupDetailService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
+
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
+
+
+    @Autowired
+    private VideoLessonPurchaseRecordService videoLessonPurchaseRecordService;
 
     public VideoLessonGroupDao getDao() {
         return videoLessonGroupDao;
@@ -164,6 +197,7 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     	
     	if (examineVo.getAuditStatus().equals("PASS")) {
     		examineVo.setShelvesFlag(1);
+            examineVo.setShelvesTime(new Date());
     	}
         //改主表
         videoLessonGroupDao.updateExamine(examineVo);
@@ -187,6 +221,10 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         // 设置标签
         if (AuthStatusEnum.PASS.getCode().equals(examineVo.getAuditStatus())) {
             teacherService.setTeacherTag(lessonGroup.getTeacherId(), TeacherTagEnum.VIDEO);
+
+            // 设置关联的曲目
+            courseRelationMusicAlbumService.asyncUpdateCourseRelationMusicAlbumInfo(examineVo.getId(),CourseTypeEnum.VIDEO);
+
         }
 
         //推送
@@ -215,8 +253,99 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         }
     }
 
+    /**
+     * 处理课程曲目关联关系
+     */
+    private void courseMusicAlbumRelation(List<VideoLessonGroupDetailDto> lessonList, Long lessonGroupId, Long userBy) {
+        // 设置关联曲目
+
+        // 需要更新的关联数据
+        List<CourseRelationMusicAlbum> updateCourseRelationMusicAlbums = new ArrayList<>();
+        // 需要添加的关联数据
+        List<CourseRelationMusicAlbum> addCourseRelationMusicAlbums = new ArrayList<>();
+
+        // 查询课程组所有的关联曲目
+        List<CourseRelationMusicAlbum> relationMusicAlbumList = courseRelationMusicAlbumService.lambdaQuery()
+                        .eq(CourseRelationMusicAlbum::getCourseGroupId,  lessonGroupId)
+                        .ne(CourseRelationMusicAlbum::getDelFlog, 0)
+                        .list();
+
+        if (CollectionUtils.isEmpty(relationMusicAlbumList)) {
+            relationMusicAlbumList = new ArrayList<>();
+        }
+
+        // 需要更新的id
+        List<Long> updateCourseRelationIdList = new ArrayList<>();
+        for (VideoLessonGroupDetailDto videoLessonGroupDetailDto : lessonList) {
+            // 需要修改的关联数据
+            List<CourseMusicAlbumRelationDto> relationList = Optional.ofNullable(videoLessonGroupDetailDto.getRelationList())
+                    .orElse(Lists.newArrayList());
+
+            videoLessonGroupDetailDto.setCourseRelationMusicAlbumList(new ArrayList<>());
+
+            for (CourseMusicAlbumRelationDto courseMusicAlbumRelationDto : relationList) {
+                CourseRelationMusicAlbum courseRelationMusicAlbum = new CourseRelationMusicAlbum();
+                // 修改的数据
+                if (courseMusicAlbumRelationDto.getRelationId() != null && courseMusicAlbumRelationDto.getRelationId() != 0) {
+                    for (CourseRelationMusicAlbum relationMusicAlbum : relationMusicAlbumList) {
+                        if (relationMusicAlbum.getId().equals(courseMusicAlbumRelationDto.getRelationId())) {
+                            updateCourseRelationIdList.add(courseMusicAlbumRelationDto.getRelationId());
+                            courseRelationMusicAlbum = relationMusicAlbum;
+                            break;
+                        }
+                    }
+                }
+                courseRelationMusicAlbum.setCourseGroupId(videoLessonGroupDetailDto.getVideoLessonGroupId());
+                courseRelationMusicAlbum.setCourseId(videoLessonGroupDetailDto.getId());
+                courseRelationMusicAlbum.setCourseType(CourseTypeEnum.VIDEO);
+                courseRelationMusicAlbum.setMusicAlbumId(courseMusicAlbumRelationDto.getMusicAlbumId());
+                // 推荐该赠送
+                if (courseRelationMusicAlbum.getUseRelationType() != null
+                        && courseRelationMusicAlbum.getUseRelationType().equals(CourseRelationTypeEnum.RECOMMEND)
+                        && courseMusicAlbumRelationDto.getUseRelationType().equals(CourseRelationTypeEnum.GIFT)) {
+                    courseRelationMusicAlbum.setDelFlog(2);
+                } else if (courseRelationMusicAlbum.getDelFlog() == null) {
+                    courseRelationMusicAlbum.setDelFlog(1);
+                }
+                courseRelationMusicAlbum.setRelationType(courseMusicAlbumRelationDto.getRelationMusicAlbum());
+                courseRelationMusicAlbum.setUseRelationType(courseMusicAlbumRelationDto.getUseRelationType());
+                courseRelationMusicAlbum.setUpdateBy(userBy);
+                courseRelationMusicAlbum.setUpdateTime(new Date());
+                if (courseRelationMusicAlbum.getId() == null) {
+                    courseRelationMusicAlbum.setCreateBy(userBy);
+                    courseRelationMusicAlbum.setCreateTime(new Date());
+                    courseRelationMusicAlbum.setDelFlog(2);
+                    addCourseRelationMusicAlbums.add(courseRelationMusicAlbum);
+                } else {
+                    updateCourseRelationMusicAlbums.add(courseRelationMusicAlbum);
+                }
+                videoLessonGroupDetailDto.getCourseRelationMusicAlbumList().add(courseRelationMusicAlbum);
+            }
+        }
+        // 删除关联数据
+        courseRelationMusicAlbumService.lambdaUpdate()
+                 .eq(CourseRelationMusicAlbum::getCourseGroupId, lessonGroupId)
+                 .eq(CourseRelationMusicAlbum::getCourseType,CourseTypeEnum.VIDEO)
+                 .notIn(CourseRelationMusicAlbum::getId,updateCourseRelationIdList)
+                 .set(CourseRelationMusicAlbum::getDelFlog,0)
+                 .set(CourseRelationMusicAlbum::getUpdateTime,new Date())
+                 .update();
+
+        // 保存更新的关联数据
+        if (CollectionUtils.isNotEmpty(updateCourseRelationMusicAlbums)) {
+            courseRelationMusicAlbumService.updateBatchById(updateCourseRelationMusicAlbums);
+        }
+        if (CollectionUtils.isNotEmpty(addCourseRelationMusicAlbums)) {
+            courseRelationMusicAlbumService.saveOrUpdateBatch(addCourseRelationMusicAlbums);
+        }
+    }
+
     @Override
     public void updateShelves(VideoLessonShelvesVo shelvesVo) {
+        VideoLessonGroup videoLessonGroup = getById(shelvesVo.getId());
+        if (videoLessonGroup.getDraftFlag() != null && videoLessonGroup.getDraftFlag().equals(YesOrNoEnum.YES)) {
+            throw new BizException("草稿状态不能上架");
+        }
         //改主表
         videoLessonGroupDao.updateShelves(shelvesVo);
         if(shelvesVo.getShelvesFlag() == 0 && ClientEnum.SYSTEM.equals(shelvesVo.getClientType())){
@@ -256,12 +385,16 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
      * @Description: 新增视频课组&视频课
      * @Author: cy
      * @Date: 2022/4/1
+     * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void add(VideoLessonVo lessonVo, SysUser sysUser) {
+    public Long add(VideoLessonVo lessonVo, SysUser sysUser) {
         VideoLessonGroup lessonGroup = lessonVo.getLessonGroup();
-        List<VideoLessonGroupDetail> lessonList = lessonVo.getLessonList();
+        List<VideoLessonGroupDetailDto> lessonList = lessonVo.getLessonList();
+        if (CollectionUtils.isEmpty(lessonList)) {
+            lessonList = new ArrayList<>();
+        }
         lessonGroup.setLessonCount(lessonList.size());
 
         //校验声部
@@ -274,6 +407,24 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         
         Date date = new Date();
 
+        // 设置默认置顶和排序
+        if (lessonGroup.getTopFlag() == null) {
+            lessonGroup.setTopFlag(0);
+        }
+        if (lessonGroup.getSortNumber() == null) {
+            lessonGroup.setSortNumber(0);
+        }
+        lessonGroup.setAuditStatus(AuthStatusEnum.DOING);
+
+        // 草稿状态不审核
+        if (lessonGroup.getDraftFlag() == null) {
+            lessonGroup.setDraftFlag(YesOrNoEnum.NO);
+        }
+        if (lessonGroup.getDraftFlag().equals(YesOrNoEnum.YES)) {
+            lessonGroup.setAuditStatus(null);
+            lessonGroup.setShelvesFlag(0);
+        }
+
         //添加组
         lessonGroup.setTeacherId(sysUser.getId());
         lessonGroup.setAuditVersion(YesOrNoEnum.NO);
@@ -285,7 +436,9 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         }
 
         //添加课程
-        videoLessonGroupDetailDao.insertVideoLesson(lessonList);
+        if (CollectionUtils.isNotEmpty(lessonList)) {
+            videoLessonGroupDetailDao.insertVideoLesson(lessonList);
+        }
 
         //刷新统计
         VideoLessonGroupUpVo groupUpVo = new VideoLessonGroupUpVo();
@@ -299,23 +452,30 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         record.setAuditStatus(AuthStatusEnum.DOING.getCode());
         record.setAuthType(AuthTypeEnum.ADD);
         recordDao.insert(record);*/
-        
-        VideoLessonGroupLog  videoLessonGroupLog = new VideoLessonGroupLog();
-        
-        try {
-        	org.springframework.beans.BeanUtils.copyProperties(lessonGroup, videoLessonGroupLog);
-		} catch (Exception e) {
-			throw new BizException("属性复制失败");
-		}
-        videoLessonGroupLog.setId(null);
-        videoLessonGroupLog.setVideoLessonGroupId(lessonGroup.getId());
-        videoLessonGroupLog.setCreateTime(date);
-        videoLessonGroupLog.setUpdateTime(date);
-        videoLessonGroupLog.setModifierId(sysUser.getId());
-        videoLessonGroupLog.setVideoDetailJson(JsonUtil.toJSONString(lessonList));
-        videoLessonGroupLog.setVersion(videoLessonGroupLogService.queryMaxVersion(lessonGroup.getId()) + 1);
-        
-        videoLessonGroupLogService.insert(videoLessonGroupLog);
+
+
+        // 设置关联曲目
+        courseMusicAlbumRelation(lessonList, lessonGroup.getId(), lessonVo.getUserBy());
+
+        if (YesOrNoEnum.NO.equals(lessonGroup.getDraftFlag())) {
+            VideoLessonGroupLog videoLessonGroupLog = new VideoLessonGroupLog();
+
+            try {
+                org.springframework.beans.BeanUtils.copyProperties(lessonGroup, videoLessonGroupLog);
+            } catch (Exception e) {
+                throw new BizException("属性复制失败");
+            }
+            videoLessonGroupLog.setId(null);
+            videoLessonGroupLog.setVideoLessonGroupId(lessonGroup.getId());
+            videoLessonGroupLog.setCreateTime(date);
+            videoLessonGroupLog.setUpdateTime(date);
+            videoLessonGroupLog.setModifierId(sysUser.getId());
+            videoLessonGroupLog.setVideoDetailJson(JsonUtil.toJSONString(lessonList));
+            videoLessonGroupLog.setVersion(videoLessonGroupLogService.queryMaxVersion(lessonGroup.getId()) + 1);
+
+            videoLessonGroupLogService.insert(videoLessonGroupLog);
+        }
+        return lessonGroup.getId();
     }
 
     /**
@@ -370,6 +530,22 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         VideoLessonSearch search = new VideoLessonSearch();
         search.setVideoLessonGroupId(groupId);
         lessonStudentVo.setDetailList(videoLessonGroupDetailDao.selectPage(null, search));
+
+        // 课程关联曲目/专辑信息
+        List<CourseRelationMusicAlbum> recordInfos = courseRelationMusicAlbumService.lambdaQuery()
+                .eq(CourseRelationMusicAlbum::getCourseGroupId, groupId)
+                .list();
+
+        List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos;
+        if (CollectionUtils.isNotEmpty(recordInfos)) {
+
+            musicAlbumInfos = videoLessonGroupDetailService.getCourseRelationMusicAlbumInfos(recordInfos);
+
+            // 填充课程关联曲目、专辑信息
+            videoLessonGroupDetailService.updateCourseRelationMusicAlbumInfo(lessonStudentVo.getDetailList(), musicAlbumInfos);
+        }
+        //lessonStudentVo.setMusicAlbumInfos(musicAlbumInfos);
+
         return lessonStudentVo;
     }
 
@@ -387,12 +563,16 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
      * @Description: 修改视频课组&视频课
      * @Author: cy
      * @Date: 2022/4/7
+     * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void update(VideoLessonVo lessonVo, SysUser sysUser) {
+    public VideoLessonVo update(VideoLessonVo lessonVo, SysUser sysUser) {
         VideoLessonGroup lessonGroup = lessonVo.getLessonGroup();
-        List<VideoLessonGroupDetail> lessonList = lessonVo.getLessonList();
+        List<VideoLessonGroupDetailDto> lessonList = lessonVo.getLessonList();
+        if (CollectionUtils.isEmpty(lessonList)) {
+            lessonList = new ArrayList<>();
+        }
         lessonGroup.setLessonCount(lessonList.size());
         lessonGroup.setTeacherId(sysUser.getId());
         //判断是否有正在审核中
@@ -422,45 +602,72 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         authRecord.setVideoGroupId(lessonGroup.getId());
         //提交审核
         recordDao.insert(authRecord);*/
-        
-        videoLessonGroupDetailDao.deleteByGroupId(lessonGroup.getId());
-		if (lessonList != null && lessonList.size() > 0) {
-			for (VideoLessonGroupDetail detail : lessonList) {
-				detail.setVideoLessonGroupId(lessonGroup.getId());
-				detail.setTeacherId(sysUser.getId());
-				detail.setUpdateBy(sysUser.getId());
-			}
-			// 添加课程
-			videoLessonGroupDetailDao.insertVideoLesson(lessonList);
-		}
-        
-        VideoLessonGroupLog  videoLessonGroupLog = new VideoLessonGroupLog();
-        
-        try {
-        	org.springframework.beans.BeanUtils.copyProperties(lessonGroup, videoLessonGroupLog);
-		} catch (Exception e) {
-			throw new BizException("属性复制失败");
-		}
-        videoLessonGroupLog.setId(null);
-        videoLessonGroupLog.setVideoLessonGroupId(lessonGroup.getId());
-        videoLessonGroupLog.setCreateTime(date);
-        videoLessonGroupLog.setUpdateTime(date);
-        videoLessonGroupLog.setModifierId(sysUser.getId());
-        videoLessonGroupLog.setVideoDetailJson(JsonUtil.toJSONString(lessonList));
-        videoLessonGroupLog.setVersion(videoLessonGroupLogService.queryMaxVersion(lessonGroup.getId()) + 1);
-        
-        videoLessonGroupLogService.insert(videoLessonGroupLog);
+
+        // 提交第一页不删除课程
+        if (lessonVo.getPage() == 2) {
+            videoLessonGroupDetailDao.deleteByGroupId(lessonGroup.getId());
+            if (lessonList != null && lessonList.size() > 0) {
+                for (VideoLessonGroupDetail detail : lessonList) {
+                    detail.setVideoLessonGroupId(lessonGroup.getId());
+                    detail.setTeacherId(sysUser.getId());
+                    detail.setUpdateBy(sysUser.getId());
+                }
+                // 添加课程
+                videoLessonGroupDetailDao.insertVideoLesson(lessonList);
+            }
+        }
+
+
+        // 草稿状态不审核
+        if (lessonGroup.getDraftFlag() == null) {
+            lessonGroup.setDraftFlag(YesOrNoEnum.NO);
+        }
 
         //修改课程组记录
         lessonGroup.setAuditVersion(YesOrNoEnum.NO);
         lessonGroup.setAuditStatus(AuthStatusEnum.DOING);
+
+        if (lessonGroup.getDraftFlag().equals(YesOrNoEnum.YES)) {
+            lessonGroup.setAuditStatus(null);
+            lessonGroup.setShelvesFlag(0);
+            this.lambdaUpdate()
+                    .eq(VideoLessonGroup::getId,lessonGroup.getId())
+                    .set(VideoLessonGroup::getAuditStatus,null)
+                    .update();
+        }
         lessonGroup.setUpdateTime(date);
         videoLessonGroupDao.updateById(lessonGroup);
 
+        // 设置关联曲目
+        if (lessonVo.getPage() == 2) {
+            courseMusicAlbumRelation(lessonList, lessonGroup.getId(), lessonVo.getUserBy());
+        }
+
+        if (lessonGroup.getDraftFlag().equals(YesOrNoEnum.NO)) {
+
+            VideoLessonGroupLog videoLessonGroupLog = new VideoLessonGroupLog();
+
+            try {
+                org.springframework.beans.BeanUtils.copyProperties(lessonGroup, videoLessonGroupLog);
+            } catch (Exception e) {
+                throw new BizException("属性复制失败");
+            }
+            videoLessonGroupLog.setId(null);
+            videoLessonGroupLog.setVideoLessonGroupId(lessonGroup.getId());
+            videoLessonGroupLog.setCreateTime(date);
+            videoLessonGroupLog.setUpdateTime(date);
+            videoLessonGroupLog.setModifierId(sysUser.getId());
+            videoLessonGroupLog.setVideoDetailJson(JsonUtil.toJSONString(lessonList));
+            videoLessonGroupLog.setVersion(videoLessonGroupLogService.queryMaxVersion(lessonGroup.getId()) + 1);
+
+            videoLessonGroupLogService.insert(videoLessonGroupLog);
+        }
+
         //刷新统计
         VideoLessonGroupUpVo groupUpVo = new VideoLessonGroupUpVo();
         groupUpVo.setId(lessonGroup.getId());
         videoLessonGroupDao.updateGroup(groupUpVo);
+        return lessonVo;
     }
 
     /**
@@ -505,7 +712,18 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     public IPage<VideoLessonAuthGroup> queryGroupHistoryList(IPage<VideoLessonAuthGroup> page, VideoGroupSearch query) {
     	List<VideoLessonAuthGroup> list = baseMapper.queryGroupHistoryList(page, query);
     	for(VideoLessonAuthGroup g : list){
-    		g.setVideoList(JsonUtil.parseArray(g.getVideoDetailJson(), VideoLessonGroupDetail.class));
+            List<VideoLessonGroupDetailDto> videoLessonGroupDetailDtoList = JsonUtil.parseArray(g.getVideoDetailJson(),
+                                                                                                VideoLessonGroupDetailDto.class);
+            g.setVideoList(videoLessonGroupDetailDtoList);
+
+
+            List<CourseRelationMusicAlbum> recordInfos = videoLessonGroupDetailDtoList.stream()
+                                  .filter(x -> CollectionUtils.isNotEmpty(x.getCourseRelationMusicAlbumList()))
+                                  .flatMap(x -> x.getCourseRelationMusicAlbumList().stream()).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(recordInfos)) {
+                // 设置曲目关联信息
+                setCourseRelationInfo(videoLessonGroupDetailDtoList, recordInfos);
+            }
     	}
         return page.setRecords(list);
     }
@@ -514,20 +732,47 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
     public VideoLessonAuthGroup authGroupDetil(Long videoGroupId) {
         VideoLessonAuthGroup videoLessonAuthGroup = baseMapper.authGroupDetil(videoGroupId);
         
-        List<VideoLessonGroupDetail> details = videoLessonGroupDetailDao.queryByVideoLessonGroupId(videoGroupId);
+        List<VideoLessonGroupDetailDto> details = videoLessonGroupDetailDao.queryByVideoLessonGroupId(videoGroupId);
         videoLessonAuthGroup.setVideoList(details);
 
+        // 查询当前的关联曲目
+        List<CourseRelationMusicAlbum> list = courseRelationMusicAlbumService.lambdaQuery()
+                             .eq(CourseRelationMusicAlbum::getCourseGroupId,  videoGroupId)
+                             .ne(CourseRelationMusicAlbum::getDelFlog, 0) .list();
+        // 设置曲目关联信息
+        setCourseRelationInfo(details, list);
+
         //查询上一次的提交
         VideoLessonGroupLog lastDetil = videoLessonGroupLogService.queryByVideoLessonGroupId(videoGroupId, videoLessonAuthGroup.getVersion());
         videoLessonAuthGroup.setLastVideoLessonGroupLog(lastDetil);
         
         if(lastDetil != null){
-        	lastDetil.setVideoList(JsonUtil.parseArray(lastDetil.getVideoDetailJson(), VideoLessonGroupDetail.class));
+            List<VideoLessonGroupDetailDto> videoLessonGroupDetailDtoList = JsonUtil.parseArray(
+                    lastDetil.getVideoDetailJson(), VideoLessonGroupDetailDto.class);
+            lastDetil.setVideoList(videoLessonGroupDetailDtoList);
+
+
+            List<CourseRelationMusicAlbum> recordInfos = videoLessonGroupDetailDtoList.stream()
+                            .filter(x -> CollectionUtils.isNotEmpty(x.getCourseRelationMusicAlbumList()))
+                            .flatMap(x -> x.getCourseRelationMusicAlbumList().stream()).collect(Collectors.toList());
+            // 设置曲目关联信息
+            setCourseRelationInfo(videoLessonGroupDetailDtoList, recordInfos);
         }
         
         return videoLessonAuthGroup;
     }
 
+    private void setCourseRelationInfo(List<VideoLessonGroupDetailDto> details, List<CourseRelationMusicAlbum> list) {
+        if (CollectionUtils.isNotEmpty(list)) {
+
+            List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos = videoLessonGroupDetailService.getCourseRelationMusicAlbumInfos(
+                    list);
+
+            // 填充课程关联曲目、专辑信息
+            videoLessonGroupDetailService.updateCourseRelationMusicAlbumInfo(details, musicAlbumInfos);
+        }
+    }
+
     /**
      * @Description: 学生端-我的-我的课程-购买的视频课组
      * @Author: cy
@@ -567,5 +812,76 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
 
     }
 
+    @Override
+    public Boolean top(Long videoLessonGroupId) {
+        VideoLessonGroup videoLessonGroup = getById(videoLessonGroupId);
+        if (videoLessonGroup == null) {
+            throw new BizException("未找到视频课信息");
+        }
+        VideoLessonGroup lessonGroup = new VideoLessonGroup();
+        lessonGroup.setTopFlag(videoLessonGroup.getTopFlag() == 1?0:1);
+        lessonGroup.setId(videoLessonGroupId);
+        return this.updateById(lessonGroup);
+
+    }
+
+    @Override
+    public IPage<CourseRelationWrapper.MusicAlbumInfo> queryRelationMusicAlbum(IPage<CourseRelationWrapper.MusicAlbumInfo> page, CourseRelationQueryInfo queryInfo) {
+        IPage courseRelationMusicAlbumIPage = new Page<>(page.getCurrent(),page.getSize());
+        courseRelationMusicAlbumIPage = courseRelationMusicAlbumService.lambdaQuery()
+                           .eq(CourseRelationMusicAlbum::getCourseGroupId,queryInfo.getCourseGroupId())
+                            .eq(CourseRelationMusicAlbum::getCourseType, queryInfo.getCourseType())
+                            .ne(CourseRelationMusicAlbum::getDelFlog,0)
+                           .orderByAsc(CourseRelationMusicAlbum::getCourseId)
+                           .orderByDesc( CourseRelationMusicAlbum::getId)
+                           .page(courseRelationMusicAlbumIPage);
+        List<CourseRelationMusicAlbum> records = courseRelationMusicAlbumIPage.getRecords();
+        List<CourseRelationWrapper.MusicAlbumInfo> courseRelationMusicAlbumInfos = videoLessonGroupDetailService.getCourseRelationMusicAlbumInfos(
+                records);
+
+        // 课程id集合
+        List<Long> courseIdList = courseRelationMusicAlbumInfos.stream()
+                                                          .map(CourseRelationWrapper.MusicAlbumInfo::getCourseId)
+                                                          .collect(Collectors.toList());
+        // 查询课程名
+        List<VideoLessonGroupDetail> list = videoLessonGroupDetailService.lambdaQuery()
+                                                                         .in(VideoLessonGroupDetail::getId,courseIdList)
+                                                                         .list();
+
+        Map<Long, String> collect = list.stream()
+                                        .collect(Collectors.toMap(VideoLessonGroupDetail::getId,
+                                                                  VideoLessonGroupDetail::getVideoTitle));
+        for (CourseRelationWrapper.MusicAlbumInfo courseRelationMusicAlbumInfo : courseRelationMusicAlbumInfos) {
+            courseRelationMusicAlbumInfo.setVideoTitle(collect.get(courseRelationMusicAlbumInfo.getCourseId()));
+        }
+        //查询标签
+        List<Long> tagIdList =  courseRelationMusicAlbumInfos.stream()
+                                                             .map(CourseRelationWrapper.MusicAlbumInfo::getTagIds)
+                                                             .map(s -> Arrays.asList(s.split(",")))
+                                                             .flatMap(Collection::stream)
+                                                             .filter(StringUtils::isNotEmpty)
+                                                             .map(Long::parseLong).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(tagIdList)) {
+            List<MusicTag> musicTagList = musicTagService.lambdaQuery()
+                                                         .in(MusicTag::getId, tagIdList)
+                                                         .eq(MusicTag::getDelFlag, 0)
+                                                         .list();
+            Map<String, String> musicTagIdNameMap = musicTagList.stream()
+                                                                .collect(Collectors.toMap(o -> o.getId().toString(),
+                                                                                          MusicTag::getName));
+            for (CourseRelationWrapper.MusicAlbumInfo courseRelationMusicAlbumInfo : courseRelationMusicAlbumInfos) {
+                String tagIds = courseRelationMusicAlbumInfo.getTagIds();
+                String tagName = Arrays.stream(tagIds.split(","))
+                                       .map(musicTagIdNameMap::get)
+                                       .collect(Collectors.joining(","));
+                courseRelationMusicAlbumInfo.setTagName(tagName);
+            }
+        }
+
+        courseRelationMusicAlbumIPage.setRecords(courseRelationMusicAlbumInfos);
+        return courseRelationMusicAlbumIPage;
+
+    }
+
 
 }

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

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
@@ -12,15 +14,21 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -31,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * VideoLessonPurchaseRecordService服务实现类
@@ -60,6 +69,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     private SysMessageService sysMessageService;
     @Autowired
     private UserOrderService userOrderService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
 
     public VideoLessonPurchaseRecordDao getDao() {
         return videoLessonPurchaseRecordDao;
@@ -148,6 +161,60 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         //记录流水
         addTeacherAccount(orderParam, lessonGroup);
         videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
+
+        // 赠品曲目、专辑插入用户曲目购买记录表
+        List<CourseRelationMusicAlbum> musicAlbums = courseRelationMusicAlbumService.lambdaQuery()
+                .eq(CourseRelationMusicAlbum::getCourseGroupId, lessonGroup.getId())
+                .eq(CourseRelationMusicAlbum::getDelFlog, EStatus.ENABLE.getValue())
+                .eq(CourseRelationMusicAlbum::getUseRelationType, CourseRelationTypeEnum.GIFT)
+                .list();
+
+        List<Long> giftIds = musicAlbums.stream()
+                .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
+
+        Map<Long, Long> purchaseIdMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(giftIds)) {
+
+            // 查询用户购买记录
+            purchaseIdMap = musicSheetPurchaseRecordService.lambdaQuery()
+                    .eq(MusicSheetPurchaseRecord::getStudentId, orderParam.getUserId())
+                    .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
+                    .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, giftIds)
+                    .list().stream()
+                    .collect(Collectors.toMap(MusicSheetPurchaseRecord::getCourseMusicAlbumId, MusicSheetPurchaseRecord::getId, (o, n) -> n));
+        }
+
+        List<CourseRelationWrapper.MusicAlbumRecord> musicAlbumRecords = Lists.newArrayList();
+
+        for (CourseRelationMusicAlbum item : musicAlbums) {
+
+            musicAlbumRecords.add(CourseRelationWrapper.MusicAlbumRecord
+                    .builder()
+                    .clientType(orderParam.getOrderClient())
+                    .musicSheetId(item.getMusicAlbumId())
+                    .orderNo(orderParam.getOrderNo())
+                    .purchasePrice(BigDecimal.ZERO)
+                    .purchaseTime(DateTime.now().toDate())
+                    .teacherId(orderParam.getMerchId())
+                    .originalPrice(BigDecimal.ZERO)
+                    .musicSheetServiceFee(BigDecimal.ZERO)
+                    .orderStatus(OrderStatusEnum.PAID)
+                    .studentId(orderParam.getUserId())
+                    .purchaseType(PurchaseRecordTypeEnum.valueOf(item.getRelationType().getCode()))
+                    .id(purchaseIdMap.get(item.getId()))
+                    .courseMusicAlbumId(item.getId())
+                    .build());
+        }
+
+        if (CollectionUtils.isNotEmpty(musicAlbumRecords)) {
+
+            List<MusicSheetPurchaseRecord> records = JSON.parseArray(JSON.toJSONString(musicAlbumRecords),
+                    MusicSheetPurchaseRecord.class);
+
+            // 批量插入课程赠送曲目、专辑数据
+            musicSheetPurchaseRecordService.saveBatch(records, 30);
+        }
+
     }
 
     /**

+ 49 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVideoVo.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -37,6 +40,52 @@ public class CourseGroupVideoVo extends BaseEntity {
     @ApiModelProperty(value = "是否上架 (0:否  1:是)")
     private Integer shelvesFlag;
 
+    @ApiModelProperty(value = "草稿状态, 0正式1草稿")
+    private YesOrNoEnum draftFlag;
+
+
+    @ApiModelProperty(value = "审核状态(DOING:待审核 PASS:通过 UNPASS:未通过)")
+    private AuthStatusEnum status;  //审核状态
+
+    @ApiModelProperty(value = "排序号")
+    private Integer sortNumber;  //排序号
+
+
+    @ApiModelProperty(value = "是否置顶")
+    private Integer topFlag;  //是否置顶
+
+    public AuthStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(AuthStatusEnum status) {
+        this.status = status;
+    }
+
+    public Integer getSortNumber() {
+        return sortNumber;
+    }
+
+    public void setSortNumber(Integer sortNumber) {
+        this.sortNumber = sortNumber;
+    }
+
+    public Integer getTopFlag() {
+        return topFlag;
+    }
+
+    public void setTopFlag(Integer topFlag) {
+        this.topFlag = topFlag;
+    }
+
+    public YesOrNoEnum getDraftFlag() {
+        return draftFlag;
+    }
+
+    public void setDraftFlag(YesOrNoEnum draftFlag) {
+        this.draftFlag = draftFlag;
+    }
+
     public Date getRecordTime() {
         return recordTime;
     }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
@@ -54,6 +55,9 @@ public class LessonGroupVo extends BaseEntity {
     @ApiModelProperty("审核版本")
     private YesOrNoEnum auditVersion;
 
+    @ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+    private CourseRelationTypeEnum relationType;
+
     public YesOrNoEnum getAuditVersion() {
         return auditVersion;
     }
@@ -165,4 +169,12 @@ public class LessonGroupVo extends BaseEntity {
     public void setCountStudent(Integer countStudent) {
         this.countStudent = countStudent;
     }
+
+    public CourseRelationTypeEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(CourseRelationTypeEnum relationType) {
+        this.relationType = relationType;
+    }
 }

+ 92 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentMusicAlbumOrderVo.java

@@ -0,0 +1,92 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Description 学生曲目订单展示
+ *
+ * @author liujunchi
+ * @date 2022-04-02
+ */
+public class StudentMusicAlbumOrderVo {
+
+    @ApiModelProperty(value = "专辑id")
+    private Long  musicAlbumId;
+
+    @ApiModelProperty(value = "专辑名称")
+    private String musicAlbumName;  //曲谱名称
+
+    @ApiModelProperty(value = "封面图")
+    private String titleImg;  //曲谱名称
+
+    @ApiModelProperty("专辑分类名")
+    private String TagNames;
+
+    @ApiModelProperty(value = "支付金额")
+    private BigDecimal purchasePrice;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "购买时间")
+    private Date purchaseTime;
+
+    public Long getMusicAlbumId() {
+        return musicAlbumId;
+    }
+
+    public void setMusicAlbumId(Long musicAlbumId) {
+        this.musicAlbumId = musicAlbumId;
+    }
+
+    public String getMusicAlbumName() {
+        return musicAlbumName;
+    }
+
+    public void setMusicAlbumName(String musicAlbumName) {
+        this.musicAlbumName = musicAlbumName;
+    }
+
+    public String getTitleImg() {
+        return titleImg;
+    }
+
+    public void setTitleImg(String titleImg) {
+        this.titleImg = titleImg;
+    }
+
+    public String getTagNames() {
+        return TagNames;
+    }
+
+    public void setTagNames(String tagNames) {
+        TagNames = tagNames;
+    }
+
+    public BigDecimal getPurchasePrice() {
+        return purchasePrice;
+    }
+
+    public void setPurchasePrice(BigDecimal purchasePrice) {
+        this.purchasePrice = purchasePrice;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Date getPurchaseTime() {
+        return purchaseTime;
+    }
+
+    public void setPurchaseTime(Date purchaseTime) {
+        this.purchaseTime = purchaseTime;
+    }
+}

+ 4 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonAuthGroup.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -33,7 +34,7 @@ public class VideoLessonAuthGroup extends VideoLessonGroup {
     private String remarks;
 
     @ApiModelProperty("视频集合")
-    private List<VideoLessonGroupDetail> videoList;
+    private List<VideoLessonGroupDetailDto> videoList;
 
     @ApiModelProperty("上一次的修改记录")
     private VideoLessonGroupLog lastVideoLessonGroupLog;
@@ -90,11 +91,11 @@ public class VideoLessonAuthGroup extends VideoLessonGroup {
         this.videoGroupId = videoGroupId;
     }
 
-    public List<VideoLessonGroupDetail> getVideoList() {
+    public List<VideoLessonGroupDetailDto> getVideoList() {
         return videoList;
     }
 
-    public void setVideoList(List<VideoLessonGroupDetail> videoList) {
+    public void setVideoList(List<VideoLessonGroupDetailDto> videoList) {
         this.videoList = videoList;
     }
 

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonExamineVo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
+import java.util.Date;
 
 /**
  * @Author: cy
@@ -23,6 +24,17 @@ public class VideoLessonExamineVo extends BaseEntity {
     @ApiModelProperty(value = "备注")
     private String remarks;
 
+    @ApiModelProperty(value = "上下架时间", hidden = true)
+    private Date shelvesTime;
+
+    public Date getShelvesTime() {
+        return shelvesTime;
+    }
+
+    public void setShelvesTime(Date shelvesTime) {
+        this.shelvesTime = shelvesTime;
+    }
+
     public String getRemarks() {
         return remarks;
     }

+ 17 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java

@@ -1,7 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
@@ -17,7 +17,11 @@ import java.util.List;
 public class VideoLessonStudentVo extends BaseEntity {
     private VideoLessonGroupVo lessonGroup;
 
-    private List<VideoLessonGroupDetail> detailList;
+    @ApiModelProperty("课程详情信息 ")
+    private List<VideoLessonGroupDetailDto> detailList;
+
+    @ApiModelProperty("关联曲目/专辑信息 ")
+    private List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos;
 
     @ApiModelProperty(value = "true已买,false未买")
     private Boolean alreadyBuy;
@@ -64,11 +68,11 @@ public class VideoLessonStudentVo extends BaseEntity {
         this.lessonGroup = lessonGroup;
     }
 
-    public List<VideoLessonGroupDetail> getDetailList() {
+    public List<VideoLessonGroupDetailDto> getDetailList() {
         return detailList;
     }
 
-    public void setDetailList(List<VideoLessonGroupDetail> detailList) {
+    public void setDetailList(List<VideoLessonGroupDetailDto> detailList) {
         this.detailList = detailList;
     }
 
@@ -79,4 +83,12 @@ public class VideoLessonStudentVo extends BaseEntity {
     public void setAlreadyBuy(Boolean alreadyBuy) {
         this.alreadyBuy = alreadyBuy;
     }
+
+    public List<CourseRelationWrapper.MusicAlbumInfo> getMusicAlbumInfos() {
+        return musicAlbumInfos;
+    }
+
+    public void setMusicAlbumInfos(List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos) {
+        this.musicAlbumInfos = musicAlbumInfos;
+    }
 }

+ 27 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonVo.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.yonge.cooleshow.biz.dal.valid.impl.ValidList;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.Valid;
 
@@ -14,10 +16,32 @@ import javax.validation.Valid;
  */
 @ApiModel(value = "VideoLessonVo")
 public class VideoLessonVo extends BaseEntity {
+
+    @ApiModelProperty(value = "操作人",hidden = true)
+    private Long userBy;
     @Valid
     private VideoLessonGroup lessonGroup;
 
-    private ValidList<@Valid VideoLessonGroupDetail> lessonList;
+    @ApiModelProperty("后台保存草稿时,判断是第几页,第一页不处理关联曲目数据")
+    private Integer page = 2;
+
+    private ValidList<@Valid VideoLessonGroupDetailDto> lessonList;
+
+    public Integer getPage() {
+        return page;
+    }
+
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+
+    public Long getUserBy() {
+        return userBy;
+    }
+
+    public void setUserBy(Long userBy) {
+        this.userBy = userBy;
+    }
 
     public VideoLessonGroup getLessonGroup() {
         return lessonGroup;
@@ -27,11 +51,11 @@ public class VideoLessonVo extends BaseEntity {
         this.lessonGroup = lessonGroup;
     }
 
-    public ValidList<VideoLessonGroupDetail> getLessonList() {
+    public ValidList<VideoLessonGroupDetailDto> getLessonList() {
         return lessonList;
     }
 
-    public void setLessonList(ValidList<VideoLessonGroupDetail> lessonList) {
+    public void setLessonList(ValidList<VideoLessonGroupDetailDto> lessonList) {
         this.lessonList = lessonList;
     }
 }

+ 163 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/course/CourseRelationWrapper.java

@@ -0,0 +1,163 @@
+package com.yonge.cooleshow.biz.dal.wrapper.course;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 课程关联曲目、专辑信息
+ * Created by Eric.Shang on 2022/10/24.
+ */
+public class CourseRelationWrapper {
+
+    /**
+     * 关联曲目、专辑信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class MusicAlbumInfo implements Serializable {
+
+        @ApiModelProperty("主键 ")
+        private Long id;
+
+        @ApiModelProperty("课程组id ")
+        private Long courseGroupId;
+
+        @ApiModelProperty("课程ID ")
+        private Long courseId;
+
+        @ApiModelProperty("课程类型 ")
+        private CourseTypeEnum courseType;
+
+        @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+        private RelationMusicAlbumEnum relationType;
+
+
+        @ApiModelProperty("关联类型,RECOMMEND:推荐  GIFT:赠品 ")
+        private CourseRelationTypeEnum useRelationType;
+
+        @ApiModelProperty("关联曲目专辑ID ")
+        private Long musicAlbumId;
+
+        @ApiModelProperty("曲目/专辑名称")
+        private String name;
+
+        @ApiModelProperty("图标/封面")
+        private String cover;
+
+        @ApiModelProperty("曲目音乐人 专辑简介")
+        private String remark;
+
+        @ApiModelProperty("视频标题")
+        private String videoTitle;
+
+        @ApiModelProperty("标签id")
+        private String tagIds;
+
+        @ApiModelProperty("标签")
+        private String tagName;
+
+        @ApiModelProperty("是否启用 0:否 1:是")
+        private YesOrNoEnum status;
+
+        public MusicAlbumInfo name(String name) {
+            this.name = name;
+            return this;
+        }
+
+
+
+
+        public MusicAlbumInfo cover(String cover) {
+            this.cover = cover;
+            return this;
+        }
+    }
+
+    /**
+     * 课程赠送曲目、专辑信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class MusicAlbumRecord implements Serializable {
+
+        @ApiModelProperty(value = "主键id")
+        private Long id;  //主键ID
+
+        @ApiModelProperty(value = "曲谱ID")
+        private Long musicSheetId;  //曲谱ID
+
+        @ApiModelProperty(value = "老师ID")
+        private Long teacherId;  //老师ID
+
+        @ApiModelProperty(value = "订单流水号")
+        private String orderNo;  //订单流水号
+
+        @ApiModelProperty(value = "用户类型 TEACHER:老师,STUDENT:学生")
+        private ClientEnum clientType;
+
+        @ApiModelProperty(value = "学生ID")
+        private Long studentId;  //学生ID
+
+        @ApiModelProperty(value = "购买时间")
+        private java.util.Date purchaseTime;  //购买时间
+
+        @ApiModelProperty(value = "购买价格")
+        private java.math.BigDecimal purchasePrice;  //购买价格
+
+        @ApiModelProperty(value = "原价")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("服务费")
+        private BigDecimal musicSheetServiceFee;
+
+        @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
+        private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
+
+        @ApiModelProperty(value = "课程关联曲目专辑ID")
+        private Long courseMusicAlbumId;
+
+        @ApiModelProperty("购买类型 ")
+        private PurchaseRecordTypeEnum purchaseType;
+    }
+
+    /**
+     * 课程购买记录查询
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class PurchaseRecordQueryInfo implements Serializable {
+
+        @ApiModelProperty("购买课程类型 ")
+        private CourseTypeEnum courseType;
+
+        @ApiModelProperty("订单支付状态 ")
+        private OrderStatusEnum orderStatus;
+
+        @ApiModelProperty("课程组ID")
+        private Long groupId;
+    }
+
+}

+ 13 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -582,17 +582,18 @@
             u.username_ AS teacherName,
             u.real_name_ AS teacherRealName,
             g.create_time_ AS createTime,
-            r.create_time_ AS recordTime,
-            g.shelves_flag_ as shelvesFlag
+            g.shelves_time_ AS recordTime,
+            g.shelves_flag_ as shelvesFlag,
+            g.sort_number_ as sortNumber,
+            g.top_flag_ as topFlag,
+            g.audit_status_ as status,
+        g.draft_flag_ as draftFlag
         FROM video_lesson_group g
         LEFT JOIN `subject` s ON g.lesson_subject_=s.id_
         LEFT JOIN sys_user u ON g.teacher_id_=u.id_
         LEFT JOIN (
             SELECT video_lesson_group_id_,COUNT(1) AS count_ FROM video_lesson_purchase_record
             WHERE order_status_='PAID' GROUP BY video_lesson_group_id_) p ON g.id_=p.video_lesson_group_id_
-        LEFT JOIN (
-            SELECT video_group_id_,create_time_ FROM video_lesson_auth_record
-            WHERE audit_status_='PASS' order by version_ desc limit 1) r ON g.id_=r.video_group_id_
         <where>
             <if test="param.search != null and param.search != ''">
                 AND (
@@ -611,7 +612,14 @@
             <if test="param.shelvesFlag != null">
                 AND g.shelves_flag_ = #{param.shelvesFlag}
             </if>
+            <if test="param.draftFlag != null">
+                AND g.draft_flag_ = #{param.draftFlag}
+            </if>
+            <if test="param.topFlag != null">
+                AND g.top_flag_ = #{param.topFlag}
+            </if>
         </where>
+        order by g.top_flag_ desc ,g.sort_number_ desc,g.id_ desc
     </select>
     <select id="selectVideoGroupStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupStudentVo">
         SELECT

+ 58 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseRelationMusicAlbumMapper.xml

@@ -0,0 +1,58 @@
+<?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" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.CourseRelationMusicAlbumDao">
+	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum">
+            <result column="id_" property="id" />
+	        <result column="course_group_id_" property="courseGroupId" />
+	        <result column="course_id_" property="courseId" />
+	        <result column="course_type_" property="courseType" />
+	        <result column="relation_type_" property="relationType" />
+	        <result column="music_album_id_" property="musicAlbumId" />
+	        <result column="update_by_" property="updateBy" />
+	        <result column="update_time_" property="updateTime" />
+	        <result column="create_by_" property="createBy" />
+	        <result column="create_time_" property="createTime" />
+		</resultMap>  
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ as id
+        , t.course_group_id_ as courseGroupId
+        , t.course_id_ as courseId
+        , t.course_type_ as courseType
+        , t.relation_type_ as relationType
+        , t.music_album_id_ as musicAlbumId
+        , t.update_by_ as updateBy
+        , t.update_time_ as updateTime
+        , t.create_by_ as createBy
+        , t.create_time_ as createTime
+    </sql>
+
+    <!--课程用户购买记录-->
+    <select id="selectCoursePurchaseUserInfo" resultType="com.yonge.cooleshow.biz.dal.entity.UserOrder">
+        SELECT t1.order_client_, t1.order_no_, t1.update_time_, t1.user_id_
+        FROM user_order t1 JOIN <choose><when test="record.courseType.code == 'VIDEO'">video_lesson_purchase_record</when><otherwise>course_schedule_student_payment</otherwise></choose> t2 ON (t1.order_no_ = t2.order_no_)
+        <where>
+            <if test="record.orderStatus != null">
+                AND t1.status_ = #{record.orderStatus}
+            </if>
+            <choose>
+                <when test="record.courseType.code == 'VIDEO'">
+                    <if test="record.groupId != null">
+                        AND t2.video_lesson_group_id_ = #{record.groupId}
+                    </if>
+                </when>
+                <otherwise>
+                    <if test="record.groupId != null">
+                        AND t2.course_group_id_ = #{record.groupId}
+                    </if>
+                    <if test="record.courseType != null">
+                        AND t2.course_type_ = #{record.courseType}
+                    </if>
+                </otherwise>
+            </choose>
+        </where>
+    </select>
+    <!--课程用户购买记录-->
+
+</mapper>

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

@@ -629,7 +629,7 @@
         <if test="subjectId != null">
         	and g.lesson_subject_ = #{subjectId}
         </if>
-        ORDER BY buyCount DESC LIMIT 10
+        ORDER BY g.top_flag_ desc, g.sort_number_ desc, buyCount DESC LIMIT 10
     </select>
     <select id="selectRecentCourses" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomePage$RecentCourses">
         SELECT

+ 43 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -99,7 +99,7 @@
     </select>
 
     <select id="selectFavoritePage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
-        select <include refid="Base_Column_List"/>
+        select distinct <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 and mt.state_ = 1) as musicTagNames
         ,(select group_concat(s.name_) from subject s
@@ -131,6 +131,9 @@
                 <if test="query.purchaseType != null">
                     AND t2.purchase_type_ = #{query.purchaseType}
                 </if>
+                <if test="query.courseGift != null">
+                    AND t2.course_music_album_id_ <choose><when test="query.courseGift == 0"> = </when><otherwise> > </otherwise> </choose> 0
+                </if>
                 <if test="query.studentId != null">
                     AND t2.student_id_ = #{query.studentId}
                 </if>
@@ -165,6 +168,7 @@
 
     <select id="selectFavoriteNumAndMusicNum" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
         select
+        t.id_ as id,
         t1.num as musicSheetCount
         ,t2.num as albumFavoriteCount
         from music_album t
@@ -285,5 +289,42 @@
         GROUP BY t1.album_id_
     </select>
     <!--专辑曲目付费方式统计-->
-
+    <select id="selectStudentOrderPage" resultType="com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo">
+        select distinct mspr.music_sheet_id_ as musicAlbumId
+        ,ms.album_name_ as musicAlbumName
+        ,ms.album_cover_url_ as titleImg
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,ms.album_tag_) and mt.del_flag_ = 0  and mt.state_ = 1) as TagNames
+        ,mspr.purchase_price_ as purchasePrice
+        ,mspr.order_no_ as orderNo
+        ,mspr.purchase_time_ as purchaseTime
+        from music_sheet_purchase_record mspr
+        left join music_album ms on mspr.music_sheet_id_ = ms.id_
+        <where>
+            mspr.order_status_ = 'PAID' and mspr.purchase_type_ = 'ALBUM'
+            <if test="param.idAndName != null and param.idAndName != ''">
+                and (ms.id_ like concat('%',#{param.idAndName} ,'%')
+                or ms.album_name_ like concat('%',#{param.idAndName},'%'))
+            </if>
+            <if test="param.studentId != null">
+                and mspr.student_id_ = #{param.studentId}
+            </if>
+            <if test="param.orderNo != null and param.orderNo != ''">
+                and mspr.order_no_ = #{param.orderNo}
+            </if>
+            <if test="param.musicTagList != null and param.musicTagList.size() != 0">
+                and
+                <foreach collection="param.musicTagList" separator="or" item="item"  open="(" close=")" >
+                    find_in_set(#{item},ms.album_tag_)
+                </foreach>
+            </if>
+            <if test="param.startTime != null">
+                and mspr.purchase_time_ &gt; #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                and mspr.purchase_time_ &lt; #{param.endTime}
+            </if>
+        </where>
+        order by mspr.id_ desc
+    </select>
 </mapper>

+ 9 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -358,7 +358,7 @@
     </select>
 
     <select id="selectMyMusicPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
-        select <include refid="Base_Column_List"/>
+        select distinct <include refid="Base_Column_List"/>
         ,su.username_ as addName
         ,su.avatar_ as addUserAvatar
         ,(select group_concat(mt.name_) from music_tag mt
@@ -379,6 +379,12 @@
             <if test="param.userType != null">
                 and mspr.client_type_ = #{param.userType}
             </if>
+            <if test="param.purchaseType != null">
+                AND mspr.purchase_type_ = #{param.purchaseType}
+            </if>
+            <if test="param.courseGift != null">
+                AND mspr.course_music_album_id_ <choose><when test="param.courseGift == 0"> = </when><otherwise> > </otherwise> </choose> 0
+            </if>
         </where>
         order by  mspr.id_ desc
     </select>
@@ -440,7 +446,7 @@
     </select>
 
     <select id="selectStudentOrderPage" resultType="com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo">
-        select mspr.music_sheet_id_ as musicSheetId
+        select distinct mspr.music_sheet_id_ as musicSheetId
         ,ms.music_sheet_name_ as musicSheetName
         ,ms.composer_ as composer
         ,ms.title_img_ as titleImg
@@ -453,7 +459,7 @@
         from music_sheet_purchase_record mspr
         left join music_sheet ms on mspr.music_sheet_id_ = ms.id_
         <where>
-            mspr.order_status_ = 'PAID'
+            mspr.order_status_ = 'PAID' and mspr.purchase_type_ = 'MUSIC'
             <if test="param.idAndName != null and param.idAndName != ''">
                 and (ms.id_ like concat('%',#{param.idAndName} ,'%')
                     or ms.music_sheet_name_ like concat('%',#{param.idAndName},'%'))
@@ -476,9 +482,6 @@
             <if test="param.endTime != null">
                 and mspr.purchase_time_ &lt; #{param.endTime}
             </if>
-            <if test="param.delFlag != null">
-                and ms.del_flag_ = #{param.delFlag}
-            </if>
         </where>
         order by mspr.id_ desc
     </select>

+ 19 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPurchaseRecordMapper.xml

@@ -19,6 +19,23 @@
 		id_, music_sheet_id_, teacher_id_, order_no_, student_id_, purchase_time_, purchase_price_, order_status_,client_type_
 	</sql>
 
-
-
+	<update id="updateCourseMusicAlbum">
+		UPDATE music_sheet_purchase_record
+		SET
+		music_sheet_id_ = CASE course_music_album_id_
+		<foreach collection="items" item="item">
+			WHEN #{item.id} THEN #{item.musicAlbumId}
+		</foreach>
+		END,
+		purchase_type_ = CASE course_music_album_id_
+		<foreach collection="items" item="item">
+			WHEN #{item.id} THEN #{item.relationType}
+		</foreach>
+		END
+		WHERE
+		course_music_album_id_ IN
+		<foreach collection="items" item="item" separator="," open="(" close=")">
+			#{item.id}
+		</foreach>
+    </update>
 </mapper>

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

@@ -52,7 +52,7 @@
 		create_time_ AS createTime
 	</sql>
 
-	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail">
+	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto">
 		SELECT
 		<include refid="baseColumns"/>
 		FROM video_lesson_group_detail
@@ -127,7 +127,7 @@
 		WHERE video_lesson_group_id_ = #{groupId}
 	</delete>
 	
-	<select id="queryByVideoLessonGroupId" resultMap="BaseResultMap">
+	<select id="queryByVideoLessonGroupId" resultType="com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto">
 		select * from video_lesson_group_detail WHERE video_lesson_group_id_ = #{videoLessonGroupId}
 	</select>
 

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

@@ -49,8 +49,8 @@
 		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO
 		video_lesson_group_log
-		(id_,video_lesson_group_id_,lesson_name_,lesson_subject_,lesson_desc_,lesson_price_,lesson_cover_url_,teacher_id_,lesson_count_,sort_number_,lesson_tag_,top_flag_,hot_flag_,shelves_flag_,shelves_time_,shelves_reason_,shelves_id_,modifier_id_,remarks,audit_version_,create_time_,update_time_,version_,video_detail_json_)
-		VALUES(#{id},#{videoLessonGroupId},#{lessonName},#{lessonSubject},#{lessonDesc},#{lessonPrice},#{lessonCoverUrl},#{teacherId},#{lessonCount},#{sortNumber},#{lessonTag},#{topFlag},#{hotFlag},#{shelvesFlag},#{shelvesTime},#{shelvesReason},#{shelvesId},#{modifierId},#{remarks},#{auditVersion},#{createTime},#{updateTime},#{version},#{videoDetailJson})
+		(id_,video_lesson_group_id_,lesson_name_,lesson_subject_,lesson_desc_,lesson_price_,lesson_cover_url_,teacher_id_,lesson_count_,sort_number_,lesson_tag_,top_flag_,hot_flag_,shelves_flag_,shelves_time_,shelves_reason_,shelves_id_,modifier_id_,remarks,audit_version_,create_time_,update_time_,version_,video_detail_json_,draft_flag_,relation_type_)
+		VALUES(#{id},#{videoLessonGroupId},#{lessonName},#{lessonSubject},#{lessonDesc},#{lessonPrice},#{lessonCoverUrl},#{teacherId},#{lessonCount},#{sortNumber},#{lessonTag},#{topFlag},#{hotFlag},#{shelvesFlag},#{shelvesTime},#{shelvesReason},#{shelvesId},#{modifierId},#{remarks},#{auditVersion},#{createTime},#{updateTime},#{version},#{videoDetailJson},#{draftFlag},#{relationType})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->

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

@@ -49,6 +49,7 @@
 		g.update_time_ AS updateTime,
 		g.audit_id_ AS auditId,
 		g.audit_name_ AS auditName,
+		g.relation_type_ AS relationType,
 	</sql>
 	<sql id="recordColumns">
 		g.id_ AS id,
@@ -153,7 +154,7 @@
 				)
 			</if>
 		</where>
-		ORDER BY countStudent DESC
+		ORDER BY g.top_flag_ desc,g.sort_number_ desc, countStudent DESC,g.id_ desc
 	</select>
 	<select id="selectStudentPage" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentDetailVo">
 		SELECT
@@ -281,6 +282,7 @@
 			g.lesson_cover_url_ AS lessonCoverUrl,
 			g.lesson_count_ AS lessonCount,
 			g.teacher_id_ AS teacherId,
+			g.relation_type_ AS relationType,
 			u.username_ AS userName,
 			u.real_name_ AS realName,
 			u.avatar_ AS avatar,
@@ -317,7 +319,7 @@
 				AND s.id_ = #{param.lessonSubject}
 			</if>
 		</where>
-		ORDER BY countStudent DESC
+		ORDER BY g.top_flag_ desc,g.sort_number_ desc, countStudent DESC,g.id_ desc
 	</select>
 	
 	<select id="queryMyLessonGroup" resultType="com.yonge.cooleshow.biz.dal.vo.LessonGroupVo">
@@ -335,6 +337,7 @@
 			u.real_name_ AS realName,
 			u.avatar_ AS avatar,
 			g.audit_version_ as auditVersion,
+			g.relation_type_ as relationType,
 			(SELECT COUNT(1) FROM video_lesson_purchase_record r WHERE r.video_lesson_group_id_=g.video_lesson_group_id_ AND r.order_status_='PAID') AS countStudent
 		FROM video_lesson_purchase_record pr
 		left join (
@@ -396,6 +399,7 @@
 			g.audit_name_ AS auditName,
 			g.audit_status_ AS auditStatus,
 			g.audit_version_ as auditVersion,
+			g.remarks as remarks,
 			s.name_ AS subjectName,
 			t.username_ AS teacherName,
 			t.real_name_ AS realName,
@@ -404,6 +408,7 @@
 		LEFT JOIN `subject` s ON g.lesson_subject_=s.id_
 		LEFT JOIN sys_user t ON g.teacher_id_=t.id_
 		<where>
+			g.audit_status_ is not null and g.draft_flag_  = 0
 			<if test="null != param.search and '' != param.search">
 				AND (
 					g.id_ LIKE CONCAT('%', #{param.search}, '%') OR
@@ -432,7 +437,7 @@
 				<![CDATA[AND g.create_time_ <= #{param.endTime} ]]>
 			</if>
 		</where>
-		ORDER BY g.create_time_
+		ORDER BY g.update_time_ desc, g.id_ desc
 	</select>
 
 	<select id="queryGroupHistoryList" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonAuthGroup">
@@ -454,6 +459,7 @@
 			g.shelves_reason_ as shelvesReason,
 			g.create_time_ AS createTime,
 			g.update_time_ AS updateTime,
+			g.relation_type_ as relationType,
 			g.video_detail_json_ as videoDetailJson,
 			r.audit_id_ AS auditId,
 			r.audit_name_ AS auditName,
@@ -530,6 +536,7 @@
 			g.audit_id_ AS auditId,
 			g.audit_name_ AS auditName,
 			g.audit_status_ AS auditStatus,
+			g.relation_type_ as relationType,
 			r.version_ as version,
 			r.video_group_id_ as videoGroupId,
 			r.remarks as remarks,

+ 10 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java

@@ -27,6 +27,8 @@ import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
@@ -173,8 +175,14 @@ public class MusicAlbumController extends BaseController {
      * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
      */
     @ApiOperation(value = "已购买专辑信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gift", value = "课程赠品 0:购买 1:赠品, 默认值: 0"),
+            @ApiImplicitParam(name = "page", value = "分页查询, 默认值: 1"),
+            @ApiImplicitParam(name = "row", value = "当前页行数, 默认值: 10"),
+    })
     @GetMapping("/purchased")
-    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(@RequestParam(value = "gift", required = false, defaultValue = "0") Integer gift,
+                                                                         QueryInfo query) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
@@ -184,6 +192,7 @@ public class MusicAlbumController extends BaseController {
         search.studentId(sysUser.getId())
                 .albumPurchased(true)
                 .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .courseGift(gift)
                 .orderStatus(OrderStatusEnum.PAID)
                 .clientType(ClientEnum.STUDENT);
 

+ 15 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -2,7 +2,10 @@ package com.yonge.cooleshow.student.controller;
 
 import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
 import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
@@ -48,6 +51,7 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 
 import java.util.ArrayList;
+import java.util.Optional;
 
 /**
  * 曲谱表 web 控制层
@@ -194,9 +198,15 @@ public class MusicSheetController extends BaseController {
     /**
      * 我的单曲,收藏单曲
      */
-    @GetMapping("/my")
     @ApiOperation(value = "我的单曲")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(QueryInfo query) {
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gift", value = "课程赠品 0:购买 1:赠品, 默认值: 0"),
+            @ApiImplicitParam(name = "page", value = "分页查询, 默认值: 1"),
+            @ApiImplicitParam(name = "row", value = "当前页行数, 默认值: 10"),
+    })
+    @GetMapping("/my")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(@RequestParam(value = "gift", required = false, defaultValue = "0") Integer gift,
+                                                              QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
@@ -206,6 +216,9 @@ public class MusicSheetController extends BaseController {
         // search.setState(YesOrNoEnum.YES);
         search.setAuditStatus(AuthStatusEnum.PASS);
         search.setUserType(ClientEnum.STUDENT);
+        search.setPurchaseType(Optional.ofNullable(search.getPurchaseType()).orElse(PurchaseRecordTypeEnum.MUSIC));
+        search.setCourseGift(gift);
+
         IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(query),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }

+ 10 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
@@ -180,8 +182,14 @@ public class MusicAlbumController extends BaseController {
      * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
      */
     @ApiOperation(value = "已购买专辑信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gift", value = "课程赠品 0:购买 1:赠品, 默认值: 0"),
+            @ApiImplicitParam(name = "page", value = "分页查询, 默认值: 1"),
+            @ApiImplicitParam(name = "row", value = "当前页行数, 默认值: 10"),
+    })
     @GetMapping("/purchased")
-    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(@RequestParam(value = "gift", required = false, defaultValue = "0") Integer gift,
+                                                                         QueryInfo query) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
@@ -191,6 +199,7 @@ public class MusicAlbumController extends BaseController {
         search.studentId(sysUser.getId())
                 .albumPurchased(true)
                 .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .courseGift(gift)
                 .orderStatus(OrderStatusEnum.PAID)
                 .clientType(ClientEnum.TEACHER);
 

+ 6 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.teacher.controller;
 import com.yonge.cooleshow.biz.dal.dto.AppMusicSheetVo;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -10,6 +12,7 @@ import io.swagger.annotations.ApiParam;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.Optional;
 
 import javax.validation.Valid;
 
@@ -246,6 +249,9 @@ public class MusicSheetController extends BaseController {
         // search.setState(YesOrNoEnum.YES);
         search.setAuditStatus(AuthStatusEnum.PASS);
         search.setUserType(ClientEnum.TEACHER);
+        search.setPurchaseType(PurchaseRecordTypeEnum.MUSIC);
+        search.setCourseGift(Optional.ofNullable(search.getCourseGift()).orElse(EStatus.DISABLE.getValue()));
+
         IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(search),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.teacher.controller;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -139,9 +140,11 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+        lessonVo.setUserBy(sysUser.getId());
         if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
+        lessonVo.getLessonGroup().setDraftFlag(YesOrNoEnum.NO);
         videoLessonGroupService.add(lessonVo, sysUser);
         return succeed();
     }
@@ -213,11 +216,12 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+        lessonVo.setUserBy(sysUser.getId());
         if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
-        videoLessonGroupService.update(lessonVo, sysUser);
-        return succeed();
+        lessonVo.getLessonGroup().setDraftFlag(YesOrNoEnum.NO);
+        return succeed(videoLessonGroupService.update(lessonVo, sysUser));
     }
 
 

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.teacher.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonEvaluateSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonEvaluate;
@@ -75,7 +76,7 @@ public class VideoLessonGroupDetailController extends BaseController {
      */
     @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) {
+    public HttpResponseResult<Object> create(@Validated @RequestBody ValidList<VideoLessonGroupDetailDto> videoLessonList) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");

+ 11 - 1
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java

@@ -16,6 +16,8 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -88,8 +90,15 @@ public class MusicAlbumController extends BaseController {
      * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
      */
     @ApiOperation(value = "已购买专辑信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientType", value = "客户端类型: TEACHER, STUDENT; 默认值: STUDENT"),
+            @ApiImplicitParam(name = "gift", value = "课程赠品 0:购买 1:赠品, 默认值: 0"),
+            @ApiImplicitParam(name = "page", value = "分页查询, 默认值: 1"),
+            @ApiImplicitParam(name = "row", value = "当前页行数, 默认值: 10"),
+    })
     @GetMapping("/purchased")
-    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(@RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                                         @RequestParam(value = "gift", required = false, defaultValue = "0") Integer gift,
                                                                          QueryInfo query) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -100,6 +109,7 @@ public class MusicAlbumController extends BaseController {
         search.studentId(sysUser.getId())
                 .albumPurchased(true)
                 .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .courseGift(gift)
                 .orderStatus(OrderStatusEnum.PAID)
                 .clientType(ClientEnum.valueOf(clientType));
 

+ 18 - 3
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -1,11 +1,16 @@
 package com.yonge.cooleshow.website.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.common.enums.EStatus;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
 import java.io.File;
 import java.util.Date;
+import java.util.Optional;
 
 import javax.validation.Valid;
 
@@ -82,13 +87,19 @@ public class MusicSheetController extends BaseController {
     }
 
 
-
     /**
      * 我的单曲,收藏单曲
      */
-    @GetMapping("/my")
     @ApiOperation(value = "学生-我的单曲")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientType", value = "客户端类型 TEACHER, STUDENT, 默认值: STUDENT"),
+            @ApiImplicitParam(name = "gift", value = "课程赠品 0:购买 1:赠品, 默认值: 0"),
+            @ApiImplicitParam(name = "page", value = "分页查询, 默认值: 1"),
+            @ApiImplicitParam(name = "row", value = "当前页行数, 默认值: 10"),
+    })
+    @GetMapping("/my")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(@RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                              @RequestParam(value = "gift", required = false, defaultValue = "0") Integer gift,
                                                               QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
@@ -103,11 +114,15 @@ public class MusicSheetController extends BaseController {
         search.setStudentId(sysUser.getId());
         search.setAuditStatus(AuthStatusEnum.PASS);
         search.setUserType(ClientEnum.valueOf(clientType));
+        search.setPurchaseType(Optional.ofNullable(search.getPurchaseType()).orElse(PurchaseRecordTypeEnum.MUSIC));
+        search.setCourseGift(Optional.ofNullable(search.getCourseGift()).orElse(EStatus.DISABLE.getValue()));
+
         IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(query),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
 
 
+
     /**
      * 我的单曲,收藏单曲
      */

+ 6 - 4
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/VideoGroupController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
@@ -115,7 +116,8 @@ public class VideoGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+        lessonVo.setUserBy(sysUser.getId());
+        if ( CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
         videoLessonGroupService.add(lessonVo,sysUser);
@@ -146,10 +148,10 @@ public class VideoGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+        lessonVo.setUserBy(sysUser.getId());
+        if ( CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
-        videoLessonGroupService.update(lessonVo,sysUser);
-        return succeed();
+        return succeed(videoLessonGroupService.update(lessonVo,sysUser));
     }
 }

+ 2 - 1
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/VideoLessonGroupDetailController.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.website.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonEvaluateSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonEvaluate;
@@ -74,7 +75,7 @@ public class VideoLessonGroupDetailController extends BaseController {
      */
     @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) {
+    public HttpResponseResult<Object> create(@Validated @RequestBody ValidList<VideoLessonGroupDetailDto> videoLessonList) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");

+ 2 - 2
service.md

@@ -1,9 +1,9 @@
 - [ ] gateway-server
 - [ ] auth-server
-- [ ] admin-server
+- [x] admin-server
 - [x] teacher-server
 - [x] student-server
-- [ ] website-server
+- [x] website-server
 - [ ] task-server
 - [ ] websocket-server
 - [ ] audio-analysis