Commit d0d21b27875c1093e94bc4c68d7adb8bab814fac

Authored by owen
1 parent 42a899c5

优惠券:新增/修改时,校验对应的商品、分类是否存在

yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/category/ProductCategoryApi.java 0 → 100644
  1 +package cn.iocoder.yudao.module.product.api.category;
  2 +
  3 +import java.util.Collection;
  4 +
  5 +/**
  6 + * 商品分类 API 接口
  7 + *
  8 + * @author owen
  9 + */
  10 +public interface ProductCategoryApi {
  11 +
  12 + /**
  13 + * 校验商品分类是否有效。如下情况,视为无效:
  14 + * 1. 商品分类编号不存在
  15 + * 2. 商品分类被禁用
  16 + *
  17 + * @param ids 商品分类编号数组
  18 + */
  19 + void validateCategoryList(Collection<Long> ids);
  20 +}
... ...
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/spu/ProductSpuApi.java
... ... @@ -22,10 +22,26 @@ public interface ProductSpuApi {
22 22 List<ProductSpuRespDTO> getSpuList(Collection<Long> ids);
23 23  
24 24 /**
  25 + * 批量查询 SPU 数组,并且校验是否 SPU 是否有效
  26 + *
  27 + * @param ids SPU 编号列表
  28 + * @return SPU 数组
  29 + */
  30 + List<ProductSpuRespDTO> getSpuListAndValidate(Collection<Long> ids);
  31 +
  32 + /**
25 33 * 获得 SPU
26 34 *
27 35 * @return SPU
28 36 */
29 37 ProductSpuRespDTO getSpu(Long id);
30 38  
  39 + /**
  40 + * 校验商品是否有效。如下情况,视为无效:
  41 + * 1. 商品编号不存在
  42 + * 2. 商品被禁用
  43 + *
  44 + * @param ids 商品编号数组
  45 + */
  46 + void validateSpuList(Collection<Long> ids);
31 47 }
... ...
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
... ... @@ -34,7 +34,7 @@ public interface ErrorCodeConstants {
34 34 // ========== 商品 SPU 1-008-005-000 ==========
35 35 ErrorCode SPU_NOT_EXISTS = new ErrorCode(1_008_005_000, "商品 SPU 不存在");
36 36 ErrorCode SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR = new ErrorCode(1_008_005_001, "商品分类不正确,原因:必须使用第二级的商品分类及以下");
37   - ErrorCode SPU_NOT_ENABLE = new ErrorCode(1_008_005_002, "商品 SPU 不处于上架状态");
  37 + ErrorCode SPU_NOT_ENABLE = new ErrorCode(1_008_005_002, "商品 SPU【[]】不处于上架状态");
38 38 ErrorCode SPU_NOT_RECYCLE = new ErrorCode(1_008_005_003, "商品 SPU 不处于回收站状态");
39 39  
40 40 // ========== 商品 SKU 1-008-006-000 ==========
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/category/ProductCategoryApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.product.api.category;
  2 +
  3 +import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
  4 +import org.springframework.stereotype.Service;
  5 +import org.springframework.validation.annotation.Validated;
  6 +
  7 +import javax.annotation.Resource;
  8 +import java.util.Collection;
  9 +
  10 +/**
  11 + * 商品分类 API 接口实现类
  12 + *
  13 + * @author owen
  14 + */
  15 +@Service
  16 +@Validated
  17 +public class ProductCategoryApiImpl implements ProductCategoryApi {
  18 +
  19 + @Resource
  20 + private ProductCategoryService productCategoryService;
  21 +
  22 + @Override
  23 + public void validateCategoryList(Collection<Long> ids) {
  24 + productCategoryService.validateCategoryList(ids);
  25 + }
  26 +
  27 +}
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/spu/ProductSpuApiImpl.java
... ... @@ -3,9 +3,6 @@ package cn.iocoder.yudao.module.product.api.spu;
3 3 import cn.hutool.core.collection.CollectionUtil;
4 4 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
5 5 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
6   -import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
7   -import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
8   -import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
9 6 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
10 7 import org.springframework.stereotype.Service;
11 8 import org.springframework.validation.annotation.Validated;
... ... @@ -37,8 +34,18 @@ public class ProductSpuApiImpl implements ProductSpuApi {
37 34 }
38 35  
39 36 @Override
  37 + public List<ProductSpuRespDTO> getSpuListAndValidate(Collection<Long> ids) {
  38 + return ProductSpuConvert.INSTANCE.convertList2(spuService.validateSpuList(ids));
  39 + }
  40 +
  41 + @Override
40 42 public ProductSpuRespDTO getSpu(Long id) {
41 43 return ProductSpuConvert.INSTANCE.convert02(spuService.getSpu(id));
42 44 }
43 45  
  46 + @Override
  47 + public void validateSpuList(Collection<Long> ids) {
  48 + spuService.validateSpuList(ids);
  49 + }
  50 +
44 51 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryService.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCateg
6 6 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
7 7  
8 8 import javax.validation.Valid;
  9 +import java.util.Collection;
9 10 import java.util.List;
10 11  
11 12 /**
... ... @@ -75,4 +76,12 @@ public interface ProductCategoryService {
75 76 */
76 77 List<ProductCategoryDO> getEnableCategoryList();
77 78  
  79 + /**
  80 + * 校验商品分类是否有效。如下情况,视为无效:
  81 + * 1. 商品分类编号不存在
  82 + * 2. 商品分类被禁用
  83 + *
  84 + * @param ids 商品分类编号数组
  85 + */
  86 + void validateCategoryList(Collection<Long> ids);
78 87 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java
1 1 package cn.iocoder.yudao.module.product.service.category;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  5 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 6 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
5 7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
6 8 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO;
... ... @@ -13,7 +15,9 @@ import org.springframework.stereotype.Service;
13 15 import org.springframework.validation.annotation.Validated;
14 16  
15 17 import javax.annotation.Resource;
  18 +import java.util.Collection;
16 19 import java.util.List;
  20 +import java.util.Map;
17 21 import java.util.Objects;
18 22  
19 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -100,6 +104,26 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
100 104 }
101 105  
102 106 @Override
  107 + public void validateCategoryList(Collection<Long> ids) {
  108 + if (CollUtil.isEmpty(ids)) {
  109 + return;
  110 + }
  111 + // 获得商品分类信息
  112 + List<ProductCategoryDO> categoryList = productCategoryMapper.selectBatchIds(ids);
  113 + Map<Long, ProductCategoryDO> categoryMap = CollectionUtils.convertMap(categoryList, ProductCategoryDO::getId);
  114 + // 校验
  115 + ids.forEach(id -> {
  116 + ProductCategoryDO category = categoryMap.get(id);
  117 + if (category == null) {
  118 + throw exception(CATEGORY_NOT_EXISTS);
  119 + }
  120 + if (!CommonStatusEnum.ENABLE.getStatus().equals(category.getStatus())) {
  121 + throw exception(CATEGORY_DISABLED, category.getName());
  122 + }
  123 + });
  124 + }
  125 +
  126 + @Override
