Commit 98ca807d4b9ad660f5cb813c19504b9a5ba7d7bb

Authored by YunaiV
1 parent 0b5aa560

product:优化商品属性项的代码

Showing 19 changed files with 150 additions and 152 deletions
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
... ... @@ -25,6 +25,7 @@ public interface ErrorCodeConstants {
25 25 // ========== 商品属性项 1008003000 ==========
26 26 ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "属性项不存在");
27 27 ErrorCode PROPERTY_EXISTS = new ErrorCode(1008003001, "属性项的名称已存在");
  28 + ErrorCode PROPERTY_DELETE_FAIL_VALUE_EXISTS = new ErrorCode(1008003002, "属性项下存在属性值,无法删除");
28 29  
29 30 // ========== 商品属性值 1008004000 ==========
30 31 ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1008004000, "属性值不存在");
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/ProductPropertyController.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.property;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
  7 +import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert;
  8 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
  9 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
6 10 import cn.iocoder.yudao.module.product.service.property.ProductPropertyService;
  11 +import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
7 12 import io.swagger.annotations.Api;
8 13 import io.swagger.annotations.ApiImplicitParam;
9 14 import io.swagger.annotations.ApiOperation;
... ... @@ -13,10 +18,11 @@ import org.springframework.web.bind.annotation.*;
13 18  
14 19 import javax.annotation.Resource;
15 20 import javax.validation.Valid;
16   -
  21 +import java.util.Collections;
17 22 import java.util.List;
18 23  
19 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
20 26  
21 27 @Api(tags = "管理后台 - 商品属性项")
22 28 @RestController
... ... @@ -26,6 +32,8 @@ public class ProductPropertyController {
26 32  
27 33 @Resource
28 34 private ProductPropertyService productPropertyService;
  35 + @Resource
  36 + private ProductPropertyValueService productPropertyValueService;
29 37  
30 38 @PostMapping("/create")
31 39 @ApiOperation("创建属性项")
... ... @@ -56,28 +64,36 @@ public class ProductPropertyController {
56 64 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
57 65 @PreAuthorize("@ss.hasPermission('product:property:query')")
58 66 public CommonResult<ProductPropertyRespVO> getProperty(@RequestParam("id") Long id) {
59   - return success(productPropertyService.getProperty(id));
  67 + return success(ProductPropertyConvert.INSTANCE.convert(productPropertyService.getProperty(id)));
60 68 }
61 69  
62 70 @GetMapping("/list")
63 71 @ApiOperation("获得属性项列表")
64 72 @PreAuthorize("@ss.hasPermission('product:property:query')")
65 73 public CommonResult<List<ProductPropertyRespVO>> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) {
66   - return success(productPropertyService.getPropertyVOList(listReqVO));
  74 + return success(ProductPropertyConvert.INSTANCE.convertList(productPropertyService.getPropertyList(listReqVO)));
67 75 }
68 76  
69 77 @GetMapping("/page")
70 78 @ApiOperation("获得属性项分页")
71 79 @PreAuthorize("@ss.hasPermission('product:property:query')")
72 80 public CommonResult<PageResult<ProductPropertyRespVO>> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) {
73   - return success(productPropertyService.getPropertyPage(pageVO));
  81 + return success(ProductPropertyConvert.INSTANCE.convertPage(productPropertyService.getPropertyPage(pageVO)));
74 82 }
75 83  
76   - @GetMapping("/listAndValue")
  84 + @GetMapping("/get-value-list")
