浏览代码

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

刘俊驰 1 年之前
父节点
当前提交
c3ff9e1c45
共有 20 个文件被更改,包括 274 次插入226 次删除
  1. 11 10
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  2. 13 13
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  3. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UnitEnum.java
  4. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  5. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VipRecordSearch.java
  6. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  7. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  8. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  10. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  11. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  12. 97 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  13. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTimeServiceImpl.java
  14. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  15. 82 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  16. 5 119
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  17. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  18. 9 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java
  19. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  20. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

+ 11 - 10
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -288,16 +288,16 @@ public class StudentController extends BaseController {
         }
     }
 
-    @PostMapping("/addVip")
-    @ApiOperation(value = "添加会员")
-    @PreAuthorize("@pcs.hasPermissions('student/addVip')")
-    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
-        }
-        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.STUDENT, sysUser));
-    }
+//    @PostMapping("/addVip")
+//    @ApiOperation(value = "添加会员")
+//    @PreAuthorize("@pcs.hasPermissions('student/addVip')")
+//    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null || sysUser.getId() == null) {
+//            return failed("用户信息获取失败");
+//        }
+//        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.STUDENT, sysUser));
+//    }
 
 
     @PostMapping("/vipRecord")
@@ -305,6 +305,7 @@ public class StudentController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('student/vipRecord')")
     public HttpResponseResult<PageInfo<VipRecordVo>> vipRecord(@Valid @RequestBody VipRecordSearch recordSearch) {
 
+        recordSearch.setDisplayFlag(true);
         recordSearch.setClient(ClientEnum.STUDENT);
         return succeed(vipCardRecordService.vipRecord(recordSearch));
     }

+ 13 - 13
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -242,25 +242,25 @@ public class TeacherController extends BaseController {
         }
     }
 
