Browse Source

Merge branch 'feature/0412_courseware' into online

刘俊驰 11 months ago
parent
commit
a337c1a645
46 changed files with 1158 additions and 355 deletions
  1. 2 2
      .gitignore
  2. 56 4
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SubjectController.java
  3. 92 68
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  4. 86 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumSheetController.java
  5. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java
  6. 5 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  7. 48 6
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java
  8. 82 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java
  9. 46 5
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumSheetController.java
  10. 6 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java
  11. 47 5
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java
  12. 6 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java
  13. 5 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/LocalFastJsonHttpMessageConverter.java
  14. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebMvcConfig.java
  15. 19 0
      cooleshow-user/user-biz/pom.xml
  16. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/LocalFastJsonHttpMessageConverter.java
  17. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicTagDao.java
  18. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
  19. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/PageUtil.java
  20. 9 96
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java
  21. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SubjectTypeEnum.java
  22. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  23. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicTagService.java
  24. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SubjectService.java
  25. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumMusicService.java
  26. 2 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantGroupAlbumService.java
  27. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  28. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  29. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  30. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SubjectServiceImpl.java
  31. 205 70
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java
  32. 17 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  33. 80 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupAlbumServiceImpl.java
  34. 55 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  35. 106 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/LessonCoursewareWrapper.java
  36. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java
  37. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  38. 35 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupAlbumWrapper.java
  39. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  40. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicTagMapper.xml
  41. 14 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  42. 4 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml
  43. 14 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  44. 3 1
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/page/PageInfo.java
  45. 1 1
      toolset/toolset-feign/src/main/java/com/yonge/toolset/feign/config/FeignConfiguration.java
  46. 4 0
      toolset/toolset-mybatis/pom.xml

+ 2 - 2
.gitignore

@@ -60,5 +60,5 @@ target
 **/AuditLogInterceptor.java
 /toolset/audit-log/src/main/java/com/yonge/toolset/log/interceptor/AuditLogInterceptor.java
 /log/
-cooleshow-cms/src/main/resources/bootstrap-local.yaml
-/cooleshow-app/src/main/resources/logback-local.xml
+**/bootstrap-local.yaml
+**/logback-local.xml

+ 56 - 4
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SubjectController.java

@@ -1,5 +1,9 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.dayaedu.cbs.openfeign.client.MusicFeignClientService;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsSubjectWrapper;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.biz.dal.dto.PageUtil;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.queryInfo.SubjectQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
@@ -9,6 +13,8 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -18,17 +24,22 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
 @RequestMapping("${app-config.url.admin:}/subject")
 @Api(tags = "声部服务")
 @RestController
