Ver Fonte

Merge remote-tracking branch 'origin/online' into online

zouxuan há 1 ano atrás
pai
commit
4d619f04d1
74 ficheiros alterados com 2373 adições e 465 exclusões
  1. 33 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  2. 1 21
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  3. 110 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantGroupAlbumController.java
  4. 6 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java
  5. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  6. 0 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java
  7. 10 5
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java
  8. 47 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantGroupAlbumController.java
  9. 5 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  10. 42 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java
  11. 1 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java
  12. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  13. 278 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumController.java
  14. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumSheetController.java
  15. 46 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java
  16. 34 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  17. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java
  18. 46 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantGroupAlbumController.java
  19. 4 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java
  20. 15 18
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java
  21. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java
  22. 36 0
      cooleshow-auth/auth-server/src/main/resources/logback-test.xml
  23. 10 11
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/service/impl/RedisIdGeneratorService.java
  24. 0 16
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  25. 10 10
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java
  26. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  27. 13 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbum.java
  28. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbumPurchase.java
  29. 86 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantGroupAlbum.java
  30. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  31. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PeriodEnum.java
  32. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMusicMapper.java
  33. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantGroupAlbumMapper.java
  34. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  35. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  36. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java
  37. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumService.java
  38. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantGroupAlbumService.java
  39. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  40. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  41. 72 48
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  42. 7 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  43. 23 24
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  44. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  45. 16 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  46. 64 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  47. 62 79
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java
  48. 123 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  49. 199 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupAlbumServiceImpl.java
  50. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupServiceImpl.java
  51. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  52. 200 35
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  53. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java
  54. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  55. 55 99
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java
  56. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumPurchaseWrapper.java
  57. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  58. 290 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupAlbumWrapper.java
  59. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupWrapper.java
  60. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  61. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java
  62. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/music/MusicCompareWrapper.java
  63. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  64. 5 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml
  65. 32 17
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml
  66. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml
  67. 110 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantGroupAlbumMapper.xml
  68. 7 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantGroupMapper.xml
  69. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  70. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  71. 5 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  72. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java
  73. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumSheetController.java
  74. 1 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java

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

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

@@ -180,7 +180,6 @@ public class TenantAlbumController {
                 }
 
             });
-            tenantAlbumSheets =tenantAlbumSheets.stream().filter(o -> o.getMusicSheetName() != null).collect(Collectors.toList());
 
 
             sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
@@ -199,13 +198,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())) {
@@ -244,15 +236,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()
@@ -289,10 +272,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();
     }
 

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

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

+ 10 - 5
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/TenantAlbumSheetController.java

@@ -4,17 +4,21 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 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.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.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -39,6 +43,9 @@ public class TenantAlbumSheetController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentService studentService;
+
     @ApiOperation(value = "查询条件")
     @PostMapping("/selectCondition")
     public HttpResponseResult<TenantAlbumMusicWrapper.TenantAlbumMusicSelectData> selectCondition(@RequestBody TenantAlbumMusicWrapper.TenantAlbumMusicSelect query) {
@@ -58,16 +65,14 @@ 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);
         IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page = tenantAlbumMusicService.selectPage(QueryInfo.getPage(query), query);
         return succeed((PageUtil.pageInfo(page)));
     }
-
-
 }

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

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.student.controller;
+
+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 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.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) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+    
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId,user.getId(), ClientEnum.STUDENT));
+	}
+}

+ 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

@@ -75,13 +75,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();
+    }
+
+}

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

@@ -17,6 +17,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -48,14 +49,14 @@ 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, "请登录");
         }
 
         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)));

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

@@ -0,0 +1,46 @@
+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, "请登录");
+        }
+    
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId,user.getId(), ClientEnum.TEACHER));
+	}
+}

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

+ 3 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -58,12 +59,12 @@ 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)));

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

@@ -0,0 +1,46 @@
+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, "请登录");
+        }
+    
+		return HttpResponseResult.succeed(tenantGroupAlbumService.buyAlbumInfo(tenantGroupAlbumId, user.getId(), ClientEnum.TENANT));
+	}
+}

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

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

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

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

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

+ 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("季度"),

+ 6 - 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,9 @@ public interface TenantAlbumMusicMapper extends BaseMapper<TenantAlbumMusic> {
      * @param tenantId 机构ID
      */
     List<Long> selectMusicIdsByTenantIds(@Param("tenantId") Long tenantId);
+
+    /**
+     * 获取专辑可使用的曲目
+     */
+    List<TenantAlbumMusic> getByAlbumAndEnable(@Param("tenantAlbumIds") List<Long> tenantAlbumIds);
 }

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

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

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

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

@@ -85,6 +85,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);
+
     /**
      * 学生端 曲目分页查询
      *

+ 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

+ 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);
+
 
     /**
      * 添加机构专辑数据

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

@@ -0,0 +1,56 @@
+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);
+
+    /**
+     * 可购买机构信息
+     *
+     * @param tenantGroupAlbumId
+     * @param userId             用户ID
+     * @param clientType         客户端类型
+     */
+    List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(Long tenantGroupAlbumId, Long userId, ClientEnum clientType);
+
+    void updateStatus(TenantGroupAlbumWrapper.UpdateStatus updateStatus);
+}

+ 3 - 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;
@@ -81,4 +82,6 @@ public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRe
     void sendTenantAlbumMessage();
 
     UserTenantAlbumRecord getNewestByTenantAlbumId(Long tenantAlbumId, Long userId, ClientEnum client);
+
+    List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> list(UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query);
 }

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

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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;
@@ -56,12 +57,15 @@ 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.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;
@@ -205,6 +209,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
+
+    @Autowired
+    private TenantAlbumMusicMapper tenantAlbumMusicMapper;
+
     public MusicSheetDao getDao() {
         return musicSheetDao;
     }
@@ -397,8 +407,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         return musicSheetShareVo;
     }
 
+
     @Override
     public MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType) {
+        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("未找到曲目信息");
@@ -433,18 +450,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);
+                    }
+                }
+            }
         }
 
 
@@ -534,31 +579,6 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             }
         }
 
-        // 机构专辑购买
-
-        // 学生生效中的机构专辑
-        if (ClientEnum.STUDENT == userType) {
-            List<Long> tenantAlbumIds = userTenantAlbumRecordMapper.selectTenantIds(studentId);
-            if (CollectionUtils.isNotEmpty(tenantAlbumIds)) {
-                List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByIds(tenantAlbumIds);
-                if (musicSheetIds.contains(detail.getId())) {
-                    detail.setPlay(YesOrNoEnum.YES);
-                    return;
-                }
-            }
-        } else if (ClientEnum.TEACHER == userType) {
-            // 老师所在机构启用的专辑
-            Teacher teacher = teacherService.getById(studentId);
-            if (teacher.getTenantId() !=null) {
-                List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByTenantIds(teacher.getTenantId());
-                if (musicSheetIds.contains(detail.getId())) {
-                    detail.setPlay(YesOrNoEnum.YES);
-                    return;
-                }
-            }
-        }
-
-
     }
 
     @Override
@@ -1898,26 +1918,26 @@ 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);
+        // 根据曲目ID分组
+        Map<Long, List<Long>> map = list.stream()
+            .collect(Collectors.groupingBy(TenantAlbumMusic::getMusicSheetId, Collectors.mapping(TenantAlbumMusic::getTenantAlbumId, Collectors.toList())));
+
         queryInfo.setTenantAlbumIds(albumIds);
 
         // 查询曲目列表
@@ -1937,8 +1957,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));
             }
 

+ 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);
         }
 
         // 计算老师分润数据  平台的真实收益

+ 23 - 24
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -24,6 +24,7 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumRefMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -128,6 +129,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
     @Autowired
     private UserTenantBindRecordMapper userTenantBindRecordMapper;
+
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -193,36 +197,31 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         TenantInfo tenantInfo = tenantInfoService.detail(detail.getTenantId());
         if (tenantInfo != null) {
             studentHomeVo.setTenantName(tenantInfo.getName());
-            QueryWrapper<TenantAlbumRef> queryWrapper = new QueryWrapper<>();
-            queryWrapper.lambda().eq(TenantAlbumRef::getTenantId, detail.getTenantId());
-            List<TenantAlbumRef> albumRefs = tenantAlbumRefMapper.selectList(queryWrapper);
-            if (!albumRefs.isEmpty()) {
-                List<Long> albIds = albumRefs.stream().map(TenantAlbumRef::getTenantAlbumId).distinct().collect(Collectors.toList());
-                QueryWrapper<TenantAlbum> query = new QueryWrapper<>();
-                query.lambda().in(TenantAlbum::getId, albIds)
-                        .eq(TenantAlbum::getStatus,true);
-                Integer count = tenantAlbumMapper.selectCount(query);
-                if (count > 0) {
-                    studentHomeVo.setTenantAlbumStatus(1);
-                }
+            QueryWrapper<TenantGroupAlbum> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(TenantGroupAlbum::getTenantGroupId, Optional.ofNullable(detail.getTenantGroupId()).orElse(-1L))
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .eq(TenantGroupAlbum::getStatus, true);
+            List<TenantGroupAlbum> tenantGroupAlbums = tenantGroupAlbumMapper.selectList(queryWrapper);
+            List<Long> albIds = tenantGroupAlbums.stream().map(TenantGroupAlbum::getTenantAlbumId).distinct().collect(Collectors.toList());
+            if (!tenantGroupAlbums.isEmpty()) {
+                studentHomeVo.setTenantAlbumStatus(1);
             }
-            UserTenantAlbumRecord record = userTenantAlbumRecordService.lambdaQuery()
-                    .eq(UserTenantAlbumRecord::getTenantId, tenantInfo.getId())
+            List<UserTenantAlbumRecord> record = userTenantAlbumRecordService.lambdaQuery()
                     .eq(UserTenantAlbumRecord::getUserId, detail.getUserId())
                     .eq(UserTenantAlbumRecord::getClientType, ClientEnum.STUDENT)
-                    .orderByDesc(UserTenantAlbumRecord::getEndTime)
-                    .last("limit 1").one();
-            if (record == null || record.getEndTime().getTime() < System.currentTimeMillis()) {
+                    .gt(UserTenantAlbumRecord::getEndTime,new Date())
+                    .orderByAsc(UserTenantAlbumRecord::getEndTime)
+                    .list();
+            if (record.isEmpty()) {
                 studentHomeVo.setTenantAlbumFlag(YesOrNoEnum.NO);
-                if (record != null) {
-                    studentHomeVo.setTenantAlbumStartTime(record.getStartTime());
-                    studentHomeVo.setTenantAlbumEndTime(record.getEndTime());
-                }
             } else {
-                studentHomeVo.setTenantAlbumStatus(2);
+                long count = record.stream().filter(next -> albIds.contains(next.getTenantAlbumId())).count();
+                if (count > 0) {
+                    studentHomeVo.setTenantAlbumStatus(2);
+                }
                 studentHomeVo.setTenantAlbumFlag(YesOrNoEnum.YES);
-                studentHomeVo.setTenantAlbumStartTime(record.getStartTime());
-                studentHomeVo.setTenantAlbumEndTime(record.getEndTime());
+                studentHomeVo.setTenantAlbumStartTime(record.get(0).getStartTime());
+                studentHomeVo.setTenantAlbumEndTime(record.get(0).getEndTime());
             }
 
         }

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

@@ -315,6 +315,28 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		return true;
 	}
 
+	/**
+	 * 发送验证码
+	 *
+	 * @param messageType 消息类型
+	 * @param receiver    消息接受者
+	 * @return true-发送成功  false-发送失败
+	 */
+	@Override
+	public String sendSecurityCode(MessageTypeEnum messageType, String receiver) {
+
+		// 生成验证码
+		String code = String.valueOf(getRandomCode(messageType, receiver));
+
+		// 验证码缓存Key
+		String key = getVerificationCodeCacheKey(messageType, receiver);
+
+		// 发送验证码缓存
+		redisCache.put(key, code, CODE_EXPIRE);
+
+		return code;
+	}
+
 	@Override
 	public String getSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr) {
 		if (debugMode == true) {

+ 16 - 15
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -512,21 +512,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
             imUserFriendService.saveUserFriend(teacher.getUserId(), collect);
 
-            // 机构老师添加机构绑定记录
-            addBindUnBindRecord(teacher.getUserId(),teacher.getTenantId(),true);
-            sendBindUnBindSMS(teacher.getUserId(), teacherSubmitReq.getPhone(), MessageTypeEnum.TEACHER_BIND_TENANT, teacher.getTenantId());
-        }
-        //  与客服建立好友
-        String customerService = customerServiceConfig.getCustomerService();
-        if (StringUtils.isNotBlank(customerService)) {
-            List<String> phones = Arrays.stream(customerService.split(",")).collect(Collectors.toList());
-            Random rand = new Random();
-            String mobile = phones.get(rand.nextInt(phones.size()));
-            SysUser friend = sysUserMapper.findUserByPhone(mobile);
-            if (friend != null) {
-                imUserFriendService.registerUserBindCustomerService(teacher.getUserId(),
-                        Collections.singletonList(friend.getId()), ClientEnum.TEACHER);
-            }
         }
 
         return HttpResponseResult.succeed(true);
@@ -603,6 +588,22 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 userAccount.setUserId(teacherSubmitReq.getUserId());
                 userAccountService.save(userAccount);
             }
