Price 价格服务的编写

This commit is contained in:
YunaiV
2020-08-15 15:37:53 +08:00
parent 5122b68aca
commit 8818b350d6
26 changed files with 330 additions and 60 deletions

View File

@@ -1,5 +1,8 @@
package cn.iocoder.mall.productservice.rpc.sku.dto;
import cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyValueRespDTO;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -46,5 +49,19 @@ public class ProductSkuRespDTO implements Serializable {
* 创建时间
*/
private Date createTime;
/**
* 规格值数组
*
* 需要设置 {@link ProductSkuDetailFieldEnum#ATTR} 才返回
*/
private List<ProductAttrKeyValueRespDTO> attrs;
/**
* 商品 SPU 信息
*
* 需要设置 {@link ProductSkuDetailFieldEnum#SPU} 才返回
*
* // TODO 芋艿,后续考虑怎么优化下,目前是内嵌了别的 dto
*/
private ProductSpuRespDTO spu;
}

View File

@@ -70,6 +70,13 @@
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Test 相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@@ -1,18 +1,25 @@
package cn.iocoder.mall.productservice.convert.sku;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyValueRespDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyValueBO;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuCreateOrUpdateBO;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO;
import cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Mapper
public interface ProductSkuConvert {
@@ -33,7 +40,30 @@ public interface ProductSkuConvert {
ProductSkuListQueryBO convert(ProductSkuListQueryReqDTO bean);
List<ProductSkuRespDTO> convertList03(List<ProductSkuBO> list);
ProductSpuRespDTO convert(ProductSpuBO bean);
ProductAttrKeyValueRespDTO convert(ProductAttrKeyValueBO bean);
default List<ProductSkuRespDTO> convertList(List<ProductSkuBO> skuBOs, List<ProductSpuBO> spuBOs,
List<ProductAttrKeyValueBO> attrBOs) {
// 创建 ProductAttrDetailBO 的映射。其中KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
Map<Integer, ProductAttrKeyValueBO> attrDetailBOMap = CollectionUtils.convertMap(attrBOs,
ProductAttrKeyValueBO::getAttrValueId);
// 构建 ProductSpuBO 的映射。
Map<Integer, ProductSpuBO> spuBOMap = CollectionUtils.convertMap(spuBOs, ProductSpuBO::getId);
// 拼接数据
List<ProductSkuRespDTO> skuRespDTOs = new ArrayList<>(skuBOs.size());
skuBOs.forEach(skuBO -> {
ProductSkuRespDTO skuRespDTO = convert(skuBO);
skuRespDTOs.add(skuRespDTO);
// 拼接商品 SPU
skuRespDTO.setSpu(convert(spuBOMap.get(skuBO.getSpuId())));
// 拼接商品 Attr
skuRespDTO.setAttrs(new ArrayList<>());
skuBO.getAttrValueIds().forEach(attrValueId -> skuRespDTO.getAttrs().add(convert(attrDetailBOMap.get(attrValueId))));
});
return skuRespDTOs;
}
@Named("translateAttrValueIdsFromString")
default List<Integer> translateAttrValueIdsFromString(String attrValueIdsStar) {

View File

@@ -63,21 +63,21 @@ public interface ProductSpuConvert {
ProductAttrKeyValueRespDTO convert(ProductAttrKeyValueBO bean);
default ProductSpuDetailRespDTO convert(ProductSpuBO spuBO, List<ProductSkuBO> skuBOs, List<ProductAttrKeyValueBO> attrBOs,
ProductCategoryBO categoryBO) {
default ProductSpuDetailRespDTO convert(ProductSpuBO spuBO, List<ProductSkuBO> skuBOs,
List<ProductAttrKeyValueBO> attrBOs, ProductCategoryBO categoryBO) {
// 创建并转换 ProductSpuDetailBO 对象
ProductSpuDetailRespDTO spuDetailDTO = this.convert2(spuBO);
// 创建 ProductAttrDetailBO 的映射。其中KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
Map<Integer, ProductAttrKeyValueBO> productAttrDetailBOMap = attrBOs.stream().collect(
Map<Integer, ProductAttrKeyValueBO> attrDetailBOMap = attrBOs.stream().collect(
Collectors.toMap(ProductAttrKeyValueBO::getAttrValueId, attrBO -> attrBO));
// 创建并转换 ProductSpuDetailBO 数组
spuDetailDTO.setSkus(new ArrayList<>());
skuBOs.forEach(sku -> {
skuBOs.forEach(skuBO -> {
// 创建 ProductSpuDetailBO 对象
ProductSpuDetailRespDTO.Sku skuDetail = convert(sku).setAttrs(new ArrayList<>());
ProductSpuDetailRespDTO.Sku skuDetail = convert(skuBO).setAttrs(new ArrayList<>());
spuDetailDTO.getSkus().add(skuDetail);
// 设置 ProductSpuDetailBO 的 attrs 规格属性
sku.getAttrValueIds().forEach(attrValueId -> skuDetail.getAttrs().add(convert(productAttrDetailBOMap.get(attrValueId))));
skuBO.getAttrValueIds().forEach(attrValueId -> skuDetail.getAttrs().add(convert(attrDetailBOMap.get(attrValueId))));
});
// 设置分类名
spuDetailDTO.setCategoryName(categoryBO.getName());

View File

@@ -2,15 +2,22 @@ package cn.iocoder.mall.productservice.manager.sku;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert;
import cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import cn.iocoder.mall.productservice.service.attr.ProductAttrService;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyValueBO;
import cn.iocoder.mall.productservice.service.sku.ProductSkuService;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO;
import cn.iocoder.mall.productservice.service.spu.ProductSpuService;
import cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 商品 SKU Manager
@@ -20,6 +27,10 @@ public class ProductSkuManager {
@Autowired
private ProductSkuService productSkuService;
@Autowired
private ProductSpuService productSpuService;
@Autowired
private ProductAttrService productAttrService;
/**
* 获得商品 SKU
@@ -40,13 +51,26 @@ public class ProductSkuManager {
*/
public List<ProductSkuRespDTO> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO) {
// 获得商品 SKU 列表
List<ProductSkuBO> productSkuBOs = productSkuService.listProductSkus(
List<ProductSkuBO> skuBOs = productSkuService.listProductSkus(
ProductSkuConvert.INSTANCE.convert(queryReqDTO));
if (CollectionUtils.isEmpty(productSkuBOs)) {
if (CollectionUtils.isEmpty(skuBOs)) {
return Collections.emptyList();
}
//
return ProductSkuConvert.INSTANCE.convertList03(productSkuBOs);
// 获得商品 SPU 列表
List<ProductSpuBO> spuBOs = Collections.emptyList();
if (queryReqDTO.getFields().contains(ProductSkuDetailFieldEnum.SPU.getField())) {
spuBOs = productSpuService.listProductSpus(
CollectionUtils.convertSet(skuBOs, ProductSkuBO::getSpuId));
}
// 获取商品 SKU 的规格数组
List<ProductAttrKeyValueBO> attrBOs = Collections.emptyList();
if (queryReqDTO.getFields().contains(ProductSkuDetailFieldEnum.ATTR.getField())) {
Set<Integer> attrValueIds = new HashSet<>();
skuBOs.forEach(sku -> attrValueIds.addAll(sku.getAttrValueIds()));
attrBOs = productAttrService.validProductAttr(attrValueIds, false); // 读取规格时,不考虑规格是否被禁用
}
// 拼接最终返回
return ProductSkuConvert.INSTANCE.convertList(skuBOs, spuBOs, attrBOs);
}
}

View File

@@ -231,9 +231,9 @@ public class ProductSpuManager {
// 获取商品 SKU 的规格数组
List<ProductAttrKeyValueBO> attrBOs = Collections.emptyList();
if (fields.contains(ProductSpuDetailFieldEnum.ATTR.getField()) && !CollectionUtils.isEmpty(skuBOs)) {
Set<Integer> productAttrValueIds = new HashSet<>();
skuBOs.forEach(sku -> productAttrValueIds.addAll(sku.getAttrValueIds()));
attrBOs = productAttrService.validProductAttr(productAttrValueIds, false); // 读取规格时,不考虑规格是否被禁用
Set<Integer> attrValueIds = new HashSet<>();
skuBOs.forEach(sku -> attrValueIds.addAll(sku.getAttrValueIds()));
attrBOs = productAttrService.validProductAttr(attrValueIds, false); // 读取规格时,不考虑规格是否被禁用
}
// 拼接最终返回
return ProductSpuConvert.INSTANCE.convert(spuBO, skuBOs, attrBOs, categoryBO);

View File

@@ -0,0 +1,34 @@
package cn.iocoder.mall.productservice.manager.spu;
import cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum;
import cn.iocoder.mall.productservice.manager.sku.ProductSkuManager;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Arrays;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@Slf4j
public class ProductSkuManagerTest {
@Autowired
private ProductSkuManager productSkuManager;
@Test
public void testListProductSkus() {
List<ProductSkuRespDTO> skuRespDTOs = productSkuManager.listProductSkus(
new ProductSkuListQueryReqDTO().setProductSkuIds(Arrays.asList(3, 4))
.setFields(Arrays.asList(ProductSkuDetailFieldEnum.SPU.getField(),
ProductSkuDetailFieldEnum.ATTR.getField())));
log.info("结果:{}", skuRespDTOs);
}
}

View File

@@ -0,0 +1 @@
package cn.iocoder.mall.productservice;