-    @PostMapping("/addVip")
-    @ApiOperation(value = "添加会员")
-    @PreAuthorize("@pcs.hasPermissions('teacher/addVip')")
-    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
-
-
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null  || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
-        }
-        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.TEACHER,sysUser));
-    }
+//    @PostMapping("/addVip")
+//    @ApiOperation(value = "添加会员")
+//    @PreAuthorize("@pcs.hasPermissions('teacher/addVip')")
+//    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
+//
+//
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null  || sysUser.getId() == null) {
+//            return failed("用户信息获取失败");
+//        }
+//        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.TEACHER,sysUser));
+//    }
 
 
     @PostMapping("/vipRecord")
     @ApiOperation(value = "会员记录")
     @PreAuthorize("@pcs.hasPermissions('teacher/vipRecord')")
     public HttpResponseResult<PageInfo<VipRecordVo>> vipRecord(@Valid @RequestBody VipRecordSearch recordSearch) {
-
+        recordSearch.setDisplayFlag(false);
         recordSearch.setClient(ClientEnum.TEACHER);
         return succeed(vipCardRecordService.vipRecord(recordSearch));
     }

+ 1 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UnitEnum.java

@@ -22,6 +22,7 @@ public enum UnitEnum implements BaseEnum<String, UnitEnum> {
 //    YEAR("年"),
     QUARTERLY("季度"),
     YEAR_HALF("半年"),
+    PERPETUAL("永久"),
     ;
 
     @EnumValue

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

@@ -77,6 +77,9 @@ public class OrderReq {
         @ApiModelProperty(value = "vip剩余天数")
         private Integer vipEndDays;
 
+        @ApiModelProperty(value = "商品数量")
+        private Integer goodsNum = 1;
+
         @ApiModelProperty(value = "优惠券id")
         private Long couponId;
         @ApiModelProperty(value = "业务内容")
@@ -91,6 +94,15 @@ public class OrderReq {
         // 透传订单类型
         private OrderTypeEnum orderType;
 
+
+        public Integer getGoodsNum() {
+            return goodsNum;
+        }
+
+        public void setGoodsNum(Integer goodsNum) {
+            this.goodsNum = goodsNum;
+        }
+
         public ClientEnum getOrderClient() {
             return orderClient;
         }

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

@@ -45,6 +45,9 @@ public class VipRecordSearch extends QueryInfo {
     @ApiModelProperty("来源类型 : ACTIVITY :活动 ,ORDER:订单 PLATFORM:平台")
     private SourceTypeEnum sourceType;
 
+    @ApiModelProperty(value = "是否展示1:展示,0:隐藏",hidden = true)
+    private Boolean displayFlag;
+
     public SourceTypeEnum getSourceType() {
         return sourceType;
     }
@@ -94,4 +97,12 @@ public class VipRecordSearch extends QueryInfo {
     public void setSearch(String search) {
         this.search = search;
     }
+
+    public Boolean getDisplayFlag() {
+        return displayFlag;
+    }
+
+    public void setDisplayFlag(Boolean displayFlag) {
+        this.displayFlag = displayFlag;
+    }
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -95,4 +95,9 @@ public class UserOrderDetail implements Serializable {
     @TableField(value = "tenant_group_album_id_")
     private Long tenantGroupAlbumId;
 
+
+    @ApiModelProperty("业务数据")
+    @TableField(value = "biz_json_")
+    private String bizJson;
+
 }

+ 4 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -62,8 +62,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_JOIN_FANSGROUP("学员申请加入粉丝群"),
     STUDENT_AUTOJOIN_FANSGROUP("学员自动加入粉丝群"),
 
-    VIP_BUY_SUCCESS("会员购买成功"),
-    SMS_VIP_BUY_SUCCESS("会员购买成功(短信)"),
+//    VIP_BUY_SUCCESS("会员购买成功"),
+    NEW_VIP_BUY_SUCCESS("会员购买成功"),
+//    SMS_VIP_BUY_SUCCESS("会员购买成功(短信)"),
+    SMS_NEW_VIP_BUY_SUCCESS("会员购买成功(短信)"),
 
     VIP_EXPIRE_THIRTY_DAY("会员到期前30天"),
     SMS_VIP_EXPIRE_THIRTY_DAY("会员到期前30天(短信)"),

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

@@ -19,6 +19,7 @@ public enum SourceTypeEnum implements BaseEnum<String, AuditStatusEnum> {
     ACTIVITY("活动"),
     ORDER("订单"),
     BACKEND_GIVE("后台赠送"),
+    FREE_UPGRADE("免费升级"),
 
 
     ;

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

@@ -87,7 +87,7 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
      * @param sysUser
      * @return
      */
-    Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser);
+//    Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser);
 
     /**
      * 会员信息

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java

@@ -117,4 +117,7 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
      * @return
      */
     Map<Long, EVipType> getVipTypeMapByUserIds(List<Long> studentIds, ClientEnum client);
+
+    // 会员添加
+    void addVip(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord);
 }

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

@@ -317,7 +317,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             pianoRoomChangeRecord.setCreateTime(new Date());
             pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
             pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-        } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
+        } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP) || activityReward.getRewardType().equals(RewardTypeEnum.SVIP)) {
             // VIP
             memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward,
                                                       activityPlan.getId(), activityPlan.getActivityName());

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

@@ -38,6 +38,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -106,7 +107,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         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天数更新,请刷新后尝试");
+                return HttpResponseResult.failed(998, null, "您当前VIP天数更新,请刷新后尝试");
             }
         }
 
@@ -130,11 +131,14 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         orderCreateRes.setMerchId(0l);
         orderCreateRes.setBizId(detail.getId());
         orderCreateRes.setBizContent("会员卡购买-" + detail.getPeriod().getMsg());
-        orderCreateRes.setGoodNum(1);
+        orderCreateRes.setGoodNum(orderReqInfo.getGoodsNum());
         orderCreateRes.setOriginalPrice(detail.getOriginalPrice());
-        orderCreateRes.setCouponAmount(couponAmount);
+        orderCreateRes.setCouponAmount(couponAmount.multiply(new BigDecimal(orderReqInfo.getGoodsNum())));
         orderCreateRes.setExpectPrice(detail.getSalePrice());
         orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
+        UserPaymentOrderWrapper.VipDays vipDays = new UserPaymentOrderWrapper.VipDays();
+        vipDays.setVipEndDays(orderReqInfo.getVipEndDays());
+        orderCreateRes.setBizJson(JSON.toJSONString(vipDays));
         return HttpResponseResult.succeed(orderCreateRes);
     }
 
