|
@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
|
|
import cn.iocoder.yudao.module.member.api.address.MemberAddressApi;
|
|
|
import cn.iocoder.yudao.module.member.api.address.dto.MemberAddressRespDTO;
|
|
|
+import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
|
|
|
+import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
|
|
|
import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryExpressChargeModeEnum;
|
|
@@ -17,18 +19,19 @@ import cn.iocoder.yudao.module.trade.service.delivery.bo.DeliveryExpressTemplate
|
|
|
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
|
|
|
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
|
|
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO.OrderItem;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.core.annotation.Order;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
-import jakarta.annotation.Resource;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
|
|
-import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
|
|
+import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PICK_UP_STORE_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND;
|
|
|
|
|
|
/**
|
|
|
* 运费的 {@link TradePriceCalculator} 实现类
|
|
@@ -49,13 +52,20 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
|
|
|
private DeliveryExpressTemplateService deliveryExpressTemplateService;
|
|
|
@Resource
|
|
|
private TradeConfigService tradeConfigService;
|
|
|
+ @Resource
|
|
|
+ private ProductSpuApi productSpuApi;
|
|
|
|
|
|
@Override
|
|
|
public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
|
|
|
if (param.getDeliveryType() == null) {
|
|
|
return;
|
|
|
}
|
|
|
- // TODO @puhui999:需要校验,是不是存在商品不能门店自提,或者不能快递发货的情况。就是说,配送方式不匹配哈
|
|
|
+ // 校验是不是存在商品不能门店自提,或者不能快递发货的情况。就是说,配送方式不匹配哈
|
|
|
+ List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(convertSet(result.getItems(), OrderItem::getSpuId));
|
|
|
+ if (anyMatch(spuList, item -> !item.getDeliveryTypes().contains(param.getDeliveryType()))) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (DeliveryTypeEnum.PICK_UP.getType().equals(param.getDeliveryType())) {
|
|
|
calculateByPickUp(param);
|
|
|
} else if (DeliveryTypeEnum.EXPRESS.getType().equals(param.getDeliveryType())) {
|
|
@@ -124,7 +134,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
|
|
|
Map<Long, List<OrderItem>> template2ItemMap = convertMultiMap(selectedSkus, OrderItem::getDeliveryTemplateId);
|
|
|
// 依次计算快递运费
|
|
|
for (Map.Entry<Long, List<OrderItem>> entry : template2ItemMap.entrySet()) {
|
|
|
- Long templateId = entry.getKey();
|
|
|
+ Long templateId = entry.getKey();
|
|
|
List<OrderItem> orderItems = entry.getValue();
|
|
|
DeliveryExpressTemplateRespBO templateBO = expressTemplateMap.get(templateId);
|
|
|
if (templateBO == null) {
|
|
@@ -144,8 +154,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
|
|
|
/**
|
|
|
* 按配送方式来计算运费
|
|
|
*
|
|
|
- * @param orderItems SKU 商品项目
|
|
|
- * @param chargeMode 配送计费方式
|
|
|
+ * @param orderItems SKU 商品项目
|
|
|
+ * @param chargeMode 配送计费方式
|
|
|
* @param templateCharge 快递运费配置
|
|
|
*/
|
|
|
private void calculateExpressFeeByChargeMode(List<OrderItem> orderItems, Integer chargeMode,
|