77 85 @ApiOperation("获得属性项列表")
78 86 @PreAuthorize("@ss.hasPermission('product:property:query')")
79 87 public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList(@Valid ProductPropertyListReqVO listReqVO) {
80   - return success(productPropertyService.getPropertyAndValueList(listReqVO));
  88 + // 查询属性项
  89 + List<ProductPropertyDO> keys = productPropertyService.getPropertyList(listReqVO);
  90 + if (CollUtil.isEmpty(keys)) {
  91 + return success(Collections.emptyList());
  92 + }
  93 + // 查询属性值
  94 + List<ProductPropertyValueDO> values = productPropertyValueService.getPropertyValueListByPropertyId(
  95 + convertSet(keys, ProductPropertyDO::getId));
  96 + return success(ProductPropertyConvert.INSTANCE.convertList(keys, values));
81 97 }
82 98  
83 99 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.property.vo.property;
2 2  
3   -import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
4 3 import io.swagger.annotations.ApiModel;
5 4 import io.swagger.annotations.ApiModelProperty;
6 5 import lombok.Data;
7 6 import lombok.EqualsAndHashCode;
8 7 import lombok.ToString;
9 8  
10   -import java.time.LocalDateTime;
11 9 import java.util.List;
12 10  
13 11 @ApiModel("管理后台 - 商品属性项 + 属性值 Response VO")
... ... @@ -19,12 +17,24 @@ public class ProductPropertyAndValueRespVO extends ProductPropertyBaseVO {
19 17 @ApiModelProperty(value = "属性项的编号", required = true, example = "1024")
20 18 private Long id;
21 19  
22   - @ApiModelProperty(value = "创建时间", required = true)
23   - private LocalDateTime createTime;
  20 + @ApiModelProperty(value = "属性项的名称", required = true, example = "颜色")
  21 + private String name;
24 22  
25 23 /**
26 24 * 属性值的集合
27 25 */
28   - private List<ProductPropertyValueRespVO> values;
  26 + private List<Value> values;
  27 +
  28 + @ApiModel("管理后台 - 属性值的简单 Response VO")
  29 + @Data
  30 + public static class Value {
  31 +
  32 + @ApiModelProperty(value = "属性值的编号", required = true, example = "2048")
  33 + private Long id;
  34 +
  35 + @ApiModelProperty(value = "属性值的名称", required = true, example = "红色")
  36 + private String name;
  37 +
  38 + }
29 39  
30 40 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java
... ... @@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
4 4 import lombok.Data;
5 5  
6 6 import javax.validation.constraints.NotBlank;
7   -import javax.validation.constraints.NotNull;
8 7  
9 8 /**
10 9 * 商品属性项 Base VO,提供给添加、修改、详细的子 VO 使用
... ... @@ -20,8 +19,4 @@ public class ProductPropertyBaseVO {
20 19 @ApiModelProperty(value = "备注", example = "颜色")
21 20 private String remark;
22 21  
23   - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
24   - @NotNull(message = "状态不能为空")
25   - private Integer status;
26   -
27 22 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java
... ... @@ -13,7 +13,4 @@ public class ProductPropertyListReqVO {
13 13 @ApiModelProperty(value = "名称", example = "颜色")
14 14 private String name;
15 15  
16   - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
17   - private Integer status;
18   -
19 16 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java
... ... @@ -21,10 +21,6 @@ public class ProductPropertyValueBaseVO {
21 21 @NotEmpty(message = "名称名字不能为空")
22 22 private String name;
23 23  
24   - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
25   - @NotNull(message = "状态不能为空")
26   - private Integer status;
27   -
28 24 @ApiModelProperty(value = "备注", example = "颜色")
29 25 private String remark;
30 26  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/property/ProductPropertyConvert.java
1 1 package cn.iocoder.yudao.module.product.convert.property;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 5 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyAndValueRespVO;
5 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyCreateReqVO;
6 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
7 8 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyUpdateReqVO;
8 9 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
  10 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
9 11 import org.mapstruct.Mapper;
10 12 import org.mapstruct.factory.Mappers;
11 13  
12 14 import java.util.List;
  15 +import java.util.Map;
13 16  
14 17 /**
15 18 * 属性项 Convert
... ... @@ -25,12 +28,21 @@ public interface ProductPropertyConvert {
25 28  
26 29 ProductPropertyDO convert(ProductPropertyUpdateReqVO bean);
27 30  
28   - ProductPropertyAndValueRespVO convert(ProductPropertyRespVO bean);
29   -
30 31 ProductPropertyRespVO convert(ProductPropertyDO bean);
31 32  
32 33 List<ProductPropertyRespVO> convertList(List<ProductPropertyDO> list);
33 34  
34 35 PageResult<ProductPropertyRespVO> convertPage(PageResult<ProductPropertyDO> page);
35 36  
  37 + default List<ProductPropertyAndValueRespVO> convertList(List<ProductPropertyDO> keys, List<ProductPropertyValueDO> values) {
  38 + Map<Long, List<ProductPropertyValueDO>> valueMap = CollectionUtils.convertMultiMap(values, ProductPropertyValueDO::getPropertyId);
  39 + return CollectionUtils.convertList(keys, key -> {
  40 + ProductPropertyAndValueRespVO respVO = convert02(key);
  41 + respVO.setValues(convertList02(valueMap.get(key.getId())));
  42 + return respVO;
  43 + });
  44 + }
  45 + ProductPropertyAndValueRespVO convert02(ProductPropertyDO bean);
  46 + List<ProductPropertyAndValueRespVO.Value> convertList02(List<ProductPropertyValueDO> list);
  47 +
36 48 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyDO.java
1 1 package cn.iocoder.yudao.module.product.dal.dataobject.property;
2 2  
3   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 5 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -32,16 +31,8 @@ public class ProductPropertyDO extends BaseDO {
32 31 */
33 32 private String name;
34 33 /**
35   - * 状态
36   - *
37   - * 枚举 {@link CommonStatusEnum}
38   - */
39   - private Integer status;
40   - /**
41 34 * 备注
42 35 */
43 36 private String remark;
44 37  
45   - // TODO 芋艿:rule;规格属性 (发布商品时,和 SKU 关联);规格参数(搜索商品时,与 Category 关联搜索)
46   -
47 38 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyValueDO.java
1 1 package cn.iocoder.yudao.module.product.dal.dataobject.property;
2 2  
3   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 5 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -39,12 +38,6 @@ public class ProductPropertyValueDO extends BaseDO {
39 38 */
40 39 private String name;
41 40 /**
42   - * 状态
43   - *
44   - * 枚举 {@link CommonStatusEnum}
45   - */
46   - private Integer status;
47   - /**
48 41 * 备注
49 42 *
50 43 */
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/property/ProductPropertyMapper.java
... ... @@ -3,17 +3,19 @@ package cn.iocoder.yudao.module.product.dal.mysql.property;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyListReqVO;
6 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyPageReqVO;
7 8 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
8 9 import org.apache.ibatis.annotations.Mapper;
9 10  
  11 +import java.util.List;
  12 +
10 13 @Mapper
11 14 public interface ProductPropertyMapper extends BaseMapperX<ProductPropertyDO> {
12 15  
13 16 default PageResult<ProductPropertyDO> selectPage(ProductPropertyPageReqVO reqVO) {
14 17 return selectPage(reqVO, new LambdaQueryWrapperX<ProductPropertyDO>()
15 18 .likeIfPresent(ProductPropertyDO::getName, reqVO.getName())
16   - .eqIfPresent(ProductPropertyDO::getStatus, reqVO.getStatus())
17 19 .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getCreateTime())
18 20 .orderByDesc(ProductPropertyDO::getId));
19 21 }
... ... @@ -23,4 +25,9 @@ public interface ProductPropertyMapper extends BaseMapperX&lt;ProductPropertyDO&gt; {
23 25 .eqIfPresent(ProductPropertyDO::getName, name));
24 26 }
25 27  
  28 + default List<ProductPropertyDO> selectList(ProductPropertyListReqVO listReqVO) {
  29 + return selectList(new LambdaQueryWrapperX<ProductPropertyDO>()
  30 + .eqIfPresent(ProductPropertyDO::getName, listReqVO.getName()));
  31 + }
  32 +
26 33 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/property/ProductPropertyValueMapper.java
... ... @@ -7,12 +7,13 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.Produc
7 7 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
  10 +import java.util.Collection;
10 11 import java.util.List;
11 12  
12 13 @Mapper
13 14 public interface ProductPropertyValueMapper extends BaseMapperX<ProductPropertyValueDO> {
14 15  
15   - default List<ProductPropertyValueDO> selectListByPropertyId(List<Long> propertyIds) {
  16 + default List<ProductPropertyValueDO> selectListByPropertyId(Collection<Long> propertyIds) {
16 17 return selectList(new LambdaQueryWrapperX<ProductPropertyValueDO>()
17 18 .inIfPresent(ProductPropertyValueDO::getPropertyId, propertyIds));
18 19 }
... ... @@ -23,17 +24,20 @@ public interface ProductPropertyValueMapper extends BaseMapperX&lt;ProductPropertyV
23 24 .eq(ProductPropertyValueDO::getName, name));
24 25 }
25 26  
26   - default void deletePropertyValueByPropertyId(Long propertyId) {
27   - delete(new LambdaQueryWrapperX<ProductPropertyValueDO>().eq(ProductPropertyValueDO::getPropertyId, propertyId)
28   - .eq(ProductPropertyValueDO::getDeleted, false));
  27 + default void deleteByPropertyId(Long propertyId) {
  28 + delete(new LambdaQueryWrapperX<ProductPropertyValueDO>()
  29 + .eq(ProductPropertyValueDO::getPropertyId, propertyId));
29 30 }
30 31  
31 32 default PageResult<ProductPropertyValueDO> selectPage(ProductPropertyValuePageReqVO reqVO) {
32 33 return selectPage(reqVO, new LambdaQueryWrapperX<ProductPropertyValueDO>()
33 34 .eqIfPresent(ProductPropertyValueDO::getPropertyId, reqVO.getPropertyId())
34 35 .likeIfPresent(ProductPropertyValueDO::getName, reqVO.getName())
35   - .eqIfPresent(ProductPropertyValueDO::getStatus, reqVO.getStatus())
36 36 .orderByDesc(ProductPropertyValueDO::getId));
37 37 }
38 38  
  39 + default Integer selectCountByPropertyId(Long propertyId) {
  40 + return selectCount(ProductPropertyValueDO::getPropertyId, propertyId).intValue();
  41 + }
  42 +
39 43 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyService.java
... ... @@ -42,7 +42,7 @@ public interface ProductPropertyService {
42 42 * @param listReqVO 集合查询
43 43 * @return 属性项集合
44 44 */
45   - List<ProductPropertyRespVO> getPropertyVOList(ProductPropertyListReqVO listReqVO);
  45 + List<ProductPropertyDO> getPropertyList(ProductPropertyListReqVO listReqVO);
46 46  
47 47 /**
48 48 * 获取属性名称分页
... ... @@ -50,7 +50,7 @@ public interface ProductPropertyService {
50 50 * @param pageReqVO 分页条件
51 51 * @return 属性项分页
52 52 */
53   - PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO);
  53 + PageResult<ProductPropertyDO> getPropertyPage(ProductPropertyPageReqVO pageReqVO);
54 54  
55 55 /**
56 56 * 获得指定编号的属性项
... ... @@ -58,7 +58,7 @@ public interface ProductPropertyService {
58 58 * @param id 编号
59 59 * @return 属性项
60 60 */
61   - ProductPropertyRespVO getProperty(Long id);
  61 + ProductPropertyDO getProperty(Long id);
62 62  
63 63 /**
64 64 * 根据属性项的编号的集合,获得对应的属性项数组
... ... @@ -68,20 +68,4 @@ public interface ProductPropertyService {
68 68 */
69 69 List<ProductPropertyDO> getPropertyList(Collection<Long> ids);
70 70  
71   - /**
72   - * 根据属性项的编号的集合,获得对应的属性项数组
73   - *
74   - * @param ids 属性项的编号的集合
75   - * @return 属性项数组
76   - */
77   - List<ProductPropertyRespVO> getPropertyVOList(Collection<Long> ids);
78   -
79   - /**
80   - * 获得属性项 + 值的列表
81   - *
82   - * @param listReqVO 列表查询
83   - * @return 属性项 + 值的列表
84   - */
85   - List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO);
86   -
87 71 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java
1 1 package cn.iocoder.yudao.module.product.service.property;
2 2  
  3 +import cn.hutool.core.util.ObjUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
  5 +import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyCreateReqVO;
  6 +import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyListReqVO;
  7 +import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyPageReqVO;
  8 +import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyUpdateReqVO;
7 9 import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert;
8   -import cn.iocoder.yudao.module.product.convert.propertyvalue.ProductPropertyValueConvert;
9 10 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
10   -import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
11 11 import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyMapper;
12   -import cn.iocoder.yudao.module.product.dal.mysql.property.ProductPropertyValueMapper;
  12 +import org.springframework.context.annotation.Lazy;
13 13 import org.springframework.stereotype.Service;
14 14 import org.springframework.transaction.annotation.Transactional;
15 15 import org.springframework.validation.annotation.Validated;
... ... @@ -17,11 +17,9 @@ import org.springframework.validation.annotation.Validated;
17 17 import javax.annotation.Resource;
18 18 import java.util.Collection;
19 19 import java.util.List;
20   -import java.util.Map;
21 20  
22 21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
23   -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_EXISTS;
24   -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_NOT_EXISTS;
  22 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
25 23  
26 24 /**
27 25 * 商品属性项 Service 实现类
... ... @@ -36,15 +34,17 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
36 34 private ProductPropertyMapper productPropertyMapper;
37 35  
38 36 @Resource
39   - private ProductPropertyValueMapper productPropertyValueMapper;
  37 + @Lazy // 延迟加载,解决循环依赖问题
  38 + private ProductPropertyValueService productPropertyValueService;
40 39  
41 40 @Override
42 41 @Transactional(rollbackFor = Exception.class)
43 42 public Long createProperty(ProductPropertyCreateReqVO createReqVO) {
44   - // 校验存在
  43 + // 校验名字重复
45 44 if (productPropertyMapper.selectByName(createReqVO.getName()) != null) {
46 45 throw exception(PROPERTY_EXISTS);
47 46 }
  47 +
48 48 // 插入
49 49 ProductPropertyDO property = ProductPropertyConvert.INSTANCE.convert(createReqVO);
50 50 productPropertyMapper.insert(property);
... ... @@ -55,12 +55,14 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
55 55 @Override
56 56 @Transactional(rollbackFor = Exception.class)
57 57 public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) {
58   - // 校验存在
59 58 validatePropertyExists(updateReqVO.getId());
  59 + // 校验名字重复
60 60 ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName());
61   - if (productPropertyDO != null && !productPropertyDO.getId().equals(updateReqVO.getId())) {
  61 + if (productPropertyDO != null &&
  62 + ObjUtil.notEqual(productPropertyDO.getId(), updateReqVO.getId())) {
62 63 throw exception(PROPERTY_EXISTS);
63 64 }
  65 +
64 66 // 更新
65 67 ProductPropertyDO updateObj = ProductPropertyConvert.INSTANCE.convert(updateReqVO);
66 68 productPropertyMapper.updateById(updateObj);
... ... @@ -70,10 +72,15 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
70 72 public void deleteProperty(Long id) {
71 73 // 校验存在
72 74 validatePropertyExists(id);
  75 + // 校验其下是否有规格值
  76 + if (productPropertyValueService.getPropertyValueCountByPropertyId(id) > 0) {
  77 + throw exception(PROPERTY_DELETE_FAIL_VALUE_EXISTS);
  78 + }
  79 +
73 80 // 删除
74 81 productPropertyMapper.deleteById(id);
75 82 // 同步删除属性值
76   - productPropertyValueMapper.deletePropertyValueByPropertyId(id);
  83 + productPropertyValueService.deletePropertyValueByPropertyId(id);
77 84 }
78 85  
79 86 private void validatePropertyExists(Long id) {
... ... @@ -83,22 +90,18 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
83 90 }
84 91  
85 92 @Override
86   - public List<ProductPropertyRespVO> getPropertyVOList(ProductPropertyListReqVO listReqVO) {
87   - return ProductPropertyConvert.INSTANCE.convertList(productPropertyMapper.selectList(new LambdaQueryWrapperX<ProductPropertyDO>()
88   - .likeIfPresent(ProductPropertyDO::getName, listReqVO.getName())
89   - .eqIfPresent(ProductPropertyDO::getStatus, listReqVO.getStatus())));
  93 + public List<ProductPropertyDO> getPropertyList(ProductPropertyListReqVO listReqVO) {
  94 + return productPropertyMapper.selectList(listReqVO);
90 95 }
91 96  
92 97 @Override
93   - public PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO) {
94   - PageResult<ProductPropertyDO> pageResult = productPropertyMapper.selectPage(pageReqVO);
95   - return ProductPropertyConvert.INSTANCE.convertPage(pageResult);
  98 + public PageResult<ProductPropertyDO> getPropertyPage(ProductPropertyPageReqVO pageReqVO) {
  99 + return productPropertyMapper.selectPage(pageReqVO);
96 100 }
97 101  
98 102 @Override
99   - public ProductPropertyRespVO getProperty(Long id) {
100   - ProductPropertyDO property = productPropertyMapper.selectById(id);
101   - return ProductPropertyConvert.INSTANCE.convert(property);
  103 + public ProductPropertyDO getProperty(Long id) {
  104 + return productPropertyMapper.selectById(id);
102 105 }
103 106  
104 107 @Override
... ... @@ -106,24 +109,4 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
106 109 return productPropertyMapper.selectBatchIds(ids);
107 110 }
108 111  
109   - // TODO @芋艿:丢到 Controller
110   - @Override
111   - public List<ProductPropertyRespVO> getPropertyVOList(Collection<Long> ids) {
112   - return ProductPropertyConvert.INSTANCE.convertList(productPropertyMapper.selectBatchIds(ids));
113   - }
114   -
115   - // TODO @芋艿:丢到 Controller
116   - @Override
117   - public List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO) {
118   - List<ProductPropertyRespVO> propertyList = getPropertyVOList(listReqVO);
119   -
120   - // 查询属性值
121   - List<ProductPropertyValueDO> valueDOList = productPropertyValueMapper.selectListByPropertyId(CollectionUtils.convertList(propertyList, ProductPropertyRespVO::getId));
122   - Map<Long, List<ProductPropertyValueDO>> valueDOMap = CollectionUtils.convertMultiMap(valueDOList, ProductPropertyValueDO::getPropertyId);
123   - return CollectionUtils.convertList(propertyList, m -> {
124   - ProductPropertyAndValueRespVO productPropertyAndValueRespVO = ProductPropertyConvert.INSTANCE.convert(m);
125   - productPropertyAndValueRespVO.setValues(ProductPropertyValueConvert.INSTANCE.convertList(valueDOMap.get(m.getId())));
126   - return productPropertyAndValueRespVO;
127   - });
128   - }
129 112 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueService.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.Produc
5 5 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
6 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
7 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
  8 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
8 9 import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO;
9 10  
10 11 import java.util.Collection;
... ... @@ -48,6 +49,14 @@ public interface ProductPropertyValueService {
48 49 ProductPropertyValueRespVO getPropertyValue(Long id);
49 50  
50 51 /**
  52 + * 根据属性项编号数组,获得属性值列表
  53 + *
  54 + * @param propertyIds 属性项目编号数组
  55 + * @return 属性值列表
  56 + */
  57 + List<ProductPropertyValueDO> getPropertyValueListByPropertyId(Collection<Long> propertyIds);
  58 +
  59 + /**
51 60 * 根据编号数组,获得属性值列表
52 61 *
53 62 * @param ids 编号数组
... ... @@ -56,12 +65,20 @@ public interface ProductPropertyValueService {
56 65 List<ProductPropertyValueDetailRespBO> getPropertyValueDetailList(Collection<Long> ids);
57 66  
58 67 /**
59   - * 获得属性值
  68 + * 根据属性项编号,获得属性值数组
60 69 *
61   - * @param id 编号
  70 + * @param propertyIds 属性项编号数组
62 71 * @return 属性值
63 72 */
64   - List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> id);
  73 + List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> propertyIds);
  74 +
  75 + /**
  76 + * 根据属性项编号,活的属性值数量
  77 + *
  78 + * @param propertyId 属性项编号数
  79 + * @return 属性值数量
  80 + */
  81 + Integer getPropertyValueCountByPropertyId(Long propertyId);
