浏览代码

Merge branch 'feature/0712_vip' into develop-new

刘俊驰 1 年之前
父节点
当前提交
325c64f56a
共有 20 个文件被更改,包括 192 次插入27 次删除
  1. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  2. 16 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java
  3. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  4. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java
  5. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  6. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetRelatedQueryInfo.java
  7. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  8. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  9. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  10. 18 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  11. 14 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  12. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  13. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  14. 21 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  15. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  16. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java
  17. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  18. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  19. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java
  20. 18 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

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

@@ -330,7 +330,7 @@ public class MusicSheetController extends BaseController {
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
     	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 

+ 16 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java

@@ -40,6 +40,22 @@ public class MemberPriceSettingsController extends BaseController {
 		return succeed(memberPriceSettingsService.detail(id)); 
 	}
 
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/check/{id}")
+    @ApiOperation(value = "检查会员是否有效", notes = "传入id")
+    public HttpResponseResult<Boolean> check(@PathVariable("id") Long id) {
+        MemberPriceSettingsVo detail = memberPriceSettingsService.detail(id);
+        if (detail == null) {
+            return succeed(false);
+        }else if (Boolean.FALSE.equals(detail.getStatus())) {
+            return succeed(false);
+        }
+        return succeed(true);
+    }
+
 	@PostMapping("/list")
 	@ApiOperation(value = "查询列表")
 	public HttpResponseResult<MemberPriceVo> list(@RequestBody MemberPriceSettingsSearch query) {

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

@@ -238,7 +238,7 @@ public class MusicSheetController extends BaseController {
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
     	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -177,7 +177,7 @@ public class MusicSheetController extends BaseController {
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
     	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo), queryInfo);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 }

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -71,6 +71,12 @@ public class OrderReq {
         private GoodTypeEnum goodType;
         @ApiModelProperty("商品名称 ")
         private String goodName;
+
+        @ApiModelProperty(value = "下单客户端 ",hidden = true)
+        private ClientEnum orderClient;
+        @ApiModelProperty(value = "vip剩余天数")
+        private Integer vipEndDays;
+
         @ApiModelProperty(value = "优惠券id")
         private Long couponId;
         @ApiModelProperty(value = "业务内容")
@@ -85,6 +91,22 @@ public class OrderReq {
         // 透传订单类型
         private OrderTypeEnum orderType;
 
+        public ClientEnum getOrderClient() {
+            return orderClient;
+        }
+
+        public void setOrderClient(ClientEnum orderClient) {
+            this.orderClient = orderClient;
+        }
+
+        public Integer getVipEndDays() {
+            return vipEndDays;
+        }
+
+        public void setVipEndDays(Integer vipEndDays) {
+            this.vipEndDays = vipEndDays;
+        }
+
         public BigDecimal getActualPrice() {
             return actualPrice;
         }

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

@@ -8,7 +8,17 @@ public class MusicSheetRelatedQueryInfo extends QueryInfo {
 	
 	private Long musicSheetId;
 
-	public Long getAlbumId() {
+    private Long subjectId;
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Long getAlbumId() {
 		return albumId;
 	}
 

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

@@ -106,6 +106,29 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty("指定关联专辑的曲目排在最后")
     private Long sortByAlbumIdDesc;
 
+
+    @ApiModelProperty(value = "不包含曲目ID",hidden = true)
+    private List<Long> excludeMusicIds;
+
+    @ApiModelProperty(value = "必须要匹配声部ID")
+    private List<Long> mustMatchSubjectIds;
+
+    public List<Long> getExcludeMusicIds() {
+        return excludeMusicIds;
+    }
+
+    public void setExcludeMusicIds(List<Long> excludeMusicIds) {
+        this.excludeMusicIds = excludeMusicIds;
+    }
+
+    public List<Long> getMustMatchSubjectIds() {
+        return mustMatchSubjectIds;
+    }
+
+    public void setMustMatchSubjectIds(List<Long> mustMatchSubjectIds) {
+        this.mustMatchSubjectIds = mustMatchSubjectIds;
+    }
+
     public SourceTypeEnum getProviderType() {
         return providerType;
     }

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

@@ -45,7 +45,7 @@ public interface MusicSheetService extends IService<MusicSheet> {
 
     IPage<MusicSheetVoResult> selectCbsPage(IPage<MusicSheetVo> page, MusicSheetSearch query);
     
-    IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId);
+    IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, MusicSheetRelatedQueryInfo queryInfo);
 
     /**
      * 曲目状态修改 启用、停用

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

@@ -21,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ActivityShareEnum;
@@ -90,10 +91,25 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         if (null == detail) {
             return HttpResponseResult.failed("未找到会员卡信息");
         }
+
+        if (!orderReqInfo.getOrderType().name().equals(detail.getVipType().getName())) {
+            return HttpResponseResult.failed("会员卡类型不匹配");
+        }
+
         if (Boolean.FALSE.equals(detail.getStatus())) {
             return HttpResponseResult.failed("会员卡已下架");
         }
 
+
+
+        // 判断会员剩余天数是否改变
+        if (detail.getVipType() == EVipType.SVIP) {
+            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderReqInfo.getUserId(), orderReqInfo.getOrderClient());
+            if (!userVip.getVipEndDays().equals(orderReqInfo.getVipEndDays())) {
+                return HttpResponseResult.failed(999, null, "您当前VIP天数更新,请刷新后尝试");
+            }
+        }
+
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         BigDecimal couponAmount = BigDecimal.ZERO;
         ActivityPlanVo activityPlanVo = activityPlanService.detail(orderReqInfo.getActivityId());
@@ -269,10 +285,19 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
             throw new BizException("未找到会员卡信息");
         }
 
+        if (!orderGoodsInfo.getGoodType().name().equals(detail.getVipType().getName())) {
+            throw new BizException("会员卡类型不匹配");
+        }
         if (Boolean.FALSE.equals(detail.getStatus())) {
             throw new BizException("会员卡已下架");
         }
 
+        // 判断会员剩余天数是否改变
+        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderGoodsInfo.getUserId(), orderGoodsInfo.getPaymentClient());
+        if (!userVip.getVipEndDays().equals(orderGoodsInfo.getVipEndDays())) {
+            throw new BizException(999,"您当前VIP天数更新,请刷新后尝试");
+        }
+
         BigDecimal couponAmount = BigDecimal.ZERO;
         ActivityPlanVo activityPlanVo = activityPlanService.detail(orderGoodsInfo.getActivityId());
 

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

@@ -260,24 +260,34 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId) {
+    public IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, MusicSheetRelatedQueryInfo queryInfo) {
 
-        if (albumId == null) {
+        if (queryInfo.getAlbumId() == null) {
             // 查询专辑下的所有曲目
 
-            MusicSheet musicSheet = baseMapper.selectById(musicSheetId);
+            MusicSheet musicSheet = baseMapper.selectById(queryInfo.getMusicSheetId());
 
             if (musicSheet != null) {
                 MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
                 query.setMusicTagIds(musicSheet.getMusicTag());
                 query.setAuditVersion(musicSheet.getAuditVersion());
+                query.setMusicSheetType(musicSheet.getMusicSheetType());
+                if (queryInfo.getSubjectId() !=null) {
+                    query.setSubjectIdList(Lists.newArrayList(queryInfo.getSubjectId()));
+                }
+                query.setExcludeMusicIds(Lists.newArrayList(queryInfo.getMusicSheetId()));
+                if (StringUtils.isNotBlank(musicSheet.getMusicSubject())) {
+                    List<Long> subjectIds = Arrays.stream(musicSheet.getMusicSubject().split(",")).filter(StringUtils::isNotBlank).map(Long::parseLong).collect(Collectors.toList());
+                    query.setMustMatchSubjectIds(subjectIds);
+                }
                 return page.setRecords(baseMapper.selectPage(page, query));
             }
         } else {
             // 查询带有当前曲目标签的所有曲目
             MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
-            query.setId(albumId);
+            query.setId(queryInfo.getAlbumId());
             query.setType(2);
+            query.setExcludeMusicIds(Lists.newArrayList(queryInfo.getMusicSheetId()));
             return page.setRecords(baseMapper.selectAlbumDetailPage(page, query));
         }
         return null;
@@ -729,6 +739,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
                 if (OrderStatusEnum.PAID.getCode().equals(musicSheetPurchaseRecord.getOrderStatus().getCode())) {
                     detail.setPlay(YesOrNoEnum.YES);
+                    detail.setBuyed(true);
                     return;
                 }
             }
@@ -782,6 +793,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     .count();
             if (count > 0) {
                 detail.setPlay(YesOrNoEnum.YES);
+                detail.setBuyed(true);
                 return;
             }
         }
@@ -795,7 +807,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByIds(tenantAlbumIds);
                 if (musicSheetIds.contains(detail.getId())) {
                     detail.setPlay(YesOrNoEnum.YES);
-                    return;
+                    detail.setBuyed(true);
                 }
             }
         } else if (ClientEnum.TEACHER == userType) {
@@ -805,7 +817,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByTenantIds(teacher.getTenantId());
                 if (musicSheetIds.contains(detail.getId())) {
                     detail.setPlay(YesOrNoEnum.YES);
-                    return;
+                    detail.setBuyed(true);
                 }
             }
         }

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

@@ -136,7 +136,20 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Override
     public StudentVo detail(Long userId) {
         StudentVo detail = baseMapper.detail(userId);
-        detail.setUserVip(vipCardRecordService.UserVipInfo(userId, ClientEnum.STUDENT));
+        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(userId, ClientEnum.STUDENT);
+        detail.setUserVip(userVip);
+        detail.setVipType(EUserVipType.NORMAL);
+        if (userVip != null) {
+            Date svipEndDate = userVip.getSvipEndDate();
+            Date vipEndDate = userVip.getVipEndDate();
+            if (svipEndDate != null && svipEndDate.after(new Date())) {
+                detail.setVipType(EUserVipType.SVIP);
+                detail.setMembershipEndTime(userVip.getSvipEndDate());
+            } else if (vipEndDate != null && vipEndDate.after(new Date())) {
+                detail.setVipType(EUserVipType.VIP);
+                detail.setMembershipEndTime(userVip.getVipEndDate());
+            }
+        }
         return detail;
     }
 

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

@@ -309,6 +309,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }).filter(Objects::nonNull).collect(Collectors.joining(","));
             teacherVo.setSubjectName(subjectNames);
         }
+
+
+
+
         return page.setRecords(teacherVos);
     }
 

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

@@ -196,6 +196,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         /**********订单完成后******************/
         //vip开通缴费
         orderSuccess.put(GoodTypeEnum.VIP, memberPriceSettingsService::orderSuccess);
+        orderSuccess.put(GoodTypeEnum.SVIP, memberPriceSettingsService::orderSuccess);
         //直播课程购买
         orderSuccess.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseSuccess);
         //陪练课购买
@@ -590,6 +591,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             info.setRecomUserId(orderReq.getRecomUserId());
             info.setActivityId(orderReq.getActivityId());
             info.setActualPrice(orderReq.getActualPrice());
+            info.setOrderClient(orderReq.getOrderClient());
             HttpResponseResult<OrderCreateRes> createResult = createFunction.apply(info);
             OrderCreateRes createRes = createResult.getData();
             if (!createResult.getStatus() || null == createRes || !createRes.getRes()) {

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

@@ -30,6 +30,8 @@ import com.yonge.cooleshow.biz.dal.dao.VipCardRecordDao;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -299,7 +301,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             if (CollectionUtils.isNotEmpty(svipList)) {
                 userVip.setVipType(EVipType.SVIP);
 
-                Optional<VipCardRecord> first = svipList.stream().filter(o -> o.getEndTime() == null).findFirst();
+                Optional<VipCardRecord> first = svipList.stream().filter(o -> o.getEndTime() == null && o.getType()==PeriodEnum.PERPETUAL).findFirst();
                 if (first.isPresent()) {
                     userVip.setVipType(EVipType.PERMANENT_SVIP);
                 } else {
@@ -390,8 +392,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         // 没有会员信息
         if (vipCardRecordList.isEmpty()) {
             PeriodEnum period = addVipCardRecord.getType();
-            LocalDate startLocalDate = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-            Date endDate = plusDate(startLocalDate, period, Long.valueOf(addVipCardRecord.getTimes()));
+            Date endDate = plusDate(startTime, period, Long.valueOf(addVipCardRecord.getTimes()));
 
             VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(addVipCardRecord), VipCardRecord.class);
             addRecord.setSourceType(SourceTypeEnum.BACKEND_GIVE);
@@ -414,8 +415,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             }
         }
 
-        LocalDate startLocalDate = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-        Date endDate = plusDate(startLocalDate, addVipCardRecord.getType(), Long.valueOf(addVipCardRecord.getTimes()));
+        Date endDate = plusDate(startTime, addVipCardRecord.getType(), Long.valueOf(addVipCardRecord.getTimes()));
         // 平移时间
         long plusMills = endDate == null ? 0L : (endDate.getTime() - startTime.getTime());
         for (int i = 0; i < vipCardRecordList.size(); i++) {
@@ -606,30 +606,38 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         this.save(vipCardRecord);
     }
 
-    private Date plusDate(LocalDate start, PeriodEnum period, long times) {
-        LocalDate end = null;
+    private Date plusDate(Date start, PeriodEnum period, long times) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(start);
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        LocalDateTime localDateTimeMaxTime =  calendar.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime end;
         switch (period) {
             case DAY:
-                end = start.minusDays(times);
+                end = localDateTimeMaxTime.plusDays(times);
                 break;
             case MONTH:
-                end = start.minusMonths(times);
+                end = localDateTimeMaxTime.plusMonths(times);
                 break;
             case QUARTERLY:
-                end = start.minusMonths(times * 3);
+                end = localDateTimeMaxTime.plusMonths(times * 3);
                 break;
             case YEAR_HALF:
-                end = start.minusMonths(times * 6);
+                end = localDateTimeMaxTime.plusMonths(times * 6);
                 break;
             case YEAR:
-                end = start.minusYears(times);
+                end = localDateTimeMaxTime.plusYears(times);
                 break;
             case PERPETUAL:
                 return null;
             default:
                 throw new BizException("不支持的扣减类型");
         }
-        return Date.from(end.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        return Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
     }
 
     // 发送会员到期3天消息推送

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java

@@ -28,6 +28,8 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("是否能播放(0:否,1:是) 学生端进入小酷Ai判断 试用/完整 播放")
     private YesOrNoEnum play;
 
+    @ApiModelProperty("是否购买(0:否,1:是)")
+    private Boolean buyed = false;
 
     @ApiModelProperty("收藏0:否,1:是")
     private YesOrNoEnum favorite;

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -86,6 +87,9 @@ public class StudentVo extends Student {
     @ApiModelProperty(value = "会员信息")
     private VipCardRecordWrapper.UserVip userVip;
 
+    @ApiModelProperty(value = "用户会员类型,普通用户:NORMAL,会员:VIP,SVIP:SVIP")
+    private EUserVipType vipType;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.common.enums.ESettlementFrom;
@@ -106,6 +107,9 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty(value = "会员信息")
     private VipCardRecordWrapper.UserVip userVip;
 
+    @ApiModelProperty(value = "用户会员类型,普通用户:NORMAL,会员:VIP,SVIP:SVIP")
+    private EUserVipType vipType;
+
 
     public YesOrNoEnum getDelFlag() {
         return delFlag;

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

@@ -846,6 +846,8 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("业务内容 ")
         private Object bizContent;
 
+        @ApiModelProperty(value = "vip剩余天数")
+        private Integer vipEndDays;
 
         @ApiModelProperty("商品数量 ")
         private Integer goodNum;

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java

@@ -32,14 +32,14 @@ public class VipCardRecordWrapper {
 
 
         @ApiModelProperty(value = "vip剩余天数")
-        private Integer vipEndDays;
+        private Integer vipEndDays =0;
 
         @ApiModelProperty(value = "svip结束时间")
         private Date svipEndDate;
 
 
         @ApiModelProperty(value = "svip剩余天数")
-        private Integer svipEndDays;
+        private Integer svipEndDays =0;
     }
 
     @ApiModel("添加/扣减会员")

+ 18 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -139,6 +139,18 @@
         </if>
         <where>
             1=1
+            <if test="param.excludeMusicIds != null and param.excludeMusicIds.size() != 0">
+                and t.id_ not in
+                <foreach collection="param.excludeMusicIds" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="param.mustMatchSubjectIds != null and param.mustMatchSubjectIds.size() != 0">
+                and
+                <foreach collection="param.mustMatchSubjectIds" separator="and" item="item" open="(" close=")">
+                    find_in_set(#{item},t.music_subject_)
+                </foreach>
+            </if>
             <include refid="QueryInfo"/>
             <if test="param.auditStatus == null">
                 AND t.cbs_music_sheet_id_ IS NOT NULL
@@ -277,6 +289,12 @@
             <if test="param.chargeType != null">
                 and t.charge_type_ = #{param.chargeType}
             </if>
+            <if test="param.excludeMusicIds != null and param.excludeMusicIds.size() != 0">
+                and t.id_ not in
+                <foreach collection="param.excludeMusicIds" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
             <if test="param.musicTagIds != null and param.musicTagIds != ''">
                 and
                 <foreach collection="param.musicTagIdList" separator="or" item="item"  open="(" close=")" >