Browse Source

学生机构训练工具

liujc 1 year ago
parent
commit
e36ba7336c
19 changed files with 560 additions and 78 deletions
  1. 1 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/enums/EClientType.java
  2. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  3. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  4. 97 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserTenantAlbumRecord.java
  5. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ClientEnum.java
  6. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  7. 7 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  8. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  9. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java
  10. 52 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  11. 58 63
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  12. 23 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  13. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  14. 88 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  15. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java
  16. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  17. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java
  18. 34 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  19. 13 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysSuggestionController.java

+ 1 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/enums/EClientType.java

@@ -11,6 +11,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum EClientType implements BaseEnum<String, EClientType> {
     TEACHER("老师端"),
     STUDENT("学生端"),
+    TENANT_STUDENT("机构-学生端"),
     SYSTEM("平台端"),
     WEBSITE("官网"),
     ;

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java

@@ -45,7 +45,7 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty(hidden = true)
     private List<Long> subjectIdList;
 
-    @ApiModelProperty(value = "曲目来源类型 TEACHER 老师 PLATFORM 平台")
+    @ApiModelProperty(value = "曲目来源类型 TEACHER 老师 PLATFORM 平台 TENANT 机构")
     private SourceTypeEnum sourceType;
 
     @ApiModelProperty("曲目状态(0:停用,1:启用))")

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -51,7 +51,8 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
     @TableField(value = "order_client_")
     private ClientEnum orderClient;
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 TENANT_ALBUM 平台专辑) " +
+            "老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
     @ApiModelProperty("订单描述信息 ")

+ 97 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserTenantAlbumRecord.java

@@ -0,0 +1,97 @@
+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 com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 购买训练工具记录
+ * 2023-07-24 13:32:24
+ */
+@Data
+@ApiModel(" UserTenantAlbumRecord-购买训练工具记录")
+@TableName("user_tenant_album_record")
+public class UserTenantAlbumRecord implements Serializable {
+
+    @ApiModelProperty("记录id") 
+    @TableId(value = "id_")
+    private Long id;
+
+    @ApiModelProperty("用户id") 
+	@TableField(value = "user_id_")
+    private Long userId;
+
+
+
+    @ApiModelProperty("机构ID")
+    @TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("机构专辑ID") 
+	@TableField(value = "tenant_album_id_")
+    private Long tenantAlbumId;
+
+    @ApiModelProperty("订单号") 
+	@TableField(value = "order_no_")
+    private String orderNo;
+
+    @ApiModelProperty("ORDER:订单") 
+	@TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+    @ApiModelProperty("购买人员类型 TEACHRE :老师端 STUDNET : 学生端") 
+	@TableField(value = "client_type_")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("订单详情号") 
+	@TableField(value = "sub_order_no_")
+    private String subOrderNo;
+
+    @ApiModelProperty("开始时间") 
+	@TableField(value = "start_time_")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间") 
+	@TableField(value = "end_time_")
+    private Date endTime;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("创建人") 
+	@TableField(value = "create_by_")
+    private Long createBy;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("时间类型 DAY:天 MONTH:月,YEAR:年") 
+	@TableField(value = "type_")
+    private String type;
+
+    @ApiModelProperty("添加时间数量") 
+	@TableField(value = "times_")
+    private Integer times;
+
+    @ApiModelProperty("消息发送 0、未发送 1、已发送提前3天消息 2、已发送会员过期消息 暂时不用") 
+	@TableField(value = "msg_status_")
+    private Boolean msgStatus;
+
+    @ApiModelProperty("备注") 
+	@TableField(value = "reason_")
+    private String reason;
+
+}

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

