Commit b4587fd79e5f58cfe52544c87f4146d9c2fdb235
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
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( |