103 127 public ProductCategoryDO getCategory(Long id) {
104 128 return productCategoryMapper.selectById(id);
105 129 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java
... ... @@ -136,4 +136,14 @@ public interface ProductSpuService {
136 136 */
137 137 Long getSpuCountByCategoryId(Long categoryId);
138 138  
  139 +
  140 + /**
  141 + * 校验商品是否有效。如下情况,视为无效:
  142 + * 1. 商品编号不存在
  143 + * 2. 商品被禁用
  144 + *
  145 + * @param ids 商品编号数组
  146 + * @return 商品 SPU 列表
  147 + */
  148 + List<ProductSpuDO> validateSpuList(Collection<Long> ids);
139 149 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
1 1 package cn.iocoder.yudao.module.product.service.spu;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.core.util.ObjectUtil;
4 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -140,6 +141,28 @@ public class ProductSpuServiceImpl implements ProductSpuService {
140 141 }
141 142  
142 143 @Override
  144 + public List<ProductSpuDO> validateSpuList(Collection<Long> ids) {
  145 + if (CollUtil.isEmpty(ids)) {
  146 + return Collections.emptyList();
  147 + }
  148 + // 获得商品信息
  149 + List<ProductSpuDO> spuList = productSpuMapper.selectBatchIds(ids);
  150 + Map<Long, ProductSpuDO> spuMap = CollectionUtils.convertMap(spuList, ProductSpuDO::getId);
  151 + // 校验
  152 + ids.forEach(id -> {
  153 + ProductSpuDO spu = spuMap.get(id);
  154 + if (spu == null) {
  155 + throw exception(SPU_NOT_EXISTS);
  156 + }
  157 + if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {
  158 + throw exception(SPU_NOT_ENABLE, spu.getName());
  159 + }
  160 + });
  161 +
  162 + return spuList;
  163 + }
  164 +
  165 + @Override
143 166 @Transactional(rollbackFor = Exception.class)
144 167 public void deleteSpu(Long id) {
145 168 // 校验存在
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java
... ... @@ -2,19 +2,22 @@ package cn.iocoder.yudao.module.promotion.service.coupon;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi;
  6 +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
5 7 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplateCreateReqVO;
6 8 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO;
7 9 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO;
8 10 import cn.iocoder.yudao.module.promotion.convert.coupon.CouponTemplateConvert;
9 11 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
10 12 import cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper;
  13 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
11 14 import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
12 15 import org.springframework.stereotype.Service;
13 16 import org.springframework.validation.annotation.Validated;
14 17  
15 18 import javax.annotation.Resource;
16   -
17 19 import java.util.List;
  20 +import java.util.Objects;
18 21  
19 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 23 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS;
... ... @@ -32,9 +35,15 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
32 35 @Resource
33 36 private CouponTemplateMapper couponTemplateMapper;
34 37  
35   - // TODO @疯狂:新增/修改时,需要校验对应的商品、分类是否存在
  38 + @Resource
  39 + private ProductCategoryApi productCategoryApi;
  40 + @Resource
  41 + private ProductSpuApi productSpuApi;
  42 +
36 43 @Override
37 44 public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) {
  45 + // 校验商品范围
  46 + validateProductScope(createReqVO.getProductScope(), createReqVO.getProductScopeValues());
38 47 // 插入
39 48 CouponTemplateDO couponTemplate = CouponTemplateConvert.INSTANCE.convert(createReqVO)
40 49 .setStatus(CommonStatusEnum.ENABLE.getStatus());
... ... @@ -51,6 +60,8 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
51 60 if (updateReqVO.getTotalCount() < couponTemplate.getTakeCount()) {
52 61 throw exception(COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL, couponTemplate.getTakeCount());
53 62 }
  63 + // 校验商品范围
  64 + validateProductScope(updateReqVO.getProductScope(), updateReqVO.getProductScopeValues());
54 65  
55 66 // 更新
56 67 CouponTemplateDO updateObj = CouponTemplateConvert.INSTANCE.convert(updateReqVO);
... ... @@ -81,6 +92,14 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
81 92 return couponTemplate;
82 93 }
83 94  
  95 + private void validateProductScope(Integer productScope, List<Long> productScopeValues) {
  96 + if (Objects.equals(PromotionProductScopeEnum.SPU.getScope(), productScope)) {
  97 + productSpuApi.validateSpuList(productScopeValues);
  98 + } else if (Objects.equals(PromotionProductScopeEnum.CATEGORY.getScope(), productScope)) {
  99 + productCategoryApi.validateCategoryList(productScopeValues);
  100 + }
  101 + }
  102 +
84 103 @Override
85 104 public CouponTemplateDO getCouponTemplate(Long id) {
86 105 return couponTemplateMapper.selectById(id);
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java
... ... @@ -4,7 +4,6 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
4 4 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
5 5 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
6 6 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7   -import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
8 7 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
9 8 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
10 9 import cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculator;
... ... @@ -20,7 +19,8 @@ import java.util.Map;
20 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 20 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
22 21 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
23   -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
  22 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
  23 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_STOCK_NOT_ENOUGH;
24 24 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_PAY_PRICE_ILLEGAL;
25 25  
26 26 /**
... ... @@ -82,18 +82,7 @@ public class TradePriceServiceImpl implements TradePriceService {
82 82  
83 83 private List<ProductSpuRespDTO> checkSpuList(List<ProductSkuRespDTO> skuList) {
84 84 // 获得商品 SPU 数组
85   - List<ProductSpuRespDTO> spus = productSpuApi.getSpuList(convertSet(skuList, ProductSkuRespDTO::getSpuId));
86   -
87   - // 校验商品 SPU
88   - spus.forEach(spu -> {
89   - if (spu == null) {
90   - throw exception(SPU_NOT_EXISTS);
91   - }
92   - if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {
93   - throw exception(SPU_NOT_ENABLE);
94   - }
95   - });
96   - return spus;
  85 + return productSpuApi.getSpuListAndValidate(convertSet(skuList, ProductSkuRespDTO::getSpuId));
97 86 }
98 87  
99 88 }
... ...