Przeglądaj źródła

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

刘俊驰 1 rok temu
rodzic
commit
aaa5ccebe4

+ 17 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MemberPriceSettingsController.java

@@ -48,6 +48,23 @@ public class MemberPriceSettingsController extends BaseController {
 		return succeed(memberPriceVo);
 	}
 
+
+
+    /**
+     * 查询单条
+     */
+    @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("/vipPermissions")
 	@ApiOperation(value = "查询vip权限")
 	public HttpResponseResult<List<SysConfig>> vipPermissions() {

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
@@ -20,6 +21,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 购买会员卡记录表 服务类
@@ -94,7 +96,7 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
      * @param clientEnum
      * @return
      */
-    List<VipCardRecord> getEfficientVipRecord(Long userId, ClientEnum clientEnum);
+    List<VipCardRecord> getEfficientVipRecord(List<Long> userId, ClientEnum clientEnum);
 
     /**
      * 用户会员信息
@@ -106,4 +108,13 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
     VipCardRecordWrapper.UserVip UserVipInfo(Long userId, ClientEnum clientEnum);
 
     void add(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord);
+
+    /**
+     * 获取用户会员类型
+     *
+     * @param studentIds
+     * @param client
+     * @return
+     */
+    Map<Long, EVipType> getVipTypeMapByUserIds(List<Long> studentIds, ClientEnum client);
 }

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

@@ -8,6 +8,7 @@ import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.mapper.UserMusicMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.UserMusicStarWrapper;
@@ -69,6 +70,9 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
     @Autowired
     private UserMusicMapper userMusicMapper;
 
+    @Autowired
+    private VipCardRecordService vipCardRecordService;
+
 
     /**
      * 查询详情
@@ -277,11 +281,16 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
         List<Long> studentIds = records.stream().filter(o -> o.getClientType() == ClientEnum.STUDENT).map(UserMusicWrapper.UserMusic::getUserId).collect(Collectors.toList());
 
         Map<Long, Student> studentMap = studentService.getMapByIds(studentIds);
+        // 学生vip状态
+        Map<Long, EVipType> studentVipTypeMap = vipCardRecordService.getVipTypeMapByUserIds(studentIds, ClientEnum.STUDENT);
 
 
         // 老师ID集合
         List<Long> teacherIds = records.stream().filter(o -> o.getClientType() == ClientEnum.TEACHER).map(UserMusicWrapper.UserMusic::getUserId).collect(Collectors.toList());
 
+        // 老师vip状态
+        Map<Long, EVipType> teacherVipTypeMap = vipCardRecordService.getVipTypeMapByUserIds(teacherIds, ClientEnum.TEACHER);
+
         Map<Long, Teacher> teacherMap = teacherService.getMapByIds(teacherIds);
         studentIds.addAll(teacherIds);
         Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> userMap = sysUserService.getMapByIds(studentIds);
@@ -301,7 +310,7 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
                 if (student != null) {
 
                     record.setSubjectId(student.getSubjectId());
-                    record.setVipFlag(student.getMembershipEndTime() != null && student.getMembershipEndTime().after(new Date()));
+                    record.setVipType(studentVipTypeMap.getOrDefault(student.getUserId(),EVipType.NOT_VIP));
                 }
                 if (StringUtil.isEmpty(record.getAvatar())) {
                     record.setAvatar(studentAvatar);
@@ -310,7 +319,7 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
                 Teacher teacher = teacherMap.get(record.getUserId());
                 if (teacher != null) {
                     record.setSubjectId(teacher.getSubjectId());
-                    record.setVipFlag(teacher.getMembershipEndTime() != null && teacher.getMembershipEndTime().after(new Date()));
+                    record.setVipType(teacherVipTypeMap.getOrDefault(teacher.getUserId(),EVipType.NOT_VIP));
                 }
                 if (StringUtil.isEmpty(record.getAvatar())) {
                     record.setAvatar(teacherAvatar);

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.beust.jcommander.internal.Lists;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
@@ -248,9 +249,12 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
      * @return
      */
     @Override
