Commit b4587fd79e5f58cfe52544c87f4146d9c2fdb235

Authored by YunaiV
1 parent 53e789df

product:订单表,增加 vip 优惠字段

Showing 17 changed files with 103 additions and 33 deletions
yudao-module-mall/yudao-module-product-biz/pom.xml
@@ -23,12 +23,6 @@ @@ -23,12 +23,6 @@
23 <artifactId>yudao-module-product-api</artifactId> 23 <artifactId>yudao-module-product-api</artifactId>
24 <version>${revision}</version> 24 <version>${revision}</version>
25 </dependency> 25 </dependency>
26 - <!-- TODO 芋艿:看看~~~ -->  
27 - <dependency>  
28 - <groupId>cn.iocoder.boot</groupId>  
29 - <artifactId>yudao-module-trade-api</artifactId>  
30 - <version>${revision}</version>  
31 - </dependency>  
32 <dependency> 26 <dependency>
33 <groupId>cn.iocoder.boot</groupId> 27 <groupId>cn.iocoder.boot</groupId>
34 <artifactId>yudao-module-member-api</artifactId> 28 <artifactId>yudao-module-member-api</artifactId>
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/property/ProductPropertyValueApiImpl.java
1 package cn.iocoder.yudao.module.product.api.property; 1 package cn.iocoder.yudao.module.product.api.property;
2 2
3 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; 3 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
4 -import cn.iocoder.yudao.module.product.convert.propertyvalue.ProductPropertyValueConvert; 4 +import cn.iocoder.yudao.module.product.convert.property.ProductPropertyValueConvert;
5 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; 5 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
6 import org.springframework.stereotype.Service; 6 import org.springframework.stereotype.Service;
7 import org.springframework.validation.annotation.Validated; 7 import org.springframework.validation.annotation.Validated;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/ProductPropertyValueController.java
1 package cn.iocoder.yudao.module.product.controller.admin.property; 1 package cn.iocoder.yudao.module.product.controller.admin.property;
2 2
3 -import cn.hutool.core.collection.CollectionUtil;  
4 -import cn.hutool.crypto.symmetric.AES;  
5 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
8 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
9 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO; 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
10 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; 8 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
11 -import cn.iocoder.yudao.module.product.convert.propertyvalue.ProductPropertyValueConvert; 9 +import cn.iocoder.yudao.module.product.convert.property.ProductPropertyValueConvert;
12 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; 10 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
13 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
14 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
@@ -20,9 +18,6 @@ import org.springframework.web.bind.annotation.*; @@ -20,9 +18,6 @@ import org.springframework.web.bind.annotation.*;
20 import javax.annotation.Resource; 18 import javax.annotation.Resource;
21 import javax.validation.Valid; 19 import javax.validation.Valid;
22 20
23 -import java.util.Arrays;  
24 -import java.util.List;  
25 -  
26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
27 22
28 @Tag(name = "管理后台 - 商品属性值") 23 @Tag(name = "管理后台 - 商品属性值")
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
1 package cn.iocoder.yudao.module.product.controller.app.spu; 1 package cn.iocoder.yudao.module.product.controller.app.spu;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
  7 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
  8 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  9 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
5 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; 10 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;
6 -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageRespVO;  
7 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 11 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
  12 +import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageRespVO;
8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 13 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
9 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 14 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
10 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 15 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
@@ -23,10 +28,12 @@ import org.springframework.web.bind.annotation.RestController; @@ -23,10 +28,12 @@ import org.springframework.web.bind.annotation.RestController;
23 28
24 import javax.annotation.Resource; 29 import javax.annotation.Resource;
25 import javax.validation.Valid; 30 import javax.validation.Valid;
  31 +import java.util.Collections;
