diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/domain/enums/PayBillBstType.java b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/domain/enums/PayBillBstType.java index 554ab679..0a6fe5d1 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/domain/enums/PayBillBstType.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/domain/enums/PayBillBstType.java @@ -22,7 +22,8 @@ public enum PayBillBstType { MONTH_BILL("1", "月费账单", null, null), ELECTRICITY_RECHARGE("2", "电量充值订单", null, null), RECHARGE_ORDER("4", "充值订单", RechargePayHandler.class, RechargePayHandler.class), - RECHARGE_ORDER_DEPOSIT("5", "充值订单押金", RechargeDepositAfterPay.class, null); + RECHARGE_ORDER_DEPOSIT("5", "充值订单押金", RechargeDepositAfterPay.class, null), + VIP_ORDER("6", "VIP订单", null, null); private final String type; private final String msg; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/PayBillConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/PayBillConverter.java index 26aac984..bbfee76d 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/PayBillConverter.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/PayBillConverter.java @@ -3,6 +3,7 @@ package com.ruoyi.ss.payBill.service; import com.ruoyi.ss.payBill.domain.PayBill; import com.ruoyi.ss.transactionBill.domain.bo.RechargePayDepositBO; import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; +import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; /** * @author wjh @@ -19,4 +20,9 @@ public interface PayBillConverter { * 充值订单押金支付转为支付订单 */ PayBill toPoByRechargeDeposit(RechargePayDepositBO bo); + + /** + * VIP订单BO 转为支付订单 + */ + PayBill toPoByVipOrderBO(AddPayVipOrderBO bo); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java index 18120564..68e20572 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java @@ -5,6 +5,7 @@ import com.ruoyi.ss.channel.domain.ChannelVO; import com.ruoyi.ss.channel.domain.enums.ChannelPlatform; import com.ruoyi.ss.channel.service.ChannelService; import com.ruoyi.ss.payBill.domain.PayBill; +import com.ruoyi.ss.payBill.domain.PayBillVO; import com.ruoyi.ss.payBill.domain.enums.PayBillBstType; import com.ruoyi.ss.payBill.domain.enums.PayBillStatus; import com.ruoyi.ss.payBill.service.PayBillConverter; @@ -13,6 +14,8 @@ import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.user.domain.SmUserVO; import com.ruoyi.ss.user.service.UserService; +import com.ruoyi.ss.vipOrder.domain.VipOrder; +import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -124,4 +127,40 @@ public class PayBillConverterImpl implements PayBillConverter { return po; } + + @Override + public PayBill toPoByVipOrderBO(AddPayVipOrderBO bo) { + if (bo == null) { + return null; + } + VipOrder order = bo.getOrder(); + SmUserVO user = bo.getUser(); + ChannelVO channel = bo.getChannel(); + if (order == null || channel == null || user == null) { + return null; + } + + PayBill pay = new PayBillVO(); + pay.setBstType(PayBillBstType.VIP_ORDER.getType()); + + // 订单数据 + pay.setBstId(order.getId()); + pay.setAmount(order.getAmount()); + pay.setDescription("VIP订单:" + order.getOrderNo()); + // 渠道数据 + pay.setChannelId(channel.getChannelId()); + pay.setChannelCost(this.calcChannelCost(channel, order.getAmount())); + // 用户数据 + pay.setAppId(user.getAppId()); + if (ChannelPlatform.WX.getCode().equals(channel.getPlatform())) { + pay.setAccount(user.getWxOpenId()); + } else if (ChannelPlatform.ALI.getCode().equals(channel.getPlatform())) { + pay.setAccount(user.getAliOpenId()); + } + // 基础数据 + pay.setIp(IpUtils.getIpAddr()); + pay.setStatus(PayBillStatus.WAIT_PAY.getStatus()); + + return pay; + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java index 90f21af7..0f3d5bd6 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java @@ -1,6 +1,5 @@ package com.ruoyi.ss.user.domain; -import com.ruoyi.common.core.domain.entity.SmUser; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -13,7 +12,7 @@ import java.util.List; * 2024/3/7 */ @Data -public class SmUserQuery extends SmUser { +public class SmUserQuery extends SmUserVO { @ApiModelProperty("用户id列表") private List userIds; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml index 69b35789..bd1342ae 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml @@ -95,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and show_bill_mobile = #{showBillMobile} and su.user_id != #{excludeUserId} and su.ali_open_id like concat('%', #{aliOpenId}, '%') + and sa.name like concat('%', #{appName}, '%') and su.ali_open_id = #{eqAliOpenId} and su.agent_allow_mch_switch != #{agentAllowMchSwitch} and if(su.is_real, su.real_name, su.user_name) like concat('%', #{realOrUserName}, '%') diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrder.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrder.java index 9835e493..fdb6b578 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrder.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrder.java @@ -8,6 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; /** * 会员订单对象 ss_vip_order @@ -48,7 +49,11 @@ public class VipOrder extends BaseEntity @Excel(name = "下单时的可用店铺列表") @ApiModelProperty("下单时的可用店铺列表") - private String levelStoreIds; + private List levelStoreIds; + + @Excel(name = "订单等级续费解决方案") + @ApiModelProperty("订单等级续费解决方案") + private String levelSolution; @Excel(name = "sku ID") @ApiModelProperty("sku ID") diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrderVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrderVO.java index 16bbc2a1..b4eaf462 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrderVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/VipOrderVO.java @@ -16,6 +16,15 @@ public class VipOrderVO extends VipOrder{ @ApiModelProperty("支付渠道名称") private String channelName; + @ApiModelProperty("用户名称") + private String userName; + + @ApiModelProperty("商户名称") + private String mchName; + + @ApiModelProperty("支付订单编号") + private String payNo; + @ApiModelProperty("支付时间") private LocalDateTime payTime; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/bo/AddPayVipOrderBO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/bo/AddPayVipOrderBO.java index 87c1a599..cbb4fc30 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/bo/AddPayVipOrderBO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/bo/AddPayVipOrderBO.java @@ -4,6 +4,7 @@ import com.ruoyi.ss.channel.domain.ChannelVO; import com.ruoyi.ss.user.domain.SmUserVO; import com.ruoyi.ss.vipLevel.domain.VipLevelVO; import com.ruoyi.ss.vipLevelSku.domain.VipLevelSkuVO; +import com.ruoyi.ss.vipOrder.domain.VipOrder; import com.ruoyi.ss.vipOrder.domain.dto.AddPayVipOrderDTO; import lombok.Data; @@ -32,4 +33,7 @@ public class AddPayVipOrderBO { // 商户 private SmUserVO mch; + // 订单数据 + private VipOrder order; + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/enums/VipOrderStatus.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/enums/VipOrderStatus.java new file mode 100644 index 00000000..d964b64c --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/enums/VipOrderStatus.java @@ -0,0 +1,21 @@ +package com.ruoyi.ss.vipOrder.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wjh + * 2025/1/18 + */ +@Getter +@AllArgsConstructor +public enum VipOrderStatus { + + WAIT_PAY("1", "待支付"), + SUCCESS("2", "支付成功"), + CANCEL("3", "已取消"); + + private final String status; + private final String msg; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/vo/AddAndPayVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/vo/AddAndPayVO.java index 413f7480..1560f253 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/vo/AddAndPayVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/domain/vo/AddAndPayVO.java @@ -1,5 +1,7 @@ package com.ruoyi.ss.vipOrder.domain.vo; +import com.ruoyi.ss.vipOrder.domain.VipOrder; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -8,4 +10,11 @@ import lombok.Data; */ @Data public class AddAndPayVO { + + @ApiModelProperty("订单数据") + private VipOrder order; + + @ApiModelProperty("支付参数") + private Object payParams; + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/mapper/VipOrderMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/mapper/VipOrderMapper.xml index 4977fe8a..b90ccee9 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/mapper/VipOrderMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/mapper/VipOrderMapper.xml @@ -4,7 +4,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + + + select @@ -16,6 +18,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" svo.level_name, svo.level_discount, svo.level_store_ids, + svo.level_solution, svo.sku_id, svo.sku_time, svo.sku_price, @@ -46,6 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and svo.pay_id = #{query.payId} and svo.status = #{query.status} and svo.cancel_reason like concat('%', #{query.cancelReason}, '%') + and svo.level_solution = #{query.levelSolution} ${query.params.dataScope} @@ -71,6 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" level_name, level_discount, level_store_ids, + level_solution, sku_id, sku_time, sku_price, @@ -91,7 +96,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{levelId}, #{levelName}, #{levelDiscount}, - #{levelStoreIds}, + #{levelStoreIds,typeHandler=com.ruoyi.system.mapper.typehandler.LongSplitListTypeHandler}, + #{levelSolution}, #{skuId}, #{skuTime}, #{skuPrice}, @@ -122,7 +128,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" level_id = #{data.levelId}, level_name = #{data.levelName}, level_discount = #{data.levelDiscount}, - level_store_ids = #{data.levelStoreIds}, + level_store_ids = #{data.levelStoreIds,typeHandler=com.ruoyi.system.mapper.typehandler.LongSplitListTypeHandler}, + level_solution = #{data.levelSolution}, sku_id = #{data.skuId}, sku_time = #{data.skuTime}, sku_price = #{data.skuPrice}, diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/VipOrderConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/VipOrderConverter.java index ea2d29e5..bacc38b0 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/VipOrderConverter.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/VipOrderConverter.java @@ -1,5 +1,6 @@ package com.ruoyi.ss.vipOrder.service; +import com.ruoyi.ss.vipOrder.domain.VipOrder; import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; import com.ruoyi.ss.vipOrder.domain.dto.AddPayVipOrderDTO; @@ -14,4 +15,8 @@ public interface VipOrderConverter { */ AddPayVipOrderBO toBO(AddPayVipOrderDTO dto); + /** + * BO转为订单数据 + */ + VipOrder toOrder(AddPayVipOrderBO bo); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderConverterImpl.java index 2152c766..eaaf9316 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderConverterImpl.java @@ -2,17 +2,24 @@ package com.ruoyi.ss.vipOrder.service.impl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.ss.channel.service.ChannelService; +import com.ruoyi.ss.user.domain.SmUserVO; import com.ruoyi.ss.user.service.UserService; import com.ruoyi.ss.vipLevel.domain.VipLevelVO; import com.ruoyi.ss.vipLevel.service.VipLevelService; import com.ruoyi.ss.vipLevelSku.domain.VipLevelSkuVO; import com.ruoyi.ss.vipLevelSku.service.VipLevelSkuService; +import com.ruoyi.ss.vipOrder.domain.VipOrder; +import com.ruoyi.ss.vipOrder.domain.VipOrderQuery; import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; import com.ruoyi.ss.vipOrder.domain.dto.AddPayVipOrderDTO; +import com.ruoyi.ss.vipOrder.domain.enums.VipOrderStatus; import com.ruoyi.ss.vipOrder.service.VipOrderConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDateTime; + /** * @author wjh * 2025/1/17 @@ -62,4 +69,52 @@ public class VipOrderConverterImpl implements VipOrderConverter { return bo; } + + @Override + public VipOrder toOrder(AddPayVipOrderBO bo) { + if (bo == null) { + return null; + } + + VipOrder order = new VipOrderQuery(); + // 用户数据 + SmUserVO user = bo.getUser(); + if (user != null) { + order.setUserId(user.getUserId()); + } + // 商户数据 + SmUserVO mch = bo.getMch(); + if (mch != null) { + order.setMchId(mch.getUserId()); + } + // 等级数据 + VipLevelVO level = bo.getLevel(); + if (level != null) { + order.setLevelId(level.getId()); + order.setLevelName(level.getName()); + order.setLevelDiscount(level.getDiscount()); + order.setLevelStoreIds(level.getStoreIds()); + } + // 解决方案 + AddPayVipOrderDTO dto = bo.getDto(); + if (dto != null) { + order.setLevelSolution(dto.getSolution()); + } + // sku数据 + VipLevelSkuVO sku = bo.getSku(); + if (sku != null) { + order.setSkuId(sku.getId()); + order.setSkuTime(sku.getTime()); + order.setSkuPrice(sku.getPrice()); + order.setSkuLimitType(sku.getLimitType()); + order.setSkuLimitCount(sku.getLimitCount()); + } + // 基础数据 + BigDecimal amount = sku == null || sku.getPrice() == null ? BigDecimal.ZERO : sku.getPrice(); + order.setAmount(amount); + order.setExpireTime(LocalDateTime.now().plusMinutes(15)); // 15分钟内过期 + order.setStatus(VipOrderStatus.WAIT_PAY.getStatus()); + + return order; + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderServiceImpl.java index 0a9b608e..a55041cc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderServiceImpl.java @@ -1,16 +1,24 @@ package com.ruoyi.ss.vipOrder.service.impl; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.SnowFlakeUtil; +import com.ruoyi.ss.payBill.domain.PayBill; +import com.ruoyi.ss.payBill.domain.vo.DoPayVO; +import com.ruoyi.ss.payBill.service.PayBillConverter; +import com.ruoyi.ss.payBill.service.PayBillService; import com.ruoyi.ss.vipOrder.domain.VipOrder; import com.ruoyi.ss.vipOrder.domain.VipOrderQuery; import com.ruoyi.ss.vipOrder.domain.VipOrderVO; import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; import com.ruoyi.ss.vipOrder.domain.vo.AddAndPayVO; import com.ruoyi.ss.vipOrder.mapper.VipOrderMapper; +import com.ruoyi.ss.vipOrder.service.VipOrderConverter; import com.ruoyi.ss.vipOrder.service.VipOrderService; import com.ruoyi.ss.vipOrder.service.VipOrderValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; import java.util.List; @@ -29,6 +37,18 @@ public class VipOrderServiceImpl implements VipOrderService @Autowired private VipOrderValidator vipOrderValidator; + @Autowired + private VipOrderConverter vipOrderConverter; + + @Autowired + private PayBillConverter payBillConverter; + + @Autowired + private PayBillService payBillService; + + @Autowired + private TransactionTemplate transactionTemplate; + /** * 查询会员订单 * @@ -63,6 +83,7 @@ public class VipOrderServiceImpl implements VipOrderService public int insertVipOrder(VipOrder vipOrder) { vipOrder.setCreateTime(DateUtils.getNowDate()); + vipOrder.setOrderNo(String.valueOf(SnowFlakeUtil.newId())); return vipOrderMapper.insertVipOrder(vipOrder); } @@ -107,14 +128,32 @@ public class VipOrderServiceImpl implements VipOrderService // 校验 vipOrderValidator.preAddAndPay(bo); - AddAndPayVO vo = new AddAndPayVO(); + // 结果 + AddAndPayVO result = new AddAndPayVO(); - // 创建订单 + // 转为订单数据 + VipOrder order = vipOrderConverter.toOrder(bo); + ServiceUtil.assertion(order == null, "订单数据为空"); + // 订单数据加入结果集和上下文 + result.setOrder(order); + bo.setOrder(order); - // 创建支付单 + // 操作数据库 + transactionTemplate.execute(status -> { + // 创建订单 + int insert = this.insertVipOrder(order); + ServiceUtil.assertion(insert != 1, "创建订单失败"); - // 调起支付 + // 创建并支付 + PayBill pay = payBillConverter.toPoByVipOrderBO(bo); + ServiceUtil.assertion(pay == null, "支付单数据为空"); + DoPayVO payResult = payBillService.createPayBill(pay); + ServiceUtil.assertion(payResult == null, "调起支付失败"); + result.setPayParams(payResult.getPayParams()); - return vo; + return insert; + }); + + return result; } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderValidatorImpl.java index b84e8f56..a71bb222 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/vipOrder/service/impl/VipOrderValidatorImpl.java @@ -14,6 +14,7 @@ import com.ruoyi.ss.vipLevelSku.domain.enums.VipLevelSkuStatus; import com.ruoyi.ss.vipOrder.domain.bo.AddPayVipOrderBO; import com.ruoyi.ss.vipOrder.domain.dto.AddPayVipOrderDTO; import com.ruoyi.ss.vipOrder.service.VipOrderValidator; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,7 +48,8 @@ public class VipOrderValidatorImpl implements VipOrderValidator { ServiceUtil.assertion(!VipLevelSkuStatus.ON_SALE.getStatus().equals(sku.getStatus()), "ID为%s的SKU目前不可购买", sku.getId()); ServiceUtil.assertion(!Objects.equals(dto.getSkuLimitType(), sku.getLimitType()), "当前使用限制已发生变化,请重新下单"); ServiceUtil.assertion(!Objects.equals(dto.getSkuLimitCount(), sku.getLimitCount()), "当前限制次数已发生变化,请重新下单"); - ServiceUtil.assertion(!Objects.equals(dto.getSkuPrice(), sku.getPrice()), "当前价格已发生变化,请重新下单"); + ServiceUtil.assertion(sku.getPrice() == null, "价格不允许为空,请重新下单"); + ServiceUtil.assertion(!MathUtils.equals(dto.getSkuPrice(), sku.getPrice()), "当前价格已发生变化,请重新下单"); ServiceUtil.assertion(!Objects.equals(dto.getSkuTime(), sku.getTime()), "当前可购买的时长已发生变化,请重新下单"); ServiceUtil.assertion(!MathUtils.equals(dto.getLevelDiscount(), level.getDiscount()), "当前折扣已发生变化,请重新下单"); ServiceUtil.assertion(!CollectionUtils.equals(dto.getLevelStoreIds(), level.getStoreIds()), "当前可用店铺已发生变化,请重新下单"); @@ -62,7 +64,9 @@ public class VipOrderValidatorImpl implements VipOrderValidator { ServiceUtil.assertion(channel.getEnabled() == null || !channel.getEnabled(), "ID为%s的支付渠道已禁用", channel.getChannelId()); // 校验用户VIP兼容性,若不兼容,则校验是否有选择方案 - this.isCompatibility(sku, level, user); + if (this.isCompatibility(sku, level, user)) { + ServiceUtil.assertion(StringUtils.isBlank(dto.getSolution()), "当前拥有的VIP与下单的VIP不兼容,请选择解决方案"); + } } /**