-    public List<VipCardRecord> getEfficientVipRecord(Long userId, ClientEnum clientEnum) {
+    public List<VipCardRecord> getEfficientVipRecord(List<Long> userId, ClientEnum clientEnum) {
+        if (CollectionUtils.isEmpty(userId)) {
+            return new ArrayList<>();
+        }
         return this.lambdaQuery()
-            .eq(VipCardRecord::getUserId, userId)
+            .in(VipCardRecord::getUserId, userId)
             .eq(VipCardRecord::getEfficientFlag, true)
             .eq(VipCardRecord::getClientType, clientEnum.name())
             .and(wrapper -> wrapper
@@ -272,7 +276,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     public VipCardRecordWrapper.UserVip UserVipInfo(Long userId, ClientEnum clientEnum) {
         // 获取生效中的会员记录
         VipCardRecordWrapper.UserVip userVip = new VipCardRecordWrapper.UserVip();
-        List<VipCardRecord> vipCardRecords = this.getEfficientVipRecord(userId,clientEnum);
+        List<VipCardRecord> vipCardRecords = this.getEfficientVipRecord(Lists.newArrayList(userId),clientEnum);
         if (CollectionUtils.isEmpty(vipCardRecords)) {
             userVip.setVipType(EVipType.NOT_VIP);
             // 判断有没有过期的会员类型
@@ -371,14 +375,41 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         }
     }
 
+    @Override
+    public Map<Long, EVipType> getVipTypeMapByUserIds(List<Long> studentIds, ClientEnum client) {
+
+        List<VipCardRecord> vipCardRecords = this.getEfficientVipRecord(studentIds,client);
+
+        // 根据用户ID分组
+        Map<Long, List<VipCardRecord>> vipCardRecordMap = vipCardRecords.stream().collect(Collectors.groupingBy(VipCardRecord::getUserId));
+        Map<Long, EVipType> vipTypeMap = new HashMap<>();
+        vipCardRecordMap.forEach((k, v) -> {
+            List<VipCardRecord> svipList = v.stream().filter(o -> o.getVipType() == EVipType.SVIP).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(svipList)) {
+                vipTypeMap.put(k, EVipType.SVIP);
+            } else {
+                List<VipCardRecord> vipList = v.stream().filter(o -> o.getVipType() == EVipType.VIP).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(vipList)) {
+                    vipTypeMap.put(k, EVipType.VIP);
+                }
+            }
+        });
+        return vipTypeMap;
+    }
+
     // 会员添加
     private void addVip(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord) {
         List<VipCardRecord> vipCardRecordList = this.lambdaQuery()
                 .eq(VipCardRecord::getClientType, addVipCardRecord.getClientType())
                 .eq(VipCardRecord::getUserId, addVipCardRecord.getUserId())
-                .ge(VipCardRecord::getEndTime, new Date())
+//                .ge(VipCardRecord::getEndTime, new Date())
                 .eq(VipCardRecord::getEfficientFlag, true)
-                .list();
+                .list()
+                .stream()
+                .filter(n -> n.getEndTime() == null || n.getEndTime().after(new Date()))
+                .sorted(Comparator.comparing(VipCardRecord::getStartTime))
+                .collect(Collectors.toList());
+
 
         EVipType addVipType = addVipCardRecord.getVipType();
         List<VipCardRecord> perpetualRecords = vipCardRecordList.stream()
@@ -388,7 +419,8 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             throw new BizException("已经是永久会员");
         }
 
-        Date startTime = new Date();
+        Date now = new Date();
+        Date startTime = now;
         // 没有会员信息
         if (vipCardRecordList.isEmpty()) {
             PeriodEnum period = addVipCardRecord.getType();
@@ -405,39 +437,39 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             return;
         }
 
-        // 存在会员信息
+        // 找到插入数据的位置
         int index = 0;
-        for (int i = 0; i < vipCardRecordList.size(); i++) {
-            VipCardRecord vipCardRecord = vipCardRecordList.get(i);
-            if (vipCardRecord.getVipType().equals(addVipType)) {
-                index = i;
-                startTime = vipCardRecord.getEndTime();
+        if (addVipType.equals(EVipType.VIP)) { // vip 放到最后
+            index = vipCardRecordList.size();
+            startTime = vipCardRecordList.stream().map(VipCardRecord::getEndTime).max(Date::compareTo).get();
+        }
+        if (addVipType.equals(EVipType.SVIP)) { //放到VIP的前面
+            index = (int) vipCardRecordList.stream().filter(n -> EVipType.SVIP.equals(n.getVipType())).count();
+            if (index > 0) {
+                startTime = vipCardRecordList.stream().filter(n -> EVipType.SVIP.equals(n.getVipType())).map(VipCardRecord::getEndTime).max(Date::compareTo).get();
             }
         }
-
         Date endDate = plusDate(startTime, addVipCardRecord.getType(), Long.valueOf(addVipCardRecord.getTimes()));
+        VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(addVipCardRecord), VipCardRecord.class);
+        newRecord.setSourceType(SourceTypeEnum.BACKEND_GIVE);
+        newRecord.setStatus(EVipRecordStatus.ADD);
+        newRecord.setStartTime(startTime);
+        newRecord.setEndTime(endDate);
+        newRecord.setDisplayFlag(true);
+        newRecord.setEfficientFlag(true);
+        save(newRecord);
+
         // 平移时间
         long plusMills = endDate == null ? 0L : (endDate.getTime() - startTime.getTime());
         for (int i = 0; i < vipCardRecordList.size(); i++) {
-            if (index == i) {
-                VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(addVipCardRecord), VipCardRecord.class);
-                addRecord.setSourceType(SourceTypeEnum.BACKEND_GIVE);
-                addRecord.setStatus(EVipRecordStatus.ADD);
-                addRecord.setStartTime(startTime);
-                addRecord.setEndTime(endDate);
-                addRecord.setDisplayFlag(true);
-                addRecord.setEfficientFlag(true);
-                save(addRecord);
-            }
-
-            if (i > index) {
-                VipCardRecord vipCardRecord = vipCardRecordList.get(i);
+            VipCardRecord vipCardRecord = vipCardRecordList.get(i);
+            if (i >= index) {
                 Long refId = null;
                 if (plusMills > 0L) {
                     VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
                     addRecord.setStatus(EVipRecordStatus.UPDATE);
-                    addRecord.setStartTime(new Date(vipCardRecord.getStartTime().getTime() - plusMills));
-                    addRecord.setEndTime(new Date(vipCardRecord.getEndTime().getTime() - plusMills));
+                    addRecord.setStartTime(new Date(Math.max(vipCardRecord.getStartTime().getTime(), now.getTime()) + plusMills));
+                    addRecord.setEndTime(new Date(vipCardRecord.getEndTime().getTime() + plusMills));
                     addRecord.setDisplayFlag(false);
                     addRecord.setEfficientFlag(true);
                     save(addRecord);

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserMusicWrapper.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.wrapper;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.common.enums.EUserMusicType;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
@@ -109,6 +110,10 @@ public class UserMusicWrapper {
         @ApiModelProperty(value = "是否会员")
         private Boolean vipFlag;
 
+
+        @ApiModelProperty(value = "vip类型 VIP:会员 SVIP:SVIP,NOT_VIP:不是vip")
+        private EVipType vipType;
+
         @ApiModelProperty("关联练习数据ID")
         private Long musicPracticeRecordId;
 

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

@@ -23,7 +23,7 @@ public class VipCardRecordWrapper {
         private EVipType vipType;
 
 
-        @ApiModelProperty(value = "vip类型 VIP:会员 SVIP:SVIP,ALL_VIP:全vip")
+        @ApiModelProperty(value = "vip过期类型 VIP:会员 SVIP:SVIP,ALL_VIP:全vip")
         private EVipType expireVipType;