65 82  
66 83 /**
67 84 * 获取属性值的分页
... ... @@ -70,4 +87,12 @@ public interface ProductPropertyValueService {
70 87 * @return 属性值的分页
71 88 */
72 89 PageResult<ProductPropertyValueRespVO> getPropertyValueListPage(ProductPropertyValuePageReqVO pageReqVO);
  90 +
  91 + /**
  92 + * 删除指定属性项编号下的属性值们
  93 + *
  94 + * @param propertyId 属性项的编号
  95 + */
  96 + void deletePropertyValueByPropertyId(Long propertyId);
  97 +
73 98 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java
... ... @@ -74,6 +74,11 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
74 74 }
75 75  
76 76 @Override
  77 + public List<ProductPropertyValueDO> getPropertyValueListByPropertyId(Collection<Long> propertyIds) {
  78 + return productPropertyValueMapper.selectListByPropertyId(propertyIds);
  79 + }
  80 +
  81 + @Override
77 82 public List<ProductPropertyValueDetailRespBO> getPropertyValueDetailList(Collection<Long> ids) {
78 83 // 获得属性值列表
79 84 if (CollUtil.isEmpty(ids)) {
... ... @@ -91,12 +96,23 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
91 96 }
92 97  
93 98 @Override
94   - public List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> id) {
95   - return ProductPropertyValueConvert.INSTANCE.convertList(productPropertyValueMapper.selectList("property_id", id));
  99 + public List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> propertyIds) {
  100 + return ProductPropertyValueConvert.INSTANCE.convertList(productPropertyValueMapper.selectList("property_id", propertyIds));
  101 + }
  102 +
  103 + @Override
  104 + public Integer getPropertyValueCountByPropertyId(Long propertyId) {
  105 + return productPropertyValueMapper.selectCountByPropertyId(propertyId);
96 106 }
97 107  
98 108 @Override
99 109 public PageResult<ProductPropertyValueRespVO> getPropertyValueListPage(ProductPropertyValuePageReqVO pageReqVO) {
100 110 return ProductPropertyValueConvert.INSTANCE.convertPage(productPropertyValueMapper.selectPage(pageReqVO));
101 111 }
  112 +
  113 + @Override
  114 + public void deletePropertyValueByPropertyId(Long propertyId) {
  115 + productPropertyValueMapper.deleteByPropertyId(propertyId);
  116 + }
  117 +
