Commit cd86620b74eeff4c507aa9678c7969e1b806c224
1 parent
7345d80b
REVIEW 商品管理的逻辑
Showing
23 changed files
with
62 additions
and
82 deletions
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductSpuTabTypeEnum.java
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.product.enums.spu; | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.product.enums.spu; | ||
| 3 | import lombok.AllArgsConstructor; | 3 | import lombok.AllArgsConstructor; |
| 4 | import lombok.Getter; | 4 | import lombok.Getter; |
| 5 | 5 | ||
| 6 | +// TODO @puhui999:中英文之间要有空格; 商品 spu Tab 标签枚举;这个类可以改成 ProductSpuPageTabEnum 会更好一点哈;分页 Tab 的意思; | ||
| 6 | /** | 7 | /** |
| 7 | * 商品spu标签枚举类型 | 8 | * 商品spu标签枚举类型 |
| 8 | * | 9 | * |
| @@ -11,11 +12,13 @@ import lombok.Getter; | @@ -11,11 +12,13 @@ import lombok.Getter; | ||
| 11 | @Getter | 12 | @Getter |
| 12 | @AllArgsConstructor | 13 | @AllArgsConstructor |
| 13 | public enum ProductSpuTabTypeEnum { | 14 | public enum ProductSpuTabTypeEnum { |
| 15 | + | ||
| 14 | FOR_SALE(0,"出售中商品"), | 16 | FOR_SALE(0,"出售中商品"), |
| 15 | IN_WAREHOUSE(1,"仓库中商品"), | 17 | IN_WAREHOUSE(1,"仓库中商品"), |
| 16 | SOLD_OUT(2,"已售空商品"), | 18 | SOLD_OUT(2,"已售空商品"), |
| 17 | ALERT_STOCK(3,"警戒库存"), | 19 | ALERT_STOCK(3,"警戒库存"), |
| 18 | RECYCLE_BIN(4,"商品回收站"); | 20 | RECYCLE_BIN(4,"商品回收站"); |
| 21 | + | ||
| 19 | /** | 22 | /** |
| 20 | * 状态 | 23 | * 状态 |
| 21 | */ | 24 | */ |
| @@ -24,4 +27,5 @@ public enum ProductSpuTabTypeEnum { | @@ -24,4 +27,5 @@ public enum ProductSpuTabTypeEnum { | ||
| 24 | * 状态名 | 27 | * 状态名 |
| 25 | */ | 28 | */ |
| 26 | private final String name; | 29 | private final String name; |
| 30 | + | ||
| 27 | } | 31 | } |
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductUnitEnum.java
| @@ -6,6 +6,7 @@ import lombok.Getter; | @@ -6,6 +6,7 @@ import lombok.Getter; | ||
| 6 | 6 | ||
| 7 | import java.util.Arrays; | 7 | import java.util.Arrays; |
| 8 | 8 | ||
| 9 | +// TODO @puhui999:是不是放到数据字典里? | ||
| 9 | /** | 10 | /** |
| 10 | * 产品单位枚举 | 11 | * 产品单位枚举 |
| 11 | * | 12 | * |
| @@ -14,6 +15,7 @@ import java.util.Arrays; | @@ -14,6 +15,7 @@ import java.util.Arrays; | ||
| 14 | @Getter | 15 | @Getter |
| 15 | @AllArgsConstructor | 16 | @AllArgsConstructor |
| 16 | public enum ProductUnitEnum implements IntArrayValuable { | 17 | public enum ProductUnitEnum implements IntArrayValuable { |
| 18 | + | ||
| 17 | PIECE(1, "个"), | 19 | PIECE(1, "个"), |
| 18 | DOZEN(2, "打"), | 20 | DOZEN(2, "打"), |
| 19 | BOX(3, "盒"), | 21 | BOX(3, "盒"), |
yudao-module-mall/yudao-module-product-biz/pom.xml
| @@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
| 35 | <groupId>cn.iocoder.boot</groupId> | 35 | <groupId>cn.iocoder.boot</groupId> |
| 36 | <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> | 36 | <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> |
| 37 | </dependency> | 37 | </dependency> |
| 38 | + <!-- TODO 芋艿:是不是可以去掉这个依赖呀? --> | ||
| 38 | <dependency> | 39 | <dependency> |
| 39 | <groupId>cn.iocoder.boot</groupId> | 40 | <groupId>cn.iocoder.boot</groupId> |
| 40 | <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId> | 41 | <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId> |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/ProductPropertyController.java
| @@ -12,7 +12,6 @@ import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueServ | @@ -12,7 +12,6 @@ import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueServ | ||
| 12 | import io.swagger.v3.oas.annotations.Operation; | 12 | import io.swagger.v3.oas.annotations.Operation; |
| 13 | import io.swagger.v3.oas.annotations.Parameter; | 13 | import io.swagger.v3.oas.annotations.Parameter; |
| 14 | import io.swagger.v3.oas.annotations.tags.Tag; | 14 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 15 | -import oracle.jdbc.proxy.annotation.Post; | ||
| 16 | import org.springframework.security.access.prepost.PreAuthorize; | 15 | import org.springframework.security.access.prepost.PreAuthorize; |
| 17 | import org.springframework.validation.annotation.Validated; | 16 | import org.springframework.validation.annotation.Validated; |
| 18 | import org.springframework.web.bind.annotation.*; | 17 | import org.springframework.web.bind.annotation.*; |
| @@ -85,7 +84,8 @@ public class ProductPropertyController { | @@ -85,7 +84,8 @@ public class ProductPropertyController { | ||
| 85 | @PostMapping("/get-value-list") | 84 | @PostMapping("/get-value-list") |
| 86 | @Operation(summary = "获得属性项列表") | 85 | @Operation(summary = "获得属性项列表") |
| 87 | @PreAuthorize("@ss.hasPermission('product:property:query')") | 86 | @PreAuthorize("@ss.hasPermission('product:property:query')") |
| 88 | - public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList(@Valid @RequestBody ProductPropertyListReqVO listReqVO) { | 87 | + public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList( |
| 88 | + @Valid @RequestBody ProductPropertyListReqVO listReqVO) { | ||
| 89 | // 查询属性项 | 89 | // 查询属性项 |
| 90 | List<ProductPropertyDO> keys = productPropertyService.getPropertyList(listReqVO); | 90 | List<ProductPropertyDO> keys = productPropertyService.getPropertyList(listReqVO); |
| 91 | if (CollUtil.isEmpty(keys)) { | 91 | if (CollUtil.isEmpty(keys)) { |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java
| @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema; | @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | import lombok.Data; | 4 | import lombok.Data; |
| 5 | import lombok.ToString; | 5 | import lombok.ToString; |
| 6 | 6 | ||
| 7 | -import javax.validation.constraints.NotEmpty; | ||
| 8 | import java.util.List; | 7 | import java.util.List; |
| 9 | 8 | ||
| 10 | @Schema(description = "管理后台 - 属性项 List Request VO") | 9 | @Schema(description = "管理后台 - 属性项 List Request VO") |
| @@ -15,6 +14,8 @@ public class ProductPropertyListReqVO { | @@ -15,6 +14,8 @@ public class ProductPropertyListReqVO { | ||
| 15 | @Schema(description = "属性名称", example = "颜色") | 14 | @Schema(description = "属性名称", example = "颜色") |
| 16 | private String name; | 15 | private String name; |
| 17 | 16 | ||
| 18 | - @Schema(description = "属性ids", example = "1,2") | 17 | + // TODO @puhui999:这个查询条件的作用是啥呀? |
| 18 | + @Schema(description = "属性编号的数组", example = "1,2") | ||
| 19 | private List<Long> propertyIds; | 19 | private List<Long> propertyIds; |
| 20 | + | ||
| 20 | } | 21 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java
| 1 | package cn.iocoder.yudao.module.product.controller.admin.sku.vo; | 1 | package cn.iocoder.yudao.module.product.controller.admin.sku.vo; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 5 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 6 | -import lombok.AllArgsConstructor; | ||
| 7 | import lombok.Data; | 4 | import lombok.Data; |
| 8 | -import lombok.NoArgsConstructor; | ||
| 9 | 5 | ||
| 10 | import javax.validation.constraints.NotEmpty; | 6 | import javax.validation.constraints.NotEmpty; |
| 11 | import javax.validation.constraints.NotNull; | 7 | import javax.validation.constraints.NotNull; |
| @@ -50,6 +46,7 @@ public class ProductSkuBaseVO { | @@ -50,6 +46,7 @@ public class ProductSkuBaseVO { | ||
| 50 | 46 | ||
| 51 | @Schema(description = "商品体积", example = "1024") // 单位:m^3 平米 | 47 | @Schema(description = "商品体积", example = "1024") // 单位:m^3 平米 |
| 52 | private Double volume; | 48 | private Double volume; |
| 49 | + // TODO @pitui999:注释可以去掉,VO 使用 @Schema 作为注释 | ||
| 53 | /** | 50 | /** |
| 54 | * 一级分销的佣金,单位:分 | 51 | * 一级分销的佣金,单位:分 |
| 55 | */ | 52 | */ |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java
| @@ -11,6 +11,7 @@ import java.util.List; | @@ -11,6 +11,7 @@ import java.util.List; | ||
| 11 | @EqualsAndHashCode(callSuper = true) | 11 | @EqualsAndHashCode(callSuper = true) |
| 12 | @ToString(callSuper = true) | 12 | @ToString(callSuper = true) |
| 13 | public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO { | 13 | public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO { |
| 14 | + | ||
| 14 | @Schema(description = "商品属性") | 15 | @Schema(description = "商品属性") |
| 15 | @Data | 16 | @Data |
| 16 | @AllArgsConstructor | 17 | @AllArgsConstructor |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuRespVO.java
| @@ -4,12 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; | @@ -4,12 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | import lombok.*; | 4 | import lombok.*; |
| 5 | 5 | ||
| 6 | import javax.validation.constraints.NotNull; | 6 | import javax.validation.constraints.NotNull; |
| 7 | -import java.time.LocalDateTime; | ||
| 8 | import java.util.List; | 7 | import java.util.List; |
| 9 | 8 | ||
| 10 | -/** | ||
| 11 | - * @author HUIHUI | ||
| 12 | - */ | ||
| 13 | @Schema(description = "管理后台 - 商品 SKU Response VO") | 9 | @Schema(description = "管理后台 - 商品 SKU Response VO") |
| 14 | @Data | 10 | @Data |
| 15 | @EqualsAndHashCode(callSuper = true) | 11 | @EqualsAndHashCode(callSuper = true) |
| @@ -29,13 +25,17 @@ public class ProductSkuRespVO extends ProductSkuBaseVO { | @@ -29,13 +25,17 @@ public class ProductSkuRespVO extends ProductSkuBaseVO { | ||
| 29 | @NotNull(message = "属性编号不能为空") | 25 | @NotNull(message = "属性编号不能为空") |
| 30 | private Long propertyId; | 26 | private Long propertyId; |
| 31 | 27 | ||
| 28 | + // TODO @puhui999:propertyName 是不是也返回下 | ||
| 29 | + | ||
| 32 | @Schema(description = "属性值编号", required = true, example = "1024") | 30 | @Schema(description = "属性值编号", required = true, example = "1024") |
| 33 | @NotNull(message = "属性值编号不能为空") | 31 | @NotNull(message = "属性值编号不能为空") |
| 34 | private Long valueId; | 32 | private Long valueId; |
| 35 | 33 | ||
| 36 | @Schema(description = "属性值", example = "1024") | 34 | @Schema(description = "属性值", example = "1024") |
| 37 | private String valueName; | 35 | private String valueName; |
| 36 | + | ||
| 38 | } | 37 | } |
| 38 | + | ||
| 39 | /** | 39 | /** |
| 40 | * 属性数组 | 40 | * 属性数组 |
| 41 | */ | 41 | */ |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java
| @@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.product.controller.admin.spu; | @@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.product.controller.admin.spu; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 5 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; |
| 6 | -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; | ||
| 7 | import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | 6 | import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; |
| 8 | -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | ||
| 9 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 7 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 10 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; | 8 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; |
| 11 | -import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO; | ||
| 12 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | 9 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; |
| 13 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | 10 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; |
| 14 | import io.swagger.v3.oas.annotations.Operation; | 11 | import io.swagger.v3.oas.annotations.Operation; |
| @@ -23,9 +20,7 @@ import javax.validation.Valid; | @@ -23,9 +20,7 @@ import javax.validation.Valid; | ||
| 23 | import java.util.List; | 20 | import java.util.List; |
| 24 | import java.util.Map; | 21 | import java.util.Map; |
| 25 | 22 | ||
| 26 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 27 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 23 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 28 | -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; | ||
| 29 | 24 | ||
| 30 | @Tag(name = "管理后台 - 商品 SPU") | 25 | @Tag(name = "管理后台 - 商品 SPU") |
| 31 | @RestController | 26 | @RestController |
| @@ -94,6 +89,8 @@ public class ProductSpuController { | @@ -94,6 +89,8 @@ public class ProductSpuController { | ||
| 94 | public CommonResult<PageResult<ProductSpuPageRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { | 89 | public CommonResult<PageResult<ProductSpuPageRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { |
| 95 | return success(ProductSpuConvert.INSTANCE.convertPage(productSpuService.getSpuPage(pageVO))); | 90 | return success(ProductSpuConvert.INSTANCE.convertPage(productSpuService.getSpuPage(pageVO))); |
| 96 | } | 91 | } |
| 92 | + | ||
| 93 | + // TODO @tuihui999:get-count;另外,url 使用 - 拆分 | ||
| 97 | @GetMapping("/tabsCount") | 94 | @GetMapping("/tabsCount") |
| 98 | @Operation(summary = "获得商品 SPU tabsCount") | 95 | @Operation(summary = "获得商品 SPU tabsCount") |
| 99 | @PreAuthorize("@ss.hasPermission('product:spu:query')") | 96 | @PreAuthorize("@ss.hasPermission('product:spu:query')") |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java
| 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | -import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; | ||
| 5 | -import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; | ||
| 6 | -import cn.iocoder.yudao.module.product.dal.dataobject.delivery.DeliveryTemplateDO; | ||
| 7 | -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | ||
| 8 | -import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | ||
| 9 | -import com.baomidou.mybatisplus.annotation.TableField; | ||
| 10 | -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 11 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 12 | import lombok.Data; | 4 | import lombok.Data; |
| 13 | 5 | ||
| @@ -116,5 +108,4 @@ public class ProductSpuBaseVO { | @@ -116,5 +108,4 @@ public class ProductSpuBaseVO { | ||
| 116 | @Schema(description = "虚拟销量", required = true, example = "芋道") | 108 | @Schema(description = "虚拟销量", required = true, example = "芋道") |
| 117 | private Integer virtualSalesCount; | 109 | private Integer virtualSalesCount; |
| 118 | 110 | ||
| 119 | - | ||
| 120 | } | 111 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java
| 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueDetailRespVO; | ||
| 4 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; | ||
| 5 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; | 3 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; |
| 6 | import io.swagger.v3.oas.annotations.media.Schema; | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 7 | import lombok.Data; | 5 | import lombok.Data; |
| 8 | import lombok.EqualsAndHashCode; | 6 | import lombok.EqualsAndHashCode; |
| 9 | import lombok.ToString; | 7 | import lombok.ToString; |
| 10 | 8 | ||
| 11 | -import javax.validation.constraints.NotNull; | ||
| 12 | import java.util.List; | 9 | import java.util.List; |
| 13 | 10 | ||
| 14 | @Schema(description = "管理后台 - 商品 SPU 详细 Response VO") // 包括关联的 SKU 等信息 | 11 | @Schema(description = "管理后台 - 商品 SPU 详细 Response VO") // 包括关联的 SKU 等信息 |
| @@ -19,6 +16,7 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO { | @@ -19,6 +16,7 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO { | ||
| 19 | 16 | ||
| 20 | @Schema(description = "商品编号", example = "1") | 17 | @Schema(description = "商品编号", example = "1") |
| 21 | private Long id; | 18 | private Long id; |
| 19 | + | ||
| 22 | // ========== SKU 相关字段 ========= | 20 | // ========== SKU 相关字段 ========= |
| 23 | 21 | ||
| 24 | @Schema(description = "SKU 数组", example = "1") | 22 | @Schema(description = "SKU 数组", example = "1") |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java
| @@ -20,6 +20,7 @@ public class ProductSpuPageReqVO extends PageParam { | @@ -20,6 +20,7 @@ public class ProductSpuPageReqVO extends PageParam { | ||
| 20 | @Schema(description = "商品名称", example = "yutou") | 20 | @Schema(description = "商品名称", example = "yutou") |
| 21 | private String name; | 21 | private String name; |
| 22 | 22 | ||
| 23 | + // TODO @puhui999:加下 @InEnum 校验 | ||
| 23 | @Schema(description = "前端请求的tab类型", example = "1") | 24 | @Schema(description = "前端请求的tab类型", example = "1") |
| 24 | private Integer tabType; | 25 | private Integer tabType; |
| 25 | 26 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuPageRespVO.java
| 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | 1 | package cn.iocoder.yudao.module.product.controller.admin.spu.vo; |
| 2 | 2 | ||
| 3 | -import com.baomidou.mybatisplus.annotation.FieldFill; | ||
| 4 | -import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 6 | import lombok.Data; | 4 | import lombok.Data; |
| 7 | 5 | ||
| 8 | import java.time.LocalDateTime; | 6 | import java.time.LocalDateTime; |
| 9 | 7 | ||
| 8 | +// TODO @puhui999:可以直接继承 ProductSpuRespVO 么?一般情况下,多返回一些字段问题不大的;另外,是不是使用 ProductSpuRespVO 替代 | ||
| 10 | @Schema(description = "管理后台 - 商品 SPU 分页 response VO") | 9 | @Schema(description = "管理后台 - 商品 SPU 分页 response VO") |
| 11 | @Data | 10 | @Data |
| 12 | public class ProductSpuPageRespVO { | 11 | public class ProductSpuPageRespVO { |
| 12 | + | ||
| 13 | @Schema(description = "spuId", example = "1") | 13 | @Schema(description = "spuId", example = "1") |
| 14 | private Long id; | 14 | private Long id; |
| 15 | @Schema(description = "商品封面图", example = "1") | 15 | @Schema(description = "商品封面图", example = "1") |
| @@ -28,4 +28,5 @@ public class ProductSpuPageRespVO { | @@ -28,4 +28,5 @@ public class ProductSpuPageRespVO { | ||
| 28 | private LocalDateTime createTime; | 28 | private LocalDateTime createTime; |
| 29 | @Schema(description = "商品状态", example = "1") | 29 | @Schema(description = "商品状态", example = "1") |
| 30 | private Integer status; | 30 | private Integer status; |
| 31 | + | ||
| 31 | } | 32 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java
| @@ -47,7 +47,7 @@ public interface ProductSpuConvert { | @@ -47,7 +47,7 @@ public interface ProductSpuConvert { | ||
| 47 | 47 | ||
| 48 | List<ProductSpuSimpleRespVO> convertList02(List<ProductSpuDO> list); | 48 | List<ProductSpuSimpleRespVO> convertList02(List<ProductSpuDO> list); |
| 49 | 49 | ||
| 50 | - | 50 | + // TODO @puhui999:是不是可以删除啦 |
| 51 | default ProductSpuDetailRespVO convert03(ProductSpuDO spu, List<ProductSkuDO> skus, | 51 | default ProductSpuDetailRespVO convert03(ProductSpuDO spu, List<ProductSkuDO> skus, |
| 52 | List<ProductPropertyValueDetailRespBO> propertyValues) { | 52 | List<ProductPropertyValueDetailRespBO> propertyValues) { |
| 53 | ProductSpuDetailRespVO spuVO = convert03(spu); | 53 | ProductSpuDetailRespVO spuVO = convert03(spu); |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyDO.java
| 1 | package cn.iocoder.yudao.module.product.dal.dataobject.property; | 1 | package cn.iocoder.yudao.module.product.dal.dataobject.property; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 4 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; | 3 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; |
| 5 | import com.baomidou.mybatisplus.annotation.KeySequence; | 4 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 5 | import com.baomidou.mybatisplus.annotation.TableId; |
| @@ -20,7 +19,7 @@ import lombok.*; | @@ -20,7 +19,7 @@ import lombok.*; | ||
| 20 | @Builder | 19 | @Builder |
| 21 | @NoArgsConstructor | 20 | @NoArgsConstructor |
| 22 | @AllArgsConstructor | 21 | @AllArgsConstructor |
| 23 | -public class ProductPropertyDO extends TenantBaseDO { | 22 | +public class ProductPropertyDO extends TenantBaseDO { // TODO @puhui999:这里是不是用 BaseDO 就可以了? |
| 24 | 23 | ||
| 25 | /** | 24 | /** |
| 26 | * 主键 | 25 | * 主键 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyValueDO.java
| 1 | package cn.iocoder.yudao.module.product.dal.dataobject.property; | 1 | package cn.iocoder.yudao.module.product.dal.dataobject.property; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 4 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; | 3 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; |
| 5 | import com.baomidou.mybatisplus.annotation.KeySequence; | 4 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 5 | import com.baomidou.mybatisplus.annotation.TableId; |
| @@ -21,7 +20,7 @@ import lombok.*; | @@ -21,7 +20,7 @@ import lombok.*; | ||
| 21 | @Builder | 20 | @Builder |
| 22 | @NoArgsConstructor | 21 | @NoArgsConstructor |
| 23 | @AllArgsConstructor | 22 | @AllArgsConstructor |
| 24 | -public class ProductPropertyValueDO extends TenantBaseDO { | 23 | +public class ProductPropertyValueDO extends TenantBaseDO { // TODO @puhui999:这里是不是用 BaseDO 就可以了? |
| 25 | 24 | ||
| 26 | /** | 25 | /** |
| 27 | * 主键 | 26 | * 主键 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java
| 1 | package cn.iocoder.yudao.module.product.dal.dataobject.sku; | 1 | package cn.iocoder.yudao.module.product.dal.dataobject.sku; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 3 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 4 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 5 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; | 4 | import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; |
| 6 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; | 5 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; |
| 7 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; | 6 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; |
| @@ -28,7 +27,7 @@ import java.util.List; | @@ -28,7 +27,7 @@ import java.util.List; | ||
| 28 | @Builder | 27 | @Builder |
| 29 | @NoArgsConstructor | 28 | @NoArgsConstructor |
| 30 | @AllArgsConstructor | 29 | @AllArgsConstructor |
| 31 | -public class ProductSkuDO extends TenantBaseDO { | 30 | +public class ProductSkuDO extends TenantBaseDO { // TODO @puhui999:这里是不是用 BaseDO 就可以了? |
| 32 | 31 | ||
| 33 | /** | 32 | /** |
| 34 | * 商品 SKU 编号,自增 | 33 | * 商品 SKU 编号,自增 |
| @@ -116,7 +115,7 @@ public class ProductSkuDO extends TenantBaseDO { | @@ -116,7 +115,7 @@ public class ProductSkuDO extends TenantBaseDO { | ||
| 116 | // * 冗余 {@link ProductPropertyDO#getName()} | 115 | // * 冗余 {@link ProductPropertyDO#getName()} |
| 117 | // * | 116 | // * |
| 118 | // * 注意:每次属性名字发生变化时,需要更新该冗余 | 117 | // * 注意:每次属性名字发生变化时,需要更新该冗余 |
| 119 | - // */ TODO 与已有代码逻辑存在冲突 | 118 | + // */ TODO @puhui999:与已有代码逻辑存在冲突;芋艿:冲突点是啥呀? |
| 120 | //private String propertyName; | 119 | //private String propertyName; |
| 121 | 120 | ||
| 122 | /** | 121 | /** |
| @@ -131,7 +130,7 @@ public class ProductSkuDO extends TenantBaseDO { | @@ -131,7 +130,7 @@ public class ProductSkuDO extends TenantBaseDO { | ||
| 131 | // * 冗余 {@link ProductPropertyValueDO#getName()} | 130 | // * 冗余 {@link ProductPropertyValueDO#getName()} |
| 132 | // * | 131 | // * |
| 133 | // * 注意:每次属性值名字发生变化时,需要更新该冗余 | 132 | // * 注意:每次属性值名字发生变化时,需要更新该冗余 |
| 134 | - // */ TODO 与已有代码逻辑存在冲突 | 133 | + // */ TODO @puhui999:与已有代码逻辑存在冲突;芋艿:冲突点是啥呀? |
| 135 | //private String valueName; | 134 | //private String valueName; |
| 136 | 135 | ||
| 137 | } | 136 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/spu/ProductSpuMapper.java
| 1 | package cn.iocoder.yudao.module.product.dal.mysql.spu; | 1 | package cn.iocoder.yudao.module.product.dal.mysql.spu; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.ObjUtil; | 3 | import cn.hutool.core.util.ObjUtil; |
| 4 | -import cn.hutool.core.util.StrUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 7 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 8 | -import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; | ||
| 9 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | 7 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; |
| 10 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 8 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 11 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 9 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| @@ -14,24 +12,14 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuTabTypeEnum; | @@ -14,24 +12,14 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuTabTypeEnum; | ||
| 14 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 12 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 15 | import org.apache.ibatis.annotations.Mapper; | 13 | import org.apache.ibatis.annotations.Mapper; |
| 16 | 14 | ||
| 17 | -import java.util.Map; | ||
| 18 | import java.util.Objects; | 15 | import java.util.Objects; |
| 19 | import java.util.Set; | 16 | import java.util.Set; |
| 20 | 17 | ||
| 21 | -/** | ||
| 22 | - * 商品spu Mapper | ||
| 23 | - * | ||
| 24 | - * @author 芋道源码 | ||
| 25 | - */ | ||
| 26 | @Mapper | 18 | @Mapper |
| 27 | public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | 19 | public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { |
| 28 | 20 | ||
| 29 | - //default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO) { | ||
| 30 | - // return selectPage(reqVO, new LambdaQueryWrapperX<ProductSpuDO>() | ||
| 31 | - // .likeIfPresent(ProductSpuDO::getName, reqVO.getName()) | ||
| 32 | - // .orderByDesc(ProductSpuDO::getSort)); | ||
| 33 | - //} | ||
| 34 | default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO) { | 21 | default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO) { |
| 22 | + // TODO @puhui999:多个 tab,写 if else 去补条件,可阅读性会好点哈 | ||
| 35 | return selectPage(reqVO, new LambdaQueryWrapperX<ProductSpuDO>() | 23 | return selectPage(reqVO, new LambdaQueryWrapperX<ProductSpuDO>() |
| 36 | // 商品名称 | 24 | // 商品名称 |
| 37 | .likeIfPresent(ProductSpuDO::getName, reqVO.getName()) | 25 | .likeIfPresent(ProductSpuDO::getName, reqVO.getName()) |
| @@ -42,7 +30,7 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | @@ -42,7 +30,7 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | ||
| 42 | .eq(ProductSpuTabTypeEnum.IN_WAREHOUSE.getType().equals(reqVO.getTabType()),ProductSpuDO::getStatus,ProductSpuStatusEnum.DISABLE.getStatus()) | 30 | .eq(ProductSpuTabTypeEnum.IN_WAREHOUSE.getType().equals(reqVO.getTabType()),ProductSpuDO::getStatus,ProductSpuStatusEnum.DISABLE.getStatus()) |
| 43 | // 已售空商品 | 31 | // 已售空商品 |
| 44 | .eq(ProductSpuTabTypeEnum.SOLD_OUT.getType().equals(reqVO.getTabType()),ProductSpuDO::getStock,0) | 32 | .eq(ProductSpuTabTypeEnum.SOLD_OUT.getType().equals(reqVO.getTabType()),ProductSpuDO::getStock,0) |
| 45 | - // TODO 警戒库存暂时为 10,后期需要使用常量或者数据库配置替换 | 33 | + // TODO @phuui999:警戒库存暂时为 10,后期需要使用常量或者数据库配置替换 |
| 46 | .le(ProductSpuTabTypeEnum.ALERT_STOCK.getType().equals(reqVO.getTabType()),ProductSpuDO::getStock,10) | 34 | .le(ProductSpuTabTypeEnum.ALERT_STOCK.getType().equals(reqVO.getTabType()),ProductSpuDO::getStock,10) |
| 47 | // 回收站 | 35 | // 回收站 |
| 48 | .eq(ProductSpuTabTypeEnum.RECYCLE_BIN.getType().equals(reqVO.getTabType()),ProductSpuDO::getStatus,ProductSpuStatusEnum.RECYCLE.getStatus()) | 36 | .eq(ProductSpuTabTypeEnum.RECYCLE_BIN.getType().equals(reqVO.getTabType()),ProductSpuDO::getStatus,ProductSpuStatusEnum.RECYCLE.getStatus()) |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyService.java
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java
| @@ -94,7 +94,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { | @@ -94,7 +94,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { | ||
| 94 | 94 | ||
| 95 | @Override | 95 | @Override |
| 96 | public List<ProductPropertyDO> getPropertyList(ProductPropertyListReqVO listReqVO) { | 96 | public List<ProductPropertyDO> getPropertyList(ProductPropertyListReqVO listReqVO) { |
| 97 | - // 增加使用属性id查询 | 97 | + // 增加使用属性 id 查询 |
| 98 | if (CollUtil.isNotEmpty(listReqVO.getPropertyIds())){ | 98 | if (CollUtil.isNotEmpty(listReqVO.getPropertyIds())){ |
| 99 | return productPropertyMapper.selectBatchIds(listReqVO.getPropertyIds()); | 99 | return productPropertyMapper.selectBatchIds(listReqVO.getPropertyIds()); |
| 100 | } | 100 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
| @@ -87,7 +87,9 @@ public interface ProductSkuService { | @@ -87,7 +87,9 @@ public interface ProductSkuService { | ||
| 87 | 87 | ||
| 88 | /** | 88 | /** |
| 89 | * 基于 SPU 编号和状态,获得商品 SKU 集合 | 89 | * 基于 SPU 编号和状态,获得商品 SKU 集合 |
| 90 | - * TODO SKU中已经不存在status属性 | 90 | + * |
| 91 | + * TODO @puhui999:SKU中已经不存在status属性;芋艿:那就去掉 status 哈 | ||
| 92 | + * | ||
| 91 | * @param spuId SPU 编号 | 93 | * @param spuId SPU 编号 |
| 92 | * @param status 状态 | 94 | * @param status 状态 |
| 93 | * @return 商品 SKU 集合 | 95 | * @return 商品 SKU 集合 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
| 1 | package cn.iocoder.yudao.module.product.service.spu; | 1 | package cn.iocoder.yudao.module.product.service.spu; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.convert.Convert; | ||
| 5 | import cn.hutool.core.util.ObjectUtil; | 4 | import cn.hutool.core.util.ObjectUtil; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 8 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 9 | -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | ||
| 10 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | 7 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; |
| 11 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; | 8 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; |
| 12 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 9 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; |
| @@ -23,7 +20,6 @@ import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; | @@ -23,7 +20,6 @@ import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; | ||
| 23 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; | 20 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; |
| 24 | import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO; | 21 | import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO; |
| 25 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | 22 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; |
| 26 | -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 27 | import org.springframework.context.annotation.Lazy; | 23 | import org.springframework.context.annotation.Lazy; |
| 28 | import org.springframework.stereotype.Service; | 24 | import org.springframework.stereotype.Service; |
| 29 | import org.springframework.transaction.annotation.Transactional; | 25 | import org.springframework.transaction.annotation.Transactional; |
| @@ -34,7 +30,7 @@ import java.util.*; | @@ -34,7 +30,7 @@ import java.util.*; | ||
| 34 | import java.util.stream.Collectors; | 30 | import java.util.stream.Collectors; |
| 35 | 31 | ||
| 36 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 32 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 37 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | 33 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue; |
| 38 | import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; | 34 | import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; |
| 39 | import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR; | 35 | import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR; |
| 40 | 36 | ||
| @@ -63,17 +59,18 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -63,17 +59,18 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 63 | @Override | 59 | @Override |
| 64 | @Transactional(rollbackFor = Exception.class) | 60 | @Transactional(rollbackFor = Exception.class) |
| 65 | public Long createSpu(ProductSpuCreateReqVO createReqVO) { | 61 | public Long createSpu(ProductSpuCreateReqVO createReqVO) { |
| 66 | - // 校验分类 TODO 暂不清楚为什么只能选择第三层的结点 | 62 | + // 校验分类 TODO puhui999:暂不清楚为什么只能选择第三层的结点;芋艿:改成二级分类,因为商品只能放在叶子节点级别; |
| 67 | //validateCategory(createReqVO.getCategoryId()); | 63 | //validateCategory(createReqVO.getCategoryId()); |
| 68 | - // 校验品牌 TODO 暂不校验,前端没有做品牌选择 | 64 | + // 校验品牌 TODO puhui999:暂不校验,前端没有做品牌选择;芋艿:可以加下哈 |
| 69 | //brandService.validateProductBrand(createReqVO.getBrandId()); | 65 | //brandService.validateProductBrand(createReqVO.getBrandId()); |
| 70 | 66 | ||
| 71 | List<ProductSkuCreateOrUpdateReqVO> skuSaveReqList = createReqVO.getSkus(); | 67 | List<ProductSkuCreateOrUpdateReqVO> skuSaveReqList = createReqVO.getSkus(); |
| 72 | - // 校验SKU | 68 | + // 校验 SKU |
| 73 | productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); | 69 | productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); |
| 74 | ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO); | 70 | ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO); |
| 75 | - // 初始化SPU中SKU相关属性 | 71 | + // 初始化 SPU 中 SKU 相关属性 |
| 76 | initSpuFromSkus(spu, skuSaveReqList); | 72 | initSpuFromSkus(spu, skuSaveReqList); |
| 73 | + | ||
| 77 | // 插入 SPU | 74 | // 插入 SPU |
| 78 | productSpuMapper.insert(spu); | 75 | productSpuMapper.insert(spu); |
| 79 | // 插入 SKU | 76 | // 插入 SKU |
| @@ -193,6 +190,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -193,6 +190,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 193 | stockIncrCounts.forEach((id, incCount) -> productSpuMapper.updateStock(id, incCount)); | 190 | stockIncrCounts.forEach((id, incCount) -> productSpuMapper.updateStock(id, incCount)); |
| 194 | } | 191 | } |
| 195 | 192 | ||
| 193 | + // TODO @puhui999:Service 尽量不做一些跟 VO 相关的拼接逻辑,目的是让 Service 更加简洁一点哈。 | ||
| 196 | @Override | 194 | @Override |
| 197 | public ProductSpuDetailRespVO getSpuDetail(Long id) { | 195 | public ProductSpuDetailRespVO getSpuDetail(Long id) { |
| 198 | // 获得商品 SPU | 196 | // 获得商品 SPU |
| @@ -204,12 +202,17 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -204,12 +202,17 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 204 | // 查询商品 SKU | 202 | // 查询商品 SKU |
| 205 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); | 203 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); |
| 206 | if (CollUtil.isNotEmpty(skus)){ | 204 | if (CollUtil.isNotEmpty(skus)){ |
| 205 | + // TODO @puhui999:skuVOs 更简洁一点。然后大小写要注释哈。RespVOs;因为 VO 是缩写,s 是复数 | ||
| 207 | List<ProductSkuRespVO> skuRespVoS = ProductSkuConvert.INSTANCE.convertList(skus); | 206 | List<ProductSkuRespVO> skuRespVoS = ProductSkuConvert.INSTANCE.convertList(skus); |
| 208 | // 非多规格,不需要处理 | 207 | // 非多规格,不需要处理 |
| 208 | + // TODO @puhui999:统一模型,即使是单规格,也查询下,问题不大的 | ||
| 209 | if (ObjectUtil.equal(productSpuDetailRespVO.getSpecType(), true)) { | 209 | if (ObjectUtil.equal(productSpuDetailRespVO.getSpecType(), true)) { |
| 210 | - // 获取所有的属性值id | ||
| 211 | - Set<Long> valueIds = skus.stream().flatMap(p -> p.getProperties().stream()).map(ProductSkuDO.Property::getValueId).collect(Collectors.toSet()); | 210 | + // 获取所有的属性值 id |
| 211 | + Set<Long> valueIds = skus.stream().flatMap(p -> p.getProperties().stream()) | ||
| 212 | + .map(ProductSkuDO.Property::getValueId) | ||
| 213 | + .collect(Collectors.toSet()); | ||
| 212 | List<ProductPropertyValueDetailRespBO> valueDetailList = productPropertyValueService.getPropertyValueDetailList(valueIds); | 214 | List<ProductPropertyValueDetailRespBO> valueDetailList = productPropertyValueService.getPropertyValueDetailList(valueIds); |
| 215 | + // TODO @puhui999:拼接的逻辑,最好查询好后,丢到 convert 里面统一处理;这样 Service or Controller 也可以更简洁;原则上,Controller 去组合;Service 写逻辑;Convert 转换 | ||
| 213 | Map<Long, String> stringMap = valueDetailList.stream().collect(Collectors.toMap(ProductPropertyValueDetailRespBO::getValueId, ProductPropertyValueDetailRespBO::getValueName)); | 216 | Map<Long, String> stringMap = valueDetailList.stream().collect(Collectors.toMap(ProductPropertyValueDetailRespBO::getValueId, ProductPropertyValueDetailRespBO::getValueName)); |
| 214 | // 设置属性值名称 | 217 | // 设置属性值名称 |
| 215 | skuRespVoS.stream().flatMap(p -> p.getProperties().stream()).forEach(item ->item.setValueName(stringMap.get(item.getValueId()))); | 218 | skuRespVoS.stream().flatMap(p -> p.getProperties().stream()).forEach(item ->item.setValueName(stringMap.get(item.getValueId()))); |
| @@ -232,6 +235,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -232,6 +235,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 232 | 235 | ||
| 233 | @Override | 236 | @Override |
| 234 | public Map<Integer, Long> getTabsCount() { | 237 | public Map<Integer, Long> getTabsCount() { |
| 238 | + // TODO @puhui999:map =》counts;尽量避免出现 map 这种命名,无命名含义哈 | ||
| 235 | Map<Integer, Long> map = new HashMap<>(); | 239 | Map<Integer, Long> map = new HashMap<>(); |
| 236 | // 查询销售中的商品数量 | 240 | // 查询销售中的商品数量 |
| 237 | map.put(ProductSpuTabTypeEnum.FOR_SALE.getType(), productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())); | 241 | map.put(ProductSpuTabTypeEnum.FOR_SALE.getType(), productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())); |
| @@ -240,6 +244,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -240,6 +244,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 240 | // 查询售空的商品数量 | 244 | // 查询售空的商品数量 |
| 241 | map.put(ProductSpuTabTypeEnum.SOLD_OUT.getType(),productSpuMapper.selectCount(ProductSpuDO::getStock, 0)); | 245 | map.put(ProductSpuTabTypeEnum.SOLD_OUT.getType(),productSpuMapper.selectCount(ProductSpuDO::getStock, 0)); |
| 242 | // 查询触发警戒库存的商品数量 TODO 警戒库存暂时为 10,后期需要使用常量或者数据库配置替换 | 246 | // 查询触发警戒库存的商品数量 TODO 警戒库存暂时为 10,后期需要使用常量或者数据库配置替换 |
| 247 | + // TODO @puhui999:要有空格;, productSpuMapper | ||
| 248 | + // TODO @puhui999:Service 不要有 Mapper 的逻辑;想想咋抽象一下哈 | ||
| 243 | map.put(ProductSpuTabTypeEnum.ALERT_STOCK.getType(),productSpuMapper.selectCount(new LambdaQueryWrapperX<ProductSpuDO>().le(ProductSpuDO::getStock, 10))); | 249 | map.put(ProductSpuTabTypeEnum.ALERT_STOCK.getType(),productSpuMapper.selectCount(new LambdaQueryWrapperX<ProductSpuDO>().le(ProductSpuDO::getStock, 10))); |
| 244 | // 查询回收站中的商品数量 | 250 | // 查询回收站中的商品数量 |
| 245 | map.put(ProductSpuTabTypeEnum.RECYCLE_BIN.getType(),productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())); | 251 | map.put(ProductSpuTabTypeEnum.RECYCLE_BIN.getType(),productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())); |
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
| @@ -5,11 +5,11 @@ import cn.hutool.core.map.MapUtil; | @@ -5,11 +5,11 @@ import cn.hutool.core.map.MapUtil; | ||
| 5 | import cn.hutool.core.util.RandomUtil; | 5 | import cn.hutool.core.util.RandomUtil; |
| 6 | import cn.iocoder.yudao.framework.common.exception.ServiceException; | 6 | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 9 | -import cn.iocoder.yudao.framework.common.util.collection.SetUtils; | ||
| 10 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | 8 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 11 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 12 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 9 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuCreateReqVO; |
| 10 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | ||
| 11 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageRespVO; | ||
| 12 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateReqVO; | ||
| 13 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 13 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 14 | import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | 14 | import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; |
| 15 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 15 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| @@ -34,7 +34,6 @@ import java.util.*; | @@ -34,7 +34,6 @@ import java.util.*; | ||
| 34 | import java.util.stream.Collectors; | 34 | import java.util.stream.Collectors; |
| 35 | import java.util.stream.Stream; | 35 | import java.util.stream.Stream; |
| 36 | 36 | ||
| 37 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue; | ||
| 38 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | 37 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; |
| 39 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 38 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 40 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 39 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| @@ -79,13 +78,10 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -79,13 +78,10 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 79 | @Test | 78 | @Test |
| 80 | public void testCreateSpu_success() { | 79 | public void testCreateSpu_success() { |
| 81 | // 准备参数 | 80 | // 准备参数 |
| 82 | - ProductSpuCreateReqVO createReqVO = randomPojo(ProductSpuCreateReqVO.class, o -> { | ||
| 83 | - o.setSpecType(true); | ||
| 84 | - }); | 81 | + ProductSpuCreateReqVO createReqVO = randomPojo(ProductSpuCreateReqVO.class); |
| 85 | Long spu = productSpuService.createSpu(createReqVO); | 82 | Long spu = productSpuService.createSpu(createReqVO); |
| 86 | ProductSpuDO productSpuDO = productSpuMapper.selectById(spu); | 83 | ProductSpuDO productSpuDO = productSpuMapper.selectById(spu); |
| 87 | assertPojoEquals(createReqVO, productSpuDO); | 84 | assertPojoEquals(createReqVO, productSpuDO); |
| 88 | - | ||
| 89 | } | 85 | } |
| 90 | 86 | ||
| 91 | @Test | 87 | @Test |
| @@ -96,7 +92,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -96,7 +92,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 96 | // 准备参数 | 92 | // 准备参数 |
| 97 | ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class, o -> { | 93 | ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class, o -> { |
| 98 | o.setId(createReqVO.getId()); // 设置更新的 ID | 94 | o.setId(createReqVO.getId()); // 设置更新的 ID |
| 99 | - o.setSpecType(true); | ||
| 100 | }); | 95 | }); |
| 101 | // 调用 | 96 | // 调用 |
| 102 | productSpuService.updateSpu(reqVO); | 97 | productSpuService.updateSpu(reqVO); |
| @@ -107,9 +102,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -107,9 +102,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 107 | 102 | ||
| 108 | @Test | 103 | @Test |
| 109 | public void testValidateSpuExists_exception() { | 104 | public void testValidateSpuExists_exception() { |
| 110 | - ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class, o -> { | ||
| 111 | - o.setSpecType(true); | ||
| 112 | - }); | 105 | + ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class); |
| 113 | // 调用 | 106 | // 调用 |
| 114 | Assertions.assertThrows(ServiceException.class, () -> productSpuService.updateSpu(reqVO)); | 107 | Assertions.assertThrows(ServiceException.class, () -> productSpuService.updateSpu(reqVO)); |
| 115 | } | 108 | } |
| @@ -174,7 +167,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -174,7 +167,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 174 | //o.setMinPrice(1); // TODO ProductSpuDO中已没有相关属性 | 167 | //o.setMinPrice(1); // TODO ProductSpuDO中已没有相关属性 |
| 175 | //o.setMaxPrice(50); | 168 | //o.setMaxPrice(50); |
| 176 | o.setMarketPrice(25); | 169 | o.setMarketPrice(25); |
| 177 | - o.setSpecType(false); | ||
| 178 | o.setBrandId(brandId); | 170 | o.setBrandId(brandId); |
| 179 | o.setCategoryId(categoryId); | 171 | o.setCategoryId(categoryId); |
| 180 | //o.setClickCount(100); | 172 | //o.setClickCount(100); |
| @@ -222,8 +214,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -222,8 +214,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 222 | //o.setMinPrice(1); // TODO ProductSpuDO中已没有相关属性 | 214 | //o.setMinPrice(1); // TODO ProductSpuDO中已没有相关属性 |
| 223 | //o.setMaxPrice(1); | 215 | //o.setMaxPrice(1); |
| 224 | o.setMarketPrice(1); | 216 | o.setMarketPrice(1); |
| 225 | - o.setSpecType(false); | ||
| 226 | o.setBrandId(brandId); | 217 | o.setBrandId(brandId); |
| 218 | + o.setSpecType(false); | ||
| 227 | o.setCategoryId(categoryId); | 219 | o.setCategoryId(categoryId); |
| 228 | //o.setClickCount(1); // TODO ProductSpuDO中已没有相关属性 | 220 | //o.setClickCount(1); // TODO ProductSpuDO中已没有相关属性 |
| 229 | //o.setCode(generateNo()); | 221 | //o.setCode(generateNo()); |