Commit e1a8e45ac781bb2948adbabd86dc801ef2595e07

Authored by YunaiV
1 parent 0c283ded

mall + trade:快递价格计算

yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -51,8 +51,8 @@ public interface ErrorCodeConstants { @@ -51,8 +51,8 @@ public interface ErrorCodeConstants {
51 ErrorCode EXPRESS_CODE_DUPLICATE = new ErrorCode(1011003001, "已经存在该编码的快递公司"); 51 ErrorCode EXPRESS_CODE_DUPLICATE = new ErrorCode(1011003001, "已经存在该编码的快递公司");
52 ErrorCode EXPRESS_TEMPLATE_NOT_EXISTS = new ErrorCode(1011003002, "运费模板不存在"); 52 ErrorCode EXPRESS_TEMPLATE_NOT_EXISTS = new ErrorCode(1011003002, "运费模板不存在");
53 ErrorCode EXPRESS_TEMPLATE_NAME_DUPLICATE = new ErrorCode(1011003003, "已经存在该运费模板名"); 53 ErrorCode EXPRESS_TEMPLATE_NAME_DUPLICATE = new ErrorCode(1011003003, "已经存在该运费模板名");
54 - ErrorCode DELIVERY_EXPRESS_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003004, "计算快递运费时,收件人地址编号为空");  
55 - ErrorCode PRODUCT_EXPRESS_TEMPLATE_NOT_FOUND = new ErrorCode(1011003005, "找不到到商品对应的运费模板"); 54 + ErrorCode DELIVERY_EXPRESS_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003004, "计算快递运费时,收件人地址编号为空"); // TODO @jaosn:这个错误码,放到 Price 这块
  55 + ErrorCode PRODUCT_EXPRESS_TEMPLATE_NOT_FOUND = new ErrorCode(1011003005, "找不到到商品对应的运费模板"); // TODO @jaosn:这个错误码,放到 Price 这块
56 ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1011003006, "快递查询接口异常"); 56 ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1011003006, "快递查询接口异常");
57 ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003007, "快递查询返回失败, 原因:{}"); 57 ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003007, "快递查询返回失败, 原因:{}");
58 ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003008, "自提门店不存在"); 58 ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003008, "自提门店不存在");
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateService.java
@@ -75,7 +75,7 @@ public interface DeliveryExpressTemplateService { @@ -75,7 +75,7 @@ public interface DeliveryExpressTemplateService {
75 75
76 /** 76 /**
77 * 校验快递运费模板 77 * 校验快递运费模板
78 - * <p> 78 + *
79 * 如果校验不通过,抛出 {@link cn.iocoder.yudao.framework.common.exception.ServiceException} 异常 79 * 如果校验不通过,抛出 {@link cn.iocoder.yudao.framework.common.exception.ServiceException} 异常
80 * 80 *
81 * @param templateId 模板编号 81 * @param templateId 模板编号
@@ -83,6 +83,7 @@ public interface DeliveryExpressTemplateService { @@ -83,6 +83,7 @@ public interface DeliveryExpressTemplateService {
83 */ 83 */
84 DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId); 84 DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId);
85 85
  86 + // TODO @jason:可以把 spuIds 改成传递 ids 么?价格计算那,在 TradePriceCalculateRespBO 冗余好 templateId 字段。目的是,减少重复的查询
86 /** 87 /**
87 * 基于指定的 SPU 编号数组和收件人地址区域编号. 获取匹配运费模板 88 * 基于指定的 SPU 编号数组和收件人地址区域编号. 获取匹配运费模板
88 * 89 *
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java
@@ -242,10 +242,9 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla @@ -242,10 +242,9 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
242 if (spu == null) { 242 if (spu == null) {
243 return; 243 return;
244 } 244 }
  245 + // TODO @jason:避免循环查询;最好类似 expressTemplateMapper.selectBatchIds(spuMap.keySet()); 批量查询,内存组合;
245 SpuDeliveryExpressTemplateRespBO bo = new SpuDeliveryExpressTemplateRespBO() 246 SpuDeliveryExpressTemplateRespBO bo = new SpuDeliveryExpressTemplateRespBO()
246 .setChargeMode(item.getChargeMode()) 247 .setChargeMode(item.getChargeMode())
247 - // TODO @jason:是不是只要查询到一个,就不用查询下一个了;TemplateCharge 和 TemplateFree  
248 - // @芋艿 包邮的优先级> 费用的优先级 所以两个都要查询  
249 .setTemplateCharge(findMatchExpressTemplateCharge(item.getId(), areaId)) 248 .setTemplateCharge(findMatchExpressTemplateCharge(item.getId(), areaId))
250 .setTemplateFree(findMatchExpressTemplateFree(item.getId(), areaId)); 249 .setTemplateFree(findMatchExpressTemplateFree(item.getId(), areaId));
251 result.put(spu.getId(), bo); 250 result.put(spu.getId(), bo);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/bo/SpuDeliveryExpressTemplateRespBO.java
@@ -18,6 +18,8 @@ public class SpuDeliveryExpressTemplateRespBO { @@ -18,6 +18,8 @@ public class SpuDeliveryExpressTemplateRespBO {
18 */ 18 */
19 private Integer chargeMode; 19 private Integer chargeMode;
20 20
  21 + // TODO @jaosn:可以把 DeliveryExpressTemplateChargeBO 和 DeliveryExpressTemplateFreeBO 搞成内嵌的类。这样简洁一点
  22 +
