Przeglądaj źródła

Merge branch 'online' of http://git.dayaedu.com/yonge/cooleshow into zx_online_cbs

# Conflicts:
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicTagDao.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
#	cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicTagMapper.xml
#	cooleshow-user/user-biz/src/main/resources/config/mybatis/SubjectMapper.xml
zouxuan 10 miesięcy temu
rodzic
commit
a6e633ed63
100 zmienionych plików z 1999 dodań i 358 usunięć
  1. 2 2
      .gitignore
  2. 4 1
      audio-analysis/src/main/resources/bootstrap-prod.yml
  3. 1 1
      audio-analysis/src/main/resources/logback-spring.xml
  4. 17 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/AppVersionInfoController.java
  5. 33 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  6. 56 4
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SubjectController.java
  7. 93 89
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  8. 86 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumSheetController.java
  9. 110 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantGroupAlbumController.java
  10. 6 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java
  11. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java
  12. 8 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  13. 0 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java
  14. 73 11
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java
  15. 126 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java
  16. 3 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserMusicController.java
  17. 5 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  18. 42 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java
  19. 1 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java
  20. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  21. 278 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumController.java
  22. 49 7
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumSheetController.java
  23. 50 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java
  24. 3 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserMusicController.java
  25. 34 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  26. 50 7
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java
  27. 51 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java
  28. 4 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java
  29. 15 18
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java
  30. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java
  31. 2 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/SmsCodeController.java
  32. 17 0
      cooleshow-app/src/main/resources/bootstrap-dev.yml
  33. 1 2
      cooleshow-app/src/main/resources/bootstrap-prod.yml
  34. 36 0
      cooleshow-app/src/main/resources/logback-dev.xml
  35. 1 2
      cooleshow-app/src/main/resources/logback-spring.xml
  36. 19 1
      cooleshow-auth/auth-server/pom.xml
  37. 5 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/LocalFastJsonHttpMessageConverter.java
  38. 3 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/ResourceServerConfig.java
  39. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebMvcConfig.java
  40. 19 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java
  41. 34 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/ExceptionLogController.java
  42. 25 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/OpenMutualTLSController.java
  43. 2 0
      cooleshow-auth/auth-server/src/main/resources/bootstrap-pre.yml
  44. 3 2
      cooleshow-auth/auth-server/src/main/resources/bootstrap-prod.yml
  45. 1 1
      cooleshow-auth/auth-server/src/main/resources/logback-spring.xml
  46. 36 0
      cooleshow-auth/auth-server/src/main/resources/logback-test.xml
  47. 1 1
      cooleshow-bbs/src/main/resources/logback-spring.xml
  48. 0 15
      cooleshow-cms/src/main/resources/bootstrap-dev.properties
  49. 0 15
      cooleshow-cms/src/main/resources/bootstrap-pre.properties
  50. 15 0
      cooleshow-cms/src/main/resources/bootstrap-pre.yml
  51. 0 15
      cooleshow-cms/src/main/resources/bootstrap-prod.properties
  52. 15 0
      cooleshow-cms/src/main/resources/bootstrap-prod.yml
  53. 1 1
      cooleshow-cms/src/main/resources/logback-spring.xml
  54. 10 11
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/service/impl/RedisIdGeneratorService.java
  55. 1 1
      cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml
  56. 1 1
      cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml
  57. 1 1
      cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml
  58. 4 2
      cooleshow-task/src/main/resources/bootstrap-prod.yml
  59. 1 1
      cooleshow-task/src/main/resources/logback-spring.xml
  60. 17 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/AppVersionInfoController.java
  61. 0 16
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  62. 10 10
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java
  63. 1 1
      cooleshow-user/user-admin/src/main/resources/logback-spring.xml
  64. 19 1
      cooleshow-user/user-biz/pom.xml
  65. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/LocalFastJsonHttpMessageConverter.java
  66. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/AppVersionInfoDao.java
  67. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicTagDao.java
  68. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
  69. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  70. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/PageUtil.java
  71. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentMerchantConfig.java
  72. 12 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java
  73. 13 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbum.java
  74. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbumPurchase.java
  75. 86 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantGroupAlbum.java
  76. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  77. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PeriodEnum.java
  78. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SubjectTypeEnum.java
  79. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMusicMapper.java
  80. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantGroupAlbumMapper.java
  81. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  82. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AppVersionInfoService.java
  83. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  84. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  85. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicTagService.java
  86. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SmsCodeService.java
  87. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SubjectService.java
  88. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java
  89. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumMusicService.java
  90. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumService.java
  91. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantGroupAlbumService.java
  92. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserMusicService.java
  93. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  94. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AppVersionInfoServiceImpl.java
  95. 59 53
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  96. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  97. 81 28
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  98. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  99. 7 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  100. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentMerchantConfigServiceImpl.java

+ 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

+ 4 - 1
audio-analysis/src/main/resources/bootstrap-prod.yml

@@ -8,4 +8,7 @@ spring:
         prefix: audio-analysis
         file-extension: yaml
         enabled: true
-        refresh-enabled: true
+        refresh-enabled: true
+        shared-configs:
+          - data-id: base.yaml
+            refresh: true

+ 1 - 1
audio-analysis/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/audio-analysis-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/audio-analysis-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 17 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/AppVersionInfoController.java

@@ -9,6 +9,8 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -37,10 +39,22 @@ public class AppVersionInfoController extends BaseController {
 	@ApiOperation("根据app客户端查询对象")
 	@ApiImplicitParam(name = "platform", value = "平台名称", required = true, dataType = "String", paramType = "path")
 	@GetMapping(value = "/queryByPlatform")
-	public HttpResponseResult<AppVersionInfo> queryByPlatform(String platform) {
+	public HttpResponseResult<AppVersionInfo> queryByPlatform(String platform,String localVersion) {
 		List<AppVersionInfo> list = appVersionInfoService.queryNewestByPlatform(platform);
-		if (list.size() > 0) {
-			return succeed(list.get(0));
+		if (CollectionUtils.isNotEmpty(list)) {
+			AppVersionInfo appVersionInfo = list.get(0);
+			//如果应用版本跨多个版本时若其中任何一个版本有强制更新,返回字段标记为强制更新
+			if(!appVersionInfo.getIsForceUpdate() && StringUtils.isNotEmpty(localVersion)){
+				//是否需要强制更新
+				AppVersionInfo forceUpdate = appVersionInfoService.checkForceUpdate(platform,localVersion);
+				if(forceUpdate != null){
+					appVersionInfo.setIsForceUpdate(true);
+				}
+			}
+			if (StringUtils.isEmpty(localVersion)) {
+				appVersionInfo.setIsForceUpdate(true);
+			}
+			return succeed(appVersionInfo);
 		}
 		return failed();
 	}

+ 33 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -8,11 +8,15 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -32,6 +36,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +56,7 @@ import javax.validation.Valid;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -78,6 +84,10 @@ public class StudentController extends BaseController {
 
     @Autowired
     private TenantActivationCodeService tenantActivationCodeService;
+    @Autowired
+    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
 
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
@@ -115,6 +125,29 @@ public class StudentController extends BaseController {
                     break;
             }
         }
+        Long tenantAlbumPurchaseId = query.getTenantAlbumPurchaseId();
+        if (tenantAlbumPurchaseId != null) {
+            // 查询关联这个专辑对应的小组学生
+            TenantAlbumPurchase tenantAlbumPurchase = tenantAlbumPurchaseService.getById(tenantAlbumPurchaseId);
+            Long tenantAlbumId = tenantAlbumPurchase.getTenantAlbumId();
+            List<String> tenantGroupIds = tenantGroupAlbumService.lambdaQuery()
+                    .eq(TenantGroupAlbum::getTenantAlbumId, tenantAlbumId)
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .eq(TenantGroupAlbum::getStatus, true)
+                    .list().stream().map(TenantGroupAlbum::getTenantGroupId).map(String::valueOf).distinct().collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(tenantGroupIds)) {
+                // 没有小组
+                return succeed(PageUtil.getPageInfo(PageUtil.getPage(query), new ArrayList<>()));
+            }
+            String tenantGroupId = query.getTenantGroupId();
+            if (StringUtils.isNotEmpty(tenantGroupId)) {
+                if(!tenantGroupIds.contains(tenantGroupId)){
+                    return succeed(PageUtil.getPageInfo(PageUtil.getPage(query), new ArrayList<>()));
+                }
+            } else {
+                query.setTenantGroupId(String.join(",", tenantGroupIds));
+            }
+        }
 
         IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
         List<StudentVo> rows = pages.getRecords();

+ 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("内容平台服务异常");
+        }
+    }
 }

+ 93 - 89
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,40 +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;
                 }
 
-            });
-            tenantAlbumSheets =tenantAlbumSheets.stream().filter(o -> o.getMusicSheetName() != null).collect(Collectors.toList());
-
+                return tenantAlbumSheet;
+            }).collect(Collectors.toList());
 
             sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
             musicSheetData.add(sheetData);
