商品规格 value 的迁移

This commit is contained in:
YunaiV
2020-07-28 23:58:09 +08:00
parent 7dbbd412d8
commit 90047c10d7
24 changed files with 630 additions and 185 deletions

View File

@@ -2,10 +2,7 @@ package cn.iocoder.mall.productservice.rpc.attr;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyCreateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyPageReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyRespDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyUpdateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.*;
import java.util.List;
@@ -29,13 +26,6 @@ public interface ProductAttrRpc {
*/
CommonResult<Boolean> updateProductAttrKey(ProductAttrKeyUpdateReqDTO updateDTO);
/**
* 删除商品规格键
*
* @param productAttrKeyId 商品规格键编号
*/
CommonResult<Boolean> deleteProductAttrKey(Integer productAttrKeyId);
/**
* 获得商品规格键
*
@@ -60,4 +50,35 @@ public interface ProductAttrRpc {
*/
CommonResult<PageResult<ProductAttrKeyRespDTO>> pageProductAttrKey(ProductAttrKeyPageReqDTO pageDTO);
/**
* 创建商品规格值
*
* @param createDTO 创建商品规格值 DTO
* @return 商品规格值编号
*/
CommonResult<Integer> createProductAttrValue(ProductAttrValueCreateReqDTO createDTO);
/**
* 更新商品规格值
*
* @param updateDTO 更新商品规格值 DTO
*/
CommonResult<Boolean> updateProductAttrValue(ProductAttrValueUpdateReqDTO updateDTO);
/**
* 获得商品规格值
*
* @param productAttrValueId 商品规格值编号
* @return 商品规格值
*/
CommonResult<ProductAttrValueRespDTO> getProductAttrValue(Integer productAttrValueId);
/**
* 获得商品规格值列表
*
* @param productAttrValueIds 商品规格值编号列表
* @return 商品规格值列表
*/
CommonResult<List<ProductAttrValueRespDTO>> listProductAttrValues(List<Integer> productAttrValueIds);
}

View File

