Commit 6dca8e082b42495f38bd0569278b8368e6a03e6c

Authored by franky
1 parent 0e3cdda0

商品调整

Showing 19 changed files with 153 additions and 52 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java
... ... @@ -38,7 +38,7 @@ public class ProductSkuController {
38 38 @PostMapping("/create")
39 39 @ApiOperation("创建商品sku")
40 40 @PreAuthorize("@ss.hasPermission('product:sku:create')")
41   - public CommonResult<Integer> createSku(@Valid @RequestBody ProductSkuCreateReqVO createReqVO) {
  41 + public CommonResult<Long> createSku(@Valid @RequestBody ProductSkuCreateReqVO createReqVO) {
42 42 return success(ProductSkuService.createSku(createReqVO));
43 43 }
44 44  
... ... @@ -52,18 +52,18 @@ public class ProductSkuController {
52 52  
53 53 @DeleteMapping("/delete")
54 54 @ApiOperation("删除商品sku")
55   - @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class)
  55 + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
56 56 @PreAuthorize("@ss.hasPermission('product:sku:delete')")
57   - public CommonResult<Boolean> deleteSku(@RequestParam("id") Integer id) {
  57 + public CommonResult<Boolean> deleteSku(@RequestParam("id") Long id) {
58 58 ProductSkuService.deleteSku(id);
59 59 return success(true);
60 60 }
61 61  
62 62 @GetMapping("/get")
63 63 @ApiOperation("获得商品sku")
64   - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class)
  64 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
65 65 @PreAuthorize("@ss.hasPermission('product:sku:query')")
66   - public CommonResult<ProductSkuRespVO> getSku(@RequestParam("id") Integer id) {
  66 + public CommonResult<ProductSkuRespVO> getSku(@RequestParam("id") Long id) {
67 67 ProductSkuDO sku = ProductSkuService.getSku(id);
68 68 return success(ProductSkuConvert.INSTANCE.convert(sku));
69 69 }
... ... @@ -72,7 +72,7 @@ public class ProductSkuController {
72 72 @ApiOperation("获得商品sku列表")
73 73 @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
74 74 @PreAuthorize("@ss.hasPermission('product:sku:query')")
75   - public CommonResult<List<ProductSkuRespVO>> getSkuList(@RequestParam("ids") Collection<Integer> ids) {
  75 + public CommonResult<List<ProductSkuRespVO>> getSkuList(@RequestParam("ids") Collection<Long> ids) {
76 76 List<ProductSkuDO> list = ProductSkuService.getSkuList(ids);
77 77 return success(ProductSkuConvert.INSTANCE.convertList(list));
78 78 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java
... ... @@ -16,8 +16,8 @@ public class ProductSkuBaseVO {
16 16 @NotNull(message = "spu编号不能为空")
17 17 private Long spuId;
18 18  
19   - @ApiModelProperty(value = "规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }]", required = true)
20   - @NotNull(message = "规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }]不能为空")
  19 + @ApiModelProperty(value = "规格值数组-json格式, [{propertyId: , valueId: }, {propertyId: , valueId: }]", required = true)
  20 + @NotNull(message = "规格值数组-json格式, [{propertyId: , valueId: }, {propertyId: , valueId: }]不能为空")
21 21 private List<Property> properties;
22 22  
23 23 @ApiModelProperty(value = "销售价格,单位:分", required = true)
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuUpdateReqVO.java
... ... @@ -13,6 +13,6 @@ public class ProductSkuUpdateReqVO extends ProductSkuBaseVO {
13 13  
14 14 @ApiModelProperty(value = "主键", required = true)
15 15 @NotNull(message = "主键不能为空")
16   - private Integer id;
  16 + private Long id;
17 17  
18 18 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.spu;
2 2  
  3 +import nonapi.io.github.classgraph.utils.LogNode;
3 4 import org.springframework.web.bind.annotation.*;
4 5 import javax.annotation.Resource;
5 6 import org.springframework.validation.annotation.Validated;
... ... @@ -38,7 +39,7 @@ public class ProductSpuController {
38 39 @PostMapping("/create")
39 40 @ApiOperation("创建商品spu")
40 41 @PreAuthorize("@ss.hasPermission('product:spu:create')")
41   - public CommonResult<Integer> createSpu(@Valid @RequestBody ProductSpuCreateReqVO createReqVO) {
  42 + public CommonResult<Long> createSpu(@Valid @RequestBody ProductSpuCreateReqVO createReqVO) {
42 43 return success(spuService.createSpu(createReqVO));
43 44 }
44 45  
... ... @@ -52,27 +53,27 @@ public class ProductSpuController {
52 53  
53 54 @DeleteMapping("/delete")
54 55 @ApiOperation("删除商品spu")
55   - @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class)
  56 + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
56 57 @PreAuthorize("@ss.hasPermission('product:spu:delete')")
57   - public CommonResult<Boolean> deleteSpu(@RequestParam("id") Integer id) {
  58 + public CommonResult<Boolean> deleteSpu(@RequestParam("id") Long id) {
58 59 spuService.deleteSpu(id);
59 60 return success(true);
60 61 }
61 62  
62 63 @GetMapping("/get")
63 64 @ApiOperation("获得商品spu")
64   - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class)
  65 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
65 66 @PreAuthorize("@ss.hasPermission('product:spu:query')")
66   - public CommonResult<SpuRespVO> getSpu(@RequestParam("id") Integer id) {
  67 + public CommonResult<SpuRespVO> getSpu(@RequestParam("id") Long id) {
67 68 ProductSpuDO spu = spuService.getSpu(id);
68 69 return success(ProductSpuConvert.INSTANCE.convert(spu));
69 70 }
70 71  
71 72 @GetMapping("/list")
72 73 @ApiOperation("获得商品spu列表")
73   - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
  74 + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = Long.class)
74 75 @PreAuthorize("@ss.hasPermission('product:spu:query')")
75   - public CommonResult<List<SpuRespVO>> getSpuList(@RequestParam("ids") Collection<Integer> ids) {
  76 + public CommonResult<List<SpuRespVO>> getSpuList(@RequestParam("ids") Collection<Long> ids) {
76 77 List<ProductSpuDO> list = spuService.getSpuList(ids);
77 78 return success(ProductSpuConvert.INSTANCE.convertList(list));
78 79 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo;
2 2  
  3 +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateReqVO;
3 4 import lombok.*;
4 5 import java.util.*;
5 6 import io.swagger.annotations.*;
  7 +
  8 +import javax.validation.Valid;
6 9 import javax.validation.constraints.*;
7 10  
8 11 @ApiModel("管理后台 - 商品spu创建 Request VO")
... ... @@ -11,4 +14,8 @@ import javax.validation.constraints.*;
11 14 @ToString(callSuper = true)
12 15 public class ProductSpuCreateReqVO extends ProductSpuBaseVO {
13 16  
  17 + @ApiModelProperty(value = "sku组合")
  18 + @Valid
  19 + List<ProductSkuCreateReqVO> productSkuCreateReqVOS;
  20 +
14 21 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/SpuUpdateReqVO.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo;
2 2  
  3 +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateReqVO;
3 4 import lombok.*;
4 5 import java.util.*;
5 6 import io.swagger.annotations.*;
  7 +
  8 +import javax.validation.Valid;
6 9 import javax.validation.constraints.*;
7 10  
8 11 @ApiModel("管理后台 - 商品spu更新 Request VO")
... ... @@ -13,6 +16,10 @@ public class SpuUpdateReqVO extends ProductSpuBaseVO {
13 16  
14 17 @ApiModelProperty(value = "主键", required = true)
15 18 @NotNull(message = "主键不能为空")
16   - private Integer id;
  19 + private Long id;
  20 +
  21 + @ApiModelProperty(value = "sku组合")
  22 + @Valid
  23 + List<ProductSkuCreateReqVO> productSkuCreateReqVOS;
17 24  
18 25 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java
... ... @@ -2,12 +2,16 @@ package cn.iocoder.yudao.module.product.convert.sku;
2 2  
3 3 import java.util.*;
4 4  
  5 +import cn.hutool.json.JSONUtil;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7  
7 8 import org.mapstruct.Mapper;
  9 +import org.mapstruct.Mapping;
  10 +import org.mapstruct.Named;
8 11 import org.mapstruct.factory.Mappers;
9 12 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
10 13 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
  14 +import org.springframework.util.StringUtils;
11 15  
12 16 /**
13 17 * 商品sku Convert
... ... @@ -19,16 +23,36 @@ public interface ProductSkuConvert {
19 23  
20 24 ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class);
21 25  
  26 + @Mapping(source = "properties", target = "properties", qualifiedByName = "translateStringFromList")
22 27 ProductSkuDO convert(ProductSkuCreateReqVO bean);
23 28  
  29 + @Mapping(source = "properties", target = "properties", qualifiedByName = "translateStringFromList")
24 30 ProductSkuDO convert(ProductSkuUpdateReqVO bean);
25 31  
  32 + @Mapping(source = "properties", target = "properties", qualifiedByName = "tokenizeToBeanArray")
26 33 ProductSkuRespVO convert(ProductSkuDO bean);
27 34  
  35 + @Mapping(source = "properties", target = "properties", qualifiedByName = "tokenizeToExcelBeanArray")
  36 + ProductSkuExcelVO convertToExcelVO(ProductSkuDO bean);
  37 +
28 38 List<ProductSkuRespVO> convertList(List<ProductSkuDO> list);
29 39  
30 40 PageResult<ProductSkuRespVO> convertPage(PageResult<ProductSkuDO> page);
31 41  
32 42 List<ProductSkuExcelVO> convertList02(List<ProductSkuDO> list);
33 43  
  44 + @Named("tokenizeToBeanArray")
  45 + default List<ProductSkuBaseVO.Property> translatePropertyArrayFromString(String properties) {
  46 + return JSONUtil.toList(properties, ProductSkuBaseVO.Property.class);
  47 + }
  48 +
  49 + @Named("tokenizeToExcelBeanArray")
  50 + default List<ProductSkuExcelVO.Property> translateExcelPropertyArrayFromString(String properties) {
  51 + return JSONUtil.toList(properties, ProductSkuExcelVO.Property.class);
  52 + }
  53 +
  54 + @Named("translateStringFromList")
  55 + default String translatePropertyStringFromList(List<ProductSkuBaseVO.Property> properties) {
  56 + return JSONUtil.toJsonStr(properties);
  57 + }
34 58 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java
... ... @@ -5,9 +5,12 @@ import java.util.*;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6  
7 7 import org.mapstruct.Mapper;
  8 +import org.mapstruct.Mapping;
  9 +import org.mapstruct.Named;
8 10 import org.mapstruct.factory.Mappers;
9 11 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
10 12 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
  13 +import org.springframework.util.StringUtils;
11 14  
12 15 /**
13 16 * 商品spu Convert
... ... @@ -19,16 +22,31 @@ public interface ProductSpuConvert {
19 22  
20 23 ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class);
21 24  
  25 + @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromStringList")
22 26 ProductSpuDO convert(ProductSpuCreateReqVO bean);
23 27  
  28 + @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromStringList")
24 29 ProductSpuDO convert(SpuUpdateReqVO bean);
25 30  
  31 + @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "tokenizeToStringArray")
26 32 SpuRespVO convert(ProductSpuDO bean);
27 33  
  34 + @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "tokenizeToStringArray")
  35 + SpuExcelVO convertToExcelVO(ProductSpuDO bean);
  36 +
28 37 List<SpuRespVO> convertList(List<ProductSpuDO> list);
29 38  
30 39 PageResult<SpuRespVO> convertPage(PageResult<ProductSpuDO> page);
31 40  
32 41 List<SpuExcelVO> convertList02(List<ProductSpuDO> list);
33 42  
  43 + @Named("tokenizeToStringArray")
  44 + default List<String> translatePicUrlsArrayFromString(String picUrls) {
  45 + return Arrays.asList(StringUtils.tokenizeToStringArray(picUrls, ","));
  46 + }
  47 +
  48 + @Named("translatePicUrlsFromStringList")
  49 + default String translatePicUrlsFromList(List<String> picUrls) {
  50 + return StringUtils.collectionToCommaDelimitedString(picUrls);
  51 + }
34 52 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java
... ... @@ -27,7 +27,7 @@ public class ProductSkuDO extends BaseDO {
27 27 * 主键
28 28 */
29 29 @TableId
30   - private Integer id;
  30 + private Long id;
31 31 /**
32 32 * spu编号
33 33 */
... ... @@ -36,7 +36,7 @@ public class ProductSkuDO extends BaseDO {
36 36 * 规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }]
37 37 */
38 38 // TODO franky:可以定义一个内部的 Property 类,然后 List<Property>
39   - private List<Property> properties;
  39 + private String properties;
40 40 /**
41 41 * 销售价格,单位:分
42 42 */
... ... @@ -62,11 +62,5 @@ public class ProductSkuDO extends BaseDO {
62 62 */
63 63 private Integer status;
64 64  
65   - @Data
66   - public static class Property {
67   - private Integer propertyId;
68   - private Integer valueId;
69   - }
70   -
71 65 }
72 66  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java
1 1 package cn.iocoder.yudao.module.product.dal.dataobject.spu;
2 2  
  3 +import cn.hutool.log.Log;
3 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 6 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -27,7 +28,7 @@ public class ProductSpuDO extends BaseDO {
27 28 * 主键
28 29 */
29 30 @TableId
30   - private Integer id;
  31 + private Long id;
31 32 /**
32 33 * 商品名称
33 34 */
... ... @@ -48,7 +49,7 @@ public class ProductSpuDO extends BaseDO {
48 49 * 商品主图地址,* 数组,以逗号分隔,最多上传15张
49 50 */
50 51 // TODO franky:List<String>
51   - private List<String> picUrls;
  52 + private String picUrls;
52 53 /**
53 54 * 排序字段
54 55 */
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/CategoryService.java
... ... @@ -76,4 +76,10 @@ public interface CategoryService {
76 76 * @return 商品分类列表
77 77 */
78 78 List<CategoryDO> getCategoryTreeList(CategoryTreeListReqVO treeListReqVO);
  79 +
  80 + /**
  81 + * 验证选择的分类的合法性
  82 + * @param categoryId 分类id
  83 + */
  84 + void validatedCategoryById(Long categoryId);
79 85 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/CategoryServiceImpl.java
... ... @@ -65,6 +65,9 @@ public class CategoryServiceImpl implements CategoryService {
65 65 }
66 66  
67 67 private CategoryDO validateCategoryExists(Long id, ErrorCode errorCode) {
  68 + if (id == 0) {
  69 + return new CategoryDO().setId(id);
  70 + }
68 71 CategoryDO categoryDO = categoryMapper.selectById(id);
69 72 if (categoryDO == null) {
70 73 throw exception(errorCode);
... ... @@ -73,6 +76,11 @@ public class CategoryServiceImpl implements CategoryService {
73 76 }
74 77  
75 78 @Override
  79 + public void validatedCategoryById(Long categoryId) {
  80 + this.validateCategoryExists(categoryId, CATEGORY_NOT_EXISTS);
  81 + }
  82 +
  83 + @Override
76 84 public CategoryDO getCategory(Long id) {
77 85 return categoryMapper.selectById(id);
78 86 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
... ... @@ -19,7 +19,7 @@ public interface ProductSkuService {
19 19 * @param createReqVO 创建信息
20 20 * @return 编号
21 21 */
22   - Integer createSku(@Valid ProductSkuCreateReqVO createReqVO);
  22 + Long createSku(@Valid ProductSkuCreateReqVO createReqVO);
23 23  
24 24 /**
25 25 * 更新商品sku
... ... @@ -33,7 +33,7 @@ public interface ProductSkuService {
33 33 *
34 34 * @param id 编号
35 35 */
36   - void deleteSku(Integer id);
  36 + void deleteSku(Long id);
37 37  
38 38 /**
39 39 * 获得商品sku
... ... @@ -41,7 +41,7 @@ public interface ProductSkuService {
41 41 * @param id 编号
42 42 * @return 商品sku
43 43 */
44   - ProductSkuDO getSku(Integer id);
  44 + ProductSkuDO getSku(Long id);
45 45  
46 46 /**
47 47 * 获得商品sku列表
... ... @@ -49,7 +49,7 @@ public interface ProductSkuService {
49 49 * @param ids 编号
50 50 * @return 商品sku列表
51 51 */
52   - List<ProductSkuDO> getSkuList(Collection<Integer> ids);
  52 + List<ProductSkuDO> getSkuList(Collection<Long> ids);
53 53  
54 54 /**
55 55 * 获得商品sku分页
... ... @@ -67,4 +67,9 @@ public interface ProductSkuService {
67 67 */
68 68 List<ProductSkuDO> getSkuList(ProductSkuExportReqVO exportReqVO);
69 69  
  70 + /**
  71 + *对sku的组合的属性等进行合法性校验
  72 + * @param skuCreateReqList sku组合的集合
  73 + */
  74 + void validatedSkuReq(List<ProductSkuCreateReqVO> skuCreateReqList);
70 75 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
... ... @@ -5,6 +5,8 @@ import javax.annotation.Resource;
5 5 import org.springframework.validation.annotation.Validated;
6 6  
7 7 import java.util.*;
  8 +import java.util.stream.Collectors;
  9 +
8 10 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
9 11 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
10 12 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -28,7 +30,7 @@ public class ProductSkuServiceImpl implements ProductSkuService {
28 30 private ProductSkuMapper ProductSkuMapper;
29 31  
30 32 @Override
31   - public Integer createSku(ProductSkuCreateReqVO createReqVO) {
  33 + public Long createSku(ProductSkuCreateReqVO createReqVO) {
32 34 // 插入
33 35 ProductSkuDO sku = ProductSkuConvert.INSTANCE.convert(createReqVO);
34 36 ProductSkuMapper.insert(sku);
... ... @@ -46,26 +48,26 @@ public class ProductSkuServiceImpl implements ProductSkuService {
46 48 }
47 49  
48 50 @Override
49   - public void deleteSku(Integer id) {
  51 + public void deleteSku(Long id) {
50 52 // 校验存在
51 53 this.validateSkuExists(id);
52 54 // 删除
53 55 ProductSkuMapper.deleteById(id);
54 56 }
55 57  
56   - private void validateSkuExists(Integer id) {
  58 + private void validateSkuExists(Long id) {
57 59 if (ProductSkuMapper.selectById(id) == null) {
58 60 throw exception(SKU_NOT_EXISTS);
59 61 }
60 62 }
61 63  
62 64 @Override
63   - public ProductSkuDO getSku(Integer id) {
  65 + public ProductSkuDO getSku(Long id) {
64 66 return ProductSkuMapper.selectById(id);
65 67 }
66 68  
67 69 @Override
68   - public List<ProductSkuDO> getSkuList(Collection<Integer> ids) {
  70 + public List<ProductSkuDO> getSkuList(Collection<Long> ids) {
69 71 return ProductSkuMapper.selectBatchIds(ids);
70 72 }
71 73  
... ... @@ -79,4 +81,11 @@ public class ProductSkuServiceImpl implements ProductSkuService {
79 81 return ProductSkuMapper.selectList(exportReqVO);
80 82 }
81 83  
  84 + @Override
  85 + public void validatedSkuReq(List<ProductSkuCreateReqVO> skuCreateReqList) {
  86 + // 校验规格属性以及规格值是否存在
  87 + List<Integer> propertyIds = skuCreateReqList.stream().flatMap(p -> p.getProperties().stream()).map(ProductSkuBaseVO.Property::getPropertyId).collect(Collectors.toList());
  88 +
  89 + // 校验是否有重复的sku组合
  90 + }
82 91 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java
... ... @@ -19,7 +19,7 @@ public interface ProductSpuService {
19 19 * @param createReqVO 创建信息
20 20 * @return 编号
21 21 */
22   - Integer createSpu(@Valid ProductSpuCreateReqVO createReqVO);
  22 + Long createSpu(@Valid ProductSpuCreateReqVO createReqVO);
23 23  
24 24 /**
25 25 * 更新商品spu
... ... @@ -33,7 +33,7 @@ public interface ProductSpuService {
33 33 *
34 34 * @param id 编号
35 35 */
36   - void deleteSpu(Integer id);
  36 + void deleteSpu(Long id);
37 37  
38 38 /**
39 39 * 获得商品spu
... ... @@ -41,7 +41,7 @@ public interface ProductSpuService {
41 41 * @param id 编号
42 42 * @return 商品spu
43 43 */
44   - ProductSpuDO getSpu(Integer id);
  44 + ProductSpuDO getSpu(Long id);
45 45  
46 46 /**
47 47 * 获得商品spu列表
... ... @@ -49,7 +49,7 @@ public interface ProductSpuService {
49 49 * @param ids 编号
50 50 * @return 商品spu列表
51 51 */
52   - List<ProductSpuDO> getSpuList(Collection<Integer> ids);
  52 + List<ProductSpuDO> getSpuList(Collection<Long> ids);
53 53  
54 54 /**
55 55 * 获得商品spu分页
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
1 1 package cn.iocoder.yudao.module.product.service.spu;
2 2  
  3 +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateReqVO;
  4 +import cn.iocoder.yudao.module.product.service.category.CategoryService;
  5 +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
3 6 import org.springframework.stereotype.Service;
4 7 import javax.annotation.Resource;
  8 +import javax.validation.Valid;
  9 +
  10 +import org.springframework.transaction.annotation.Transactional;
5 11 import org.springframework.validation.annotation.Validated;
6 12  
7 13 import java.util.*;
... ... @@ -27,10 +33,25 @@ public class ProductSpuServiceImpl implements ProductSpuService {
27 33 @Resource
28 34 private ProductSpuMapper ProductSpuMapper;
29 35  
  36 + @Resource
  37 + private CategoryService categoryService;
  38 +
  39 + @Resource
  40 + private ProductSkuService productSkuService;
  41 +
30 42 @Override
31   - public Integer createSpu(ProductSpuCreateReqVO createReqVO) {
  43 + @Transactional
  44 + public Long createSpu(ProductSpuCreateReqVO createReqVO) {
  45 + // 校验分类
  46 + categoryService.validatedCategoryById(createReqVO.getCategoryId());
  47 + // 校验SKU
  48 + List<ProductSkuCreateReqVO> skuCreateReqList = createReqVO.getProductSkuCreateReqVOS();
  49 + productSkuService.validatedSkuReq(skuCreateReqList);
32 50 // 插入
33 51 ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO);
  52 + skuCreateReqList.forEach(p -> {
  53 + p.setSpuId(spu.getId());
  54 + });
34 55 ProductSpuMapper.insert(spu);
35 56 // 返回
36 57 return spu.getId();
... ... @@ -46,26 +67,26 @@ public class ProductSpuServiceImpl implements ProductSpuService {
46 67 }
47 68  
48 69 @Override
49   - public void deleteSpu(Integer id) {
  70 + public void deleteSpu(Long id) {
50 71 // 校验存在
51 72 this.validateSpuExists(id);
52 73 // 删除
53 74 ProductSpuMapper.deleteById(id);
54 75 }
55 76  
56   - private void validateSpuExists(Integer id) {
  77 + private void validateSpuExists(Long id) {
57 78 if (ProductSpuMapper.selectById(id) == null) {
58 79 throw exception(SPU_NOT_EXISTS);
59 80 }
60 81 }
61 82  
62 83 @Override
63   - public ProductSpuDO getSpu(Integer id) {
  84 + public ProductSpuDO getSpu(Long id) {
64 85 return ProductSpuMapper.selectById(id);
65 86 }
66 87  
67 88 @Override
68   - public List<ProductSpuDO> getSpuList(Collection<Integer> ids) {
  89 + public List<ProductSpuDO> getSpuList(Collection<Long> ids) {
69 90 return ProductSpuMapper.selectBatchIds(ids);
70 91 }
71 92  
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java
... ... @@ -46,7 +46,7 @@ public class SkuServiceImplTest extends BaseDbUnitTest {
46 46 ProductSkuCreateReqVO reqVO = randomPojo(ProductSkuCreateReqVO.class);
47 47  
48 48 // 调用
49   - Integer skuId = ProductSkuService.createSku(reqVO);
  49 + Long skuId = ProductSkuService.createSku(reqVO);
50 50 // 断言
51 51 assertNotNull(skuId);
52 52 // 校验记录的属性是否正确
... ... @@ -86,7 +86,7 @@ public class SkuServiceImplTest extends BaseDbUnitTest {
86 86 ProductSkuDO dbSku = randomPojo(ProductSkuDO.class);
87 87 ProductSkuMapper.insert(dbSku);// @Sql: 先插入出一条存在的数据
88 88 // 准备参数
89   - Integer id = dbSku.getId();
  89 + Long id = dbSku.getId();
90 90  
91 91 // 调用
92 92 ProductSkuService.deleteSku(id);
... ... @@ -97,7 +97,7 @@ public class SkuServiceImplTest extends BaseDbUnitTest {
97 97 @Test
98 98 public void testDeleteSku_notExists() {
99 99 // 准备参数
100   - Integer id = 1;
  100 + Long id = 1L;
101 101  
102 102 // 调用, 并断言异常
103 103 assertServiceException(() -> ProductSkuService.deleteSku(id), SKU_NOT_EXISTS);
... ...
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
... ... @@ -46,7 +46,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
46 46 ProductSpuCreateReqVO reqVO = randomPojo(ProductSpuCreateReqVO.class);
47 47  
48 48 // 调用
49   - Integer spuId = spuService.createSpu(reqVO);
  49 + Long spuId = spuService.createSpu(reqVO);
50 50 // 断言
51 51 assertNotNull(spuId);
52 52 // 校验记录的属性是否正确
... ... @@ -86,7 +86,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
86 86 ProductSpuDO dbSpu = randomPojo(ProductSpuDO.class);
87 87 ProductSpuMapper.insert(dbSpu);// @Sql: 先插入出一条存在的数据
88 88 // 准备参数
89   - Integer id = dbSpu.getId();
  89 + Long id = dbSpu.getId();
90 90  
91 91 // 调用
92 92 spuService.deleteSpu(id);
... ... @@ -97,7 +97,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
97 97 @Test
98 98 public void testDeleteSpu_notExists() {
99 99 // 准备参数
100   - Integer id = 1;
  100 + Long id = 1L;
101 101  
102 102 // 调用, 并断言异常
103 103 assertServiceException(() -> spuService.deleteSpu(id), SPU_NOT_EXISTS);
... ...
yudao-ui-admin/src/views/mall/product/spu/index.vue
... ... @@ -95,7 +95,7 @@
95 95 <el-input v-model="form.categoryId" placeholder="请输入分类id" />
96 96 </el-form-item>
97 97 <el-form-item label="商品主图地址" prop="picUrls">
98   - <el-input v-model="form.picUrls" placeholder="请输入商品主图地址" />
  98 + <ImageUpload v-model="form.picUrls" :limit="1"/>
99 99 </el-form-item>
100 100 <el-form-item label="排序字段" prop="sort">
101 101 <el-input v-model="form.sort" placeholder="请输入排序字段" />
... ...