@@ -146,25 +150,87 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo,boolean messageFlag) {
 
-        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
+        if (null == orderDetailVo) {
+            return;
+        }
+        MemberPriceSettingsVo detail = detail(orderDetailVo.getBizId());
+
+
+        VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
+
+        addVipCardRecord.setUserId(orderDetailVo.getUserId());
+        addVipCardRecord.setClientType(orderDetailVo.getOrderClient());
+        addVipCardRecord.setStatus(EVipRecordStatus.ADD);
+        addVipCardRecord.setVipType(detail.getVipType());
+        if (detail.getPeriod() == PeriodEnum.PERPETUAL) {
+            addVipCardRecord.setVipType(EVipType.PERMANENT_SVIP);
+        }
+        addVipCardRecord.setType(detail.getPeriod());
+        addVipCardRecord.setTimes(orderDetailVo.getGoodNum());
+        addVipCardRecord.setSendMsg(false);
+        addVipCardRecord.setSourceType(SourceTypeEnum.ORDER);
+        addVipCardRecord.setCreateBy(orderDetailVo.getUserId());
+        vipCardRecordService.addVip(addVipCardRecord);
 
-        UserVipInfoVo userVipInfoVo = getUserVipInfoVo(vipCardRecord);
         //会员购买消息推送
         if (messageFlag) {
-            authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN), orderDetailVo.getOrderClient());
+
+            SysUser sysUser = sysUserFeignService.queryUserById(orderDetailVo.getUserId());
+            if (sysUser == null) {
+                return;
+            }
+
+            // 按时间区分 个数
+            Integer timeNum = 0;
+            PeriodEnum periodType  = null;
+            if (PeriodEnum.DAY.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.DAY;
+            } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
+                timeNum = 3;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
+                timeNum = 6;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.YEAR;
+            } else if (PeriodEnum.PERPETUAL.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.PERPETUAL;
+            }
+            if (periodType == null) {
+                return;
+            }
+            String s = timeNum + periodType.getMsg() + addVipCardRecord.getVipType().getName();
+            if (PeriodEnum.PERPETUAL.equals(detail.getPeriod())) {
+                s =addVipCardRecord.getVipType().getName();
+            }
+            authSend(sysUser.getId(), sysUser.getPhone(), s, orderDetailVo.getOrderClient());
         }
     }
 
 
     @Override
+    @Transactional
     public void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId,String activityName) {
 
-        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(userId,client,activityReward,activityId,activityName);
-        if (vipCardRecord == null) {
-            return;
-        }
+        VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
+
+        addVipCardRecord.setUserId(userId);
+        addVipCardRecord.setClientType(client);
+        addVipCardRecord.setStatus(EVipRecordStatus.ADD);
+        addVipCardRecord.setVipType(EVipType.valueOf(activityReward.getRewardType().name()));
+        addVipCardRecord.setType(PeriodEnum.valueOf(activityReward.getUnit().name()));
+        addVipCardRecord.setTimes(activityReward.getNum());
+        addVipCardRecord.setSendMsg(false);
+        addVipCardRecord.setCreateBy(userId);
+        addVipCardRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+        vipCardRecordService.addVip(addVipCardRecord);
 
-        getUserVipInfoVo(vipCardRecord);
     }
 
     private UserVipInfoVo getUserVipInfoVo(VipCardRecord vipCardRecord) {
@@ -232,7 +298,8 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         return result;
     }
 
