diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java index a8974243e..132d68d94 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java @@ -25,7 +25,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Api(tags = "管理后台-商品 sku") +@Api(tags = "管理后台 - 商品 sku") @RestController @RequestMapping("/product/sku") @Validated diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuExcelVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuExcelVO.java index 16d189a74..7caf1313d 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuExcelVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuExcelVO.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.product.controller.admin.sku.vo; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; - import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; /** * 商品sku Excel VO @@ -20,6 +20,7 @@ public class ProductSkuExcelVO { @ExcelProperty("spu编号") private Long spuId; + // TODO @franky:这个单元格,可能会有点展示的问题 @ExcelProperty("规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }]") private List properties; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuRespVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuRespVO.java index 390746cd3..f2b97aee7 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuRespVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuRespVO.java @@ -1,9 +1,14 @@ package cn.iocoder.yudao.module.product.controller.admin.spu.vo; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; +import java.util.List; @ApiModel("管理后台 - 商品spu Response VO") @Data @@ -11,12 +16,17 @@ import io.swagger.annotations.*; @ToString(callSuper = true) public class SpuRespVO extends ProductSpuBaseVO { + // TODO @franky:注解要完整 + @ApiModelProperty(value = "主键", required = true) private Long id; @ApiModelProperty(value = "创建时间") private Date createTime; + /** + * SKU 数组 + */ List skus; } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java index 34a115565..1ffaaeef2 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java @@ -6,8 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; -import java.util.List; - /** * 商品sku DO * @@ -35,6 +33,7 @@ public class ProductSkuDO extends BaseDO { /** * 规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }] */ + // TODO franky:可以定义一个内部的 Property 类,然后 List private String properties; /** * 销售价格,单位:分 diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/propertyvalue/ProductPropertyValueMapper.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/propertyvalue/ProductPropertyValueMapper.java index 768875c3e..5c11a9f42 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/propertyvalue/ProductPropertyValueMapper.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/propertyvalue/ProductPropertyValueMapper.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.product.dal.mysql.propertyvalue; -import java.util.*; - -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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.property.ProductPropertyValueDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 规格值 Mapper * @@ -15,12 +15,15 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ProductPropertyValueMapper extends BaseMapperX { + // TODO @franky:方法名,selectListByXXX。mapper 的操作都是 crud default List getPropertyValueListByPropertyId(List propertyIds){ + // TODO @franky:调用父类的 selectList return selectList(new LambdaQueryWrapperX() .inIfPresent(ProductPropertyValueDO::getPropertyId, propertyIds)); } default void deletePropertyValueByPropertyId(Long propertyId){ + // TODO @franky:delete(new ) 即可 LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); queryWrapperX.eq(ProductPropertyValueDO::getPropertyId, propertyId) .eq(ProductPropertyValueDO::getDeleted, false); 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 a42a50773..5b856fd96 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,14 +1,14 @@ package cn.iocoder.yudao.module.product.dal.mysql.sku; -import java.util.*; - import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuExportReqVO; +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuPageReqVO; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*; + +import java.util.List; /** * 商品sku Mapper @@ -46,13 +46,14 @@ public interface ProductSkuMapper extends BaseMapperX { .orderByDesc(ProductSkuDO::getId)); } + // TODO @franky:方法名 selectList; 可以直接调用 selectList default List selectBySpuIds(List spuIds) { return selectList(new LambdaQueryWrapperX() - .inIfPresent(ProductSkuDO::getSpuId, spuIds) - ); + .inIfPresent(ProductSkuDO::getSpuId, spuIds)); } default void deleteBySpuId(Long spuId) { + // TODO @franky:直接 delete(new XXX) 即可,更简洁一些 LambdaQueryWrapperX lambdaQueryWrapperX = new LambdaQueryWrapperX() .eqIfPresent(ProductSkuDO::getSpuId, spuId); delete(lambdaQueryWrapperX); 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 a398b4620..0396506ef 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 @@ -80,13 +80,14 @@ public interface ProductSkuService { void validateSkus(List list); /** - * 批量保存sku + * 批量保存 sku + * * @param list sku对象集合 */ void createSkus(List list); /** - * 获得商品sku 集合 + * 获得商品 sku 集合 * * @param spuId spu 编号 * @return 商品sku 集合 @@ -94,6 +95,7 @@ public interface ProductSkuService { List getSkusBySpuId(Long spuId); /** + * 获得 spu 对应的 sku 集合 * * @param spuIds spu 编码集合 * @return 商品 sku 集合 @@ -102,12 +104,14 @@ public interface ProductSkuService { /** * 通过 spuId 删除 sku 信息 + * * @param spuId spu 编码 */ void deleteSkuBySpuId(Long spuId); /** * 根据 spuId 更新 spu 下的 sku 信息 + * * @param spuId spu 编码 * @param skus sku 的集合 */ 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 4bab281d1..91a60929b 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 @@ -148,6 +148,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { List allUpdateSkus = ProductSkuConvert.INSTANCE.convertSkuDOList(skus); // 查询 spu 下已经存在的 sku 的集合 List existsSkus = productSkuMapper.selectBySpuIds(Collections.singletonList(spuId)); + // TODO @franky:使用 CollUtils 即可 Map existsSkuMap = existsSkus.stream().collect(Collectors.toMap(ProductSkuDO::getId, p -> p)); // 拆分三个集合, 新插入的, 需要更新的,需要删除的 @@ -155,6 +156,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { List updateSkus = new ArrayList<>(); List deleteSkus = new ArrayList<>(); + // TODO @芋艿:是不是基于规格匹配会比较好。 allUpdateSkus.forEach(p -> { if (null != p.getId()) { if (existsSkuMap.get(p.getId()) != null) { 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 4ce99d0b5..fbcd32031 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 @@ -1,31 +1,28 @@ package cn.iocoder.yudao.module.product.service.spu; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateReqVO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; +import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; +import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; import cn.iocoder.yudao.module.product.service.category.CategoryService; import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import javax.validation.Valid; - import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.*; +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; -import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; -import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; - import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; /** * 商品spu Service 实现类 @@ -123,11 +120,10 @@ public class ProductSpuServiceImpl implements ProductSpuService { // 查询 sku 的信息 List spuIds = spuVOs.getList().stream().map(SpuRespVO::getId).collect(Collectors.toList()); List skus = ProductSkuConvert.INSTANCE.convertList(productSkuService.getSkusBySpuIds(spuIds)); + // TODO @franky:使用 CollUtil 里的方法替代哈 Map> skuMap = skus.stream().collect(Collectors.groupingBy(ProductSkuRespVO::getSpuId)); // 将 spu 和 sku 进行组装 - spuVOs.getList().forEach(p -> { - p.setSkus(skuMap.get(p.getId())); - }); + spuVOs.getList().forEach(p -> p.setSkus(skuMap.get(p.getId()))); return spuVOs; }