+            // 机构老师添加机构绑定记录
+            addBindUnBindRecord(teacher.getUserId(),teacher.getTenantId(),true);
+            sendBindUnBindSMS(teacher.getUserId(), teacherSubmitReq.getPhone(), MessageTypeEnum.TEACHER_BIND_TENANT, teacher.getTenantId());
+
+            //  与客服建立好友
+            String customerService = customerServiceConfig.getCustomerService();
+            if (StringUtils.isNotBlank(customerService)) {
+                List<String> phones = Arrays.stream(customerService.split(",")).collect(Collectors.toList());
+                Random rand = new Random();
+                String mobile = phones.get(rand.nextInt(phones.size()));
+                SysUser friend = sysUserMapper.findUserByPhone(mobile);
+                if (friend != null) {
+                    imUserFriendService.registerUserBindCustomerService(teacher.getUserId(),
+                            Collections.singletonList(friend.getId()), ClientEnum.TEACHER);
+                }
+            }
         } else {
             // 如果机构解绑,更新机构ID为-1
             if (Boolean.TRUE.equals(teacherSubmitReq.getBindTenant())) {

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

@@ -65,6 +65,10 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+
     private static final String PHONE_REG = "^1\\d{10}$";
 
     /**
@@ -200,23 +204,35 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         if (student == null) {
             throw new BizException("学生不存在");
         }
-        Long tenantId = -1L;
-        if (student.getTenantId() != null) {
-            tenantId = student.getTenantId();
-        }
-
-        TenantActivationCode code = this.lambdaQuery().eq(TenantActivationCode::getTenantId, tenantId)
-                .eq(TenantActivationCode::getActivationCode, activationCode)
-                .last("limit 1").one();
+        TenantActivationCode code = this.lambdaQuery().eq(TenantActivationCode::getActivationCode, activationCode).last("limit 1").one();
         if (code == null) {
             throw new BizException("激活码不存在");
         }
-        SysUser sysUser = sysUserService.getDao().selectById(studentId);
-        if (Boolean.TRUE.equals(code.getActivationStatus()) || (EActivationCode.SEND.equals(code.getSendStatus()) &&
-                !sysUser.getPhone().equals(code.getActivationPhone()))) {
+        if (Boolean.TRUE.equals(code.getActivationStatus())) {
             throw new BizException("激活码已经被使用");
         }
 
+        // 判断激活码是否已经发送给学生
+        SysUser sysUser = sysUserService.getDao().selectById(studentId);
+        if (!sysUser.getPhone().equals(code.getActivationPhone())) { // 发给自己不校验,可以直接用,未发放需要校验
+            if (EActivationCode.SEND.equals(code.getSendStatus())) { //已经发送给别人
+                throw new BizException("激活码不可用");
+            }
+            // 未发放,线下抄送
+            // 校验小组专辑的小组和机构是否和学生一致,并且小组专辑是启用状态
+            Long tenantAlbumId = code.getTenantAlbumId();
+            List<Long> tenantGroupIds = tenantGroupAlbumService.lambdaQuery()
+                    .eq(TenantGroupAlbum::getTenantAlbumId, tenantAlbumId)
+                    .eq(TenantGroupAlbum::getStatus, true)
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .list().stream().map(TenantGroupAlbum::getTenantGroupId).distinct().collect(Collectors.toList());
+            if (!tenantGroupIds.contains(student.getTenantGroupId())) {
+                throw new BizException("激活码不可用");
+            }
+        }
+
+
+
         // 通过状态和ID同时判断更新是否存在竞争
         boolean update = this.lambdaUpdate()
                 .set(TenantActivationCode::getActivationStatus, true)
@@ -235,6 +251,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
 
         addUserTenantAlbumRecord(student.getUserId(), purchase, null);
 
+        Long tenantId = Optional.ofNullable(student.getTenantId()).orElse(-1L);
         // 更新购买记录中激活码使用统计数量值
         Integer activeCodeNumber = this.lambdaQuery()
                 .eq(TenantActivationCode::getTenantId, tenantId)
@@ -259,12 +276,8 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         if (student == null) {
             throw new BizException("学生不存在");
         }
-        Long tenantId = -1L;
-        if (student.getTenantId() != null) {
-            tenantId = student.getTenantId();
-        }
         TenantActivationCode code = baseMapper.selectById(id);
-        if(code == null || !code.getTenantId().equals(tenantId)) {
+        if(code == null) {
             throw new BizException("激活码不存在");
         }
         SysUser sysUser = sysUserService.getDao().selectById(student.getUserId());
@@ -295,7 +308,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
 
         // 更新购买记录中激活码使用统计数量值
         Integer activeCodeNumber = this.lambdaQuery()
-                .eq(TenantActivationCode::getTenantId, tenantId)
+                .eq(TenantActivationCode::getTenantId, code.getTenantId())
                 .eq(TenantActivationCode::getTenantAlbumPurchaseId, code.getTenantAlbumPurchaseId())
                 .eq(TenantActivationCode::getActivationStatus, true).count();
 
@@ -469,6 +482,14 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
                 .in(TenantActivationCode::getActivationCode, codeList).list();
         Map<String, TenantActivationCode> mapByCode = activationCodes.stream().collect(Collectors.toMap(TenantActivationCode::getActivationCode, Function.identity()));
 
+
+        TenantAlbumPurchase purchase = tenantAlbumPurchaseMapper.selectById(tenantAlbumPurchaseId);
+        List<Long> tenantGroupIds = tenantGroupAlbumService.lambdaQuery()
+                .eq(TenantGroupAlbum::getTenantAlbumId, purchase.getTenantAlbumId())
+                .eq(TenantGroupAlbum::getStatus, true)
+                .eq(TenantGroupAlbum::getDelFlag, false)
+                .list().stream().map(TenantGroupAlbum::getTenantGroupId).distinct().collect(Collectors.toList());
+
         StudentSearch studentSearch = new StudentSearch();
         studentSearch.setRows(9999);
         studentSearch.setPage(1);
@@ -524,7 +545,8 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             String phone = template.getPhone();
             if (StringUtils.isNotEmpty(phone)) {
                 if (!Pattern.matches(PHONE_REG, phone.trim()) ||
-                        (mapStudentByPhone.containsKey(phone) && !mapStudentByPhone.get(phone).getTenantId().equals(tenantId))) {
+                        (mapStudentByPhone.containsKey(phone) && ((!mapStudentByPhone.get(phone).getTenantId().equals(tenantId)) ||
+                                !tenantGroupIds.contains(mapStudentByPhone.get(phone).getTenantGroupId())))) {
                     phone_err_lines.add(msgRowNo);
                 }
             }
@@ -616,6 +638,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             userTenantAlbumRecord.setSubOrderNo(userOrderDetailVo.getSubOrderNo());
             userTenantAlbumRecord.setCreateBy(studentId);
             userTenantAlbumRecord.setTimes(tenantAlbumContent.getBuyCycle());
+            userTenantAlbumRecord.setType(tenantAlbumContent.getPurchaseType());
         } else if (purchase != null) {
 
             userTenantAlbumRecord.setTenantId(purchase.getTenantId());
@@ -627,6 +650,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             userTenantAlbumRecord.setSubOrderNo(purchase.getId().toString());
             userTenantAlbumRecord.setCreateBy(studentId);
             userTenantAlbumRecord.setTimes(purchase.getPurchaseCycle());
+            userTenantAlbumRecord.setType(purchase.getPurchaseType());
         }
 
         List<UserTenantAlbumRecord> userTenantAlbumRecords = userTenantAlbumRecordMapper
@@ -641,7 +665,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         userTenantAlbumRecord.setCreateBy(studentId);
 
 
-        userTenantAlbumRecord.setType("MONTH");
+//        userTenantAlbumRecord.setType("MONTH");
 
         Calendar instance = Calendar.getInstance();
         if (userTenantAlbumRecords.isEmpty()) {
@@ -658,7 +682,27 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             }
         }
         userTenantAlbumRecord.setStartTime(instance.getTime());
-        instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes());
+        //DAY 日 MONTH 月 QUARTERLY 季度 YEAR_HALF 半年 YEAR 年
+        switch (userTenantAlbumRecord.getType()) {
+            case "DAY":
+                instance.add(Calendar.DAY_OF_MONTH, userTenantAlbumRecord.getTimes());
+                break;
+            case "MONTH":
+                instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes());
+                break;
+            case "QUARTERLY":
+                instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes() * 3);
+                break;
+            case "YEAR_HALF":
+                instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes() * 6);
+                break;
+            case "YEAR":
+                instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes() * 12);
+                break;
+            default:
+                instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes());
+                break;
+        }
 
         instance.set(Calendar.HOUR_OF_DAY, 23);
         instance.set(Calendar.MINUTE, 59);

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

@@ -17,14 +17,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMusicMapper;
-import com.yonge.cooleshow.biz.dal.service.MusicFavoriteService;
-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.TenantAlbumCategoryDetailService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumCategoryService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
-import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumMusicWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import jodd.util.StringUtil;
@@ -34,11 +27,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -73,6 +62,8 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
     @Autowired
     private TenantAlbumMusicService tenantAlbumMusicService;
 
+    @Autowired
+    private SysUserService sysUserService;
 
     @Autowired
     private MusicFavoriteService musicFavoriteService;
@@ -101,78 +92,69 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
      * @return IPage<TenantAlbumMusic>
      */
     @Override
-    public IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page, TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
-        com.yonge.cooleshow.auth.api.entity.SysUser user = sysUserFeignService.queryUserInfo();
-        Long sysUserId = user.getId();
-
-        String albumId = query.getAlbumId();
-        if (StringUtil.isEmpty(albumId)){
-            Long tenantId = query.getTenantId();
-            //查询机构专辑Id
-            List<TenantAlbumMusic> list = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId).eq(TenantAlbumMusic::getDelFlag,false).list();
-            if (CollectionUtils.isNotEmpty(list)){
-                TenantAlbumMusic albumMusic = list.get(0);
-                 albumId = albumMusic.getTenantAlbumId().toString();
-            } else {
-                throw new BizException("该机构未绑定相关专辑");
-            }
-        }
-        SubjectTypeEnum subjectType = query.getSubjectType();
-        String s = subjectType.toString();
-        String type = query.getType();
-        String level = query.getLevel();
+    public IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page,
+                                                                             TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
 
-        List<Long> musicSheetIds = tenantAlbumMusicMapper.selectMusicSheetIds(albumId, s, type, level);
 
-        if (CollectionUtils.isEmpty(musicSheetIds)) {
-            page.setTotal(0);
-            return page.setRecords(new ArrayList<>());
+        List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> musicSheets = tenantAlbumMusicMapper.selectPage(page, query);
+        if (CollectionUtils.isEmpty(musicSheets)) {
+            return page.setRecords(musicSheets);
         }
-        TenantAlbumMusicWrapper.StudentMusicSheetQuery musicSheetQuery = new TenantAlbumMusicWrapper.StudentMusicSheetQuery();
-        musicSheetQuery.setMusicSheetIds(musicSheetIds);
-        musicSheetQuery.setMusicTagId(query.getMusicTagId());
-        musicSheetQuery.setSubjectId(query.getSubjectId());
-        musicSheetQuery.setKeyword(query.getKeyword());
-        //把集合转为字符串
-        String collect1 = musicSheetIds.stream()
-                .map(String::valueOf)
-                .collect(Collectors.joining(", "));
-        musicSheetQuery.setCollect(collect1);
-
-        List<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> musicSheets = tenantAlbumMusicMapper.selectPage(page, musicSheetQuery);
-
-        musicSheets.stream().forEach(m->{
-            Long userId = m.getUserId();
-            String musicSubject = m.getMusicSubject();
-
-            //获取用户名
-            if (userId != null){
-                SysUser sysUser = sysUserMapper.selectById(userId);
-                m.setUserName(sysUser.getUsername());
-            }
-
-            //获取声部名
-            if (StringUtils.isNotEmpty(musicSubject)){
-                List<Subject> subject = subjectService.findBySubjectByIdList(musicSubject);
-                if (CollectionUtils.isNotEmpty(subject)){
-                    Subject subject1 = subject.get(0);
-                    m.setMusicSubjectName(subject1.getName());
-                }
-            }
 
-            //是否收藏
-            Long id = m.getId();
-            List<MusicFavorite> list = musicFavoriteService.lambdaQuery()
-                    .eq(MusicFavorite::getMusicSheetId, id)
-                    .eq(MusicFavorite::getUserId,sysUserId)
-                    .eq(MusicFavorite::getClientType,query.getClientType().equals(ClientEnum.TENANT_STUDENT)?ClientEnum.STUDENT:query.getClientType()).list();
-            if (CollectionUtils.isNotEmpty(list)){
-                m.setFavorite(true);
-            }
+        // 设置声部
+        List<String> subjectIds = musicSheets.stream()
+            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getMusicSubject)
+            .filter(Objects::nonNull)
+            .flatMap(x -> Arrays.stream(x.split(",")))
+            .distinct()
+            .collect(Collectors.toList());
+        Map<Integer, Subject> subjectMap = subjectService.getMapByIds(subjectIds);
+
+        // 设置上传人
+        List<Long> userIds = musicSheets.stream()
+            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getUserId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .collect(Collectors.toList());
+        Map<Long, SysUser> userMap = sysUserService.getMapByIds(userIds);
+
+        // 设置是否收藏
+        List<Long> musicSheetIds = musicSheets.stream()
+            .map(TenantAlbumMusicWrapper.StudentTenantAlbumMusic::getId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .collect(Collectors.toList());
+        List<Long> favoriteIds = new ArrayList<>();
+        if (query.getUserId() != null && query.getClientType() != null) {
+            List<MusicFavorite> favoriteList = musicFavoriteService.lambdaQuery()
+                .in(MusicFavorite::getMusicSheetId, musicSheetIds)
+                .eq(MusicFavorite::getUserId, query.getUserId())
+                .eq(MusicFavorite::getClientType, query.getClientType().equals(ClientEnum.TENANT_STUDENT) ? ClientEnum.STUDENT : query.getClientType())
+                .list();
+            favoriteIds = favoriteList.stream().map(MusicFavorite::getMusicSheetId).distinct().collect(Collectors.toList());
 
-        });
+        }
 
 
+        for (TenantAlbumMusicWrapper.StudentTenantAlbumMusic m : musicSheets) {
+            if (StringUtils.isNotBlank(m.getMusicSubject())) {
+                String subjectNames = Arrays.stream(m.getMusicSubject().split(","))
+                    .distinct()
+                    .map(Integer::parseInt)
+                    .map(subjectMap::get)
+                    .filter(Objects::nonNull)
+                    .map(Subject::getName)
+                    .collect(Collectors.joining(","));
+                m.setMusicSubjectName(subjectNames);
+            }
+            SysUser sysUser = userMap.get(m.getUserId());
+            if (sysUser != null) {
+                m.setUserName(sysUser.getUsername());
+            }
+            if (CollectionUtils.isNotEmpty(favoriteIds)) {
+                m.setFavorite(favoriteIds.contains(m.getId()));
+            }
+        }
         return page.setRecords(musicSheets);
     }
 
@@ -216,7 +198,8 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
         // 专辑曲目关联数据
         List<TenantAlbumMusic> list = this.lambdaQuery()
                 .in(TenantAlbumMusic::getTenantAlbumId, albumIds)
-                .eq(query.getSubjectType() !=null,TenantAlbumMusic::getSubjectType, query.getSubjectType())
+                .eq(query.getTenantAlbumId() != null, TenantAlbumMusic::getTenantAlbumId, query.getTenantAlbumId())
+                .eq(query.getSubjectType() != null, TenantAlbumMusic::getSubjectType, query.getSubjectType())
                 .eq(TenantAlbumMusic::getDelFlag, false)
                 .list();
         if (CollectionUtils.isEmpty(list)) {

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

@@ -1,15 +1,22 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
@@ -28,8 +35,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -88,6 +102,16 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+    @Autowired
+    private UserOrderDao userOrderDao;
+
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
+
     /**
      * 查询详情
      *
@@ -202,16 +226,16 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             log.error("订单创建前检测,专辑不存在,bizId={}", orderGoodsInfo.getBizId());
             throw new BizException("订单商品信息为空");
         }
-        tenantAlbumContent.setBuyCycle(tenantAlbum.getPurchaseCycle());
-        tenantAlbumContent.setSalePrice(tenantAlbum.getSalePrice());
-        tenantAlbumContent.setOriginalPrice(tenantAlbum.getOriginalPrice());
+//        tenantAlbumContent.setBuyCycle(tenantAlbum.getPurchaseCycle());
+//        tenantAlbumContent.setSalePrice(tenantAlbum.getSalePrice());
+//        tenantAlbumContent.setOriginalPrice(tenantAlbum.getOriginalPrice());
 
         // 查询专辑所在机构
         List<TenantAlbumRef> refList =
                 tenantAlbumRefService.getByAlbumId(tenantAlbum.getId());
         if (CollectionUtils.isEmpty(refList)) {
             log.error("订单创建前检测,专辑不在机构下,bizId={}", orderGoodsInfo.getBizId());
-            throw new BizException("用户不在当前机构");
+            throw new BizException("该专辑已不可购买");
         }
 
         // 机构ID集合
@@ -223,7 +247,8 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         // 设置金额入账去向
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = teacherService.teacherSettlementFrom(null, orderGoodsInfo.getRecomUserId());
-        BigDecimal price = BigDecimal.ZERO;
+        BigDecimal originalPrice = BigDecimal.ZERO;
+        BigDecimal actualPrice = BigDecimal.ZERO;
         // 学生购买机构专辑
         switch (orderGoodsInfo.getPaymentClient()) {
             case STUDENT: {
@@ -231,17 +256,49 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 Student student = studentService.getById(orderGoodsInfo.getUserId());
                 if (student == null) {
                     log.error("订单创建前检测,学生不存在,userId={}", orderGoodsInfo.getUserId());
-                    throw new BizException("用户信息未找到");
+                    throw new BizException("该专辑已不可购买");
                 }
                 TenantInfo tenantInfo = tenantInfoService.detail(student.getTenantId());
                 if (tenantInfo == null || !tenantIdList.contains(tenantInfo.getId())) {
                     log.error("订单创建前检测,学生不在当前机构下,userId={},tenantId={}", orderGoodsInfo.getUserId(), student.getTenantId());
-                    throw new BizException("用户不在当前机构");
+                    throw new BizException("该专辑已不可购买");
+                }
+                if (orderGoodsInfo.getTenantGroupAlbumId() == null) {
+                    log.error("订单创建前检测,学生购买机构专辑,机构小组专辑ID为空,userId={}", orderGoodsInfo.getUserId());
+                    throw new BizException("该专辑已不可购买");
+                }
+                // 判断机构小组专辑ID是否能购买,专辑ID和当前机构专辑ID是否对应
+                TenantGroupAlbum tenantGroupAlbum = tenantGroupAlbumService.getById(orderGoodsInfo.getTenantGroupAlbumId());
+                if (tenantGroupAlbum == null || tenantGroupAlbum.getDelFlag() || !tenantGroupAlbum.getStatus()) {
+                    log.error("订单创建前检测,学生购买机构专辑,机构小组专辑不存在,userId={},tenantGroupAlbumId={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getTenantGroupAlbumId());
+                    throw new BizException("该专辑已不可购买");
+                }
+
+                // 判断学生是否在小组
+                if (orderGoodsInfo.getTenantGroupAlbumId().equals(student.getTenantGroupId())) {
+                    log.error("订单创建前检测,学生购买机构专辑,学生不在小组,userId={},tenantGroupAlbumId={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getTenantGroupAlbumId());
+                    throw new BizException("该专辑已不可购买");
+                }
+                if (!tenantGroupAlbum.getTenantAlbumId().equals(orderGoodsInfo.getBizId())) {
+                    log.error("订单创建前检测,学生购买机构专辑,机构小组专辑ID和当前机构专辑ID不对应,userId={},tenantGroupAlbumId={},bizId={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getTenantGroupAlbumId(), orderGoodsInfo.getBizId());
+                    throw new BizException("该专辑已不可购买");
+                }
+                // 判断购买次数
+                if (tenantGroupAlbum.getBuyTimesFlag()) {
+                    List<Long> studentTenantAlbumNum = userOrderDao.getStudentTenantAlbumNum(student.getUserId(), Lists.newArrayList(tenantGroupAlbum.getId()));
+                    if (CollectionUtils.isNotEmpty(studentTenantAlbumNum) && studentTenantAlbumNum.size() >= tenantGroupAlbum.getBuyTimes()) {
+                        log.error("订单创建前检测,学生购买机构专辑,机构小组专辑购买次数超过限制,userId={},tenantGroupAlbumId={},buyTimes={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getTenantGroupAlbumId(), tenantGroupAlbum.getBuyTimes());
+                        throw new BizException("该专辑已不可购买");
+                    }
                 }
-                price = tenantAlbum.getSalePrice();
+
+                originalPrice = tenantGroupAlbum.getOriginalPrice();
+                actualPrice = tenantGroupAlbum.getActualPrice();
                 userOrderDetail.setMerchId(tenantInfo.getId());
+                userOrderDetail.setTenantGroupAlbumId(tenantGroupAlbum.getId());
                 tenantAlbumContent.setBuyNumber(1);
-                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
+                tenantAlbumContent.setBuyCycle(tenantGroupAlbum.getPurchaseNum());
+                tenantAlbumContent.setPurchaseType(tenantGroupAlbum.getPurchasePeriod());
                 tenantAlbumContent.setTenantId(tenantInfo.getId());
                 accountTenantTo.setIncomeTenant(tenantInfo.getId());
                 break;
@@ -256,12 +313,39 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 }
                 if (!tenantIdList.contains(tenantStaff.getTenantId())) {
                     log.error("订单创建前检测,专辑不在机构下,userId={},tenantId={}", orderGoodsInfo.getUserId(), tenantStaff.getTenantId());
-                    throw new BizException("用户不在当前机构");
+                    throw new BizException("该专辑已不可购买");
+                }
+                // 根据周期判断能不能购买当前周期的专辑
+                if (StringUtil.isEmpty(tenantAlbum.getPurchaseTypes())) {
+                    log.error("订单创建前检测,机构购买机构专辑,专辑周期为空,userId={},bizId={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getBizId());
+                    throw new BizException("该专辑已不可购买");
+                }
+                List<String> purchaseTypes = Arrays.asList(tenantAlbum.getPurchaseTypes().split(","));
+                if (!purchaseTypes.contains(tenantAlbumContent.getPurchaseType())) {
+                    log.error("订单创建前检测,机构购买机构专辑,专辑周期不支持,userId={},bizId={},purchaseType={}", orderGoodsInfo.getUserId(),
+                        orderGoodsInfo.getBizId(), tenantAlbumContent.getPurchaseType());
+                    throw new BizException("该专辑已不可购买");
                 }
-                price = tenantAlbum.getOriginalPrice();
+                List<TenantAlbumWrapper.TenantAlbumPurchaseJson> tenantAlbumPurchaseJsons = JSON
+                    .parseArray(tenantAlbum.getPurchaseJson(), TenantAlbumWrapper.TenantAlbumPurchaseJson.class);
+                if (CollectionUtils.isEmpty(tenantAlbumPurchaseJsons)) {
+                    log.error("订单创建前检测,机构购买机构专辑,专辑周期不支持,userId={},bizId={},purchaseType={}", orderGoodsInfo.getUserId(),
+                        orderGoodsInfo.getBizId(), tenantAlbumContent.getPurchaseType());
+                    throw new BizException("该专辑已不可购买");
+                }
+                Optional<TenantAlbumWrapper.TenantAlbumPurchaseJson> first = tenantAlbumPurchaseJsons.stream().filter(o -> o.getType().equals(tenantAlbumContent.getPurchaseType())).findFirst();
+                if (!first.isPresent()) {
+                    log.error("订单创建前检测,机构购买机构专辑,专辑周期不支持,userId={},bizId={},purchaseType={}", orderGoodsInfo.getUserId(),
+                        orderGoodsInfo.getBizId(), tenantAlbumContent.getPurchaseType());
+                    throw new BizException("该专辑已不可购买");
+                }
+                TenantAlbumWrapper.TenantAlbumPurchaseJson tenantAlbumPurchaseJson = first.get();
+
+                originalPrice = tenantAlbumPurchaseJson.getPrice();
+                actualPrice = tenantAlbumPurchaseJson.getPrice();
                 userOrderDetail.setMerchId(0L);
                 tenantAlbumContent.setTenantId(tenantStaff.getTenantId());
-                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
+                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyMultiple());
                 break;
             }
         }
@@ -272,10 +356,11 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
         userOrderDetail.setBizId(tenantAlbum.getId());
         userOrderDetail.setBizContent(JSON.toJSONString(tenantAlbumContent));
         userOrderDetail.setGoodNum(orderGoodsInfo.getGoodNum());
-        userOrderDetail.setOriginalPrice(price.multiply(new BigDecimal(orderGoodsInfo.getGoodNum()))
+        userOrderDetail.setOriginalPrice(originalPrice.multiply(new BigDecimal(orderGoodsInfo.getGoodNum()))
                 .multiply(new BigDecimal(tenantAlbumContent.getBuyMultiple())));
         userOrderDetail.setCouponAmount(BigDecimal.ZERO);
-        userOrderDetail.setExpectPrice(userOrderDetail.getOriginalPrice());
+        userOrderDetail.setExpectPrice(actualPrice.multiply(new BigDecimal(orderGoodsInfo.getGoodNum()))
+            .multiply(new BigDecimal(tenantAlbumContent.getBuyMultiple())));
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
         userOrderDetail.setAccountConfig(accountTenantTo.jsonString());
 
@@ -515,6 +600,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
         tenantAlbumPurchase.setPurchaseCycle(tenantAlbumContent.getBuyCycle());
         tenantAlbumPurchase.setActiveQuantity(0);
         tenantAlbumPurchase.setOrderNo(orderGoodsInfo.getOrderNo());
+        tenantAlbumPurchase.setPurchaseType(tenantAlbumContent.getPurchaseType());
         tenantAlbumPurchase.setPurchasePrice(orderGoodsInfo.getUserOrderDetail().getActualPrice());
         tenantAlbumPurchase.setPurchaseStatus(OrderStatusEnum.WAIT_PAY.getCode());
         tenantAlbumPurchaseService.save(tenantAlbumPurchase);
@@ -549,6 +635,24 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateStatus(Long id, Boolean status) {
+        tenantAlbumService.lambdaUpdate()
+                .set(TenantAlbum::getStatus, status)
+                .eq(TenantAlbum::getId, id)
+                .update();
+
+        if (Boolean.FALSE.equals(status)) {
+            UpdateWrapper<TenantGroupAlbum> queryWrapper = new UpdateWrapper<>();
+            queryWrapper.lambda()
+                    .set(TenantGroupAlbum::getStatus, false)
+                    .eq(TenantGroupAlbum::getTenantAlbumId, id)
+                    .eq(TenantGroupAlbum::getDelFlag, false);
+            tenantGroupAlbumMapper.update(null, queryWrapper);
+        }
+    }
+
     private void insertAlbumMusic(Long tenantId, TenantAlbum tenantAlbum,
                                   List<TenantAlbumWrapper.MusicSheetData> musicSheetDataList) {
         //曲目表赋值

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

@@ -0,0 +1,199 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMusicMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
+import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 机构小组专辑配置表
+ * 2024-01-24 13:32:00
+ */
+@Slf4j
+@Service
+public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMapper, TenantGroupAlbum> implements TenantGroupAlbumService {
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @Autowired
+    private UserOrderDao userOrderDao;
+
+    @Autowired
+    private TenantAlbumMusicMapper tenantAlbumMusicMapper;
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private TenantAlbumService tenantAlbumService;
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantGroupAlbum
+     */
+	@Override
+    public TenantGroupAlbum detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<TenantGroupAlbum>
+     * @param query TenantGroupAlbumWrapper.TenantGroupAlbumQuery
+     * @return IPage<TenantGroupAlbum>
+     */
+    @Override
+    public IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> selectPage(IPage<TenantGroupAlbumWrapper.TenantGroupAlbumVo> page, TenantGroupAlbumWrapper.TenantGroupAlbumQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param tenantGroupAlbum TenantGroupAlbumWrapper.TenantGroupAlbum
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum) {    	
+        
+        return this.save(JSON.parseObject(tenantGroupAlbum.jsonString(), TenantGroupAlbum.class));
+    }
+
+    /**
+     * 更新
+     * @param tenantGroupAlbum TenantGroupAlbumWrapper.TenantGroupAlbum
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(TenantGroupAlbumWrapper.TenantGroupAlbum tenantGroupAlbum){
+
+        return this.updateById(JSON.parseObject(tenantGroupAlbum.jsonString(), TenantGroupAlbum.class));       
+    }
+
+    @Override
+    public List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo(Long tenantGroupAlbumId, Long userId, ClientEnum clientType) {
+        // 学生端 查看小组专辑 获取专辑基本信息, 机构端查看机构专辑 获取专辑基本信息
+
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantGroupAlbumId(tenantGroupAlbumId);
+        if (tenantGroupAlbumId != null) {} else if (clientType == ClientEnum.STUDENT) {
+            Student student = studentService.getById(userId);
+            if (student.getTenantId() == null || student.getTenantId() <=0 || student.getTenantGroupId() == null) {
+                throw new BizException("学生未加入机构或者小组");
+            }
+            query.setTenantId(student.getTenantId());
+            query.setTenantGroupId(student.getTenantGroupId());
+        } else if (clientType == ClientEnum.TENANT) {
+            TenantStaff tenantStaff = tenantStaffService.getByUserId(userId);
+            if(tenantStaff == null || tenantStaff.getTenantId() == null) {
+                throw new BizException("机构员工不存在");
+            }
+            query.setTenantId(tenantStaff.getTenantId());
+        }else if (clientType == ClientEnum.TEACHER) {
+            Teacher teacher = teacherService.getById(userId);
+            if(teacher == null || teacher.getTenantId() == null) {
+                throw new BizException("老师机构信息不存在");
+            }
+            query.setTenantId(teacher.getTenantId());
+        } else {
+            throw new BizException("客户端类型错误");
+        }
+
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo = baseMapper.getBuyAlbumInfo(query);
+        if (CollectionUtils.isEmpty(buyAlbumInfo)) {
+            return buyAlbumInfo;
+        }
+        // 查询专辑可用的分类的曲目数量
+        // 机构专辑ID集合
+        List<Long> tenantAlbumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getId).collect(Collectors.toList());
+
+        List<TenantAlbumMusic> list = tenantAlbumMusicMapper.getByAlbumAndEnable(tenantAlbumIds);
+        // 根据专辑ID分组 在根据声部分类 分组
+        Map<Long, Map<SubjectTypeEnum, Long>> map = list.stream()
+            .collect(Collectors.groupingBy(TenantAlbumMusic::getTenantAlbumId, Collectors.groupingBy(TenantAlbumMusic::getSubjectType,Collectors.counting())));
+
+        for (TenantGroupAlbumWrapper.BuyTenantAlbum buyTenantAlbum : buyAlbumInfo) {
+            Map<SubjectTypeEnum, Long> subjectTypeEnumLongMap = map.get(buyTenantAlbum.getId());
+            if (subjectTypeEnumLongMap != null) {
+                buyTenantAlbum.setMusicCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.MUSIC,0L).intValue());
+                buyTenantAlbum.setEnsembleCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.ENSEMBLE,0L).intValue());
+                buyTenantAlbum.setSubjectCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.SUBJECT,0L).intValue());
+            } else {
+                buyTenantAlbum.setMusicCounts(0);
+                buyTenantAlbum.setEnsembleCounts(0);
+                buyTenantAlbum.setSubjectCounts(0);
+            }
+            buyTenantAlbum.setMusicNum(buyTenantAlbum.getMusicCounts() + buyTenantAlbum.getEnsembleCounts()+buyTenantAlbum.getSubjectCounts());
+        }
+
+        // 如果学生购买 判断购买次数
+        if (clientType == ClientEnum.STUDENT) {
+            // 曲目ID集合
+            List<Long> tenantGroupAlbumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getTenantGroupAlbumId).collect(Collectors.toList());
+            List<Long> studentTenantAlbumNum = userOrderDao.getStudentTenantAlbumNum(userId, tenantGroupAlbumIds);
+            for (TenantGroupAlbumWrapper.BuyTenantAlbum item : buyAlbumInfo) {
+                item.setBuyedTimes((int) studentTenantAlbumNum.stream().filter(x -> x.equals(item.getTenantGroupAlbumId())).count());
+                if (item.getBuyedTimes() > item.getBuyTimes()) {
+                    item.setBuyedTimes(item.getBuyTimes());
+                }
+            }
+        }
+
+        return buyAlbumInfo;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateStatus(TenantGroupAlbumWrapper.UpdateStatus updateStatus) {
+        List<Long> ids = Arrays.stream(updateStatus.getIds().split(",")).map(Long::valueOf).collect(Collectors.toList());
+        List<TenantGroupAlbum> tenantGroupAlbumList = this.lambdaQuery().in(TenantGroupAlbum::getId, ids).list();
+        if (CollectionUtils.isEmpty(tenantGroupAlbumList)) {
+            return;
+        }
+        List<Long> tenantAlbumIds = tenantGroupAlbumList.stream().map(TenantGroupAlbum::getTenantAlbumId).distinct().collect(Collectors.toList());
+        List<TenantAlbum> list = tenantAlbumService.lambdaQuery()
+                .in(TenantAlbum::getId, tenantAlbumIds)
+                .eq(TenantAlbum::getDelFlag, false)
+                .list();
+        if (list.stream().anyMatch(next -> Boolean.FALSE.equals(next.getStatus()))) {
+            throw new BizException("专辑已经停用");
+        }
+        this.lambdaUpdate()
+                .set(TenantGroupAlbum::getStatus, updateStatus.getStatus())
+                .in(TenantGroupAlbum::getId, ids)
+                .update();
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -18,9 +19,12 @@ import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
@@ -29,6 +33,7 @@ import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.toolset.base.exception.BizException;
@@ -64,6 +69,8 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
     private ImGroupMemberService imGroupMemberService;
     @Autowired
     private SysUserService sysUserService;
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
 
     /**
      * 查询详情
@@ -112,12 +119,17 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
             List<Long> adminIdList = records.stream().map(TenantGroupWrapper.TenantGroup::getAdminId).distinct().collect(Collectors.toList());
             Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> mapByIds = sysUserService.getMapByIds(adminIdList);
 
+            String ids = records.stream().map(TenantGroupWrapper.TenantGroup::getId).map(String::valueOf).collect(Collectors.joining(","));
+            Map<Long, Integer> countByGroupId = tenantGroupAlbumMapper.countGroupAlbumByGroupId(ids).stream().collect(Collectors.toMap(TenantGroupAlbumWrapper.TenantGroupAlbumCount::getTenantGroupId
+                    , TenantGroupAlbumWrapper.TenantGroupAlbumCount::getCount));
+
             for (TenantGroupWrapper.TenantGroup record : records) {
                 record.setGroupUserCount(groupBy.getOrDefault(record.getId(), 0));
                 record.setImGroupExist(existImgGroupIds.contains(record.getImGroupId()));
                 if (mapByIds.containsKey(record.getAdminId())) {
                     record.setAdminName(mapByIds.get(record.getAdminId()).getUsername());
                 }
+                record.setAlbumCount(countByGroupId.getOrDefault(record.getId(), 0));
             }
         }
         return iPage;
@@ -315,6 +327,10 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
                 .eq(Student::getTenantId, group.getTenantId())
                 .eq(Student::getTenantGroupId, id)
                 .set(Student::getTenantGroupId, -1L));
+
+        tenantGroupAlbumMapper.update(null, Wrappers.<TenantGroupAlbum>lambdaUpdate()
+                .set(TenantGroupAlbum::getDelFlag, true)
+                .eq(TenantGroupAlbum::getTenantGroupId, id));
         return removeById(id);
     }
 

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

@@ -602,7 +602,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         if (orderReq.getActualPrice().setScale(2, RoundingMode.HALF_UP)
             .compareTo(orderReq.getPaymentCashAmount().setScale(2, RoundingMode.HALF_UP)) != 0) {
             log.info("executeOrder actualPrice={}", orderReq.getActualPrice());
-            throw new BizException("支付金额不匹配");
+            throw new BizException(999,"支付金额不匹配");
         }
 
         // 订单入库前处理流程

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
@@ -14,15 +15,12 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
-import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumRefMapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantInfoMapper;
+import com.yonge.cooleshow.biz.dal.mapper.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -30,13 +28,13 @@ import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.Nullable;
 import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
-import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -102,6 +100,15 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
     @Autowired
     private TenantInfoMapper tenantInfoMapper;
 
+    @Autowired
+    private TenantGroupAlbumService tenantGroupAlbumService;
+
+
+    @Autowired
+    private TenantGroupAlbumMapper tenantGroupAlbumMapper;
+
+    @Autowired
+    private TenantAlbumMusicMapper tenantAlbumMusicMapper;
     /**
      * 查询详情
      *
@@ -385,26 +392,40 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         if (sysUser == null) {
             throw new BizException("用户不存在");
         }
+        List<Long>  tenantAlbumIds = new ArrayList<>();
         Long tenantAlbumId;
+
         if (StringUtils.isEmpty(albumId)) {
             Long id = sysUser.getId();
-            List<Student> list = studentService.lambdaQuery().eq(Student::getUserId, id).list();
-            if (CollectionUtils.isEmpty(list)) {
-                throw new BizException("学生账号未找到");
-            }
-            Student student = list.get(0);
+            Student student = studentService.getById(id);
             //获取机构Id
             Long tenantId = student.getTenantId();
-            //查询对应专辑id
-            List<TenantAlbumMusic> tenantAlbumMusicList = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getTenantId, tenantId)
-                    .eq(TenantAlbumMusic::getDelFlag, false).list();
-            if (CollectionUtils.isEmpty(tenantAlbumMusicList)) {
-                return null;
+
+            // 如果没有小组, 就没有专辑
+            if (student.getTenantGroupId() == null || tenantId ==null || tenantId <=0) {
+
+                album.setTenantAlbumStatus(0);
+                album.setTenantAlbumFlag(YesOrNoEnum.NO);
+                return album;
+            } else {
+                //查询对应小组专辑id
+                List<TenantGroupAlbum> list = tenantGroupAlbumService.lambdaQuery()
+                    .eq(TenantGroupAlbum::getTenantGroupId, student.getTenantGroupId())
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .eq(TenantGroupAlbum::getStatus, true)
+                    .list();
+                if (CollectionUtils.isEmpty(list)) {
+                    album.setTenantAlbumStatus(0);
+                    album.setTenantAlbumFlag(YesOrNoEnum.NO);
+                    return album;
+                }
+                // 专辑ID集合
+                tenantAlbumIds = list.stream().map(TenantGroupAlbum::getTenantAlbumId).distinct().collect(Collectors.toList());
+
+                return getTenantAlbum(sysUser, album, tenantAlbumIds);
             }
-            TenantAlbumMusic tenantAlbumMusic = tenantAlbumMusicList.get(0);
-            tenantAlbumId = tenantAlbumMusic.getTenantAlbumId();
         } else {
-            //如果传专辑id   则查询这个专辑的详情
+            tenantAlbumIds.add(Long.parseLong(albumId));
             tenantAlbumId = Long.parseLong(albumId);
         }
         //获取对应机构专辑状态
@@ -426,15 +447,15 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
                 List<Long> albIds = albumRefs.stream().map(TenantAlbumRef::getTenantAlbumId).distinct().collect(Collectors.toList());
                 QueryWrapper<TenantAlbum> query = new QueryWrapper<>();
                 query.lambda().in(TenantAlbum::getId, albIds)
-                        .eq(TenantAlbum::getStatus, true);
+                    .eq(TenantAlbum::getStatus, true);
                 Integer count = tenantAlbumMapper.selectCount(query);
                 if (count > 0) {
                     album.setTenantAlbumStatus(1);
                 }
             }
             UserTenantAlbumRecord record =
-                    userTenantAlbumRecordService.getNewestByTenantIdAndUserId(tenantInfo.getId(), detail.getUserId(),
-                            ClientEnum.STUDENT);
+                userTenantAlbumRecordService.getNewestByTenantIdAndUserId(tenantInfo.getId(), detail.getUserId(),
+                    ClientEnum.STUDENT);
             if (record == null || record.getEndTime().getTime() < System.currentTimeMillis()) {
                 album.setTenantAlbumFlag(YesOrNoEnum.NO);
             } else {
@@ -447,13 +468,9 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
 
 
         //查询是否已经购买专辑
-        Long buyTenantAlbumId = userTenantAlbumRecordMapper.ifBuy(tenantAlbumId, sysUser.getId());
+        List<Long> buyTenantAlbumId = userTenantAlbumRecordMapper.ifBuy(Lists.newArrayList(tenantAlbumId), sysUser.getId());
 
-        if (buyTenantAlbumId != null) {
-            album.setIfBuy(true);
-        } else {
-            album.setIfBuy(false);
-        }
+        album.setIfBuy(CollectionUtils.isNotEmpty(buyTenantAlbumId));
 
 
         //查询对应专辑的详情
@@ -472,30 +489,30 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         //计算符合条件的个数
         if (CollectionUtils.isNotEmpty(MusicSheetIds)) {
             size = musicSheetService.lambdaQuery().in(MusicSheet::getId, MusicSheetIds).eq(MusicSheet::getState, true)
-                    .eq(MusicSheet::getDelFlag, false).count();
+                .eq(MusicSheet::getDelFlag, false).count();
         }
         //Integer musicNum = tenantAlbum.getMusicNum();
 
         //获取合奏曲目数量
         List<TenantAlbumMusic> ensembleLits = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "ENSEMBLE")
-                .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-                .eq(TenantAlbumMusic::getDelFlag, false).list();
+            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
+            .eq(TenantAlbumMusic::getDelFlag, false).list();
         List<Long> ensembleMusicSheetIds = ensembleLits.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
 
         album.setEnsembleCounts(ensembleMusicSheetIds.size());
 
         //获取小曲目的曲目数量
         List<TenantAlbumMusic> musicLists = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "MUSIC")
-                .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-                .eq(TenantAlbumMusic::getDelFlag, false).list();
+            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
+            .eq(TenantAlbumMusic::getDelFlag, false).list();
         List<Long> musicSheetIds = musicLists.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
 
         album.setMusicCounts(musicSheetIds.size());
 
         //获取声部的曲目数量
         List<TenantAlbumMusic> subjectLists = tenantAlbumMusicService.lambdaQuery().eq(TenantAlbumMusic::getSubjectType, "SUBJECT")
-                .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
-                .eq(TenantAlbumMusic::getDelFlag, false).list();
+            .eq(TenantAlbumMusic::getTenantAlbumId, tenantAlbumId)
+            .eq(TenantAlbumMusic::getDelFlag, false).list();
         List<Long> subjectSheetIds = subjectLists.stream().map(TenantAlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
 
         album.setSubjectCounts(subjectSheetIds.size());
@@ -524,6 +541,107 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         return album;
     }
 
+    @Nullable
+    private TenantAlbumWrapper.TenantAlbum getTenantAlbum(SysUser sysUser, TenantAlbumWrapper.TenantAlbum album, List<Long> tenantAlbumIds) {
+        StudentVo detail = detailStudent(sysUser.getId());
+
+        // 判断是否是机构学生 机构学生 检测机构专辑购买记录
+        TenantInfo tenantInfo = tenantInfoService.detail(detail.getTenantId());
+        if (tenantInfo == null) {
+            return album;
+        }
+
+        // 判断小组有没有曲目 ,小组有曲目有专辑
+        TenantGroupAlbumWrapper.BuyTenantAlbumQuery query = new TenantGroupAlbumWrapper.BuyTenantAlbumQuery();
+        query.setTenantAlbumIds(tenantAlbumIds);
+        List<TenantGroupAlbumWrapper.BuyTenantAlbum> buyAlbumInfo = tenantGroupAlbumMapper.getBuyAlbumInfo(query);
+        if (CollectionUtils.isNotEmpty(buyAlbumInfo)) {
+            album.setTenantAlbumStatus(1);
+        }  else {
+            album.setTenantAlbumStatus(0);
+            return album;
+        }
+
+        tenantAlbumIds = buyAlbumInfo.stream().map(TenantGroupAlbumWrapper.BuyTenantAlbum::getId).collect(Collectors.toList());
+
+        //获取对应机构专辑状态
+        List<TenantAlbum> albumList = tenantAlbumService.lambdaQuery()
+            .in(TenantAlbum::getId, tenantAlbumIds)
+            .list();
+        if (CollectionUtils.isEmpty(albumList)) {
+            throw new BizException("专辑不存在");
+        }
+        //查询是否已经购买专辑
+        List<Long> ifedBuy = userTenantAlbumRecordMapper.ifBuy(tenantAlbumIds, sysUser.getId());
+
+        if (CollectionUtils.isNotEmpty(ifedBuy)) {
+            album.setIfBuy(true);
+            album.setTenantAlbumStatus(2);
+            tenantAlbumIds = ifedBuy;
+        } else {
+            album.setIfBuy(false);
+        }
+
+
+        //查询对应专辑的详情
+//        TenantAlbum tenantAlbum = albumList.get(0);
+        //机构专辑曲目数
+
+        List<TenantAlbumMusic> list = tenantAlbumMusicMapper.getByAlbumAndEnable(tenantAlbumIds);
+        // 根据专辑ID分组 在根据声部分类 分组
+        Map<Long, Map<SubjectTypeEnum, Long>> map = list.stream()
+            .collect(Collectors.groupingBy(TenantAlbumMusic::getTenantAlbumId, Collectors.groupingBy(TenantAlbumMusic::getSubjectType,Collectors.counting())));
+
+        Set<String> subjectTypes = new HashSet<>();
+
+        int size = 0;
+        int musicSize = 0;
+        int ensembleSize = 0;
+        int subjectSize = 0;
+        for (TenantGroupAlbumWrapper.BuyTenantAlbum buyTenantAlbum : buyAlbumInfo) {
+            Map<SubjectTypeEnum, Long> subjectTypeEnumLongMap = map.get(buyTenantAlbum.getId());
+            if (subjectTypeEnumLongMap != null) {
+                buyTenantAlbum.setMusicCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.MUSIC,0L).intValue());
+                buyTenantAlbum.setEnsembleCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.ENSEMBLE,0L).intValue());
+                buyTenantAlbum.setSubjectCounts(subjectTypeEnumLongMap.getOrDefault(SubjectTypeEnum.SUBJECT,0L).intValue());
+            } else {
+                buyTenantAlbum.setMusicCounts(0);
+                buyTenantAlbum.setEnsembleCounts(0);
+                buyTenantAlbum.setSubjectCounts(0);
+            }
+            buyTenantAlbum.setMusicNum(buyTenantAlbum.getMusicCounts() + buyTenantAlbum.getEnsembleCounts()+buyTenantAlbum.getSubjectCounts());
+            if (buyTenantAlbum.getMusicNum() > 0) {
+                subjectTypes.add(SubjectTypeEnum.MUSIC.name());
+            }
+            if (buyTenantAlbum.getEnsembleCounts() > 0) {
+                subjectTypes.add(SubjectTypeEnum.ENSEMBLE.name());
+            }
+            if (buyTenantAlbum.getSubjectCounts() > 0) {
+                subjectTypes.add(SubjectTypeEnum.SUBJECT.name());
+            }
+            size += buyTenantAlbum.getMusicNum();
+            musicSize += buyTenantAlbum.getMusicCounts();
+            ensembleSize += buyTenantAlbum.getEnsembleCounts();
+            subjectSize += buyTenantAlbum.getSubjectCounts();
+
+        }
+
+        //机构专辑简介
+        album.setEnsembleCounts(ensembleSize);
+        album.setMusicCounts(musicSize);
+        album.setSubjectCounts(subjectSize);
+//        album.setId(String.valueOf(tenantAlbum.getId()));
+//        album.setName(tenantAlbum.getName());
+//        album.setCoverImg(tenantAlbum.getCoverImg());
+        album.setMusicNum(size);
+//        album.setDescribe(tenantAlbum.getDescribe());
+        album.setSubjectTypes(subjectTypes.stream().collect(Collectors.joining(",")));
+//        album.setCostPrice(tenantAlbum.getCostPrice());
+//        album.setPurchaseCycle(tenantAlbum.getPurchaseCycle());
+//        album.setSalePrice(tenantAlbum.getSalePrice());
+        return album;
+    }
+
     @Override
     public void sendTenantAlbumMessage() {
         List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> userTenantAlbumRecords = baseMapper.selectTemporaryRecord();
@@ -561,6 +679,53 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
                 .one();
     }
 
+    @Override
+    public List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> list(UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+
+        List<Long> tenantAlbumIdList = new ArrayList<>();
+        Long tenantGroupId = query.getTenantGroupId();
+        if (tenantGroupId != null) { // 学生只看当前就够的专辑列表
+            QueryWrapper<TenantGroupAlbum> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda()
+                    .eq(TenantGroupAlbum::getTenantGroupId, tenantGroupId)
+                    .eq(TenantGroupAlbum::getDelFlag, false)
+                    .eq(TenantGroupAlbum::getStatus, true);
+            List<TenantGroupAlbum> tenantGroupAlbums = tenantGroupAlbumMapper.selectList(queryWrapper);
+            if (CollectionUtils.isEmpty(tenantGroupAlbums)) {
+                return new ArrayList<>();
+            }
+            tenantAlbumIdList = tenantGroupAlbums.stream().map(TenantGroupAlbum::getTenantAlbumId).distinct().collect(Collectors.toList());
+        }
+
+        List<UserTenantAlbumRecord> list = this.lambdaQuery()
+                .eq(UserTenantAlbumRecord::getUserId, query.getUserId())
+                .ge(query.getEndTime() != null, UserTenantAlbumRecord::getEndTime, query.getEndTime())
+                .in(CollectionUtils.isNotEmpty(tenantAlbumIdList), UserTenantAlbumRecord::getTenantAlbumId, tenantAlbumIdList)
+                .list();
+        if (list.size() == 0) {
+            return new ArrayList<>();
+        }
+
+        // 去重
+        list.sort(Comparator.comparing(UserTenantAlbumRecord::getEndTime));
+        List<UserTenantAlbumRecord> reverse = Lists.reverse(list);
+        List<UserTenantAlbumRecord> collect = reverse.stream()
+                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserTenantAlbumRecord::getTenantAlbumId))), ArrayList::new));
+
+        List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> userTenantAlbumRecords = JSON.parseArray(JSON.toJSONString(collect), UserTenantAlbumRecordWrapper.UserTenantAlbumRecord.class);
+        List<Long> tenantAlbumIds = userTenantAlbumRecords.stream().map(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord::getTenantAlbumId).collect(Collectors.toList());
+        Map<Long, TenantAlbum> albumIdMap = tenantAlbumService.lambdaQuery()
+                .in(TenantAlbum::getId, tenantAlbumIds)
+                .list().stream().collect(Collectors.toMap(TenantAlbum::getId, Function.identity()));
+
+        userTenantAlbumRecords.forEach(next -> {
+            TenantAlbum orDefault = albumIdMap.getOrDefault(next.getTenantAlbumId(), new TenantAlbum());
+            next.setTenantAlbumName(orDefault.getName());
+            next.setTenantAlbumCoverImg(orDefault.getCoverImg());
+        });
+        return userTenantAlbumRecords;
+    }
+
 
     private void temporarySend(Long userId, Long tenantAlbumId) {
         SysUser sysUser = sysUserFeignService.queryUserById(userId);

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java

@@ -41,6 +41,17 @@ public class MusicSheetVo extends MusicSheet {
     @ApiModelProperty("曲目来源名")
     private String  sourceName;
 
+    @ApiModelProperty("机构专辑ID,逗号隔开")
+    private String tenantAlbumId;
+
+    public String getTenantAlbumId() {
+        return tenantAlbumId;
+    }
+
+    public void setTenantAlbumId(String tenantAlbumId) {
+        this.tenantAlbumId = tenantAlbumId;
+    }
+
     public String getSourceName() {
         return sourceName;
     }

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

@@ -154,6 +154,9 @@ public class TenantActivationCodeWrapper {
         @ApiModelProperty("发放时间")
         private Date sendTime;
 
+        @ApiModelProperty("采购周期类型 DAY 日 MONTH 月 QUARTERLY 季度 YEAR_HALF 半年 YEAR 年")
+        private String purchaseType;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }

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

@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
 /**
@@ -32,25 +33,25 @@ import javax.validation.constraints.Size;
 public class TenantAlbumMusicWrapper {
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" TenantAlbumMusicQuery-机构专辑曲目")
     public static class TenantAlbumMusicQuery implements QueryInfo {
-    
-    	@ApiModelProperty("当前页")
+
+        @ApiModelProperty("当前页")
         private Integer page;
-        
+
         @ApiModelProperty("分页行数")
         private Integer rows;
-        
+
         @ApiModelProperty("关键字匹配")
-		private String keyword;
-        
+        private String keyword;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -58,11 +59,11 @@ public class TenantAlbumMusicWrapper {
         public static TenantAlbumMusicQuery from(String json) {
             return JSON.parseObject(json, TenantAlbumMusicQuery.class);
         }
-    }  
+    }
 
-	@ApiModel(" TenantAlbumMusic-机构专辑曲目")
+    @ApiModel(" TenantAlbumMusic-机构专辑曲目")
     public static class TenantAlbumMusic {
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -70,19 +71,20 @@ public class TenantAlbumMusicWrapper {
         public static TenantAlbumMusic from(String json) {
             return JSON.parseObject(json, TenantAlbumMusic.class);
         }
-	}
-
-
+    }
 
 
     @Data
     @ApiModel(" TenantAlbumMusicSelectQuery-机构专辑曲目查询对象")
     public static class TenantAlbumMusicSelect {
 
+        @ApiModelProperty("专辑ID")
+        private Long tenantAlbumId;
+
         @ApiModelProperty("声部分类(ENSEMBLE, MUSIC, SUBJECT)")
         private SubjectTypeEnum subjectType;
 
-        @ApiModelProperty(value = "用户ID",hidden = true)
+        @ApiModelProperty(value = "用户ID", hidden = true)
         private Long userId;
 
         public String jsonString() {
@@ -127,8 +129,6 @@ public class TenantAlbumMusicWrapper {
     }
 
 
-
-
     @Data
     @Builder
     @NoArgsConstructor
@@ -137,7 +137,8 @@ public class TenantAlbumMusicWrapper {
     public static class StudentTenantAlbumMusicQuery implements QueryInfo {
 
         @ApiModelProperty(value = "详情专辑id")
-        private String albumId;
+        @NotNull(message = "专辑id不能为空")
+        private Long albumId;
 
         @ApiModelProperty("当前页")
         private Integer page;
@@ -148,9 +149,6 @@ public class TenantAlbumMusicWrapper {
         @ApiModelProperty("关键字匹配")
         private String keyword;
 
-        /*@ApiModelProperty(value = "专辑id集合")
-        private List<Long> albumIds;*/
-
         @ApiModelProperty("声部分类(ENSEMBLE, MUSIC, SUBJECT)")
         private SubjectTypeEnum subjectType;
 
@@ -166,14 +164,11 @@ public class TenantAlbumMusicWrapper {
         @ApiModelProperty("标签")
         private Long musicTagId;
 
-        @ApiModelProperty("端类型")
+        @ApiModelProperty(value = "端类型",hidden = true)
         private ClientEnum clientType;
 
-        @ApiModelProperty("机构id")
-        private Long tenantId;
-
-        @ApiModelProperty(name = "集合")
-        private String collect;
+        @ApiModelProperty(value = "用户ID",hidden = true)
+        private Long userId;
 
 
         public String getKeyword() {
@@ -190,99 +185,60 @@ public class TenantAlbumMusicWrapper {
 
 
     }
-        @Data
-        @Builder
-        @NoArgsConstructor
-        @AllArgsConstructor
-        @ApiModel(" TenantAlbumMusic-学生端专辑曲目返回")
-        public static class StudentTenantAlbumMusic implements QueryInfo {
-            @ApiModelProperty(value = "曲目表id")
-            private Long id;
-
-            @ApiModelProperty(value = "精品标志")
-            private String exquisiteFlag;
-
-            @ApiModelProperty(value = "曲谱名称")
-            private String musicSheetName;
-
-            @ApiModelProperty(value = "封面图")
-            private String titleImg;  //曲谱名称
-
-            @ApiModelProperty(value = "曲谱来源(平台用户ID或者是老师ID)")
-            private Long userId;  //曲谱来源(平台用户ID或者是老师ID)
-
-            @ApiModelProperty(value = "艺术家")
-            private String composer;  //音乐家
-
-            @ApiModelProperty(value = "曲谱声部(适用的乐器,可能是多个,用逗号分隔)")
-            private String musicSubject;  //曲谱声部(适用的乐器,可能是多个,用逗号分隔)
-
-            @ApiModelProperty(value = "曲谱声部名称(适用的乐器,可能是多个,用逗号分隔)")
-            private String musicSubjectName;  //曲谱声部名称(适用的乐器,可能是多个,用逗号分隔)
-
-            @ApiModelProperty(value = "上传人")
-            private String userName;
-
-            @ApiModelProperty("曲目收藏数")
-            private Integer musicSheetLikeCounts;
-
-            @ApiModelProperty("1:收藏 0:未收藏")
-            private boolean favorite;
-
-            @ApiModelProperty("声谱类型,SINGLE:单曲,CONCERT:合奏")
-            private String musicSheetType;
-
-            public String jsonString() {
-                return JSON.toJSONString(this);
-            }
-
-            public static TenantAlbumMusic from(String json) {
-                return JSON.parseObject(json, TenantAlbumMusic.class);
-            }
-
-        }
-
 
     @Data
     @Builder
     @NoArgsConstructor
     @AllArgsConstructor
-    @ApiModel(" StudentMusicSheetQuery-学生端专辑曲目分页")
-    public static class StudentMusicSheetQuery implements QueryInfo {
+    @ApiModel(" TenantAlbumMusic-学生端专辑曲目返回")
+    public static class StudentTenantAlbumMusic implements QueryInfo {
+        @ApiModelProperty(value = "曲目表id")
+        private Long id;
 
-        @ApiModelProperty("当前页")
-        private Integer page;
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
 
-        @ApiModelProperty("分页行数")
-        private Integer rows;
+        @ApiModelProperty(value = "精品标志")
+        private String exquisiteFlag;
 
-        @ApiModelProperty("曲谱表ids")
-        private List<Long> musicSheetIds;
+        @ApiModelProperty(value = "曲谱名称")
+        private String musicSheetName;
 
-        @ApiModelProperty("标签")
-        private Long musicTagId;
+        @ApiModelProperty(value = "封面图")
+        private String titleImg;  //曲谱名称
 
-        @ApiModelProperty("声部id")
-        private Long subjectId;
+        @ApiModelProperty(value = "曲谱来源(平台用户ID或者是老师ID)")
+        private Long userId;  //曲谱来源(平台用户ID或者是老师ID)
 
-        @ApiModelProperty("关键词")
-        private String keyword;
+        @ApiModelProperty(value = "艺术家")
+        private String composer;  //音乐家
 
-        @ApiModelProperty(name = "集合")
-        private String collect;
+        @ApiModelProperty(value = "曲谱声部(适用的乐器,可能是多个,用逗号分隔)")
+        private String musicSubject;  //曲谱声部(适用的乐器,可能是多个,用逗号分隔)
 
+        @ApiModelProperty(value = "曲谱声部名称(适用的乐器,可能是多个,用逗号分隔)")
+        private String musicSubjectName;  //曲谱声部名称(适用的乐器,可能是多个,用逗号分隔)
 
+        @ApiModelProperty(value = "上传人")
+        private String userName;
 
+        @ApiModelProperty("曲目收藏数")
+        private Integer musicSheetLikeCounts;
+
+        @ApiModelProperty("1:收藏 0:未收藏")
+        private boolean favorite;
+
+        @ApiModelProperty("声谱类型,SINGLE:单曲,CONCERT:合奏")
+        private String musicSheetType;
 
         public String jsonString() {
             return JSON.toJSONString(this);
         }
 
-        public static StudentMusicSheetQuery from(String json) {
-            return JSON.parseObject(json, StudentMusicSheetQuery.class);
+        public static TenantAlbumMusic from(String json) {
+            return JSON.parseObject(json, TenantAlbumMusic.class);
         }
 
     }
 
-
-    }
+}

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

@@ -106,6 +106,10 @@ public class TenantAlbumPurchaseWrapper {
         @ApiModelProperty("采购状态")
         private String purchaseStatus;
 
+        @ApiModelProperty("采购周期类型 DAY 日 MONTH 月 QUARTERLY 季度 YEAR_HALF 半年 YEAR 年")
+        private String purchaseType;
+
+
         @ApiModelProperty("更新时间")
         private Date updateTime;
 

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

@@ -50,6 +50,9 @@ public class TenantAlbumWrapper {
         @ApiModelProperty("机构ID")
         private Long tenantId;
 
+        @ApiModelProperty("状态")
+        private Boolean status;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
@@ -145,6 +148,12 @@ public class TenantAlbumWrapper {
         @ApiModelProperty("曲目相关信息")
         private List<MusicSheetData> musicSheetData = new ArrayList<>();
 
+        @ApiModelProperty("采购周期类型")
+        private String purchaseTypes;
+
+        @ApiModelProperty("专辑采购金额")
+        private String purchaseJson;
+
 
         @ApiModelProperty("机构专辑有效期开始时间 ")
         @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -221,6 +230,9 @@ public class TenantAlbumWrapper {
         @ApiModelProperty(value = "采购周期", hidden = true)
         private Integer buyCycle;
 
+        @ApiModelProperty(value = "采购周期类型")
+        private String purchaseType;
+
         @ApiModelProperty(value = "采购机构", hidden = true)
         private Long tenantId;
 
@@ -368,5 +380,14 @@ public class TenantAlbumWrapper {
     }
 
 
+    @Data
+    public static class TenantAlbumPurchaseJson {
+
+        @ApiModelProperty("采购周期类型")
+        private String type;
+
+        @ApiModelProperty("金额")
+        private BigDecimal price;
+    }
 
 }

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

@@ -0,0 +1,290 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 机构小组专辑配置表
+ * 2024-01-24 13:32:00
+ */
+@ApiModel(value = "TenantGroupAlbumWrapper对象", description = "机构小组专辑配置表查询对象")
+public class TenantGroupAlbumWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantGroupAlbumQuery-机构小组专辑配置表")
+    public static class TenantGroupAlbumQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+        private String keyword;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("机构小组ID")
+        private Long tenantGroupId;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantGroupAlbumQuery from(String json) {
+            return JSON.parseObject(json, TenantGroupAlbumQuery.class);
+        }
+    }
+
+    @Data
+    @ApiModel(" TenantGroupAlbum-机构小组专辑配置表")
+    public static class TenantGroupAlbum {
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构小组ID")
+        @NotNull(message = "小组不能为空")
+        private Long tenantGroupId;
+
+        @ApiModelProperty("专辑ID")
+        @NotNull(message = "专辑ID不能为空")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("采购数量")
+        @NotNull(message = "有效期不能为空")
+        private Integer purchaseNum;
+
+        @ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("售价")
+        private BigDecimal actualPrice;
+
+        @ApiModelProperty("购买次数限制")
+        @NotNull(message = "购买次数限制不能为空")
+        private Boolean buyTimesFlag;
+
+        @ApiModelProperty("购买次数")
+        private Integer buyTimes = 0;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantGroupAlbum from(String json) {
+            return JSON.parseObject(json, TenantGroupAlbum.class);
+        }
+    }
+
+
+    @Data
+    @ApiModel("修改状态")
+    public static class UpdateStatus {
+
+        @ApiModelProperty("id")
+        @NotNull
+        private String ids;
+
+        @ApiModelProperty("状态")
+        @NotNull
+        private Boolean status;
+
+    }
+
+    @Data
+    @ApiModel("修改状态")
+    public static class Remove {
+
+        @ApiModelProperty("id")
+        @NotNull
+        private Long id;
+    }
+
+    @Data
+    @ApiModel(" TenantGroupAlbum-机构小组专辑配置表")
+    public static class TenantGroupAlbumVo {
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构小组ID")
+        private Long tenantGroupId;
+
+        @ApiModelProperty("专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("采购数量")
+        private Integer purchaseNum;
+
+        @ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("售价")
+        private BigDecimal actualPrice;
+
+        @ApiModelProperty("购买次数限制")
+        private Boolean buyTimesFlag;
+
+        @ApiModelProperty("购买次数")
+        private Integer buyTimes;
+
+        @ApiModelProperty("状态")
+        private Boolean status;
+
+        @ApiModelProperty("采购周期")
+        private String purchasePeriod;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("创建人")
+        private Long createBy;
+
+        @ApiModelProperty("更新人")
+        private Long updateBy;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("机构小组名称")
+        private String tenantGroupName;
+
+        @ApiModelProperty("专辑名称")
+        private String tenantAlbumName;
+
+    }
+    @Data
+    @ApiModel(" BuyTenantAlbumQuery-可购买机构专辑信息查询")
+    public static class BuyTenantAlbumQuery {
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("小组ID")
+        private Long tenantGroupId;
+
+        @ApiModelProperty("机构小组专辑ID")
+        private Long tenantGroupAlbumId;
+
+        @ApiModelProperty("专辑ID集合")
+        private List<Long> tenantAlbumIds;
+    }
+
+
+
+    @Data
+    @ApiModel(" BuyTenantAlbum-可购买机构专辑信息")
+    public static class BuyTenantAlbum {
+
+        @ApiModelProperty("专辑ID")
+        private Long id;
+
+
+        @ApiModelProperty("专辑名称")
+        private String name;
+
+        @ApiModelProperty("专辑介绍")
+        private String describe;
+
+        @ApiModelProperty("专辑封面")
+        private String coverImg;
+
+        @ApiModelProperty("曲目数")
+        private Integer musicNum;
+
+
+        @ApiModelProperty("曲目声部分类(多个,分隔)")
+        private String subjectTypes;
+
+
+        @ApiModelProperty("采购周期类型")
+        private String purchaseTypes;
+
+
+
+        @ApiModelProperty("采购金额数据")
+        private String purchaseJson;
+
+
+        @ApiModelProperty("合奏曲目数量")
+        private Integer EnsembleCounts;
+
+        @ApiModelProperty("小曲目数量")
+        private Integer MusicCounts;
+
+        @ApiModelProperty("声部曲目数")
+        private Integer SubjectCounts;
+
+        @ApiModelProperty("机构小组专辑ID ,学生购买需传参")
+        private Long tenantGroupAlbumId;
+
+        @ApiModelProperty("机构小组ID")
+        private Long tenantGroupId;
+
+
+        @ApiModelProperty("采购数量")
+        private Integer purchaseNum;
+
+        @ApiModelProperty("采购周期")
+        private String purchasePeriod;
+
+        @ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("售价")
+        private BigDecimal actualPrice;
+
+
+        @ApiModelProperty("购买次数限制")
+        private Boolean buyTimesFlag;
+
+        @ApiModelProperty("可购买次数")
+        private Integer buyTimes;
+
+        @ApiModelProperty("已购买次数")
+        private Integer buyedTimes;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantGroupAlbum from(String json) {
+            return JSON.parseObject(json, TenantGroupAlbum.class);
+        }
+    }
+
+
+    @Data
+    public static class TenantGroupAlbumCount {
+
+        private Long tenantGroupId;
+
+        private Integer count;
+    }
+
+}

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupWrapper.java

@@ -49,6 +49,9 @@ public class TenantGroupWrapper {
         @ApiModelProperty("机构小组负责人")
         private Long adminId;
 
+        @ApiModelProperty("机构专辑")
+        private Long tenantAlbumId;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
@@ -102,6 +105,9 @@ public class TenantGroupWrapper {
         @ApiModelProperty("群成员数量")
         private Integer groupUserCount = 0;
 
+        @ApiModelProperty("专辑数量")
+        private Integer albumCount = 0;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }

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

@@ -825,6 +825,10 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("优惠券Id")
         private Long couponId;
 
+
+        @ApiModelProperty("学生购买机构专辑时的小组ID")
+        private Long tenantGroupAlbumId;
+
         @ApiModelProperty(value = "活动id", hidden = true)
         private Long activityId;
 

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java

@@ -54,6 +54,12 @@ public class UserTenantAlbumRecordWrapper {
         @ApiModelProperty("ORDER:激活码激活,TENANT:自行购买,BACKEND_GIVE:后台添加")
         private SourceTypeEnum sourceType;
 
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("小组ID")
+        private Long tenantGroupId;
+
         
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
@@ -93,6 +99,9 @@ public class UserTenantAlbumRecordWrapper {
         @ApiModelProperty("机构专辑ID")
         private String tenantAlbumName;
 
+        @ApiModelProperty("机构专辑ID")
+        private String tenantAlbumCoverImg;
+
         @ApiModelProperty("订单号")
         private String orderNo;
 

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/music/MusicCompareWrapper.java

@@ -438,5 +438,8 @@ public class MusicCompareWrapper {
 
         @ApiModelProperty("排序")
         private Integer sort = 0;
+
+        @ApiModelProperty("机构专辑ID,逗号隔开")
+        private String tenantAlbumId;
     }
 }

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

@@ -21,7 +21,7 @@
     <select id="selectPage"
             resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper$TenantActivationCode">
         SELECT
-        <include refid="baseColumns"/>, ta.purchase_cycle_ as purchaseCycle, su.username_ as activationUserName,
+        <include refid="baseColumns"/>, ta.purchase_cycle_ as purchaseCycle, su.username_ as activationUserName,ta.purchase_type_ as purchaseType,
         su.avatar_ as activationUserAvatar
         FROM tenant_activation_code t
         LEFT JOIN tenant_album_purchase ta on t.tenant_album_purchase_id_ = ta.id_

+ 5 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml

@@ -19,6 +19,8 @@
         , t.cost_price_ AS costPrice
         , t.category_type_id_ AS categoryTypeId
         , t.category_level_id_ AS categoryLevelId
+        , t.purchase_types_ AS purchaseTypes
+        , t.purchase_json_ AS purchaseJson
     </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper$TenantAlbum">
@@ -39,6 +41,9 @@
             <if test="param.tenantId != null ">
                 and i.id_= #{param.tenantId}
             </if>
+            <if test="param.status != null">
+                and t.status_ = #{param.status}
+            </if>
         </where>
         order by t.create_time_ DESC
     </select>

+ 32 - 17
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml

@@ -27,33 +27,35 @@
         m.title_img_ as titleImg,
         m.exquisite_flag_ as exquisiteFlag,
         m.music_sheet_type_ as musicSheetType,
-        u.username_ as userName,
-        s.name_ as musicSubjectName
+        t.tenant_album_id_ as tenantAlbumId
 		FROM music_sheet m
-        left join  subject s on s.id_ = m.music_subject_
-        left join sys_user u on m.user_id_ = u.id_
+        left join tenant_album_music t on t.music_sheet_id_ = m.id_
         <where>
-            m.state_ = true
-            and m.del_flag_ = false
+            m.state_ = true and m.del_flag_ = 0 and t.del_flag_ = 0
             <if test="param.musicTagId != null ">
-                and m.music_tag_ = #{param.musicTagId}
+                and find_in_set(#{param.musicTagId},m.music_subject_)
             </if>
             <if test="param.subjectId != null" >
-                and m.music_subject_ = #{param.subjectId}
+                and find_in_set(#{param.subjectId},m.music_subject_)
             </if>
-            <if test="param.musicSheetIds != null and param.musicSheetIds.size != 0">
-                and m.id_ in
-                <foreach collection="param.musicSheetIds" item="item" separator="," open="(" close=")">
-                    #{item}
-                </foreach>
+            <if test="param.subjectType != null">
+                and t.subject_type_ = #{param.subjectType}
             </if>
+            <if test="param.level != null and param.level != ''">
+                and t.level_ = #{param.level}
+            </if>
+            <if test="param.type != null and param.type != ''">
+                and t.type_ = #{param.type}
+            </if>
+            <if test="param.albumId != null">
+                and t.tenant_album_id_ = #{param.albumId}
+            </if>
+
             <if test="param.keyword != null and param.keyword != ''">
                 and m.music_sheet_name_ LIKE CONCAT('%',#{param.keyword},'%')
             </if>
         </where>
-        <if test="param.musicSheetIds != null and param.musicSheetIds.size != 0">
-            order by field(m.id_,${param.collect})
-        </if>
+        order by t.sort_number_
 	</select>
     <select id="selectMusicSheetIds" resultType="java.lang.Long">
         select
@@ -84,6 +86,19 @@
         FROM tenant_album_music t
         left join tenant_album_ref t1 on t1.tenant_album_id_ = t.tenant_album_id_
         left join music_sheet t2 on t2.id_ = t.music_sheet_id_
-        where t2.state_ = 1 and t2.del_flag_ = 0 and t2.audit_version_ = 0 and t1.tenant_id_ = #{tenantId}
+        where t2.state_ = 1 and t2.del_flag_ = 0 and t2.audit_version_ = 0 and t1.tenant_id_ = #{tenantId} and t.del_flag_ = 0
+    </select>
+
+    <select id="getByAlbumAndEnable" resultType="com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic">
+        select
+        t.*
+        from tenant_album_music t
+        inner join music_sheet t1 on t.music_sheet_id_ = t1.id_
+        where
+        t.del_flag_ = 0 and t1.state_ = 1 and t1.del_flag_ = 0
+        and t.tenant_album_id_ in
+        <foreach collection="tenantAlbumIds" item="item" index="index" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
     </select>
 </mapper>

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

@@ -16,6 +16,7 @@
         , t.active_quantity_ AS activeQuantity
         , t.purchase_price_ AS purchasePrice
         , t.purchase_status_ AS purchaseStatus
+        , t.purchase_type_ AS purchaseType
         , t.active_status_ AS activeStatus
         , t.update_time_ AS updateTime
         , t.create_time_ AS createTime

+ 110 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantGroupAlbumMapper.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_group_id_ AS tenantGroupId
+        , t.tenant_album_id_ AS tenantAlbumId
+        , t.status_ AS status
+        , t.purchase_num_ AS purchaseNum
+        , t.purchase_period_ AS purchasePeriod
+        , t.original_price_ AS originalPrice
+        , t.actual_price_ AS actualPrice
+        , t.buy_times_flag_ AS buyTimesFlag
+        , t.buy_times_ AS buyTimes
+        , t.del_flag_ AS delFlag
+        , t.create_time_ AS createTime
+        , t.create_by_ AS createBy
+        , t.update_by_ AS updateBy
+        , t.update_time_ AS updateTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper$TenantGroupAlbumVo">
+		SELECT         
+        	<include refid="baseColumns" />
+        ,tg.name_ tenantGroupName
+        ,ta.name_ tenantAlbumName
+		FROM tenant_group_album t
+        LEFT JOIN tenant_group tg ON t.tenant_group_id_ = tg.id_
+        LEFT JOIN tenant_album ta ON t.tenant_album_id_ = ta.id_
+        <where>
+            t.del_flag_ = 0
+            <if test="param.tenantAlbumId != null">
+                AND t.tenant_album_id_ = #{param.tenantAlbumId}
+            </if>
+            <if test="param.tenantId != null">
+                AND tg.tenant_id_ = #{param.tenantId}
+            </if>
+            <if test="param.tenantGroupId != null">
+                AND tg.id_ = #{param.tenantGroupId}
+            </if>
+        </where>
+	</select>
+
+    <select id="getBuyAlbumInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper$BuyTenantAlbum">
+        SELECT
+        distinct
+            t.id_,
+        t.name_,
+        t.describe_,
+        t.cover_img_,
+        t.music_num_,
+        t.subject_types_,
+        t.purchase_types_,
+        t.purchase_json_
+        <if test="param.tenantGroupId != null or param.tenantGroupAlbumId != null">
+            ,
+            t2.id_ as tenantGroupAlbumId,
+            t2.tenant_group_id_,
+            t2.purchase_num_,
+            t2.purchase_period_,
+            t2.original_price_,
+            t2.actual_price_,
+            t2.buy_times_flag_,
+            t2.buy_times_
+        </if>
+        from tenant_album t
+
+        <if test="param.tenantGroupId != null or param.tenantGroupAlbumId != null">
+            left join tenant_group_album t2 on t2.tenant_album_id_ = t.id_
+        </if>
+        <if test="param.tenantId != null">
+            left join tenant_album_ref t1 on t1.tenant_album_id_ = t.id_
+        </if>
+        <where>
+            t.del_flag_ = 0 and t.status_ = 1
+            <if test="param.tenantId != null">
+                and t1.tenant_id_ = #{param.tenantId}
+            </if>
+            <if test="param.tenantGroupId != null  or param.tenantGroupAlbumId != null">
+                and t2.status_ = 1 and t2.del_flag_ = 0
+                <if test="param.tenantGroupId != null">
+                    and t2.tenant_group_id_ = #{param.tenantGroupId}
+                </if>
+                <if test="param.tenantGroupAlbumId != null">
+                    and t2.id_ = #{param.tenantGroupAlbumId}
+                </if>
+            </if>
+            <if test="param.tenantAlbumIds != null and param.tenantAlbumIds.size() != 0">
+                and t.id_ in
+                <foreach collection="param.tenantAlbumIds" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <select id="countGroupAlbumByGroupId" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper$TenantGroupAlbumCount">
+        select t.tenant_group_id_ as tenantGroupId, count(1) as count
+        from tenant_group_album t
+        where find_in_set(t.tenant_group_id_, #{ids})
+          and t.del_flag_ = 0
+          and t.status_ = 1
+        group by t.tenant_group_id_
+    </select>
+</mapper>

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

@@ -16,9 +16,12 @@
     </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantGroupWrapper$TenantGroup">
-        SELECT
+        SELECT DISTINCT
         <include refid="baseColumns" />
         FROM tenant_group t
+        <if test="param.tenantAlbumId != null">
+            LEFT JOIN tenant_group_album tga on t.id_ = tga.tenant_group_id_
+        </if>
         <where>
             <if test="param.keyword != null and param.keyword.trim() !=''">
                AND t.name_ like concat('%',#{param.keyword},'%')
@@ -29,6 +32,9 @@
             <if test="param.adminId != null">
                 AND t.admin_id_ = #{param.adminId}
             </if>
+            <if test="param.tenantAlbumId != null">
+                AND tga.tenant_album_id_ = #{param.tenantAlbumId} AND tga.del_flag_=0 AND tga.status_=1
+            </if>
         </where>
         ORDER BY t.id_ DESC
     </select>

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

@@ -21,6 +21,7 @@
             <result column="plantform_fee_rate_" property="plantformFeeRate" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
+	        <result column="tenant_group_album_id_" property="tenantGroupAlbumId" />
 		</resultMap>
 
     <!-- 表字段 -->
@@ -43,6 +44,7 @@
         , t.plantform_fee_ as plantformFee
         , t.plantform_fee_rate_ as plantformFeeRate
         , t.account_config_ as accountConfig
+        , t.tenant_group_album_id_ as tenantGroupAlbumId
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>

+ 12 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -383,4 +383,16 @@
         user_order_detail uod ON uod.order_no_ = uo.order_no_
         WHERE pdmr.order_no_ = #{orderNo} LIMIT 1
     </select>
+
+    <select id="getStudentTenantAlbumNum" resultType="java.lang.Long">
+        select d.tenant_group_album_id_
+        from user_order t
+        left join user_order_detail d on t.order_no_ = d.order_no_
+        where t.status_ in ('WAIT_PAY','PAYING','PAID') and t.order_type_ = 'TENANT_ALBUM' and d.good_type_ = 'TENANT_ALBUM'
+        and t.user_id_ = #{userId}
+        and d.tenant_group_album_id_ in
+        <foreach collection="tenantGroupAlbumIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

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

@@ -65,8 +65,11 @@
         from user_tenant_album_record
         <where>
             end_time_ > now()
-            <if test="tenantAlbumId != null">
-                and tenant_album_id_ = #{tenantAlbumId}
+            <if test="tenantAlbumId != null and tenantAlbumId.size() != 0">
+                and tenant_album_id_ in
+                <foreach collection="tenantAlbumId" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
             </if>
             <if test="studentId != null">
                 and user_id_ = #{studentId}

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

@@ -81,7 +81,7 @@ public class TenantAlbumSheetController extends BaseController {
         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_STUDENT);
         IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page = tenantAlbumMusicService.selectPage(QueryInfo.getPage(query), query);
         return succeed((PageUtil.pageInfo(page)));

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

@@ -49,7 +49,7 @@ public class TenantAlbumSheetController extends BaseController {
         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.TEACHER);
         IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page = tenantAlbumMusicService.selectPage(QueryInfo.getPage(query), query);
         return succeed((PageUtil.pageInfo(page)));

+ 1 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumSheetController.java

@@ -63,7 +63,7 @@ public class TenantAlbumSheetController extends BaseController {
         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)));