@@ -199,17 +219,13 @@ public class TenantAlbumController {
     @ApiOperation(value = "新增专辑", notes = "新增专辑")
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/save')")
     public HttpResponseResult<Boolean> save(@Validated @RequestBody TenantAlbumVo.TenantAlbum album) {
-        //判断当前机构是否已经绑定机构专辑
-        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
-                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
-                .list();
-        if (CollectionUtils.isNotEmpty(list)) {
-            throw new BizException("当前机构已有专辑");
-        }
 
         // 检查曲目重复
         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("不能添加相同的曲目");
@@ -220,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();
@@ -244,19 +259,12 @@ public class TenantAlbumController {
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/update')")
     public HttpResponseResult<Boolean> update( @RequestBody TenantAlbumVo.TenantAlbum album) {
 
-        //判断当前机构是否已经绑定机构专辑
-        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
-                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
-                .ne(TenantAlbumRef::getTenantAlbumId, album.getId())
-                .list();
-        if (CollectionUtils.isNotEmpty(list)) {
-            throw new BizException("当前机构已有专辑");
-        }
-
         // 检查曲目重复
         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("不能添加相同的曲目");
@@ -267,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();
@@ -289,10 +296,7 @@ public class TenantAlbumController {
     @ApiOperation(value = "启用/冻结", notes = "启用/冻结")
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/updateStatus')")
     public HttpResponseResult<Boolean> updateStatus(@Validated @RequestBody TenantAlbumVo.UpdateStatus status) {
-        tenantAlbumService.lambdaUpdate()
-                .set(TenantAlbum::getStatus, status.getStatus())
-                .eq(TenantAlbum::getId, status.getId())
-                .update();
+        tenantAlbumService.updateStatus(status.getId(), status.getStatus());
         return HttpResponseResult.succeed();
     }
 

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

+ 110 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantGroupAlbumController.java

@@ -0,0 +1,110 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.admin:}/tenantGroupAlbum")
+@Api(tags = "机构小组专辑配置表")
+public class TenantGroupAlbumController {
+
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "详情", notes = "机构小组专辑配置表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/detail', {'BACKEND'})")
+    //@GetMapping("/detail/{id}")
+    public R<TenantGroupAlbum> detail(@PathVariable("id") Long id) {
+
+        TenantGroupAlbum wrapper = tenantGroupAlbumService.detail(id);
+
+        return R.from(wrapper);
+    }
+
+    @ApiOperation(value = "查询分页", notes = "机构小组专辑配置表- 传入 TenantGroupAlbumWrapper.TenantGroupAlbumQuery")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/page', {'BACKEND'})")
+    @PostMapping("/page")
+    public R<PageInfo<TenantGroupAlbumWrapper.TenantGroupAlbumVo>> page(@RequestBody TenantGroupAlbumWrapper.TenantGroupAlbumQuery query) {
+
+        IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> pages = tenantGroupAlbumService.selectPage(QueryInfo.getPage(query), query);
+
+        return R.from(QueryInfo.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "新增", notes = "机构小组专辑配置表- 传入 TenantGroupAlbumWrapper.TenantGroupAlbum")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/save', {'BACKEND'})")
+    @PostMapping("/save")
+    public R<JSONObject> add(@Validated @RequestBody TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        // 新增数据
+        TenantGroupAlbum record = JSON.parseObject(JSON.toJSONString(tenantGroupAlbum), TenantGroupAlbum.class);
+        record.setPurchasePeriod(PeriodEnum.DAY.getCode());
+        record.setCreateBy(sysUser.getId());
+        record.setUpdateBy(sysUser.getId());
+        record.setStatus(false);
+        record.setDelFlag(false);
+        tenantGroupAlbumService.save(record);
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "修改", notes = "机构小组专辑配置表- 传入 TenantGroupAlbumWrapper.TenantGroupAlbum")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/update', {'BACKEND'})")
+    @PostMapping("/update")
+    public R<JSONObject> update(@Validated @RequestBody TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+
+        TenantGroupAlbum record = JSON.parseObject(JSON.toJSONString(tenantGroupAlbum), TenantGroupAlbum.class);
+        record.setUpdateBy(sysUser.getId());
+        // 更新数据
+        tenantGroupAlbumService.updateById(record);
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "删除", notes = "机构小组专辑配置表- 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/remove', {'BACKEND'})")
+    @PostMapping("/remove")
+    public R<Boolean> remove(@Validated @RequestBody TenantGroupAlbumWrapper.Remove remove) {
+        tenantGroupAlbumService.lambdaUpdate()
+                .set(TenantGroupAlbum::getDelFlag, true)
+                .eq(TenantGroupAlbum::getId, remove.getId())
+                .update();
+        return R.from(true);
+    }
+
+    @ApiOperation(value = "删除", notes = "机构小组专辑配置表- 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroupAlbum/updateStatus', {'BACKEND'})")
+    @PostMapping("/updateStatus")
+    public R<Boolean> updateStatus(@RequestBody TenantGroupAlbumWrapper.UpdateStatus updateStatus) {
+        tenantGroupAlbumService.updateStatus(updateStatus);
+        return R.from(true);
+    }
+}

+ 6 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java

@@ -69,6 +69,12 @@ public class TenantAlbumVo {
         @ApiModelProperty("专辑分类等级ID")
         private Long categoryLevelId;
 
+        @ApiModelProperty("采购周期类型")
+        private String purchaseTypes;
+
+        @ApiModelProperty("专辑采购金额")
+        private String purchaseJson;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }

+ 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

+ 8 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -86,12 +86,13 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入musicTag")
-    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id,
+                                                         @RequestParam(required = false) String tenantAlbumId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             sysUser = null;
         }
-        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.STUDENT));
+        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.STUDENT,tenantAlbumId));
     }
 
     @ApiOperation(value = "曲目分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -431,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));
     }
 

+ 0 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java

@@ -55,7 +55,6 @@ public class TenantActivationCodeController extends BaseController {
         }
         query.setSendStatus(EActivationCode.SEND);
         query.setActivationPhone(sysUser.getPhone());
-        query.setTenantId(student.getTenantId());
         // 查询数据
         IPage<TenantActivationCodeWrapper.TenantActivationCode> pages =
                 tenantActivationCodeService.selectPage(QueryInfo.getPage(query), query);

+ 73 - 11
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java

@@ -1,26 +1,36 @@
 package com.yonge.cooleshow.student.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.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;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+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.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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -39,6 +49,12 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
     @ApiOperation(value = "查询条件")
     @PostMapping("/selectCondition")
     public HttpResponseResult<TenantAlbumMusicWrapper.TenantAlbumMusicSelectData> selectCondition(@RequestBody TenantAlbumMusicWrapper.TenantAlbumMusicSelect query) {
@@ -47,10 +63,15 @@ public class TenantAlbumSheetController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         query.setUserId(user.getId());
-        /*if(StringUtils.isBlank(query.getSubjectId())){
+        if(query.getSubjectId() == null){
         	Student student = studentService.getById(user.getId());
-        	query.setSubjectId(student.getSubjectId());
-        }*/
+            if (student == null) {
+                throw new BizException("学生信息不存在");
+            }
+            if (!StringUtil.isEmpty(student.getSubjectId())) {
+                query.setSubjectId(Long.parseLong(student.getSubjectId()));
+            }
+        }
         return succeed(tenantAlbumMusicService.getTenantAlbumMusicQuery(query));
     }
 
@@ -58,16 +79,57 @@ public class TenantAlbumSheetController extends BaseController {
 
     @ApiOperation(value = "分页查询")
     @PostMapping("/page")
-    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
+    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody @Validated TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        query.setTenantId(Optional.ofNullable(user.getTenantId()).orElse(-1L));
-        query.setClientType(ClientEnum.TENANT_STUDENT);
+        query.setUserId(user.getId());
+        query.setClientType(ClientEnum.STUDENT);
+
+        Student student = studentService.getById(user.getId());
+        if (student == null) {
+            throw new BizException("学生信息不存在");
+        }
+        if (!StringUtil.isEmpty(student.getSubjectId())) {
+            query.setSubjectId(Long.parseLong(student.getSubjectId()));
+        }
         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());
+    }
+
 }

+ 126 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java

@@ -0,0 +1,126 @@
+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;
+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;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/tenantGroupAlbum")
+@Api(tags = "机构小组专辑配置表")
+public class TenantGroupAlbumController {
+
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation(value = "学生可购买机构专辑信息")
+	@GetMapping("/buyAlbumInfo")
+	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(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("未找到专辑信息");
+    }
+}

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