102 118 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
... ... @@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.product.service.sku;
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
6   -import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
7 6 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
8 7 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO;
9 8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
10 9 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
  10 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
11 11 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
12 12 import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
13 13 import cn.iocoder.yudao.module.product.enums.ErrorCodeConstants;
... ... @@ -89,7 +89,7 @@ public class ProductSkuServiceImpl implements ProductSkuService {
89 89 .flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
90 90 .map(ProductSkuBaseVO.Property::getPropertyId) // 将每个 Property 转换成对应的 propertyId,最后形成集合
91 91 .collect(Collectors.toSet());
92   - List<ProductPropertyRespVO> propertyList = productPropertyService.getPropertyVOList(propertyIds);
  92 + List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds);
93 93 if (propertyList.size() != propertyIds.size()) {
94 94 throw exception(PROPERTY_NOT_EXISTS);
95 95 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
... ... @@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 7 import cn.iocoder.yudao.module.product.controller.admin.property.vo.ProductPropertyViewRespVO;
8   -import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
9 8 import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
10 9 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO;
11 10 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
... ... @@ -15,6 +14,7 @@ import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageReqVO;
15 14 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageRespVO;
16 15 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
17 16 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
  17 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
18 18 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
19 19 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
20 20 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
... ... @@ -142,7 +142,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
142 142 Map<Long, List<ProductSkuBaseVO.Property>> propertyMaps = properties.stream().collect(Collectors.groupingBy(ProductSkuBaseVO.Property::getPropertyId));
143 143  
144 144 List<ProductPropertyValueRespVO> propertyValueList = productPropertyValueService.getPropertyValueListByPropertyId(new ArrayList<>(propertyMaps.keySet()));
145   - List<ProductPropertyRespVO> propertyList = productPropertyService.getPropertyVOList(new ArrayList<>(propertyMaps.keySet()));
  145 + List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyMaps.keySet());
