开始迁移搜索服务

This commit is contained in:
YunaiV
2020-07-30 22:38:14 +08:00
parent d88da8229f
commit 981b3d87e2
59 changed files with 745 additions and 989 deletions

View File

@@ -0,0 +1,30 @@
package cn.iocoder.mall.productservice.rpc.sku;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import java.util.List;
/**
* 商品 SKU Rpc 接口
*/
public interface ProductSkuRpc {
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU 编号
* @return 商品 SKU
*/
CommonResult<ProductSkuRespDTO> getProductSku(Integer productSkuId);
/**
* 获得商品 SKU 列表
*
* @param queryReqDTO 商品 SKU 列表的查询请求 DTO
* @return 商品 SKU 列表
*/
CommonResult<List<ProductSkuRespDTO>> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO);
}

View File

@@ -0,0 +1,24 @@
package cn.iocoder.mall.productservice.rpc.sku.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 商品 SKU 列表查询 DTO
*/
@Data
@Accessors(chain = true)
public class ProductSkuListQueryReqDTO implements Serializable {
/**
* 商品 SKU 编号
*/
private Integer productSkuId;
/**
* 商品 SPU 编号
*/
private Integer productSpuId;
}

View File

@@ -0,0 +1,50 @@
package cn.iocoder.mall.productservice.rpc.sku.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 商品 SKU Response DTO
*/
@Data
@Accessors(chain = true)
public class ProductSkuRespDTO implements Serializable {
/**
* sku 编号
*/
private Integer id;
/**
* 商品编号
*/
private Integer spuId;
/**
* 状态
*/
private Integer status;
/**
* 图片地址
*/
private String picUrl;
/**
* 规格值编号数组
*/
private List<Integer> attrValueIds;
/**
* 价格,单位:分
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -30,6 +30,12 @@
<artifactId>product-service-api</artifactId>
</dependency>
<!-- MQ 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-rocketmq</artifactId>
</dependency>
<!-- Registry 和 Config 相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
@@ -72,6 +78,11 @@
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,12 @@
package cn.iocoder.mall.productservice.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* Spring Aop 配置类
*/
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class AopConfiguration {
}

View File

@@ -1,8 +1,12 @@
package cn.iocoder.mall.productservice.convert.sku;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.spu.ProductSkuDO;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
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 org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
@@ -18,7 +22,18 @@ public interface ProductSkuConvert {
List<ProductSkuDO> convertList(List<ProductSkuCreateOrUpdateBO> list);
@Mapping(source = "attrValueIds", target = "attrs", qualifiedByName = "translatePicUrlsFromStringList")
ProductSkuDO convert(ProductSkuCreateOrUpdateBO skuUpdateDTO);
ProductSkuDO convert(ProductSkuCreateOrUpdateBO bean);
@Mapping(source = "attrs", target = "attrValueIds", qualifiedByName = "translateAttrValueIdsFromString")
ProductSkuBO convert(ProductSkuDO bean);
List<ProductSkuBO> convertList02(List<ProductSkuDO> list);
ProductSkuRespDTO convert(ProductSkuBO bean);
ProductSkuListQueryBO convert(ProductSkuListQueryReqDTO bean);
List<ProductSkuRespDTO> convertList03(List<ProductSkuBO> list);
@Named("translateAttrValueIdsFromString")
default List<String> translateAttrValueIdsFromString(String attrValueIdsStar) {

View File

@@ -1,4 +1,4 @@
package cn.iocoder.mall.productservice.dal.mysql.dataobject.spu;
package cn.iocoder.mall.productservice.dal.mysql.dataobject.sku;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;

View File

@@ -1,7 +1,8 @@
package cn.iocoder.mall.productservice.dal.mysql.mapper.sku;
import cn.iocoder.mall.mybatis.core.query.QueryWrapperX;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.spu.ProductSkuDO;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@@ -18,4 +19,9 @@ public interface ProductSkuMapper extends BaseMapper<ProductSkuDO> {
void insertList(@Param("productSkuDOs") List<ProductSkuDO> productSkuDOs);
default List<ProductSkuDO> selectList(ProductSkuListQueryBO queryBO) {
return selectList(new QueryWrapperX<ProductSkuDO>().eqIfPresent("id", queryBO.getProductSkuId())
.eqIfPresent("spu_id", queryBO.getProductSpuId()));
}
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.mall.productservice.manager.sku;
import cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO;
import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
import cn.iocoder.mall.productservice.service.sku.ProductSkuService;
import cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 商品 SKU Manager
*/
@Service
public class ProductSkuManager {
@Autowired
private ProductSkuService productSkuService;
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU编号
* @return 商品 SKU
*/
public ProductSkuRespDTO getProductSku(Integer productSkuId) {
ProductSkuBO productSkuBO = productSkuService.getProductSku(productSkuId);
return ProductSkuConvert.INSTANCE.convert(productSkuBO);
}
/**
* 获得商品 SKU 列表
*
* @param queryReqDTO 商品 SKU 列表的查询请求 DTO
* @return 商品 SKU列表
*/
public List<ProductSkuRespDTO> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO) {
List<ProductSkuBO> productSkuBOs = productSkuService.listProductSkus(
ProductSkuConvert.INSTANCE.convert(queryReqDTO));
return ProductSkuConvert.INSTANCE.convertList03(productSkuBOs);
}
}

View File

@@ -4,6 +4,7 @@ import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.convert.spu.ProductSpuConvert;
import cn.iocoder.mall.productservice.enums.category.ProductCategoryIdEnum;
import cn.iocoder.mall.productservice.mq.producer.ProductMQProducer;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuCreateReqDTO;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuUpdateReqDTO;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuPageReqDTO;
@@ -18,6 +19,7 @@ import cn.iocoder.mall.productservice.service.spu.ProductSpuService;
import cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO;
import cn.iocoder.mall.productservice.service.spu.bo.ProductSpuCreateBO;
import cn.iocoder.mall.productservice.service.spu.bo.ProductSpuUpdateBO;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -42,14 +44,25 @@ public class ProductSpuManager {
@Autowired
private ProductAttrService productAttrService;
@Autowired
private ProductMQProducer productMQProducer;
/**
* 创建商品 SPU 和 SKU
*
* @param createDTO 创建商品 SPU 和 SKU DTO
* @return 商品 SPU
*/
@Transactional
public Integer createProductSpu(ProductSpuAndSkuCreateReqDTO createDTO) {
// 创建商品 SPU 和 SKU。注意这里要调用 self() 方法,因为需要创建事务,否则会失效
Integer spuId = self().createProductSpu0(createDTO);
// 发送商品创建的 MQ 消息
productMQProducer.sendProductUpdateMessage(spuId);
return spuId;
}
@Transactional
public Integer createProductSpu0(ProductSpuAndSkuCreateReqDTO createDTO) {
// 校验商品分类是否合法
this.checkProductCategory(createDTO.getCid());
// 创建商品 SKU 对象,并进行校验
@@ -71,6 +84,14 @@ public class ProductSpuManager {
* @param updateDTO 更新商品 SPU DTO
*/
public void updateProductSpu(ProductSpuAndSkuUpdateReqDTO updateDTO) {
// 更新商品 SPU 和 SKU。注意这里要调用 self() 方法,因为需要创建事务,否则会失效
self().updateProductSpu0(updateDTO);
// 发送商品创建的 MQ 消息
productMQProducer.sendProductUpdateMessage(updateDTO.getId());
}
@Transactional
public void updateProductSpu0(ProductSpuAndSkuUpdateReqDTO updateDTO) {
// 校验商品分类是否合法
this.checkProductCategory(updateDTO.getCid());
// 创建商品 SKU 对象,并进行校验
@@ -171,4 +192,8 @@ public class ProductSpuManager {
return attrKeyValueBOs;
}
private ProductSpuManager self() {
return (ProductSpuManager) AopContext.currentProxy();
}
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.mall.productservice.mq.producer;
import cn.iocoder.mall.productservice.mq.producer.message.ProductUpdateMessage;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ProductMQProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendProductUpdateMessage(Integer id) {
// TODO 芋艿:后续优化下,考虑下一致性
try {
SendResult sendResult = rocketMQTemplate.syncSend(ProductUpdateMessage.TOPIC, new ProductUpdateMessage().setId(id));
if (!SendStatus.SEND_OK.equals(sendResult.getSendStatus())) {
log.error("[sendProductUpdateMessage][product({}) 发送更新消息失败,结果为({})]", id, sendResult);
}
} catch (Throwable throwable) {
log.error("[sendProductUpdateMessage][product({}) 发送更新消息失败,发生异常]", id, throwable);
}
}
}

View File

@@ -0,0 +1,20 @@
package cn.iocoder.mall.productservice.mq.producer.message;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 商品更新(包括创建)消息
*/
@Data
@Accessors(chain = true)
public class ProductUpdateMessage {
public static final String TOPIC = "ProductUpdate";
/**
* 商品编号
*/
private Integer id;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.mall.productservice.rpc.sku;
import cn.iocoder.common.framework.vo.CommonResult;
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 org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 商品 SKU Rpc 实现类
*/
@DubboService
public class ProductSkuRpcImpl implements ProductSkuRpc {
@Autowired
private ProductSkuManager productSkuManager;
@Override
public CommonResult<ProductSkuRespDTO> getProductSku(Integer productSkuId) {
return success(productSkuManager.getProductSku(productSkuId));
}
@Override
public CommonResult<List<ProductSkuRespDTO>> listProductSkus(ProductSkuListQueryReqDTO queryReqDTO) {
return success(productSkuManager.listProductSkus(queryReqDTO));
}
}

View File

@@ -4,9 +4,11 @@ import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.spu.ProductSkuDO;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO;
import cn.iocoder.mall.productservice.dal.mysql.mapper.sku.ProductSkuMapper;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -88,4 +90,27 @@ public class ProductSkuService {
return null;
}
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU 编号
* @return 商品 SKU
*/
public ProductSkuBO getProductSku(Integer productSkuId) {
ProductSkuDO productSkuDO = productSkuMapper.selectById(productSkuId);
return ProductSkuConvert.INSTANCE.convert(productSkuDO);
}
/**
* 获得商品 SKU 列表
*
* @param queryBO 商品 SKU 列表查询条件 BO
* @return 商品 SKU 列表
*/
public List<ProductSkuBO> listProductSkus(ProductSkuListQueryBO queryBO) {
// TODO FROM 芋艿:可能要考虑下,是不是要必须传递条件
List<ProductSkuDO> productSkuDOs = productSkuMapper.selectList(queryBO);
return ProductSkuConvert.INSTANCE.convertList02(productSkuDOs);
}
}

View File

@@ -0,0 +1,62 @@
package cn.iocoder.mall.productservice.service.sku.bo;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.attr.ProductAttrValueDO;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 商品 SKU BO
*/
@Data
@Accessors(chain = true)
public class ProductSkuBO {
/**
* sku 编号
*/
private Integer id;
/**
* 商品编号
*/
private Integer spuId;
/**
* 状态
*
* 1-正常
* 2-禁用
*/
private Integer status;
/**
* 图片地址
*/
private String picUrl;
/**
* 规格值({@link ProductAttrValueDO})数组
*
* 数组,以逗号分隔
*/
private String attrs;
/**
* 价格,单位:分
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
/**
* 创建时间
*/
private Date createTime;
/**
* 最后更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer deleted;
}

View File

@@ -10,7 +10,7 @@ import java.util.List;
/**
* 商品 SKU 创建或者修改 BO
*
* 注意,目前该对象是
* 注意,目前该对象是搭配 {@link}
*/
@Data
@Accessors(chain = true)

View File

@@ -0,0 +1,22 @@
package cn.iocoder.mall.productservice.service.sku.bo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 商品 SKU 列表查询 BO
*/
@Data
@Accessors(chain = true)
public class ProductSkuListQueryBO {
/**
* 商品 SKU 编号
*/
private Integer productSkuId;
/**
* 商品 SPU 编号
*/
private Integer productSpuId;
}

View File

@@ -40,6 +40,12 @@ dubbo:
ErrorCodeRpc:
version: 1.0.0
# RocketMQ 配置项
rocketmq:
name-server: 400-infra.server.iocoder.cn:9876
producer:
group: ${spring.application.name}-producer-group
# Mall 配置项
mall:
# 错误码配置项对应 ErrorCodeProperties 配置类