【缺陷修复】商城:修复积分不够还能兑换商品的 bug
This commit is contained in:
parent
d3352308d4
commit
30a24601cd
|
@ -37,6 +37,7 @@ public interface ErrorCodeConstants {
|
||||||
ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单");
|
ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单");
|
||||||
ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态");
|
ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态");
|
||||||
ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限");
|
ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限");
|
||||||
|
ErrorCode ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS = new ErrorCode(1_011_000_035, "交易订单创建失败,原因:用户积分不足");
|
||||||
|
|
||||||
// ========== After Sale 模块 1-011-000-100 ==========
|
// ========== After Sale 模块 1-011-000-100 ==========
|
||||||
ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在");
|
ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在");
|
||||||
|
|
|
@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
|
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
|
||||||
|
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
|
||||||
import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;
|
import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;
|
||||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
||||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
||||||
|
@ -13,6 +15,9 @@ import org.springframework.stereotype.Component;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 积分商城活动订单的 {@link TradeOrderHandler} 实现类
|
* 积分商城活动订单的 {@link TradeOrderHandler} 实现类
|
||||||
*
|
*
|
||||||
|
@ -23,6 +28,8 @@ public class TradePointOrderHandler implements TradeOrderHandler {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PointActivityApi pointActivityApi;
|
private PointActivityApi pointActivityApi;
|
||||||
|
@Resource
|
||||||
|
private MemberUserApi memberUserApi;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||||
|
@ -31,6 +38,11 @@ public class TradePointOrderHandler implements TradeOrderHandler {
|
||||||
}
|
}
|
||||||
// 明确校验一下
|
// 明确校验一下
|
||||||
Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");
|
Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");
|
||||||
|
// 校验用户剩余积分是否足够兑换商品
|
||||||
|
MemberUserRespDTO user = memberUserApi.getUser(order.getUserId());
|
||||||
|
if (user.getPoint() < order.getUsePoint()) {
|
||||||
|
throw exception(ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS);
|
||||||
|
}
|
||||||
|
|
||||||
// 扣减积分商城活动的库存
|
// 扣减积分商城活动的库存
|
||||||
pointActivityApi.updatePointStockDecr(order.getPointActivityId(),
|
pointActivityApi.updatePointStockDecr(order.getPointActivityId(),
|
||||||
|
|
|
@ -60,21 +60,21 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
|
||||||
param.getUserId(), param.getPointActivityId(),
|
param.getUserId(), param.getPointActivityId(),
|
||||||
orderItem.getSkuId(), orderItem.getCount());
|
orderItem.getSkuId(), orderItem.getCount());
|
||||||
|
|
||||||
// 3.1 记录优惠明细
|
// 3.0 积分兑换前置校验
|
||||||
int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换
|
|
||||||
Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");
|
Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");
|
||||||
result.setUsePoint(activity.getPoint() * orderItem.getCount());
|
// 3.1 记录优惠明细
|
||||||
orderItem.setUsePoint(activity.getPoint() * orderItem.getCount());
|
int usePoint = activity.getPoint() * orderItem.getCount();
|
||||||
|
result.setUsePoint(usePoint);
|
||||||
|
orderItem.setUsePoint(usePoint);
|
||||||
|
int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换
|
||||||
if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额
|
if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额
|
||||||
discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount();
|
discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount();
|
||||||
}
|
}
|
||||||
// 3.2 记录优惠明细
|
|
||||||
TradePriceCalculatorHelper.addPromotion(result, orderItem,
|
TradePriceCalculatorHelper.addPromotion(result, orderItem,
|
||||||
param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(),
|
param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(),
|
||||||
StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
|
StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
|
||||||
discountPrice);
|
discountPrice);
|
||||||
|
// 3.2 更新 SKU 优惠金额
|
||||||
// 3.3 更新 SKU 优惠金额
|
|
||||||
orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
|
orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
|
||||||
TradePriceCalculatorHelper.recountPayPrice(orderItem);
|
TradePriceCalculatorHelper.recountPayPrice(orderItem);
|
||||||
TradePriceCalculatorHelper.recountAllPrice(result);
|
TradePriceCalculatorHelper.recountAllPrice(result);
|
||||||
|
|
Loading…
Reference in New Issue