+@Slf4j
 public class SubjectController extends BaseController {
 
 	@Autowired
 	private SubjectService subjectService;
 
+    @Autowired
+    private MusicFeignClientService musicFeignClientService;
+
 	@ApiOperation(value = "根据声部编号查询声部")
 	@GetMapping("/get/{id}")
 	@PreAuthorize("@pcs.hasPermissions('subject/get')")
@@ -41,22 +52,44 @@ public class SubjectController extends BaseController {
 	@PreAuthorize("@pcs.hasPermissions('subject/queryPage')")
 	public HttpResponseResult<PageInfo<Subject>> queryPage(SubjectQueryInfo queryInfo) {
 		PageInfo<Subject> pageInfo = subjectService.queryPage(queryInfo);
-		
-		if(pageInfo.getRows().size() == 0){
+
+        List<Subject> records = pageInfo.getRows();
+        if(records.isEmpty()){
 			return succeed(pageInfo);
 		}
 
-		Map<Long, Subject> map = subjectService.findBySubjectByIdList(pageInfo.getRows().stream().map(t -> t.getParentSubjectId()).collect(Collectors.toList())).stream()
+		Map<Long, Subject> map = subjectService.findBySubjectByIdList(records.stream().map(Subject::getParentSubjectId).collect(Collectors.toList())).stream()
 				.collect(Collectors.toMap(Subject::getId, t -> t));
 
-		pageInfo.getRows().forEach(row -> {
+		records.forEach(row -> {
 			if(row.getParentSubjectId() != null && row.getParentSubjectId() > 0) {
 				row.setParentSubjectName(map.get(row.getParentSubjectId()).getName());
 			}
 		});
+
+        setCbsSubjectName(records);
 		return succeed(pageInfo);
 	}
 
+
+    private void setCbsSubjectName(List<Subject> records) {
+        // cbs声部ID集合
+        List<Long> cbsSubjectIds = records.stream().map(Subject::getCbsSubjectId).collect(Collectors.toList());
+        CbsSubjectWrapper.SubjectQuery subjectQuery = new CbsSubjectWrapper.SubjectQuery();
+        subjectQuery.setIds(cbsSubjectIds);
+        subjectQuery.setPage(1);
+        subjectQuery.setRows(-1);
+        try {
+            List<CbsSubjectWrapper.Subject> rows = musicFeignClientService.subjectPage(subjectQuery).feignData().getRows();
+            if (CollectionUtils.isNotEmpty(rows)) {
+                Map<Long, String> cbsSubjectMap = rows.stream().collect(Collectors.toMap(CbsSubjectWrapper.Subject::getId, CbsSubjectWrapper.Subject::getName));
+                records.stream().forEach(e -> e.setCbsSubjectName(cbsSubjectMap.get(e.getCbsSubjectId())));
+            }
+        } catch (Exception e) {
+            log.error("调用音乐服务查询曲目详情失败", e);
+        }
+    }
+
 	@ApiOperation(value = "分页查询声部树状列表")
 	@GetMapping("/queryPageTree")
 	@PreAuthorize("@pcs.hasPermissions('subject/queryPageTree')")
@@ -79,4 +112,23 @@ public class SubjectController extends BaseController {
 		subjectService.deleteById(id);
 		return succeed();
 	}*/
+
+
+    /**
+     * 声部分页
+     */
+    @ApiOperation(value = "内容平台对应的声部数据")
+    @PostMapping("/cbsSubject/list")
+    public HttpResponseResult<PageInfo<CbsSubjectWrapper.Subject>> subjectPage(){
+        CbsSubjectWrapper.SubjectQuery subjectQuery = new CbsSubjectWrapper.SubjectQuery();
+        subjectQuery.setPage(1);
+        subjectQuery.setRows(-1);
+
+        try {
+            return succeed(PageUtil.pageInfo(musicFeignClientService.subjectPage(subjectQuery).feignData()));
+        } catch (Exception e) {
+            log.error("内容平台对应的声部数据查询失败", e);
+            throw BizException.from("内容平台服务异常");
+        }
+    }
 }

+ 92 - 68
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java

@@ -2,23 +2,15 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.common.enums.school.ECourseType;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.admin.io.request.TenantAlbumVo;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumRef;
-import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
-import com.yonge.cooleshow.biz.dal.service.MusicTagService;
-import com.yonge.cooleshow.biz.dal.service.SubjectService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumRefService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -33,18 +25,9 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -79,6 +62,9 @@ public class TenantAlbumController {
     @Autowired
     private MusicTagService musicTagService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
     /**
      * 查询分页
      *
@@ -128,16 +114,34 @@ public class TenantAlbumController {
                 tenantAlbumMusics.stream().collect(Collectors.groupingBy(TenantAlbumMusic::getSubjectType));
 
 
-        List<Long> musicSheetIdlist = tenantAlbumMusics.stream().map(next -> next.getMusicSheetId()).distinct().collect(Collectors.toList());
-
+        List<Long> musicSheetIdlist = tenantAlbumMusics.stream()
+            .filter(o ->o.getSubjectType() !=SubjectTypeEnum.COURSEWARE)
+            .map(TenantAlbumMusic::getMusicSheetId).distinct()
+            .collect(Collectors.toList());
+        // 过滤出课件
+        List<Long> coursewareList = tenantAlbumMusics.stream()
+                .filter(o -> o.getSubjectType() == SubjectTypeEnum.COURSEWARE)
+                .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+        Map<Long,CbsLessonCoursewareWrapper.Entity> coursewareDtoMap = new HashMap<>();
+
+        if (CollectionUtils.isNotEmpty(coursewareList)) {
+            List<CbsLessonCoursewareWrapper.Entity> entities = coursewareFeignService
+                .lessonCoursewareLambdaQuery(CbsLessonCoursewareWrapper.LambdaQuery.builder().ids(coursewareList).build()).feignData();
+            coursewareDtoMap.putAll(entities.stream().collect(Collectors.toMap(CbsLessonCoursewareWrapper.Entity::getId, Function.identity())));
+        }
 
-        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
-        search.setMusicSheetIdlist(musicSheetIdlist);
-        search.setPage(1);
-        search.setRows(9999);
-        IPage<MusicSheetVo> records = musicSheetService.selectStudentPage(PageUtil.getPage(search), search, null);
-        Map<Long, MusicSheetVo> idMsMap = records.getRecords().stream()
-                .collect(Collectors.toMap(MusicSheet::getId, Function.identity()));
+        Map<Long, MusicSheetVo> idMsMap = new HashMap<>();
+        Map<Integer,Subject> subjectMap = subjectService.getAllMap();
+        Map<Long, MusicTag> musicTagMap = musicTagService.getAllMap();
+        if (CollectionUtils.isNotEmpty(musicSheetIdlist)) {
+            StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+            search.setMusicSheetIdlist(musicSheetIdlist);
+            search.setPage(1);
+            search.setRows(9999);
+            IPage<MusicSheetVo> records = musicSheetService.selectStudentPage(PageUtil.getPage(search), search, null);
+            idMsMap.putAll(records.getRecords().stream()
+                .collect(Collectors.toMap(MusicSheet::getId, Function.identity())));
+        }
         List<TenantAlbumWrapper.MusicSheetData> musicSheetData = vo.getMusicSheetData();
         groupByType.forEach((key, value) -> {
             value.sort(Comparator.comparing(TenantAlbumMusic::getSortNumber));
@@ -148,39 +152,56 @@ public class TenantAlbumController {
                 TenantAlbumWrapper.TenantAlbumSheet tenantAlbumSheet = new TenantAlbumWrapper.TenantAlbumSheet();
                 BeanUtils.copyProperties(next, tenantAlbumSheet);
                 Long musicSheetId = tenantAlbumSheet.getMusicSheetId();
-                MusicSheetVo musicSheet = idMsMap.getOrDefault(musicSheetId, new MusicSheetVo());
-                tenantAlbumSheet.setMusicSheetName(musicSheet.getMusicSheetName());
-                tenantAlbumSheet.setMusicTag(musicSheet.getMusicTag());
-                tenantAlbumSheet.setComposer(musicSheet.getComposer());
-                tenantAlbumSheet.setMusicSubject(musicSheet.getMusicSubject());
-                return tenantAlbumSheet;
-            }).collect(Collectors.toList());
-            tenantAlbumSheets.stream().forEach(t->{
-                String musicSubject = t.getMusicSubject();
-
-                if (StringUtils.isNotBlank(musicSubject)){
-                    //设置对应声部名称
-                    List<Subject> subject = subjectService.findBySubjectByIdList(musicSubject);
-                    if (CollectionUtils.isNotEmpty(subject)) {
-                        t.setMusicSubjectName(subject.get(0).getName());
-                    }
-                }
-
+                switch (key) {
+                    case COURSEWARE:
+                        CbsLessonCoursewareWrapper.Entity entity = coursewareDtoMap.get(musicSheetId);
+                        if (entity != null) {
+                            tenantAlbumSheet.setMusicSheetName(entity.getName());
+                            tenantAlbumSheet.setTitleImg(entity.getCoverImg());
+                            tenantAlbumSheet.setMusicSubject(entity.getCourseTypeCode());
+                            tenantAlbumSheet.setMusicSubjectName(ECourseType.valueOf(entity.getCourseTypeCode()).getName());
+                        }
+                        break;
+                    case MUSIC:
+                    case SUBJECT:
+                    case ENSEMBLE:
+                    {
+                        MusicSheetVo musicSheet = idMsMap.getOrDefault(musicSheetId, new MusicSheetVo());
+                        tenantAlbumSheet.setMusicSheetName(musicSheet.getMusicSheetName());
+                        tenantAlbumSheet.setMusicTag(musicSheet.getMusicTag());
+                        tenantAlbumSheet.setComposer(musicSheet.getComposer());
+                        tenantAlbumSheet.setMusicSubject(musicSheet.getMusicSubject());
+
+                        //设置对应标签名称
+                        String musicTag = tenantAlbumSheet.getMusicTag();
+                        if (StringUtils.isNotBlank(musicTag)){
+                            String[] split = musicTag.split(",");
+                            List<String> tagNames = Arrays.stream(split).map(Long::parseLong).map(musicTagMap::get)
+                                .filter(Objects::nonNull).map(MusicTag::getName).collect(Collectors.toList());
+                            tenantAlbumSheet.setMusicTagName(String.join(",", tagNames));
+                        }
+                        if (StringUtils.isNotBlank(tenantAlbumSheet.getMusicSubject())){
+                            //设置对应声部名称
+                            String subjectName = Arrays.stream(tenantAlbumSheet.getMusicSubject().split(","))
+                                .map(Integer::parseInt).map(o -> {
+
+                                Subject subject = subjectMap.get(o);
+                                if (subject != null) {
+                                    return subject.getName();
+                                }
+                                return null;
+                            }).filter(Objects::nonNull).collect(Collectors.joining(","));
+                            tenantAlbumSheet.setMusicSubjectName(subjectName);
+                        }
 
-                //设置对应标签名称
-                String musicTag = t.getMusicTag();
-                if (StringUtils.isNotBlank(musicTag)){
-                    String[] split = musicTag.split(",");
-                    for (String s : split) {
-                        List<Long> list = new ArrayList<>();
-                        list.add(Long.parseLong(s));
-                        String tagName = musicTagService.getMusicTagNames(list);
-                        t.setMusicTagName(tagName);
                     }
+                    break;
+                    default:
+                        break;
                 }
 
-            });
-
+                return tenantAlbumSheet;
+            }).collect(Collectors.toList());
 
             sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
             musicSheetData.add(sheetData);
@@ -201,7 +222,10 @@ public class TenantAlbumController {
 
         // 检查曲目重复
         if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
-            List<Long> musicIds = album.getMusicSheetData().stream().flatMap(o -> o.getMusicSheetList().stream().map(m -> m.getId())).collect(Collectors.toList());
+            List<Long> musicIds = album.getMusicSheetData().stream()
+                .filter(o ->o.getSubjectType() !=SubjectTypeEnum.COURSEWARE)
+                .flatMap(o -> o.getMusicSheetList().stream().map(TenantAlbumVo.MusicObject::getId))
+                .collect(Collectors.toList());
             Set<Long> musicSet = new HashSet<>(musicIds);
             if (musicSet.size() < musicIds.size()) {
                 throw new BizException("不能添加相同的曲目");
@@ -212,7 +236,6 @@ public class TenantAlbumController {
         List<TenantAlbumVo.MusicSheetData> musicSheetData = album.getMusicSheetData();
 
         List<TenantAlbumWrapper.MusicSheetData> musicSheetDataList = musicSheetData.stream().map(next ->{
-                    //TenantAlbumWrapper.MusicSheetData sheetData =new TenantAlbumWrapper.MusicSheetData();
                     TenantAlbumWrapper.MusicSheetData sheetData =new TenantAlbumWrapper.MusicSheetData();
 
                     List<TenantAlbumVo.MusicObject> musicSheetList = next.getMusicSheetList();
@@ -238,8 +261,10 @@ public class TenantAlbumController {
 
         // 检查曲目重复
         if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
-            List<Long> musicIds = album.getMusicSheetData().stream().flatMap(o -> o.getMusicSheetList()
-                    .stream().map(TenantAlbumVo.MusicObject::getId)).collect(Collectors.toList());
+            List<Long> musicIds = album.getMusicSheetData().stream()
+                .filter(o -> o.getSubjectType() != SubjectTypeEnum.COURSEWARE)
+                .flatMap(o -> o.getMusicSheetList().stream().map(TenantAlbumVo.MusicObject::getId))
+                .collect(Collectors.toList());
             Set<Long> musicSet = new HashSet<>(musicIds);
             if (musicSet.size() < musicIds.size()) {
                 throw new BizException("不能添加相同的曲目");
@@ -250,7 +275,6 @@ public class TenantAlbumController {
         List<TenantAlbumVo.MusicSheetData> musicSheetData = album.getMusicSheetData();
 
         List<TenantAlbumWrapper.MusicSheetData> musicSheetDataList = musicSheetData.stream().map(next ->{
-            //TenantAlbumWrapper.MusicSheetData sheetData =new TenantAlbumWrapper.MusicSheetData();
             TenantAlbumWrapper.MusicSheetData sheetData =new TenantAlbumWrapper.MusicSheetData();
 
             List<TenantAlbumVo.MusicObject> musicSheetList = next.getMusicSheetList();

+ 86 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumSheetController.java

@@ -0,0 +1,86 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareDetailWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.PageUtil;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 专辑表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("${app-config.url.admin:}/tenantAlbumMusic")
+@Api(tags = "机构专辑曲目 API接口")
+public class TenantAlbumSheetController extends BaseController {
+
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
+    @Autowired
+    private TenantAlbumMusicService tenantAlbumMusicService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+
+    @ApiOperation(value = "获取内容平台课件教材")
+    @PostMapping("/queryPage")
+    public HttpResponseResult<PageInfo<CbsLessonCoursewareWrapper.LessonCourseware>> queryPage(@RequestBody CbsLessonCoursewareWrapper.LessonCoursewareQuery query) throws Exception {
+//        query.setEnableFlag(true);
+        return succeed(PageUtil.pageInfo(coursewareFeignService.lessonCoursewarePage(query).feignData()));
+    }
+
+    @ApiOperation(value = "获取课件详情")
+    @PostMapping("/getLessonCoursewareDetail")
+    public HttpResponseResult<LessonCoursewareWrapper.LessonCourseware> getLessonCoursewareDetail(@RequestBody @Valid LessonCoursewareWrapper.LessonCourseQuery query){
+        query.setClient(ClientEnum.SYSTEM);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || null == sysUser.getId()) {
+            return failed("用户信息获取失败");
+        }
+        query.setUserId(sysUser.getId());
+        LessonCoursewareWrapper.LessonCourseware lessonCourseware = tenantAlbumMusicService.getLessonCoursewareDetail(query);
+        return succeed(lessonCourseware);
+    }
+
+    @ApiOperation(value = "获取课件关联的课程列表")
+    @GetMapping("/getLessonCoursewareCourseList/{id}")
+    public HttpResponseResult<List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail>> getLessonCoursewareCourseList(@PathVariable("id") Long id){
+        List<CbsLessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetails = coursewareFeignService.coursewareDetail(id).feignData();
+        if (CollectionUtils.isNotEmpty(courseScheduleCoursewareDetails)) {
+            String jsonString = JSONObject.toJSONString(courseScheduleCoursewareDetails);
+            List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetailList = JSONObject.parseArray(jsonString, LessonCoursewareWrapper.CourseScheduleCoursewareDetail.class);
+            return succeed(courseScheduleCoursewareDetailList);
+        }
+        return succeed(new ArrayList<>());
+    }
+
+    @ApiOperation(value = "获取课程详情")
+    @GetMapping("/getLessonCourseDetail/{id}")
+    public HttpResponseResult<CbsLessonCoursewareDetailWrapper.LessonCoursewareDetail> getLessonCourseDetail(@PathVariable("id") String id){
+        return succeed(coursewareFeignService.lessonCoursewareDetailDetail(Long.parseLong(id)).feignData());
+    }
+
+}

+ 3 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.config;
 
+import com.microsvc.toolkit.common.webportal.converter.EnumsConvertorFactory;
 import com.yonge.cooleshow.biz.dal.config.LocalFastJsonHttpMessageConverter;
 import com.yonge.cooleshow.common.config.EnumConverterFactory;
 import com.yonge.cooleshow.interceptor.MDCInterceptor;
@@ -34,6 +35,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	@Override
 	public void addFormatters(FormatterRegistry registry) {
 		registry.addConverterFactory(enumConverterFactory);
+		// 枚举映射转换
+		registry.addConverterFactory(new EnumsConvertorFactory());
 	}
 
 	@Override

+ 5 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -432,6 +432,11 @@ public class MusicSheetController extends BaseController {
             throw new BizException("用户信息获取失败");
         }
         queryInfo.setUserId(sysUser.getId());
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        queryInfo.setSubjectId(Integer.parseInt(student.getSubjectId()));
         return succeed(musicSheetService.searchTenant(queryInfo));
     }
 

+ 48 - 6
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java

@@ -1,7 +1,10 @@
 package com.yonge.cooleshow.student.controller;
 
-import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareDetailWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -9,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -18,15 +22,15 @@ import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -48,6 +52,9 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
     @ApiOperation(value = "查询条件")
     @PostMapping("/selectCondition")
     public HttpResponseResult<TenantAlbumMusicWrapper.TenantAlbumMusicSelectData> selectCondition(@RequestBody TenantAlbumMusicWrapper.TenantAlbumMusicSelect query) {
@@ -90,4 +97,39 @@ public class TenantAlbumSheetController extends BaseController {
         IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page = tenantAlbumMusicService.selectPage(QueryInfo.getPage(query), query);
         return succeed((PageUtil.pageInfo(page)));
     }
+
+
+    @ApiOperation(value = "获取课件详情")
+    @PostMapping("/getLessonCoursewareDetail")
+    public HttpResponseResult<LessonCoursewareWrapper.LessonCourseware> getLessonCoursewareDetail(@RequestBody @Valid LessonCoursewareWrapper.LessonCourseQuery query){
+        query.setClient(ClientEnum.STUDENT);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || null == sysUser.getId()) {
+            return failed("用户信息获取失败");
+        }
+        query.setUserId(sysUser.getId());
+        LessonCoursewareWrapper.LessonCourseware lessonCourseware = tenantAlbumMusicService.getLessonCoursewareDetail(query);
+        return succeed(lessonCourseware);
+    }
+
+
+    @ApiOperation(value = "获取课件关联的课程列表")
+    @GetMapping("/getLessonCoursewareCourseList/{id}")
+    public HttpResponseResult<List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail>> getLessonCoursewareCourseList(@PathVariable("id") Long id){
+        List<CbsLessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetails = coursewareFeignService.coursewareDetail(id).feignData();
+        if (CollectionUtils.isNotEmpty(courseScheduleCoursewareDetails)) {
+            String jsonString = JSONObject.toJSONString(courseScheduleCoursewareDetails);
+            List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetailList = JSONObject
+                .parseArray(jsonString, LessonCoursewareWrapper.CourseScheduleCoursewareDetail.class);
+            return succeed(courseScheduleCoursewareDetailList);
+        }
+        return succeed(new ArrayList<>());
+    }
+
+    @ApiOperation(value = "获取课程详情")
+    @GetMapping("/getLessonCourseDetail/{id}")
+    public HttpResponseResult<CbsLessonCoursewareDetailWrapper.LessonCoursewareDetail> getLessonCourseDetail(@PathVariable("id") String id){
+        return succeed(coursewareFeignService.lessonCoursewareDetailDetail(Long.parseLong(id)).feignData());
+    }
+
 }

+ 82 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.student.controller;
 
+import com.beust.jcommander.internal.Lists;
 import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -7,9 +8,11 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
@@ -18,7 +21,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Validated
@@ -35,13 +40,87 @@ public class TenantGroupAlbumController {
 
 	@ApiOperation(value = "学生可购买机构专辑信息")
 	@GetMapping("/buyAlbumInfo")
-	public HttpResponseResult<List<TenantGroupAlbumWrapper.BuyTenantAlbum>> buyAlbumInfo(@RequestParam(required = false) Long tenantGroupAlbumId) {
+	public HttpResponseResult<List<TenantGroupAlbumWrapper.BuyTenantAlbum>> buyAlbumInfo(@RequestParam(required = false) Long tenantGroupAlbumId
+        ,@RequestParam(required = false) Long tenantAlbumId) {
 
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantGroupAlbumId(tenantGroupAlbumId);
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.STUDENT);
+        if (tenantAlbumId != null) {
+            query.setTenantAlbumIds(Lists.newArrayList(tenantAlbumId));
+        }
     
-		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId,user.getId(), ClientEnum.STUDENT));
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(query));
 	}
+
+
+    @ApiOperation(value = "学生小组专辑信息")
+    @GetMapping("/albumList")
+    public HttpResponseResult<Collection<TenantGroupAlbumWrapper.BuyTenantAlbum>> albumList() {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.STUDENT);
+        query.setSortFlag(true);
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyTenantAlbums = tenantGroupAlbumService.buyAlbumInfo(query);
+        // 同ID去重
+        if (CollectionUtils.isEmpty(buyTenantAlbums)) {
+            return HttpResponseResult.succeed(new ArrayList<>());
+        }
+        //buyTenantAlbums 根据 sort 排序,在根据expireTime 排序
+        // 根据status和sort两个字段对列表buyTenantAlbums进行排序
+        buyTenantAlbums.sort((o1, o2) -> {
+            // 首先根据status字段排序
+            int statusComparison = Boolean.compare(o2.getStatus(), o1.getStatus());
+            if (statusComparison != 0) {
+                return statusComparison;
+            }
+
+            // 如果status字段相等,则根据sort字段倒序排序
+            return Long.compare(o2.getSort(),o1.getSort());
+        });
+
+        // 使用一个HashSet去重,根据ID字段对列表去重
+        Set<Long> idSet = new HashSet<>();
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> uniqueList = new ArrayList<>();
+
+        // 遍历列表,去重
+        for (TenantGroupAlbumWrapper.BuyTenantAlbum obj : buyTenantAlbums) {
+            if (idSet.add(obj.getId())) {
+                uniqueList.add(obj);
+            }
+        }
+
+
+        return HttpResponseResult.succeed(uniqueList);
+    }
+
+    @ApiOperation(value = "学生可购买机构专辑信息")
+    @GetMapping("/buyAlbumInfoDetail")
+    public HttpResponseResult<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfoDetail(@RequestParam Long tenantAlbumId) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantAlbumIds(Lists.newArrayList(tenantAlbumId));
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.STUDENT);
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> boughtAlbumInfo = tenantGroupAlbumService.buyAlbumInfo(query);
+        if (CollectionUtils.isNotEmpty(boughtAlbumInfo)) {
+            return HttpResponseResult.succeed(boughtAlbumInfo.get(0));
+        }
+        throw new BizException("未找到专辑信息");
+    }
 }

+ 46 - 5
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumSheetController.java

@@ -1,6 +1,10 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareDetailWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -8,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -15,15 +20,15 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -46,6 +51,9 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private TeacherService teacherService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
 
     @ApiOperation(value = "分页查询")
     @PostMapping("/page")
@@ -63,4 +71,37 @@ public class TenantAlbumSheetController extends BaseController {
     }
 
 
+    @ApiOperation(value = "获取课件详情")
+    @PostMapping("/getLessonCoursewareDetail")
+    public HttpResponseResult<LessonCoursewareWrapper.LessonCourseware> getLessonCoursewareDetail(@RequestBody @Valid LessonCoursewareWrapper.LessonCourseQuery query){
+        query.setClient(ClientEnum.TEACHER);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || null == sysUser.getId()) {
+            return failed("用户信息获取失败");
+        }
+        query.setUserId(sysUser.getId());
+        LessonCoursewareWrapper.LessonCourseware lessonCourseware = tenantAlbumMusicService.getLessonCoursewareDetail(query);
+        return succeed(lessonCourseware);
+    }
+
+
+    @ApiOperation(value = "获取课件关联的课程列表")
+    @GetMapping("/getLessonCoursewareCourseList/{id}")
+    public HttpResponseResult<List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail>> getLessonCoursewareCourseList(@PathVariable("id") Long id){
+        List<CbsLessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetails = coursewareFeignService.coursewareDetail(id).feignData();
+        if (CollectionUtils.isNotEmpty(courseScheduleCoursewareDetails)) {
+            String jsonString = JSONObject.toJSONString(courseScheduleCoursewareDetails);
+            List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetailList = JSONObject
+                .parseArray(jsonString, LessonCoursewareWrapper.CourseScheduleCoursewareDetail.class);
+            return succeed(courseScheduleCoursewareDetailList);
+        }
+        return succeed(new ArrayList<>());
+    }
+
+    @ApiOperation(value = "获取课程详情")
+    @GetMapping("/getLessonCourseDetail/{id}")
+    public HttpResponseResult<CbsLessonCoursewareDetailWrapper.LessonCoursewareDetail> getLessonCourseDetail(@PathVariable("id") String id){
+        return succeed(coursewareFeignService.lessonCoursewareDetailDetail(Long.parseLong(id)).feignData());
+    }
+
 }

+ 6 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java

@@ -40,7 +40,11 @@ public class TenantGroupAlbumController {
         if (user == null || null == user.getId()) {
             return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
         }
-    
-		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId,user.getId(), ClientEnum.TEACHER));
+
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantGroupAlbumId(tenantGroupAlbumId);
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.TEACHER);
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(query));
 	}
 }

+ 47 - 5
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java

@@ -1,11 +1,16 @@
 package com.yonge.cooleshow.tenant.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareDetailWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -13,15 +18,15 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -40,6 +45,9 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
     @ApiOperation(value = "查询条件")
     @PostMapping("/selectCondition")
     public HttpResponseResult<TenantAlbumMusicWrapper.TenantAlbumMusicSelectData> selectCondition(@RequestBody TenantAlbumMusicWrapper.TenantAlbumMusicSelect query) {
@@ -71,4 +79,38 @@ public class TenantAlbumSheetController extends BaseController {
     }
 
 
+    @ApiOperation(value = "获取课件详情")
+    @PostMapping("/getLessonCoursewareDetail")
+    public HttpResponseResult<LessonCoursewareWrapper.LessonCourseware> getLessonCoursewareDetail(@RequestBody @Valid LessonCoursewareWrapper.LessonCourseQuery query){
+        query.setClient(ClientEnum.TENANT);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || null == sysUser.getId()) {
+            return failed("用户信息获取失败");
+        }
+        query.setUserId(sysUser.getId());
+        LessonCoursewareWrapper.LessonCourseware lessonCourseware = tenantAlbumMusicService.getLessonCoursewareDetail(query);
+        return succeed(lessonCourseware);
+    }
+
+
+    @ApiOperation(value = "获取课件关联的课程列表")
+    @GetMapping("/getLessonCoursewareCourseList/{id}")
+    public HttpResponseResult<List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail>> getLessonCoursewareCourseList(@PathVariable("id") Long id){
+        List<CbsLessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetails = coursewareFeignService.coursewareDetail(id).feignData();
+        if (CollectionUtils.isNotEmpty(courseScheduleCoursewareDetails)) {
+            String jsonString = JSONObject.toJSONString(courseScheduleCoursewareDetails);
+            List<LessonCoursewareWrapper.CourseScheduleCoursewareDetail> courseScheduleCoursewareDetailList = JSONObject
+                .parseArray(jsonString, LessonCoursewareWrapper.CourseScheduleCoursewareDetail.class);
+            return succeed(courseScheduleCoursewareDetailList);
+        }
+        return succeed(new ArrayList<>());
+    }
+
+    @ApiOperation(value = "获取课程详情")
+    @GetMapping("/getLessonCourseDetail/{id}")
+    public HttpResponseResult<CbsLessonCoursewareDetailWrapper.LessonCoursewareDetail> getLessonCourseDetail(@PathVariable("id") String id){
+        return succeed(coursewareFeignService.lessonCoursewareDetailDetail(Long.parseLong(id)).feignData());
+    }
+
+
 }

+ 6 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java

@@ -40,7 +40,12 @@ public class TenantGroupAlbumController {
         if (user == null || null == user.getId()) {
             return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
         }
+
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantGroupAlbumId(tenantGroupAlbumId);
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.TENANT);
     
-		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId, user.getId(), ClientEnum.TENANT));
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(query));
 	}
 }

+ 5 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/LocalFastJsonHttpMessageConverter.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.serializer.ObjectSerializer;
 import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import com.microsvc.toolkit.common.enums.ConverterEnum;
 import com.vdurmont.emoji.EmojiParser;
 import com.yonge.toolset.base.enums.BaseEnum;
 import com.yonge.toolset.utils.json.JsonUtil;
@@ -68,6 +69,10 @@ class EnumFilter implements ValueFilter {
 		if (BaseEnum.class.isAssignableFrom(value.getClass())) {
 			return ((BaseEnum<?, ?>) value).getCode();
 		}
+		// ConverterEnum枚举映射转换
+		if (ConverterEnum.class.isAssignableFrom(value.getClass())) {
+			return ((ConverterEnum<?>) value).getCode();
+		}
 		return value;
 	}
 }

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebMvcConfig.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.auth.config;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.microsvc.toolkit.common.webportal.converter.EnumsConvertorFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
 import org.springframework.context.annotation.Bean;
@@ -27,6 +28,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	@Override
 	public void addFormatters(FormatterRegistry registry) {
 		registry.addConverterFactory(new EnumConverterFactory());
+		// 枚举映射转换
+		registry.addConverterFactory(new EnumsConvertorFactory());
 	}
 	
 	@Override

+ 19 - 0
cooleshow-user/user-biz/pom.xml

@@ -139,6 +139,25 @@
             <groupId>org.jetbrains.kotlin</groupId>
             <artifactId>kotlin-stdlib</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.dayaedu.cbs.openfeign</groupId>
+            <artifactId>dayaedu-openfeign-client</artifactId>
+            <version>1.0.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.alibaba.cloud</groupId>
+                    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-loadbalancer</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-starter-openfeign</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <build>

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/LocalFastJsonHttpMessageConverter.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.serializer.ObjectSerializer;
 import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import com.microsvc.toolkit.common.enums.ConverterEnum;
 import com.vdurmont.emoji.EmojiParser;
 import com.yonge.toolset.base.enums.BaseEnum;
 import com.yonge.toolset.utils.json.JsonUtil;
@@ -68,6 +69,10 @@ class EnumFilter implements ValueFilter {
 		if (BaseEnum.class.isAssignableFrom(value.getClass())) {
 			return ((BaseEnum<?, ?>) value).getCode();
 		}
+		// ConverterEnum枚举映射转换
+		if (ConverterEnum.class.isAssignableFrom(value.getClass())) {
+			return ((ConverterEnum<?>) value).getCode();
+		}
 		return value;
 	}
 }

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

@@ -55,4 +55,6 @@ public interface MusicTagDao extends BaseMapper<MusicTag> {
 	 * @return
 	 */
     Integer checkTagBeUsedMusicAlbum(@Param("longs") List<Long> longs);
+
+    List<MusicTag> getAll();
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java

@@ -61,4 +61,8 @@ public interface SubjectDao extends BaseDAO<Long, Subject> {
      * @return Subject
      */
     Subject getSubjectMatchByName(@Param("name") String subjectName);
+
+    List<Subject> getAll();
+
+    void updateCbsSubjectIdNull(@Param("subjectId") Long subjectId);
 }

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/PageUtil.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+
+import com.yonge.toolset.base.page.PageInfo;
+
+import java.util.Objects;
+
+/**
+ * @author hgw
+ * Created by 2021-12-03
+ */
+public class PageUtil {
+
+    public static <T> PageInfo<T> pageInfo(com.microsvc.toolkit.common.response.paging.PageInfo<T> source) {
+        if (Objects.isNull(source)) {
+            return new PageInfo<>(1, 20);
+        }
+        int total = Integer.parseInt(String.valueOf(source.getTotal()));
+        int limit = Integer.parseInt(String.valueOf(source.getLimit()));
+        PageInfo<T> resultPage = new PageInfo<>();
+        resultPage.setRows(source.getRows());
+        resultPage.setPageNo(Long.valueOf(source.getCurrent()).intValue());
+        resultPage.setLimit(limit);
+        resultPage.setTotal(total);
+        return resultPage;
+    }
+}

+ 9 - 96
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java

@@ -5,11 +5,13 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.List;
 
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  * 对应数据库表(subject):
  */
+@Data
 public class Subject implements Serializable {
 
 	/**  */
@@ -42,7 +44,13 @@ public class Subject implements Serializable {
 	private java.util.Date updateTime;
 	
 	private String desc;
-	
+
+    @ApiModelProperty(value = "cbs声部id")
+    private Long cbsSubjectId;
+
+    @ApiModelProperty(value = "cbs声部名称")
+    private String cbsSubjectName;
+
 	/**  */
 	@ApiModelProperty(value = "是否删除1是,0否",required = false)
 	private Boolean delFlag= false;
@@ -51,99 +59,4 @@ public class Subject implements Serializable {
 	@ApiModelProperty(value = "子节点列表",required = false)
 	private List<Subject> subjects;
 
-	public Integer getAiDefaultFrequency() {
-		return aiDefaultFrequency;
-	}
-
-	public void setAiDefaultFrequency(Integer aiDefaultFrequency) {
-		this.aiDefaultFrequency = aiDefaultFrequency;
-	}
-
-	public List<Subject> getSubjects() {
-		return subjects;
-	}
-
-	public void setSubjects(List<Subject> subjects) {
-		this.subjects = subjects;
-	}
-
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public void setName(String name){
-		this.name = name;
-	}
-	
-	public String getName(){
-		return this.name;
-	}
-			
-	public void setCode(String code){
-		this.code = code;
-	}
-	
-	public String getCode(){
-		return this.code;
-	}
-			
-	public void setParentSubjectId(Long parentSubjectId){
-		this.parentSubjectId = parentSubjectId;
-	}
-	
-	public Long getParentSubjectId(){
-		return this.parentSubjectId;
-	}
-			
-	public String getParentSubjectName() {
-		return parentSubjectName;
-	}
-
-	public void setParentSubjectName(String parentSubjectName) {
-		this.parentSubjectName = parentSubjectName;
-	}
-
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-
-	public Boolean getDelFlag() {
-		return delFlag;
-	}
-
-	public void setDelFlag(Boolean delFlag) {
-		this.delFlag = delFlag;
-	}
-
-	public String getImg() {
-		return img;
-	}
-
-	public void setImg(String img) {
-		this.img = img;
-	}
-
-	public String getDesc() {
-		return desc;
-	}
-
-	public void setDesc(String desc) {
-		this.desc = desc;
-	}
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SubjectTypeEnum.java

@@ -14,7 +14,8 @@ public enum SubjectTypeEnum implements BaseEnum<String, SubjectTypeEnum> {
 
     ENSEMBLE("合奏"),
     MUSIC("小曲目"),
-    SUBJECT("声部");
+    SUBJECT("声部"),
+    COURSEWARE("课件");
 
     @EnumValue
     private String code;

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java

@@ -5,8 +5,10 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
@@ -37,4 +39,6 @@ public interface UserTenantAlbumRecordMapper extends BaseMapper<UserTenantAlbumR
     List<Long> ifBuy(@Param("tenantAlbumId") List<Long> tenantAlbumId, @Param("studentId") Long studentId);
 
     List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> selectTemporaryRecord();
+
+    List<TenantGroupAlbumWrapper.TenantAlbumSort> getTenantAlbumMaxCreateTime(@Param("userId") Long userId, @Param("clientType") ClientEnum clientType, @Param("tenantAlbumIds") List<Long> tenantAlbumIds);
 }

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

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.entity.MusicTag;
 import com.yonge.cooleshow.biz.dal.vo.MusicTagVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 音乐标签表 服务类
@@ -83,4 +84,7 @@ public interface MusicTagService extends IService<MusicTag>  {
 	 * @return 标签名字符串
 	 */
     String getMusicTagNames(List<Long> tagIdList);
+
+    Map<Long, MusicTag> getAllMap();
+
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SubjectService.java

@@ -54,4 +54,6 @@ public interface SubjectService extends BaseService<Long, Subject> {
 	List<Subject> subjectSelect(String type, String userExtSubjectIds);
 
     Map<Integer, Subject> getMapByIds(List<String> subjectIds);
+
+    Map<Integer, Subject> getAllMap();
 }

+ 6 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumMusicService.java

@@ -2,7 +2,8 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
 
@@ -48,6 +49,8 @@ public interface TenantAlbumMusicService extends IService<TenantAlbumMusic>  {
      */
     TenantAlbumMusicWrapper.TenantAlbumMusicSelectData getTenantAlbumMusicQuery(TenantAlbumMusicWrapper.TenantAlbumMusicSelect query);
 
+    List<Long> getTenantAlbumMusicIdsByIds(List<Long> tenantAlbumIds, List<SubjectTypeEnum> subjectTypes);
+
     /**
      * 获取机构专辑曲目ID集合
      *
@@ -61,4 +64,6 @@ public interface TenantAlbumMusicService extends IService<TenantAlbumMusic>  {
      * @param tenantId 机构ID
      */
     List<Long> getMusicIdsByTenantIds(Long tenantId);
+
+    LessonCoursewareWrapper.LessonCourseware getLessonCoursewareDetail(LessonCoursewareWrapper.LessonCourseQuery query);
 }

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

@@ -46,11 +46,9 @@ public interface TenantGroupAlbumService extends IService<TenantGroupAlbum>  {
     /**
      * 可购买机构信息
      *
-     * @param tenantGroupAlbumId
-     * @param userId             用户ID
-     * @param clientType         客户端类型
      */
-    List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(Long tenantGroupAlbumId, Long userId, ClientEnum clientType);
+    List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(TenantGroupAlbumWrapper.BuyTenantAlbumQuery query);
 
     void updateStatus(TenantGroupAlbumWrapper.UpdateStatus updateStatus);
+
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java

@@ -74,6 +74,8 @@ public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRe
      */
     List<Long> getUseAlbumIdsByUserId(Long userId,ClientEnum clientType);
 
+    List<UserTenantAlbumRecord> getUseAlbumByUserId(Long userId, ClientEnum clientType);
+
     TenantAlbumWrapper.TenantAlbum detailAlbum(String albumId);
 
     /**

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

@@ -1932,6 +1932,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         }
 
         List<TenantAlbumMusic> list = tenantAlbumMusicMapper.getByAlbumAndEnable(albumIds);
+        // 过滤出曲目
+        List<SubjectTypeEnum> enumList = Lists.newArrayList(SubjectTypeEnum.MUSIC, SubjectTypeEnum.SUBJECT, SubjectTypeEnum.ENSEMBLE);
+        list = list.stream().filter(tenantAlbumMusic -> enumList.contains(tenantAlbumMusic.getSubjectType())).collect(Collectors.toList());
+
         // 根据曲目ID分组
         Map<Long, List<Long>> map = list.stream()
             .collect(Collectors.groupingBy(TenantAlbumMusic::getMusicSheetId, Collectors.mapping(TenantAlbumMusic::getTenantAlbumId, Collectors.toList())));

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

@@ -243,5 +243,14 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         return list.stream().map(MusicTag::getName).collect(Collectors.joining(","));
     }
 
+    @Override
+    public Map<Long, MusicTag> getAllMap() {
+        List<MusicTag> all = musicTagDao.getAll();
+        if(CollectionUtils.isEmpty(all)){
+            return new HashMap<>();
+        }
+        return all.stream().collect(Collectors.toMap(MusicTag::getId, o -> o));
+    }
+
 
 }

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

@@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
@@ -70,6 +71,7 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
     }
 
     @Override
+    @Transactional
     public void upSetSubject(Subject subject) {
         Subject subjectByCode = subjectDao.queryByCode(subject.getCode());
         if (subjectByCode != null && subjectByCode.getId() != subject.getId()) {
@@ -90,6 +92,9 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
         if (subject.getId() != null) {
             subject.setUpdateTime(new Date());
             subjectDao.update(subject);
+            if (subject.getCbsSubjectId() == null) {
+                subjectDao.updateCbsSubjectIdNull(subject.getId());
+            }
         } else {
             subjectDao.insert(subject);
         }
@@ -184,6 +189,15 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
         return subjectList.stream().collect(Collectors.toMap(o -> o.getId().intValue(), o -> o));
     }
 
+    @Override
+    public Map<Integer, Subject> getAllMap() {
+        List<Subject> all = subjectDao.getAll();
+        if(CollectionUtils.isEmpty(all)){
+            return new HashMap<>();
+        }
+        return all.stream().collect(Collectors.toMap(o -> o.getId().intValue(), o -> o));
+    }
+
     /***
      * 查询声部树
      * @param: sub

+ 205 - 70
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java

@@ -4,23 +4,22 @@ import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayaedu.cbs.common.enums.EClientType;
+import com.dayaedu.cbs.common.enums.school.ECourseType;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsCourseTypeWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.MusicTag;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumCategory;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumCategoryDetail;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMusicMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wrapper.LessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.toolset.base.exception.BizException;
-import jodd.util.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -74,6 +73,9 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
     @Autowired
     private TenantAlbumCategoryDetailService tenantAlbumCategoryDetailService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
     /**
      * 查询详情
      * @param id 详情ID
@@ -94,66 +96,119 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
     @Override
     public IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page,
                                                                              TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
+        List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> musicSheets = new ArrayList<>();
+        if (query.getSubjectType() != SubjectTypeEnum.COURSEWARE) {
 
+            musicSheets = tenantAlbumMusicMapper.selectPage(page, query);
+            if (CollectionUtils.isEmpty(musicSheets)) {
+                return page.setRecords(musicSheets);
+            }
 
-        List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> musicSheets = tenantAlbumMusicMapper.selectPage(page, query);
-        if (CollectionUtils.isEmpty(musicSheets)) {
-            return page.setRecords(musicSheets);
-        }
-
-        // 设置声部
-        List<String> subjectIds = musicSheets.stream()
-            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getMusicSubject)
-            .filter(Objects::nonNull)
-            .flatMap(x -> Arrays.stream(x.split(",")))
-            .distinct()
-            .collect(Collectors.toList());
-        Map<Integer, Subject> subjectMap = subjectService.getMapByIds(subjectIds);
-
-        // 设置上传人
-        List<Long> userIds = musicSheets.stream()
-            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getUserId)
-            .filter(Objects::nonNull)
-            .distinct()
-            .collect(Collectors.toList());
-        Map<Long, SysUser> userMap = sysUserService.getMapByIds(userIds);
-
-        // 设置是否收藏
-        List<Long> musicSheetIds = musicSheets.stream()
-            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getId)
-            .filter(Objects::nonNull)
-            .distinct()
-            .collect(Collectors.toList());
-        List<Long> favoriteIds = new ArrayList<>();
-        if (query.getUserId() != null && query.getClientType() != null) {
-            List<MusicFavorite> favoriteList = musicFavoriteService.lambdaQuery()
-                .in(MusicFavorite::getMusicSheetId, musicSheetIds)
-                .eq(MusicFavorite::getUserId, query.getUserId())
-                .eq(MusicFavorite::getClientType, query.getClientType().equals(ClientEnum.TENANT_STUDENT) ? ClientEnum.STUDENT : query.getClientType())
-                .list();
-            favoriteIds = favoriteList.stream().map(MusicFavorite::getMusicSheetId).distinct().collect(Collectors.toList());
+            // 设置声部
+            List<String> subjectIds = musicSheets.stream()
+                .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getMusicSubject)
+                .filter(Objects::nonNull)
+                .flatMap(x -> Arrays.stream(x.split(",")))
+                .distinct()
+                .collect(Collectors.toList());
+            Map<Integer, Subject> subjectMap = subjectService.getMapByIds(subjectIds);
+
+            // 设置上传人
+            List<Long> userIds = musicSheets.stream()
+                .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getUserId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+            Map<Long, SysUser> userMap = sysUserService.getMapByIds(userIds);
+
+            // 设置是否收藏
+            List<Long> musicSheetIds = musicSheets.stream()
+                .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+            List<Long> favoriteIds = new ArrayList<>();
+            if (query.getUserId() != null && query.getClientType() != null) {
+                List<MusicFavorite> favoriteList = musicFavoriteService.lambdaQuery()
+                    .in(MusicFavorite::getMusicSheetId, musicSheetIds)
+                    .eq(MusicFavorite::getUserId, query.getUserId())
+                    .eq(MusicFavorite::getClientType, query.getClientType().equals(ClientEnum.TENANT_STUDENT) ? ClientEnum.STUDENT : query.getClientType())
+                    .list();
+                favoriteIds = favoriteList.stream().map(MusicFavorite::getMusicSheetId).distinct().collect(Collectors.toList());
 
-        }
+            }
 
 
-        for (TenantAlbumMusicWrapper.StudentTenantAlbumMusic m : musicSheets) {
-            if (StringUtils.isNotBlank(m.getMusicSubject())) {
-                String subjectNames = Arrays.stream(m.getMusicSubject().split(","))
-                    .distinct()
-                    .map(Integer::parseInt)
-                    .map(subjectMap::get)
-                    .filter(Objects::nonNull)
-                    .map(Subject::getName)
-                    .collect(Collectors.joining(","));
-                m.setMusicSubjectName(subjectNames);
+            for (TenantAlbumMusicWrapper.StudentTenantAlbumMusic m : musicSheets) {
+                if (StringUtils.isNotBlank(m.getMusicSubject())) {
+                    String subjectNames = Arrays.stream(m.getMusicSubject().split(","))
+                        .distinct()
+                        .map(Integer::parseInt)
+                        .map(subjectMap::get)
+                        .filter(Objects::nonNull)
+                        .map(Subject::getName)
+                        .collect(Collectors.joining(","));
+                    m.setMusicSubjectName(subjectNames);
+                }
+                SysUser sysUser = userMap.get(m.getUserId());
+                if (sysUser != null) {
+                    m.setUserName(sysUser.getUsername());
+                }
+                if (CollectionUtils.isNotEmpty(favoriteIds)) {
+                    m.setFavorite(favoriteIds.contains(m.getId()));
+                }
             }
-            SysUser sysUser = userMap.get(m.getUserId());
-            if (sysUser != null) {
-                m.setUserName(sysUser.getUsername());
+        } else {
+            // 查询专辑课件
+            List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery()
+                .eq(TenantAlbumMusic::getTenantAlbumId, query.getAlbumId())
+                .eq(TenantAlbumMusic::getSubjectType, SubjectTypeEnum.COURSEWARE)
+                .eq(TenantAlbumMusic::getDelFlag, false)
+                .orderByAsc(TenantAlbumMusic::getSortNumber)
+                .list();
+            if (CollectionUtils.isEmpty(list)) {
+                return page.setRecords(musicSheets);
             }
-            if (CollectionUtils.isNotEmpty(favoriteIds)) {
-                m.setFavorite(favoriteIds.contains(m.getId()));
+            List<Long> coursewareIds = list.stream().map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
+
+            try {
+                List<ECourseType> courseTypeList = courseTypeBySubject(query.getSubjectId());
+
+                PageInfo<CbsLessonCoursewareWrapper.LessonCourseware> lessonCoursewarePageInfo = coursewareFeignService.lessonCoursewarePage(CbsLessonCoursewareWrapper.LessonCoursewareQuery.builder()
+                    .page(query.getPage()).rows(query.getRows()).lessonCoursewareIds(coursewareIds).courseTypes(courseTypeList).keyword(query.getKeyword()).enableFlag(true)
+                    .courseTypeCode(StringUtils.isNotBlank(query.getCourseTypeCode())?ECourseType.valueOf(query.getCourseTypeCode()):null).build()
+                ).feignData();
+                List<CbsLessonCoursewareWrapper.LessonCourseware> rows = lessonCoursewarePageInfo.getRows();
+                if (CollectionUtils.isEmpty(rows)) {
+                    return page.setRecords(musicSheets);
+                }
+                // 转map
+                Map<Long, CbsLessonCoursewareWrapper.LessonCourseware> coursewareMap = rows.stream().collect(Collectors.toMap(CbsLessonCoursewareWrapper.LessonCourseware::getId, o -> o,(o1,o2)->o1));
+
+                for (Long coursewareId : coursewareIds) {
+                    CbsLessonCoursewareWrapper.LessonCourseware row = coursewareMap.get(coursewareId);
+                    if (row == null) {
+                        continue;
+                    }
+                    TenantAlbumMusicWrapper.StudentTenantAlbumMusic studentTenantAlbumMusic = new TenantAlbumMusicWrapper.StudentTenantAlbumMusic();
+                    studentTenantAlbumMusic.setId(row.getId());
+                    studentTenantAlbumMusic.setTenantAlbumId(query.getAlbumId());
+                    studentTenantAlbumMusic.setMusicSheetName(row.getName());
+                    studentTenantAlbumMusic.setTitleImg(row.getCoverImg());
+                    studentTenantAlbumMusic.setMusicSubject(row.getCourseTypeCode());
+                    studentTenantAlbumMusic.setMusicSubjectName(ECourseType.valueOf(row.getCourseTypeCode()).getName());
+                    musicSheets.add(studentTenantAlbumMusic);
+
+                }
+
+                page.setRecords(musicSheets);
+                page.setTotal(lessonCoursewarePageInfo.getTotal());
+                return page;
+            }catch (Exception e) {
+                log.error("查询课件失败", e);
+                throw new BizException("内容平台查询课件异常");
             }
+
         }
         return page.setRecords(musicSheets);
     }
@@ -196,18 +251,29 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
         }
 
         // 专辑曲目关联数据
-//        List<TenantAlbumMusic> list = this.lambdaQuery()
-//                .in(TenantAlbumMusic::getTenantAlbumId, albumIds)
-//                .eq(query.getTenantAlbumId() != null, TenantAlbumMusic::getTenantAlbumId, query.getTenantAlbumId())
-//                .eq(query.getSubjectType() != null, TenantAlbumMusic::getSubjectType, query.getSubjectType())
-//                .eq(TenantAlbumMusic::getDelFlag, false)
-//                .list();
         List<TenantAlbumMusic> list = tenantAlbumMusicMapper.getList(query,albumIds);
         if (CollectionUtils.isEmpty(list)) {
             return data;
         }
 
-        List<Long> musicSheetIds = list.stream().map(o -> o.getMusicSheetId()).distinct().collect(Collectors.toList());
+        List<Long> coursewareIds = list.stream().filter(o -> o.getSubjectType() == SubjectTypeEnum.COURSEWARE)
+            .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+
+        if (CollectionUtils.isNotEmpty(coursewareIds) ) {
+            CbsLessonCoursewareWrapper.LambdaQuery lambdaQuery = CbsLessonCoursewareWrapper.LambdaQuery.builder().ids(coursewareIds)
+                .delFlag(false).enableFlag(true).build();
+            List<CbsLessonCoursewareWrapper.Entity> entities = coursewareFeignService.lessonCoursewareLambdaQuery(lambdaQuery).feignData();
+
+            List<ECourseType> courseTypeList = courseTypeBySubject(query.getSubjectId());
+            List<String> courseTypes = entities.stream()
+                .map(CbsLessonCoursewareWrapper.Entity::getCourseTypeCode)
+                .filter(courseTypeCode -> courseTypeList.contains(ECourseType.valueOf(courseTypeCode)))
+                .distinct().collect(Collectors.toList());
+            data.setCourseTypeList(courseTypes);
+        }
+
+        List<Long> musicSheetIds = list.stream().filter(o -> o.getSubjectType() != SubjectTypeEnum.COURSEWARE)
+            .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
         if (CollectionUtils.isEmpty(musicSheetIds)) {
             return data;
         }
@@ -273,19 +339,55 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
 
     }
 
+    private List<ECourseType> courseTypeBySubject(Long subjectId) {
+        List<ECourseType> courseTypeList = new ArrayList<>();
+
+        // 有声部, 根据声部查询对应的课件类型
+        List<CbsCourseTypeWrapper.CourseType> courseTypes = coursewareFeignService.courseTypeList().feignData();
+        if (subjectId != null) {
+            Subject subject = subjectService.get(subjectId);
+            for (CbsCourseTypeWrapper.CourseType courseType : courseTypes) {
+                if (StringUtils.isNotBlank(courseType.getSubjectIds()) ) {
+                    if (subject !=null && subject.getCbsSubjectId() !=null) {
+                        boolean contains = Arrays.asList(courseType.getSubjectIds().split(",")).contains(subject.getCbsSubjectId().toString());
+                        if (contains) {
+                            courseTypeList.add(ECourseType.valueOf(courseType.getTypeCode()));
+                        }
+                    }
+
+                }  else {
+                    courseTypeList.add(ECourseType.valueOf(courseType.getTypeCode()));
+                }
+            }
+        }else {
+            return courseTypes.stream().map(CbsCourseTypeWrapper.CourseType::getTypeCode).distinct()
+                .map(ECourseType::valueOf).collect(Collectors.toList());
+        }
+        return courseTypeList;
+    }
+
     @Override
-    public List<Long> getMusicIdsByIds(List<Long> tenantAlbumIds) {
+    public List<Long> getTenantAlbumMusicIdsByIds(List<Long> tenantAlbumIds, List<SubjectTypeEnum> subjectTypes) {
 
         if (CollectionUtils.isEmpty(tenantAlbumIds)) {
             return Collections.emptyList();
         }
-        List<TenantAlbumMusic> list = this.lambdaQuery().in(TenantAlbumMusic::getTenantAlbumId, tenantAlbumIds).list();
+        List<TenantAlbumMusic> list = this.lambdaQuery()
+            .in(TenantAlbumMusic::getTenantAlbumId, tenantAlbumIds)
+            .in(CollectionUtils.isNotEmpty(subjectTypes),TenantAlbumMusic::getSubjectType,subjectTypes)
+            .list();
         if (CollectionUtils.isEmpty(list)) {
             return Collections.emptyList();
         }
         return list.stream().map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
     }
 
+    @Override
+    public List<Long> getMusicIdsByIds(List<Long> tenantAlbumIds) {
+
+        return getTenantAlbumMusicIdsByIds(tenantAlbumIds,Arrays.asList(SubjectTypeEnum.MUSIC, SubjectTypeEnum.ENSEMBLE,SubjectTypeEnum.SUBJECT));
+    }
+
 
     /**
      * 获取机构专辑曲目ID集合
@@ -296,4 +398,37 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
     public List<Long> getMusicIdsByTenantIds(Long tenantId) {
         return baseMapper.selectMusicIdsByTenantIds(tenantId);
     }
+
+    @Override
+    public LessonCoursewareWrapper.LessonCourseware getLessonCoursewareDetail(LessonCoursewareWrapper.LessonCourseQuery query) {
+        CbsLessonCoursewareWrapper.LessonCourseware lessonCourseware = coursewareFeignService.lessonCoursewareDetail(query.getLessonCoursewareId()).feignData();
+        if (lessonCourseware == null) {
+            throw new BizException("课件不存在");
+        }
+
+        LessonCoursewareWrapper.LessonCourseware lessonCoursewareDto = JSON.parseObject(JSON.toJSONString(lessonCourseware), LessonCoursewareWrapper.LessonCourseware.class);
+        lessonCoursewareDto.setPlay(false);
+
+        if (query.getClient() == ClientEnum.STUDENT) {
+            // 判断学生有咩有购买
+            if (query.getAlbumId() != null) {
+                UserTenantAlbumRecord albumRecord = userTenantAlbumRecordService.getNewestByTenantAlbumId(query.getAlbumId(), query.getUserId(), query.getClient());
+                if (albumRecord != null && albumRecord.getEndTime().after(new Date())) {
+                    lessonCoursewareDto.setPlay(true);
+                }
+            } else {
+                List<Long> useAlbumIdsByUserId = userTenantAlbumRecordService.getUseAlbumIdsByUserId(query.getUserId(), query.getClient());
+                if (CollectionUtils.isNotEmpty(useAlbumIdsByUserId)) {
+                    List<Long> list = tenantAlbumMusicService.getTenantAlbumMusicIdsByIds(useAlbumIdsByUserId, Arrays.asList(SubjectTypeEnum.COURSEWARE));
+                    if (list.contains(query.getLessonCoursewareId())) {
+                        lessonCoursewareDto.setPlay(true);
+                    }
+                }
+            }
+        } else {
+            lessonCoursewareDto.setPlay(true);
+        }
+
+        return lessonCoursewareDto;
+    }
 }

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

@@ -9,12 +9,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
-import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -143,7 +138,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                     //获取每一个机构专辑Id
                     String id = t.getId();
                     //查询机构专辑曲目表里  所对应的曲目数
-                    List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantAlbumId, id).eq(TenantAlbumMusic::getDelFlag,false).list();
+                    List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantAlbumId, id)
+                        .in(TenantAlbumMusic::getSubjectType,Arrays.asList(SubjectTypeEnum.MUSIC,SubjectTypeEnum.SUBJECT,SubjectTypeEnum.ENSEMBLE))
+                        .eq(TenantAlbumMusic::getDelFlag,false).list();
                     //获取曲目数量
                     List<Long> MusicList = list.stream().map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
                     int num = MusicList.size();
@@ -193,19 +190,19 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         //检查曲目数量
         //机构专辑曲目数
-        List<TenantAlbumMusic> tenantAlbumMusiclist = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantAlbumId, orderGoodsInfo.getBizId())
-                .eq(TenantAlbumMusic::getDelFlag,false).list();
-        List<Long> musicSheetIds = tenantAlbumMusiclist.stream().map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
-        if(CollectionUtils.isNotEmpty(musicSheetIds)){
-            Integer count = musicSheetService.lambdaQuery().in(MusicSheet::getId, musicSheetIds)
-                    .eq(MusicSheet::getState, true)
-                    .eq(MusicSheet::getDelFlag, false).count();
-            if(count < 1){
-                throw new BizException("当前教程不可购买");
-            }
-        }else {
-            throw new BizException("当前教程不可购买");
-        }
+//        List<TenantAlbumMusic> tenantAlbumMusiclist = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantAlbumId, orderGoodsInfo.getBizId())
+//                .eq(TenantAlbumMusic::getDelFlag,false).list();
+//        List<Long> musicSheetIds = tenantAlbumMusiclist.stream().map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
+//        if(CollectionUtils.isNotEmpty(musicSheetIds)){
+//            Integer count = musicSheetService.lambdaQuery().in(MusicSheet::getId, musicSheetIds)
+//                    .eq(MusicSheet::getState, true)
+//                    .eq(MusicSheet::getDelFlag, false).count();
+//            if(count < 1){
+//                throw new BizException("当前教程不可购买");
+//            }
+//        }else {
+//            throw new BizException("当前教程不可购买");
+//        }
         if (orderGoodsInfo == null) {
             log.error("订单创建前检测,订单商品信息为空");
             throw new BizException("订单商品信息为空");

+ 80 - 25
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupAlbumServiceImpl.java

@@ -3,33 +3,27 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.beust.jcommander.internal.Lists;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
-import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
-import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMusicMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
-import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
-import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.jetbrains.annotations.Nullable;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -58,6 +52,15 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
     @Autowired
     private TenantAlbumService tenantAlbumService;
 
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
+    @Autowired
+    private UserTenantAlbumRecordMapper userTenantAlbumRecordMapper;
+
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -104,26 +107,24 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
     }
 
     @Override
-    public List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(Long tenantGroupAlbumId, Long userId, ClientEnum clientType) {
+    public List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(TenantGroupAlbumWrapper.BuyTenantAlbumQuery query) {
         // 学生端 查看小组专辑 获取专辑基本信息, 机构端查看机构专辑 获取专辑基本信息
 
-        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
-        query.setTenantGroupAlbumId(tenantGroupAlbumId);
-        if (tenantGroupAlbumId != null) {} else if (clientType == ClientEnum.STUDENT) {
-            Student student = studentService.getById(userId);
+        if (query.getTenantGroupAlbumId() != null) {} else if (query.getClientType() == ClientEnum.STUDENT) {
+            Student student = studentService.getById(query.getUserId());
             if (student.getTenantId() == null || student.getTenantId() <=0 || student.getTenantGroupId() == null) {
                 throw new BizException("学生未加入机构或者小组");
             }
             query.setTenantId(student.getTenantId());
             query.setTenantGroupId(student.getTenantGroupId());
-        } else if (clientType == ClientEnum.TENANT) {
-            TenantStaff tenantStaff = tenantStaffService.getByUserId(userId);
+        } else if (query.getClientType() == ClientEnum.TENANT) {
+            TenantStaff tenantStaff = tenantStaffService.getByUserId(query.getUserId());
             if(tenantStaff == null || tenantStaff.getTenantId() == null) {
                 throw new BizException("机构员工不存在");
             }
             query.setTenantId(tenantStaff.getTenantId());
-        }else if (clientType == ClientEnum.TEACHER) {
-            Teacher teacher = teacherService.getById(userId);
+        }else if (query.getClientType() == ClientEnum.TEACHER) {
+            Teacher teacher = teacherService.getById(query.getUserId());
             if(teacher == null || teacher.getTenantId() == null) {
                 throw new BizException("老师机构信息不存在");
             }
@@ -132,15 +133,41 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
             throw new BizException("客户端类型错误");
         }
 
+        return tenantAlbumsList(query);
+    }
+
+    @Nullable
+    private List<TenantGroupAlbumWrapper.BuyTenantAlbum> tenantAlbumsList(TenantGroupAlbumWrapper.BuyTenantAlbumQuery query) {
         List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo = baseMapper.getBuyAlbumInfo(query);
         if (CollectionUtils.isEmpty(buyAlbumInfo)) {
             return buyAlbumInfo;
         }
+        if (query.getTenantGroupId() !=null || query.getTenantGroupAlbumId() != null) {
+            buyAlbumInfo.sort(Comparator.comparing(TenantGroupAlbumWrapper.BuyTenantAlbum::getTenantGroupAlbumId));
+        }
         // 查询专辑可用的分类的曲目数量
         // 机构专辑ID集合
         List<Long> tenantAlbumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getId).collect(Collectors.toList());
 
         List<TenantAlbumMusic> list = tenantAlbumMusicMapper.getByAlbumAndEnable(tenantAlbumIds);
+        // 过滤出课件
+        List<Long> coursewareIds = list.stream().filter(x -> x.getSubjectType() == SubjectTypeEnum.COURSEWARE).map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
+
+        if (CollectionUtils.isNotEmpty(coursewareIds)) {
+            CbsLessonCoursewareWrapper.LambdaQuery lambdaQuery = CbsLessonCoursewareWrapper.LambdaQuery.builder().ids(coursewareIds)
+                .delFlag(false).enableFlag(true).build();
+            List<CbsLessonCoursewareWrapper.Entity> entities = coursewareFeignService.lessonCoursewareLambdaQuery(lambdaQuery).feignData();
+            if (CollectionUtils.isNotEmpty(entities)) {
+                // id 集合
+                List<Long> courseIds = entities.stream().map(CbsLessonCoursewareWrapper.Entity::getId).collect(Collectors.toList());
+                // list 去除类型为COURSEWARE,id 不在courseIds
+                list = list.stream().filter(x -> x.getSubjectType() != SubjectTypeEnum.COURSEWARE || courseIds.contains(x.getMusicSheetId())).collect(Collectors.toList());
+            } else {
+                list = list.stream().filter(x -> x.getSubjectType() != SubjectTypeEnum.COURSEWARE).collect(Collectors.toList());
+            }
+        }
+
+
         // 根据专辑ID分组 在根据声部分类 分组
         Map<Long, Map<SubjectTypeEnum, Long>> map = list.stream()
             .collect(Collectors.groupingBy(TenantAlbumMusic::getTenantAlbumId, Collectors.groupingBy(TenantAlbumMusic::getSubjectType,Collectors.counting())));
@@ -151,24 +178,51 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
                 buyTenantAlbum.setMusicCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.MUSIC,0L).intValue());
                 buyTenantAlbum.setEnsembleCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.ENSEMBLE,0L).intValue());
                 buyTenantAlbum.setSubjectCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.SUBJECT,0L).intValue());
+                buyTenantAlbum.setCoursewareCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.COURSEWARE,0L).intValue());
             } else {
                 buyTenantAlbum.setMusicCounts(0);
                 buyTenantAlbum.setEnsembleCounts(0);
                 buyTenantAlbum.setSubjectCounts(0);
+                buyTenantAlbum.setCoursewareCounts(0);
             }
             buyTenantAlbum.setMusicNum(buyTenantAlbum.getMusicCounts() + buyTenantAlbum.getEnsembleCounts()+buyTenantAlbum.getSubjectCounts());
         }
 
         // 如果学生购买 判断购买次数
-        if (clientType == ClientEnum.STUDENT) {
+        if (query.getClientType() == ClientEnum.STUDENT) {
             // 曲目ID集合
             List<Long> tenantGroupAlbumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getTenantGroupAlbumId).collect(Collectors.toList());
-            List<Long> studentTenantAlbumNum = userOrderDao.getStudentTenantAlbumNum(userId, tenantGroupAlbumIds);
+            List<Long> studentTenantAlbumNum = userOrderDao.getStudentTenantAlbumNum(query.getUserId(), tenantGroupAlbumIds);
+
+            // 判断是否还在生效中
+            List<UserTenantAlbumRecord> albumRecordList = userTenantAlbumRecordService.getUseAlbumByUserId(query.getUserId(), ClientEnum.STUDENT);
+            Map<Long,UserTenantAlbumRecord> albumRecordMap = new HashMap<>();
+            // 转map
+            if (CollectionUtils.isNotEmpty(albumRecordList)) {
+                albumRecordMap = albumRecordList.stream().collect(Collectors.toMap(UserTenantAlbumRecord::getTenantAlbumId, x -> x,(o1,o2)->o1));
+            }
+            // 转map
+            Map<Long, Long> sortMap = new HashMap<>();
+            if (query.isSortFlag()) {
+
+                // 获取专辑的最新激活时间排序
+                List<TenantGroupAlbumWrapper.TenantAlbumSort> sorts = userTenantAlbumRecordMapper
+                    .getTenantAlbumMaxCreateTime(query.getUserId(),query.getClientType(),tenantAlbumIds);
+                sortMap = sorts.stream()
+                    .collect(Collectors.toMap(TenantGroupAlbumWrapper.TenantAlbumSort::getId, TenantGroupAlbumWrapper.TenantAlbumSort::getSort));
+            }
+
             for (TenantGroupAlbumWrapper.BuyTenantAlbum item : buyAlbumInfo) {
                 item.setBuyedTimes((int) studentTenantAlbumNum.stream().filter(x -> x.equals(item.getTenantGroupAlbumId())).count());
                 if (item.getBuyedTimes() > item.getBuyTimes()) {
                     item.setBuyedTimes(item.getBuyTimes());
                 }
+                item.setStatus(albumRecordMap.containsKey(item.getId()));
+                UserTenantAlbumRecord userTenantAlbumRecord = albumRecordMap.get(item.getId());
+                if (userTenantAlbumRecord != null) {
+                    item.setExpireTime(userTenantAlbumRecord.getEndTime());
+                }
+                item.setSort(sortMap.getOrDefault(item.getId(),0L));
             }
         }
 
@@ -196,4 +250,5 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
                 .in(TenantGroupAlbum::getId, ids)
                 .update();
     }
+
 }

+ 55 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -109,6 +111,9 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
 
     @Autowired
     private TenantAlbumMusicMapper tenantAlbumMusicMapper;
+
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
     /**
      * 查询详情
      *
@@ -366,18 +371,30 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
 
     @Override
     public List<Long> getUseAlbumIdsByUserId(Long userId, ClientEnum clientType) {
+        List<UserTenantAlbumRecord> list = getUseAlbumByUserId(userId, clientType);
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        return list.stream().map(UserTenantAlbumRecord::getTenantAlbumId).distinct().collect(Collectors.toList());
+
+    }
+
+
+    @Override
+    public List<UserTenantAlbumRecord> getUseAlbumByUserId(Long userId, ClientEnum clientType) {
         if (userId == null) {
             return new ArrayList<>();
         }
         List<UserTenantAlbumRecord> list = this.lambdaQuery()
-                .eq(UserTenantAlbumRecord::getUserId, userId)
-                .eq(UserTenantAlbumRecord::getClientType, clientType)
-                .ge(UserTenantAlbumRecord::getEndTime, new Date())
-                .list();
+            .eq(UserTenantAlbumRecord::getUserId, userId)
+            .eq(UserTenantAlbumRecord::getClientType, clientType)
+            .ge(UserTenantAlbumRecord::getEndTime, new Date())
+            .orderByDesc(UserTenantAlbumRecord::getEndTime)
+            .list();
         if (CollectionUtils.isEmpty(list)) {
             return new ArrayList<>();
         }
-        return list.stream().map(UserTenantAlbumRecord::getTenantAlbumId).distinct().collect(Collectors.toList());
+        return list;
 
     }
 
@@ -483,39 +500,43 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         String name = tenantAlbum.getName();
         //机构专辑封面
         String coverImg = tenantAlbum.getCoverImg();
-        //机构专辑曲目数
-        List<TenantAlbumMusic> tenantAlbumMusiclist = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId).eq(TenantAlbumMusic::getDelFlag, false).list();
-        List<Long> MusicSheetIds = tenantAlbumMusiclist.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
-        //计算符合条件的个数
-        if (CollectionUtils.isNotEmpty(MusicSheetIds)) {
-            size = musicSheetService.lambdaQuery().in(MusicSheet::getId, MusicSheetIds).eq(MusicSheet::getState, true)
-                .eq(MusicSheet::getDelFlag, false).count();
-        }
-        //Integer musicNum = tenantAlbum.getMusicNum();
-
-        //获取合奏曲目数量
-        List<TenantAlbumMusic> ensembleLits = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "ENSEMBLE")
-            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-            .eq(TenantAlbumMusic::getDelFlag, false).list();
-        List<Long> ensembleMusicSheetIds = ensembleLits.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
-
-        album.setEnsembleCounts(ensembleMusicSheetIds.size());
 
-        //获取小曲目的曲目数量
-        List<TenantAlbumMusic> musicLists = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "MUSIC")
-            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-            .eq(TenantAlbumMusic::getDelFlag, false).list();
-        List<Long> musicSheetIds = musicLists.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+        List<TenantAlbumMusic> albumMusicList = tenantAlbumMusicMapper.getByAlbumAndEnable(tenantAlbumIds);
+        // 过滤出课件
+        List<Long> coursewareIds = albumMusicList.stream().filter(x -> x.getSubjectType() == SubjectTypeEnum.COURSEWARE).map(TenantAlbumMusic::getMusicSheetId).collect(Collectors.toList());
+
+        if (CollectionUtils.isNotEmpty(coursewareIds)) {
+            CbsLessonCoursewareWrapper.LambdaQuery lambdaQuery = CbsLessonCoursewareWrapper.LambdaQuery.builder().ids(coursewareIds)
+                .delFlag(false).enableFlag(true).build();
+            List<CbsLessonCoursewareWrapper.Entity> entities = coursewareFeignService.lessonCoursewareLambdaQuery(lambdaQuery).feignData();
+            if (CollectionUtils.isNotEmpty(entities)) {
+                // id 集合
+                List<Long> courseIds = entities.stream().map(CbsLessonCoursewareWrapper.Entity::getId).collect(Collectors.toList());
+                // list 去除类型为COURSEWARE,id 不在courseIds
+                albumMusicList = albumMusicList.stream().filter(x -> x.getSubjectType() != SubjectTypeEnum.COURSEWARE || courseIds.contains(x.getMusicSheetId())).collect(Collectors.toList());
+            } else {
+                albumMusicList = albumMusicList.stream().filter(x -> x.getSubjectType() != SubjectTypeEnum.COURSEWARE).collect(Collectors.toList());
+            }
+        }
 
-        album.setMusicCounts(musicSheetIds.size());
 
-        //获取声部的曲目数量
-        List<TenantAlbumMusic> subjectLists = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "SUBJECT")
-            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-            .eq(TenantAlbumMusic::getDelFlag, false).list();
-        List<Long> subjectSheetIds = subjectLists.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+        // 根据专辑ID分组 在根据声部分类 分组
+        Map<Long, Map<SubjectTypeEnum, Long>> map = albumMusicList.stream()
+            .collect(Collectors.groupingBy(TenantAlbumMusic::getTenantAlbumId, Collectors.groupingBy(TenantAlbumMusic::getSubjectType,Collectors.counting())));
 
-        album.setSubjectCounts(subjectSheetIds.size());
+        Map<SubjectTypeEnum, Long> subjectTypeEnumLongMap = map.get(tenantAlbum.getId());
+        if (subjectTypeEnumLongMap != null) {
+            album.setMusicCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.MUSIC,0L).intValue());
+            album.setEnsembleCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.ENSEMBLE,0L).intValue());
+            album.setSubjectCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.SUBJECT,0L).intValue());
+            album.setCoursewareCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.COURSEWARE,0L).intValue());
+        } else {
+            album.setMusicCounts(0);
+            album.setEnsembleCounts(0);
+            album.setSubjectCounts(0);
+            album.setCoursewareCounts(0);
+        }
+        album.setMusicNum(album.getMusicCounts() + album.getEnsembleCounts()+album.getSubjectCounts());
 
 
         //机构专辑简介

+ 106 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/LessonCoursewareWrapper.java

@@ -0,0 +1,106 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareDetailWrapper;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsLessonCoursewareWrapper;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 课件教材
+ */
+@ApiModel(value = "LessonCoursewareWrapper对象", description = "课件教材")
+public class LessonCoursewareWrapper {
+
+    @Data
+	@Builder
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @ApiModel("课件教材分页查询")
+    public static class LessonCoursewareQuery implements QueryInfo {
+        private Integer page = 1;
+
+        private Integer rows = 20;
+
+        @ApiModelProperty("声部")
+        private Integer subjectId;
+
+        @ApiModelProperty("启用状态")
+        private Boolean enable;
+    }
+
+    @Data
+	@Builder
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @ApiModel("课件教材dto")
+    public static class LessonCourseware extends CbsLessonCoursewareWrapper.LessonCourseware {
+
+        @ApiModelProperty("是否生效中")
+        private Boolean play = false;
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("CourseScheduleCoursewareDetail-课程计划课件详情")
+    public static class CourseScheduleCoursewareDetail {
+
+        // 课程计划编号
+        @ApiModelProperty("课程计划编号")
+        private Long lessonCoursewareId;
+
+        // 课程计划编号
+        @ApiModelProperty("课程计划详情编号")
+        private Long lessonCoursewareDetailId;
+
+        @ApiModelProperty("课程计划详情编号")
+        private String coursewareDetailId;
+
+        // 课件名称
+        @ApiModelProperty("课件详情名称")
+        private String coursewareDetailName;
+
+        @ApiModelProperty("知识点")
+        private List<CbsLessonCoursewareDetailWrapper.KnowledgePointSmall> knowledgePointList;
+
+        public void setLessonCoursewareDetailId(Long lessonCoursewareDetailId) {
+        	this.lessonCoursewareDetailId = lessonCoursewareDetailId;
+            this.coursewareDetailId = String.valueOf(lessonCoursewareDetailId);
+        }
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("CourseScheduleCoursewareDetail-课件教材")
+    public static class LessonCourseQuery {
+
+        // 课程计划编号
+        @ApiModelProperty("课程计划编号")
+        @NotNull(message = "课件教材编号不能为空")
+        private Long lessonCoursewareId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long albumId;
+
+        @ApiModelProperty(value = "客户端",hidden = true)
+        private ClientEnum client;
+
+        @ApiModelProperty(value = "用户id",hidden = true)
+        private Long userId;
+    }
+
+}

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.dayaedu.cbs.common.enums.school.ECourseType;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.biz.dal.entity.MusicTag;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
@@ -119,7 +120,10 @@ public class TenantAlbumMusicWrapper {
 
 
         @ApiModelProperty("标签集合")
-        private List<MusicTag> tags;
+        private List<MusicTag> tags = new ArrayList<>();
+
+        @ApiModelProperty("课件教材分类集合")
+        private List<String> courseTypeList = new ArrayList<>();
 
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -172,6 +176,8 @@ public class TenantAlbumMusicWrapper {
         @ApiModelProperty(value = "用户ID",hidden = true)
         private Long userId;
 
+        @ApiModelProperty("课程类型编码")
+        private String courseTypeCode;
 
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -139,6 +139,10 @@ public class TenantAlbumWrapper {
         @ApiModelProperty("声部曲目数")
         private Integer SubjectCounts;
 
+        @ApiModelProperty("教材数")
+        private Integer coursewareCounts;
+
+
         @ApiModelProperty("专辑分类类型ID")
         private Long categoryTypeId;
 

+ 35 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupAlbumWrapper.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -193,6 +194,14 @@ public class TenantGroupAlbumWrapper {
 
         @ApiModelProperty("专辑ID集合")
         private List<Long> tenantAlbumIds;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("客户端类型")
+        private ClientEnum clientType;
+
+        private boolean sortFlag = false;
     }
 
 
@@ -240,6 +249,10 @@ public class TenantGroupAlbumWrapper {
         @ApiModelProperty("声部曲目数")
         private Integer SubjectCounts;
 
+
+        @ApiModelProperty("教材数")
+        private Integer coursewareCounts;
+
         @ApiModelProperty("机构小组专辑ID ,学生购买需传参")
         private Long tenantGroupAlbumId;
 
@@ -269,6 +282,16 @@ public class TenantGroupAlbumWrapper {
         @ApiModelProperty("已购买次数")
         private Integer buyedTimes;
 
+        @ApiModelProperty("是否生效中")
+        private Boolean status = false;
+
+
+        @ApiModelProperty("排序")
+        private long sort =0L;
+
+        @ApiModelProperty("到期时间")
+        private Date expireTime;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -287,4 +310,16 @@ public class TenantGroupAlbumWrapper {
         private Integer count;
     }
 
+
+
+    @Data
+    @ApiModel(" TenantAlbumSort-专辑排序")
+    public static class TenantAlbumSort {
+
+        @ApiModelProperty("专辑ID")
+        private Long id;
+
+        @ApiModelProperty("排序")
+        private long sort =0L;
+    }
 }

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

@@ -833,6 +833,7 @@
                         #{item}
                     </foreach>
                     and tam.del_flag_=0
+                    and tam.subject_type_ in ('ENSEMBLE', 'MUSIC', 'SUBJECT')
                 </if>
                 <if test="param.providerType != null">
                     and t.provider_type_ = #{param.providerType}

+ 6 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicTagMapper.xml

@@ -114,4 +114,10 @@
             </if>
         </where>
     </select>
+
+    <select id="getAll" resultType="com.yonge.cooleshow.biz.dal.entity.MusicTag">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM music_tag t
+    </select>
 </mapper>

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

@@ -16,6 +16,7 @@
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="del_flag_" property="delFlag"/>
+        <result column="cbs_subject_id_" property="cbsSubjectId"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -77,8 +78,8 @@
     <insert id="insert" parameterType="com.yonge.cooleshow.biz.dal.entity.Subject" useGeneratedKeys="true"
             keyColumn="id"
             keyProperty="id">
-        INSERT INTO subject (id_,name_,code_,parent_subject_id_,img_,create_time_,update_time_,desc_,ai_default_frequency_)
-        VALUES(#{id},#{name},#{code},#{parentSubjectId},#{img},now(),now(),#{desc},#{aiDefaultFrequency})
+        INSERT INTO subject (id_,name_,code_,parent_subject_id_,img_,create_time_,update_time_,desc_,ai_default_frequency_,cbs_subject_id_)
+        VALUES(#{id},#{name},#{code},#{parentSubjectId},#{img},now(),now(),#{desc},#{aiDefaultFrequency},#{cbsSubjectId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -109,6 +110,9 @@
             <if test="aiDefaultFrequency != null">
                 ai_default_frequency_ = #{aiDefaultFrequency},
             </if>
+            <if test="cbsSubjectId != null">
+                cbs_subject_id_ = #{cbsSubjectId},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -204,6 +208,14 @@
     <select id="getSubjectMatchByName" resultType="com.yonge.cooleshow.biz.dal.entity.Subject">
         SELECT * FROM subject WHERE del_flag_ = 0 and name_ LIKE CONCAT('%', #{name}, '%') LIMIT 1
     </select>
+
+    <select id="getAll" resultMap="Subject">
+        SELECT * FROM subject
+    </select>
+
+    <update id="updateCbsSubjectIdNull">
+        update subject set cbs_subject_id_ = null where id_ = #{subjectId}
+    </update>
     <!--声部模糊匹配-->
 
 </mapper>

+ 4 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml

@@ -93,9 +93,9 @@
         select
         t.*
         from tenant_album_music t
-        inner join music_sheet t1 on t.music_sheet_id_ = t1.id_
+        left join music_sheet t1 on t.music_sheet_id_ = t1.id_
         where
-        t.del_flag_ = 0 and t1.state_ = 1 and t1.del_flag_ = 0
+        t.del_flag_ = 0 and ((t1.state_ = 1 and t1.del_flag_ = 0 and t.subject_type_ in ('ENSEMBLE', 'MUSIC', 'SUBJECT')) or t.subject_type_ not in ('ENSEMBLE', 'MUSIC', 'SUBJECT'))
         and t.tenant_album_id_ in
         <foreach collection="tenantAlbumIds" item="item" index="index" open="(" close=")" separator=",">
             #{item}
@@ -122,7 +122,8 @@
             </foreach>
         </if>
         <if test="param.subjectId != null">
-            and (find_in_set(#{param.subjectId},m.music_subject_) or m.music_subject_ is null or m.music_subject_ = '' or m.music_sheet_type_ = 'CONCERT')
+            and ( find_in_set(#{param.subjectId},m.music_subject_) or m.music_subject_ is null or m.music_subject_ = ''
+            or m.music_sheet_type_ = 'CONCERT'  or t.subject_type_ not in  ('ENSEMBLE', 'MUSIC', 'SUBJECT'))
         </if>
     </select>
 </mapper>

+ 14 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml

@@ -123,4 +123,18 @@
         </where>
         ORDER BY t.id_ DESC
     </select>
+
+    <select id="getTenantAlbumMaxCreateTime"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper$TenantAlbumSort">
+        select t.tenant_album_id_ as id,max(UNIX_TIMESTAMP(t.create_time_)) as sort
+        from user_tenant_album_record t
+        where t.user_id_ = #{userId}
+        and t.client_type_ = #{clientType}
+        and t.tenant_album_id_ in
+        <foreach collection="tenantAlbumIds" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        group by t.tenant_album_id_
+
+    </select>
 </mapper>

+ 3 - 1
toolset/toolset-base/src/main/java/com/yonge/toolset/base/page/PageInfo.java

@@ -135,7 +135,9 @@ public class PageInfo<T> implements Serializable {
 
 	public void setTotal(int total) {
 		this.total = total;
-		this.totalPage=new BigDecimal(total).divide(new BigDecimal(limit),0,BigDecimal.ROUND_CEILING).intValue();
+        if (limit !=0) {
+            this.totalPage = new BigDecimal(total).divide(new BigDecimal(limit), 0, BigDecimal.ROUND_CEILING).intValue();
+        }
 	}
 
 	public List<T> getRows() {

+ 1 - 1
toolset/toolset-feign/src/main/java/com/yonge/toolset/feign/config/FeignConfiguration.java

@@ -5,7 +5,7 @@ import feign.RequestInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+//@Configuration
 public class FeignConfiguration {
 
 	@Bean

+ 4 - 0
toolset/toolset-mybatis/pom.xml

@@ -48,6 +48,10 @@
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>3.0.7.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.common</groupId>
+            <artifactId>microsvc-common-response</artifactId>
+        </dependency>
     </dependencies>
 
 </project>