Commit f6c8159dace97da29ec3feac16c8b0e2cfae6f02
1 parent
fe5c5e42
✨ MALL:简化 SPU 的 VO 转化
Showing
32 changed files
with
312 additions
and
663 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/BeanUtils.java
| @@ -21,6 +21,14 @@ public class BeanUtils { | @@ -21,6 +21,14 @@ public class BeanUtils { | ||
| 21 | return BeanUtil.toBean(source, targetClass); | 21 | return BeanUtil.toBean(source, targetClass); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | + public static <T> T toBean(Object source, Class<T> targetClass, Consumer<T> peek) { | ||
| 25 | + T target = toBean(source, targetClass); | ||
| 26 | + if (target != null) { | ||
| 27 | + peek.accept(target); | ||
| 28 | + } | ||
| 29 | + return target; | ||
| 30 | + } | ||
| 31 | + | ||
| 24 | public static <S, T> List<T> toBean(List<S> source, Class<T> targetType) { | 32 | public static <S, T> List<T> toBean(List<S> source, Class<T> targetType) { |
| 25 | if (source == null) { | 33 | if (source == null) { |
| 26 | return null; | 34 | return null; |
| @@ -28,6 +36,14 @@ public class BeanUtils { | @@ -28,6 +36,14 @@ public class BeanUtils { | ||
| 28 | return CollectionUtils.convertList(source, s -> toBean(s, targetType)); | 36 | return CollectionUtils.convertList(source, s -> toBean(s, targetType)); |
| 29 | } | 37 | } |
| 30 | 38 | ||
| 39 | + public static <S, T> List<T> toBean(List<S> source, Class<T> targetType, Consumer<T> peek) { | ||
| 40 | + List<T> list = toBean(source, targetType); | ||
| 41 | + if (list != null) { | ||
| 42 | + list.forEach(peek); | ||
| 43 | + } | ||
| 44 | + return list; | ||
| 45 | + } | ||
| 46 | + | ||
| 31 | public static <S, T> PageResult<T> toBean(PageResult<S> source, Class<T> targetType) { | 47 | public static <S, T> PageResult<T> toBean(PageResult<S> source, Class<T> targetType) { |
| 32 | return toBean(source, targetType, null); | 48 | return toBean(source, targetType, null); |
| 33 | } | 49 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java
| 1 | package cn.iocoder.yudao.module.product.api.sku; | 1 | package cn.iocoder.yudao.module.product.api.sku; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 3 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; | 4 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; |
| 4 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 5 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 5 | -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; | ||
| 6 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 6 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 7 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | 7 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; |
| 8 | +import jakarta.annotation.Resource; | ||
| 8 | import org.springframework.stereotype.Service; | 9 | import org.springframework.stereotype.Service; |
| 9 | import org.springframework.validation.annotation.Validated; | 10 | import org.springframework.validation.annotation.Validated; |
| 10 | 11 | ||
| 11 | -import jakarta.annotation.Resource; | ||
| 12 | import java.util.Collection; | 12 | import java.util.Collection; |
| 13 | import java.util.List; | 13 | import java.util.List; |
| 14 | 14 | ||
| @@ -28,19 +28,19 @@ public class ProductSkuApiImpl implements ProductSkuApi { | @@ -28,19 +28,19 @@ public class ProductSkuApiImpl implements ProductSkuApi { | ||
| 28 | @Override | 28 | @Override |
| 29 | public ProductSkuRespDTO getSku(Long id) { | 29 | public ProductSkuRespDTO getSku(Long id) { |
| 30 | ProductSkuDO sku = productSkuService.getSku(id); | 30 | ProductSkuDO sku = productSkuService.getSku(id); |
| 31 | - return ProductSkuConvert.INSTANCE.convert02(sku); | 31 | + return BeanUtils.toBean(sku, ProductSkuRespDTO.class); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | @Override | 34 | @Override |
| 35 | public List<ProductSkuRespDTO> getSkuList(Collection<Long> ids) { | 35 | public List<ProductSkuRespDTO> getSkuList(Collection<Long> ids) { |
| 36 | List<ProductSkuDO> skus = productSkuService.getSkuList(ids); | 36 | List<ProductSkuDO> skus = productSkuService.getSkuList(ids); |
| 37 | - return ProductSkuConvert.INSTANCE.convertList04(skus); | 37 | + return BeanUtils.toBean(skus, ProductSkuRespDTO.class); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | @Override | 40 | @Override |
| 41 | public List<ProductSkuRespDTO> getSkuListBySpuId(Collection<Long> spuIds) { | 41 | public List<ProductSkuRespDTO> getSkuListBySpuId(Collection<Long> spuIds) { |
| 42 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spuIds); | 42 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spuIds); |
| 43 | - return ProductSkuConvert.INSTANCE.convertList04(skus); | 43 | + return BeanUtils.toBean(skus, ProductSkuRespDTO.class); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | @Override | 46 | @Override |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/spu/ProductSpuApiImpl.java
| 1 | package cn.iocoder.yudao.module.product.api.spu; | 1 | package cn.iocoder.yudao.module.product.api.spu; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollectionUtil; | 3 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 4 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | 4 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; |
| 5 | -import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | 5 | +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 6 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | 6 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; |
| 7 | +import jakarta.annotation.Resource; | ||
| 7 | import org.springframework.stereotype.Service; | 8 | import org.springframework.stereotype.Service; |
| 8 | import org.springframework.validation.annotation.Validated; | 9 | import org.springframework.validation.annotation.Validated; |
| 9 | 10 | ||
| 10 | -import jakarta.annotation.Resource; | ||
| 11 | import java.util.Collection; | 11 | import java.util.Collection; |
| 12 | -import java.util.Collections; | ||
| 13 | import java.util.List; | 12 | import java.util.List; |
| 14 | 13 | ||
| 15 | /** | 14 | /** |
| @@ -27,17 +26,20 @@ public class ProductSpuApiImpl implements ProductSpuApi { | @@ -27,17 +26,20 @@ public class ProductSpuApiImpl implements ProductSpuApi { | ||
| 27 | 26 | ||
| 28 | @Override | 27 | @Override |
| 29 | public List<ProductSpuRespDTO> getSpuList(Collection<Long> ids) { | 28 | public List<ProductSpuRespDTO> getSpuList(Collection<Long> ids) { |
| 30 | - return ProductSpuConvert.INSTANCE.convertList2(spuService.getSpuList(ids)); | 29 | + List<ProductSpuDO> spus = spuService.getSpuList(ids); |
| 30 | + return BeanUtils.toBean(spus, ProductSpuRespDTO.class); | ||
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | @Override | 33 | @Override |
| 34 | public List<ProductSpuRespDTO> validateSpuList(Collection<Long> ids) { | 34 | public List<ProductSpuRespDTO> validateSpuList(Collection<Long> ids) { |
| 35 | - return ProductSpuConvert.INSTANCE.convertList2(spuService.validateSpuList(ids)); | 35 | + List<ProductSpuDO> spus = spuService.validateSpuList(ids); |
| 36 | + return BeanUtils.toBean(spus, ProductSpuRespDTO.class); | ||
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | @Override | 39 | @Override |
| 39 | public ProductSpuRespDTO getSpu(Long id) { | 40 | public ProductSpuRespDTO getSpu(Long id) { |
| 40 | - return ProductSpuConvert.INSTANCE.convert02(spuService.getSpu(id)); | 41 | + ProductSpuDO spu = spuService.getSpu(id); |
| 42 | + return BeanUtils.toBean(spu, ProductSpuRespDTO.class); | ||
| 41 | } | 43 | } |
| 42 | 44 | ||
| 43 | } | 45 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java
| 1 | package cn.iocoder.yudao.module.product.controller.admin.comment.vo; | 1 | package cn.iocoder.yudao.module.product.controller.admin.comment.vo; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; | 3 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | +import jakarta.validation.constraints.NotNull; | ||
| 5 | import lombok.Data; | 6 | import lombok.Data; |
| 6 | import lombok.EqualsAndHashCode; | 7 | import lombok.EqualsAndHashCode; |
| 7 | import lombok.ToString; | 8 | import lombok.ToString; |
| 8 | 9 | ||
| 9 | -import jakarta.validation.constraints.NotNull; | ||
| 10 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 11 | import java.util.List; | 11 | import java.util.List; |
| 12 | 12 | ||
| @@ -58,6 +58,6 @@ public class ProductCommentRespVO extends ProductCommentBaseVO { | @@ -58,6 +58,6 @@ public class ProductCommentRespVO extends ProductCommentBaseVO { | ||
| 58 | private String skuPicUrl; | 58 | private String skuPicUrl; |
| 59 | 59 | ||
| 60 | @Schema(description = "商品 SKU 规格值数组") | 60 | @Schema(description = "商品 SKU 规格值数组") |
| 61 | - private List<ProductSkuBaseVO.Property> skuProperties; | 61 | + private List<ProductSkuSaveReqVO.Property> skuProperties; |
| 62 | 62 | ||
| 63 | } | 63 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.property.vo.value; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.Data; | ||
| 5 | - | ||
| 6 | -@Schema(description = "管理后台 - 商品属性值的明细 Response VO") | ||
| 7 | -@Data | ||
| 8 | -public class ProductPropertyValueDetailRespVO { | ||
| 9 | - | ||
| 10 | - @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 11 | - private Long propertyId; | ||
| 12 | - | ||
| 13 | - @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") | ||
| 14 | - private String propertyName; | ||
| 15 | - | ||
| 16 | - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 17 | - private Long valueId; | ||
| 18 | - | ||
| 19 | - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") | ||
| 20 | - private String valueName; | ||
| 21 | - | ||
| 22 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.sku; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 4 | -import org.springframework.validation.annotation.Validated; | ||
| 5 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 6 | -import org.springframework.web.bind.annotation.RestController; | ||
| 7 | - | ||
| 8 | -@Tag(name = "管理后台 - 商品 SKU") | ||
| 9 | -@RestController | ||
| 10 | -@RequestMapping("/product/sku") | ||
| 11 | -@Validated | ||
| 12 | -public class ProductSkuController { | ||
| 13 | - | ||
| 14 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.sku.vo; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.Data; | ||
| 5 | -import lombok.EqualsAndHashCode; | ||
| 6 | -import lombok.ToString; | ||
| 7 | - | ||
| 8 | -import java.util.List; | ||
| 9 | - | ||
| 10 | -@Schema(description = "管理后台 - 商品 SKU 创建/更新 Request VO") | ||
| 11 | -@Data | ||
| 12 | -@EqualsAndHashCode(callSuper = true) | ||
| 13 | -@ToString(callSuper = true) | ||
| 14 | -public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO { | ||
| 15 | - | ||
| 16 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.sku.vo; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.*; | ||
| 5 | - | ||
| 6 | -import jakarta.validation.constraints.NotNull; | ||
| 7 | -import java.util.List; | ||
| 8 | - | ||
| 9 | -@Schema(description = "管理后台 - 商品 SKU Response VO") | ||
| 10 | -@Data | ||
| 11 | -@EqualsAndHashCode(callSuper = true) | ||
| 12 | -@ToString(callSuper = true) | ||
| 13 | -public class ProductSkuRespVO extends ProductSkuBaseVO { | ||
| 14 | - | ||
| 15 | - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 16 | - private Long id; | ||
| 17 | - | ||
| 18 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.controller.admin.spu; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.controller.admin.spu; | ||
| 2 | 2 | ||
| 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.framework.common.util.object.BeanUtils; | ||
| 5 | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | 6 | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| 6 | import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | 7 | import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; |
| 7 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 8 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; |
| @@ -14,23 +15,22 @@ import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | @@ -14,23 +15,22 @@ import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | ||
| 14 | import io.swagger.v3.oas.annotations.Operation; | 15 | import io.swagger.v3.oas.annotations.Operation; |
| 15 | import io.swagger.v3.oas.annotations.Parameter; | 16 | import io.swagger.v3.oas.annotations.Parameter; |
| 16 | import io.swagger.v3.oas.annotations.tags.Tag; | 17 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 18 | +import jakarta.annotation.Resource; | ||
| 19 | +import jakarta.servlet.http.HttpServletResponse; | ||
| 20 | +import jakarta.validation.Valid; | ||
| 17 | import org.springframework.security.access.prepost.PreAuthorize; | 21 | import org.springframework.security.access.prepost.PreAuthorize; |
| 18 | import org.springframework.validation.annotation.Validated; | 22 | import org.springframework.validation.annotation.Validated; |
| 19 | import org.springframework.web.bind.annotation.*; | 23 | import org.springframework.web.bind.annotation.*; |
| 20 | 24 | ||
| 21 | -import jakarta.annotation.Resource; | ||
| 22 | -import jakarta.servlet.http.HttpServletResponse; | ||
| 23 | -import jakarta.validation.Valid; | ||
| 24 | import java.io.IOException; | 25 | import java.io.IOException; |
| 25 | import java.util.Collection; | 26 | import java.util.Collection; |
| 26 | import java.util.Comparator; | 27 | import java.util.Comparator; |
| 27 | import java.util.List; | 28 | import java.util.List; |
| 28 | import java.util.Map; | 29 | import java.util.Map; |
| 29 | 30 | ||
| 30 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 31 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 31 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 32 | +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; | ||
| 32 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; | 33 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; |
| 33 | -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; | ||
| 34 | 34 | ||
| 35 | @Tag(name = "管理后台 - 商品 SPU") | 35 | @Tag(name = "管理后台 - 商品 SPU") |
| 36 | @RestController | 36 | @RestController |
| @@ -46,14 +46,14 @@ public class ProductSpuController { | @@ -46,14 +46,14 @@ public class ProductSpuController { | ||
| 46 | @PostMapping("/create") | 46 | @PostMapping("/create") |
| 47 | @Operation(summary = "创建商品 SPU") | 47 | @Operation(summary = "创建商品 SPU") |
| 48 | @PreAuthorize("@ss.hasPermission('product:spu:create')") | 48 | @PreAuthorize("@ss.hasPermission('product:spu:create')") |
| 49 | - public CommonResult<Long> createProductSpu(@Valid @RequestBody ProductSpuCreateReqVO createReqVO) { | 49 | + public CommonResult<Long> createProductSpu(@Valid @RequestBody ProductSpuSaveReqVO createReqVO) { |
| 50 | return success(productSpuService.createSpu(createReqVO)); | 50 | return success(productSpuService.createSpu(createReqVO)); |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | @PutMapping("/update") | 53 | @PutMapping("/update") |
| 54 | @Operation(summary = "更新商品 SPU") | 54 | @Operation(summary = "更新商品 SPU") |
| 55 | @PreAuthorize("@ss.hasPermission('product:spu:update')") | 55 | @PreAuthorize("@ss.hasPermission('product:spu:update')") |
| 56 | - public CommonResult<Boolean> updateSpu(@Valid @RequestBody ProductSpuUpdateReqVO updateReqVO) { | 56 | + public CommonResult<Boolean> updateSpu(@Valid @RequestBody ProductSpuSaveReqVO updateReqVO) { |
| 57 | productSpuService.updateSpu(updateReqVO); | 57 | productSpuService.updateSpu(updateReqVO); |
| 58 | return success(true); | 58 | return success(true); |
| 59 | } | 59 | } |
| @@ -79,15 +79,15 @@ public class ProductSpuController { | @@ -79,15 +79,15 @@ public class ProductSpuController { | ||
| 79 | @Operation(summary = "获得商品 SPU 明细") | 79 | @Operation(summary = "获得商品 SPU 明细") |
| 80 | @Parameter(name = "id", description = "编号", required = true, example = "1024") | 80 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 81 | @PreAuthorize("@ss.hasPermission('product:spu:query')") | 81 | @PreAuthorize("@ss.hasPermission('product:spu:query')") |
| 82 | - public CommonResult<ProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) { | 82 | + public CommonResult<ProductSpuRespVO> getSpuDetail(@RequestParam("id") Long id) { |
| 83 | // 获得商品 SPU | 83 | // 获得商品 SPU |
| 84 | ProductSpuDO spu = productSpuService.getSpu(id); | 84 | ProductSpuDO spu = productSpuService.getSpu(id); |
| 85 | if (spu == null) { | 85 | if (spu == null) { |
| 86 | - throw exception(SPU_NOT_EXISTS); | 86 | + return success(null); |
| 87 | } | 87 | } |
| 88 | // 查询商品 SKU | 88 | // 查询商品 SKU |
| 89 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); | 89 | List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); |
| 90 | - return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespVO(spu, skus)); | 90 | + return success(ProductSpuConvert.INSTANCE.convert(spu, skus)); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | @GetMapping("/list-all-simple") | 93 | @GetMapping("/list-all-simple") |
| @@ -97,14 +97,14 @@ public class ProductSpuController { | @@ -97,14 +97,14 @@ public class ProductSpuController { | ||
| 97 | List<ProductSpuDO> list = productSpuService.getSpuListByStatus(ProductSpuStatusEnum.ENABLE.getStatus()); | 97 | List<ProductSpuDO> list = productSpuService.getSpuListByStatus(ProductSpuStatusEnum.ENABLE.getStatus()); |
| 98 | // 降序排序后,返回给前端 | 98 | // 降序排序后,返回给前端 |
| 99 | list.sort(Comparator.comparing(ProductSpuDO::getSort).reversed()); | 99 | list.sort(Comparator.comparing(ProductSpuDO::getSort).reversed()); |
| 100 | - return success(ProductSpuConvert.INSTANCE.convertList02(list)); | 100 | + return success(BeanUtils.toBean(list, ProductSpuSimpleRespVO.class)); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | @GetMapping("/list") | 103 | @GetMapping("/list") |
| 104 | @Operation(summary = "获得商品 SPU 详情列表") | 104 | @Operation(summary = "获得商品 SPU 详情列表") |
| 105 | @Parameter(name = "spuIds", description = "spu 编号列表", required = true, example = "[1,2,3]") | 105 | @Parameter(name = "spuIds", description = "spu 编号列表", required = true, example = "[1,2,3]") |
| 106 | @PreAuthorize("@ss.hasPermission('product:spu:query')") | 106 | @PreAuthorize("@ss.hasPermission('product:spu:query')") |
| 107 | - public CommonResult<List<ProductSpuDetailRespVO>> getSpuList(@RequestParam("spuIds") Collection<Long> spuIds) { | 107 | + public CommonResult<List<ProductSpuRespVO>> getSpuList(@RequestParam("spuIds") Collection<Long> spuIds) { |
| 108 | return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO( | 108 | return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO( |
| 109 | productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds))); | 109 | productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds))); |
| 110 | } | 110 | } |
| @@ -113,7 +113,8 @@ public class ProductSpuController { | @@ -113,7 +113,8 @@ public class ProductSpuController { | ||
| 113 | @Operation(summary = "获得商品 SPU 分页") | 113 | @Operation(summary = "获得商品 SPU 分页") |
| 114 | @PreAuthorize("@ss.hasPermission('product:spu:query')") | 114 | @PreAuthorize("@ss.hasPermission('product:spu:query')") |
| 115 | public CommonResult<PageResult<ProductSpuRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { | 115 | public CommonResult<PageResult<ProductSpuRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { |
| 116 | - return success(ProductSpuConvert.INSTANCE.convertPage(productSpuService.getSpuPage(pageVO))); | 116 | + PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO); |
| 117 | + return success(BeanUtils.toBean(pageResult, ProductSpuRespVO.class)); | ||
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | @GetMapping("/get-count") | 120 | @GetMapping("/get-count") |
| @@ -127,12 +128,13 @@ public class ProductSpuController { | @@ -127,12 +128,13 @@ public class ProductSpuController { | ||
| 127 | @Operation(summary = "导出商品") | 128 | @Operation(summary = "导出商品") |
| 128 | @PreAuthorize("@ss.hasPermission('product:spu:export')") | 129 | @PreAuthorize("@ss.hasPermission('product:spu:export')") |
| 129 | @OperateLog(type = EXPORT) | 130 | @OperateLog(type = EXPORT) |
| 130 | - public void exportUserList(@Validated ProductSpuExportReqVO reqVO, | 131 | + public void exportSpuList(@Validated ProductSpuPageReqVO reqVO, |
| 131 | HttpServletResponse response) throws IOException { | 132 | HttpServletResponse response) throws IOException { |
| 132 | - List<ProductSpuDO> spuList = productSpuService.getSpuList(reqVO); | 133 | + reqVO.setPageSize(PAGE_SIZE_NONE); |
| 134 | + List<ProductSpuDO> list = productSpuService.getSpuPage(reqVO).getList(); | ||
| 133 | // 导出 Excel | 135 | // 导出 Excel |
| 134 | - List<ProductSpuExcelVO> datas = ProductSpuConvert.INSTANCE.convertList03(spuList); | ||
| 135 | - ExcelUtils.write(response, "商品列表.xls", "数据", ProductSpuExcelVO.class, datas); | 136 | + ExcelUtils.write(response, "商品列表.xls", "数据", ProductSpuRespVO.class, |
| 137 | + BeanUtils.toBean(list, ProductSpuRespVO.class)); | ||
| 136 | } | 138 | } |
| 137 | 139 | ||
| 138 | } | 140 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuRespVO.java
0 → 100755
| 1 | +package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | +import java.util.List; | ||
| 7 | + | ||
| 8 | +@Schema(description = "管理后台 - 商品 SKU Response VO") | ||
| 9 | +@Data | ||
| 10 | +public class ProductSkuRespVO { | ||
| 11 | + | ||
| 12 | + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 13 | + private Long id; | ||
| 14 | + | ||
| 15 | + @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") | ||
| 16 | + private String name; | ||
| 17 | + | ||
| 18 | + @Schema(description = "销售价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | ||
| 19 | + private Integer price; | ||
| 20 | + | ||
| 21 | + @Schema(description = "市场价", example = "2999") | ||
| 22 | + private Integer marketPrice; | ||
| 23 | + | ||
| 24 | + @Schema(description = "成本价", example = "19") | ||
| 25 | + private Integer costPrice; | ||
| 26 | + | ||
| 27 | + @Schema(description = "条形码", example = "15156165456") | ||
| 28 | + private String barCode; | ||
| 29 | + | ||
| 30 | + @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") | ||
| 31 | + private String picUrl; | ||
| 32 | + | ||
| 33 | + @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") | ||
| 34 | + private Integer stock; | ||
| 35 | + | ||
| 36 | + @Schema(description = "商品重量,单位:kg 千克", example = "1.2") | ||
| 37 | + private Double weight; | ||
| 38 | + | ||
| 39 | + @Schema(description = "商品体积,单位:m^3 平米", example = "2.5") | ||
| 40 | + private Double volume; | ||
| 41 | + | ||
| 42 | + @Schema(description = "一级分销的佣金,单位:分", example = "199") | ||
| 43 | + private Integer firstBrokeragePrice; | ||
| 44 | + | ||
| 45 | + @Schema(description = "二级分销的佣金,单位:分", example = "19") | ||
| 46 | + private Integer secondBrokeragePrice; | ||
| 47 | + | ||
| 48 | + @Schema(description = "属性数组") | ||
| 49 | + private List<ProductSkuSaveReqVO.Property> properties; | ||
| 50 | + | ||
| 51 | +} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.sku.vo; | 1 | +package cn.iocoder.yudao.module.product.controller.admin.spu.vo; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import lombok.AllArgsConstructor; | ||
| 5 | -import lombok.Data; | ||
| 6 | -import lombok.NoArgsConstructor; | ||
| 7 | - | ||
| 8 | import jakarta.validation.constraints.NotEmpty; | 4 | import jakarta.validation.constraints.NotEmpty; |
| 9 | import jakarta.validation.constraints.NotNull; | 5 | import jakarta.validation.constraints.NotNull; |
| 6 | +import lombok.*; | ||
| 7 | + | ||
| 10 | import java.util.List; | 8 | import java.util.List; |
| 11 | 9 | ||
| 12 | -/** | ||
| 13 | -* 商品 SKU Base VO,提供给添加、修改、详细的子 VO 使用 | ||
| 14 | -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 | ||
| 15 | -*/ | 10 | +@Schema(description = "管理后台 - 商品 SKU 创建/更新 Request VO") |
| 16 | @Data | 11 | @Data |
| 17 | -public class ProductSkuBaseVO { | 12 | +public class ProductSkuSaveReqVO { |
| 18 | 13 | ||
| 19 | @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") | 14 | @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") |
| 20 | @NotEmpty(message = "商品 SKU 名字不能为空") | 15 | @NotEmpty(message = "商品 SKU 名字不能为空") |
| @@ -41,9 +36,6 @@ public class ProductSkuBaseVO { | @@ -41,9 +36,6 @@ public class ProductSkuBaseVO { | ||
| 41 | @NotNull(message = "库存不能为空") | 36 | @NotNull(message = "库存不能为空") |
| 42 | private Integer stock; | 37 | private Integer stock; |
| 43 | 38 | ||
| 44 | - @Schema(description = "预警预存", example = "10") | ||
| 45 | - private Integer warnStock; | ||
| 46 | - | ||
| 47 | @Schema(description = "商品重量,单位:kg 千克", example = "1.2") | 39 | @Schema(description = "商品重量,单位:kg 千克", example = "1.2") |
| 48 | private Double weight; | 40 | private Double weight; |
| 49 | 41 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | -import lombok.Data; | ||
| 6 | -import lombok.EqualsAndHashCode; | ||
| 7 | -import lombok.ToString; | ||
| 8 | - | ||
| 9 | -import jakarta.validation.Valid; | ||
| 10 | -import java.util.List; | ||
| 11 | - | ||
| 12 | -@Schema(description = "管理后台 - 商品 SPU 创建 Request VO") | ||
| 13 | -@Data | ||
| 14 | -@EqualsAndHashCode(callSuper = true) | ||
| 15 | -@ToString(callSuper = true) | ||
| 16 | -public class ProductSpuCreateReqVO extends ProductSpuBaseVO { | ||
| 17 | - | ||
| 18 | - // ========== SKU 相关字段 ========= | ||
| 19 | - | ||
| 20 | - @Schema(description = "SKU 数组") | ||
| 21 | - @Valid | ||
| 22 | - private List<ProductSkuCreateOrUpdateReqVO> skus; | ||
| 23 | - | ||
| 24 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; | ||
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | -import lombok.Data; | ||
| 6 | -import lombok.EqualsAndHashCode; | ||
| 7 | -import lombok.ToString; | ||
| 8 | - | ||
| 9 | -import java.util.List; | ||
| 10 | - | ||
| 11 | -@Schema(description = "管理后台 - 商品 SPU 详细 Response VO") | ||
| 12 | -@Data | ||
| 13 | -@EqualsAndHashCode(callSuper = true) | ||
| 14 | -@ToString(callSuper = true) | ||
| 15 | -public class ProductSpuDetailRespVO extends ProductSpuRespVO { | ||
| 16 | - | ||
| 17 | - // ========== SKU 相关字段 ========= | ||
| 18 | - | ||
| 19 | - @Schema(description = "SKU 数组") | ||
| 20 | - private List<ProductSkuRespVO> skus; | ||
| 21 | - | ||
| 22 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuExcelVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | ||
| 4 | -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | ||
| 5 | -import cn.iocoder.yudao.module.product.enums.DictTypeConstants; | ||
| 6 | -import com.alibaba.excel.annotation.ExcelProperty; | ||
| 7 | -import lombok.Data; | ||
| 8 | - | ||
| 9 | - | ||
| 10 | -import java.time.LocalDateTime; | ||
| 11 | - | ||
| 12 | -/** | ||
| 13 | - * 商品 Spu Excel 导出 VO TODO 暂定 | ||
| 14 | - * | ||
| 15 | - * @author HUIHUI | ||
| 16 | - */ | ||
| 17 | -@Data | ||
| 18 | -public class ProductSpuExcelVO { | ||
| 19 | - | ||
| 20 | - @ExcelProperty("商品编号") | ||
| 21 | - private Long id; | ||
| 22 | - | ||
| 23 | - @ExcelProperty("商品名称") | ||
| 24 | - private String name; | ||
| 25 | - | ||
| 26 | - @ExcelProperty("关键字") | ||
| 27 | - private String keyword; | ||
| 28 | - | ||
| 29 | - @ExcelProperty("商品简介") | ||
| 30 | - private String introduction; | ||
| 31 | - | ||
| 32 | - @ExcelProperty("商品详情") | ||
| 33 | - private String description; | ||
| 34 | - | ||
| 35 | - @ExcelProperty("条形码") | ||
| 36 | - private String barCode; | ||
| 37 | - | ||
| 38 | - @ExcelProperty("商品分类编号") | ||
| 39 | - private Long categoryId; | ||
| 40 | - | ||
| 41 | - @ExcelProperty("商品品牌编号") | ||
| 42 | - private Long brandId; | ||
| 43 | - | ||
| 44 | - @ExcelProperty("商品封面图") | ||
| 45 | - private String picUrl; | ||
| 46 | - | ||
| 47 | - @ExcelProperty("排序字段") | ||
| 48 | - private Integer sort; | ||
| 49 | - | ||
| 50 | - @ExcelProperty(value = "商品状态", converter = DictConvert.class) | ||
| 51 | - @DictFormat(DictTypeConstants.PRODUCT_SPU_STATUS) | ||
| 52 | - private Integer status; | ||
| 53 | - | ||
| 54 | - @ExcelProperty("规格类型") | ||
| 55 | - private Boolean specType; | ||
| 56 | - | ||
| 57 | - @ExcelProperty("商品价格") | ||
| 58 | - private Integer price; | ||
| 59 | - | ||
| 60 | - @ExcelProperty("市场价") | ||
| 61 | - private Integer marketPrice; | ||
| 62 | - | ||
| 63 | - @ExcelProperty("成本价") | ||
| 64 | - private Integer costPrice; | ||
| 65 | - | ||
| 66 | - @ExcelProperty("库存") | ||
| 67 | - private Integer stock; | ||
| 68 | - | ||
| 69 | - @ExcelProperty("物流配置模板编号") | ||
| 70 | - private Long deliveryTemplateId; | ||
| 71 | - | ||
| 72 | - @ExcelProperty("赠送积分") | ||
| 73 | - private Integer giveIntegral; | ||
| 74 | - | ||
| 75 | - @ExcelProperty("分销类型") | ||
| 76 | - private Boolean subCommissionType; | ||
| 77 | - | ||
| 78 | - @ExcelProperty("商品销量") | ||
| 79 | - private Integer salesCount; | ||
| 80 | - | ||
| 81 | - @ExcelProperty("虚拟销量") | ||
| 82 | - private Integer virtualSalesCount; | ||
| 83 | - | ||
| 84 | - @ExcelProperty("商品点击量") | ||
| 85 | - private Integer browseCount; | ||
| 86 | - | ||
| 87 | - @ExcelProperty("创建时间") | ||
| 88 | - private LocalDateTime createTime; | ||
| 89 | - | ||
| 90 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuExportReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import lombok.AllArgsConstructor; | ||
| 5 | -import lombok.Data; | ||
| 6 | -import lombok.NoArgsConstructor; | ||
| 7 | -import org.springframework.format.annotation.DateTimeFormat; | ||
| 8 | - | ||
| 9 | -import java.time.LocalDateTime; | ||
| 10 | - | ||
| 11 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 12 | - | ||
| 13 | -@Schema(description = "管理后台 - 商品 SPU 导出 Request VO,参数和 ProductSpuPageReqVO 是一致的") | ||
| 14 | -@Data | ||
| 15 | -@NoArgsConstructor | ||
| 16 | -@AllArgsConstructor | ||
| 17 | -public class ProductSpuExportReqVO { | ||
| 18 | - | ||
| 19 | - @Schema(description = "商品名称", example = "清凉小短袖") | ||
| 20 | - private String name; | ||
| 21 | - | ||
| 22 | - @Schema(description = "前端请求的tab类型", example = "1") | ||
| 23 | - private Integer tabType; | ||
| 24 | - | ||
| 25 | - @Schema(description = "商品分类编号", example = "100") | ||
| 26 | - private Long categoryId; | ||
| 27 | - | ||
| 28 | - @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") | ||
| 29 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 30 | - private LocalDateTime[] createTime; | ||
| 31 | - | ||
| 32 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuRespVO.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.excel.core.annotations.DictFormat; | ||
| 4 | +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | ||
| 5 | +import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert; | ||
| 6 | +import cn.iocoder.yudao.module.product.enums.DictTypeConstants; | ||
| 7 | +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||
| 8 | +import com.alibaba.excel.annotation.ExcelProperty; | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 9 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | import lombok.Data; | 10 | import lombok.Data; |
| 5 | -import lombok.EqualsAndHashCode; | ||
| 6 | -import lombok.ToString; | ||
| 7 | 11 | ||
| 8 | import java.time.LocalDateTime; | 12 | import java.time.LocalDateTime; |
| 13 | +import java.util.List; | ||
| 9 | 14 | ||
| 10 | @Schema(description = "管理后台 - 商品 SPU Response VO") | 15 | @Schema(description = "管理后台 - 商品 SPU Response VO") |
| 11 | @Data | 16 | @Data |
| 12 | -@EqualsAndHashCode(callSuper = true) | ||
| 13 | -@ToString(callSuper = true) | ||
| 14 | -public class ProductSpuRespVO extends ProductSpuBaseVO { | 17 | +@ExcelIgnoreUnannotated |
| 18 | +public class ProductSpuRespVO { | ||
| 15 | 19 | ||
| 16 | @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") | 20 | @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") |
| 21 | + @ExcelProperty("商品编号") | ||
| 17 | private Long id; | 22 | private Long id; |
| 18 | 23 | ||
| 24 | + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") | ||
| 25 | + @ExcelProperty("商品名称") | ||
| 26 | + private String name; | ||
| 27 | + | ||
| 28 | + @Schema(description = "关键字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑不出汗") | ||
| 29 | + @ExcelProperty("关键字") | ||
| 30 | + private String keyword; | ||
| 31 | + | ||
| 32 | + @Schema(description = "商品简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖简介") | ||
| 33 | + @ExcelProperty("商品简介") | ||
| 34 | + private String introduction; | ||
| 35 | + | ||
| 36 | + @Schema(description = "商品详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖详情") | ||
| 37 | + @ExcelProperty("商品详情") | ||
| 38 | + private String description; | ||
| 39 | + | ||
| 40 | + @Schema(description = "商品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 41 | + @ExcelProperty("商品分类编号") | ||
| 42 | + private Long categoryId; | ||
| 43 | + | ||
| 44 | + @Schema(description = "商品品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 45 | + @ExcelProperty("商品品牌编号") | ||
| 46 | + private Long brandId; | ||
| 47 | + | ||
| 48 | + @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") | ||
| 49 | + @ExcelProperty("商品封面图") | ||
| 50 | + private String picUrl; | ||
| 51 | + | ||
| 52 | + @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") | ||
| 53 | + private List<String> sliderPicUrls; | ||
| 54 | + | ||
| 55 | + @Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 56 | + @ExcelProperty("排序字段") | ||
| 57 | + private Integer sort; | ||
| 58 | + | ||
| 59 | + @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 60 | + @ExcelProperty(value = "商品状态", converter = DictConvert.class) | ||
| 61 | + @DictFormat(DictTypeConstants.PRODUCT_SPU_STATUS) | ||
| 62 | + private Integer status; | ||
| 63 | + | ||
| 64 | + @Schema(description = "商品创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-05-24 00:00:00") | ||
| 65 | + @ExcelProperty("创建时间") | ||
| 66 | + private LocalDateTime createTime; | ||
| 67 | + | ||
| 68 | + // ========== SKU 相关字段 ========= | ||
| 69 | + | ||
| 70 | + @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") | ||
| 71 | + @ExcelProperty("规格类型") | ||
| 72 | + private Boolean specType; | ||
| 73 | + | ||
| 19 | @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | 74 | @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") |
| 75 | + @ExcelProperty(value = "商品价格", converter = MoneyConvert.class) | ||
| 20 | private Integer price; | 76 | private Integer price; |
| 21 | 77 | ||
| 22 | - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") | ||
| 23 | - private Integer salesCount; | ||
| 24 | - | ||
| 25 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "199") | 78 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "199") |
| 79 | + @ExcelProperty(value = "市场价", converter = MoneyConvert.class) | ||
| 26 | private Integer marketPrice; | 80 | private Integer marketPrice; |
| 27 | 81 | ||
| 28 | @Schema(description = "成本价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "19") | 82 | @Schema(description = "成本价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "19") |
| 83 | + @ExcelProperty(value = "成本价", converter = MoneyConvert.class) | ||
| 29 | private Integer costPrice; | 84 | private Integer costPrice; |
| 30 | 85 | ||
| 31 | @Schema(description = "商品库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") | 86 | @Schema(description = "商品库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") |
| 87 | + @ExcelProperty("库存") | ||
| 32 | private Integer stock; | 88 | private Integer stock; |
| 33 | 89 | ||
| 34 | - @Schema(description = "商品创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-05-24 00:00:00") | ||
| 35 | - private LocalDateTime createTime; | 90 | + @Schema(description = "SKU 数组") |
| 91 | + private List<ProductSkuRespVO> skus; | ||
| 36 | 92 | ||
| 37 | - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 38 | - private Integer status; | 93 | + // ========== 物流相关字段 ========= |
| 94 | + | ||
| 95 | + @Schema(description = "配送方式数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 96 | + private List<Integer> deliveryTypes; | ||
| 97 | + | ||
| 98 | + @Schema(description = "物流配置模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") | ||
| 99 | + @ExcelProperty("物流配置模板编号") | ||
| 100 | + private Long deliveryTemplateId; | ||
| 101 | + | ||
| 102 | + // ========== 营销相关字段 ========= | ||
| 103 | + | ||
| 104 | + @Schema(description = "赠送积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") | ||
| 105 | + @ExcelProperty("赠送积分") | ||
| 106 | + private Integer giveIntegral; | ||
| 107 | + | ||
| 108 | + @Schema(description = "分销类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") | ||
| 109 | + @ExcelProperty("分销类型") | ||
| 110 | + private Boolean subCommissionType; | ||
| 111 | + | ||
| 112 | + // ========== 统计相关字段 ========= | ||
| 113 | + | ||
| 114 | + @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") | ||
| 115 | + @ExcelProperty("商品销量") | ||
| 116 | + private Integer salesCount; | ||
| 117 | + | ||
| 118 | + @Schema(description = "虚拟销量", example = "66") | ||
| 119 | + @ExcelProperty("虚拟销量") | ||
| 120 | + private Integer virtualSalesCount; | ||
| 39 | 121 | ||
| 40 | @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") | 122 | @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") |
| 123 | + @ExcelProperty("商品点击量") | ||
| 41 | private Integer browseCount; | 124 | private Integer browseCount; |
| 42 | 125 | ||
| 43 | } | 126 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuSaveReqVO.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 io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import lombok.Data; | ||
| 5 | - | 4 | +import jakarta.validation.Valid; |
| 6 | import jakarta.validation.constraints.NotEmpty; | 5 | import jakarta.validation.constraints.NotEmpty; |
| 7 | import jakarta.validation.constraints.NotNull; | 6 | import jakarta.validation.constraints.NotNull; |
| 7 | +import lombok.Data; | ||
| 8 | + | ||
| 8 | import java.util.List; | 9 | import java.util.List; |
| 9 | 10 | ||
| 10 | -/** | ||
| 11 | -* 商品 SPU Base VO,提供给添加、修改、详细的子 VO 使用 | ||
| 12 | -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 | ||
| 13 | - * | ||
| 14 | - * @author HUIHUI | ||
| 15 | - */ | 11 | +@Schema(description = "管理后台 - 商品 SPU 新增/更新 Request VO") |
| 16 | @Data | 12 | @Data |
| 17 | -public class ProductSpuBaseVO { | 13 | +public class ProductSpuSaveReqVO { |
| 14 | + | ||
| 15 | + @Schema(description = "商品编号", example = "1") | ||
| 16 | + private Long id; | ||
| 18 | 17 | ||
| 19 | @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") | 18 | @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") |
| 20 | @NotEmpty(message = "商品名称不能为空") | 19 | @NotEmpty(message = "商品名称不能为空") |
| @@ -44,7 +43,8 @@ public class ProductSpuBaseVO { | @@ -44,7 +43,8 @@ public class ProductSpuBaseVO { | ||
| 44 | @NotEmpty(message = "商品封面图不能为空") | 43 | @NotEmpty(message = "商品封面图不能为空") |
| 45 | private String picUrl; | 44 | private String picUrl; |
| 46 | 45 | ||
| 47 | - @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") | 46 | + @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED, |
| 47 | + example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") | ||
| 48 | private List<String> sliderPicUrls; | 48 | private List<String> sliderPicUrls; |
| 49 | 49 | ||
| 50 | @Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 50 | @Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| @@ -64,7 +64,6 @@ public class ProductSpuBaseVO { | @@ -64,7 +64,6 @@ public class ProductSpuBaseVO { | ||
| 64 | private List<Integer> deliveryTypes; | 64 | private List<Integer> deliveryTypes; |
| 65 | 65 | ||
| 66 | @Schema(description = "物流配置模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") | 66 | @Schema(description = "物流配置模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") |
| 67 | - @NotNull(message = "物流配置模板编号不能为空") | ||
| 68 | private Long deliveryTemplateId; | 67 | private Long deliveryTemplateId; |
| 69 | 68 | ||
| 70 | // ========== 营销相关字段 ========= | 69 | // ========== 营销相关字段 ========= |
| @@ -82,4 +81,16 @@ public class ProductSpuBaseVO { | @@ -82,4 +81,16 @@ public class ProductSpuBaseVO { | ||
| 82 | @Schema(description = "虚拟销量", example = "66") | 81 | @Schema(description = "虚拟销量", example = "66") |
| 83 | private Integer virtualSalesCount; | 82 | private Integer virtualSalesCount; |
| 84 | 83 | ||
| 84 | + @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | ||
| 85 | + private Integer salesCount; | ||
| 86 | + | ||
| 87 | + @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | ||
| 88 | + private Integer browseCount; | ||
| 89 | + | ||
| 90 | + // ========== SKU 相关字段 ========= | ||
| 91 | + | ||
| 92 | + @Schema(description = "SKU 数组") | ||
| 93 | + @Valid | ||
| 94 | + private List<ProductSkuSaveReqVO> skus; | ||
| 95 | + | ||
| 85 | } | 96 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuUpdateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.product.controller.admin.spu.vo; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 4 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | ||
| 6 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 7 | -import lombok.Data; | ||
| 8 | -import lombok.EqualsAndHashCode; | ||
| 9 | -import lombok.ToString; | ||
| 10 | - | ||
| 11 | -import jakarta.validation.Valid; | ||
| 12 | -import jakarta.validation.constraints.NotNull; | ||
| 13 | -import java.util.List; | ||
| 14 | - | ||
| 15 | -@Schema(description = "管理后台 - 商品 SPU 更新 Request VO") | ||
| 16 | -@Data | ||
| 17 | -@EqualsAndHashCode(callSuper = true) | ||
| 18 | -@ToString(callSuper = true) | ||
| 19 | -public class ProductSpuUpdateReqVO extends ProductSpuBaseVO { | ||
| 20 | - | ||
| 21 | - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 22 | - @NotNull(message = "商品编号不能为空") | ||
| 23 | - private Long id; | ||
| 24 | - | ||
| 25 | - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | ||
| 26 | - private Integer salesCount; | ||
| 27 | - | ||
| 28 | - @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") | ||
| 29 | - private Integer browseCount; | ||
| 30 | - | ||
| 31 | - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 32 | - @InEnum(ProductSpuStatusEnum.class) | ||
| 33 | - private Integer status; | ||
| 34 | - | ||
| 35 | - // ========== SKU 相关字段 ========= | ||
| 36 | - | ||
| 37 | - @Schema(description = "SKU 数组") | ||
| 38 | - @Valid | ||
| 39 | - private List<ProductSkuCreateOrUpdateReqVO> skus; | ||
| 40 | - | ||
| 41 | -} |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
| @@ -3,14 +3,14 @@ package cn.iocoder.yudao.module.product.controller.app.spu; | @@ -3,14 +3,14 @@ package cn.iocoder.yudao.module.product.controller.app.spu; | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | 7 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; |
| 7 | import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | 8 | import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; |
| 8 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 9 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| 9 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 10 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 10 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; | 11 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; |
| 11 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 12 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 12 | -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageRespVO; | ||
| 13 | -import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | 13 | +import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuRespVO; |
| 14 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 14 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 15 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 15 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 16 | import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | 16 | import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; |
| @@ -19,16 +19,15 @@ import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | @@ -19,16 +19,15 @@ import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | ||
| 19 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | 19 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; |
| 20 | import io.swagger.v3.oas.annotations.Operation; | 20 | import io.swagger.v3.oas.annotations.Operation; |
| 21 | import io.swagger.v3.oas.annotations.Parameter; | 21 | import io.swagger.v3.oas.annotations.Parameter; |
| 22 | -import io.swagger.v3.oas.annotations.Parameters; | ||
| 23 | import io.swagger.v3.oas.annotations.tags.Tag; | 22 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 23 | +import jakarta.annotation.Resource; | ||
| 24 | +import jakarta.validation.Valid; | ||
| 24 | import org.springframework.validation.annotation.Validated; | 25 | import org.springframework.validation.annotation.Validated; |
| 25 | import org.springframework.web.bind.annotation.GetMapping; | 26 | import org.springframework.web.bind.annotation.GetMapping; |
| 26 | import org.springframework.web.bind.annotation.RequestMapping; | 27 | import org.springframework.web.bind.annotation.RequestMapping; |
| 27 | import org.springframework.web.bind.annotation.RequestParam; | 28 | import org.springframework.web.bind.annotation.RequestParam; |
| 28 | import org.springframework.web.bind.annotation.RestController; | 29 | import org.springframework.web.bind.annotation.RestController; |
| 29 | 30 | ||
| 30 | -import jakarta.annotation.Resource; | ||
| 31 | -import jakarta.validation.Valid; | ||
| 32 | import java.util.Collections; | 31 | import java.util.Collections; |
| 33 | import java.util.List; | 32 | import java.util.List; |
| 34 | import java.util.Set; | 33 | import java.util.Set; |
| @@ -57,39 +56,18 @@ public class AppProductSpuController { | @@ -57,39 +56,18 @@ public class AppProductSpuController { | ||
| 57 | @Resource | 56 | @Resource |
| 58 | private MemberUserApi memberUserApi; | 57 | private MemberUserApi memberUserApi; |
| 59 | 58 | ||
| 60 | - @GetMapping("/list") | ||
| 61 | - @Operation(summary = "获得商品 SPU 列表") | ||
| 62 | - @Parameters({ | ||
| 63 | - @Parameter(name = "recommendType", description = "推荐类型", required = true), // 参见 AppProductSpuPageReqVO.RECOMMEND_TYPE_XXX 常量 | ||
| 64 | - @Parameter(name = "count", description = "数量", required = true) | ||
| 65 | - }) | ||
| 66 | - public CommonResult<List<AppProductSpuPageRespVO>> getSpuList( | ||
| 67 | - @RequestParam("recommendType") String recommendType, | ||
| 68 | - @RequestParam(value = "count", defaultValue = "10") Integer count) { | ||
| 69 | - List<ProductSpuDO> list = productSpuService.getSpuList(recommendType, count); | ||
| 70 | - if (CollUtil.isEmpty(list)) { | ||
| 71 | - return success(Collections.emptyList()); | ||
| 72 | - } | ||
| 73 | - | ||
| 74 | - // 拼接返回 | ||
| 75 | - List<AppProductSpuPageRespVO> voList = ProductSpuConvert.INSTANCE.convertListForGetSpuList(list); | ||
| 76 | - // 处理 vip 价格 | ||
| 77 | - MemberLevelRespDTO memberLevel = getMemberLevel(); | ||
| 78 | - voList.forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); | ||
| 79 | - return success(voList); | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | @GetMapping("/list-by-ids") | 59 | @GetMapping("/list-by-ids") |
| 83 | @Operation(summary = "获得商品 SPU 列表") | 60 | @Operation(summary = "获得商品 SPU 列表") |
| 84 | @Parameter(name = "ids", description = "编号列表", required = true) | 61 | @Parameter(name = "ids", description = "编号列表", required = true) |
| 85 | - public CommonResult<List<AppProductSpuPageRespVO>> getSpuList(@RequestParam("ids") Set<Long> ids) { | 62 | + public CommonResult<List<AppProductSpuRespVO>> getSpuList(@RequestParam("ids") Set<Long> ids) { |
| 86 | List<ProductSpuDO> list = productSpuService.getSpuList(ids); | 63 | List<ProductSpuDO> list = productSpuService.getSpuList(ids); |
| 87 | if (CollUtil.isEmpty(list)) { | 64 | if (CollUtil.isEmpty(list)) { |
| 88 | return success(Collections.emptyList()); | 65 | return success(Collections.emptyList()); |
| 89 | } | 66 | } |
| 90 | 67 | ||
| 91 | // 拼接返回 | 68 | // 拼接返回 |
| 92 | - List<AppProductSpuPageRespVO> voList = ProductSpuConvert.INSTANCE.convertListForGetSpuList(list); | 69 | + list.forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); |
| 70 | + List<AppProductSpuRespVO> voList = BeanUtils.toBean(list, AppProductSpuRespVO.class); | ||
| 93 | // 处理 vip 价格 | 71 | // 处理 vip 价格 |
| 94 | MemberLevelRespDTO memberLevel = getMemberLevel(); | 72 | MemberLevelRespDTO memberLevel = getMemberLevel(); |
| 95 | voList.forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); | 73 | voList.forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); |
| @@ -98,14 +76,15 @@ public class AppProductSpuController { | @@ -98,14 +76,15 @@ public class AppProductSpuController { | ||
| 98 | 76 | ||
| 99 | @GetMapping("/page") | 77 | @GetMapping("/page") |
| 100 | @Operation(summary = "获得商品 SPU 分页") | 78 | @Operation(summary = "获得商品 SPU 分页") |
| 101 | - public CommonResult<PageResult<AppProductSpuPageRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) { | 79 | + public CommonResult<PageResult<AppProductSpuRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) { |
| 102 | PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO); | 80 | PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO); |
| 103 | if (CollUtil.isEmpty(pageResult.getList())) { | 81 | if (CollUtil.isEmpty(pageResult.getList())) { |
| 104 | return success(PageResult.empty(pageResult.getTotal())); | 82 | return success(PageResult.empty(pageResult.getTotal())); |
| 105 | } | 83 | } |
| 106 | 84 | ||
| 107 | // 拼接返回 | 85 | // 拼接返回 |
| 108 | - PageResult<AppProductSpuPageRespVO> voPageResult = ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult); | 86 | + pageResult.getList().forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); |
| 87 | + PageResult<AppProductSpuRespVO> voPageResult = BeanUtils.toBean(pageResult, AppProductSpuRespVO.class); | ||
| 109 | // 处理 vip 价格 | 88 | // 处理 vip 价格 |
| 110 | MemberLevelRespDTO memberLevel = getMemberLevel(); | 89 | MemberLevelRespDTO memberLevel = getMemberLevel(); |
| 111 | voPageResult.getList().forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); | 90 | voPageResult.getList().forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); |
| @@ -124,6 +103,8 @@ public class AppProductSpuController { | @@ -124,6 +103,8 @@ public class AppProductSpuController { | ||
| 124 | if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) { | 103 | if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) { |
| 125 | throw exception(SPU_NOT_ENABLE); | 104 | throw exception(SPU_NOT_ENABLE); |
| 126 | } | 105 | } |
| 106 | + // 获得商品 SKU | ||
| 107 | + List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); | ||
| 127 | 108 | ||
| 128 | // 增加浏览量 | 109 | // 增加浏览量 |
| 129 | productSpuService.updateBrowseCount(id, 1); | 110 | productSpuService.updateBrowseCount(id, 1); |
| @@ -131,12 +112,13 @@ public class AppProductSpuController { | @@ -131,12 +112,13 @@ public class AppProductSpuController { | ||
| 131 | productBrowseHistoryService.createBrowseHistory(getLoginUserId(), id); | 112 | productBrowseHistoryService.createBrowseHistory(getLoginUserId(), id); |
| 132 | 113 | ||
| 133 | // 拼接返回 | 114 | // 拼接返回 |
| 134 | - List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId()); | ||
| 135 | - AppProductSpuDetailRespVO detailVO = ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus); | 115 | + spu.setBrowseCount(spu.getBrowseCount() + spu.getVirtualSalesCount()); |
| 116 | + AppProductSpuDetailRespVO spuVO = BeanUtils.toBean(spu, AppProductSpuDetailRespVO.class) | ||
| 117 | + .setSkus(BeanUtils.toBean(skus, AppProductSpuDetailRespVO.Sku.class)); | ||
| 136 | // 处理 vip 价格 | 118 | // 处理 vip 价格 |
| 137 | MemberLevelRespDTO memberLevel = getMemberLevel(); | 119 | MemberLevelRespDTO memberLevel = getMemberLevel(); |
| 138 | - detailVO.setVipPrice(calculateVipPrice(detailVO.getPrice(), memberLevel)); | ||
| 139 | - return success(detailVO); | 120 | + spuVO.setVipPrice(calculateVipPrice(spuVO.getPrice(), memberLevel)); |
| 121 | + return success(spuVO); | ||
| 140 | } | 122 | } |
| 141 | 123 | ||
| 142 | private MemberLevelRespDTO getMemberLevel() { | 124 | private MemberLevelRespDTO getMemberLevel() { |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuPageReqVO.java
| @@ -21,12 +21,6 @@ public class AppProductSpuPageReqVO extends PageParam { | @@ -21,12 +21,6 @@ public class AppProductSpuPageReqVO extends PageParam { | ||
| 21 | public static final String SORT_FIELD_SALES_COUNT = "salesCount"; | 21 | public static final String SORT_FIELD_SALES_COUNT = "salesCount"; |
| 22 | public static final String SORT_FIELD_CREATE_TIME = "createTime"; | 22 | public static final String SORT_FIELD_CREATE_TIME = "createTime"; |
| 23 | 23 | ||
| 24 | - public static final String RECOMMEND_TYPE_HOT = "hot"; | ||
| 25 | - public static final String RECOMMEND_TYPE_BENEFIT = "benefit"; | ||
| 26 | - public static final String RECOMMEND_TYPE_BEST = "best"; | ||
| 27 | - public static final String RECOMMEND_TYPE_NEW = "new"; | ||
| 28 | - public static final String RECOMMEND_TYPE_GOOD = "good"; | ||
| 29 | - | ||
| 30 | @Schema(description = "商品 SPU 编号数组", example = "1,3,5") | 24 | @Schema(description = "商品 SPU 编号数组", example = "1,3,5") |
| 31 | private List<Long> ids; | 25 | private List<Long> ids; |
| 32 | 26 | ||
| @@ -45,9 +39,6 @@ public class AppProductSpuPageReqVO extends PageParam { | @@ -45,9 +39,6 @@ public class AppProductSpuPageReqVO extends PageParam { | ||
| 45 | @Schema(description = "排序方式", example = "true") | 39 | @Schema(description = "排序方式", example = "true") |
| 46 | private Boolean sortAsc; | 40 | private Boolean sortAsc; |
| 47 | 41 | ||
| 48 | - @Schema(description = "推荐类型", example = "hot") // 参见 AppProductSpuPageReqVO.RECOMMEND_TYPE_XXX 常量 | ||
| 49 | - private String recommendType; | ||
| 50 | - | ||
| 51 | @AssertTrue(message = "排序字段不合法") | 42 | @AssertTrue(message = "排序字段不合法") |
| 52 | @JsonIgnore | 43 | @JsonIgnore |
| 53 | public boolean isSortFieldValid() { | 44 | public boolean isSortFieldValid() { |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuRespVO.java
| @@ -7,7 +7,7 @@ import java.util.List; | @@ -7,7 +7,7 @@ import java.util.List; | ||
| 7 | 7 | ||
| 8 | @Schema(description = "用户 App - 商品 SPU Response VO") | 8 | @Schema(description = "用户 App - 商品 SPU Response VO") |
| 9 | @Data | 9 | @Data |
| 10 | -public class AppProductSpuPageRespVO { | 10 | +public class AppProductSpuRespVO { |
| 11 | 11 | ||
| 12 | @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 12 | @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 13 | private Long id; | 13 | private Long id; |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java
| @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.product.convert.sku; | @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.product.convert.sku; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; | ||
| 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 5 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 7 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuRespVO; | ||
| 9 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 6 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 10 | import org.mapstruct.Mapper; | 7 | import org.mapstruct.Mapper; |
| 11 | import org.mapstruct.factory.Mappers; | 8 | import org.mapstruct.factory.Mappers; |
| @@ -25,24 +22,6 @@ public interface ProductSkuConvert { | @@ -25,24 +22,6 @@ public interface ProductSkuConvert { | ||
| 25 | 22 | ||
| 26 | ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class); | 23 | ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class); |
| 27 | 24 | ||
| 28 | - ProductSkuDO convert(ProductSkuCreateOrUpdateReqVO bean); | ||
| 29 | - | ||
| 30 | - ProductSkuRespVO convert(ProductSkuDO bean); | ||
| 31 | - | ||
| 32 | - List<ProductSkuRespVO> convertList(List<ProductSkuDO> list); | ||
| 33 | - | ||
| 34 | - List<ProductSkuDO> convertList06(List<ProductSkuCreateOrUpdateReqVO> list); | ||
| 35 | - | ||
| 36 | - default List<ProductSkuDO> convertList06(List<ProductSkuCreateOrUpdateReqVO> list, Long spuId) { | ||
| 37 | - List<ProductSkuDO> result = convertList06(list); | ||
| 38 | - result.forEach(item -> item.setSpuId(spuId)); | ||
| 39 | - return result; | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - ProductSkuRespDTO convert02(ProductSkuDO bean); | ||
| 43 | - | ||
| 44 | - List<ProductSkuRespDTO> convertList04(List<ProductSkuDO> list); | ||
| 45 | - | ||
| 46 | /** | 25 | /** |
| 47 | * 获得 SPU 的库存变化 Map | 26 | * 获得 SPU 的库存变化 Map |
| 48 | * | 27 | * |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java
| 1 | package cn.iocoder.yudao.module.product.convert.spu; | 1 | package cn.iocoder.yudao.module.product.convert.spu; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 3 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 5 | -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | ||
| 6 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | ||
| 7 | -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; | 4 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuRespVO; | ||
| 6 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuRespVO; | ||
| 8 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 8 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 9 | -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageRespVO; | ||
| 10 | -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; | ||
| 11 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 9 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 12 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 10 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 13 | import org.mapstruct.Mapper; | 11 | import org.mapstruct.Mapper; |
| 14 | -import org.mapstruct.Mapping; | ||
| 15 | -import org.mapstruct.Named; | ||
| 16 | import org.mapstruct.factory.Mappers; | 12 | import org.mapstruct.factory.Mappers; |
| 17 | 13 | ||
| 18 | -import java.util.ArrayList; | ||
| 19 | import java.util.List; | 14 | import java.util.List; |
| 20 | import java.util.Map; | 15 | import java.util.Map; |
| 21 | 16 | ||
| 22 | -import static cn.hutool.core.util.ObjectUtil.defaultIfNull; | ||
| 23 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; | 17 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| 24 | 18 | ||
| 25 | /** | 19 | /** |
| @@ -32,73 +26,17 @@ public interface ProductSpuConvert { | @@ -32,73 +26,17 @@ public interface ProductSpuConvert { | ||
| 32 | 26 | ||
| 33 | ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class); | 27 | ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class); |
| 34 | 28 | ||
| 35 | - ProductSpuDO convert(ProductSpuCreateReqVO bean); | ||
| 36 | - | ||
| 37 | - ProductSpuDO convert(ProductSpuUpdateReqVO bean); | ||
| 38 | - | ||
| 39 | - List<ProductSpuDO> convertList(List<ProductSpuDO> list); | ||
| 40 | - | ||
| 41 | - PageResult<ProductSpuRespVO> convertPage(PageResult<ProductSpuDO> page); | ||
| 42 | - | ||
| 43 | ProductSpuPageReqVO convert(AppProductSpuPageReqVO bean); | 29 | ProductSpuPageReqVO convert(AppProductSpuPageReqVO bean); |
| 44 | 30 | ||
| 45 | - List<ProductSpuRespDTO> convertList2(List<ProductSpuDO> list); | ||
| 46 | - | ||
| 47 | - List<ProductSpuSimpleRespVO> convertList02(List<ProductSpuDO> list); | ||
| 48 | - | ||
| 49 | - @Mapping(target = "price", expression = "java(spu.getPrice() / 100)") | ||
| 50 | - @Mapping(target = "marketPrice", expression = "java(spu.getMarketPrice() / 100)") | ||
| 51 | - @Mapping(target = "costPrice", expression = "java(spu.getCostPrice() / 100)") | ||
| 52 | - ProductSpuExcelVO convert(ProductSpuDO spu); | ||
| 53 | - | ||
| 54 | - default List<ProductSpuExcelVO> convertList03(List<ProductSpuDO> list) { | ||
| 55 | - List<ProductSpuExcelVO> spuExcelVOs = new ArrayList<>(); | ||
| 56 | - list.forEach(spu -> { | ||
| 57 | - ProductSpuExcelVO spuExcelVO = convert(spu); | ||
| 58 | - spuExcelVOs.add(spuExcelVO); | ||
| 59 | - }); | ||
| 60 | - return spuExcelVOs; | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - ProductSpuDetailRespVO convert03(ProductSpuDO spu); | ||
| 64 | - | ||
| 65 | - ProductSpuRespDTO convert02(ProductSpuDO bean); | ||
| 66 | - | ||
| 67 | - // ========== 用户 App 相关 ========== | ||
| 68 | - | ||
| 69 | - PageResult<AppProductSpuPageRespVO> convertPageForGetSpuPage(PageResult<ProductSpuDO> page); | ||
| 70 | - | ||
| 71 | - default List<AppProductSpuPageRespVO> convertListForGetSpuList(List<ProductSpuDO> list) { | ||
| 72 | - // 处理虚拟销量 | ||
| 73 | - list.forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); | ||
| 74 | - // 处理 VO 字段 | ||
| 75 | - return convertListForGetSpuList0(list); | ||
| 76 | - } | ||
| 77 | - | ||
| 78 | - @Named("convertListForGetSpuList0") | ||
| 79 | - List<AppProductSpuPageRespVO> convertListForGetSpuList0(List<ProductSpuDO> list); | ||
| 80 | - | ||
| 81 | - default AppProductSpuDetailRespVO convertForGetSpuDetail(ProductSpuDO spu, List<ProductSkuDO> skus) { | ||
| 82 | - // 处理 SPU | ||
| 83 | - AppProductSpuDetailRespVO spuVO = convertForGetSpuDetail(spu) | ||
| 84 | - .setSalesCount(spu.getSalesCount() + defaultIfNull(spu.getVirtualSalesCount(), 0)); | ||
| 85 | - // 处理 SKU | ||
| 86 | - spuVO.setSkus(convertListForGetSpuDetail(skus)); | 31 | + default ProductSpuRespVO convert(ProductSpuDO spu, List<ProductSkuDO> skus) { |
| 32 | + ProductSpuRespVO spuVO = BeanUtils.toBean(spu, ProductSpuRespVO.class); | ||
| 33 | + spuVO.setSkus(BeanUtils.toBean(skus, ProductSkuRespVO.class)); | ||
| 87 | return spuVO; | 34 | return spuVO; |
| 88 | } | 35 | } |
| 89 | 36 | ||
| 90 | - AppProductSpuDetailRespVO convertForGetSpuDetail(ProductSpuDO spu); | ||
| 91 | - | ||
| 92 | - List<AppProductSpuDetailRespVO.Sku> convertListForGetSpuDetail(List<ProductSkuDO> skus); | ||
| 93 | - | ||
| 94 | - default ProductSpuDetailRespVO convertForSpuDetailRespVO(ProductSpuDO spu, List<ProductSkuDO> skus) { | ||
| 95 | - return convert03(spu).setSkus(ProductSkuConvert.INSTANCE.convertList(skus)); | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - default List<ProductSpuDetailRespVO> convertForSpuDetailRespListVO(List<ProductSpuDO> spus, List<ProductSkuDO> skus) { | 37 | + default List<ProductSpuRespVO> convertForSpuDetailRespListVO(List<ProductSpuDO> spus, List<ProductSkuDO> skus) { |
| 99 | Map<Long, List<ProductSkuDO>> skuMultiMap = convertMultiMap(skus, ProductSkuDO::getSpuId); | 38 | Map<Long, List<ProductSkuDO>> skuMultiMap = convertMultiMap(skus, ProductSkuDO::getSpuId); |
| 100 | - return CollectionUtils.convertList(spus, spu -> convert03(spu) | ||
| 101 | - .setSkus(ProductSkuConvert.INSTANCE.convertList(skuMultiMap.get(spu.getId())))); | 39 | + return CollectionUtils.convertList(spus, spu -> convert(spu, skuMultiMap.get(spu.getId()))); |
| 102 | } | 40 | } |
| 103 | 41 | ||
| 104 | } | 42 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java
| @@ -54,11 +54,6 @@ public class ProductSpuDO extends BaseDO { | @@ -54,11 +54,6 @@ public class ProductSpuDO extends BaseDO { | ||
| 54 | * 商品详情 | 54 | * 商品详情 |
| 55 | */ | 55 | */ |
| 56 | private String description; | 56 | private String description; |
| 57 | - // TODO @芋艿:是不是要删除 | ||
| 58 | - /** | ||
| 59 | - * 商品条码(一维码) | ||
| 60 | - */ | ||
| 61 | - private String barCode; | ||
| 62 | 57 | ||
| 63 | /** | 58 | /** |
| 64 | * 商品分类编号 | 59 | * 商品分类编号 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java
| @@ -4,7 +4,6 @@ import cn.hutool.core.lang.Assert; | @@ -4,7 +4,6 @@ import cn.hutool.core.lang.Assert; | ||
| 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 6 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 7 | -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 8 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 7 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 9 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 9 | ||
| @@ -56,8 +55,4 @@ public interface ProductSkuMapper extends BaseMapperX<ProductSkuDO> { | @@ -56,8 +55,4 @@ public interface ProductSkuMapper extends BaseMapperX<ProductSkuDO> { | ||
| 56 | return update(null, updateWrapper); | 55 | return update(null, updateWrapper); |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | - default List<ProductSkuDO> selectListByAlarmStock() { | ||
| 60 | - return selectList(new QueryWrapper<ProductSkuDO>().apply("stock <= warn_stock")); | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | } | 58 | } |
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; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 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.query.QueryWrapperX; | ||
| 9 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuExportReqVO; | ||
| 10 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | 7 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; |
| 11 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 8 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 12 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 9 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| @@ -15,7 +12,6 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | @@ -15,7 +12,6 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | ||
| 15 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 12 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 16 | import org.apache.ibatis.annotations.Mapper; | 13 | import org.apache.ibatis.annotations.Mapper; |
| 17 | 14 | ||
| 18 | -import java.util.List; | ||
| 19 | import java.util.Objects; | 15 | import java.util.Objects; |
| 20 | import java.util.Set; | 16 | import java.util.Set; |
| 21 | 17 | ||
| @@ -81,21 +77,6 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | @@ -81,21 +77,6 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | ||
| 81 | return selectPage(pageReqVO, query); | 77 | return selectPage(pageReqVO, query); |
| 82 | } | 78 | } |
| 83 | 79 | ||
| 84 | - default List<ProductSpuDO> selectListByRecommendType(String recommendType, Integer count) { | ||
| 85 | - QueryWrapperX<ProductSpuDO> query = new QueryWrapperX<>(); | ||
| 86 | - // 上架状态 且有库存 | ||
| 87 | - query.eq("status", ProductSpuStatusEnum.ENABLE.getStatus()).gt("stock", 0); | ||
| 88 | - // 推荐类型的过滤条件 | ||
| 89 | - if (ObjUtil.equal(recommendType, AppProductSpuPageReqVO.RECOMMEND_TYPE_HOT)) { | ||
| 90 | - query.eq("recommend_hot", true); | ||
| 91 | - } else if (ObjUtil.equal(recommendType, AppProductSpuPageReqVO.RECOMMEND_TYPE_GOOD)) { | ||
| 92 | - query.eq("recommend_good", true); | ||
| 93 | - } | ||
| 94 | - // 设置最大长度 | ||
| 95 | - query.limitN(count); | ||
| 96 | - return selectList(query); | ||
| 97 | - } | ||
| 98 | - | ||
| 99 | /** | 80 | /** |
| 100 | * 更新商品 SPU 库存 | 81 | * 更新商品 SPU 库存 |
| 101 | * | 82 | * |
| @@ -111,22 +92,6 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | @@ -111,22 +92,6 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> { | ||
| 111 | } | 92 | } |
| 112 | 93 | ||
| 113 | /** | 94 | /** |
| 114 | - * 获得 Spu 列表 | ||
| 115 | - * | ||
| 116 | - * @param reqVO 查询条件 | ||
| 117 | - * @return Spu 列表 | ||
| 118 | - */ | ||
| 119 | - default List<ProductSpuDO> selectList(ProductSpuExportReqVO reqVO) { | ||
| 120 | - Integer tabType = reqVO.getTabType(); | ||
| 121 | - LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<>(); | ||
| 122 | - queryWrapper.eqIfPresent(ProductSpuDO::getName, reqVO.getName()); | ||
| 123 | - queryWrapper.eqIfPresent(ProductSpuDO::getCategoryId, reqVO.getCategoryId()); | ||
| 124 | - queryWrapper.betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime()); | ||
| 125 | - appendTabQuery(tabType, queryWrapper); | ||
| 126 | - return selectList(queryWrapper); | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - /** | ||
| 130 | * 添加后台 Tab 选项的查询条件 | 95 | * 添加后台 Tab 选项的查询条件 |
| 131 | * | 96 | * |
| 132 | * @param tabType 标签类型 | 97 | * @param tabType 标签类型 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
| 1 | package cn.iocoder.yudao.module.product.service.sku; | 1 | package cn.iocoder.yudao.module.product.service.sku; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 3 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 4 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | 4 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 5 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 5 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 6 | 6 | ||
| 7 | import java.util.Collection; | 7 | import java.util.Collection; |
| @@ -32,13 +32,6 @@ public interface ProductSkuService { | @@ -32,13 +32,6 @@ public interface ProductSkuService { | ||
| 32 | /** | 32 | /** |
| 33 | * 获得商品 SKU 列表 | 33 | * 获得商品 SKU 列表 |
| 34 | * | 34 | * |
| 35 | - * @return 商品sku列表 | ||
| 36 | - */ | ||
| 37 | - List<ProductSkuDO> getSkuList(); | ||
| 38 | - | ||
| 39 | - /** | ||
| 40 | - * 获得商品 SKU 列表 | ||
| 41 | - * | ||
| 42 | * @param ids 编号 | 35 | * @param ids 编号 |
| 43 | * @return 商品sku列表 | 36 | * @return 商品sku列表 |
| 44 | */ | 37 | */ |
| @@ -49,7 +42,7 @@ public interface ProductSkuService { | @@ -49,7 +42,7 @@ public interface ProductSkuService { | ||
| 49 | * | 42 | * |
| 50 | * @param list sku组合的集合 | 43 | * @param list sku组合的集合 |
| 51 | */ | 44 | */ |
| 52 | - void validateSkuList(List<ProductSkuCreateOrUpdateReqVO> list, Boolean specType); | 45 | + void validateSkuList(List<ProductSkuSaveReqVO> list, Boolean specType); |
| 53 | 46 | ||
| 54 | /** | 47 | /** |
| 55 | * 批量创建 SKU | 48 | * 批量创建 SKU |
| @@ -57,7 +50,7 @@ public interface ProductSkuService { | @@ -57,7 +50,7 @@ public interface ProductSkuService { | ||
| 57 | * @param spuId 商品 SPU 编号 | 50 | * @param spuId 商品 SPU 编号 |
| 58 | * @param list SKU 对象集合 | 51 | * @param list SKU 对象集合 |
| 59 | */ | 52 | */ |
| 60 | - void createSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> list); | 53 | + void createSkuList(Long spuId, List<ProductSkuSaveReqVO> list); |
| 61 | 54 | ||
| 62 | /** | 55 | /** |
| 63 | * 根据 SPU 编号,批量更新它的 SKU 信息 | 56 | * 根据 SPU 编号,批量更新它的 SKU 信息 |
| @@ -65,7 +58,7 @@ public interface ProductSkuService { | @@ -65,7 +58,7 @@ public interface ProductSkuService { | ||
| 65 | * @param spuId SPU 编码 | 58 | * @param spuId SPU 编码 |
| 66 | * @param skus SKU 的集合 | 59 | * @param skus SKU 的集合 |
| 67 | */ | 60 | */ |
| 68 | - void updateSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> skus); | 61 | + void updateSkuList(Long spuId, List<ProductSkuSaveReqVO> skus); |
| 69 | 62 | ||
| 70 | /** | 63 | /** |
| 71 | * 更新 SKU 库存(增量) | 64 | * 更新 SKU 库存(增量) |
| @@ -100,13 +93,6 @@ public interface ProductSkuService { | @@ -100,13 +93,6 @@ public interface ProductSkuService { | ||
| 100 | void deleteSkuBySpuId(Long spuId); | 93 | void deleteSkuBySpuId(Long spuId); |
| 101 | 94 | ||
| 102 | /** | 95 | /** |
| 103 | - * 获得库存预警的 SKU 数组 | ||
| 104 | - * | ||
| 105 | - * @return SKU 数组 | ||
| 106 | - */ | ||
| 107 | - List<ProductSkuDO> getSkuListByAlarmStock(); | ||
| 108 | - | ||
| 109 | - /** | ||
| 110 | * 更新 sku 属性 | 96 | * 更新 sku 属性 |
| 111 | * | 97 | * |
| 112 | * @param propertyId 属性 id | 98 | * @param propertyId 属性 id |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
| @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.product.service.sku; | @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.product.service.sku; | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.collection.ListUtil; | 4 | import cn.hutool.core.collection.ListUtil; |
| 5 | import cn.hutool.core.util.ObjectUtil; | 5 | import cn.hutool.core.util.ObjectUtil; |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 7 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 7 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; | ||
| 8 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | 8 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 9 | import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; | 9 | import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; |
| 10 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; | 10 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; |
| 11 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; | 11 | import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO; |
| @@ -14,12 +14,12 @@ import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper; | @@ -14,12 +14,12 @@ import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper; | ||
| 14 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; | 14 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; |
| 15 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; | 15 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; |
| 16 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; | 16 | import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; |
| 17 | +import jakarta.annotation.Resource; | ||
| 17 | import org.springframework.context.annotation.Lazy; | 18 | import org.springframework.context.annotation.Lazy; |
| 18 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 19 | import org.springframework.transaction.annotation.Transactional; | 20 | import org.springframework.transaction.annotation.Transactional; |
| 20 | import org.springframework.validation.annotation.Validated; | 21 | import org.springframework.validation.annotation.Validated; |
| 21 | 22 | ||
| 22 | -import jakarta.annotation.Resource; | ||
| 23 | import java.util.*; | 23 | import java.util.*; |
| 24 | import java.util.stream.Collectors; | 24 | import java.util.stream.Collectors; |
| 25 | 25 | ||
| @@ -69,11 +69,6 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -69,11 +69,6 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | @Override | 71 | @Override |
| 72 | - public List<ProductSkuDO> getSkuList() { | ||
| 73 | - return productSkuMapper.selectList(); | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - @Override | ||
| 77 | public List<ProductSkuDO> getSkuList(Collection<Long> ids) { | 72 | public List<ProductSkuDO> getSkuList(Collection<Long> ids) { |
| 78 | if (CollUtil.isEmpty(ids)) { | 73 | if (CollUtil.isEmpty(ids)) { |
| 79 | return ListUtil.empty(); | 74 | return ListUtil.empty(); |
| @@ -82,20 +77,18 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -82,20 +77,18 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 82 | } | 77 | } |
| 83 | 78 | ||
| 84 | @Override | 79 | @Override |
| 85 | - public void validateSkuList(List<ProductSkuCreateOrUpdateReqVO> skus, Boolean specType) { | 80 | + public void validateSkuList(List<ProductSkuSaveReqVO> skus, Boolean specType) { |
| 86 | // 0、校验skus是否为空 | 81 | // 0、校验skus是否为空 |
| 87 | if (CollUtil.isEmpty(skus)) { | 82 | if (CollUtil.isEmpty(skus)) { |
| 88 | throw exception(SKU_NOT_EXISTS); | 83 | throw exception(SKU_NOT_EXISTS); |
| 89 | } | 84 | } |
| 90 | // 单规格,赋予单规格默认属性 | 85 | // 单规格,赋予单规格默认属性 |
| 91 | if (ObjectUtil.equal(specType, false)) { | 86 | if (ObjectUtil.equal(specType, false)) { |
| 92 | - ProductSkuCreateOrUpdateReqVO skuVO = skus.get(0); | ||
| 93 | - List<ProductSkuBaseVO.Property> properties = new ArrayList<>(); | ||
| 94 | - ProductSkuBaseVO.Property property = new ProductSkuBaseVO.Property(); | ||
| 95 | - property.setPropertyId(ProductPropertyDO.ID_DEFAULT); | ||
| 96 | - property.setPropertyName(ProductPropertyDO.NAME_DEFAULT); | ||
| 97 | - property.setValueId(ProductPropertyValueDO.ID_DEFAULT); | ||
| 98 | - property.setValueName(ProductPropertyValueDO.NAME_DEFAULT); | 87 | + ProductSkuSaveReqVO skuVO = skus.get(0); |
| 88 | + List<ProductSkuSaveReqVO.Property> properties = new ArrayList<>(); | ||
| 89 | + ProductSkuSaveReqVO.Property property = new ProductSkuSaveReqVO.Property() | ||
| 90 | + .setPropertyId(ProductPropertyDO.ID_DEFAULT).setPropertyName(ProductPropertyDO.NAME_DEFAULT) | ||
| 91 | + .setValueId(ProductPropertyValueDO.ID_DEFAULT).setValueName(ProductPropertyValueDO.NAME_DEFAULT); | ||
| 99 | properties.add(property); | 92 | properties.add(property); |
| 100 | skuVO.setProperties(properties); | 93 | skuVO.setProperties(properties); |
| 101 | return; // 单规格不需要后续的校验 | 94 | return; // 单规格不需要后续的校验 |
| @@ -106,7 +99,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -106,7 +99,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 106 | // 遍历多个 Property 属性 | 99 | // 遍历多个 Property 属性 |
| 107 | .flatMap(p -> p.getProperties().stream()) | 100 | .flatMap(p -> p.getProperties().stream()) |
| 108 | // 将每个 Property 转换成对应的 propertyId,最后形成集合 | 101 | // 将每个 Property 转换成对应的 propertyId,最后形成集合 |
| 109 | - .map(ProductSkuCreateOrUpdateReqVO.Property::getPropertyId) | 102 | + .map(ProductSkuSaveReqVO.Property::getPropertyId) |
| 110 | .collect(Collectors.toSet()); | 103 | .collect(Collectors.toSet()); |
| 111 | List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds); | 104 | List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds); |
| 112 | if (propertyList.size() != propertyIds.size()) { | 105 | if (propertyList.size() != propertyIds.size()) { |
| @@ -133,17 +126,18 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -133,17 +126,18 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 133 | // 4. 最后校验,每个 Sku 之间不是重复的 | 126 | // 4. 最后校验,每个 Sku 之间不是重复的 |
| 134 | // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的. | 127 | // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的. |
| 135 | Set<Set<Long>> skuAttrValues = new HashSet<>(); | 128 | Set<Set<Long>> skuAttrValues = new HashSet<>(); |
| 136 | - for (ProductSkuCreateOrUpdateReqVO sku : skus) { | 129 | + for (ProductSkuSaveReqVO sku : skus) { |
| 137 | // 添加失败,说明重复 | 130 | // 添加失败,说明重复 |
| 138 | - if (!skuAttrValues.add(convertSet(sku.getProperties(), ProductSkuCreateOrUpdateReqVO.Property::getValueId))) { | 131 | + if (!skuAttrValues.add(convertSet(sku.getProperties(), ProductSkuSaveReqVO.Property::getValueId))) { |
| 139 | throw exception(SPU_SKU_NOT_DUPLICATE); | 132 | throw exception(SPU_SKU_NOT_DUPLICATE); |
| 140 | } | 133 | } |
| 141 | } | 134 | } |
| 142 | } | 135 | } |
| 143 | 136 | ||
| 144 | @Override | 137 | @Override |
| 145 | - public void createSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> skuCreateReqList) { | ||
| 146 | - productSkuMapper.insertBatch(ProductSkuConvert.INSTANCE.convertList06(skuCreateReqList, spuId)); | 138 | + public void createSkuList(Long spuId, List<ProductSkuSaveReqVO> skuCreateReqList) { |
| 139 | + List<ProductSkuDO> skus = BeanUtils.toBean(skuCreateReqList, ProductSkuDO.class, sku -> sku.setSpuId(spuId)); | ||
| 140 | + productSkuMapper.insertBatch(skus); | ||
| 147 | } | 141 | } |
| 148 | 142 | ||
| 149 | @Override | 143 | @Override |
| @@ -165,11 +159,6 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -165,11 +159,6 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 165 | } | 159 | } |
| 166 | 160 | ||
| 167 | @Override | 161 | @Override |
| 168 | - public List<ProductSkuDO> getSkuListByAlarmStock() { | ||
| 169 | - return productSkuMapper.selectListByAlarmStock(); | ||
| 170 | - } | ||
| 171 | - | ||
| 172 | - @Override | ||
| 173 | public int updateSkuProperty(Long propertyId, String propertyName) { | 162 | public int updateSkuProperty(Long propertyId, String propertyName) { |
| 174 | // 获取所有的 sku | 163 | // 获取所有的 sku |
| 175 | List<ProductSkuDO> skuDOList = productSkuMapper.selectList(); | 164 | List<ProductSkuDO> skuDOList = productSkuMapper.selectList(); |
| @@ -220,7 +209,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -220,7 +209,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 220 | 209 | ||
| 221 | @Override | 210 | @Override |
| 222 | @Transactional(rollbackFor = Exception.class) | 211 | @Transactional(rollbackFor = Exception.class) |
| 223 | - public void updateSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> skus) { | 212 | + public void updateSkuList(Long spuId, List<ProductSkuSaveReqVO> skus) { |
| 224 | // 构建属性与 SKU 的映射关系; | 213 | // 构建属性与 SKU 的映射关系; |
| 225 | Map<String, Long> existsSkuMap = convertMap(productSkuMapper.selectListBySpuId(spuId), | 214 | Map<String, Long> existsSkuMap = convertMap(productSkuMapper.selectListBySpuId(spuId), |
| 226 | ProductSkuConvert.INSTANCE::buildPropertyKey, ProductSkuDO::getId); | 215 | ProductSkuConvert.INSTANCE::buildPropertyKey, ProductSkuDO::getId); |
| @@ -228,7 +217,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -228,7 +217,7 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 228 | // 拆分三个集合,新插入的、需要更新的、需要删除的 | 217 | // 拆分三个集合,新插入的、需要更新的、需要删除的 |
| 229 | List<ProductSkuDO> insertSkus = new ArrayList<>(); | 218 | List<ProductSkuDO> insertSkus = new ArrayList<>(); |
| 230 | List<ProductSkuDO> updateSkus = new ArrayList<>(); | 219 | List<ProductSkuDO> updateSkus = new ArrayList<>(); |
| 231 | - List<ProductSkuDO> allUpdateSkus = ProductSkuConvert.INSTANCE.convertList06(skus, spuId); | 220 | + List<ProductSkuDO> allUpdateSkus = BeanUtils.toBean(skus, ProductSkuDO.class, sku -> sku.setSpuId(spuId)); |
| 232 | allUpdateSkus.forEach(sku -> { | 221 | allUpdateSkus.forEach(sku -> { |
| 233 | String propertiesKey = ProductSkuConvert.INSTANCE.buildPropertyKey(sku); | 222 | String propertiesKey = ProductSkuConvert.INSTANCE.buildPropertyKey(sku); |
| 234 | // 1、找得到的,进行更新 | 223 | // 1、找得到的,进行更新 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java
| 1 | package cn.iocoder.yudao.module.product.service.spu; | 1 | package cn.iocoder.yudao.module.product.service.spu; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 4 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; |
| 5 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; | ||
| 5 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 7 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 6 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 8 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 7 | - | ||
| 8 | import jakarta.validation.Valid; | 9 | import jakarta.validation.Valid; |
| 9 | import org.springframework.scheduling.annotation.Async; | 10 | import org.springframework.scheduling.annotation.Async; |
| 10 | 11 | ||
| @@ -12,8 +13,6 @@ import java.util.Collection; | @@ -12,8 +13,6 @@ import java.util.Collection; | ||
| 12 | import java.util.List; | 13 | import java.util.List; |
| 13 | import java.util.Map; | 14 | import java.util.Map; |
| 14 | 15 | ||
| 15 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||
| 16 | - | ||
| 17 | /** | 16 | /** |
| 18 | * 商品 SPU Service 接口 | 17 | * 商品 SPU Service 接口 |
| 19 | * | 18 | * |
| @@ -27,14 +26,14 @@ public interface ProductSpuService { | @@ -27,14 +26,14 @@ public interface ProductSpuService { | ||
| 27 | * @param createReqVO 创建信息 | 26 | * @param createReqVO 创建信息 |
| 28 | * @return 编号 | 27 | * @return 编号 |
| 29 | */ | 28 | */ |
| 30 | - Long createSpu(@Valid ProductSpuCreateReqVO createReqVO); | 29 | + Long createSpu(@Valid ProductSpuSaveReqVO createReqVO); |
| 31 | 30 | ||
| 32 | /** | 31 | /** |
| 33 | * 更新商品 SPU | 32 | * 更新商品 SPU |
| 34 | * | 33 | * |
| 35 | * @param updateReqVO 更新信息 | 34 | * @param updateReqVO 更新信息 |
| 36 | */ | 35 | */ |
| 37 | - void updateSpu(@Valid ProductSpuUpdateReqVO updateReqVO); | 36 | + void updateSpu(@Valid ProductSpuSaveReqVO updateReqVO); |
| 38 | 37 | ||
| 39 | /** | 38 | /** |
| 40 | * 删除商品 SPU | 39 | * 删除商品 SPU |
| @@ -60,16 +59,6 @@ public interface ProductSpuService { | @@ -60,16 +59,6 @@ public interface ProductSpuService { | ||
| 60 | List<ProductSpuDO> getSpuList(Collection<Long> ids); | 59 | List<ProductSpuDO> getSpuList(Collection<Long> ids); |
| 61 | 60 | ||
| 62 | /** | 61 | /** |
| 63 | - * 获得商品 SPU 映射 | ||
| 64 | - * | ||
| 65 | - * @param ids 编号数组 | ||
| 66 | - * @return 商品 SPU 映射 | ||
| 67 | - */ | ||
| 68 | - default Map<Long, ProductSpuDO> getSpuMap(Collection<Long> ids) { | ||
| 69 | - return convertMap(getSpuList(ids), ProductSpuDO::getId); | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - /** | ||
| 73 | * 获得指定状态的商品 SPU 列表 | 62 | * 获得指定状态的商品 SPU 列表 |
| 74 | * | 63 | * |
| 75 | * @param status 状态 | 64 | * @param status 状态 |
| @@ -78,14 +67,6 @@ public interface ProductSpuService { | @@ -78,14 +67,6 @@ public interface ProductSpuService { | ||
| 78 | List<ProductSpuDO> getSpuListByStatus(Integer status); | 67 | List<ProductSpuDO> getSpuListByStatus(Integer status); |
| 79 | 68 | ||
| 80 | /** | 69 | /** |
| 81 | - * 获得所有商品 SPU 列表 | ||
| 82 | - * | ||
| 83 | - * @param reqVO 导出条件 | ||
| 84 | - * @return 商品 SPU 列表 | ||
| 85 | - */ | ||
| 86 | - List<ProductSpuDO> getSpuList(ProductSpuExportReqVO reqVO); | ||
| 87 | - | ||
| 88 | - /** | ||
| 89 | * 获得商品 SPU 分页,提供给挂你兰后台使用 | 70 | * 获得商品 SPU 分页,提供给挂你兰后台使用 |
| 90 | * | 71 | * |
| 91 | * @param pageReqVO 分页查询 | 72 | * @param pageReqVO 分页查询 |
| @@ -102,15 +83,6 @@ public interface ProductSpuService { | @@ -102,15 +83,6 @@ public interface ProductSpuService { | ||
| 102 | PageResult<ProductSpuDO> getSpuPage(AppProductSpuPageReqVO pageReqVO); | 83 | PageResult<ProductSpuDO> getSpuPage(AppProductSpuPageReqVO pageReqVO); |
| 103 | 84 | ||
| 104 | /** | 85 | /** |
| 105 | - * 获得商品 SPU 列表,提供给用户 App 使用 | ||
| 106 | - * | ||
| 107 | - * @param recommendType 推荐类型 | ||
| 108 | - * @param count 数量 | ||
| 109 | - * @return 商品 SPU 列表 | ||
| 110 | - */ | ||
| 111 | - List<ProductSpuDO> getSpuList(String recommendType, Integer count); | ||
| 112 | - | ||
| 113 | - /** | ||
| 114 | * 更新商品 SPU 库存(增量) | 86 | * 更新商品 SPU 库存(增量) |
| 115 | * | 87 | * |
| 116 | * @param stockIncrCounts SPU 编号与库存变化(增量)的映射 | 88 | * @param stockIncrCounts SPU 编号与库存变化(增量)的映射 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
| @@ -5,11 +5,13 @@ import cn.hutool.core.util.ObjectUtil; | @@ -5,11 +5,13 @@ import cn.hutool.core.util.ObjectUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 7 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 8 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 8 | import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; | 9 | import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; |
| 9 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 10 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; | 10 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 11 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | ||
| 12 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; | ||
| 13 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; | ||
| 11 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 14 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 12 | -import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | ||
| 13 | import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; | 15 | import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; |
| 14 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 16 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 15 | import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; | 17 | import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; |
| @@ -53,15 +55,15 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -53,15 +55,15 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 53 | 55 | ||
| 54 | @Override | 56 | @Override |
| 55 | @Transactional(rollbackFor = Exception.class) | 57 | @Transactional(rollbackFor = Exception.class) |
| 56 | - public Long createSpu(ProductSpuCreateReqVO createReqVO) { | 58 | + public Long createSpu(ProductSpuSaveReqVO createReqVO) { |
| 57 | // 校验分类、品牌 | 59 | // 校验分类、品牌 |
| 58 | validateCategory(createReqVO.getCategoryId()); | 60 | validateCategory(createReqVO.getCategoryId()); |
| 59 | brandService.validateProductBrand(createReqVO.getBrandId()); | 61 | brandService.validateProductBrand(createReqVO.getBrandId()); |
| 60 | // 校验 SKU | 62 | // 校验 SKU |
| 61 | - List<ProductSkuCreateOrUpdateReqVO> skuSaveReqList = createReqVO.getSkus(); | 63 | + List<ProductSkuSaveReqVO> skuSaveReqList = createReqVO.getSkus(); |
| 62 | productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); | 64 | productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); |
| 63 | 65 | ||
| 64 | - ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO); | 66 | + ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class); |
| 65 | // 初始化 SPU 中 SKU 相关属性 | 67 | // 初始化 SPU 中 SKU 相关属性 |
| 66 | initSpuFromSkus(spu, skuSaveReqList); | 68 | initSpuFromSkus(spu, skuSaveReqList); |
| 67 | // 插入 SPU | 69 | // 插入 SPU |
| @@ -74,18 +76,18 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -74,18 +76,18 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 74 | 76 | ||
| 75 | @Override | 77 | @Override |
| 76 | @Transactional(rollbackFor = Exception.class) | 78 | @Transactional(rollbackFor = Exception.class) |
| 77 | - public void updateSpu(ProductSpuUpdateReqVO updateReqVO) { | 79 | + public void updateSpu(ProductSpuSaveReqVO updateReqVO) { |
| 78 | // 校验 SPU 是否存在 | 80 | // 校验 SPU 是否存在 |
| 79 | validateSpuExists(updateReqVO.getId()); | 81 | validateSpuExists(updateReqVO.getId()); |
| 80 | // 校验分类、品牌 | 82 | // 校验分类、品牌 |
| 81 | validateCategory(updateReqVO.getCategoryId()); | 83 | validateCategory(updateReqVO.getCategoryId()); |
| 82 | brandService.validateProductBrand(updateReqVO.getBrandId()); | 84 | brandService.validateProductBrand(updateReqVO.getBrandId()); |
| 83 | // 校验SKU | 85 | // 校验SKU |
| 84 | - List<ProductSkuCreateOrUpdateReqVO> skuSaveReqList = updateReqVO.getSkus(); | 86 | + List<ProductSkuSaveReqVO> skuSaveReqList = updateReqVO.getSkus(); |
| 85 | productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType()); | 87 | productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType()); |
| 86 | 88 | ||
| 87 | // 更新 SPU | 89 | // 更新 SPU |
| 88 | - ProductSpuDO updateObj = ProductSpuConvert.INSTANCE.convert(updateReqVO); | 90 | + ProductSpuDO updateObj = BeanUtils.toBean(updateReqVO, ProductSpuDO.class); |
| 89 | initSpuFromSkus(updateObj, skuSaveReqList); | 91 | initSpuFromSkus(updateObj, skuSaveReqList); |
| 90 | productSpuMapper.updateById(updateObj); | 92 | productSpuMapper.updateById(updateObj); |
| 91 | // 批量更新 SKU | 93 | // 批量更新 SKU |
| @@ -99,26 +101,20 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -99,26 +101,20 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 99 | * @param spu 商品 SPU | 101 | * @param spu 商品 SPU |
| 100 | * @param skus 商品 SKU 数组 | 102 | * @param skus 商品 SKU 数组 |
| 101 | */ | 103 | */ |
| 102 | - private void initSpuFromSkus(ProductSpuDO spu, List<ProductSkuCreateOrUpdateReqVO> skus) { | 104 | + private void initSpuFromSkus(ProductSpuDO spu, List<ProductSkuSaveReqVO> skus) { |
| 103 | // sku 单价最低的商品的价格 | 105 | // sku 单价最低的商品的价格 |
| 104 | - spu.setPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getPrice)); | 106 | + spu.setPrice(getMinValue(skus, ProductSkuSaveReqVO::getPrice)); |
| 105 | // sku 单价最低的商品的市场价格 | 107 | // sku 单价最低的商品的市场价格 |
| 106 | - spu.setMarketPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getMarketPrice)); | 108 | + spu.setMarketPrice(getMinValue(skus, ProductSkuSaveReqVO::getMarketPrice)); |
| 107 | // sku 单价最低的商品的成本价格 | 109 | // sku 单价最低的商品的成本价格 |
| 108 | - spu.setCostPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getCostPrice)); | ||
| 109 | - // sku 单价最低的商品的条形码 TODO 芋艿:条形码字段,是不是可以删除 | ||
| 110 | - spu.setBarCode(""); | ||
| 111 | -// spu.setBarCode(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getBarCode)); | 110 | + spu.setCostPrice(getMinValue(skus, ProductSkuSaveReqVO::getCostPrice)); |
| 112 | // skus 库存总数 | 111 | // skus 库存总数 |
| 113 | - spu.setStock(getSumValue(skus, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum)); | 112 | + spu.setStock(getSumValue(skus, ProductSkuSaveReqVO::getStock, Integer::sum)); |
| 114 | // 若是 spu 已有状态则不处理 | 113 | // 若是 spu 已有状态则不处理 |
| 115 | if (spu.getStatus() == null) { | 114 | if (spu.getStatus() == null) { |
| 116 | - // 默认状态为上架 | ||
| 117 | - spu.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()); | ||
| 118 | - // 默认商品销量 | ||
| 119 | - spu.setSalesCount(0); | ||
| 120 | - // 默认商品浏览量 | ||
| 121 | - spu.setBrowseCount(0); | 115 | + spu.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()); // 默认状态为上架 |
| 116 | + spu.setSalesCount(0); // 默认商品销量 | ||
| 117 | + spu.setBrowseCount(0); // 默认商品浏览量 | ||
| 122 | } | 118 | } |
| 123 | } | 119 | } |
| 124 | 120 | ||
| @@ -204,11 +200,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -204,11 +200,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 204 | } | 200 | } |
| 205 | 201 | ||
| 206 | @Override | 202 | @Override |
| 207 | - public List<ProductSpuDO> getSpuList(ProductSpuExportReqVO reqVO) { | ||
| 208 | - return productSpuMapper.selectList(reqVO); | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - @Override | ||
| 212 | public PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO) { | 203 | public PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO) { |
| 213 | return productSpuMapper.selectPage(pageReqVO); | 204 | return productSpuMapper.selectPage(pageReqVO); |
| 214 | } | 205 | } |
| @@ -234,11 +225,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { | @@ -234,11 +225,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { | ||
| 234 | } | 225 | } |
| 235 | 226 | ||
| 236 | @Override | 227 | @Override |
| 237 | - public List<ProductSpuDO> getSpuList(String recommendType, Integer count) { | ||
| 238 | - return productSpuMapper.selectListByRecommendType(recommendType, count); | ||
| 239 | - } | ||
| 240 | - | ||
| 241 | - @Override | ||
| 242 | @Transactional(rollbackFor = Exception.class) | 228 | @Transactional(rollbackFor = Exception.class) |
| 243 | public void updateSpuStock(Map<Long, Integer> stockIncrCounts) { | 229 | public void updateSpuStock(Map<Long, Integer> stockIncrCounts) { |
| 244 | stockIncrCounts.forEach((id, incCount) -> productSpuMapper.updateStock(id, incCount)); | 230 | stockIncrCounts.forEach((id, incCount) -> productSpuMapper.updateStock(id, incCount)); |
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java
| @@ -4,7 +4,7 @@ import cn.hutool.core.util.RandomUtil; | @@ -4,7 +4,7 @@ import cn.hutool.core.util.RandomUtil; | ||
| 4 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | 4 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 5 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; | 5 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; |
| 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 7 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | 7 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 8 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | 8 | import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; |
| 9 | import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper; | 9 | import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper; |
| 10 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; | 10 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; |
| @@ -74,13 +74,13 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { | @@ -74,13 +74,13 @@ public class ProductSkuServiceTest extends BaseDbUnitTest { | ||
| 74 | // 准备参数 | 74 | // 准备参数 |
| 75 | Long spuId = 1L; | 75 | Long spuId = 1L; |
| 76 | String spuName = "测试商品"; | 76 | String spuName = "测试商品"; |
| 77 | - List<ProductSkuCreateOrUpdateReqVO> skus = Arrays.asList( | ||
| 78 | - randomPojo(ProductSkuCreateOrUpdateReqVO.class, o -> { // 测试更新 | ||
| 79 | - o.setProperties(singletonList(new ProductSkuCreateOrUpdateReqVO.Property( | 77 | + List<ProductSkuSaveReqVO> skus = Arrays.asList( |
| 78 | + randomPojo(ProductSkuSaveReqVO.class, o -> { // 测试更新 | ||
| 79 | + o.setProperties(singletonList(new ProductSkuSaveReqVO.Property( | ||
| 80 | 10L, "颜色", 20L, "红色"))); | 80 | 10L, "颜色", 20L, "红色"))); |
| 81 | }), | 81 | }), |
| 82 | - randomPojo(ProductSkuCreateOrUpdateReqVO.class, o -> { // 测试新增 | ||
| 83 | - o.setProperties(singletonList(new ProductSkuCreateOrUpdateReqVO.Property( | 82 | + randomPojo(ProductSkuSaveReqVO.class, o -> { // 测试新增 |
| 83 | + o.setProperties(singletonList(new ProductSkuSaveReqVO.Property( | ||
| 84 | 10L, "颜色", 20L, "红色"))); | 84 | 10L, "颜色", 20L, "红色"))); |
| 85 | }) | 85 | }) |
| 86 | ); | 86 | ); |
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
| @@ -6,12 +6,9 @@ import cn.hutool.core.util.RandomUtil; | @@ -6,12 +6,9 @@ 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.test.core.ut.BaseDbUnitTest; | 8 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 9 | -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; | ||
| 10 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuCreateReqVO; | 9 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; |
| 11 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; | 10 | import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; |
| 12 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuRespVO; | ||
| 13 | -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateReqVO; | ||
| 14 | -import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; | 11 | +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; |
| 15 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; | 12 | import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; |
| 16 | import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; | 13 | import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; |
| 17 | import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; | 14 | import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; |
| @@ -21,13 +18,13 @@ import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; | @@ -21,13 +18,13 @@ import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; | ||
| 21 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; | 18 | import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; |
| 22 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuServiceImpl; | 19 | import cn.iocoder.yudao.module.product.service.sku.ProductSkuServiceImpl; |
| 23 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
| 21 | +import jakarta.annotation.Resource; | ||
| 24 | import org.junit.jupiter.api.Assertions; | 22 | import org.junit.jupiter.api.Assertions; |
| 25 | import org.junit.jupiter.api.Disabled; | 23 | import org.junit.jupiter.api.Disabled; |
| 26 | import org.junit.jupiter.api.Test; | 24 | import org.junit.jupiter.api.Test; |
| 27 | import org.springframework.boot.test.mock.mockito.MockBean; | 25 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 28 | import org.springframework.context.annotation.Import; | 26 | import org.springframework.context.annotation.Import; |
| 29 | 27 | ||
| 30 | -import jakarta.annotation.Resource; | ||
| 31 | import java.math.RoundingMode; | 28 | import java.math.RoundingMode; |
| 32 | import java.util.ArrayList; | 29 | import java.util.ArrayList; |
| 33 | import java.util.Date; | 30 | import java.util.Date; |
| @@ -87,20 +84,19 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -87,20 +84,19 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 87 | @Test | 84 | @Test |
| 88 | public void testCreateSpu_success() { | 85 | public void testCreateSpu_success() { |
| 89 | // 准备参数 | 86 | // 准备参数 |
| 90 | - ProductSkuCreateOrUpdateReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuCreateOrUpdateReqVO.class,o->{ | 87 | + ProductSkuSaveReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuSaveReqVO.class, o->{ |
| 91 | // 限制范围为正整数 | 88 | // 限制范围为正整数 |
| 92 | o.setCostPrice(generaInt()); | 89 | o.setCostPrice(generaInt()); |
| 93 | o.setPrice(generaInt()); | 90 | o.setPrice(generaInt()); |
| 94 | o.setMarketPrice(generaInt()); | 91 | o.setMarketPrice(generaInt()); |
| 95 | o.setStock(generaInt()); | 92 | o.setStock(generaInt()); |
| 96 | - o.setWarnStock(10); | ||
| 97 | o.setFirstBrokeragePrice(generaInt()); | 93 | o.setFirstBrokeragePrice(generaInt()); |
| 98 | o.setSecondBrokeragePrice(generaInt()); | 94 | o.setSecondBrokeragePrice(generaInt()); |
| 99 | // 限制分数为两位数 | 95 | // 限制分数为两位数 |
| 100 | o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); | 96 | o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); |
| 101 | o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); | 97 | o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); |
| 102 | }); | 98 | }); |
| 103 | - ProductSpuCreateReqVO createReqVO = randomPojo(ProductSpuCreateReqVO.class,o->{ | 99 | + ProductSpuSaveReqVO createReqVO = randomPojo(ProductSpuSaveReqVO.class,o->{ |
| 104 | o.setCategoryId(generateId()); | 100 | o.setCategoryId(generateId()); |
| 105 | o.setBrandId(generateId()); | 101 | o.setBrandId(generateId()); |
| 106 | o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 | 102 | o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 |
| @@ -134,13 +130,12 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -134,13 +130,12 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 134 | }); | 130 | }); |
| 135 | productSpuMapper.insert(createReqVO); | 131 | productSpuMapper.insert(createReqVO); |
| 136 | // 准备参数 | 132 | // 准备参数 |
| 137 | - ProductSkuCreateOrUpdateReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuCreateOrUpdateReqVO.class,o->{ | 133 | + ProductSkuSaveReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuSaveReqVO.class, o->{ |
| 138 | // 限制范围为正整数 | 134 | // 限制范围为正整数 |
| 139 | o.setCostPrice(generaInt()); | 135 | o.setCostPrice(generaInt()); |
| 140 | o.setPrice(generaInt()); | 136 | o.setPrice(generaInt()); |
| 141 | o.setMarketPrice(generaInt()); | 137 | o.setMarketPrice(generaInt()); |
| 142 | o.setStock(generaInt()); | 138 | o.setStock(generaInt()); |
| 143 | - o.setWarnStock(10); | ||
| 144 | o.setFirstBrokeragePrice(generaInt()); | 139 | o.setFirstBrokeragePrice(generaInt()); |
| 145 | o.setSecondBrokeragePrice(generaInt()); | 140 | o.setSecondBrokeragePrice(generaInt()); |
| 146 | // 限制分数为两位数 | 141 | // 限制分数为两位数 |
| @@ -148,7 +143,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -148,7 +143,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 148 | o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); | 143 | o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); |
| 149 | }); | 144 | }); |
| 150 | // 准备参数 | 145 | // 准备参数 |
| 151 | - ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class, o -> { | 146 | + ProductSpuSaveReqVO reqVO = randomPojo(ProductSpuSaveReqVO.class, o -> { |
| 152 | o.setId(createReqVO.getId()); // 设置更新的 ID | 147 | o.setId(createReqVO.getId()); // 设置更新的 ID |
| 153 | o.setCategoryId(generateId()); | 148 | o.setCategoryId(generateId()); |
| 154 | o.setBrandId(generateId()); | 149 | o.setBrandId(generateId()); |
| @@ -158,7 +153,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -158,7 +153,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 158 | o.setGiveIntegral(generaInt()); // 限制范围为正整数 | 153 | o.setGiveIntegral(generaInt()); // 限制范围为正整数 |
| 159 | o.setSalesCount(generaInt()); // 限制范围为正整数 | 154 | o.setSalesCount(generaInt()); // 限制范围为正整数 |
| 160 | o.setBrowseCount(generaInt()); // 限制范围为正整数 | 155 | o.setBrowseCount(generaInt()); // 限制范围为正整数 |
| 161 | - o.setStatus(0); | ||
| 162 | o.setSkus(newArrayList(skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO)); | 156 | o.setSkus(newArrayList(skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO)); |
| 163 | }); | 157 | }); |
| 164 | when(categoryService.getCategoryLevel(eq(reqVO.getCategoryId()))).thenReturn(2); | 158 | when(categoryService.getCategoryLevel(eq(reqVO.getCategoryId()))).thenReturn(2); |
| @@ -171,7 +165,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -171,7 +165,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 171 | 165 | ||
| 172 | @Test | 166 | @Test |
| 173 | public void testValidateSpuExists_exception() { | 167 | public void testValidateSpuExists_exception() { |
| 174 | - ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class); | 168 | + ProductSpuSaveReqVO reqVO = randomPojo(ProductSpuSaveReqVO.class); |
| 175 | // 调用 | 169 | // 调用 |
| 176 | Assertions.assertThrows(ServiceException.class, () -> productSpuService.updateSpu(reqVO)); | 170 | Assertions.assertThrows(ServiceException.class, () -> productSpuService.updateSpu(reqVO)); |
| 177 | } | 171 | } |
| @@ -394,8 +388,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | @@ -394,8 +388,7 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { | ||
| 394 | 388 | ||
| 395 | PageResult<ProductSpuDO> spuPage = productSpuService.getSpuPage(productSpuPageReqVO); | 389 | PageResult<ProductSpuDO> spuPage = productSpuService.getSpuPage(productSpuPageReqVO); |
| 396 | 390 | ||
| 397 | - PageResult<ProductSpuRespVO> result = ProductSpuConvert.INSTANCE.convertPage(productSpuMapper.selectPage(productSpuPageReqVO)); | ||
| 398 | - assertEquals(result.getTotal(), spuPage.getTotal()); | 391 | + assertEquals(1, spuPage.getTotal()); |
| 399 | } | 392 | } |
| 400 | 393 | ||
| 401 | /** | 394 | /** |