-    @Override
+    @Deprecated
+//    @Override
     public Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser) {
 
         VipCardRecord vipCardRecord = vipCardRecordService.getVipCardRecord(vipSubmitReq.getUserId(), client, null, null, vipSubmitReq.getType().toString(),
@@ -295,7 +362,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         // 判断会员剩余天数是否改变
         VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderGoodsInfo.getUserId(), orderGoodsInfo.getPaymentClient());
         if (!userVip.getVipEndDays().equals(orderGoodsInfo.getVipEndDays())) {
-            throw new BizException(999,"您当前VIP天数更新,请刷新后尝试");
+            throw new BizException(998,"您当前VIP天数更新,请刷新后尝试");
         }
 
         BigDecimal couponAmount = BigDecimal.ZERO;
@@ -317,13 +384,16 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         userOrderDetail.setMerchId(0l);
         userOrderDetail.setBizId(detail.getId());
         userOrderDetail.setBizContent("会员卡购买-" + detail.getPeriod().getMsg());
-        userOrderDetail.setGoodNum(1);
+        userOrderDetail.setGoodNum(orderGoodsInfo.getGoodNum());
         userOrderDetail.setOriginalPrice(detail.getOriginalPrice());
-        userOrderDetail.setCouponAmount(couponAmount);
+        userOrderDetail.setCouponAmount(couponAmount.multiply(new BigDecimal(orderGoodsInfo.getGoodNum())));
         userOrderDetail.setExpectPrice(detail.getSalePrice());
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(couponAmount));
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        UserPaymentOrderWrapper.VipDays vipDays = new UserPaymentOrderWrapper.VipDays();
+        vipDays.setVipEndDays(orderGoodsInfo.getVipEndDays());
+        userOrderDetail.setBizJson(JSON.toJSONString(vipDays));
         userOrderDetail.setAccountConfig( teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
@@ -384,28 +454,19 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         receivers.put(userId, phone);
 
         // 判断是否是机构学生 机构学生推送走另一个
-        Student student = studentService.getById(userId);
-        if (clientEnum.equals(ClientEnum.STUDENT) && student != null && student.getTenantId() != null && student.getTenantId() >0) {
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_VIP_BUY,
-                        receivers, null, 0, null, ClientEnum.TENANT_STUDENT.getCode(),param1);
-            } catch (Exception e) {
-                log.error("会员购买极光消息推送异常,userId={}", userId);
-            }
-        } else {
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_BUY_SUCCESS,
-                        receivers, null, 0, null, clientEnum.getCode(), param1);
-            } catch (Exception e) {
-                log.error("会员购买极光消息推送异常,userId={}", userId);
-            }
 
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_BUY_SUCCESS,
-                        receivers, null, 0, null, clientEnum.getCode(), param1);
-            } catch (Exception e) {
-                log.error("会员购买短信消息推送异常,userId={}", userId);
-            }
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.NEW_VIP_BUY_SUCCESS,
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
+        } catch (Exception e) {
+            log.error("会员购买极光消息推送异常,userId={}", userId);
+        }
+
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_NEW_VIP_BUY_SUCCESS,
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
+        } catch (Exception e) {
+            log.error("会员购买短信消息推送异常,userId={}", userId);
         }
 
     }

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

@@ -78,6 +78,10 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
                 if (null == studentTime.getFirstVipTime() && GoodTypeEnum.VIP.equals(detailVo.getGoodType())) {
                     studentTime.setFirstVipTime(now);
                 }
+
+                if (null == studentTime.getFirstVipTime() && GoodTypeEnum.SVIP.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstSvipTime(now);
+                }
                 if (null == studentTime.getFirstPracticeTime() && GoodTypeEnum.PRACTICE.equals(detailVo.getGoodType())) {
                     studentTime.setFirstPracticeTime(now);
                 }

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

@@ -925,6 +925,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
             UserOrderDetailVo orderDetail = new UserOrderDetailVo();
             orderDetail.setOrderNo(data.getOrderNo());
+            orderDetail.setBizJson(res.getBizJson());
             orderDetail.setOrderType(orderReq.getOrderType());
             orderDetail.setSubOrderNo(data.getSubOrderNo());
             orderDetail.setMerchId(res.getMerchId());

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

@@ -32,7 +32,6 @@ 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;
@@ -398,15 +397,16 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     }
 
     // 会员添加
