Commit be370ba2cf190b1a441b13ff13074eba1a79bc11
1 parent
613eef37
spu 修改调整,组合分类和规格属性,方便前端修改的回显展示
Showing
3 changed files
with
82 additions
and
3 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/ProductPropertyViewRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.product.controller.admin.property.vo; | |
| 2 | + | |
| 3 | +import io.swagger.annotations.ApiModel; | |
| 4 | +import io.swagger.annotations.ApiModelProperty; | |
| 5 | +import lombok.Data; | |
| 6 | +import lombok.ToString; | |
| 7 | + | |
| 8 | +import java.util.Set; | |
| 9 | + | |
| 10 | +/** | |
| 11 | + * @Description: ProductPropertyViewRespVO | |
| 12 | + * @Author: franky | |
| 13 | + * @CreateDate: 2022/7/5 21:29 | |
| 14 | + * @Version: 1.0.0 | |
| 15 | + */ | |
| 16 | +@ApiModel("管理后台 - 规格名称详情展示 Request VO") | |
| 17 | +@Data | |
| 18 | +@ToString(callSuper = true) | |
| 19 | +public class ProductPropertyViewRespVO { | |
| 20 | + | |
| 21 | + @ApiModelProperty(value = "规格名称id", example = "1") | |
| 22 | + public Long propertyId; | |
| 23 | + | |
| 24 | + @ApiModelProperty(value = "规格名称", example = "内存") | |
| 25 | + public String name; | |
| 26 | + | |
| 27 | + @ApiModelProperty(value = "规格属性值集合", example = "[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]") | |
| 28 | + public Set<Tuple2> propertyValues; | |
| 29 | + | |
| 30 | + @Data | |
| 31 | + @ApiModel(value = "规格属性值元组") | |
| 32 | + public static class Tuple2 { | |
| 33 | + private final long v1; | |
| 34 | + private final String v2; | |
| 35 | + public Tuple2(Long v1, String v2) { | |
| 36 | + this.v1 = v1; | |
| 37 | + this.v2 = v2; | |
| 38 | + } | |
| 39 | + | |
| 40 | + } | |
| 41 | + | |
| 42 | + | |
| 43 | +} | ... | ... |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.module.product.controller.admin.property.vo.ProductPropertyViewRespVO; | |
| 3 | 4 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; |
| 4 | 5 | import io.swagger.annotations.ApiModel; |
| 5 | 6 | import io.swagger.annotations.ApiModelProperty; |
| ... | ... | @@ -19,7 +20,7 @@ public class SpuRespVO extends ProductSpuBaseVO { |
| 19 | 20 | |
| 20 | 21 | // TODO @franky:注解要完整 |
| 21 | 22 | |
| 22 | - @ApiModelProperty(value = "主键", required = true) | |
| 23 | + @ApiModelProperty(value = "主键", required = true, example = "1") | |
| 23 | 24 | private Long id; |
| 24 | 25 | |
| 25 | 26 | @ApiModelProperty(value = "创建时间") |
| ... | ... | @@ -28,9 +29,13 @@ public class SpuRespVO extends ProductSpuBaseVO { |
| 28 | 29 | /** |
| 29 | 30 | * SKU 数组 |
| 30 | 31 | */ |
| 31 | - List<ProductSkuRespVO> skus; | |
| 32 | + @ApiModelProperty(value = "sku 数组", example = "[{\"spuId\":4,\"properties\":[{\"propertyId\":3,\"valueId\":15},{\"propertyId\":2,\"valueId\":10}],\"price\":12,\"originalPrice\":32,\"costPrice\":22,\"barCode\":\"765670123123\",\"picUrl\":\"http://test.yudao.iocoder.cn/72938088f1ca8438837c3b51394aea43.jpg\",\"status\":0,\"id\":7,\"createTime\":1656683270000},{\"spuId\":4,\"properties\":[{\"propertyId\":3,\"valueId\":15},{\"propertyId\":2,\"valueId\":11}],\"price\":13,\"originalPrice\":33,\"costPrice\":23,\"barCode\":\"888788770999\",\"picUrl\":\"http://test.yudao.iocoder.cn/6b902c700e5d32e862b6fd9af2e1c0e4.jpg\",\"status\":0,\"id\":8,\"createTime\":1656683270000},{\"spuId\":4,\"properties\":[{\"propertyId\":3,\"valueId\":16},{\"propertyId\":2,\"valueId\":10}],\"price\":14,\"originalPrice\":34,\"costPrice\":24,\"barCode\":\"9999981212\",\"picUrl\":\"http://test.yudao.iocoder.cn/eddf3c79b1917160d94d05244e1f47da.jpg\",\"status\":0,\"id\":9,\"createTime\":1656683270000},{\"spuId\":4,\"properties\":[{\"propertyId\":3,\"valueId\":16},{\"propertyId\":2,\"valueId\":11}],\"price\":15,\"originalPrice\":35,\"costPrice\":25,\"barCode\":\"4444121212\",\"picUrl\":\"http://test.yudao.iocoder.cn/88ac3eb068ea9cfac4726879b2776ccf.jpg\",\"status\":0,\"id\":10,\"createTime\":1656683270000}]") | |
| 33 | + private List<ProductSkuRespVO> skus; | |
| 32 | 34 | |
| 33 | 35 | @ApiModelProperty(value = "分类id数组,一直递归到一级父节点", example = "[1,2,4]") |
| 34 | - LinkedList<Long> categoryIds; | |
| 36 | + private LinkedList<Long> categoryIds; | |
| 37 | + | |
| 38 | + @ApiModelProperty(value = "规格属性修改和详情展示组合", example = "[{\"propertyId\":2,\"name\":\"内存\",\"propertyValues\":[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]},{\"propertyId\":3,\"name\":\"尺寸\",\"propertyValues\":[{\"v1\":16,\"v2\":\"6.1\"},{\"v1\":15,\"v2\":\"5.7\"}]}]") | |
| 39 | + private List<ProductPropertyViewRespVO> productPropertyViews; | |
| 35 | 40 | |
| 36 | 41 | } | ... | ... |
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 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | +import cn.iocoder.yudao.module.product.controller.admin.property.vo.ProductPropertyRespVO; | |
| 5 | +import cn.iocoder.yudao.module.product.controller.admin.property.vo.ProductPropertyViewRespVO; | |
| 6 | +import cn.iocoder.yudao.module.product.controller.admin.propertyvalue.vo.ProductPropertyValueRespVO; | |
| 7 | +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; | |
| 4 | 8 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateReqVO; |
| 5 | 9 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; |
| 6 | 10 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; |
| ... | ... | @@ -11,6 +15,7 @@ import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 11 | 15 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 12 | 16 | import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; |
| 13 | 17 | import cn.iocoder.yudao.module.product.service.category.CategoryService; |
| 18 | +import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; | |
| 14 | 19 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; |
| 15 | 20 | import org.springframework.stereotype.Service; |
| 16 | 21 | import org.springframework.transaction.annotation.Transactional; |
| ... | ... | @@ -41,6 +46,9 @@ public class ProductSpuServiceImpl implements ProductSpuService { |
| 41 | 46 | @Resource |
| 42 | 47 | private ProductSkuService productSkuService; |
| 43 | 48 | |
| 49 | + @Resource | |
| 50 | + private ProductPropertyService productPropertyService; | |
| 51 | + | |
| 44 | 52 | @Override |
| 45 | 53 | @Transactional |
| 46 | 54 | public Long createSpu(ProductSpuCreateReqVO createReqVO) { |
| ... | ... | @@ -104,6 +112,29 @@ public class ProductSpuServiceImpl implements ProductSpuService { |
| 104 | 112 | if (null != spuVO) { |
| 105 | 113 | List<ProductSkuRespVO> skuReqs = ProductSkuConvert.INSTANCE.convertList(productSkuService.getSkusBySpuId(id)); |
| 106 | 114 | spuVO.setSkus(skuReqs); |
| 115 | + List<ProductSkuRespVO.Property> properties = new ArrayList<>(); | |
| 116 | + // 组合 sku 规格属性 | |
| 117 | + for (ProductSkuRespVO productSkuRespVO : skuReqs) { | |
| 118 | + properties.addAll(productSkuRespVO.getProperties()); | |
| 119 | + } | |
| 120 | + Map<Long, List<ProductSkuBaseVO.Property>> propertyMaps = properties.stream().collect(Collectors.groupingBy(ProductSkuBaseVO.Property::getPropertyId)); | |
| 121 | + List<ProductPropertyRespVO> propertyAndValueList = productPropertyService.selectByIds(new ArrayList<>(propertyMaps.keySet())); | |
| 122 | + // 装载组装过后的属性 | |
| 123 | + List<ProductPropertyViewRespVO> productPropertyViews = new ArrayList<>(); | |
| 124 | + propertyAndValueList.forEach(p -> { | |
| 125 | + ProductPropertyViewRespVO productPropertyViewRespVO = new ProductPropertyViewRespVO(); | |
| 126 | + productPropertyViewRespVO.setPropertyId(p.getId()); | |
| 127 | + productPropertyViewRespVO.setName(p.getName()); | |
| 128 | + Set<ProductPropertyViewRespVO.Tuple2> propertyValues = new HashSet<>(); | |
| 129 | + Map<Long, ProductPropertyValueRespVO> propertyValueMaps = p.getPropertyValueList().stream().collect(Collectors.toMap(ProductPropertyValueRespVO::getId, pv -> pv)); | |
| 130 | + propertyMaps.get(p.getId()).forEach(pv -> { | |
| 131 | + ProductPropertyViewRespVO.Tuple2 tuple2 = new ProductPropertyViewRespVO.Tuple2(pv.getValueId(), propertyValueMaps.get(pv.getValueId()).getName()); | |
| 132 | + propertyValues.add(tuple2); | |
| 133 | + }); | |
| 134 | + productPropertyViewRespVO.setPropertyValues(propertyValues); | |
| 135 | + productPropertyViews.add(productPropertyViewRespVO); | |
| 136 | + }); | |
| 137 | + spuVO.setProductPropertyViews(productPropertyViews); | |
| 107 | 138 | // 组合分类 |
| 108 | 139 | if (null != spuVO.getCategoryId()) { |
| 109 | 140 | LinkedList<Long> categoryArray = new LinkedList<>(); | ... | ... |