Browse Source

Merge branch 'feature/0124' into test

Eric 1 year ago
parent
commit
2a4fabd99a
25 changed files with 573 additions and 65 deletions
  1. 21 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  2. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  3. 19 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java
  4. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  5. 278 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantAlbumController.java
  6. 46 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TenantGroupAlbumController.java
  7. 22 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  8. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  9. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  10. 41 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  11. 25 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  12. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java
  13. 19 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  14. 11 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupAlbumServiceImpl.java
  15. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  16. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  17. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  18. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java
  19. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  20. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupWrapper.java
  21. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java
  22. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  23. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml
  24. 3 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMusicMapper.xml
  25. 7 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantGroupMapper.xml

+ 21 - 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;
@@ -78,6 +82,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 +123,19 @@ public class StudentController extends BaseController {
                     break;
             }
         }
+        Long tenantAlbumPurchaseId = query.getTenantAlbumPurchaseId();
+        String tenantGroupId = query.getTenantGroupId();
+        if (tenantAlbumPurchaseId != null && StringUtils.isEmpty(tenantGroupId)) {
+            // 查询关联这个专辑对应的小组学生
+            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());
+            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/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) Long 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")

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

@@ -4,6 +4,8 @@ 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.UserTenantAlbumRecord;
 import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
@@ -24,6 +26,10 @@ 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.Date;
+import java.util.List;
+
 @Slf4j
 @Validated
 @RestController
@@ -33,6 +39,9 @@ public class UserTenantAlbumRecordController {
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
     @ApiOperation(value = "详情", notes = "购买训练工具记录-根据详情ID查询单条, 传入id")
     @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/detail', {'BACKEND'})")
     //@GetMapping("/detail/{id}")
@@ -53,6 +62,16 @@ 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();
+        query.setUserId(sysUser.getId());
+        query.setEndTime(new Date());
+        return R.from(userTenantAlbumRecordService.list(query));
+    }
+
 
     @ApiOperation(value = "查询详情")
     @PostMapping("/detail")

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

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

+ 22 - 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;
@@ -79,6 +83,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 +108,20 @@ public class StudentController extends BaseController {
         query.setLockFlag(UserLockFlag.NORMAL);
         query.setOrderBy("u.username_ asc");
 
+        Long tenantAlbumPurchaseId = query.getTenantAlbumPurchaseId();
+        String tenantGroupId = query.getTenantGroupId();
+        if (tenantAlbumPurchaseId != null && StringUtils.isEmpty(tenantGroupId)) {
+            // 查询关联这个专辑对应的小组学生
+            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());
+            query.setTenantGroupId(String.join(",", tenantGroupIds));
+        }
+
         IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
         List<StudentVo> rows = pages.getRecords();
 

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

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