@@ -77,7 +77,7 @@ public class UserMusicController {
 
     @ApiOperation(value = "保存草稿/发布作品", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusic")
     @PostMapping("/save")
-    public HttpResponseResult<JSONObject> add(@Validated @RequestBody UserMusicWrapper.AddUserMusic userMusic) {
+    public HttpResponseResult<String> add(@Validated @RequestBody UserMusicWrapper.AddUserMusic userMusic) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -85,9 +85,9 @@ public class UserMusicController {
         userMusic.setUserId(user.getId());
         userMusic.setClientType(ClientEnum.STUDENT);
         // 新增数据
-        userMusicService.save(userMusic);
+        ;
 
-        return HttpResponseResult.succeed();
+        return HttpResponseResult.succeed(userMusicService.save(userMusic).toString());
     }
 
     @ApiOperation(value = "删除", notes = "用户曲目作品- 传入id")

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

@@ -54,6 +54,7 @@ import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -303,6 +304,10 @@ public class UserOrderController extends BaseController {
 
         order.setTenantId(student.getTenantId());
 
+        if (orderReq.getPaymentCashAmount().compareTo(new BigDecimal(10000000))>0) {
+            throw new BizException("支付失败,下单金额超过最高上限");
+        }
+
         // 新增数据
         UserPaymentOrderWrapper.PaymentConfig paymentConfig = userPaymentCoreService.executeOrderCreate(order);
         if (Objects.isNull(paymentConfig)) {

+ 42 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java

@@ -4,11 +4,18 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
@@ -24,6 +31,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
 @Slf4j
 @Validated
 @RestController
@@ -33,6 +46,15 @@ public class UserTenantAlbumRecordController {
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private StudentService studentService;
+
     @ApiOperation(value = "详情", notes = "购买训练工具记录-根据详情ID查询单条, 传入id")
     @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/detail', {'BACKEND'})")
     //@GetMapping("/detail/{id}")
@@ -53,6 +75,26 @@ public class UserTenantAlbumRecordController {
         return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
     }
 
+    @ApiOperation(value = "学生机构专辑列表查询", notes = "学生机构专辑列表查询")
+    @PostMapping("/list")
+    public R<List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>> list(@RequestBody UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null || student.getTenantId() == null || student.getTenantId() == -1L) {
+            throw new BizException("请求非法");
+        }
+        Long tenantGroupId = student.getTenantGroupId();
+        if (tenantGroupId == null || tenantGroupId == -1L) {
+            return R.from(new ArrayList<>());
+        }
+        query.setUserId(sysUser.getId());
+        query.setEndTime(new Date());
+        query.setTenantId(student.getTenantId());
+        query.setTenantGroupId(student.getTenantGroupId());
+        return R.from(userTenantAlbumRecordService.list(query));
+    }
+
 
     @ApiOperation(value = "查询详情")
     @PostMapping("/detail")

+ 1 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.student.vo;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import io.swagger.annotations.ApiModel;

+ 3 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -83,13 +83,14 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入musicTag")
-    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id,
+                                                         @RequestParam(required = false) String tenantAlbumId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
-        MusicSheetDetailVo detail = musicSheetService.detail(id, sysUser, ClientEnum.TEACHER);
+        MusicSheetDetailVo detail = musicSheetService.detail(id, sysUser, ClientEnum.TEACHER,tenantAlbumId);
 
         // 设置返回默认值
         if (StringUtil.isEmpty(detail.getAudioFileUrl())) {

+ 278 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumController.java

@@ -0,0 +1,278 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.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.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+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.apache.commons.lang3.StringUtils;
+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 java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @Author:haonan
+ * @Date:2023/7/27 18:26
+ * @Filename:TenantAlbumController
+ */
+
+@RestController
+@RequestMapping("${app-config.url.teacher:}/tenantAlbum")
+@Api(value = "机构专辑管理", tags = "机构专辑管理")
+public class TenantAlbumController {
+    @Autowired
+    TenantAlbumService tenantAlbumService;
+
+    @Autowired
+    private TenantAlbumMusicService tenantAlbumMusicService;
+
+    @Autowired
+    private TenantAlbumRefService tenantAlbumRefService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private MusicTagService musicTagService;
+
+    /**
+     * 查询分页
+     *
+     * @param query
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "tenantAlbum")
+    public HttpResponseResult<PageInfo<TenantAlbumWrapper.TenantAlbum>> page(@RequestBody TenantAlbumWrapper.TenantAlbumQuery query) {
+        query.setStatus(true);
+        IPage<TenantAlbumWrapper.TenantAlbum> pages = tenantAlbumService.selectPage(QueryInfo.getPage(query), query);
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+    }
+
+
+    /**
+     * 查询详情
+     *
+     * @param id 详情ID
+     * @return TenantAlbum
+     */
+//    @PostMapping("/detail")
+    @ApiOperation(value = "查询详情", notes = "detail")
+    public HttpResponseResult<TenantAlbumWrapper.TenantAlbum> detail(@RequestParam("id") Long id) {
+        TenantAlbum tenantAlbum = tenantAlbumService.detail(id);
+        if (tenantAlbum == null) {
+            throw new BizException("专辑信息不存在");
+        }
+
+        TenantAlbumWrapper.TenantAlbum vo = JSON.parseObject(JSON.toJSONString(tenantAlbum),
+                TenantAlbumWrapper.TenantAlbum.class);
+
+        //查关联表
+        TenantAlbumRef one = tenantAlbumRefService.lambdaQuery().eq(TenantAlbumRef::getTenantAlbumId, id)
+                .last("limit 1").one();
+        vo.setTenantId(one.getTenantId().toString());
+        //查询曲目表
+
+        TenantInfo tenantInfo = tenantInfoService.getById(one.getTenantId());
+        vo.setTenantName(tenantInfo.getName());
+        List<TenantAlbumMusic> tenantAlbumMusics = tenantAlbumMusicService.lambdaQuery()
+                .eq(TenantAlbumMusic::getTenantAlbumId, id)
+                .eq(TenantAlbumMusic::getDelFlag, false)
+                .list();
+
+        Map<SubjectTypeEnum, List<TenantAlbumMusic>> groupByType =
+                tenantAlbumMusics.stream().collect(Collectors.groupingBy(TenantAlbumMusic::getSubjectType));
+
+
+        List<Long> musicSheetIdlist = tenantAlbumMusics.stream().map(next -> next.getMusicSheetId()).distinct().collect(Collectors.toList());
+
+
+        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()));
+        List<TenantAlbumWrapper.MusicSheetData> musicSheetData = vo.getMusicSheetData();
+        groupByType.forEach((key, value) -> {
+            value.sort(Comparator.comparing(TenantAlbumMusic::getSortNumber));
+            TenantAlbumWrapper.MusicSheetData sheetData = new TenantAlbumWrapper.MusicSheetData();
+            sheetData.setSubjectType(key);
+            List<TenantAlbumWrapper.TenantAlbumSheet> tenantAlbumSheets = value.stream().map(next -> {
+
+                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());
+                    }
+                }
+
+
+                //设置对应标签名称
+                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);
+                    }
+                }
+
+            });
+
+
+            sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
+            musicSheetData.add(sheetData);
+            vo.setMusicSheetData(musicSheetData);
+        });
+
+        return HttpResponseResult.succeed(vo);
+    }
+
+
+    /**
+     * 新增专辑
+     */
+//    @PostMapping("/save")
+    @ApiOperation(value = "新增专辑", notes = "新增专辑")
+    public HttpResponseResult<Boolean> save(@Validated @RequestBody TenantAlbumVo.TenantAlbum album) {
+
+        // 检查曲目重复
+        if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
+            List<Long> musicIds = album.getMusicSheetData().stream().flatMap(o -> o.getMusicSheetList().stream().map(m -> m.getId())).collect(Collectors.toList());
+            Set<Long> musicSet = new HashSet<>(musicIds);
+            if (musicSet.size() < musicIds.size()) {
+                throw new BizException("不能添加相同的曲目");
+            }
+        }
+
+        TenantAlbum tenantAlbum = JSON.parseObject(album.jsonString(), TenantAlbum.class);
+        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();
+                    sheetData.getTenantAlbumSheetList().addAll( musicSheetList.stream().map(m->{
+                        TenantAlbumWrapper.TenantAlbumSheet tenantAlbumSheet = new TenantAlbumWrapper.TenantAlbumSheet();
+                        tenantAlbumSheet.setLevel(m.getLevel());
+                        tenantAlbumSheet.setType(m.getType());
+                        tenantAlbumSheet.setId(m.getId().toString());
+                        return tenantAlbumSheet;
+                    }).collect(Collectors.toList()));
+                    sheetData.setSubjectType(next.getSubjectType());
+                    return sheetData;
+                }
+        ).collect(Collectors.toList());
+        tenantAlbumService.insertTenantAlbum(album.getTenantId(), tenantAlbum, musicSheetDataList);
+        return HttpResponseResult.succeed();
+    }
+
+//    @PostMapping("/update")
+    @ApiOperation(value = "修改专辑", notes = "修改专辑")
+    public HttpResponseResult<Boolean> update( @RequestBody TenantAlbumVo.TenantAlbum album) {
+
+        // 检查曲目重复
+        if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
+            List<Long> musicIds = album.getMusicSheetData().stream().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("不能添加相同的曲目");
+            }
+        }
+
+        TenantAlbum tenantAlbum = JSON.parseObject(album.jsonString(), TenantAlbum.class);
+        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();
+            sheetData.getTenantAlbumSheetList().addAll( musicSheetList.stream().map(m->{
+                TenantAlbumWrapper.TenantAlbumSheet tenantAlbumSheet = new TenantAlbumWrapper.TenantAlbumSheet();
+                tenantAlbumSheet.setLevel(m.getLevel());
+                tenantAlbumSheet.setType(m.getType());
+                tenantAlbumSheet.setId(m.getId().toString());
+                return tenantAlbumSheet;
+            }).collect(Collectors.toList()));
+            sheetData.setSubjectType(next.getSubjectType());
+            return sheetData;
+        }).collect(Collectors.toList());
+        tenantAlbumService.updateAlbum(album.getTenantId(), tenantAlbum, musicSheetDataList);
+        return HttpResponseResult.succeed();
+    }
+
+//    @PostMapping("/updateStatus")
+    @ApiOperation(value = "启用/冻结", notes = "启用/冻结")
+    public HttpResponseResult<Boolean> updateStatus(@Validated @RequestBody TenantAlbumVo.UpdateStatus status) {
+        tenantAlbumService.lambdaUpdate()
+                .set(TenantAlbum::getStatus, status.getStatus())
+                .eq(TenantAlbum::getId, status.getId())
+                .update();
+        return HttpResponseResult.succeed();
+    }
+
+}

+ 49 - 7
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,14 +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.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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -45,21 +51,57 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private TeacherService teacherService;
 
+    @Autowired
+    private CoursewareFeignService coursewareFeignService;
+
 
     @ApiOperation(value = "分页查询")
     @PostMapping("/page")
-    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
+    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody @Validated TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
 
         Teacher teacher = teacherService.getById(user.getId());
-        query.setTenantId(Optional.ofNullable(teacher.getTenantId()).orElse(-1L));
+//        query.setTenantId(Optional.ofNullable(teacher.getTenantId()).orElse(-1L));
         query.setClientType(ClientEnum.TEACHER);
         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.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());
+    }
+
 }

+ 50 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java

@@ -0,0 +1,50 @@
+package com.yonge.cooleshow.teacher.controller;
+
+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.TenantGroupAlbumService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+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;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.teacher:}/tenantGroupAlbum")
+@Api(tags = "机构小组专辑配置表")
+public class TenantGroupAlbumController {
+
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation(value = "学生可购买机构专辑信息")
+	@GetMapping("/buyAlbumInfo")
+	public HttpResponseResult<List<TenantGroupAlbumWrapper.BuyTenantAlbum>> buyAlbumInfo(@RequestParam(required = false) Long tenantGroupAlbumId) {
+
+        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.TEACHER);
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(query));
+	}
+}

+ 3 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserMusicController.java

