【代码优化】商城:完善满减送的计算逻辑

This commit is contained in:
YunaiV
2024-09-15 20:04:40 +08:00
parent 65c6184450
commit 222aa33f3e
20 changed files with 312 additions and 324 deletions

View File

@@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.trade.service.price;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
@@ -22,7 +22,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@@ -110,13 +109,10 @@ public class TradePriceServiceImpl implements TradePriceService {
MemberLevelRespDTO level = discountActivityPriceCalculator.getMemberLevel(userId);
// 1.3 获得限时折扣活动
Map<Long, DiscountProductRespDTO> skuIdAndDiscountMap = convertMap(
discountActivityApi.getMatchDiscountProductList(convertSet(allSkuList, ProductSkuRespDTO::getId)),
discountActivityApi.getMatchDiscountProductListBySkuIds(convertSet(allSkuList, ProductSkuRespDTO::getId)),
DiscountProductRespDTO::getSkuId);
// 1.4 获得满减送活动
// TODO 芋艿:这里是有问题的,后面 fix
Map<Long, RewardActivityMatchRespDTO> rewardActivityMap = convertMap(
rewardActivityApi.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(spuIds, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now()),
RewardActivityMatchRespDTO::getId);
List<RewardActivityMatchRespDTO> rewardActivityMap = rewardActivityApi.getMatchRewardActivityListBySpuIds(spuIds);
// 2. 价格计算
return convertList(spuIds, spuId -> {
@@ -148,7 +144,8 @@ public class TradePriceServiceImpl implements TradePriceService {
});
spuVO.setSkus(skuVOList);
// 2.2 满减送活动
RewardActivityMatchRespDTO rewardActivity = rewardActivityMap.get(spuId);
RewardActivityMatchRespDTO rewardActivity = CollUtil.findOne(rewardActivityMap,
activity -> CollUtil.contains(activity.getProductScopeValues(), spuId));
if (rewardActivity != null) {
spuVO.setRewardActivity(new AppTradeProductSettlementRespVO.RewardActivity().setId(rewardActivity.getId())
.setRuleDescriptions(convertList(rewardActivity.getRules(), RewardActivityMatchRespDTO.Rule::getDescription)));

View File

@@ -51,7 +51,7 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato
}
// 1.1 获得 SKU 对应的限时折扣活动
List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList(
List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductListBySkuIds(
convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId));
Map<Long, DiscountProductRespDTO> discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId);
// 1.2 获得会员等级

View File

@@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.trade.service.price.calculator;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi;
import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
@@ -17,9 +14,6 @@ import jakarta.annotation.Resource;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -48,8 +42,8 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
return;
}
// 获得 SKU 对应的满减送活动
List<RewardActivityMatchRespDTO> rewardActivities = rewardActivityApi.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(
convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId), CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
List<RewardActivityMatchRespDTO> rewardActivities = rewardActivityApi.getMatchRewardActivityListBySpuIds(
convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId));
if (CollUtil.isEmpty(rewardActivities)) {
return;
}
@@ -71,7 +65,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
if (rule == null) {
TradePriceCalculatorHelper.addNotMatchPromotion(result, orderItems,
rewardActivity.getId(), rewardActivity.getName(), PromotionTypeEnum.REWARD_ACTIVITY.getType(),
getRewardActivityNotMeetTip(rewardActivity, orderItems));
"满减送:" + rewardActivity.getRules().get(0).getDescription());
return;
}
@@ -131,19 +125,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
*/
private List<TradePriceCalculateRespBO.OrderItem> filterMatchActivityOrderItems(TradePriceCalculateRespBO result,
RewardActivityMatchRespDTO rewardActivity) {
Integer productScope = rewardActivity.getProductScope();
if (PromotionProductScopeEnum.isAll(productScope)){
return result.getItems();
} else if (PromotionProductScopeEnum.isSpu(productScope)) {
return filterList(result.getItems(),
orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId()));
} else if (PromotionProductScopeEnum.isCategory(productScope)) {
return filterList(result.getItems(),
orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getCategoryId()));
} else {
throw new IllegalArgumentException(StrUtil.format("满减送活动({})的类型({})不存在",
rewardActivity.getId(), productScope));
}
return filterList(result.getItems(), orderItem -> CollUtil.contains(rewardActivity.getSpuIds(), orderItem.getSpuId()));
}
/**
@@ -175,31 +157,4 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
return null;
}
/**
* 获得满减送活动不匹配时的提示
*
* @param rewardActivity 满减送活动
* @return 提示
*/
private String getRewardActivityNotMeetTip(RewardActivityMatchRespDTO rewardActivity,
List<TradePriceCalculateRespBO.OrderItem> orderItems) {
// 1. 计算数量和价格
Integer count = TradePriceCalculatorHelper.calculateTotalCount(orderItems);
Integer price = TradePriceCalculatorHelper.calculateTotalPayPrice(orderItems);
assert count != null && price != null;
// 2. 构建不满足时的提示信息:按最低档规则算
String meetTip = "满减送:购满 {} {},可以减 {} 元";
List<RewardActivityMatchRespDTO.Rule> rules = new ArrayList<>(rewardActivity.getRules());
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()));
}
if (PromotionConditionTypeEnum.COUNT.getType().equals(rewardActivity.getConditionType())) {
return StrUtil.format(meetTip, rule.getLimit(), "", MoneyUtils.fenToYuanStr(rule.getDiscountPrice()));
}
return StrUtil.EMPTY;
}
}