diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java index 7e9a59df2..d97a2613f 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java @@ -15,6 +15,7 @@ public interface ErrorCodeConstants { ErrorCode CATEGORY_PARENT_NOT_FIRST_LEVEL = new ErrorCode(1008001002, "父分类不能是二级分类"); ErrorCode CATEGORY_EXISTS_CHILDREN = new ErrorCode(1008001003, "存在子分类,无法删除"); ErrorCode CATEGORY_DISABLED = new ErrorCode(1008001004, "商品分类({})已禁用,无法使用"); + ErrorCode CATEGORY_HAVE_BIND_SPU = new ErrorCode(1008001005, "类别下存在商品,无法删除"); // ========== 商品品牌相关编号 1008002000 ========== ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1008002000, "品牌不存在"); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/ProductBrandController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/ProductBrandController.java index 9cc398169..a7c954124 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/ProductBrandController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/ProductBrandController.java @@ -65,7 +65,7 @@ public class ProductBrandController { @GetMapping("/list-all-simple") @Operation(summary = "获取品牌精简信息列表", description = "主要用于前端的下拉选项") - public CommonResult> getSimpleUserList() { + public CommonResult> getSimpleBrandList() { // 获取品牌列表,只要开启状态的 List list = brandService.getBrandListByStatus(CommonStatusEnum.ENABLE.getStatus()); // 排序后,返回给前端 diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java index e366864eb..3ff46484f 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java @@ -14,8 +14,4 @@ public class ProductPropertyListReqVO { @Schema(description = "属性名称", example = "颜色") private String name; - // TODO @puhui999:这个查询条件的作用是啥呀? - @Schema(description = "属性编号的数组", example = "1,2") - private List propertyIds; - } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java index 96cd7e41b..abb93c911 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuOptionRespVO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuDetailRespVO; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java index 75963e3e1..da05951ab 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.product.dal.mysql.sku; import cn.hutool.core.lang.Assert; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; @@ -70,4 +73,22 @@ public interface ProductSkuMapper extends BaseMapperX { return selectList(new QueryWrapper().apply("stock <= warn_stock")); } + /** + * 更新 sku 属性值时使用的分页查询 + * + * @param pageParam 页面参数 + * @return {@link PageResult}<{@link ProductSkuDO}> + */ + default PageResult selectPage(PageParam pageParam) { + return selectPage(pageParam, new LambdaQueryWrapper().isNotNull(ProductSkuDO::getProperties)); + } + + /** + * 查询 sku properties 不等于 null 的数量 + * + * @return {@link Long} + */ + default Long selectCountByPropertyNotNull() { + return selectCount(new LambdaQueryWrapper().isNotNull(ProductSkuDO::getProperties)); + } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java index 47e395424..29133219f 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java @@ -7,7 +7,8 @@ import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCateg import cn.iocoder.yudao.module.product.convert.category.ProductCategoryConvert; import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; import cn.iocoder.yudao.module.product.dal.mysql.category.ProductCategoryMapper; -import cn.iocoder.yudao.module.product.enums.ProductConstants; +import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -30,6 +31,9 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @Resource private ProductCategoryMapper productCategoryMapper; + @Resource + @Lazy // 循环依赖,避免报错 + private ProductSpuService productSpuService; @Override public Long createCategory(ProductCategoryCreateReqVO createReqVO) { @@ -63,7 +67,8 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { if (productCategoryMapper.selectCountByParentId(id) > 0) { throw exception(CATEGORY_EXISTS_CHILDREN); } - // TODO 芋艿 补充只有不存在商品才可以删除 + // 校验分类是否绑定了 SPU + validateProductCategoryIsHaveBindSpu(id); // 删除 productCategoryMapper.deleteById(id); } @@ -91,6 +96,13 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { } } + private void validateProductCategoryIsHaveBindSpu(Long id) { + Long count = productSpuService.getSpuCountByCategoryId(id); + if (0 != count) { + throw exception(CATEGORY_HAVE_BIND_SPU); + } + } + @Override public ProductCategoryDO getCategory(Long id) { return productCategoryMapper.selectById(id); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java index d33d4df15..6c3ec8938 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.Pro import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert; import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyMapper; +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,6 +39,9 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { @Lazy // 延迟加载,解决循环依赖问题 private ProductPropertyValueService productPropertyValueService; + @Resource + private ProductSkuService productSkuService; + @Override @Transactional(rollbackFor = Exception.class) public Long createProperty(ProductPropertyCreateReqVO createReqVO) { @@ -68,7 +72,8 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { // 更新 ProductPropertyDO updateObj = ProductPropertyConvert.INSTANCE.convert(updateReqVO); productPropertyMapper.updateById(updateObj); - // TODO 芋艿:更新时,需要看看 sku 表 + // TODO 芋艿:更新时,需要看看 sku 表 fix + productSkuService.updateSkuProperty(updateObj); } @Override @@ -94,10 +99,6 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { @Override public List getPropertyList(ProductPropertyListReqVO listReqVO) { - // 增加使用属性 id 查询 - if (CollUtil.isNotEmpty(listReqVO.getPropertyIds())){ - return productPropertyMapper.selectBatchIds(listReqVO.getPropertyIds()); - } return productPropertyMapper.selectList(listReqVO); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java index 231b79b68..f76f8f493 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyValueMapper; import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO; +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -40,6 +41,10 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ @Lazy // 延迟加载,避免循环依赖 private ProductPropertyService productPropertyService; + @Resource + @Lazy // 延迟加载,避免循环依赖 + private ProductSkuService productSkuService; + @Override public Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO) { // 如果已经添加过该属性值,直接返回 @@ -68,7 +73,8 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ // 更新 ProductPropertyValueDO updateObj = ProductPropertyValueConvert.INSTANCE.convert(updateReqVO); productPropertyValueMapper.updateById(updateObj); - // TODO 芋艿:更新时,需要看看 sku 表 + // TODO 芋艿:更新时,需要看看 sku 表 fix + productSkuService.updateSkuPropertyValue(updateObj); } @Override diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java index 8438db684..a46c4fd30 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.product.service.sku; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import org.springframework.lang.Nullable; @@ -115,4 +117,19 @@ public interface ProductSkuService { */ List getSkuListByAlarmStock(); + /** + * 更新 sku 属性 + * + * @param updateObj 属性对象 + * @return int 影响的行数 + */ + int updateSkuProperty(ProductPropertyDO updateObj); + + /** + * 更新 sku 属性值 + * + * @param updateObj 属性值对象 + * @return int 影响的行数 + */ + int updateSkuPropertyValue(ProductPropertyValueDO updateObj); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java index 1bb129876..ee8266467 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.product.service.sku; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; @@ -42,6 +44,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { @Lazy // 循环依赖,避免报错 private ProductSpuService productSpuService; @Resource + @Lazy // 循环依赖,避免报错 private ProductPropertyService productPropertyService; @Resource private ProductPropertyValueService productPropertyValueService; @@ -157,6 +160,84 @@ public class ProductSkuServiceImpl implements ProductSkuService { return productSkuMapper.selectListByAlarmStock(); } + @Override + public int updateSkuProperty(ProductPropertyDO updateObj) { + // TODO 看了一下数据库有关于 json 字符串的处理,怕数据库出现兼容问题这里还是用数据库常规操作来实现 + Long count = productSkuMapper.selectCountByPropertyNotNull(); + int currentPage = 1; + List skuDOs = new ArrayList<>(); + if (count == 0) { + return 0; + } + int pageSize = 100; + for (int i = 0; i <= count / 100; i++) { + PageParam pageParam = new PageParam().setPageNo(currentPage + i).setPageSize(pageSize); + // 分页查找出 sku 属性不为 null 的 + PageResult skuPage = productSkuMapper.selectPage(pageParam); + List records = skuPage.getList(); + if (CollUtil.isEmpty(records)) { + break; + } + records.stream() + .filter(sku -> sku.getProperties() != null) + .forEach(sku -> sku.getProperties().forEach(property -> { + if (property.getPropertyId().equals(updateObj.getId())) { + property.setPropertyName(updateObj.getName()); + skuDOs.add(sku); + } + })); + } + if (CollUtil.isEmpty(skuDOs)) { + return 0; + } + // 每批处理的大小 + int batchSize = 1000; + for (int i = 0; i < skuDOs.size(); i += batchSize) { + List batchSkuDOs = skuDOs.subList(i, Math.min(i + batchSize, skuDOs.size())); + productSkuMapper.updateBatch(batchSkuDOs, batchSize); + } + return skuDOs.size(); + } + + @Override + public int updateSkuPropertyValue(ProductPropertyValueDO updateObj) { + // TODO 看了一下数据库有关于 json 字符串的处理,怕数据库出现兼容问题这里还是用数据库常规操作来实现 + Long count = productSkuMapper.selectCountByPropertyNotNull(); + int currentPage = 1; + List skuDOs = new ArrayList<>(); + if (count == 0) { + return 0; + } + int pageSize = 100; + for (int i = 0; i <= count / 100; i++) { + PageParam pageParam = new PageParam().setPageNo(currentPage + i).setPageSize(pageSize); + // 分页查找出 sku 属性不为 null 的 + PageResult skuPage = productSkuMapper.selectPage(pageParam); + List records = skuPage.getList(); + if (CollUtil.isEmpty(records)) { + break; + } + records.stream() + .filter(sku -> sku.getProperties() != null) + .forEach(sku -> sku.getProperties().forEach(property -> { + if (property.getValueId().equals(updateObj.getId())) { + property.setValueName(updateObj.getName()); + skuDOs.add(sku); + } + })); + } + if (CollUtil.isEmpty(skuDOs)) { + return 0; + } + // 每批处理的大小 + int batchSize = 1000; + for (int i = 0; i < skuDOs.size(); i += batchSize) { + List batchSkuDOs = skuDOs.subList(i, Math.min(i + batchSize, skuDOs.size())); + productSkuMapper.updateBatch(batchSkuDOs, batchSize); + } + return skuDOs.size(); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateSkuList(Long spuId, List skus) { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java index a5dc3b821..5eeca1adb 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java @@ -126,4 +126,13 @@ public interface ProductSpuService { * @return {@link Map}<{@link Integer}, {@link Integer}> */ Map getTabsCount(); + + /** + * 通过分类 id 查询 spu 个数 + * + * @param id 分类 id + * @return spu + */ + Long getSpuCountByCategoryId(Long id); + } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java index 4adc08e18..ed40a281b 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java @@ -251,4 +251,9 @@ public class ProductSpuServiceImpl implements ProductSpuService { return counts; } + @Override + public Long getSpuCountByCategoryId(Long id) { + return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, id); + } + } diff --git a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java b/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java index 9c4d6601d..9df947b43 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java +++ b/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java @@ -49,13 +49,10 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { @MockBean private ProductPropertyValueService productPropertyValueService; - // TODO @puhui999:是不是可以删除这 2 方法 public Long generateId() { return RandomUtil.randomLong(100000, 999999); } - public int generaInt(){return RandomUtil.randomInt(1,9999999);} - @Test public void testUpdateSkuList() { // mock 数据 @@ -109,7 +106,14 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(10))); // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> o.setId(1L).setSpuId(10L).setStock(20))); + productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { + o.setId(1L).setSpuId(10L).setStock(20); + o.getProperties().forEach(p -> { + // 指定 id 范围 解决 Value too long + p.setPropertyId(generateId()); + p.setValueId(generateId()); + }); + })); // 调用 productSkuService.updateSkuStock(updateStockReqDTO); @@ -129,7 +133,14 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(-10))); // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> o.setId(1L).setSpuId(10L).setStock(20))); + productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { + o.setId(1L).setSpuId(10L).setStock(20); + o.getProperties().forEach(p -> { + // 指定 id 范围 解决 Value too long + p.setPropertyId(generateId()); + p.setValueId(generateId()); + }); + })); // 调用 productSkuService.updateSkuStock(updateStockReqDTO); @@ -149,8 +160,14 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(-30))); // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> o.setId(1L).setSpuId(10L).setStock(20))); - + productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { + o.setId(1L).setSpuId(10L).setStock(20); + o.getProperties().forEach(p -> { + // 指定 id 范围 解决 Value too long + p.setPropertyId(generateId()); + p.setValueId(generateId()); + }); + })); // 调用并断言 AssertUtils.assertServiceException(() -> productSkuService.updateSkuStock(updateStockReqDTO), SKU_STOCK_NOT_ENOUGH); @@ -158,9 +175,16 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { @Test public void testDeleteSku_success() { + ProductSkuDO dbSku = randomPojo(ProductSkuDO.class, o -> { + o.setId(generateId()).setSpuId(generateId()); + o.getProperties().forEach(p -> { + // 指定 id 范围 解决 Value too long + p.setPropertyId(generateId()); + p.setValueId(generateId()); + }); + }); // mock 数据 - ProductSkuDO dbSku = randomPojo(ProductSkuDO.class); - productSkuMapper.insert(dbSku);// @Sql: 先插入出一条存在的数据 + productSkuMapper.insert(dbSku); // 准备参数 Long id = dbSku.getId(); diff --git a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java b/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java index 30f6c293b..e57540292 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java +++ b/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java @@ -455,7 +455,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { public void testUpdateSpuStock() { // 准备参数 Map stockIncrCounts = MapUtil.builder(1L, 10).put(2L, -20).build(); - // mock 方法(数据) // TODO ProductSpuDO中已没有相关属性 + // mock 方法(数据) productSpuMapper.insert(randomPojo(ProductSpuDO.class, o ->{ o.setCategoryId(generateId()); o.setBrandId(generateId()); @@ -495,7 +495,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { // 调用 productSpuService.updateSpuStock(stockIncrCounts); - // 断言 // TODO ProductSpuDO中已没有相关属性 + // 断言 assertEquals(productSpuService.getSpu(1L).getStock(), 30); assertEquals(productSpuService.getSpu(2L).getStock(), 10); }