@@ -74,7 +74,7 @@ public class UserMusicController {
 
     @ApiOperation(value = "保存草稿/发布作品", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusic")
     @PostMapping("/save")
-    public HttpResponseResult<JSONObject> add(@Validated @RequestBody UserMusicWrapper.AddUserMusic userMusic) {
+    public HttpResponseResult<String> add(@Validated @RequestBody UserMusicWrapper.AddUserMusic userMusic) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -82,9 +82,9 @@ public class UserMusicController {
         userMusic.setUserId(user.getId());
         userMusic.setClientType(ClientEnum.TEACHER);
         // 新增数据
-        userMusicService.save(userMusic);
+        ;
 
-        return HttpResponseResult.succeed();
+        return HttpResponseResult.succeed(userMusicService.save(userMusic).toString());
     }
 
     @ApiOperation(value = "删除", notes = "用户曲目作品- 传入id")

+ 34 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -7,7 +7,9 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
@@ -15,6 +17,8 @@ import com.yonge.cooleshow.biz.dal.service.OssFileService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
@@ -36,6 +40,7 @@ import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -52,6 +57,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -79,6 +85,10 @@ public class StudentController extends BaseController {
 
     @Autowired
     private TenantGroupService tenantGroupService;
+    @Autowired
+    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
 
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
@@ -100,6 +110,30 @@ public class StudentController extends BaseController {
         query.setLockFlag(UserLockFlag.NORMAL);
         query.setOrderBy("u.username_ asc");
 
+        Long tenantAlbumPurchaseId = query.getTenantAlbumPurchaseId();
+        if (tenantAlbumPurchaseId != null) {
+            // 查询关联这个专辑对应的小组学生
+            TenantAlbumPurchase tenantAlbumPurchase = tenantAlbumPurchaseService.getById(tenantAlbumPurchaseId);
+            Long tenantAlbumId = tenantAlbumPurchase.getTenantAlbumId();
+            List<String> tenantGroupIds = tenantGroupAlbumService.lambdaQuery()
+                    .eq(TenantGroupAlbum::getTenantAlbumId, tenantAlbumId)
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .eq(TenantGroupAlbum::getStatus, true)
+                    .list().stream().map(TenantGroupAlbum::getTenantGroupId).map(String::valueOf).distinct().collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(tenantGroupIds)) {
+                // 没有小组
+                return succeed(PageUtil.getPageInfo(PageUtil.getPage(query), new ArrayList<>()));
+            }
+            String tenantGroupId = query.getTenantGroupId();
+            if (StringUtils.isNotEmpty(tenantGroupId)) {
+                if(!tenantGroupIds.contains(tenantGroupId)){
+                    return succeed(PageUtil.getPageInfo(PageUtil.getPage(query), new ArrayList<>()));
+                }
+            } else {
+                query.setTenantGroupId(String.join(",", tenantGroupIds));
+            }
+        }
+
         IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
         List<StudentVo> rows = pages.getRecords();
 

+ 50 - 7
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,14 +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.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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Optional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 专辑表 web 控制层
@@ -39,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) {
@@ -58,16 +67,50 @@ public class TenantAlbumSheetController extends BaseController {
 
     @ApiOperation(value = "分页查询")
     @PostMapping("/page")
-    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
+    public HttpResponseResult<PageInfo<TenantAlbumMusicWrapper.StudentTenantAlbumMusic>> page(@RequestBody @Validated TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        query.setTenantId(Optional.ofNullable(user.getTenantId()).orElse(-1L));
+//        query.setTenantId(Optional.ofNullable(user.getTenantId()).orElse(-1L));
         query.setClientType(ClientEnum.TENANT);
         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.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());
+    }
+
+
 }

+ 51 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.tenant.controller;
+
+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.TenantGroupAlbumService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+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;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.tenant:}/tenantGroupAlbum")
+@Api(tags = "机构小组专辑配置表")
+public class TenantGroupAlbumController {
+
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation(value = "机构可购买机构专辑信息")
+	@GetMapping("/buyAlbumInfo")
+	public HttpResponseResult<List<TenantGroupAlbumWrapper.BuyTenantAlbum>> buyAlbumInfo(@RequestParam(required = false) Long tenantGroupAlbumId) {
+
+        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.TENANT);
+    
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(query));
+	}
+}

+ 4 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java

@@ -39,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.util.Objects;
 
 import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