@@ -1,5 +1,7 @@
package cn.iocoder.mall.productservice.rpc.attr.dto;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -23,6 +25,7 @@ public class ProductAttrKeyCreateReqDTO implements Serializable {
* 状态
*/
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@@ -1,5 +1,7 @@
package cn.iocoder.mall.productservice.rpc.attr.dto;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -28,6 +30,7 @@ public class ProductAttrKeyUpdateReqDTO implements Serializable {
* 状态
*/
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.mall.productservice.rpc.attr.dto;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 商品规格值创建 Request DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueCreateReqDTO implements Serializable {
/**
* 规格键编号
*/
@NotNull(message = "规格键编号不能为空")
private Integer attrKeyId;
/**
* 规格值名字
*/
@NotEmpty(message = "规格值名字不能为空")
private String name;
/**
* 状态
*/
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@@ -0,0 +1,37 @@
package cn.iocoder.mall.productservice.rpc.attr.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 商品规格值 Response DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueRespDTO implements Serializable {
/**
* 规格值编号
*/
private Integer id;
/**
* 规格键编号
*/
private Integer attrKeyId;
/**
* 规格值名字
*/
private String name;
/**
* 状态
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.mall.productservice.rpc.attr.dto;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.*;
import lombok.experimental.*;
import io.swagger.annotations.*;
import java.util.*;
import java.io.Serializable;
import javax.validation.constraints.*;
/**
* 商品规格值更新 Request DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueUpdateReqDTO implements Serializable {
/**
* 规格值编号
*/
@NotNull(message = "规格值编号不能为空")
private Integer id;
/**
* 规格键编号
*/
@NotNull(message = "规格键编号不能为空")
private Integer attrKeyId;
/**
* 规格值名字
*/
@NotEmpty(message = "规格值名字不能为空")
private String name;
/**
* 状态
*/
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@@ -2,14 +2,9 @@ package cn.iocoder.mall.productservice.convert.attr;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.attr.ProductAttrKeyDO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyCreateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyPageReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyRespDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyUpdateReqDTO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyBO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyCreateBO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyPageBO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyUpdateBO;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.attr.ProductAttrValueDO;
import cn.iocoder.mall.productservice.rpc.attr.dto.*;
import cn.iocoder.mall.productservice.service.attr.bo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -43,4 +38,20 @@ public interface ProductAttrConvert {
PageResult<ProductAttrKeyRespDTO> convertPage(PageResult<ProductAttrKeyBO> page);
ProductAttrValueDO convert(ProductAttrValueCreateBO bean);
ProductAttrValueBO convert(ProductAttrValueDO bean);
ProductAttrValueDO convert(ProductAttrValueUpdateBO bean);
List<ProductAttrValueBO> convertList03(List<ProductAttrValueDO> list);
ProductAttrValueCreateBO convert(ProductAttrValueCreateReqDTO bean);
ProductAttrValueUpdateBO convert(ProductAttrValueUpdateReqDTO bean);
ProductAttrValueRespDTO convert(ProductAttrValueBO bean);
List<ProductAttrValueRespDTO> convertList04(List<ProductAttrValueBO> list);
}

View File

@@ -21,11 +21,13 @@ public class ProductAttrValueDO extends DeletableDO {
*/
private Integer id;
/**
* 规格编号
* 规格编号
*
* 外键 {@link ProductAttrKeyDO#getId()}
*/
private Integer attrId;
private Integer attrKeyId;
/**
* 规格值
* 规格值名字
*/
private String name;
/**

View File

@@ -1,11 +1,15 @@
package cn.iocoder.mall.productservice.dal.mysql.mapper.attr;
import cn.iocoder.mall.productservice.dal.mysql.dataobject.attr.ProductAttrValueDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductAttrValueMapper extends BaseMapper<ProductAttrValueDO> {
default ProductAttrValueDO selectByAttrKeyIdAndName(Integer attrKeyId, String name) {
return selectOne(new QueryWrapper<ProductAttrValueDO>().eq("attrKeyId", attrKeyId).eq("name", name));
}
}

View File

@@ -2,12 +2,10 @@ package cn.iocoder.mall.productservice.manager.attr;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.convert.attr.ProductAttrConvert;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyCreateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyPageReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyRespDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyUpdateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.*;
import cn.iocoder.mall.productservice.service.attr.ProductAttrService;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyBO;
import cn.iocoder.mall.productservice.service.attr.bo.ProductAttrValueBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -42,15 +40,6 @@ public class ProductAttrManager {
productAttrService.updateProductAttrKey(ProductAttrConvert.INSTANCE.convert(updateDTO));
}
/**
* 删除商品规格键
*
* @param productAttrKeyId 商品规格键编号
*/
public void deleteProductAttrKey(Integer productAttrKeyId) {
productAttrService.deleteProductAttrKey(productAttrKeyId);
}
/**
* 获得商品规格键
*
@@ -84,4 +73,46 @@ public class ProductAttrManager {
return ProductAttrConvert.INSTANCE.convertPage(pageResultBO);
}
/**
* 创建商品规格值
*
* @param createDTO 创建商品规格值 DTO
* @return 商品规格值
*/
public Integer createProductAttrValue(ProductAttrValueCreateReqDTO createDTO) {
ProductAttrValueBO productAttrValueBO = productAttrService.createProductAttrValue(ProductAttrConvert.INSTANCE.convert(createDTO));
return productAttrValueBO.getId();
}
/**
* 更新商品规格值
*
* @param updateDTO 更新商品规格值 DTO
*/
public void updateProductAttrValue(ProductAttrValueUpdateReqDTO updateDTO) {
productAttrService.updateProductAttrValue(ProductAttrConvert.INSTANCE.convert(updateDTO));
}
/**
* 获得商品规格值
*
* @param productAttrValueId 商品规格值编号
* @return 商品规格值
*/
public ProductAttrValueRespDTO getProductAttrValue(Integer productAttrValueId) {
ProductAttrValueBO productAttrValueBO = productAttrService.getProductAttrValue(productAttrValueId);
return ProductAttrConvert.INSTANCE.convert(productAttrValueBO);
}
/**
* 获得商品规格值列表
*
* @param productAttrValueIds 商品规格值编号列表
* @return 商品规格值列表
*/
public List<ProductAttrValueRespDTO> listProductAttrValues(List<Integer> productAttrValueIds) {
List<ProductAttrValueBO> productAttrValueBOs = productAttrService.listProductAttrValues(productAttrValueIds);
return ProductAttrConvert.INSTANCE.convertList04(productAttrValueBOs);
}
}

View File

@@ -3,10 +3,7 @@ package cn.iocoder.mall.productservice.rpc.attr;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.manager.attr.ProductAttrManager;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyCreateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyPageReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyRespDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyUpdateReqDTO;
import cn.iocoder.mall.productservice.rpc.attr.dto.*;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,12 +31,6 @@ public class ProductAttrRpcImpl implements ProductAttrRpc {
return success(true);
}
@Override
public CommonResult<Boolean> deleteProductAttrKey(Integer productAttrKeyId) {
productAttrManager.deleteProductAttrKey(productAttrKeyId);
return success(true);
}
@Override
public CommonResult<ProductAttrKeyRespDTO> getProductAttrKey(Integer productAttrKeyId) {
return success(productAttrManager.getProductAttrKey(productAttrKeyId));
@@ -55,4 +46,25 @@ public class ProductAttrRpcImpl implements ProductAttrRpc {
return success(productAttrManager.pageProductAttrKey(pageDTO));
}
@Override
public CommonResult<Integer> createProductAttrValue(ProductAttrValueCreateReqDTO createDTO) {
return success(productAttrManager.createProductAttrValue(createDTO));
}
@Override
public CommonResult<Boolean> updateProductAttrValue(ProductAttrValueUpdateReqDTO updateDTO) {
productAttrManager.updateProductAttrValue(updateDTO);
return success(true);
}
@Override
public CommonResult<ProductAttrValueRespDTO> getProductAttrValue(Integer productAttrValueId) {
return success(productAttrManager.getProductAttrValue(productAttrValueId));
}
@Override
public CommonResult<List<ProductAttrValueRespDTO>> listProductAttrValues(List<Integer> productAttrValueIds) {
return success(productAttrManager.listProductAttrValues(productAttrValueIds));
}
}

View File

@@ -50,7 +50,7 @@ public class ProductAttrService {
}
}
// 然后,校验规 Key
Set<Integer> attrKeyIds = CollectionUtils.convertSet(attrValues, ProductAttrValueDO::getAttrId);
Set<Integer> attrKeyIds = CollectionUtils.convertSet(attrValues, ProductAttrValueDO::getAttrKeyId);
List<ProductAttrKeyDO> attrKeys = productAttrKeyMapper.selectBatchIds(attrKeyIds);
if (attrKeys.size() != attrKeyIds.size()) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_KEY_NOT_EXIST);
@@ -66,7 +66,7 @@ public class ProductAttrService {
Map<Integer, ProductAttrKeyDO> attrKeyMap = CollectionUtils.convertMap(attrKeys,
ProductAttrKeyDO::getId, attrKeyDO -> attrKeyDO); // ProductAttrDO 的映射,方便查找。
return attrValues.stream().map(attrValueDO -> new ProductAttrKeyValueBO()
.setAttrKeyId(attrValueDO.getAttrId()).setAttrKeyName(attrKeyMap.get(attrValueDO.getAttrId()).getName())
.setAttrKeyId(attrValueDO.getAttrKeyId()).setAttrKeyName(attrKeyMap.get(attrValueDO.getAttrKeyId()).getName())
.setAttrValueId(attrValueDO.getId()).setAttrValueName(attrValueDO.getName()))
.collect(Collectors.toList());
}
@@ -109,20 +109,6 @@ public class ProductAttrService {
productAttrKeyMapper.updateById(updateObject);
}
/**
* 删除商品规格键
*
* @param productAttrKeyId 商品规格键编号
*/
public void deleteProductAttrKey(Integer productAttrKeyId) {
// 校验删除的商品规格键是否存在
if (productAttrKeyMapper.selectById(productAttrKeyId) == null) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_KEY_NOT_EXIST);
}
// 标记删除
productAttrKeyMapper.deleteById(productAttrKeyId);
}
/**
* 获得商品规格键
*
@@ -156,4 +142,70 @@ public class ProductAttrService {
return ProductAttrConvert.INSTANCE.convertPage(productAttrKeyDOPage);
}
/**
* 创建商品规格值
*
* @param createBO 创建商品规格值 BO
* @return 商品规格值
*/
public ProductAttrValueBO createProductAttrValue(@Valid ProductAttrValueCreateBO createBO) {
// 校验规格键是否存在
if (productAttrKeyMapper.selectById(createBO.getAttrKeyId()) == null) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_KEY_NOT_EXIST);
}
// 校验规格值的名字是否重复
if (productAttrValueMapper.selectByAttrKeyIdAndName(createBO.getAttrKeyId(), createBO.getName()) != null) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_VALUE_EXISTS);
}
// 插入到数据库
ProductAttrValueDO productAttrValueDO = ProductAttrConvert.INSTANCE.convert(createBO);
productAttrValueMapper.insert(productAttrValueDO);
// 返回
return ProductAttrConvert.INSTANCE.convert(productAttrValueDO);
}
/**
* 更新商品规格值
*
* @param updateBO 更新商品规格值 BO
*/
public void updateProductAttrValue(@Valid ProductAttrValueUpdateBO updateBO) {
// 校验更新的商品规格值是否存在
ProductAttrValueDO attrValueDO = productAttrValueMapper.selectById(updateBO.getId());
if (attrValueDO == null) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_VALUE_NOT_EXIST);
}
// 校验规格值的名字是否重复
ProductAttrValueDO attrValueDOByName = productAttrValueMapper.selectByAttrKeyIdAndName(
attrValueDO.getAttrKeyId(), updateBO.getName());
if (attrValueDOByName != null && !attrValueDOByName.getId().equals(updateBO.getId())) {
throw ServiceExceptionUtil.exception(PRODUCT_ATTR_VALUE_EXISTS);
}
// 更新到数据库
ProductAttrValueDO updateObject = ProductAttrConvert.INSTANCE.convert(updateBO);
productAttrValueMapper.updateById(updateObject);
}
/**
* 获得商品规格值
*
* @param productAttrValueId 商品规格值编号
* @return 商品规格值
*/
public ProductAttrValueBO getProductAttrValue(Integer productAttrValueId) {
ProductAttrValueDO productAttrValueDO = productAttrValueMapper.selectById(productAttrValueId);
return ProductAttrConvert.INSTANCE.convert(productAttrValueDO);
}
/**
* 获得商品规格值列表
*
* @param productAttrValueIds 商品规格值编号列表
* @return 商品规格值列表
*/
public List<ProductAttrValueBO> listProductAttrValues(List<Integer> productAttrValueIds) {
List<ProductAttrValueDO> productAttrValueDOs = productAttrValueMapper.selectBatchIds(productAttrValueIds);
return ProductAttrConvert.INSTANCE.convertList03(productAttrValueDOs);
}
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.mall.productservice.service.attr.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 商品规格值 BO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueBO {
/**
* 规格值编号
*/
private Integer id;
/**
* 规格键编号
*/
private Integer attrKeyId;
/**
* 规格值名字
*/
private String name;
/**
* 状态
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,35 @@
package cn.iocoder.mall.productservice.service.attr.bo;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 商品规格值创建 BO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueCreateBO {
/**
* 规格键编号
*/
@NotNull(message = "规格键编号不能为空")
private Integer attrKeyId;
/**
* 规格值名字
*/
@NotEmpty(message = "规格值名字不能为空")
private String name;
/**
* 状态
*/
@NotNull(message = "状态")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.mall.productservice.service.attr.bo;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 商品规格值更新 BO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueUpdateBO {
/**
* 规格值编号
*/
@NotNull(message = "规格值编号不能为空")
private Integer id;
/**
* 规格键编号
*/
@NotNull(message = "规格键编号不能为空")
private Integer attrKeyId;
/**
* 规格值名字
*/
@NotEmpty(message = "规格值名字不能为空")
private String name;
/**
* 状态
*/
@NotNull(message = "状态")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}