-    private void addVip(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord) {
+    @Override
+    public 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()
                 .stream()
-                .filter(n -> n.getEndTime() == null || n.getEndTime().after(new Date()))
+//                .filter(n -> n.getEndTime() == null || n.getEndTime().after(new Date()))
                 .sorted(Comparator.comparing(VipCardRecord::getStartTime))
                 .collect(Collectors.toList());
 
@@ -444,23 +444,36 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             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();
+            PeriodEnum period = addVipCardRecord.getType();
+            if (period.equals(PeriodEnum.PERPETUAL)) {
+                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();
+                }
+            } else {
+                index = (int) vipCardRecordList.stream().filter(n -> EVipType.SVIP.equals(n.getVipType()) && !PeriodEnum.PERPETUAL.equals(n.getType())).count();
+                if (index > 0) {
+                    startTime = vipCardRecordList.stream().filter(n -> EVipType.SVIP.equals(n.getVipType()) && !PeriodEnum.PERPETUAL.equals(n.getType()))
+                            .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);
+        if (index > 0) {
+            newRecord.setStartTime(new Date(startTime.getTime() + 1000));
+        } else {
+            newRecord.setStartTime(startTime);
+        }
         newRecord.setEndTime(endDate);
         newRecord.setDisplayFlag(true);
         newRecord.setEfficientFlag(true);
         save(newRecord);
 
         // 平移时间
-        long plusMills = endDate == null ? 0L : (endDate.getTime() - startTime.getTime());
+        long plusMills = endDate.getTime() - startTime.getTime();
         for (int i = 0; i < vipCardRecordList.size(); i++) {
             VipCardRecord vipCardRecord = vipCardRecordList.get(i);
             if (i >= index) {
@@ -468,8 +481,17 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
                 if (plusMills > 0L) {
                     VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
                     addRecord.setStatus(EVipRecordStatus.UPDATE);
-                    addRecord.setStartTime(new Date(Math.max(vipCardRecord.getStartTime().getTime(), now.getTime()) + plusMills));
-                    addRecord.setEndTime(new Date(vipCardRecord.getEndTime().getTime() + plusMills));
+                    long startTimeMills = Math.max(vipCardRecord.getStartTime().getTime(), now.getTime());
+
+                    Date startDate = new Date(startTimeMills + plusMills + 1000);
+                    Calendar instance = Calendar.getInstance();
+                    instance.setTime(startDate);
+                    instance.set(Calendar.SECOND, 0);
+                    instance.set(Calendar.MILLISECOND, 0);
+                    addRecord.setStartTime(instance.getTime());
+
+                    int days = (int) Math.ceil(plusMills * 1.0D / (24 * 60 * 60 * 1000));
+                    addRecord.setEndTime(plusDate(vipCardRecord.getEndTime(), PeriodEnum.DAY, days));
                     addRecord.setDisplayFlag(false);
                     addRecord.setEfficientFlag(true);
                     save(addRecord);
@@ -493,11 +515,19 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
                 .eq(VipCardRecord::getClientType, addVipCardRecord.getClientType())
                 .eq(VipCardRecord::getUserId, addVipCardRecord.getUserId())
                 .ge(VipCardRecord::getEndTime, new Date())
-//                .eq(VipCardRecord::getDisplayFlag, false)
                 .eq(VipCardRecord::getEfficientFlag, true)
-                .list();
+                .list()
+                .stream()
+                .sorted(Comparator.comparing(VipCardRecord::getStartTime))
+                .collect(Collectors.toList());
 
         // 当前类型的VIP
+        PeriodEnum period = addVipCardRecord.getType();
+        if (PeriodEnum.PERPETUAL.equals(period)) {
+            deductedSVipPerpetual(addVipCardRecord, vipCardRecordList);
+            return;
+        }
+
         List<VipCardRecord> collect = vipCardRecordList.stream().filter(n -> n.getVipType().equals(addVipCardRecord.getVipType())).collect(Collectors.toList());
         if (collect.isEmpty()) {
             throw new BizException("剩余扣减数量不足");
@@ -511,7 +541,6 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 
 
         LocalDate maxEndTime = collect.stream().map(VipCardRecord::getEndTime).max(Comparator.naturalOrder()).get().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-        PeriodEnum period = addVipCardRecord.getType();
         // 扣减后的开始时间
         LocalDate deductedStartTime;
         switch (period) {
@@ -532,7 +561,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
                 break;
             case PERPETUAL:
                 // 永久扣减
-                deductedPerpetual(addVipCardRecord, vipCardRecordList);
+                deductedSVipPerpetual(addVipCardRecord, vipCardRecordList);
                 return;
             default:
                 throw new BizException("不支持的扣减类型");
@@ -542,7 +571,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         Date minStartTime = collect.stream().map(VipCardRecord::getStartTime).min(Comparator.naturalOrder()).get();
         // 如果扣减的数量超过1天,则提示扣减数量不足
         if (deductedStartDate.before(minStartTime)) {
-            double day = (minStartTime.getTime() - deductedStartDate.getTime()) * 1.0D / (24 * 60 * 60);
+            double day = (minStartTime.getTime() - deductedStartDate.getTime()) * 1.0D / (24 * 60 * 60 * 1000);
             if (day > 1.0D) {
                 throw new BizException("剩余扣减数量不足");
             }
@@ -600,37 +629,48 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         this.save(vipCardRecord);
     }
 
-    // 扣减永久会员
-    private void deductedPerpetual(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord, List<VipCardRecord> vipCardRecordList) {
+    // 扣减永久SVIP会员
+    private void deductedSVipPerpetual(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord, List<VipCardRecord> vipCardRecordList) {
+        List<VipCardRecord> collect = vipCardRecordList.stream()
+                .filter(n -> n.getVipType().equals(addVipCardRecord.getVipType()) && n.getType().equals(PeriodEnum.PERPETUAL))
+                .collect(Collectors.toList());
+        if (collect.isEmpty()) {
+            throw new BizException("剩余扣减数量不足");
+        }
+
 
-        EVipType vipType = addVipCardRecord.getVipType();
+        // 最后一个非永久SVIP的结束时间
+        Date lastUnPereutalDate = new Date();
         long deductMills = 0L;
-        Date now = new Date();
         for (VipCardRecord vipCardRecord : vipCardRecordList) {
-            Date startTime = vipCardRecord.getStartTime();
-            Date endTime = vipCardRecord.getEndTime();
+            if (EVipType.SVIP.equals(vipCardRecord.getVipType())) {
+                // 获取后续VIP向前平移的开始时间
+                if (!PeriodEnum.PERPETUAL.equals(vipCardRecord.getType())) {
+                    if (vipCardRecord.getEndTime().after(lastUnPereutalDate)) {
+                        lastUnPereutalDate = vipCardRecord.getEndTime();
+                    }
+                    continue;
+                }
+                vipCardRecord.setEfficientFlag(false);
+                updateById(vipCardRecord);
+            } else {
+                deductMills += vipCardRecord.getStartTime().getTime() - lastUnPereutalDate.getTime();
+
+                VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
+                newRecord.setId(null);
+                newRecord.setDisplayFlag(false);
+                newRecord.setEfficientFlag(true);
+                newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
+                newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
+                save(newRecord);
+                Long refId = newRecord.getId();
 
-            if (vipCardRecord.getVipType().equals(vipType)) {
-                deductMills += endTime.getTime() - Math.max(startTime.getTime(), now.getTime());
                 VipCardRecord updateRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
                 updateRecord.setEfficientFlag(false);
+                updateRecord.setRefId(refId);
                 updateById(updateRecord);
-            } else if (deductMills > 0L) {
-                    VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
-                    newRecord.setId(null);
-                    newRecord.setDisplayFlag(false);
-                    newRecord.setEfficientFlag(true);
-                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
-                    newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
-                    save(newRecord);
-                    Long refId = newRecord.getId();
-
-                    VipCardRecord updateRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
-                    updateRecord.setEfficientFlag(false);
-                    updateRecord.setRefId(refId);
-                    updateById(updateRecord);
-                }
             }
+        }
         VipCardRecord vipCardRecord = JSON.parseObject(JSON.toJSONString(addVipCardRecord), VipCardRecord.class);
         vipCardRecord.setDisplayFlag(true);
         vipCardRecord.setEfficientFlag(false);
@@ -665,7 +705,9 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
                 end = localDateTimeMaxTime.plusYears(times);
                 break;
             case PERPETUAL:
-                return null;
+                // 永久默认给100年
+                end = localDateTimeMaxTime.plusYears(100);
+                break;
             default:
                 throw new BizException("不支持的扣减类型");
         }

+ 5 - 119
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 
@@ -13,6 +14,7 @@ import java.math.BigDecimal;
  * @Data: 2022/3/31 16:18
  */
 @ApiModel(value = "OrderCheckRes", description = "订单创建业务返回对象")
+@Data
 public class OrderCreateRes {
     @ApiModelProperty("验证结果")
     private Boolean res;
@@ -41,6 +43,9 @@ public class OrderCreateRes {
     @ApiModelProperty("奖品id")
     private Long rewardId;
 
+    @ApiModelProperty(value = "业务数据")
+    private String bizJson;
+
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
 
@@ -50,123 +55,4 @@ public class OrderCreateRes {
     // 商品来源
     private SourceTypeEnum sourceType;
 
-    public SourceTypeEnum getSourceType() {
-        return sourceType;
-    }
-
-    public void setSourceType(SourceTypeEnum sourceType) {
-        this.sourceType = sourceType;
-    }
-
-    public Long getRewardId() {
-        return rewardId;
-    }
-
-    public void setRewardId(Long rewardId) {
-        this.rewardId = rewardId;
-    }
-
-    public Long getActivityId() {
-        return activityId;
-    }
-
-    public void setActivityId(Long activityId) {
-        this.activityId = activityId;
-    }
-
-    public Boolean getRes() {
-        return res;
-    }
-
-    public void setRes(Boolean res) {
-        this.res = res;
-    }
-
-    public Long getMerchId() {
-        return merchId;
-    }
-
-    public void setMerchId(Long merchId) {
-        this.merchId = merchId;
-    }
-
-    public Long getBizId() {
-        return bizId;
-    }
-
-    public void setBizId(Long bizId) {
-        this.bizId = bizId;
-    }
-
-    public BigDecimal getOriginalPrice() {
-        return originalPrice;
-    }
-
-    public void setOriginalPrice(BigDecimal originalPrice) {
-        this.originalPrice = originalPrice;
-    }
-
-    public BigDecimal getExpectPrice() {
-        return expectPrice;
-    }
-
-    public void setExpectPrice(BigDecimal expectPrice) {
-        this.expectPrice = expectPrice;
-    }
-
-    public String getBizContent() {
-        return bizContent;
-    }
-
-    public void setBizContent(String bizContent) {
-        this.bizContent = bizContent;
-    }
-
-    public Integer getGoodNum() {
-        return goodNum;
-    }
-
-    public void setGoodNum(Integer goodNum) {
-        this.goodNum = goodNum;
-    }
-
-    public GoodTypeEnum getGoodType() {
-        return goodType;
-    }
-
-    public void setGoodType(GoodTypeEnum goodType) {
-        this.goodType = goodType;
-    }
-
-    public Object getBizParam() {
-        return bizParam;
-    }
-
-    public void setBizParam(Object bizParam) {
-        this.bizParam = bizParam;
-    }
-
-    public BigDecimal getActualPrice() {
-        return actualPrice;
-    }
-
-    public void setActualPrice(BigDecimal actualPrice) {
-        this.actualPrice = actualPrice;
-    }
-
-    public BigDecimal getCouponAmount() {
-        return couponAmount;
-    }
-
-    public void setCouponAmount(BigDecimal couponAmount) {
-        this.couponAmount = couponAmount;
-    }
-
-    public OrderTypeEnum getOrderType() {
-        return orderType;
-    }
-
-    public void setOrderType(OrderTypeEnum orderType) {
-        this.orderType = orderType;
-    }
 }

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

@@ -934,4 +934,12 @@ public class UserPaymentOrderWrapper {
             return JSON.toJSONString(this);
         }
     }
+
+
+    @Data
+    public static class VipDays implements Serializable {
+
+
+        private Integer vipEndDays;
+    }
 }

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

@@ -1,9 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.EVipRecordStatus;
-import com.yonge.cooleshow.biz.dal.enums.EVipType;
-import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -81,5 +79,12 @@ public class VipCardRecordWrapper {
 
         @ApiModelProperty(value = "创建人",hidden = true)
         private Long createBy;
+
+        @ApiModelProperty(value = "转换VIP天数",hidden = true)
+        private Integer vipDays;
+
+
+        @ApiModelProperty("来源类型 : ACTIVITY :活动 ,ORDER:订单")
+        private SourceTypeEnum sourceType;
     }
 }

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

@@ -22,6 +22,7 @@
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
 	        <result column="tenant_group_album_id_" property="tenantGroupAlbumId" />
+	        <result column="biz_json_" property="bizJson" />
 		</resultMap>
 
     <!-- 表字段 -->
@@ -47,6 +48,7 @@
         , t.tenant_group_album_id_ as tenantGroupAlbumId
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
+        , t.biz_json_ as bizJson
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">

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

@@ -127,6 +127,9 @@
           <if test="param.sourceType != null">
               and t.source_type_ = #{param.sourceType}
           </if>
+          <if test="param.displayFlag != null">
+              and t.display_flag_ = #{param.displayFlag}
+          </if>
       </where>
         order by  t.id_ desc
     </select>