Commit e1a8e45ac781bb2948adbabd86dc801ef2595e07
1 parent
0c283ded
mall + trade:快递价格计算
Showing
6 changed files
with
22 additions
and
17 deletions
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; |