mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-22 06:01:53 +08:00
【代码优化】商城:完善满减送的计算逻辑
This commit is contained in:
@@ -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)));
|
||||
|
@@ -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 获得会员等级
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user