@@ -84,6 +85,9 @@ public class UserOrderController {
         if (Objects.isNull(tenantStaff)) {
             throw BizException.from("用户信息不存在");
         }
+        if (orderReq.getPaymentCashAmount().compareTo(new BigDecimal(10000000))>0) {
+            throw new com.yonge.toolset.base.exception.BizException("支付失败,下单金额超过最高上限");
+        }
 
         order.setTenantId(tenantStaff.getTenantId());
         // 新增数据

+ 15 - 18
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java

@@ -7,13 +7,11 @@ import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
-import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -31,9 +29,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.HashSet;
-import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 @Slf4j
 @RestController
@@ -44,9 +41,6 @@ public class OpenStudentController extends BaseController {
     private StudentService studentService;
 
     @Autowired
-    private TeacherService teacherService;
-
-    @Autowired
     private TenantInfoService tenantInfoService;
 
     @Autowired
@@ -56,20 +50,14 @@ public class OpenStudentController extends BaseController {
     private SmsCodeService smsCodeService;
 
     @Autowired
-    private ImUserFriendService imUserFriendService;
-
-    @Autowired
-    private ImGroupService imGroupService;
-
-    @Autowired
-    private ImGroupMemberService imGroupMemberService;
+    private SysMessageService sysMessageService;
 
     @Autowired
     private TenantGroupMapper tenantGroupMapper;
 
     @PostMapping("/save")
     @ApiOperation(value = "新增/修改", notes = "传入Student,换绑时按照返回错误码5004判断,是否需要换绑,updateTenant=true表示换绑")
-    public HttpResponseResult<Boolean> save(@Validated @RequestBody StudentVo.Student student) {
+    public HttpResponseResult<String> save(@Validated @RequestBody StudentVo.Student student) {
         String code = student.getCode();
         if (StringUtils.isEmpty(code)) {
             throw new BizException("验证码不能为空");
@@ -127,10 +115,19 @@ public class OpenStudentController extends BaseController {
             student.setId(studentId);
         }
 
+        // 自动注册登陆验证码
+        String loginCode = "";
+        if (Optional.ofNullable(student.getLoginCode()).orElse(false)) {
+            // 生成登陆验证码
+            loginCode = sysMessageService.sendSecurityCode(MessageTypeEnum.SMS_VERIFY_CODE_LOGIN, student.getPhone());
+        }
+
+        // 保存学生信息
         StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
         studentInfo.setTenantId(tenantInfo.getId());
 
         studentService.save(studentInfo);
-        return succeed();
+
+        return succeed(loginCode);
     }
 }

+ 3 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java

@@ -51,5 +51,8 @@ public class StudentVo {
 
         @ApiModelProperty("短信验证码")
         private String code;
+
+        @ApiModelProperty("登陆验证码")
+        private Boolean loginCode;
     }
 }

+ 2 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/SmsCodeController.java

@@ -37,8 +37,8 @@ public class SmsCodeController extends BaseController {
     @ApiImplicitParams({@ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required = true, dataType = "String")})
     @PostMapping(value = "/sendSmsCode")
-    public Object sendLoginVerifyCode(String mobile, String type,String code) throws Exception {
-        smsCodeService.sendValidCode(mobile, type, ClientEnum.WEBSITE, code);
+    public Object sendLoginVerifyCode(String mobile, String type,String code,String client) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.WEBSITE, code,client);
         return succeed();
     }
 

+ 17 - 0
cooleshow-app/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,17 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 10.206.0.17:8848
+        namespace: 6f8374a9-598f-4889-bb17-476070ffb8de
+        group: DEFAULT_GROUP
+        prefix: app
+        file-extension: yaml
+        refresh:
+          enabled: true
+        enabled: true
+        shared-configs:
+          - data-id: base.yaml
+            refresh: true
+logging:
+  config: classpath:logback-dev.xml

+ 1 - 2
cooleshow-app/src/main/resources/bootstrap-prod.yml

@@ -7,9 +7,8 @@ spring:
         group: DEFAULT_GROUP
         prefix: app
         file-extension: yaml
-        refresh:
-          enabled: true
         enabled: true
         shared-configs:
           - data-id: base.yaml
             refresh: true
+        refresh-enabled: true

+ 36 - 0
cooleshow-app/src/main/resources/logback-dev.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/cooleshow-dev/jenkins/logs/app-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+			  class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+					class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.yonge" level="INFO" />
+	<root level="INFO">
+		<appender-ref ref="stdout" />
+		<appender-ref ref="file" />
+	</root>
+
+</configuration>

+ 1 - 2
cooleshow-app/src/main/resources/logback-spring.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/app-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 
@@ -13,7 +12,7 @@
 
 	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<FileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
 			<MaxHistory>90</MaxHistory>
 			<TimeBasedFileNamingAndTriggeringPolicy
 				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

+ 19 - 1
cooleshow-auth/auth-server/pom.xml

@@ -16,7 +16,25 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
-
+        <dependency>
+            <groupId>com.dayaedu.cbs.openfeign</groupId>
+            <artifactId>dayaedu-openfeign-client</artifactId>
+            <version>1.0.2</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>
         <dependency>
             <groupId>com.microsvc.toolkit.config</groupId>
             <artifactId>microsvc-config-jwt</artifactId>

+ 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 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/ResourceServerConfig.java

@@ -26,7 +26,9 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers(
+				.authorizeRequests()
+			.antMatchers("/open/**", "/*/open/**").permitAll()
+			.antMatchers(
 						"/task/**",
 				"/user/updatePassword",
 				"/user/noAuth/queryUserByPhone",

+ 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-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java

@@ -108,6 +108,25 @@ public class DefaultUserDetailsService implements UserDetailsService {
                 // 账号被锁定
                 throw new UsernameNotFoundException("MA:5005:" + openid);
             }
+        } else if ("WEBSITE".equals(clientId)) {
+            String loginUserType = WebUtil.getParameter("loginUserType").toUpperCase();
+            if (SysUserType.STUDENT.getCode().equals(loginUserType)) {
+                StudentApi data = adminFeignService.getStudent(sysUser.getId()).getData();
+                if (data == null) {
+                    throw new UsernameNotFoundException("账户不存在");
+                }
+                if (UserLockFlag.LOCKED.equals(data.getLockFlag())) {
+                    throw new LockedException("账户被锁定");
+                }
+            }else if(SysUserType.TEACHER.getCode().equals(loginUserType)) {
+                TeacherApi data = adminFeignService.getTeacher(sysUser.getId()).getData();
+                if (data == null) {
+                    throw new UsernameNotFoundException("账户不存在");
+                }
+                if (UserLockFlag.LOCKED.equals(data.getLockFlag())) {
+                    throw new LockedException("账户被锁定");
+                }
+            }
         }
 
         List<GrantedAuthority> authorities = null;

+ 34 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/ExceptionLogController.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.auth.web.controller;
+
+import com.dayaedu.cbs.common.enums.EAppKey;
+import com.dayaedu.cbs.openfeign.client.SysExceptionLogFeignClientService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.SysExceptionLogVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+public class ExceptionLogController extends BaseController {
+
+	@Resource
+	private SysExceptionLogFeignClientService sysExceptionLogFeignClientService;
+
+	@PostMapping("sysExceptionLog/save")
+	public HttpResponseResult save(@RequestBody List<SysExceptionLogVo.SysExceptionLog> sysExceptionLogVos) {
+		if(CollectionUtils.isEmpty(sysExceptionLogVos)){
+			return succeed();
+		}
+		sysExceptionLogVos.forEach(sysExceptionLogVo -> {
+			sysExceptionLogVo.setAppKey(EAppKey.KLX);
+		});
+		sysExceptionLogFeignClientService.add(sysExceptionLogVos).feignData();
+		return succeed();
+	}
+
+}

+ 25 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/OpenMutualTLSController.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.auth.web.controller;
+
+import com.microsvc.toolkit.common.response.template.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/open/mutualTLS")
+@Api(tags = "HTTPS双向认证")
+public class OpenMutualTLSController {
+
+    @ApiOperation(value = "HTTPS双向认证查询")
+    @GetMapping(value = "query")
+    public R<Boolean> queryByParamNameList() {
+        return R.from(true);
+    }
+
+}

+ 2 - 0
cooleshow-auth/auth-server/src/main/resources/bootstrap-pre.yml

@@ -9,3 +9,5 @@ spring:
         file-extension: yaml
         refresh-enabled: true
         enabled: true
+logging:
+  config: classpath:logback-spring.xml

+ 3 - 2
cooleshow-auth/auth-server/src/main/resources/bootstrap-prod.yml

@@ -7,6 +7,7 @@ spring:
         group: DEFAULT_GROUP
         prefix: auth
         file-extension: yaml
-        refresh:
-          enabled: true
+        refresh-enabled: true
         enabled: true
+logging:
+  config: classpath:logback-spring.xml

+ 1 - 1
cooleshow-auth/auth-server/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/auth-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/auth-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 36 - 0
cooleshow-auth/auth-server/src/main/resources/logback-test.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/cooleshow-test/jenkins/logs/auth-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.yonge" level="INFO" />
+	<root level="INFO">
+		<appender-ref ref="stdout" />
+		<appender-ref ref="file" />
+	</root>
+
+</configuration>

+ 1 - 1
cooleshow-bbs/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/bbs-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/bbs-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 0 - 15
cooleshow-cms/src/main/resources/bootstrap-dev.properties

@@ -1,15 +0,0 @@
-
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=10.206.0.17:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=6f8374a9-598f-4889-bb17-476070ffb8de
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=cms
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

+ 0 - 15
cooleshow-cms/src/main/resources/bootstrap-pre.properties

@@ -1,15 +0,0 @@
-
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=10.206.0.16:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=e456599c-bef6-453d-927f-0e4a321259ed
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=cms
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

+ 15 - 0
cooleshow-cms/src/main/resources/bootstrap-pre.yml

@@ -0,0 +1,15 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 10.206.0.16:8848
+        namespace: e456599c-bef6-453d-927f-0e4a321259ed
+        group: DEFAULT_GROUP
+        prefix: cms
+        file-extension: yaml
+        enabled: true
+        refresh-enabled: true
+        shared-configs:
+          - data-id: base.yaml
+          - data-id: base-pre.yaml
+            refresh: true

+ 0 - 15
cooleshow-cms/src/main/resources/bootstrap-prod.properties

@@ -1,15 +0,0 @@
-
-#\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=10.206.0.16:8848
-#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=dba505ee-020c-4c2b-bab2-e91d89cf248e
-#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
-spring.cloud.nacos.config.group=DEFAULT_GROUP
-#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=cms
-#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
-spring.cloud.nacos.config.file-extension=yaml
-#\u662f\u5426\u52a8\u6001\u5237\u65b0
-spring.cloud.nacos.config.refresh.enabled=true
-#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
-spring.cloud.nacos.config.enabled=true

+ 15 - 0
cooleshow-cms/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,15 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 10.206.0.16:8848
+        namespace: dba505ee-020c-4c2b-bab2-e91d89cf248e
+        group: DEFAULT_GROUP
+        prefix: cms
+        file-extension: yaml
+        enabled: true
+        refresh-enabled: true
+        shared-configs:
+          - data-id: base.yaml
+          - data-id: base-prod.yaml
+            refresh: true

+ 1 - 1
cooleshow-cms/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/cms-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/cms-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 10 - 11
cooleshow-common/src/main/java/com/yonge/cooleshow/common/service/impl/RedisIdGeneratorService.java

@@ -98,21 +98,20 @@ public class RedisIdGeneratorService implements IdGeneratorService {
 
 	@Override
 	public boolean verifyValidCode(String mobile, String authCode,String keyEnum) {
+
+		// 验证码验证
+		String key = "verificationCode" + keyEnum + mobile;
+		Object object = redisCache.get(key);
+		String verifyCode = object == null ? null : object.toString();
 		if (debugMode || this.authCode) {
-			if (defaultPwd.equals(authCode)) {
-				return true;
-			}
+            return defaultPwd.equals(authCode)
+                || (StringUtils.isNoneEmpty(verifyCode) && StringUtils.equalsIgnoreCase(verifyCode, authCode));
 		} else {
-			String key = "verificationCode" + keyEnum + mobile;
-			Object object = redisCache.get(key);
+
 			log.info("*********************mobile:{} smsCode:{} inutCode:{}******************", key, object, authCode);
-			String verifyCode = object == null ? null : object.toString();
-			if (StringUtils.isNoneEmpty(verifyCode) && StringUtils.equalsIgnoreCase(verifyCode, authCode)) {
-				return true;
-			}
+            return StringUtils.isNoneEmpty(verifyCode) && StringUtils.equalsIgnoreCase(verifyCode, authCode);
 		}
-		return false;
-	}
+    }
 
 
 

+ 1 - 1
cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/gateway-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/gateway-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 1 - 1
cooleshow-mall/mall-admin/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/mall-admin-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/mall-admin-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 1 - 1
cooleshow-mall/mall-portal/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/mall-portal-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/mall-portal-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 4 - 2
cooleshow-task/src/main/resources/bootstrap-prod.yml

@@ -7,7 +7,9 @@ spring:
         group: DEFAULT_GROUP
         prefix: task
         file-extension: yaml
-        refresh:
-          enabled: true
+        refresh-enabled: true
         enabled: true
+        shared-configs:
+          - data-id: base.yaml
+            refresh: true
 

+ 1 - 1
cooleshow-task/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/task-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/task-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

+ 17 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/AppVersionInfoController.java

@@ -6,6 +6,8 @@ import io.swagger.annotations.ApiOperation;
 
 import java.util.List;
 
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -39,10 +41,22 @@ public class AppVersionInfoController extends BaseController {
 	@ApiOperation("根据app客户端查询对象")
 	@ApiImplicitParam(name = "platform", value = "平台名称", required = true, dataType = "String", paramType = "path")
 	@GetMapping(value = "/queryByPlatform")
-	public HttpResponseResult<AppVersionInfo> queryByPlatform(String platform) {
+	public HttpResponseResult<AppVersionInfo> queryByPlatform(String platform,String localVersion) {
 		List<AppVersionInfo> list = appVersionInfoService.queryNewestByPlatform(platform);
-		if (list.size() > 0) {
-			return succeed(list.get(0));
+		if (CollectionUtils.isNotEmpty(list)) {
+			AppVersionInfo appVersionInfo = list.get(0);
+			//如果应用版本跨多个版本时若其中任何一个版本有强制更新,返回字段标记为强制更新
+			if(!appVersionInfo.getIsForceUpdate() && StringUtils.isNotEmpty(localVersion)){
+				//是否需要强制更新
+				AppVersionInfo forceUpdate = appVersionInfoService.checkForceUpdate(platform,localVersion);
+				if(forceUpdate != null){
+					appVersionInfo.setIsForceUpdate(true);
+				}
+			}
+			if (StringUtils.isEmpty(localVersion)) {
+				appVersionInfo.setIsForceUpdate(true);
+			}
+			return succeed(appVersionInfo);
 		}
 		return failed();
 	}

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

@@ -185,13 +185,6 @@ public class TenantAlbumController {
     @ApiOperation(value = "新增专辑", notes = "新增专辑")
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/save')")
     public HttpResponseResult<Boolean> save(@Validated @RequestBody TenantAlbumVo.TenantAlbum album) {
-        //判断当前机构是否已经绑定机构专辑
-        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
-                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
-                .list();
-        if (CollectionUtils.isNotEmpty(list)) {
-            throw new BizException("当前机构已有专辑");
-        }
 
         // 检查曲目重复
         if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
@@ -230,15 +223,6 @@ public class TenantAlbumController {
     @PreAuthorize("@pcs.hasPermissions('tenantAlbum/update')")
     public HttpResponseResult<Boolean> update( @RequestBody TenantAlbumVo.TenantAlbum album) {
 
-        //判断当前机构是否已经绑定机构专辑
-        List<TenantAlbumRef> list = tenantAlbumRefService.lambdaQuery()
-                .eq(TenantAlbumRef::getTenantId, album.getTenantId())
-                .ne(TenantAlbumRef::getTenantAlbumId, album.getId())
-                .list();
-        if (CollectionUtils.isNotEmpty(list)) {
-            throw new BizException("当前机构已有专辑");
-        }
-
         // 检查曲目重复
         if (CollectionUtils.isNotEmpty(album.getMusicSheetData())) {
             List<Long> musicIds = album.getMusicSheetData().stream().flatMap(o -> o.getMusicSheetList()

+ 10 - 10
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java

@@ -1,25 +1,19 @@
 package com.yonge.cooleshow.admin.io.request;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.math.BigDecimal;
-import java.util.List;
-
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 机构专辑
@@ -75,6 +69,12 @@ public class TenantAlbumVo {
         @ApiModelProperty("曲目相关信息")
         private List<MusicSheetData> musicSheetData = new ArrayList<>();
 
+        @ApiModelProperty("采购周期类型")
+        private String purchaseTypes;
+
+        @ApiModelProperty("专辑采购金额")
+        private String purchaseJson;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }

+ 1 - 1
cooleshow-user/user-admin/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mnt/datadisk/logs/admin-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="${LOG_HOME}/admin-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 

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

@@ -136,7 +136,6 @@
         <dependency>
             <groupId>com.microsvc.toolkit.middleware</groupId>
             <artifactId>microsvc-middleware-rtc</artifactId>
-            <version>1.0.0</version>
         </dependency>
 
 
@@ -145,6 +144,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.2</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/AppVersionInfoDao.java

@@ -26,4 +26,6 @@ public interface AppVersionInfoDao extends BaseDAO<Long, AppVersionInfo> {
 	AppVersionInfo selectAppVersionInfo(@Param("platform") String platform, @Param("version") String version);
 
 	List<AppVersionInfo> queryLatestByPlatform(@Param("platform") String platform, @Param("status") String status);
+
+    AppVersionInfo checkForceUpdate(@Param("platform") String platform, @Param("localVersion") String localVersion);
 }

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

@@ -61,4 +61,6 @@ public interface MusicTagDao extends BaseMapper<MusicTag> {
     List<CbsMusicSheetTagWrapper.MusicSheetTag> tagList(@Param("param") CbsMusicSheetTagWrapper.MusicSheetTagQuery queryInfo);
 
 	List<CbsMusicSheetCategoryWrapper.MusicSheetCategory> categoryList(@Param("param") CbsMusicSheetCategoryWrapper.MusicSheetCategoryQuery queryInfo);
+
+    List<MusicTag> getAll();
 }

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

@@ -66,4 +66,8 @@ public interface SubjectDao extends BaseDAO<Long, Subject> {
     Subject getByCbsId(@Param("subjectId") Integer subjectId);
 
     List<CbsSubjectApiWrapper.Subject> queryCbsList(@Param("query") CbsSubjectApiWrapper.SubjectQuery query);
+
+    List<Subject> getAll();
+
+    void updateCbsSubjectIdNull(@Param("subjectId") Long subjectId);
 }

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

@@ -101,4 +101,7 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 
 	//小程序首页订单详情
 	PaymentDivMemberRecordWrapper.OrderDetailDto getExpendOrderDetail(@Param("orderNo") String orderNo);
+
+    List<Long> getStudentTenantAlbumNum(@Param("userId") Long userId,
+                                        @Param("tenantGroupAlbumIds") List<Long> tenantGroupAlbumIds);
 }

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

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentMerchantConfig.java

@@ -143,6 +143,10 @@ public class PaymentMerchantConfig implements Serializable {
     @TableField(value = "alipay_content_sign_key_")
     private String aliPayContentSignKey;
 
+    @ApiModelProperty("支付渠道,三方渠道设置有效 alipay,wxpay")
+    @TableField(value = "pay_channel_")
+    private String payChannel;
+
     @ApiModelProperty("启用标识")
     @TableField(value = "status_")
     private Boolean status;

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
 
 import java.io.Serializable;
 import java.util.List;
 
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
 /**
  * 对应数据库表(subject):
  */
@@ -16,7 +18,7 @@ public class Subject implements Serializable {
 	private Long id;
 
 	private Integer cbsSubjectId;
-	
+
 	/**  */
 	@ApiModelProperty(value = "声部名称",required = false)
 	private String name;
@@ -44,7 +46,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;
@@ -52,4 +60,5 @@ public class Subject implements Serializable {
 	/**  */
 	@ApiModelProperty(value = "子节点列表",required = false)
 	private List<Subject> subjects;
+
 }

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

@@ -23,10 +23,9 @@ import java.math.BigDecimal;
 @TableName("tenant_album")
 public class TenantAlbum implements Serializable {
 
-    @ApiModelProperty("主键ID") 
-
+    @ApiModelProperty("主键ID")
     @TableId(value = "id_", type = IdType.AUTO)
-	    private Long id;
+    private Long id;
 
     @ApiModelProperty("专辑名称") 
 	@TableField(value = "name_")
@@ -88,4 +87,15 @@ public class TenantAlbum implements Serializable {
     @TableField(value = "category_level_id_")
     private Long categoryLevelId;
 
+
+    @ApiModelProperty("采购周期类型")
+    @TableField(value = "purchase_types_")
+    private String purchaseTypes;
+
+
+
+    @ApiModelProperty("采购金额数据")
+    @TableField(value = "purchase_json_")
+    private String purchaseJson;
+
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbumPurchase.java

@@ -77,4 +77,9 @@ public class TenantAlbumPurchase implements Serializable {
 	@TableField(value = "create_time_")
     private Date createTime;
 
+
+    @ApiModelProperty("采购周期类型")
+    @TableField(value = "purchase_type_")
+    private String purchaseType;
+
 }

+ 86 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantGroupAlbum.java

@@ -0,0 +1,86 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 机构小组专辑配置表
+ * 2024-01-24 13:32:00
+ */
+@Data
+@ApiModel(" TenantGroupAlbum-机构小组专辑配置表")
+@TableName("tenant_group_album")
+public class TenantGroupAlbum implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("机构小组ID") 
+	@TableField(value = "tenant_group_id_")
+    private Long tenantGroupId;
+
+    @ApiModelProperty("专辑ID") 
+	@TableField(value = "tenant_album_id_")
+    private Long tenantAlbumId;
+
+    @ApiModelProperty("状态") 
+	@TableField(value = "status_")
+    private Boolean status;
+
+    @ApiModelProperty("采购数量") 
+	@TableField(value = "purchase_num_")
+    private Integer purchaseNum;
+
+    @ApiModelProperty("采购周期") 
+	@TableField(value = "purchase_period_")
+    private String purchasePeriod;
+
+    @ApiModelProperty("原价") 
+	@TableField(value = "original_price_")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty("售价") 
+	@TableField(value = "actual_price_")
+    private BigDecimal actualPrice;
+
+    @ApiModelProperty("购买次数限制") 
+	@TableField(value = "buy_times_flag_")
+    private Boolean buyTimesFlag;
+
+    @ApiModelProperty("购买次数") 
+	@TableField(value = "buy_times_")
+    private Integer buyTimes;
+
+    @ApiModelProperty("是否删除") 
+	@TableField(value = "del_flag_")
+    private Boolean delFlag;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("创建人") 
+	@TableField(value = "create_by_")
+    private Long createBy;
+
+    @ApiModelProperty("更新人") 
+	@TableField(value = "update_by_")
+    private Long updateBy;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -90,4 +90,9 @@ public class UserOrderDetail implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
+
+    @ApiModelProperty("学生购买机构专辑时的小组ID")
+    @TableField(value = "tenant_group_album_id_")
+    private Long tenantGroupAlbumId;
+
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PeriodEnum.java

@@ -7,6 +7,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
  * 周期
  */
 public enum PeriodEnum implements BaseEnum<String, PeriodEnum> {
+    // DAY 日 MONTH 月 QUARTERLY 季度 YEAR_HALF 半年 YEAR 年
 	DAY("日"),
 	MONTH("月"),
 	QUARTERLY("季度"),

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

+ 8 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMusicMapper.java

@@ -22,7 +22,7 @@ public interface TenantAlbumMusicMapper extends BaseMapper<TenantAlbumMusic> {
 	 * @param param TenantAlbumMusicWrapper.TenantAlbumMusicQuery
 	 * @return List<TenantAlbumMusicWrapper.TenantAlbumMusic>
 	 */
-	List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(@Param("page") IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page, @Param("param") TenantAlbumMusicWrapper.StudentMusicSheetQuery param);
+	List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(@Param("page") IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page, @Param("param") TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery param);
 
 	List<Long> selectMusicSheetIds(@Param("albumId") String albumId, @Param("subjectType") String s, @Param("type") String type, @Param("level") String level);
 
@@ -32,4 +32,11 @@ public interface TenantAlbumMusicMapper extends BaseMapper<TenantAlbumMusic> {
      * @param tenantId 机构ID
      */
     List<Long> selectMusicIdsByTenantIds(@Param("tenantId") Long tenantId);
+
+    /**
+     * 获取专辑可使用的曲目
+     */
+    List<TenantAlbumMusic> getByAlbumAndEnable(@Param("tenantAlbumIds") List<Long> tenantAlbumIds);
+
+    List<TenantAlbumMusic> getList(@Param("param") TenantAlbumMusicWrapper.TenantAlbumMusicSelect query, @Param("albumIds") List<Long> albumIds);
 }

+ 32 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantGroupAlbumMapper.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+
+/**
+ * 机构小组专辑配置表
+ * 2024-01-24 13:32:00
+ */
+@Repository
+public interface TenantGroupAlbumMapper extends BaseMapper<TenantGroupAlbum> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<TenantGroupAlbumWrapper.TenantGroupAlbum>
+	 * @param param TenantGroupAlbumWrapper.TenantGroupAlbumQuery
+	 * @return List<TenantGroupAlbumWrapper.TenantGroupAlbum>
+	 */
+	List<TenantGroupAlbumWrapper.TenantGroupAlbumVo> selectPage(@Param("page") IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> page, @Param("param") TenantGroupAlbumWrapper.TenantGroupAlbumQuery param);
+
+
+    List<TenantGroupAlbumWrapper.BuyTenantAlbum> getBuyAlbumInfo(@Param("param") TenantGroupAlbumWrapper.BuyTenantAlbumQuery query);
+
+	List<TenantGroupAlbumWrapper.TenantGroupAlbumCount> countGroupAlbumByGroupId(@Param("ids") String ids);
+}

+ 5 - 1
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;
@@ -34,7 +36,9 @@ public interface UserTenantAlbumRecordMapper extends BaseMapper<UserTenantAlbumR
 
     List<TenantAlbum> selectTenantAlbumInfo(@Param("tenantIds") List<Long> tenantIds);
 
-    Long ifBuy(@Param("tenantAlbumId") Long tenantAlbumId, @Param("studentId") Long studentId);
+    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 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AppVersionInfoService.java

@@ -33,4 +33,6 @@ public interface AppVersionInfoService extends BaseService<Long, AppVersionInfo>
 	YesOrNoEnum getAppAuditVersion(String platform, String version);
 
     List<AppVersionInfo> queryLatestByPlatform(String platform, String appStatus);
+
+    AppVersionInfo checkForceUpdate(String platform, String localVersion);
 }

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

@@ -232,5 +232,12 @@ public interface LiveRoomService extends IService<LiveRoom> {
     void closeLive(String roomUid, Long speakerId, String sequence);
 
     void startLive(String roomUid, Integer speakerId, String sequence);
+
+    /**
+     * 只修改状态,不关闭三方直播
+     *
+     * @param room 直播间
+     */
+    void closeRoom(LiveRoom room);
 }
 

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

@@ -89,6 +89,16 @@ public interface MusicSheetService extends IService<MusicSheet> {
      */
     MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType);
 
+
+    /**
+     * 查询详情
+     *
+     * @param id 曲谱id
+     * @param sysUser 登录用户
+     * @return 曲谱信息
+     */
+    MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType,String tenantAlbumId);
+
     /**
      * 学生端 曲目分页查询
      *

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

@@ -9,6 +9,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;
 
 /**
  * 音乐标签表 服务类
@@ -85,4 +86,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/SmsCodeService.java

@@ -18,4 +18,6 @@ public interface SmsCodeService {
 	 * @return
 	 */
 	boolean sendValidCode(String mobile, String type, ClientEnum platform, String code) throws Exception;
+
+    boolean sendValidCode(String mobile, String type, ClientEnum platform, String code, String client);
 }

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

@@ -56,4 +56,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();
 }

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

@@ -64,6 +64,14 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	public boolean sendSecurityCode(MessageSender messageSender, Long userId, MessageTypeEnum messageType, String receiver, String platform);
 
 	/**
+	 * 发送验证码
+	 * @param messageType 消息类型
+	 * @param receiver 消息接受者
+	 * @return 验证码
+	 */
+	String sendSecurityCode(MessageTypeEnum messageType, String receiver);
+
+	/**
 	 * 获取已经发送的验证码
 	 * @param type
 	 * @param mobileNOOrEmailAddr

+ 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 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumService.java

@@ -79,6 +79,8 @@ public interface TenantAlbumService extends IService<TenantAlbum>  {
      */
     List<TenantAlbum> getByTenantId(Long tenantId,Boolean status);
 
+    void updateStatus(Long id, Boolean status);
+
 
     /**
      * 添加机构专辑数据

+ 54 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantGroupAlbumService.java

@@ -0,0 +1,54 @@
+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.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+
+import java.util.List;
+
+/**
+ * 机构小组专辑配置表
+ * 2024-01-24 13:32:00
+ */
+public interface TenantGroupAlbumService extends IService<TenantGroupAlbum>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantGroupAlbum
+     */
+	TenantGroupAlbum detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantGroupAlbum>
+     * @param query TenantGroupAlbumWrapper.TenantGroupAlbumQuery
+     * @return IPage<TenantGroupAlbum>
+     */
+    IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> selectPage(IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> page, TenantGroupAlbumWrapper.TenantGroupAlbumQuery query);
+	
+    /**
+     * 添加
+     * @param tenantGroupAlbum TenantGroupAlbumWrapper.TenantGroupAlbum
+     * @return Boolean
+     */
+     Boolean add(TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum);   
+
+    /**
+     * 更新
+     * @param tenantGroupAlbum TenantGroupAlbumWrapper.TenantGroupAlbum
+     * @return Boolean
+     */
+     Boolean update(TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum);
+
+    /**
+     * 可购买机构信息
+     *
+     */
+    List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(TenantGroupAlbumWrapper.BuyTenantAlbumQuery query);
+
+    void updateStatus(TenantGroupAlbumWrapper.UpdateStatus updateStatus);
+
+}

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

@@ -56,7 +56,7 @@ public interface UserMusicService extends IService<UserMusic>  {
      * 保存草稿/发布作品
      *
      */
-    void save(UserMusicWrapper.AddUserMusic userMusic);
+    Long save(UserMusicWrapper.AddUserMusic userMusic);
 
     /**
      * 分页

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.common.response.ParamResponse;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
@@ -73,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);
 
     /**
@@ -81,4 +84,6 @@ public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRe
     void sendTenantAlbumMessage();
 
     UserTenantAlbumRecord getNewestByTenantAlbumId(Long tenantAlbumId, Long userId, ClientEnum client);
+
+    List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> list(UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query);
 }

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

@@ -78,4 +78,9 @@ public class AppVersionInfoServiceImpl extends BaseServiceImpl<Long, AppVersionI
     public List<AppVersionInfo> queryLatestByPlatform(String platform, String appStatus) {
 		return appVersionInfoDao.queryLatestByPlatform(platform, appStatus);
 	}
+
+    @Override
+    public AppVersionInfo checkForceUpdate(String platform, String localVersion) {
+        return appVersionInfoDao.checkForceUpdate(platform, localVersion);
+    }
 }

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

@@ -49,6 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSONObject;
@@ -698,65 +699,30 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             return;
         }
 
-        CourseSchedule schedule = getCourseScheduleByRoomUid(room.getRoomUid());
-        //直播课
-        if (room.getType().equals(RoomTypeEnum.LIVE.getCode())) {
-            //查询老师分润表
-            List<CourseScheduleTeacherSalary> salaryList = courseScheduleTeacherSalaryService.list(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
-                    .eq(CourseScheduleTeacherSalary::getCourseScheduleId,schedule.getId())
-            );
-            if (!CollectionUtils.isEmpty(salaryList)) {
-                salaryList.forEach(salary -> {
-                    //修改教师课酬状态-已结算
-                    salary.setStatus(TeacherSalaryEnum.WAIT.getCode());
-                    courseScheduleTeacherSalaryService.updateById(salary);
-                });
-            }
-        }
-        //修改房间状态
-        room.setLiveState(2);
-        room.setRoomState(2);
-        this.updateById(room);
-
-        String speakerIdStr = room.getSpeakerId().toString();
-        String roomUid = room.getRoomUid();
-
-        //关闭直播间发送消息
-        ImRoomMessage message = new ImRoomMessage();
-        message.setFromUserId(speakerIdStr);
-        message.setToChatroomId(roomUid);
-        message.setClientType(ClientEnum.TEACHER.getCode());
-        message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
-        message.setContent(speakerIdStr);
-        try {
-            this.publishRoomMessage(message);
-            log.info("destroyLiveRoom>>>> FORCED_OFFLINE : {}", speakerIdStr);
-        } catch (Exception e) {
-            log.error("destroyLiveRoom>>>>  FORCED_OFFLINE {}", e.getMessage());
-        }
-
-        Date now = new Date();
-        //给老师签退
-        teacherAttendanceService.update(Wrappers.<TeacherAttendance>lambdaUpdate()
-                .eq(TeacherAttendance::getTeacherId, room.getSpeakerId())
-                .eq(TeacherAttendance::getCourseScheduleId, schedule.getId())
-                .set(TeacherAttendance::getSignOutTime, now));
-        //获取在线人员信息
-        RMap<Long, String> onlineUserCache = this.getOnlineUserCache(roomUid);
-        onlineUserCache.forEach((id, s) -> {
-            //观看者签退
-            studentAttendanceService.update(Wrappers.<StudentAttendance>lambdaUpdate()
-                    .eq(StudentAttendance::getStudentId, id)
-                    .eq(StudentAttendance::getCourseScheduleId,schedule.getId())
-                    .set(StudentAttendance::getSignOutTime, now));
-        });
-
+        liveRoomService.closeRoom(room);
 
         //获取所有直播间缓存数据并写入数据库后并清理缓存
         CompletableFuture.runAsync(() -> insertAndCleanLiveData(room.getRoomUid(), room.getSpeakerId()));
         log.info("roomDestroy>>>> insertAndCleanLiveData {}", JSONObject.toJSONString(room));
 
+        String speakerIdStr = room.getSpeakerId().toString();
+        String roomUid = room.getRoomUid();
         try {
+
+            //关闭直播间发送消息
+            ImRoomMessage message = new ImRoomMessage();
+            message.setFromUserId(speakerIdStr);
+            message.setToChatroomId(roomUid);
+            message.setClientType(ClientEnum.TEACHER.getCode());
+            message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
+            message.setContent(speakerIdStr);
+            try {
+                this.publishRoomMessage(message);
+                log.info("destroyLiveRoom>>>> FORCED_OFFLINE : {}", speakerIdStr);
+            } catch (Exception e) {
+                log.error("destroyLiveRoom>>>>  FORCED_OFFLINE {}", e.getMessage());
+            }
+
             LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
 
             //销毁直播间
@@ -789,6 +755,46 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         }
     }
 
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+    public void closeRoom(LiveRoom room) {
+        CourseSchedule schedule = getCourseScheduleByRoomUid(room.getRoomUid());
+        //直播课
+        if (room.getType().equals(RoomTypeEnum.LIVE.getCode())) {
+            //查询老师分润表
+            List<CourseScheduleTeacherSalary> salaryList = courseScheduleTeacherSalaryService.list(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
+                    .eq(CourseScheduleTeacherSalary::getCourseScheduleId,schedule.getId())
+            );
+            if (!CollectionUtils.isEmpty(salaryList)) {
+                for (CourseScheduleTeacherSalary salary : salaryList) {//修改教师课酬状态-已结算
+                    salary.setStatus(TeacherSalaryEnum.WAIT.getCode());
+                    courseScheduleTeacherSalaryService.updateById(salary);
+                }
+            }
+        }
+        //修改房间状态
+        room.setLiveState(2);
+        room.setRoomState(2);
+        this.updateById(room);
+
+
+        Date now = new Date();
+        //给老师签退
+        teacherAttendanceService.update(Wrappers.<TeacherAttendance>lambdaUpdate()
+                .eq(TeacherAttendance::getTeacherId, room.getSpeakerId())
+                .eq(TeacherAttendance::getCourseScheduleId, schedule.getId())
+                .set(TeacherAttendance::getSignOutTime, now));
+        //获取在线人员信息
+        RMap<Long, String> onlineUserCache = this.getOnlineUserCache(room.getRoomUid());
+        onlineUserCache.forEach((id, s) -> {
+            //观看者签退
+            studentAttendanceService.update(Wrappers.<StudentAttendance>lambdaUpdate()
+                    .eq(StudentAttendance::getStudentId, id)
+                    .eq(StudentAttendance::getCourseScheduleId,schedule.getId())
+                    .set(StudentAttendance::getSignOutTime, now));
+        });
+    }
+
     /**
      * <p>主讲人处理进入和退出房间数据
      * <p>观看者只处理退出房间数据

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

@@ -485,6 +485,8 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
                 album.setTenantAlbumStatus(0);
                 return album;
             }
+
+            //TODO
             TenantAlbumMusic tenantAlbumMusic = tenantAlbumMusicList.get(0);
             tenantAlbumId = tenantAlbumMusic.getTenantAlbumId();
         } else {
@@ -506,7 +508,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
             return album;
         }
         album.setTenantAlbumStatus(2);
-
+        //TODO
         TenantAlbum tenantAlbum = list.get(0);
         //机构专辑名称
         String name = tenantAlbum.getName();
@@ -607,6 +609,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (CollectionUtils.isEmpty(list)){
             throw new BizException("机构专辑不存在");
         }
+        //TODO
         TenantAlbum tenantAlbum = list.get(0);
         //机构专辑名称
         String name = tenantAlbum.getName();

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

@@ -13,6 +13,7 @@ import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 import com.dayaedu.cbs.openfeign.wrapper.music.CbsSubjectApiWrapper;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.template.R;
+import com.beust.jcommander.internal.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao;
@@ -64,6 +65,8 @@ import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+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.service.cbs.CbsMusicScoreService;
@@ -71,6 +74,7 @@ import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -212,6 +216,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Autowired
     private CbsMusicScoreService cbsMusicScoreService;
 
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
+
+    @Autowired
+    private TenantAlbumMusicMapper tenantAlbumMusicMapper;
+
     public MusicSheetDao getDao() {
         return musicSheetDao;
     }
@@ -226,8 +236,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         //musicSheet.setState(YesOrNoEnum.NO);
         this.saveOrUpdate(musicSheet);
 
-        if (StringUtil.isEmpty(musicSheet.getMusicSubject())
-                && musicSheet.getMusicSheetType().equals(MusicSheetTypeEnum.CONCERT)) {
+        if (musicSheet.getMusicSheetType() !=null && MusicSheetTypeEnum.CONCERT.equals(musicSheet.getMusicSheetType())) {
             this.lambdaUpdate()
                     .eq(MusicSheet::getId, musicSheet.getId())
                     .set(MusicSheet::getMusicSubject,"")
@@ -494,7 +503,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     @Override
     public MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType) {
-        MusicSheetDetailVo detail = this.getCbsDetail(id);
+        return detail(id, sysUser, userType,null);
+    }
+
+    @Override
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType,String tenantAlbumId) {
+
+        MusicSheetDetailVo detail = baseMapper.detail(id);
+        if (detail == null) {
+            throw new BizException("未找到曲目信息");
+        }
 
         // 设置收藏人数
         detail.setFavoriteCount(detail.getFavoriteCount() + detail.getVirtualNumber());
@@ -525,18 +543,46 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             String reason = musicSheetAuthRecordService.selectAuditReason(id);
             detail.setReason(reason);
         }
-        if (detail.getPaymentType().contains(ChargeTypeEnum.FREE.getCode())) {
-            detail.setPlay(YesOrNoEnum.YES);
-        } else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
-                || ClientEnum.TEACHER.getCode().equals(userType.getCode())) {
-            // 2022 7 20  老师也能购买曲目
-            if (ClientEnum.TEACHER.getCode().equals(userType.getCode()) && detail.getUserId().equals(sysUser.getId())) {
+        if (StringUtil.isEmpty(tenantAlbumId)) {
+            if (detail.getPaymentType().contains(ChargeTypeEnum.FREE.getCode())) {
                 detail.setPlay(YesOrNoEnum.YES);
+            } else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
+                || ClientEnum.TEACHER.getCode().equals(userType.getCode())) {
+                // 2022 7 20  老师也能购买曲目
+                if (ClientEnum.TEACHER.getCode().equals(userType.getCode()) && detail.getUserId().equals(sysUser.getId())) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                } else {
+                    setMusicSheetPlay(sysUser.getId(), detail, userType);
+                }
             } else {
-                setMusicSheetPlay(sysUser.getId(), detail, userType);
+                detail.setPlay(YesOrNoEnum.YES);
             }
         } else {
-            detail.setPlay(YesOrNoEnum.YES);
+            // 机构专辑购买
+            detail.setPlay(YesOrNoEnum.NO);
+            List<Long> collected = Arrays.stream(tenantAlbumId.split(",")).map(Long::parseLong).collect(Collectors.toList());
+
+            // 学生生效中的机构专辑
+            if (ClientEnum.STUDENT == userType) {
+                List<Long> tenantAlbumIds = userTenantAlbumRecordMapper.selectTenantIds(sysUser.getId());
+                if (CollectionUtils.isNotEmpty(tenantAlbumIds)) {
+                    // tenantAlbumIds collected 取交集到 新的集合
+                    List<Long> collect = tenantAlbumIds.stream().filter(collected::contains).collect(Collectors.toList());
+                    List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByIds(collect);
+                    if (CollectionUtils.isNotEmpty(musicSheetIds) && musicSheetIds.contains(detail.getId())) {
+                        detail.setPlay(YesOrNoEnum.YES);
+                    }
+                }
+            } else if (ClientEnum.TEACHER == userType) {
+                // 老师所在机构启用的专辑
+                Teacher teacher = teacherService.getById(sysUser.getId());
+                if (teacher.getTenantId() !=null) {
+                    List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByTenantIds(teacher.getTenantId());
+                    if (musicSheetIds.contains(detail.getId())) {
+                        detail.setPlay(YesOrNoEnum.YES);
+                    }
+                }
+            }
         }
 
 
@@ -1135,8 +1181,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             //musicSheet.setState(YesOrNoEnum.NO);
             this.saveOrUpdate(musicSheet);
 
-            if (StringUtil.isEmpty(musicSheet.getMusicSubject())
-                    && musicSheet.getMusicSheetType().equals(MusicSheetTypeEnum.CONCERT)) {
+            if (musicSheet.getMusicSheetType() !=null && MusicSheetTypeEnum.CONCERT.equals(musicSheet.getMusicSheetType())) {
                 this.lambdaUpdate()
                         .eq(MusicSheet::getId, musicSheet.getId())
                         .set(MusicSheet::getMusicSubject,"")
@@ -2061,26 +2106,30 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         if (student == null) {
             throw new BizException("学生不存在");
         }
-        if (student.getTenantId() == null || student.getTenantId() == -1) {
-            throw new BizException("学生未绑定机构");
+        if (student.getTenantId() == null || student.getTenantId() == -1 || student.getTenantGroupId() == null) {
+            return searchData;
         }
-        // 查询机构下的专辑
-        List<TenantAlbum> albumList = tenantAlbumService.getByTenantId(student.getTenantId(), true);
-        List<Long> albumIds = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(albumList)) {
-            albumIds = albumList.stream().map(TenantAlbum::getId).distinct().collect(Collectors.toList());
+        // 查询机构 小组下的专辑
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantGroupId(student.getTenantGroupId());
+
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo = tenantGroupAlbumMapper.getBuyAlbumInfo(query);
+        List<Long> albumIds;
+        if (CollectionUtils.isNotEmpty(buyAlbumInfo)) {
+            albumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getId).distinct().collect(Collectors.toList());
         } else {
             return searchData;
         }
 
-//        List<UserTenantAlbumRecord> recordList = userTenantAlbumRecordService
-//                .getNewestByTenantIdAndUserId(student.getTenantId(), queryInfo.getUserId(), ClientEnum.STUDENT, albumIds);
-//
-//        if (CollectionUtils.isNotEmpty(recordList)) {
-//            albumIds = recordList.stream().map(UserTenantAlbumRecord::getTenantAlbumId).distinct().collect(Collectors.toList());
-//        } else {
-//            return searchData;
-//        }
+        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())));
+
         queryInfo.setTenantAlbumIds(albumIds);
 
         // 查询曲目列表
@@ -2100,8 +2149,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     musicName.setType("MUSIC");
                     musicName.setHotFlag(record.getHotFlag() != null?record.getHotFlag():YesOrNoEnum.NO);
                     musicName.setSort(Optional.ofNullable(record.getFavoriteCount()).orElse(0));
+                    musicName.setTenantAlbumId(Optional.ofNullable(map.get(record.getId())).orElse(new ArrayList<>()).stream().map(String::valueOf).collect(Collectors.joining(",")));
                     musicNames.add(musicName);
+                    record.setTenantAlbumId(Optional.ofNullable(map.get(record.getId())).orElse(new ArrayList<>()).stream().map(String::valueOf).collect(Collectors.joining(",")));
+
                 }
+                musicSheetVoIPage.setRecords(records);
                 searchData.setMusic(PageUtil.pageInfo(musicSheetVoIPage));
             }
 

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

@@ -247,5 +247,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));
+    }
+
 
 }

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

@@ -244,7 +244,6 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 老师收入
         Map<Long, BigDecimal> bizMap = new HashMap<>();
 
-        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
         // 计算商品分账数据
         if (userPaymentOrder.getOrderClient().equals(ClientEnum.STUDENT)) {
 
@@ -253,12 +252,15 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
                     .parseObject(userPaymentOrder.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
 
 
-            BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice())
-                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple())).setScale(2, RoundingMode.HALF_UP);
+//            BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice())
+//                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple())).setScale(2, RoundingMode.HALF_UP);
+
+            tenantdivMap.merge(tenantAlbumContent.getTenantId(), userPaymentOrder.getActualPrice(), BigDecimal::add);
+            tenantdivMap.put(-1L, BigDecimal.ZERO);
 
-            tenantdivMap.merge(tenantAlbumContent.getTenantId(), tenantAmount, BigDecimal::add);
-            tenantdivMap.merge(-1L, tenantAmount, BigDecimal::subtract);
+        } else {
 
+            tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
         }
 
         // 计算老师分润数据  平台的真实收益

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

@@ -62,6 +62,8 @@ public class PaymentMerchantConfigServiceImpl extends ServiceImpl<PaymentMerchan
                 adapayPayConfig.setKeyPrivate(config.getRsaPrivateKey());
                 adapayPayConfig.setWxAppId(config.getWxAppId());
                 adapayPayConfig.setWxAppSecret(config.getWxAppSecret());
+                adapayPayConfig.setMiniAppId(config.getMiniAppId());
+                adapayPayConfig.setMiniAppSecret(config.getMiniAppSerret());
                 adapayPayConfig.setSupportCreditCards(properties.getSupportCreditCards());
                 try {
                     AdapayPaymentServicePlugin plugin = new AdapayPaymentServicePlugin(config.getPaymentVendor(), adapayPayConfig, false);

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików