Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/feature/0712_vip' into feature/0712_vip

yuanliang 1 gadu atpakaļ
vecāks
revīzija
a33d4cff4b

+ 19 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/VipCardRecordController.java

@@ -3,18 +3,23 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
 import com.yonge.cooleshow.biz.dal.enums.EVipRecordStatus;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -38,6 +43,9 @@ public class VipCardRecordController extends BaseController {
     @Resource
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private UserOrderDao userOrderDao;
+
     /**
      * 查询单条
      */
@@ -69,6 +77,17 @@ public class VipCardRecordController extends BaseController {
         } else if (addVipCardRecord.getStatus().equals(EVipRecordStatus.DEDUCTION)) {
             addVipCardRecord.setSourceType(SourceTypeEnum.PLATFORM_DEDUCT);
         }
+
+        // 判断是否有待支付订单 如果有返回不可下单
+        OrderSearch search = new OrderSearch();
+        search.setOrderClient(addVipCardRecord.getClientType().name());
+        search.setGoodType(addVipCardRecord.getVipType().name());
+        search.setUserId(addVipCardRecord.getUserId());
+
+        UserOrderVo userOrderVo = userOrderDao.getPendingOrder(search);
+        if (null != userOrderVo) {
+            throw new BizException(997, "当前用户存在未支付订单,不可操作添加/扣减会员");
+        }
         vipCardRecordService.add(addVipCardRecord);
         return succeed();
     }

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

@@ -159,7 +159,9 @@ public class UserOrderController extends BaseController {
     })
     public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
         if (null == query.getGoodType()
-                || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType()) && null == query.getBizId())) {
+                || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType())
+            && !GoodTypeEnum.SVIP.getCode().equals(query.getGoodType())
+            && null == query.getBizId())) {
             return HttpResponseResult.failed("参数异常");
         }
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -167,6 +169,7 @@ public class UserOrderController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         query.setUserId(user.getId());
+        query.setOrderClient(ClientEnum.STUDENT.name());
         return userOrderService.getPendingOrder(query);
     }
 

+ 33 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
@@ -137,6 +138,38 @@ public class UserOrderController extends BaseController {
         }
     }
 
+
+    @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
+    @PostMapping("/getPendingOrder")
+    @ApiImplicitParams({
+        @ApiImplicitParam(
+            name = "goodType",
+            value = "订单类型:  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名",
+            paramType = "query", dataType = "String", required = true
+        ),
+        @ApiImplicitParam(
+            name = "bizId",
+            value = "业务id 直播课、陪练课购买为课程组id;陪练课为老师id;单曲点播传曲子id",
+            paramType = "query", dataType = "Long"
+        )
+    })
+    public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
+        if (null == query.getGoodType()
+            || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType())
+            && !GoodTypeEnum.SVIP.getCode().equals(query.getGoodType())
+            && null == query.getBizId())) {
+            return HttpResponseResult.failed("参数异常");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId());
+        query.setOrderClient(ClientEnum.TEACHER.name());
+        return userOrderService.getPendingOrder(query);
+    }
+
+
     @ApiOperation(value = "取消订单")
     @PostMapping("/orderCancel")
     @ApiImplicitParams({

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

@@ -13,7 +13,7 @@ public enum EVipType implements BaseEnum<String, EVipType> {
 
     // 字段 说明 VIP:会员 SVIP:SVIP,PERMANENT_SVIP:永久SVIP,NOT_VIP:不是vip
 
-    VIP("会员"),
+    VIP("VIP"),
     SVIP("SVIP"),
 
 

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.dto.ReasonDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;

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

@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.VipSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
@@ -31,6 +33,8 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
+import jodd.time.TimeUtil;
+import org.joda.time.DateTime;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -68,6 +72,9 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     private UserOrderService userOrderService;
 
     @Autowired
+    private UserOrderDao userOrderDao;
+
+    @Autowired
     private RedisCacheService redisCacheService;
 
     @Override
@@ -101,15 +108,11 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
             return HttpResponseResult.failed("产品信息已更新,请重新选择");
         }
 
+        // 判断是否有待支付订单 如果有返回不可下单
+        checkOrder(orderReqInfo.getOrderClient(), orderReqInfo.getOrderType().name(), orderReqInfo.getUserId());
 
 
-        // 判断会员剩余天数是否改变
-        if (detail.getVipType() == EVipType.SVIP) {
-            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderReqInfo.getUserId(), orderReqInfo.getOrderClient());
-            if (!userVip.getVipEndDays().equals(orderReqInfo.getVipEndDays())) {
-                throw new BizException(998,"您当前VIP天数更新,请刷新后尝试");
-            }
-        }
+        checkVip(detail, orderReqInfo.getVipEndDays(), orderReqInfo.getUserId(), orderReqInfo.getOrderClient(), orderReqInfo.getGoodsNum());
 
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         BigDecimal couponAmount = BigDecimal.ZERO;
@@ -142,6 +145,53 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         return HttpResponseResult.succeed(orderCreateRes);
     }
 
