Price 价格服务的编写
This commit is contained in:
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package cn.iocoder.mall.productservice;
|
||||
Reference in New Issue
Block a user