Pārlūkot izejas kodu

Merge branch 'feature/0412_courseware' into develop-new

刘俊驰 1 gadu atpakaļ
vecāks
revīzija
59914fb04c
26 mainītis faili ar 375 papildinājumiem un 82 dzēšanām
  1. 1 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  2. 0 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumSheetController.java
  3. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java
  4. 5 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  5. 82 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java
  6. 6 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java
  7. 6 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java
  8. 5 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/LocalFastJsonHttpMessageConverter.java
  9. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebMvcConfig.java
  10. 1 1
      cooleshow-user/user-biz/pom.xml
  11. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/LocalFastJsonHttpMessageConverter.java
  12. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  13. 2 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantGroupAlbumService.java
  14. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  15. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  16. 58 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java
  17. 17 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  18. 70 27
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupAlbumServiceImpl.java
  19. 42 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  20. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java
  21. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  22. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupAlbumWrapper.java
  23. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  24. 4 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml
  25. 14 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  26. 1 1
      toolset/toolset-feign/src/main/java/com/yonge/toolset/feign/config/FeignConfiguration.java

+ 1 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java

@@ -158,6 +158,7 @@ public class TenantAlbumController {
                         if (entity != null) {
                             tenantAlbumSheet.setMusicSheetName(entity.getName());
                             tenantAlbumSheet.setTitleImg(entity.getCoverImg());
+                            tenantAlbumSheet.setMusicSubject(entity.getCourseTypeCode());
                             tenantAlbumSheet.setMusicSubjectName(ECourseType.valueOf(entity.getCourseTypeCode()).getName());
                         }
                         break;

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

@@ -47,7 +47,6 @@ public class TenantAlbumSheetController extends BaseController {
 
     @ApiOperation(value = "获取内容平台课件教材")
     @PostMapping("/queryPage")
-    @PreAuthorize("@pcs.hasPermissions('lessonCourseware/queryPage')")
     public HttpResponseResult<PageInfo<CbsLessonCoursewareWrapper.LessonCourseware>> queryPage(@RequestBody CbsLessonCoursewareWrapper.LessonCoursewareQuery query) throws Exception {
 //        query.setEnableFlag(true);
         return succeed(PageUtil.pageInfo(coursewareFeignService.lessonCoursewarePage(query).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));
     }
 

+ 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("未找到专辑信息");
+    }
 }

+ 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));
 	}
 }

+ 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

+ 1 - 1
cooleshow-user/user-biz/pom.xml

@@ -148,7 +148,7 @@
         <dependency>
             <groupId>com.dayaedu.cbs.openfeign</groupId>
             <artifactId>dayaedu-openfeign-client</artifactId>
-            <version>1.0.0</version>
+            <version>1.0.1</version>
             <exclusions>
                 <exclusion>
                     <groupId>com.alibaba.cloud</groupId>

+ 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;
 	}
 }

+ 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);
 }

+ 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

@@ -2121,6 +2121,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())));

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

@@ -4,8 +4,10 @@ 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;
@@ -162,6 +164,7 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
                 .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);
@@ -169,12 +172,24 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
             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).enableFlag(true)
-                    .courseTypeCode(query.getCourseTypeCode()).build()).feignData();
+                    .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 (CbsLessonCoursewareWrapper.LessonCourseware row : lessonCoursewarePageInfo.getRows()) {
+                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());
@@ -183,6 +198,7 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
                     studentTenantAlbumMusic.setMusicSubject(row.getCourseTypeCode());
                     studentTenantAlbumMusic.setMusicSubjectName(ECourseType.valueOf(row.getCourseTypeCode()).getName());
                     musicSheets.add(studentTenantAlbumMusic);
+
                 }
 
                 page.setRecords(musicSheets);
@@ -243,11 +259,18 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
         List<Long> coursewareIds = list.stream().filter(o -> o.getSubjectType() == SubjectTypeEnum.COURSEWARE)
             .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
 
-        CbsLessonCoursewareWrapper.LambdaQuery lambdaQuery = CbsLessonCoursewareWrapper.LambdaQuery.builder().ids(coursewareIds)
-            .delFlag(false).enableFlag(true).build();
-        List<CbsLessonCoursewareWrapper.Entity> entities = coursewareFeignService.lessonCoursewareLambdaQuery(lambdaQuery).feignData();
-
-
+        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());
@@ -316,6 +339,33 @@ 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> getTenantAlbumMusicIdsByIds(List<Long> tenantAlbumIds, List<SubjectTypeEnum> subjectTypes) {
 

+ 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("订单商品信息为空");

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

@@ -3,29 +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.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;
 
 /**
@@ -57,6 +55,12 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Autowired
+    private UserTenantAlbumRecordMapper userTenantAlbumRecordMapper;
+
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -103,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("老师机构信息不存在");
             }
@@ -131,15 +133,39 @@ 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());
+
+        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())));
@@ -150,36 +176,52 @@ 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<Long> useAlbumIds = userTenantAlbumRecordService.getUseAlbumIdsByUserId(userId, ClientEnum.STUDENT);
+            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());
                 }
-                if (CollectionUtils.isNotEmpty(useAlbumIds)) {
-                    item.setStatus(useAlbumIds.contains(item.getTenantGroupAlbumId()));
-                } else {
-                    item.setStatus(false);
+                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));
             }
-
-
         }
 
         return buyAlbumInfo;
@@ -206,4 +248,5 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
                 .in(TenantGroupAlbum::getId, ids)
                 .update();
     }
+
 }

+ 42 - 8
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;
 
     }
 
@@ -484,14 +501,31 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         //机构专辑封面
         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());
+        List<TenantAlbumMusic> tenantAlbumMusiclist = tenantAlbumMusicMapper.getByAlbumAndEnable(Lists.newArrayList(tenantAlbumId));
+        // 过滤出曲目
+        List<SubjectTypeEnum> enumList = com.beust.jcommander.internal.Lists.newArrayList(SubjectTypeEnum.MUSIC, SubjectTypeEnum.SUBJECT, SubjectTypeEnum.ENSEMBLE);
+        List<Long> MusicSheetIds = tenantAlbumMusiclist.stream().filter(o->enumList.contains(o.getSubjectType()))
+            .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+
+        List<Long> coursewareIds = tenantAlbumMusiclist.stream().filter(o->o.getSubjectType() == SubjectTypeEnum.COURSEWARE)
+            .map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+        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
+            album.setCoursewareCounts(courseIds.size());
+        } else {
+            album.setCoursewareCounts(0);
+        }
+
         //计算符合条件的个数
         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")

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

@@ -120,10 +120,10 @@ public class TenantAlbumMusicWrapper {
 
 
         @ApiModelProperty("标签集合")
-        private List<MusicTag> tags;
+        private List<MusicTag> tags = new ArrayList<>();
 
         @ApiModelProperty("课件教材分类集合")
-        private List<ECourseType> courseTypeList;
+        private List<String> courseTypeList = new ArrayList<>();
 
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -177,7 +177,7 @@ public class TenantAlbumMusicWrapper {
         private Long userId;
 
         @ApiModelProperty("课程类型编码")
-        private ECourseType courseTypeCode;
+        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;
 

+ 32 - 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;
 
@@ -272,6 +285,13 @@ public class TenantGroupAlbumWrapper {
         @ApiModelProperty("是否生效中")
         private Boolean status = false;
 
+
+        @ApiModelProperty("排序")
+        private long sort =0L;
+
+        @ApiModelProperty("到期时间")
+        private Date expireTime;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -290,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

@@ -896,6 +896,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}

+ 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>

+ 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