From 83fdf181b817a77783dcb3b00cb37bed99176a13 Mon Sep 17 00:00:00 2001 From: YunaiV <> Date: Tue, 5 Mar 2019 21:53:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=9B=B4=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admins/AdminsProductSpuController.java | 11 ++-- .../mall/product/api/ProductSpuService.java | 4 +- ...DTO.java => ProductSkuAddOrUpdateDTO.java} | 15 ++++-- .../product/api/dto/ProductSkuUpdateDTO.java | 50 ------------------- .../product/api/dto/ProductSpuAddDTO.java | 6 +-- .../product/api/dto/ProductSpuUpdateDTO.java | 6 +-- .../product/convert/ProductSpuConvert.java | 10 +--- .../mall/product/dataobject/ProductSpuDO.java | 6 +-- .../service/ProductSpuServiceImpl.java | 33 ++++++++---- 9 files changed, 52 insertions(+), 89 deletions(-) rename product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/{ProductSkuAddDTO.java => ProductSkuAddOrUpdateDTO.java} (54%) delete mode 100644 product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java index a6eba1d27..59fde7a0d 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java @@ -4,8 +4,7 @@ import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder; import cn.iocoder.mall.product.api.ProductSpuService; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; -import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO; -import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO; +import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.application.convert.ProductSpuConvert; @@ -57,7 +56,7 @@ public class AdminsProductSpuController { // 创建 ProductSpuAddDTO 对象 ProductSpuAddDTO productSpuAddDTO = new ProductSpuAddDTO().setName(name).setSellPoint(sellPoint) .setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible) - .setSkus(parseSkus(skuStr, ProductSkuAddDTO.class)); + .setSkus(parseSkus(skuStr, ProductSkuAddOrUpdateDTO.class)); // 保存商品 CommonResult result = productSpuService.addProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuAddDTO); // 返回结果 @@ -88,7 +87,7 @@ public class AdminsProductSpuController { // 创建 ProductSpuUpdateDTO 对象 ProductSpuUpdateDTO productSpuUpdateDTO = new ProductSpuUpdateDTO().setId(id).setName(name).setSellPoint(sellPoint) .setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible) - .setSkus(parseSkus(skuStr, ProductSkuUpdateDTO.class)); + .setSkus(parseSkus(skuStr, ProductSkuAddOrUpdateDTO.class)); // 更新商品 return productSpuService.updateProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuUpdateDTO); } @@ -97,9 +96,11 @@ public class AdminsProductSpuController { @ApiOperation("更新商品的排序") public CommonResult updateSort(@RequestParam("id") Integer id, @RequestParam("sort") Integer sort) { - return null; + return productSpuService.updateProductSpuSort(AdminSecurityContextHolder.getContext().getAdminId(), id, sort); } + // TODO 芋艿,删除功能暂时不做。主要原因是,关联的数据太多。删除带来的问题会比较大 + @GetMapping("/spu/page") @ApiOperation("商品 SPU 分页列表") public CommonResult spuPage() { diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java index 17256f3d6..f5e2543a4 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java @@ -14,6 +14,6 @@ public interface ProductSpuService { CommonResult updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO); + CommonResult updateProductSpuSort(Integer adminId, Integer spuId, Integer sort); - -} +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddOrUpdateDTO.java similarity index 54% rename from product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java rename to product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddOrUpdateDTO.java index d3986ccac..3c6bbffc8 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddOrUpdateDTO.java @@ -1,30 +1,37 @@ package cn.iocoder.mall.product.api.dto; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; import java.util.List; /** * 商品 Sku 添加 DTO */ -public class ProductSkuAddDTO { +public class ProductSkuAddOrUpdateDTO { /** * 规格值数组 */ + @NotNull(message = "规格值数组不能为空") private List attrs; /** * 价格,单位:分 */ + @NotNull(message = "价格不能为空") + @Min(value = 1L, message = "最小价格为 1") private Integer price; /** * 库存数量 */ + @NotNull(message = "库存数量不能为空") + @Min(value = 1L, message = "最小库存为 1") private Integer quantity; public List getAttrs() { return attrs; } - public ProductSkuAddDTO setAttrs(List attrs) { + public ProductSkuAddOrUpdateDTO setAttrs(List attrs) { this.attrs = attrs; return this; } @@ -33,7 +40,7 @@ public class ProductSkuAddDTO { return price; } - public ProductSkuAddDTO setPrice(Integer price) { + public ProductSkuAddOrUpdateDTO setPrice(Integer price) { this.price = price; return this; } @@ -42,7 +49,7 @@ public class ProductSkuAddDTO { return quantity; } - public ProductSkuAddDTO setQuantity(Integer quantity) { + public ProductSkuAddOrUpdateDTO setQuantity(Integer quantity) { this.quantity = quantity; return this; } diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java deleted file mode 100644 index f11ad3707..000000000 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.mall.product.api.dto; - -import java.util.List; - -/** - * 商品 Sku 更新 DTO - */ -public class ProductSkuUpdateDTO { - - /** - * 规格值数组 - */ - private List attrs; - /** - * 价格,单位:分 - */ - private Integer price; - /** - * 库存数量 - */ - private Integer quantity; - - public List getAttrs() { - return attrs; - } - - public ProductSkuUpdateDTO setAttrs(List attrs) { - this.attrs = attrs; - return this; - } - - public Integer getPrice() { - return price; - } - - public ProductSkuUpdateDTO setPrice(Integer price) { - this.price = price; - return this; - } - - public Integer getQuantity() { - return quantity; - } - - public ProductSkuUpdateDTO setQuantity(Integer quantity) { - this.quantity = quantity; - return this; - } - -} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java index 948c60a02..86c650db1 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java @@ -52,7 +52,7 @@ public class ProductSpuAddDTO { * SKU 数组 */ @NotNull(message = "SKU 不能为空") - private List skus; + private List skus; public String getName() { return name; @@ -108,11 +108,11 @@ public class ProductSpuAddDTO { return this; } - public List getSkus() { + public List getSkus() { return skus; } - public ProductSpuAddDTO setSkus(List skus) { + public ProductSpuAddDTO setSkus(List skus) { this.skus = skus; return this; } diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java index 4021f7fb0..7847ed61b 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java @@ -58,7 +58,7 @@ public class ProductSpuUpdateDTO { * SKU 数组 */ @NotNull(message = "SKU 不能为空") - private List skus; + private List skus; public String getName() { return name; @@ -114,11 +114,11 @@ public class ProductSpuUpdateDTO { return this; } - public List getSkus() { + public List getSkus() { return skus; } - public ProductSpuUpdateDTO setSkus(List skus) { + public ProductSpuUpdateDTO setSkus(List skus) { this.skus = skus; return this; } diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java index a016b3444..b32d012c8 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java @@ -5,8 +5,7 @@ import cn.iocoder.mall.product.api.bo.ProductAttrDetailBO; import cn.iocoder.mall.product.api.bo.ProductSkuDetailBO; import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; -import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO; -import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO; +import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.dataobject.ProductSkuDO; @@ -37,7 +36,7 @@ public interface ProductSpuConvert { @Mappings({ @Mapping(source = "attrs", target = "attrs", ignore = true) }) - ProductSkuDO convert(ProductSkuAddDTO productSkuAddDTO); + ProductSkuDO convert(ProductSkuAddOrUpdateDTO productSkuAddDTO); @Mappings({ @@ -45,11 +44,6 @@ public interface ProductSpuConvert { }) ProductSpuDO convert(ProductSpuUpdateDTO productSpuUpdateDTO); - @Mappings({ - @Mapping(source = "attrs", target = "attrs", ignore = true) - }) - ProductSkuDO convert(ProductSkuUpdateDTO productSkuUpdateDTO); - @Mappings({}) ProductSpuDetailBO convert(ProductSpuBO spu); diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java index e64d9949f..82906c340 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java @@ -61,8 +61,9 @@ public class ProductSpuDO extends BaseDO { return id; } - public void setId(Integer id) { + public ProductSpuDO setId(Integer id) { this.id = id; + return this; } public String getName() { @@ -127,7 +128,4 @@ public class ProductSpuDO extends BaseDO { this.sort = sort; return this; } - - - } \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java index 9bf868b21..45dfe9985 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java @@ -11,8 +11,7 @@ import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum; import cn.iocoder.mall.product.api.constant.ProductSpuConstants; -import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO; -import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO; +import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.convert.ProductSpuConvert; @@ -110,6 +109,11 @@ public class ProductSpuServiceImpl implements ProductSpuService { if (validAttrResult.isError()) { return CommonResult.error(validAttrResult); } + // 校验 Sku 规格 + CommonResult validProductSkuResult = validProductSku(productSpuUpdateDTO.getSkus(), validAttrResult.getData()); + if (validProductSkuResult.isError()) { + return CommonResult.error(validProductSkuResult); + } // 更新 Spu ProductSpuDO updateSpu = ProductSpuConvert.INSTANCE.convert(productSpuUpdateDTO) .setPicUrls(StringUtil.join(productSpuUpdateDTO.getPicUrls(), ",")); @@ -119,7 +123,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { List insertSkus = new ArrayList<>(0); // 1、找不到,进行插入 List deleteSkus = new ArrayList<>(0); // 2、多余的,删除 List updateSkus = new ArrayList<>(0); // 3、找的到,进行更新。 - for (ProductSkuUpdateDTO skuUpdateDTO : productSpuUpdateDTO.getSkus()) { + for (ProductSkuAddOrUpdateDTO skuUpdateDTO : productSpuUpdateDTO.getSkus()) { ProductSkuDO existsSku = findProductSku(skuUpdateDTO.getAttrs(), existsSkus); // 3、找的到,进行更新。 if (existsSku != null) { @@ -149,19 +153,28 @@ public class ProductSpuServiceImpl implements ProductSpuService { if (!deleteSkus.isEmpty()) { productSkuMapper.updateToDeleted(deleteSkus); } -// if (true) { -// throw new RuntimeException("test"); -// } - // 校验 Sku 规格 return CommonResult.success(true); } - private CommonResult validProductSku(List productSkuAddDTOs, List productAttrDetailBOs) { + @Override + public CommonResult updateProductSpuSort(Integer adminId, Integer spuId, Integer sort) { + // 校验 Spu 是否存在 + if (productSpuMapper.selectById(spuId) == null) { + return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_NOT_EXISTS.getCode()); + } + // 更新排序 + ProductSpuDO updateSpu = new ProductSpuDO().setId(spuId).setSort(sort); + productSpuMapper.update(updateSpu); + // 返回成功 + return CommonResult.success(true); + } + + private CommonResult validProductSku(List productSkuAddDTOs, List productAttrDetailBOs) { // 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号 Map productAttrDetailBOMap = productAttrDetailBOs.stream().collect( Collectors.toMap(ProductAttrDetailBO::getAttrValueId, productAttrDetailBO -> productAttrDetailBO)); // 1. 先校验,一个 Sku 下,没有重复的规格。校验方式是,遍历每个 Sku ,看看是否有重复的规格 attrId - for (ProductSkuAddDTO sku : productSkuAddDTOs) { + for (ProductSkuAddOrUpdateDTO sku : productSkuAddDTOs) { Set attrIds = sku.getAttrs().stream().map(attrValueId -> productAttrDetailBOMap.get(attrValueId).getAttrId()).collect(Collectors.toSet()); if (attrIds.size() != sku.getAttrs().size()) { return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SKU_ATTR_CANT_NOT_DUPLICATE.getCode()); @@ -176,7 +189,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { } // 3. 最后校验,每个 Sku 之间不是重复的 Set> skuAttrValues = new HashSet<>(); // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的. - for (ProductSkuAddDTO sku : productSkuAddDTOs) { + for (ProductSkuAddOrUpdateDTO sku : productSkuAddDTOs) { if (!skuAttrValues.add(new HashSet<>(sku.getAttrs()))) { // 添加失败,说明重复 return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_SKU__NOT_DUPLICATE.getCode()); }