+    private void checkVip(MemberPriceSettingsVo detail, Integer vipDays, Long userId, ClientEnum client, Integer num) {
+        // 判断会员剩余天数是否改变
+        if (detail.getVipType() == EVipType.SVIP && vipDays != null && vipDays > 0) {
+            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(userId, client);
+            if (!userVip.getVipEndDays().equals(vipDays)) {
+                throw new BizException(998, "您当前VIP天数更新,请刷新后尝试");
+            }
+            // 判断能不能升级
+            // 按时间区分 个数
+            int days = getSvipDays(detail, num, userVip);
+            if (days < userVip.getVipEndDays()) {
+                throw new BizException(998, "您当前VIP天数更新,请刷新后尝试");
+            }
+        }
+    }
+
+    private int getSvipDays(MemberPriceSettingsVo detail, Integer num, VipCardRecordWrapper.UserVip userVip) {
+        Integer timeNum = num;
+
+        // 判断当前时间 加 一段时间后,和当前天数比较
+        Date svipStartDate = new Date();
+        if (userVip.getSvipEndDate() != null) {
+            svipStartDate = userVip.getSvipEndDate();
+        }
+
+        DateTime dateTime = DateTime.parse(DateUtil.format(svipStartDate, "yyyy-MM-dd"))
+            .withHourOfDay(23)
+            .withMinuteOfHour(59)
+            .withSecondOfMinute(59)
+            .withMillisOfSecond(0);
+        if (PeriodEnum.DAY.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusDays(timeNum);
+        } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(timeNum);
+        } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(3 * timeNum);
+        } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(6 * timeNum);
+        } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusYears(timeNum);
+        }
+        Date date = dateTime.toDate();
+        // 比较两个时间 天数差
+        int days = DateUtil.daysBetween(svipStartDate, date);
+        return days;
+    }
+
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo) {
         orderSuccess(orderDetailVo,true);
@@ -158,7 +208,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
 
-        UserPaymentOrderWrapper.VipDays vipDays = JSON.parseObject(orderDetailVo.getBizJson(), UserPaymentOrderWrapper.VipDays.class);
         addVipCardRecord.setUserId(orderDetailVo.getUserId());
         addVipCardRecord.setClientType(orderDetailVo.getOrderClient());
         addVipCardRecord.setStatus(EVipRecordStatus.ADD);
@@ -171,8 +220,13 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         addVipCardRecord.setOrderNo(orderDetailVo.getOrderNo());
         addVipCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
         addVipCardRecord.setVipCardId(orderDetailVo.getBizId());
-        if (vipDays != null && vipDays.getVipEndDays() !=null && vipDays.getVipEndDays() >0) {
-            addVipCardRecord.setVipDays(vipDays.getVipEndDays());
+
+        // 判断转换天数
+
+        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderDetailVo.getUserId(), orderDetailVo.getOrderClient());
+        int svipDays = getSvipDays(detail, orderDetailVo.getGoodNum(), userVip);
+        if (detail.getVipType() == EVipType.SVIP &&userVip.getVipEndDays() !=null && svipDays >=userVip.getVipEndDays()) {
+            addVipCardRecord.setVipDays(userVip.getVipEndDays());
         }
         addVipCardRecord.setReason("会员购买");
         vipCardRecordService.add(addVipCardRecord);
@@ -364,13 +418,11 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
             throw new BizException("产品信息已更新,请重新选择");
         }
 
+
+        checkOrder(orderGoodsInfo.getPaymentClient(), detail.getVipType().name(), orderGoodsInfo.getUserId());
+
         // 判断会员剩余天数是否改变
-        if (detail.getVipType() == EVipType.SVIP) {
-            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(orderGoodsInfo.getUserId(), orderGoodsInfo.getPaymentClient());
-            if (!userVip.getVipEndDays().equals(orderGoodsInfo.getVipEndDays())) {
-                throw new BizException(998, "您当前VIP天数更新,请刷新后尝试");
-            }
-        }
+        checkVip(detail, orderGoodsInfo.getVipEndDays(), orderGoodsInfo.getUserId(), orderGoodsInfo.getPaymentClient(), orderGoodsInfo.getGoodNum());
 
         BigDecimal couponAmount = BigDecimal.ZERO;
         ActivityPlanVo activityPlanVo = activityPlanService.detail(orderGoodsInfo.getActivityId());
@@ -409,6 +461,19 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
     }
 
+    private void checkOrder(ClientEnum orderGoodsInfo, String orderType, Long orderGoodsInfo1) {
+        // 判断是否有待支付订单 如果有返回不可下单
+        OrderSearch search = new OrderSearch();
+        search.setOrderClient(orderGoodsInfo.name());
+        search.setGoodType(orderType);
+        search.setUserId(orderGoodsInfo1);
+
+        UserOrderVo userOrderVo = userOrderDao.getPendingOrder(search);
+        if (null != userOrderVo) {
+            throw new BizException(997, "您有未支付订单,请先支付");
+        }
+    }
+
     private void sendAddVipMessage(Long userId,String phone, ClientEnum client, Integer times, PeriodEnum type, String reason) {
         try {
             Map<Long, String> receivers = new HashMap<>();

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

@@ -392,7 +392,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
                 addRecord.setVipType(EVipType.SVIP);
                 addRecord.setType(PeriodEnum.DAY);
                 addRecord.setTimes(vipDays);
-                addRecord.setReason("后台转换添加");
+                addRecord.setReason("购买SVIP升级原VIP");
                 VipCardRecord convertVip = addVip(addRecord);
 
                 convertVip.setDisplayFlag(true);

+ 3 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -244,7 +244,9 @@
             and d.good_type_ = #{param.goodType}
             <choose>
                 <when test="param.goodType != null and param.goodType != 'PRACTICE'">
-                    and d.biz_id_ = #{param.bizId}
+                    <if test="param.bizId != null">
+                        and d.biz_id_ = #{param.bizId}
+                    </if>
                 </when>
             </choose>
         )