146 146 // 装载组装过后的属性
147 147 List<ProductPropertyViewRespVO> productPropertyViews = new ArrayList<>();
148 148 propertyList.forEach(p -> {
... ...
yudao-ui-admin/src/api/mall/product/property.js
... ... @@ -57,7 +57,7 @@ export function getPropertyList(query) {
57 57 // 获得属性项列表
58 58 export function getPropertyListAndValue(query) {
59 59 return request({
60   - url: '/product/property/listAndValue',
  60 + url: '/product/property/get-value-list',
61 61 method: 'get',
62 62 params: query
63 63 })
... ...
yudao-ui-admin/src/views/mall/product/property/index.vue
... ... @@ -41,11 +41,6 @@
41 41 </router-link>
42 42 </template>
43 43 </el-table-column>
44   - <el-table-column label="开启状态" align="center" prop="status">
45   - <template slot-scope="scope">
46   - <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
47   - </template>
48   - </el-table-column>
49 44 <el-table-column label="创建时间" align="center" prop="createTime" width="180">
50 45 <template slot-scope="scope">
51 46 <span>{{ parseTime(scope.row.createTime) }}</span>
... ... @@ -74,13 +69,6 @@
74 69 <el-form-item label="名称" prop="name">
75 70 <el-input v-model="form.name" placeholder="请输入名称" />
76 71 </el-form-item>
77   - <el-form-item label="状态" prop="status">
78   - <el-radio-group v-model="form.status">
79   - <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
80   - :key="dict.value" :label="parseInt(dict.value)">{{ dict.label }}
81   - </el-radio>
82   - </el-radio-group>
83   - </el-form-item>
84 72 <el-form-item label="备注" prop="remark">
85 73 <el-input v-model="form.remark" placeholder="备注" />
86 74 </el-form-item>
... ... @@ -121,7 +109,6 @@ export default {
121 109 pageNo: 1,
122 110 pageSize: 10,
123 111 name: null,
124   - status: null,
125 112 createTime: []
126 113 },
127 114 // 表单参数
... ... @@ -135,9 +122,6 @@ export default {
135 122 rules: {
136 123 name: [
137 124 { required: true, message: "名称不能为空", trigger: "blur" }
138   - ],
139   - status: [
140   - { required: true, message: "状态不能为空", trigger: "blur" }
141 125 ]
142 126 }
143 127 };
... ... @@ -165,7 +149,6 @@ export default {
165 149 reset() {
166 150 this.form = {
167 151 name:'',
168   - status:'',
169 152 remark:"",
170 153 id: null,
171 154 };
... ... @@ -230,21 +213,6 @@ export default {
230 213 this.$modal.msgSuccess("删除成功");
231 214 }).catch(() => {});
232 215 },
233   - /** 导出按钮操作 */
234   - handleExport() {
235   - // 处理查询参数
236   - let params = {...this.queryParams};
237   - params.pageNo = undefined;
238   - params.pageSize = undefined;
239   - // 执行导出
240   - this.$modal.confirm('是否确认导出所有名称数据项?').then(() => {
241   - this.exportLoading = true;
242   - return exportPropertyExcel(params);
243   - }).then(response => {
244   - this.$download.excel(response, '名称.xls');
245   - this.exportLoading = false;
246   - }).catch(() => {});
247   - },
248 216 }
249 217 };
250 218 </script>
... ...