21 /** 23 /**
22 * 运费模板快递运费设置 24 * 运费模板快递运费设置
23 */ 25 */
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
@@ -164,16 +164,7 @@ public class TradePriceCalculateRespBO { @@ -164,16 +164,7 @@ public class TradePriceCalculateRespBO {
164 */ 164 */
165 private Integer payPrice; 165 private Integer payPrice;
166 166
167 - /**  
168 - * 商品重量,单位:kg 千克  
169 - */  
170 - private Double weight;  
171 - /**  
172 - * 商品体积,单位:m^3 平米  
173 - */  
174 - private Double volume;  
175 -  
176 - // ========== 商品信息 ========== 167 + // ========== 商品 SPU 信息 ==========
177 /** 168 /**
178 * 商品名 169 * 商品名
179 */ 170 */
@@ -189,6 +180,16 @@ public class TradePriceCalculateRespBO { @@ -189,6 +180,16 @@ public class TradePriceCalculateRespBO {
189 */ 180 */
190 private Long categoryId; 181 private Long categoryId;
191 182
  183 + // ========== 商品 SKU 信息 ==========
  184 + /**
  185 + * 商品重量,单位:kg 千克
  186 + */
  187 + private Double weight;
  188 + /**
  189 + * 商品体积,单位:m^3 平米
  190 + */
  191 + private Double volume;
  192 +
192 /** 193 /**
193 * 商品属性数组 194 * 商品属性数组
194 */ 195 */
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
@@ -62,7 +62,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -62,7 +62,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
62 deliveryExpressTemplateService.getExpressTemplateMapBySpuIdsAndArea(spuIds, address.getAreaId()); 62 deliveryExpressTemplateService.getExpressTemplateMapBySpuIdsAndArea(spuIds, address.getAreaId());
63 // 3. 计算配送费用 63 // 3. 计算配送费用
64 if (CollUtil.isEmpty(spuExpressTemplateMap)) { 64 if (CollUtil.isEmpty(spuExpressTemplateMap)) {
65 - log.error("找不到商品 SPU ID {}, area Id {} ,对应的运费模板", spuIds, address.getAreaId()); 65 + log.error("[calculate][找不到商品 spuId{} areaId{} 对应的运费模板]", spuIds, address.getAreaId());
66 throw exception(PRODUCT_EXPRESS_TEMPLATE_NOT_FOUND); 66 throw exception(PRODUCT_EXPRESS_TEMPLATE_NOT_FOUND);
67 } 67 }
68 calculateDeliveryPrice(selectedItem, spuExpressTemplateMap, result); 68 calculateDeliveryPrice(selectedItem, spuExpressTemplateMap, result);
@@ -170,7 +170,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -170,7 +170,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
170 */ 170 */
171 private void divideDeliveryPrice(int deliveryPrice, List<OrderItem> orderItems) { 171 private void divideDeliveryPrice(int deliveryPrice, List<OrderItem> orderItems) {
172 // TODO @jason:分摊的话,是不是要按照比例呀?重量、价格、数量等等, 172 // TODO @jason:分摊的话,是不是要按照比例呀?重量、价格、数量等等,
173 - // 按比例是不是有点复杂。后面看看是否需要 173 + // 按比例是不是有点复杂。后面看看是否需要;
  174 + // TODO 可以看看别的项目怎么搞的哈。
174 int dividePrice = deliveryPrice / orderItems.size(); 175 int dividePrice = deliveryPrice / orderItems.size();
175 for (OrderItem item : orderItems) { 176 for (OrderItem item : orderItems) {
176 // 更新快递运费 177 // 更新快递运费
@@ -207,6 +208,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -207,6 +208,7 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
207 // freeCount 是不是应该是 double ?? 208 // freeCount 是不是应该是 double ??
208 // TODO @jason:要不配置的时候,把它的单位和商品对齐?到底是 kg、还是斤 209 // TODO @jason:要不配置的时候,把它的单位和商品对齐?到底是 kg、还是斤
209 // TODO @芋艿 目前 包邮 件数/重量/体积 都用的是这个字段 210 // TODO @芋艿 目前 包邮 件数/重量/体积 都用的是这个字段
  211 + // TODO @jason:那要不快递模版也改成 kg?这样是不是就不用 double ?
210 if (totalWeight >= templateFree.getFreeCount() 212 if (totalWeight >= templateFree.getFreeCount()
211 && totalPrice >= templateFree.getFreePrice()) { 213 && totalPrice >= templateFree.getFreePrice()) {
212 return true; 214 return true;