mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-19 20:51:53 +08:00
【代码优化】商城: 满减送活动优惠券相关
This commit is contained in:
@@ -12,11 +12,13 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
|
||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import lombok.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 交易订单 DO
|
||||
@@ -292,19 +294,14 @@ public class TradeOrderDO extends BaseDO {
|
||||
*/
|
||||
private Integer vipPrice;
|
||||
|
||||
// TODO @puhui999::1)建议命名要 giveXXX;不然不好理解哈;2)是不是搞成 Map 好点哈。
|
||||
/**
|
||||
* 赠送的优惠劵编号的数组
|
||||
* 赠送的优惠劵
|
||||
*
|
||||
* key: 优惠劵编号,value:对应的优惠券数量
|
||||
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
||||
*/
|
||||
private List<Long> couponIds;
|
||||
/**
|
||||
* 赠送的优惠券数量的数组
|
||||
*
|
||||
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
||||
*/
|
||||
private List<Integer> couponCounts;
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private Map<Long, Integer> giveCouponsMap;
|
||||
|
||||
/**
|
||||
* 秒杀活动编号
|
||||
|
@@ -202,7 +202,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||
order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
|
||||
order.setUserIp(getClientIP()).setTerminal(getTerminal());
|
||||
// 使用 + 赠送优惠券
|
||||
order.setCouponIds(calculateRespBO.getCouponIds()).setCouponCounts(calculateRespBO.getCouponCounts());
|
||||
order.setGiveCouponsMap(calculateRespBO.getGiveCouponsMap());
|
||||
// 支付 + 退款信息
|
||||
order.setAdjustPrice(0).setPayStatus(false);
|
||||
order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
|
||||
|
@@ -33,11 +33,11 @@ public class TradeCouponOrderHandler implements TradeOrderHandler {
|
||||
|
||||
@Override
|
||||
public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
if (CollUtil.isEmpty(order.getCouponIds())) {
|
||||
if (CollUtil.isEmpty(order.getGiveCouponsMap())) {
|
||||
return;
|
||||
}
|
||||
// 赠送优惠券
|
||||
couponApi.takeCouponsByAdmin(order.getCouponIds(), order.getCouponCounts(), order.getUserId());
|
||||
couponApi.takeCouponsByAdmin(order.getGiveCouponsMap(), order.getUserId());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -48,10 +48,10 @@ public class TradeCouponOrderHandler implements TradeOrderHandler {
|
||||
couponApi.returnUsedCoupon(order.getCouponId());
|
||||
}
|
||||
// 情况二:收回赠送的优惠券
|
||||
if (CollUtil.isEmpty(order.getCouponIds())) {
|
||||
if (CollUtil.isEmpty(order.getGiveCouponsMap())) {
|
||||
return;
|
||||
}
|
||||
// TODO @puhui999: 收回优惠券再考虑一下,是直接删除券还是改个状态;建议是【已作废】
|
||||
couponApi.takeBackCouponsByAdmin(order.getGiveCouponsMap(), order.getUserId());
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 价格计算 Response BO
|
||||
@@ -72,15 +73,13 @@ public class TradePriceCalculateRespBO {
|
||||
*/
|
||||
private Boolean freeDelivery;
|
||||
|
||||
// TODO @puhui999:感觉要不要试着改成 Map<Long, Integer> giveCoupons?貌似整体会更好理解一点。
|
||||
/**
|
||||
* 赠送的优惠劵编号的数组
|
||||
* 赠送的优惠劵
|
||||
*
|
||||
* key: 优惠劵编号,value:对应的优惠券数量
|
||||
* 目的:用于后续取消或者售后订单时,需要扣减赠送
|
||||
*/
|
||||
private List<Long> couponIds;
|
||||
/**
|
||||
* 赠送的优惠券数量的数组
|
||||
*/
|
||||
private List<Integer> couponCounts;
|
||||
private Map<Long, Integer> giveCouponsMap;
|
||||
|
||||
/**
|
||||
* 订单价格
|
||||
|
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
|
||||
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -31,8 +32,7 @@ public class TradePriceCalculatorHelper {
|
||||
List<ProductSpuRespDTO> spuList, List<ProductSkuRespDTO> skuList) {
|
||||
// 创建 PriceCalculateRespDTO 对象
|
||||
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO();
|
||||
result.setType(getOrderType(param)).setPromotions(new ArrayList<>())
|
||||
.setCouponIds(new ArrayList<>()).setCouponCounts(new ArrayList<>());
|
||||
result.setType(getOrderType(param)).setPromotions(new ArrayList<>()).setGiveCouponsMap(new LinkedHashMap<>());
|
||||
|
||||
// 创建它的 OrderItem 属性
|
||||
result.setItems(new ArrayList<>(param.getItems().size()));
|
||||
|
@@ -19,13 +19,14 @@ import org.springframework.stereotype.Component;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
|
||||
import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice;
|
||||
|
||||
// TODO @puhui999:相关的单测,建议改一改
|
||||
|
||||
/**
|
||||
* 满减送活动的 {@link TradePriceCalculator} 实现类
|
||||
*
|
||||
@@ -107,16 +108,12 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
|
||||
}
|
||||
// 4.3 记录赠送的优惠券
|
||||
if (rule.getGiveCoupon()) {
|
||||
for (int i = 0; i < rule.getCouponIds().size(); i++) {
|
||||
Long couponId = result.getCouponIds().get(i);
|
||||
Integer couponCount = result.getCouponCounts().get(i);
|
||||
int index = CollUtil.indexOf(result.getCouponIds(), id -> Objects.equals(couponId, id));
|
||||
if (index != -1) { // 情况一:别的满减活动送过同类优惠券,则直接增加数量
|
||||
List<Integer> couponCounts = result.getCouponCounts();
|
||||
couponCounts.set(index, couponCounts.get(index) + couponCount);
|
||||
result.setCouponCounts(couponCounts);
|
||||
} else { // 情况二:还没有赠送的优惠券
|
||||
result.setCouponIds(rule.getCouponIds()).setCouponCounts(rule.getCouponCounts());
|
||||
for (Map.Entry<Long, Integer> entry : rule.getGiveCouponsMap().entrySet()) {
|
||||
Map<Long, Integer> giveCouponsMap = result.getGiveCouponsMap();
|
||||
if (giveCouponsMap.get(entry.getKey()) == null) { // 情况一:还没有赠送的优惠券
|
||||
result.setGiveCouponsMap(rule.getGiveCouponsMap());
|
||||
} else { // 情况二:别的满减活动送过同类优惠券,则直接增加数量
|
||||
giveCouponsMap.put(entry.getKey(), giveCouponsMap.get(entry.getKey()) + entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,7 +190,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
|
||||
// 2. 构建不满足时的提示信息:按最低档规则算
|
||||
String meetTip = "满减送:购满 {} {},可以减 {} 元";
|
||||
List<RewardActivityMatchRespDTO.Rule> rules = new ArrayList<>(rewardActivity.getRules());
|
||||
rules.sort(Comparator.comparing(RewardActivityMatchRespDTO.Rule::getLimit)); // 按优惠门槛降序
|
||||
rules.sort(Comparator.comparing(RewardActivityMatchRespDTO.Rule::getLimit)); // 按优惠门槛升序
|
||||
RewardActivityMatchRespDTO.Rule rule = rules.get(0);
|
||||
if (PromotionConditionTypeEnum.PRICE.getType().equals(rewardActivity.getConditionType())) {
|
||||
return StrUtil.format(meetTip, rule.getLimit(), "元", MoneyUtils.fenToYuanStr(rule.getDiscountPrice()));
|
||||
|
Reference in New Issue
Block a user