@@ -12,6 +12,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum ClientEnum implements BaseEnum<String, ClientEnum> {
     TEACHER("老师端"),
     STUDENT("学生端"),
+    TENANT_STUDENT("机构-学生端"),
     SYSTEM("平台端"),
     WEBSITE("官网"),
 

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

@@ -18,6 +18,7 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     PIANO_ROOM("琴房时长"),
     ACTI_REGIST("活动报名"),
     ALBUM("专辑购买"),
+    TENANT_ALBUM("平台专辑"),
     ;
     @EnumValue
     private String code;

+ 7 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java

@@ -11,10 +11,13 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum SourceTypeEnum implements BaseEnum<String, AuditStatusEnum> {
 
-    TEACHER("TEACHER"),
-    PLATFORM("PLATFORM"),
-    ACTIVITY("ACTIVITY"),
-    ORDER("ORDER"),
+    TEACHER("老师"),
+
+    // 机构,机构自己上传曲目 , 暂时没有
+    TENANT("机构"),
+    PLATFORM("平台"),
+    ACTIVITY("活动"),
+    ORDER("订单"),
 
 
     ;

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

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+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.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
+
+/**
+ * 购买训练工具记录
+ * 2023-07-24 13:32:24
+ */
+@Repository
+public interface UserTenantAlbumRecordMapper extends BaseMapper<UserTenantAlbumRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
+	 * @param param UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
+	 * @return List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
+	 */
+	List<UserTenantAlbumRecord> selectPage(@Param("page") IPage<UserTenantAlbumRecord> page, @Param("param") UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery param);
+	
+}

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

@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 机构表
  * 2023-07-21 17:26:59
@@ -39,5 +42,11 @@ public interface TenantInfoService extends IService<TenantInfo>  {
      * @return Boolean
      */
      Boolean update(TenantInfoWrapper.TenantInfo tenantInfo);
-     
+
+    /**
+     * 机构信息
+     *
+     * @param tenantIds 机构ID
+     */
+    Map<Long,TenantInfo> getMapByIds(List<Long> tenantIds);
 }

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

@@ -0,0 +1,52 @@
+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.UserTenantAlbumRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+
+/**
+ * 购买训练工具记录
+ * 2023-07-24 13:32:24
+ */
+public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserTenantAlbumRecord
+     */
+	UserTenantAlbumRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<UserTenantAlbumRecord>
+     * @param query UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
+     * @return IPage<UserTenantAlbumRecord>
+     */
+    IPage<UserTenantAlbumRecord> selectPage(IPage<UserTenantAlbumRecord> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query);
+	
+    /**
+     * 添加
+     * @param userTenantAlbumRecord UserTenantAlbumRecordWrapper.UserTenantAlbumRecord
+     * @return Boolean
+     */
+     Boolean add(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord);   
+
+    /**
+     * 更新
+     * @param userTenantAlbumRecord UserTenantAlbumRecordWrapper.UserTenantAlbumRecord
+     * @return Boolean
+     */
+     Boolean update(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord);
+
+    /**
+     * 获取最新的购买记录
+     *
+     * @param tenantId 机构ID
+     * @param userId 用户ID
+     * @param clientType 客户端类型
+     */
+    UserTenantAlbumRecord getNewestByTenantIdAndUserId(Long tenantId, Long userId, ClientEnum clientType);
+}

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

@@ -23,19 +23,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetAuditSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetSearch;
-import com.yonge.cooleshow.biz.dal.entity.AlbumMusicRelate;
-import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
-import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
-import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheetAuthRecord;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
-import com.yonge.cooleshow.biz.dal.entity.MusicTag;
-import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
-import com.yonge.cooleshow.biz.dal.entity.StudentStar;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
@@ -48,27 +36,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
-import com.yonge.cooleshow.biz.dal.service.AlbumMusicRelateService;
-import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
-import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
-import com.yonge.cooleshow.biz.dal.service.MusicFavoriteService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetAccompanimentService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetAuthRecordService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetPracticeRecordService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
-import com.yonge.cooleshow.biz.dal.service.MusicTagService;
-import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentStarService;
-import com.yonge.cooleshow.biz.dal.service.SubjectService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
 import com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo;
@@ -209,6 +177,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Autowired
     private MusicSheetService musicSheetService;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
     public MusicSheetDao getDao() {
         return musicSheetDao;
     }
@@ -245,34 +216,58 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             musicSheetService.updateMusicAlbumNumInfo(records);
         }
 
+        // 来源为机构的曲目设置机构名称
+        List<Long> tenantIds = records.stream()
+                .filter(o -> o.getSourceType() != null && o.getSourceType().equals(SourceTypeEnum.TENANT))
+                .map(o -> o.getUserId()).distinct()
+                .collect(Collectors.toList());
+
+        Map<Long, TenantInfo> tenantInfoMap = tenantInfoService.getMapByIds(tenantIds);
+        for (MusicSheetVo record : records) {
+            switch (record.getSourceType()) {
+                case TENANT:
+                    TenantInfo tenantInfo = tenantInfoMap.get(record.getUserId());
+                    if (tenantInfo != null) {
+                        record.setSourceName(tenantInfo.getName());
+                    }
+                    break;
+                case TEACHER:
+
+                case PLATFORM:
+                    record.setSourceName(record.getSourceType().getMsg());
+                default:
+                    break;
+            }
+        }
+
         return page.setRecords(records);
     }
 
     @Override