26 import java.util.List; 32 import java.util.List;
27 33
28 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
29 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 35 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  36 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
30 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_ENABLE; 37 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_ENABLE;
31 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; 38 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
32 39
@@ -41,6 +48,11 @@ public class AppProductSpuController { @@ -41,6 +48,11 @@ public class AppProductSpuController {
41 @Resource 48 @Resource
42 private ProductSkuService productSkuService; 49 private ProductSkuService productSkuService;
43 50
  51 + @Resource
  52 + private MemberLevelApi memberLevelApi;
  53 + @Resource
  54 + private MemberUserApi memberUserApi;
  55 +
44 @GetMapping("/list") 56 @GetMapping("/list")
45 @Operation(summary = "获得商品 SPU 列表") 57 @Operation(summary = "获得商品 SPU 列表")
46 @Parameters({ 58 @Parameters({
@@ -51,14 +63,32 @@ public class AppProductSpuController { @@ -51,14 +63,32 @@ public class AppProductSpuController {
51 @RequestParam("recommendType") String recommendType, 63 @RequestParam("recommendType") String recommendType,
52 @RequestParam(value = "count", defaultValue = "10") Integer count) { 64 @RequestParam(value = "count", defaultValue = "10") Integer count) {
53 List<ProductSpuDO> list = productSpuService.getSpuList(recommendType, count); 65 List<ProductSpuDO> list = productSpuService.getSpuList(recommendType, count);
54 - return success(ProductSpuConvert.INSTANCE.convertListForGetSpuList(list)); 66 + if (CollUtil.isEmpty(list)) {
  67 + return success(Collections.emptyList());
  68 + }
  69 +
  70 + // 拼接返回
  71 + List<AppProductSpuPageRespVO> voList = ProductSpuConvert.INSTANCE.convertListForGetSpuList(list);
  72 + // 处理 vip 价格
  73 + MemberLevelRespDTO memberLevel = getMemberLevel();
  74 + voList.forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel)));
  75 + return success(voList);
55 } 76 }
56 77
57 @GetMapping("/page") 78 @GetMapping("/page")
58 @Operation(summary = "获得商品 SPU 分页") 79 @Operation(summary = "获得商品 SPU 分页")
59 public CommonResult<PageResult<AppProductSpuPageRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) { 80 public CommonResult<PageResult<AppProductSpuPageRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) {
60 PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO); 81 PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO);
61 - return success(ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult)); 82 + if (CollUtil.isEmpty(pageResult.getList())) {
  83 + return success(PageResult.empty(pageResult.getTotal()));
  84 + }
  85 +
  86 + // 拼接返回
  87 + PageResult<AppProductSpuPageRespVO> voPageResult = ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult);
  88 + // 处理 vip 价格
  89 + MemberLevelRespDTO memberLevel = getMemberLevel();
  90 + voPageResult.getList().forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel)));
  91 + return success(voPageResult);
