mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	mall + trade:优化运费模版的代码
This commit is contained in:
		@@ -7,10 +7,15 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemp
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO;
 | 
			
		||||
import com.google.common.collect.Maps;
 | 
			
		||||
import org.mapstruct.Mapper;
 | 
			
		||||
import org.mapstruct.factory.Mappers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.findFirst;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface DeliveryExpressTemplateConvert {
 | 
			
		||||
@@ -48,7 +53,7 @@ public interface DeliveryExpressTemplateConvert {
 | 
			
		||||
 | 
			
		||||
    DeliveryExpressTemplateChargeDO convertTemplateCharge(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO vo);
 | 
			
		||||
 | 
			
		||||
    DeliveryExpressTemplateRespBO.DeliveryExpressTemplateChargeBO convertTemplateCharge(DeliveryExpressTemplateChargeDO bean);
 | 
			
		||||
    DeliveryExpressTemplateRespBO.Charge convertTemplateCharge(DeliveryExpressTemplateChargeDO bean);
 | 
			
		||||
 | 
			
		||||
    default List<DeliveryExpressTemplateChargeDO> convertTemplateChargeList(Long templateId, Integer chargeMode, List<ExpressTemplateChargeBaseVO> list) {
 | 
			
		||||
        return CollectionUtils.convertList(list, vo -> convertTemplateCharge(templateId, chargeMode, vo));
 | 
			
		||||
@@ -60,7 +65,7 @@ public interface DeliveryExpressTemplateConvert {
 | 
			
		||||
 | 
			
		||||
    DeliveryExpressTemplateFreeDO convertTemplateFree(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO vo);
 | 
			
		||||
 | 
			
		||||
    DeliveryExpressTemplateRespBO.DeliveryExpressTemplateFreeBO convertTemplateFree(DeliveryExpressTemplateFreeDO bean);
 | 
			
		||||
    DeliveryExpressTemplateRespBO.Free convertTemplateFree(DeliveryExpressTemplateFreeDO bean);
 | 
			
		||||
 | 
			
		||||
    List<ExpressTemplateChargeBaseVO> convertTemplateChargeList(List<DeliveryExpressTemplateChargeDO> list);
 | 
			
		||||
 | 
			
		||||
@@ -70,4 +75,22 @@ public interface DeliveryExpressTemplateConvert {
 | 
			
		||||
        return CollectionUtils.convertList(list, vo -> convertTemplateFree(templateId, vo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default Map<Long, DeliveryExpressTemplateRespBO> convertMap(Integer areaId, List<DeliveryExpressTemplateDO> templateList,
 | 
			
		||||
                                                                List<DeliveryExpressTemplateChargeDO> chargeList,
 | 
			
		||||
                                                                List<DeliveryExpressTemplateFreeDO> freeList) {
 | 
			
		||||
        Map<Long, List<DeliveryExpressTemplateChargeDO>> templateIdChargeMap = convertMultiMap(chargeList,
 | 
			
		||||
                DeliveryExpressTemplateChargeDO::getTemplateId);
 | 
			
		||||
        Map<Long, List<DeliveryExpressTemplateFreeDO>> templateIdFreeMap = convertMultiMap(freeList,
 | 
			
		||||
                DeliveryExpressTemplateFreeDO::getTemplateId);
 | 
			
		||||
        // 组合运费模板配置 RespBO
 | 
			
		||||
        Map<Long, DeliveryExpressTemplateRespBO> result = Maps.newHashMapWithExpectedSize(templateList.size());
 | 
			
		||||
        templateList.forEach(template -> {
 | 
			
		||||
            DeliveryExpressTemplateRespBO bo = new DeliveryExpressTemplateRespBO()
 | 
			
		||||
                    .setChargeMode(template.getChargeMode())
 | 
			
		||||
                    .setCharge(convertTemplateCharge(findFirst(templateIdChargeMap.get(template.getId()), charge -> charge.getAreaIds().contains(areaId))))
 | 
			
		||||
                    .setFree(convertTemplateFree(findFirst(templateIdFreeMap.get(template.getId()), free -> free.getAreaIds().contains(areaId))));
 | 
			
		||||
            result.put(template.getId(), bo);
 | 
			
		||||
        });
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.dal.mysql.delivery;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
@@ -24,9 +23,9 @@ public interface DeliveryExpressTemplateChargeMapper extends BaseMapperX<Deliver
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default List<DeliveryExpressTemplateChargeDO> selectByTemplateIds(Collection<Long> templateIds) {
 | 
			
		||||
        return selectList(new LambdaQueryWrapperX<DeliveryExpressTemplateChargeDO>()
 | 
			
		||||
                .inIfPresent(DeliveryExpressTemplateChargeDO::getTemplateId, templateIds));
 | 
			
		||||
        return selectList(DeliveryExpressTemplateChargeDO::getTemplateId, templateIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.dal.mysql.delivery;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
@@ -22,9 +21,8 @@ public interface DeliveryExpressTemplateFreeMapper extends BaseMapperX<DeliveryE
 | 
			
		||||
                .eq(DeliveryExpressTemplateFreeDO::getTemplateId, templateId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default List<DeliveryExpressTemplateFreeDO> selectListByTemplateIds(Collection<Long> ids) {
 | 
			
		||||
        return selectList(new LambdaQueryWrapperX<DeliveryExpressTemplateFreeDO>()
 | 
			
		||||
                .inIfPresent(DeliveryExpressTemplateFreeDO::getTemplateId, ids));
 | 
			
		||||
    default List<DeliveryExpressTemplateFreeDO> selectListByTemplateIds(Collection<Long> templateIds) {
 | 
			
		||||
        return selectList(DeliveryExpressTemplateFreeDO::getTemplateId, templateIds);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ public class DeliveryExpressServiceImpl implements DeliveryExpressService {
 | 
			
		||||
    }
 | 
			
		||||
    private void validateDeliveryExpressExists(Long id) {
 | 
			
		||||
        if (deliveryExpressMapper.selectById(id) == null) {
 | 
			
		||||
            throw exception(DELIVERY_EXPRESS_NOT_EXISTS);
 | 
			
		||||
            throw exception(EXPRESS_NOT_EXISTS);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -84,11 +84,12 @@ public interface DeliveryExpressTemplateService {
 | 
			
		||||
    DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 基于运费模板编号数组和收件人地址区域编号. 获取匹配运费模板
 | 
			
		||||
     * 基于运费模板编号数组和收件人地址区域编号,获取匹配运费模板
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids    编号列表
 | 
			
		||||
     * @param areaId 区域编号
 | 
			
		||||
     * @return Map (templateId -> 运费模板设置)
 | 
			
		||||
     */
 | 
			
		||||
    Map<Long, DeliveryExpressTemplateRespBO> getExpressTemplateMapByIdsAndArea(Collection<Long> ids, Integer areaId);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -224,36 +224,26 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<Long, DeliveryExpressTemplateRespBO> getExpressTemplateMapByIdsAndArea(Collection<Long> ids, Integer areaId) {
 | 
			
		||||
        Assert.notNull(areaId, "区域编号 {} 不能为空", areaId);
 | 
			
		||||
        // 查询 template 数组
 | 
			
		||||
        if (CollUtil.isEmpty(ids)) {
 | 
			
		||||
            return Collections.emptyMap();
 | 
			
		||||
        }
 | 
			
		||||
        List<DeliveryExpressTemplateDO> templateList = expressTemplateMapper.selectBatchIds(ids);
 | 
			
		||||
        // 查询 templateCharge
 | 
			
		||||
        List<DeliveryExpressTemplateChargeDO> templeChargeList = expressTemplateChargeMapper.selectByTemplateIds(ids);
 | 
			
		||||
        Map<Long, List<DeliveryExpressTemplateChargeDO>> templateChargeMap = convertMultiMap(templeChargeList,
 | 
			
		||||
                DeliveryExpressTemplateChargeDO::getTemplateId);
 | 
			
		||||
        // 查询 templateFree
 | 
			
		||||
        List<DeliveryExpressTemplateFreeDO> templateFreeList = expressTemplateFreeMapper.selectListByTemplateIds(ids);
 | 
			
		||||
        Map<Long, List<DeliveryExpressTemplateFreeDO>> templateFreeMap = convertMultiMap(templateFreeList,
 | 
			
		||||
                DeliveryExpressTemplateFreeDO::getTemplateId);
 | 
			
		||||
        // 查询 templateCharge 数组
 | 
			
		||||
        List<DeliveryExpressTemplateChargeDO> chargeList = expressTemplateChargeMapper.selectByTemplateIds(ids);
 | 
			
		||||
        // 查询 templateFree 数组
 | 
			
		||||
        List<DeliveryExpressTemplateFreeDO> freeList = expressTemplateFreeMapper.selectListByTemplateIds(ids);
 | 
			
		||||
 | 
			
		||||
        // 组合运费模板配置 RespBO
 | 
			
		||||
        Map<Long, DeliveryExpressTemplateRespBO> result = new HashMap<>(templateList.size());
 | 
			
		||||
        templateList.forEach(item -> {
 | 
			
		||||
            DeliveryExpressTemplateRespBO bo = new DeliveryExpressTemplateRespBO()
 | 
			
		||||
                    .setChargeMode(item.getChargeMode())
 | 
			
		||||
                    .setTemplateCharge(findMatchExpressTemplateCharge(templateChargeMap.get(item.getId()), areaId))
 | 
			
		||||
                    .setTemplateFree(findMatchExpressTemplateFree(templateFreeMap.get(item.getId()), areaId));
 | 
			
		||||
            result.put(item.getId(), bo);
 | 
			
		||||
        });
 | 
			
		||||
        return result;
 | 
			
		||||
        return INSTANCE.convertMap(areaId, templateList, chargeList, freeList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private DeliveryExpressTemplateRespBO.DeliveryExpressTemplateChargeBO findMatchExpressTemplateCharge(
 | 
			
		||||
    private DeliveryExpressTemplateRespBO.Charge findMatchExpressTemplateCharge(
 | 
			
		||||
            List<DeliveryExpressTemplateChargeDO> templateChargeList, Integer areaId) {
 | 
			
		||||
        return INSTANCE.convertTemplateCharge(findFirst(templateChargeList, item -> item.getAreaIds().contains(areaId)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private DeliveryExpressTemplateRespBO.DeliveryExpressTemplateFreeBO findMatchExpressTemplateFree(
 | 
			
		||||
    private DeliveryExpressTemplateRespBO.Free findMatchExpressTemplateFree(
 | 
			
		||||
            List<DeliveryExpressTemplateFreeDO> templateFreeList, Integer areaId) {
 | 
			
		||||
        return INSTANCE.convertTemplateFree(findFirst(templateFreeList, item -> item.getAreaIds().contains(areaId)));
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,12 +21,12 @@ public class DeliveryExpressTemplateRespBO {
 | 
			
		||||
    /**
 | 
			
		||||
     * 运费模板快递运费设置
 | 
			
		||||
     */
 | 
			
		||||
    private DeliveryExpressTemplateChargeBO templateCharge;
 | 
			
		||||
    private Charge charge;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 运费模板包邮设置
 | 
			
		||||
     */
 | 
			
		||||
    private DeliveryExpressTemplateFreeBO templateFree;
 | 
			
		||||
    private Free free;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 快递运费模板费用配置 BO
 | 
			
		||||
@@ -34,7 +34,7 @@ public class DeliveryExpressTemplateRespBO {
 | 
			
		||||
     * @author jason
 | 
			
		||||
     */
 | 
			
		||||
    @Data
 | 
			
		||||
    public static class DeliveryExpressTemplateChargeBO {
 | 
			
		||||
    public static class Charge {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 首件数量(件数,重量,或体积)
 | 
			
		||||
@@ -60,7 +60,7 @@ public class DeliveryExpressTemplateRespBO {
 | 
			
		||||
     * @author jason
 | 
			
		||||
     */
 | 
			
		||||
    @Data
 | 
			
		||||
    public static class DeliveryExpressTemplateFreeBO {
 | 
			
		||||
    public static class Free {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 包邮金额,单位:分
 | 
			
		||||
@@ -76,4 +76,5 @@ public class DeliveryExpressTemplateRespBO {
 | 
			
		||||
         */
 | 
			
		||||
        private Integer freeCount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -342,7 +342,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 | 
			
		||||
        // TODO 芋艿:logisticsId 校验存在 发货物流公司 fix
 | 
			
		||||
        DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
 | 
			
		||||
        if (deliveryExpress == null) {
 | 
			
		||||
            throw exception(DELIVERY_EXPRESS_NOT_EXISTS);
 | 
			
		||||
            throw exception(EXPRESS_NOT_EXISTS);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 更新 TradeOrderDO 状态为已发货,等待收货
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
            List<OrderItem> orderItems = entry.getValue();
 | 
			
		||||
            DeliveryExpressTemplateRespBO templateBO = expressTemplateMap.get(templateId);
 | 
			
		||||
            if (templateBO == null) {
 | 
			
		||||
                log.error("不能计算快递运费。不能找到 templateId : {}. 对应的运费模板配置 Resp BO", templateId);
 | 
			
		||||
                log.error("[calculateDeliveryPrice][不能计算快递运费,找不到 templateId({}) 对应的运费模板配置]", templateId);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            // 总件数, 总金额, 总重量, 总体积
 | 
			
		||||
@@ -93,12 +93,12 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
            }
 | 
			
		||||
            // 优先判断是否包邮. 如果包邮不计算快递运费
 | 
			
		||||
            if (isExpressFree(templateBO.getChargeMode(), totalCount, totalWeight,
 | 
			
		||||
                            totalVolume, totalPrice, templateBO.getTemplateFree())) {
 | 
			
		||||
                            totalVolume, totalPrice, templateBO.getFree())) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            // 计算快递运费
 | 
			
		||||
            calculateExpressFeeByChargeMode(totalCount, totalWeight, totalVolume,
 | 
			
		||||
                    templateBO.getChargeMode(), templateBO.getTemplateCharge(), orderItems);
 | 
			
		||||
                    templateBO.getChargeMode(), templateBO.getCharge(), orderItems);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        TradePriceCalculatorHelper.recountAllPrice(result);
 | 
			
		||||
@@ -115,10 +115,10 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
     * @param orderItems SKU 商品项目
 | 
			
		||||
     */
 | 
			
		||||
    private void calculateExpressFeeByChargeMode(double totalCount, double totalWeight, double totalVolume,
 | 
			
		||||
                                                 int chargeMode, DeliveryExpressTemplateRespBO.DeliveryExpressTemplateChargeBO templateCharge,
 | 
			
		||||
                                                 int chargeMode, DeliveryExpressTemplateRespBO.Charge templateCharge,
 | 
			
		||||
                                                 List<OrderItem> orderItems) {
 | 
			
		||||
        if (templateCharge == null) {
 | 
			
		||||
            log.error("计算快递运费时,不能找到对应的快递运费模板费用配置。无法计算以下商品 SKU 项目运费: {}", orderItems);
 | 
			
		||||
            log.error("[calculateExpressFeeByChargeMode][计算快递运费时,找不到 SKU({}) 对应的运费模版]", orderItems);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        DeliveryExpressChargeModeEnum chargeModeEnum = DeliveryExpressChargeModeEnum.valueOf(chargeMode);
 | 
			
		||||
@@ -145,7 +145,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
     * @param templateCharge 快递运费配置
 | 
			
		||||
     * @param orderItems     SKU 商品项目
 | 
			
		||||
     */
 | 
			
		||||
    private void calculateExpressFee(double total, DeliveryExpressTemplateRespBO.DeliveryExpressTemplateChargeBO templateCharge, List<OrderItem> orderItems) {
 | 
			
		||||
    private void calculateExpressFee(double total, DeliveryExpressTemplateRespBO.Charge templateCharge, List<OrderItem> orderItems) {
 | 
			
		||||
        int deliveryPrice;
 | 
			
		||||
        if (total <= templateCharge.getStartCount()) {
 | 
			
		||||
            deliveryPrice = templateCharge.getStartPrice();
 | 
			
		||||
@@ -174,7 +174,6 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
        for (OrderItem item : orderItems) {
 | 
			
		||||
            // 更新快递运费
 | 
			
		||||
            item.setDeliveryPrice(dividePrice);
 | 
			
		||||
 | 
			
		||||
            TradePriceCalculatorHelper.recountPayPrice(item);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -190,7 +189,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 | 
			
		||||
     * @param templateFree 包邮配置
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isExpressFree(Integer chargeMode, int totalCount, double totalWeight,
 | 
			
		||||
                                  double totalVolume, int totalPrice, DeliveryExpressTemplateRespBO.DeliveryExpressTemplateFreeBO templateFree) {
 | 
			
		||||
                                  double totalVolume, int totalPrice, DeliveryExpressTemplateRespBO.Free templateFree) {
 | 
			
		||||
        if (templateFree == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user