+ 41 - 33
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;
@@ -397,8 +398,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,Long tenantAlbumId) {
+
         MusicSheetDetailVo detail = baseMapper.detail(id);
         if (detail == null) {
             throw new BizException("未找到曲目信息");
@@ -433,18 +441,43 @@ 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 (tenantAlbumId == null) {
+            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);
+
+            // 学生生效中的机构专辑
+            if (ClientEnum.STUDENT == userType) {
+                List<Long> tenantAlbumIds = userTenantAlbumRecordMapper.selectTenantIds(sysUser.getId());
+                if (CollectionUtils.isNotEmpty(tenantAlbumIds) && tenantAlbumIds.contains(tenantAlbumId)) {
+                    List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByIds(Lists.newArrayList(tenantAlbumId));
+                    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 +567,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

+ 25 - 1
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}$";
 
     /**
@@ -217,6 +221,17 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             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)
@@ -469,6 +484,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 +547,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);
                 }
             }

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

@@ -198,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)) {

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

@@ -220,7 +220,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 tenantAlbumRefService.getByAlbumId(tenantAlbum.getId());
         if (CollectionUtils.isEmpty(refList)) {
             log.error("订单创建前检测,专辑不在机构下,bizId={}", orderGoodsInfo.getBizId());
-            throw new BizException("用户不在当前机构");
+            throw new BizException("该专辑已不可购买");
         }
 
         // 机构ID集合
@@ -241,33 +241,39 @@ 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为空");
+                    throw new BizException("该专辑已不可购买");
                 }
                 // 判断机构小组专辑ID是否能购买,专辑ID和当前机构专辑ID是否对应
                 TenantGroupAlbum tenantGroupAlbum = tenantGroupAlbumService.getById(orderGoodsInfo.getTenantGroupAlbumId());
-                if (tenantGroupAlbum == null) {
+                if (tenantGroupAlbum == null || tenantGroupAlbum.getDelFlag() || !tenantGroupAlbum.getStatus()) {
                     log.error("订单创建前检测,学生购买机构专辑,机构小组专辑不存在,userId={},tenantGroupAlbumId={}", orderGoodsInfo.getUserId(), orderGoodsInfo.getTenantGroupAlbumId());
-                    throw new BizException("小组专辑不存在");
+                    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("小组专辑和当前购买专辑不对应");
+                    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("购买次数超过限制");
+                        throw new BizException("该专辑已不可购买");
                     }
                 }
 
@@ -292,31 +298,31 @@ 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("专辑不支持当前周期");
+                    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("专辑不支持当前周期");
+                    throw new BizException("该专辑已不可购买");
                 }
                 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("专辑不支持当前周期");
+                    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("专辑不支持当前周期");
+                    throw new BizException("该专辑已不可购买");
                 }
                 TenantAlbumWrapper.TenantAlbumPurchaseJson tenantAlbumPurchaseJson = first.get();
 

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

@@ -4,24 +4,18 @@ 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.TenantAlbumMusic;
-import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMusicMapper;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
-import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
-import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
-import com.yonge.cooleshow.biz.dal.service.TenantGroupAlbumService;
 
 import java.util.List;
 import java.util.Map;
@@ -47,6 +41,9 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
     @Autowired
     private TenantAlbumMusicMapper tenantAlbumMusicMapper;
 
+    @Autowired
+    private TeacherService teacherService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -111,6 +108,12 @@ public class TenantGroupAlbumServiceImpl extends ServiceImpl<TenantGroupAlbumMap
                 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("客户端类型错误");
         }

+ 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,"支付金额不匹配");
         }
 
         // 订单入库前处理流程

+ 31 - 0
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;
@@ -561,6 +562,36 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
                 .one();
     }
 
+    @Override
+    public List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> list(UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+        List<UserTenantAlbumRecord> list = this.lambdaQuery()
+                .eq(UserTenantAlbumRecord::getUserId, query.getUserId())
+                .ge(query.getEndTime() != null, UserTenantAlbumRecord::getEndTime, query.getEndTime())
+                .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);

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

@@ -108,6 +108,9 @@ public class TenantActivationCodeWrapper {
         @ApiModelProperty("周期")
         private Integer purchaseCycle;
 
+        @ApiModelProperty("周期类型")
+        private String purchaseType;
+
         @ApiModelProperty("机构专辑采购ID")
         private Long tenantAlbumPurchaseId;
 
@@ -154,6 +157,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);
         }

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

@@ -78,6 +78,9 @@ public class TenantAlbumMusicWrapper {
     @ApiModel(" TenantAlbumMusicSelectQuery-机构专辑曲目查询对象")
     public static class TenantAlbumMusicSelect {
 
+        @ApiModelProperty("专辑ID")
+        private Long tenantAlbumId;
+
         @ApiModelProperty("声部分类(ENSEMBLE, MUSIC, SUBJECT)")
         private SubjectTypeEnum subjectType;
 
@@ -192,6 +195,9 @@ public class TenantAlbumMusicWrapper {
         @ApiModelProperty(value = "曲目表id")
         private Long id;
 
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
         @ApiModelProperty(value = "精品标志")
         private String exquisiteFlag;
 

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

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

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

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

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

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

@@ -41,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>

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

@@ -26,7 +26,8 @@
         m.music_subject_ as musicSubject,
         m.title_img_ as titleImg,
         m.exquisite_flag_ as exquisiteFlag,
-        m.music_sheet_type_ as musicSheetType
+        m.music_sheet_type_ as musicSheetType,
+        t.tenant_album_id_ as tenantAlbumId
 		FROM music_sheet m
         left join tenant_album_music t on t.music_sheet_id_ = m.id_
         <where>
@@ -85,7 +86,7 @@
         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">

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