62 } 92 }
63 93
64 @GetMapping("/get-detail") 94 @GetMapping("/get-detail")
@@ -74,10 +104,40 @@ public class AppProductSpuController { @@ -74,10 +104,40 @@ public class AppProductSpuController {
74 throw exception(SPU_NOT_ENABLE); 104 throw exception(SPU_NOT_ENABLE);
75 } 105 }
76 106
77 - // 查询商品 SKU 107 + // 拼接返回
78 List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); 108 List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());
79 - // 拼接  
80 - return success(ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus)); 109 + AppProductSpuDetailRespVO detailVO = ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus);
  110 + // 处理 vip 价格
  111 + MemberLevelRespDTO memberLevel = getMemberLevel();
  112 + detailVO.setVipPrice(calculateVipPrice(detailVO.getPrice(), memberLevel));
  113 + return success(detailVO);
  114 + }
  115 +
  116 + private MemberLevelRespDTO getMemberLevel() {
  117 + Long userId = getLoginUserId();
  118 + if (userId == null) {
  119 + return null;
  120 + }
  121 + MemberUserRespDTO user = memberUserApi.getUser(userId);
  122 + if (user.getLevelId() == null || user.getLevelId() <= 0) {
  123 + return null;
  124 + }
  125 + return memberLevelApi.getMemberLevel(user.getLevelId());
  126 + }
  127 +
  128 + /**
  129 + * 计算会员 VIP 优惠价格
  130 + *
  131 + * @param price 原价
  132 + * @param memberLevel 会员等级
  133 + * @return 优惠价格
  134 + */
  135 + public Integer calculateVipPrice(Integer price, MemberLevelRespDTO memberLevel) {
  136 + if (memberLevel == null || memberLevel.getDiscountPercent() == null) {
  137 + return 0;
  138 + }
  139 + Integer newPrice = price * memberLevel.getDiscountPercent() / 100;
  140 + return price - newPrice;
81 } 141 }
82 142
83 } 143 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/propertyvalue/ProductPropertyValueConvert.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/property/ProductPropertyValueConvert.java
1 -package cn.iocoder.yudao.module.product.convert.propertyvalue; 1 +package cn.iocoder.yudao.module.product.convert.property;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java
@@ -79,8 +79,6 @@ public interface ProductSpuConvert { @@ -79,8 +79,6 @@ public interface ProductSpuConvert {
79 ProductSpuDO spu = list.get(i); 79 ProductSpuDO spu = list.get(i);
80 AppProductSpuPageRespVO spuVO = voList.get(i); 80 AppProductSpuPageRespVO spuVO = voList.get(i);
81 spuVO.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); 81 spuVO.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
82 - // 计算 vip 价格 TODO 芋艿:临时的逻辑,等 vip 支持后  
83 - spuVO.setVipPrice((int) (spuVO.getPrice() * 0.9));  
84 } 82 }
85 return voList; 83 return voList;
86 } 84 }
@@ -95,11 +93,6 @@ public interface ProductSpuConvert { @@ -95,11 +93,6 @@ public interface ProductSpuConvert {
95 .setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); 93 .setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
96 // 处理 SKU 94 // 处理 SKU
97 spuVO.setSkus(convertListForGetSpuDetail(skus)); 95 spuVO.setSkus(convertListForGetSpuDetail(skus));
98 - // 计算 vip 价格 TODO 芋艿:临时的逻辑,等 vip 支持后  
99 - if (true) {  
100 - spuVO.setVipPrice((int) (spuVO.getPrice() * 0.9));  
101 - spuVO.getSkus().forEach(sku -> sku.setVipPrice((int) (sku.getPrice() * 0.9)));  
102 - }  
103 return spuVO; 96 return spuVO;
104 } 97 }
105 98
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/package-info.java
1 /** 1 /**
2 - * trade 模块,主要实现交易相关功能 2 + * product 模块,主要实现交易相关功能
3 * 例如:订单、退款、购物车等功能。 3 * 例如:订单、退款、购物车等功能。
4 * 4 *
5 * 1. Controller URL:以 /product/ 开头,避免和其它 Module 冲突 5 * 1. Controller URL:以 /product/ 开头,避免和其它 Module 冲突
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
8 -import cn.iocoder.yudao.module.product.convert.propertyvalue.ProductPropertyValueConvert; 8 +import cn.iocoder.yudao.module.product.convert.property.ProductPropertyValueConvert;
9 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
10 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; 10 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
11 import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyValueMapper; 11 import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyValueMapper;
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -53,9 +53,7 @@ public interface ErrorCodeConstants { @@ -53,9 +53,7 @@ public interface ErrorCodeConstants {
53 53
54 // ========== Price 相关 1011003000 ============ 54 // ========== Price 相关 1011003000 ============
55 ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1011003000, "支付价格计算异常,原因:价格小于等于 0"); 55 ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1011003000, "支付价格计算异常,原因:价格小于等于 0");
56 - ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003001, "计算快递运费异常,收件人地址编号为空");  
57 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND = new ErrorCode(1011003002, "计算快递运费异常,找不到对应的运费模板"); 56 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND = new ErrorCode(1011003002, "计算快递运费异常,找不到对应的运费模板");
58 - ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_PICK_UP_STORE_IS_EMPTY = new ErrorCode(1011003003, "计算快递运费异常,自提点为空");  
59 ErrorCode PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER = new ErrorCode(1011003004, "参与秒杀、拼团、砍价的营销商品,无法使用优惠劵"); 57 ErrorCode PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER = new ErrorCode(1011003004, "参与秒杀、拼团、砍价的营销商品,无法使用优惠劵");
60 58
61 // ========== 物流 Express 模块 1011004000 ========== 59 // ========== 物流 Express 模块 1011004000 ==========
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
@@ -82,6 +82,9 @@ public class AppTradeOrderSettlementRespVO { @@ -82,6 +82,9 @@ public class AppTradeOrderSettlementRespVO {
82 @Schema(description = "积分抵扣的金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") 82 @Schema(description = "积分抵扣的金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
83 private Integer pointPrice; 83 private Integer pointPrice;
84 84
  85 + @Schema(description = "VIP 减免金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30")
  86 + private Integer vipPrice;
  87 +
85 @Schema(description = "实际支付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "450") 88 @Schema(description = "实际支付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "450")
86 private Integer payPrice; 89 private Integer payPrice;
87 90
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
@@ -64,7 +64,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -64,7 +64,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
64 64
65 private void calculateByPickUp(TradePriceCalculateReqBO param) { 65 private void calculateByPickUp(TradePriceCalculateReqBO param) {
66 if (param.getPickUpStoreId() == null) { 66 if (param.getPickUpStoreId() == null) {
67 - throw exception(PRICE_CALCULATE_DELIVERY_PRICE_PICK_UP_STORE_IS_EMPTY); 67 + // 价格计算时,如果为空就不算~最终下单,会校验该字段不允许空
  68 + return;
68 } 69 }
69 DeliveryPickUpStoreDO pickUpStore = deliveryPickUpStoreService.getDeliveryPickUpStore(param.getPickUpStoreId()); 70 DeliveryPickUpStoreDO pickUpStore = deliveryPickUpStoreService.getDeliveryPickUpStore(param.getPickUpStoreId());
70 if (pickUpStore == null || CommonStatusEnum.DISABLE.getStatus().equals(pickUpStore.getStatus())) { 71 if (pickUpStore == null || CommonStatusEnum.DISABLE.getStatus().equals(pickUpStore.getStatus())) {
@@ -77,7 +78,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -77,7 +78,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
77 private void calculateExpress(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { 78 private void calculateExpress(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
78 // 0. 得到收件地址区域 79 // 0. 得到收件地址区域
79 if (param.getAddressId() == null) { 80 if (param.getAddressId() == null) {
80 - throw exception(PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDRESS_IS_EMPTY); 81 + // 价格计算时,如果为空就不算~最终下单,会校验该字段不允许空
  82 + return;
81 } 83 }
82 AddressRespDTO address = addressApi.getAddress(param.getAddressId(), param.getUserId()); 84 AddressRespDTO address = addressApi.getAddress(param.getAddressId(), param.getUserId());
83 Assert.notNull(address, "收件人({})的地址,不能为空", param.getUserId()); 85 Assert.notNull(address, "收件人({})的地址,不能为空", param.getUserId());
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
1 package cn.iocoder.yudao.module.trade.service.price.calculator; 1 package cn.iocoder.yudao.module.trade.service.price.calculator;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi; 6 import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;
6 import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; 7 import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 9 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 12 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
11 import org.springframework.core.annotation.Order; 13 import org.springframework.core.annotation.Order;
@@ -33,6 +35,10 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato @@ -33,6 +35,10 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato
33 35
34 @Override 36 @Override
35 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { 37 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  38 + // 0. 只有【普通】订单,才计算该优惠
  39 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
  40 + return;
  41 + }
36 // 获得 SKU 对应的限时折扣活动 42 // 获得 SKU 对应的限时折扣活动
37 List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList( 43 List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList(
38 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); 44 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId));
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java
1 package cn.iocoder.yudao.module.trade.service.price.calculator; 1 package cn.iocoder.yudao.module.trade.service.price.calculator;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
3 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; 4 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
4 import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; 5 import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
5 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 6 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
6 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 7 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
8 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
10 import org.springframework.core.annotation.Order; 12 import org.springframework.core.annotation.Order;
@@ -30,6 +32,10 @@ public class TradeMemberLevelPriceCalculator implements TradePriceCalculator { @@ -30,6 +32,10 @@ public class TradeMemberLevelPriceCalculator implements TradePriceCalculator {
30 32
31 @Override 33 @Override
32 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { 34 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  35 + // 0. 只有【普通】订单,才计算该优惠
  36 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
  37 + return;
  38 + }
33 // 1. 获得用户的会员等级 39 // 1. 获得用户的会员等级
34 MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); 40 MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
35 if (user.getLevelId() == null || user.getLevelId() <= 0) { 41 if (user.getLevelId() == null || user.getLevelId() <= 0) {
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
1 package cn.iocoder.yudao.module.trade.service.price.calculator; 1 package cn.iocoder.yudao.module.trade.service.price.calculator;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi; 6 import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi;
6 import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; 7 import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 9 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 12 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
11 import org.springframework.core.annotation.Order; 13 import org.springframework.core.annotation.Order;
@@ -32,6 +34,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator @@ -32,6 +34,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
32 34
33 @Override 35 @Override
34 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { 36 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  37 + // 0. 只有【普通】订单,才计算该优惠
  38 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
  39 + return;
  40 + }
35 // 获得 SKU 对应的满减送活动 41 // 获得 SKU 对应的满减送活动
36 List<RewardActivityMatchRespDTO> rewardActivities = rewardActivityApi.getMatchRewardActivityList( 42 List<RewardActivityMatchRespDTO> rewardActivities = rewardActivityApi.getMatchRewardActivityList(
37 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId)); 43 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId));
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;
5 import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; 5 import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;
6 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; 6 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
8 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
10 import org.junit.jupiter.api.Test; 11 import org.junit.jupiter.api.Test;
@@ -42,6 +43,7 @@ public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTes @@ -42,6 +43,7 @@ public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTes
42 new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中 43 new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
43 )); 44 ));
44 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() 45 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  46 + .setType(TradeOrderTypeEnum.NORMAL.getType())
45 .setPrice(new TradePriceCalculateRespBO.Price()) 47 .setPrice(new TradePriceCalculateRespBO.Price())
46 .setPromotions(new ArrayList<>()) 48 .setPromotions(new ArrayList<>())
47 .setItems(asList( 49 .setItems(asList(
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
6 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 6 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
7 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 7 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
11 import org.junit.jupiter.api.Test; 12 import org.junit.jupiter.api.Test;
@@ -44,6 +45,7 @@ public class TradeMemberLevelPriceCalculatorTest extends BaseMockitoUnitTest { @@ -44,6 +45,7 @@ public class TradeMemberLevelPriceCalculatorTest extends BaseMockitoUnitTest {
44 new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中 45 new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
45 )); 46 ));
46 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() 47 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  48 + .setType(TradeOrderTypeEnum.NORMAL.getType())
47 .setPrice(new TradePriceCalculateRespBO.Price()) 49 .setPrice(new TradePriceCalculateRespBO.Price())
48 .setPromotions(new ArrayList<>()) 50 .setPromotions(new ArrayList<>())
49 .setItems(asList( 51 .setItems(asList(
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi;
5 import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; 5 import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO;
6 import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; 6 import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
8 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
9 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
10 import org.junit.jupiter.api.Test; 11 import org.junit.jupiter.api.Test;
@@ -44,6 +45,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest @@ -44,6 +45,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest
44 new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) // 匹配活动 2 45 new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) // 匹配活动 2
45 )); 46 ));
46 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() 47 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  48 + .setType(TradeOrderTypeEnum.NORMAL.getType())
47 .setPrice(new TradePriceCalculateRespBO.Price()) 49 .setPrice(new TradePriceCalculateRespBO.Price())
48 .setPromotions(new ArrayList<>()) 50 .setPromotions(new ArrayList<>())
49 .setItems(asList( 51 .setItems(asList(
@@ -157,6 +159,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest @@ -157,6 +159,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest
157 new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) 159 new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true)
158 )); 160 ));
159 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() 161 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  162 + .setType(TradeOrderTypeEnum.NORMAL.getType())
160 .setPrice(new TradePriceCalculateRespBO.Price()) 163 .setPrice(new TradePriceCalculateRespBO.Price())
161 .setPromotions(new ArrayList<>()) 164 .setPromotions(new ArrayList<>())
162 .setItems(asList( 165 .setItems(asList(