-	public IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId) {
+    public IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId) {
 
-		if (albumId == null) {
-			// 查询专辑下的所有曲目
+        if (albumId == null) {
+            // 查询专辑下的所有曲目
 
-			MusicSheet musicSheet = baseMapper.selectById(musicSheetId);
+            MusicSheet musicSheet = baseMapper.selectById(musicSheetId);
 
-			if (musicSheet != null) {
-				MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
-				query.setMusicTagIds(musicSheet.getMusicTag());
+            if (musicSheet != null) {
+                MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
+                query.setMusicTagIds(musicSheet.getMusicTag());
                 query.setAuditVersion(musicSheet.getAuditVersion());
-				return page.setRecords(baseMapper.selectPage(page, query));
-			}
-		} else {
-			// 查询带有当前曲目标签的所有曲目
-			MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
-			query.setId(albumId);
-			query.setType(2);
-			return page.setRecords(baseMapper.selectAlbumDetailPage(page, query));
-		}
-		return null;
-	}
-
-	@Override
+                return page.setRecords(baseMapper.selectPage(page, query));
+            }
+        } else {
+            // 查询带有当前曲目标签的所有曲目
+            MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
+            query.setId(albumId);
+            query.setType(2);
+            return page.setRecords(baseMapper.selectAlbumDetailPage(page, query));
+        }
+        return null;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean state(Long id, String reason, ClientEnum client) {
         MusicSheet musicSheet = this.getById(id);
@@ -479,7 +474,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     @Override
     public IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType) {
-    	List<MusicSheetVo> records = baseMapper.selectStudentMusicPage(page, query, clientType);
+        List<MusicSheetVo> records = baseMapper.selectStudentMusicPage(page, query, clientType);
 
         if (CollectionUtils.isNotEmpty(records)) {
 
@@ -556,8 +551,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             }
 
         }
-    	
-    	/*if(query.getMyself() != null && query.getMyself() == false){//首页
+
+        /*if(query.getMyself() != null && query.getMyself() == false){//首页
         	if(records == null || records.size() == 0){
         		query.setSubjectIds(null);
         		records = baseMapper.selectStudentMusicPage(page, query);
@@ -1462,17 +1457,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         String subjectIdsStr = musicSheet.getMusicSubject();
 
         // 置顶不做限制
-		// for (String subjectId : subjectIdsStr.split(",")) {
-		// 	Integer count = this.lambdaQuery().eq(MusicSheet::getDelFlag, YesOrNoEnum.NO).eq(MusicSheet::getTopFlag, YesOrNoEnum.YES)
-		// 			.eq(MusicSheet::getState, YesOrNoEnum.YES).apply(!subjectId.isEmpty(), "FIND_IN_SET ('" + subjectId + "',music_subject_)").count();
+        // for (String subjectId : subjectIdsStr.split(",")) {
+        // 	Integer count = this.lambdaQuery().eq(MusicSheet::getDelFlag, YesOrNoEnum.NO).eq(MusicSheet::getTopFlag, YesOrNoEnum.YES)
+        // 			.eq(MusicSheet::getState, YesOrNoEnum.YES).apply(!subjectId.isEmpty(), "FIND_IN_SET ('" + subjectId + "',music_subject_)").count();
         //     String topNum = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_TOP_NUM);
         //     if (StringUtil.isEmpty(topNum)) {
         //         throw new BizException("获取置顶配置失败");
         //     }
         //     if (count >= Integer.parseInt(topNum)) {
-		// 		throw new BizException("首页推荐数量达到[" +topNum+"]上限,请先取消其他曲谱推荐");
-		// 	}
-		// }
+        // 		throw new BizException("首页推荐数量达到[" +topNum+"]上限,请先取消其他曲谱推荐");
+        // 	}
+        // }
         musicSheet.setTopFlag(YesOrNoEnum.YES);
         return this.saveOrUpdate(musicSheet);
     }

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

@@ -11,15 +11,10 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -28,6 +23,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.ValueUtil;
@@ -70,6 +66,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private SubjectDao subjectDao;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -116,6 +118,20 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         // IM聊天用户ID
         studentHomeVo.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(detail.getUserId()), ClientEnum.STUDENT.name()));
 
+        // 判断是否是机构学生 机构学生 检测机构专辑购买记录
+        TenantInfo tenantInfo = tenantInfoService.detail(detail.getTenantId());
+        if (tenantInfo != null) {
+            UserTenantAlbumRecord record = userTenantAlbumRecordService.getNewestByTenantIdAndUserId(tenantInfo.getId(), detail.getUserId(), ClientEnum.STUDENT);
+            if (record == null || record.getEndTime().getTime() < System.currentTimeMillis()) {
+                studentHomeVo.setTenantAlbumFlag(YesOrNoEnum.NO);
+            } else {
+                studentHomeVo.setTenantAlbumFlag(YesOrNoEnum.YES);
+                studentHomeVo.setTenantAlbumStartTime(record.getStartTime());
+                studentHomeVo.setTenantAlbumEndTime(record.getEndTime());
+            }
+
+        }
+
         return studentHomeVo;
     }
 

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

@@ -3,6 +3,7 @@ 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 org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +12,11 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantInfoMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * 机构表
  * 2023-07-21 17:26:59
@@ -26,6 +32,9 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
      */
 	@Override
     public TenantInfo detail(Long id) {
+        if (id == null && id == -1) {
+            return null;
+        }
         
         return baseMapper.selectById(id);
     }
@@ -63,4 +72,23 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
         return this.updateById(JSON.parseObject(tenantInfo.jsonString(), TenantInfo.class));       
     }
+
+    /**
+     * 机构信息
+     *
+     * @param tenantIds 机构ID
+     */
+    @Override
+    public Map<Long, TenantInfo> getMapByIds(List<Long> tenantIds) {
+        if (CollectionUtils.isEmpty(tenantIds)) {
+            return new HashMap<>();
+        }
+        List<TenantInfo> list = this.lambdaQuery()
+                .in(TenantInfo::getId, tenantIds)
+                .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(TenantInfo::getId, tenantInfo -> tenantInfo));
+    }
 }

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

@@ -0,0 +1,88 @@
+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.enums.ClientEnum;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
+
+/**
+ * 购买训练工具记录
+ * 2023-07-24 13:32:24
+ */
+@Slf4j
+@Service
+public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbumRecordMapper, UserTenantAlbumRecord> implements UserTenantAlbumRecordService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserTenantAlbumRecord
+     */
+	@Override
+    public UserTenantAlbumRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<UserTenantAlbumRecord>
+     * @param query UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
+     * @return IPage<UserTenantAlbumRecord>
+     */
+    @Override
+    public IPage<UserTenantAlbumRecord> selectPage(IPage<UserTenantAlbumRecord> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param userTenantAlbumRecord UserTenantAlbumRecordWrapper.UserTenantAlbumRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord) {    	
+        
+        return this.save(JSON.parseObject(userTenantAlbumRecord.jsonString(), UserTenantAlbumRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param userTenantAlbumRecord UserTenantAlbumRecordWrapper.UserTenantAlbumRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord){
+
+        return this.updateById(JSON.parseObject(userTenantAlbumRecord.jsonString(), UserTenantAlbumRecord.class));       
+    }
+
+    /**
+     * 获取最新的购买记录
+     *
+     * @param tenantId   机构ID
+     * @param userId     用户ID
+     * @param clientType 客户端类型
+     */
+    @Override
+    public UserTenantAlbumRecord getNewestByTenantIdAndUserId(Long tenantId, Long userId, ClientEnum clientType) {
+        if (tenantId == null || userId == null || clientType == null) {
+            return null;
+        }
+        return this.lambdaQuery()
+                .eq(UserTenantAlbumRecord::getTenantId, tenantId)
+                .eq(UserTenantAlbumRecord::getUserId, userId)
+                .eq(UserTenantAlbumRecord::getClientType, clientType)
+                .orderByDesc(UserTenantAlbumRecord::getEndTime)
+                .last("limit 1")
+                .one();
+    }
+}

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

@@ -38,6 +38,17 @@ public class MusicSheetVo extends MusicSheet {
     @ApiModelProperty("单曲专辑数")
     private Integer albumNums;
 
+    @ApiModelProperty("曲目来源名")
+    private String  sourceName;
+
+    public String getSourceName() {
+        return sourceName;
+    }
+
+    public void setSourceName(String sourceName) {
+        this.sourceName = sourceName;
+    }
+
     public Integer getAlbumSortNumber() {
         return albumSortNumber;
     }

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
@@ -59,6 +61,47 @@ public class StudentHomeVo extends Student {
     @ApiModelProperty(value = "IM用户ID")
     private String imUserId;
 
+
+    @ApiModelProperty("机构专辑有效期开始时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date tenantAlbumStartTime;
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty("机构专辑有效期结束时间 ")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date tenantAlbumEndTime;
+
+
+    @ApiModelProperty(value = "学练工具是否有效 0否 1是")
+    private YesOrNoEnum tenantAlbumFlag;
+
+    public YesOrNoEnum getTenantAlbumFlag() {
+        return tenantAlbumFlag;
+    }
+
+    public void setTenantAlbumFlag(YesOrNoEnum tenantAlbumFlag) {
+        this.tenantAlbumFlag = tenantAlbumFlag;
+    }
+
+    public Date getTenantAlbumStartTime() {
+        return tenantAlbumStartTime;
+    }
+
+    public void setTenantAlbumStartTime(Date tenantAlbumStartTime) {
+        this.tenantAlbumStartTime = tenantAlbumStartTime;
+    }
+
+    public Date getTenantAlbumEndTime() {
+        return tenantAlbumEndTime;
+    }
+
+    public void setTenantAlbumEndTime(Date tenantAlbumEndTime) {
+        this.tenantAlbumEndTime = tenantAlbumEndTime;
+    }
+
     public String getHeardUrl() {
         return heardUrl;
     }

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

@@ -0,0 +1,63 @@
+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 java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 购买训练工具记录
+ * 2023-07-24 13:32:24
+ */
+@ApiModel(value = "UserTenantAlbumRecordWrapper对象", description = "购买训练工具记录查询对象")
+public class UserTenantAlbumRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" UserTenantAlbumRecordQuery-购买训练工具记录")
+    public static class UserTenantAlbumRecordQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserTenantAlbumRecordQuery from(String json) {
+            return JSON.parseObject(json, UserTenantAlbumRecordQuery.class);
+        }
+    }  
+
+	@ApiModel(" UserTenantAlbumRecord-购买训练工具记录")
+    public static class UserTenantAlbumRecord {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserTenantAlbumRecord from(String json) {
+            return JSON.parseObject(json, UserTenantAlbumRecord.class);
+        }
+	}
+
+}

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

@@ -0,0 +1,34 @@
+<?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.UserTenantAlbumRecordMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.user_id_ AS userId
+        , t.tenant_id_ AS tenantId
+        , t.tenant_album_id_ AS tenantAlbumId
+        , t.order_no_ AS orderNo
+        , t.source_type_ AS sourceType
+        , t.client_type_ AS clientType
+        , t.sub_order_no_ AS subOrderNo
+        , t.start_time_ AS startTime
+        , t.end_time_ AS endTime
+        , t.create_time_ AS createTime
+        , t.create_by_ AS createBy
+        , t.update_time_ AS updateTime
+        , t.type_ AS type
+        , t.times_ AS times
+        , t.msg_status_ AS msgStatus
+        , t.reason_ AS reason
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM user_tenant_album_record t
+	</select>
+    
+</mapper>

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

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.student.controller;
 
+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 io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -24,6 +27,9 @@ public class SysSuggestionController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentService studentService;
+
     @ApiOperation(value = "新增")
     @RequestMapping("sysSuggestion/add")
     public Object add(SysSuggestion sysSuggestion) {
@@ -31,11 +37,17 @@ public class SysSuggestionController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-        sysSuggestion.setUserId(sysUser.getId().longValue());
+        sysSuggestion.setUserId(sysUser.getId());
         sysSuggestion.setClientType("STUDENT");
         if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
             sysSuggestion.setMobileNo(sysUser.getPhone());
         }
+        // 查询学生是否是机构学生 机构学生设置来源为机构
+        Student student = studentService.getById(sysUser.getId());
+        if (student.getTenantId() !=null && student.getTenantId() != -1) {
+            sysSuggestion.setClientType(ClientEnum.TENANT_STUDENT.getCode());
+        }
+
         sysSuggestionService.insert(sysSuggestion);
         return succeed();
     }