Commit f2d803c111341d9ee2d82ddbb40b3e447d5cd0fd

Authored by YunaiV
1 parent 4126e37d

mall + product:review 评论接口

Showing 14 changed files with 92 additions and 119 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java
@@ -6,7 +6,9 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -6,7 +6,9 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; 7 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
  9 +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
9 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 10 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
  11 +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
10 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; 12 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
11 import io.swagger.v3.oas.annotations.Operation; 13 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 14 import io.swagger.v3.oas.annotations.Parameter;
@@ -22,8 +24,10 @@ import java.io.IOException; @@ -22,8 +24,10 @@ import java.io.IOException;
22 import java.util.List; 24 import java.util.List;
23 import java.util.Map; 25 import java.util.Map;
24 26
  27 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
25 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; 29 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  30 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
27 31
28 /** 32 /**
29 * 商品 SPU 相关接口 33 * 商品 SPU 相关接口
@@ -38,6 +42,8 @@ public class ProductSpuController { @@ -38,6 +42,8 @@ public class ProductSpuController {
38 42
39 @Resource 43 @Resource
40 private ProductSpuService productSpuService; 44 private ProductSpuService productSpuService;
  45 + @Resource
  46 + private ProductSkuService productSkuService;
41 47
42 @PostMapping("/create") 48 @PostMapping("/create")
43 @Operation(summary = "创建商品 SPU") 49 @Operation(summary = "创建商品 SPU")
@@ -58,7 +64,7 @@ public class ProductSpuController { @@ -58,7 +64,7 @@ public class ProductSpuController {
58 @Operation(summary = "更新商品 SPU Status") 64 @Operation(summary = "更新商品 SPU Status")
59 @PreAuthorize("@ss.hasPermission('product:spu:update')") 65 @PreAuthorize("@ss.hasPermission('product:spu:update')")
60 public CommonResult<Boolean> updateStatus(@Valid @RequestBody ProductSpuUpdateStatusReqVO updateReqVO) { 66 public CommonResult<Boolean> updateStatus(@Valid @RequestBody ProductSpuUpdateStatusReqVO updateReqVO) {
61 - productSpuService.updateStatus(updateReqVO); 67 + productSpuService.updateSpuStatus(updateReqVO);
62 return success(true); 68 return success(true);
63 } 69 }
64 70
@@ -76,7 +82,14 @@ public class ProductSpuController { @@ -76,7 +82,14 @@ public class ProductSpuController {
76 @Parameter(name = "id", description = "编号", required = true, example = "1024") 82 @Parameter(name = "id", description = "编号", required = true, example = "1024")
77 @PreAuthorize("@ss.hasPermission('product:spu:query')") 83 @PreAuthorize("@ss.hasPermission('product:spu:query')")
78 public CommonResult<ProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) { 84 public CommonResult<ProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) {
79 - return success(productSpuService.getSpuDetail(id)); 85 + // 获得商品 SPU
  86 + ProductSpuDO spu = productSpuService.getSpu(id);
  87 + if (spu == null) {
  88 + throw exception(SPU_NOT_EXISTS);
  89 + }
  90 + // 查询商品 SKU
  91 + List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());
  92 + return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespVO(spu, skus));
80 } 93 }
81 94
82 @GetMapping("/get-simple-list") 95 @GetMapping("/get-simple-list")
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
@@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetail @@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetail
6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageItemRespVO; 6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageItemRespVO;
7 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 7 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
  9 +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
9 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 10 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
  11 +import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
  12 +import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
  13 +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
10 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; 14 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
11 import io.swagger.v3.oas.annotations.Operation; 15 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 16 import io.swagger.v3.oas.annotations.Parameter;
@@ -19,8 +23,12 @@ import org.springframework.web.bind.annotation.RestController; @@ -19,8 +23,12 @@ import org.springframework.web.bind.annotation.RestController;
19 23
20 import javax.annotation.Resource; 24 import javax.annotation.Resource;
21 import javax.validation.Valid; 25 import javax.validation.Valid;
  26 +import java.util.List;
22 27
  28 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 29 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  30 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_ENABLE;
  31 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
24 32
25 @Tag(name = "用户 APP - 商品 SPU") 33 @Tag(name = "用户 APP - 商品 SPU")
26 @RestController 34 @RestController
@@ -30,6 +38,10 @@ public class AppProductSpuController { @@ -30,6 +38,10 @@ public class AppProductSpuController {
30 38
31 @Resource 39 @Resource
32 private ProductSpuService productSpuService; 40 private ProductSpuService productSpuService;
  41 + @Resource
  42 + private ProductSkuService productSkuService;
  43 + @Resource
  44 + private ProductPropertyValueService productPropertyValueService;
33 45
34 @GetMapping("/page") 46 @GetMapping("/page")
35 @Operation(summary = "获得商品 SPU 分页") 47 @Operation(summary = "获得商品 SPU 分页")
@@ -38,12 +50,23 @@ public class AppProductSpuController { @@ -38,12 +50,23 @@ public class AppProductSpuController {
38 return success(ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult)); 50 return success(ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult));
39 } 51 }
40 52
41 - // TODO 芋艿:等会看看  
42 @GetMapping("/get-detail") 53 @GetMapping("/get-detail")
43 @Operation(summary = "获得商品 SPU 明细") 54 @Operation(summary = "获得商品 SPU 明细")
44 @Parameter(name = "id", description = "编号", required = true) 55 @Parameter(name = "id", description = "编号", required = true)
45 public CommonResult<AppProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) { 56 public CommonResult<AppProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) {
46 - return success(productSpuService.getAppProductSpuDetail(id)); 57 + // 获得商品 SPU
  58 + ProductSpuDO spu = productSpuService.getSpu(id);
  59 + if (spu == null) {
  60 + throw exception(SPU_NOT_EXISTS);
  61 + }
  62 + if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {
  63 + throw exception(SPU_NOT_ENABLE);
  64 + }
  65 +
  66 + // 查询商品 SKU
  67 + List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());
  68 + // 拼接
  69 + return success(ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus));
47 } 70 }
48 71
49 } 72 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyDO.java
@@ -22,13 +22,13 @@ import lombok.*; @@ -22,13 +22,13 @@ import lombok.*;
22 public class ProductPropertyDO extends BaseDO { 22 public class ProductPropertyDO extends BaseDO {
23 23
24 /** 24 /**
25 - * 默认属性id 25 + * SPU 单规格时,默认属性 id
26 */ 26 */
27 - public static final Long PROPERTY_ID = 0L; 27 + public static final Long ID_DEFAULT = 0L;
28 /** 28 /**
29 - * 默认属性名字 29 + * SPU 单规格时,默认属性名字
30 */ 30 */
31 - public static final String PROPERTY_NAME = "默认"; 31 + public static final String NAME_DEFAULT = "默认";
32 32
33 /** 33 /**
34 * 主键 34 * 主键
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyValueDO.java
@@ -23,13 +23,13 @@ import lombok.*; @@ -23,13 +23,13 @@ import lombok.*;
23 public class ProductPropertyValueDO extends BaseDO { 23 public class ProductPropertyValueDO extends BaseDO {
24 24
25 /** 25 /**
26 - * 默认属性值id 26 + * SPU 单规格时,默认属性值 id
27 */ 27 */
28 - public static final Long VALUE_ID = 0L; 28 + public static final Long ID_DEFAULT = 0L;
29 /** 29 /**
30 - * 默认属性值名字 30 + * SPU 单规格时,默认属性值名字
31 */ 31 */
32 - public static final String VALUE_NAME = "默认"; 32 + public static final String NAME_DEFAULT = "默认";
33 33
34 /** 34 /**
35 * 主键 35 * 主键
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java
@@ -35,6 +35,7 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; { @@ -35,6 +35,7 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
35 .orderByDesc(ProductCommentDO::getId)); 35 .orderByDesc(ProductCommentDO::getId));
36 } 36 }
37 37
  38 + // TODO 芋艿:在看看这块
38 static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) { 39 static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) {
39 // 构建好评查询语句 40 // 构建好评查询语句
40 if (ObjectUtil.equal(type, AppCommentPageReqVO.FAVOURABLE_COMMENT)) { 41 if (ObjectUtil.equal(type, AppCommentPageReqVO.FAVOURABLE_COMMENT)) {
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java
@@ -68,8 +68,8 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -68,8 +68,8 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
68 throw exception(CATEGORY_EXISTS_CHILDREN); 68 throw exception(CATEGORY_EXISTS_CHILDREN);
69 } 69 }
70 // 校验分类是否绑定了 SPU 70 // 校验分类是否绑定了 SPU
71 - Long count = productSpuService.getSpuCountByCategoryId(id);  
72 - if (0 != count) { 71 + Long spuCount = productSpuService.getSpuCountByCategoryId(id);
  72 + if (spuCount > 0) {
73 throw exception(CATEGORY_HAVE_BIND_SPU); 73 throw exception(CATEGORY_HAVE_BIND_SPU);
74 } 74 }
75 // 删除 75 // 删除
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
@@ -31,6 +31,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -31,6 +31,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
31 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; 31 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
32 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND; 32 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
33 33
  34 +// TODO @芋艿:详细 review 下
34 /** 35 /**
35 * 商品评论 Service 实现类 36 * 商品评论 Service 实现类
36 * 37 *
@@ -73,13 +74,17 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -73,13 +74,17 @@ public class ProductCommentServiceImpl implements ProductCommentService {
73 public Map<String, Long> getCommentPageTabsCount(Long spuId, Boolean visible) { 74 public Map<String, Long> getCommentPageTabsCount(Long spuId, Boolean visible) {
74 Map<String, Long> countMap = new HashMap<>(4); 75 Map<String, Long> countMap = new HashMap<>(4);
75 // 查询商品 id = spuId 的所有评论数量 76 // 查询商品 id = spuId 的所有评论数量
76 - countMap.put(AppCommentPageReqVO.ALL_COUNT, productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.ALL)); 77 + countMap.put(AppCommentPageReqVO.ALL_COUNT,
  78 + productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.ALL));
77 // 查询商品 id = spuId 的所有好评数量 79 // 查询商品 id = spuId 的所有好评数量
78 - countMap.put(AppCommentPageReqVO.FAVOURABLE_COMMENT_COUNT, productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.FAVOURABLE_COMMENT)); 80 + countMap.put(AppCommentPageReqVO.FAVOURABLE_COMMENT_COUNT,
  81 + productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.FAVOURABLE_COMMENT));
79 // 查询商品 id = spuId 的所有中评数量 82 // 查询商品 id = spuId 的所有中评数量
80 - countMap.put(AppCommentPageReqVO.MEDIOCRE_COMMENT_COUNT, productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.MEDIOCRE_COMMENT)); 83 + countMap.put(AppCommentPageReqVO.MEDIOCRE_COMMENT_COUNT,
  84 + productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.MEDIOCRE_COMMENT));
81 // 查询商品 id = spuId 的所有差评数量 85 // 查询商品 id = spuId 的所有差评数量
82 - countMap.put(AppCommentPageReqVO.NEGATIVE_COMMENT_COUNT, productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.NEGATIVE_COMMENT)); 86 + countMap.put(AppCommentPageReqVO.NEGATIVE_COMMENT_COUNT,
  87 + productCommentMapper.selectTabCount(spuId, visible, AppCommentPageReqVO.NEGATIVE_COMMENT));
83 return countMap; 88 return countMap;
84 } 89 }
85 90
@@ -101,13 +106,14 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -101,13 +106,14 @@ public class ProductCommentServiceImpl implements ProductCommentService {
101 106
102 @Override 107 @Override
103 public void createComment(ProductCommentDO productComment, Boolean system) { 108 public void createComment(ProductCommentDO productComment, Boolean system) {
  109 + // TODO @puhui999:这里不区分是否为 system;直接都校验
104 if (!system) { 110 if (!system) {
105 - // TODO 判断订单是否存在 fix 111 + // TODO 判断订单是否存在 fix;
  112 + // TODO @puhui999:改成 order 那有个 comment 接口,哪里校验下;商品评论这里不校验订单是否存在哈
106 TradeOrderRespDTO order = tradeOrderApi.getOrder(productComment.getOrderId()); 113 TradeOrderRespDTO order = tradeOrderApi.getOrder(productComment.getOrderId());
107 if (null == order) { 114 if (null == order) {
108 throw exception(ORDER_NOT_FOUND); 115 throw exception(ORDER_NOT_FOUND);
109 } 116 }
110 - // TODO 判断 SPU 是否存在 fix  
111 ProductSpuDO spu = productSpuService.getSpu(productComment.getSpuId()); 117 ProductSpuDO spu = productSpuService.getSpu(productComment.getSpuId());
112 if (null == spu) { 118 if (null == spu) {
113 throw exception(SPU_NOT_EXISTS); 119 throw exception(SPU_NOT_EXISTS);
@@ -147,5 +153,4 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -147,5 +153,4 @@ public class ProductCommentServiceImpl implements ProductCommentService {
147 return productComment; 153 return productComment;
148 } 154 }
149 155
150 -  
151 } 156 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
@@ -83,21 +83,20 @@ public class ProductSkuServiceImpl implements ProductSkuService { @@ -83,21 +83,20 @@ public class ProductSkuServiceImpl implements ProductSkuService {
83 if (CollUtil.isEmpty(skus)) { 83 if (CollUtil.isEmpty(skus)) {
84 throw exception(SKU_NOT_EXISTS); 84 throw exception(SKU_NOT_EXISTS);
85 } 85 }
86 - // 单规格处理 86 + // 单规格,赋予单规格默认属性
87 if (ObjectUtil.equal(specType, false)) { 87 if (ObjectUtil.equal(specType, false)) {
88 ProductSkuCreateOrUpdateReqVO skuVO = skus.get(0); 88 ProductSkuCreateOrUpdateReqVO skuVO = skus.get(0);
89 - // 赋予单规格默认属性  
90 List<ProductSkuBaseVO.Property> properties = new ArrayList<>(); 89 List<ProductSkuBaseVO.Property> properties = new ArrayList<>();
91 ProductSkuBaseVO.Property property = new ProductSkuBaseVO.Property(); 90 ProductSkuBaseVO.Property property = new ProductSkuBaseVO.Property();
92 - property.setPropertyId(ProductPropertyDO.PROPERTY_ID);  
93 - property.setPropertyName(ProductPropertyDO.PROPERTY_NAME);  
94 - property.setValueId(ProductPropertyValueDO.VALUE_ID);  
95 - property.setValueName(ProductPropertyValueDO.VALUE_NAME); 91 + property.setPropertyId(ProductPropertyDO.ID_DEFAULT);
  92 + property.setPropertyName(ProductPropertyDO.NAME_DEFAULT);
  93 + property.setValueId(ProductPropertyValueDO.ID_DEFAULT);
  94 + property.setValueName(ProductPropertyValueDO.NAME_DEFAULT);
96 properties.add(property); 95 properties.add(property);
97 skuVO.setProperties(properties); 96 skuVO.setProperties(properties);
98 - // 单规格不需要后续的校验  
99 - return; 97 + return; // 单规格不需要后续的校验
100 } 98 }
  99 +
101 // 1、校验属性项存在 100 // 1、校验属性项存在
102 Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null) 101 Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null)
103 // 遍历多个 Property 属性 102 // 遍历多个 Property 属性
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.product.service.spu; @@ -2,7 +2,6 @@ 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.*;
5 -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;  
6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 5 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
7 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 6 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
8 7
@@ -107,40 +106,25 @@ public interface ProductSpuService { @@ -107,40 +106,25 @@ public interface ProductSpuService {
107 void updateSpuStock(Map<Long, Integer> stockIncrCounts); 106 void updateSpuStock(Map<Long, Integer> stockIncrCounts);
108 107
109 /** 108 /**
110 - * 得到spu详细 109 + * 更新 SPU 状态
111 * 110 *
112 - * @param id id  
113 - * @return {@link ProductSpuDetailRespVO} 111 + * @param updateReqVO 更新请求
114 */ 112 */
115 - ProductSpuDetailRespVO getSpuDetail(Long id); 113 + void updateSpuStatus(ProductSpuUpdateStatusReqVO updateReqVO);
116 114
117 /** 115 /**
118 - * 更新状态 116 + * 获取 SPU 列表标签对应的 Count 数量
119 * 117 *
120 - * @param updateReqVO 更新请求签证官  
121 - */  
122 - void updateStatus(ProductSpuUpdateStatusReqVO updateReqVO);  
123 -  
124 - /**  
125 - * 获取spu列表标签对应的Count数量  
126 - *  
127 - * @return {@link Map}<{@link Integer}, {@link Integer}> 118 + * @return Count 数量
128 */ 119 */
129 Map<Integer, Long> getTabsCount(); 120 Map<Integer, Long> getTabsCount();
130 121
131 /** 122 /**
132 - * 通过分类 id 查询 spu 个数 123 + * 通过分类 categoryId 查询 SPU 个数
133 * 124 *
134 - * @param id 分类 id  
135 - * @return spu 125 + * @param categoryId 分类 categoryId
  126 + * @return SPU 数量
136 */ 127 */
137 - Long getSpuCountByCategoryId(Long id); 128 + Long getSpuCountByCategoryId(Long categoryId);
138 129
139 - /**  
140 - * 通过 spu id 获取商品 SPU 明细  
141 - *  
142 - * @param id id  
143 - * @return 用户 App - 商品 SPU 明细  
144 - */  
145 - AppProductSpuDetailRespVO getAppProductSpuDetail(Long id);  
146 } 130 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
@@ -7,21 +7,15 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -7,21 +7,15 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; 8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
9 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; 9 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
10 -import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;  
11 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 10 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
12 -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;  
13 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 11 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
14 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 12 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
15 -import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;  
16 -import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;  
17 -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;  
18 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 13 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
19 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; 14 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
20 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; 15 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
21 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService; 16 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService;
22 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; 17 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
23 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService; 18 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
24 -import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO;  
25 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; 19 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
26 import com.google.common.collect.Maps; 20 import com.google.common.collect.Maps;
27 import org.springframework.context.annotation.Lazy; 21 import org.springframework.context.annotation.Lazy;
@@ -114,9 +108,9 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -114,9 +108,9 @@ public class ProductSpuServiceImpl implements ProductSpuService {
114 spu.setPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getPrice)); 108 spu.setPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getPrice));
115 // sku 单价最低的商品的市场价格 109 // sku 单价最低的商品的市场价格
116 spu.setMarketPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getMarketPrice)); 110 spu.setMarketPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getMarketPrice));
117 - // sku单价最低的商品的成本价格 111 + // sku 单价最低的商品的成本价格
118 spu.setCostPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getCostPrice)); 112 spu.setCostPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getCostPrice));
119 - // sku单价最低的商品的条形码 113 + // sku 单价最低的商品的条形码
120 spu.setBarCode(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getBarCode)); 114 spu.setBarCode(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getBarCode));
121 // skus 库存总数 115 // skus 库存总数
122 spu.setStock(getSumValue(skus, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum)); 116 spu.setStock(getSumValue(skus, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum));
@@ -214,20 +208,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -214,20 +208,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
214 } 208 }
215 209
216 @Override 210 @Override
217 - public ProductSpuDetailRespVO getSpuDetail(Long id) {  
218 - // 获得商品 SPU  
219 - ProductSpuDO spu = getSpu(id);  
220 - if (spu == null) {  
221 - throw exception(SPU_NOT_EXISTS);  
222 - }  
223 - // 查询商品 SKU  
224 - List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());  
225 - return ProductSpuConvert.INSTANCE.convertForSpuDetailRespVO(spu, skus);  
226 - }  
227 -  
228 - @Override  
229 @Transactional(rollbackFor = Exception.class) 211 @Transactional(rollbackFor = Exception.class)
230 - public void updateStatus(ProductSpuUpdateStatusReqVO updateReqVO) { 212 + public void updateSpuStatus(ProductSpuUpdateStatusReqVO updateReqVO) {
231 // 校验存在 213 // 校验存在
232 validateSpuExists(updateReqVO.getId()); 214 validateSpuExists(updateReqVO.getId());
233 215
@@ -258,39 +240,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -258,39 +240,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
258 } 240 }
259 241
260 @Override 242 @Override
261 - public Long getSpuCountByCategoryId(Long id) {  
262 - return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, id);  
263 - }  
264 -  
265 - @Override  
266 - public AppProductSpuDetailRespVO getAppProductSpuDetail(Long id) {  
267 - // 获得商品 SPU  
268 - ProductSpuDO spu = getSpu(id);  
269 - if (spu == null) {  
270 - throw exception(SPU_NOT_EXISTS);  
271 - }  
272 - if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {  
273 - throw exception(SPU_NOT_ENABLE);  
274 - }  
275 -  
276 - // 查询商品 SKU  
277 - List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());  
278 - List<ProductPropertyValueDetailRespBO> propertyValues = new ArrayList<>();  
279 - // 单规格商品 赋予默认属性值  
280 - if (ObjectUtil.equal(spu.getSpecType(), false)) {  
281 - ProductPropertyValueDetailRespBO respBO = new ProductPropertyValueDetailRespBO();  
282 - respBO.setPropertyId(ProductPropertyDO.PROPERTY_ID);  
283 - respBO.setPropertyName(ProductPropertyDO.PROPERTY_NAME);  
284 - respBO.setValueId(ProductPropertyValueDO.VALUE_ID);  
285 - respBO.setValueName(ProductPropertyValueDO.VALUE_NAME);  
286 - propertyValues.add(respBO);  
287 - } else {  
288 - // 多规格商品则查询商品属性  
289 - propertyValues = productPropertyValueService  
290 - .getPropertyValueDetailList(ProductSkuConvert.INSTANCE.convertPropertyValueIds(skus));  
291 - }  
292 - // 拼接  
293 - return ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus, propertyValues); 243 + public Long getSpuCountByCategoryId(Long categoryId) {
  244 + return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, categoryId);
294 } 245 }
295 246
296 } 247 }
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImplTest.java
@@ -34,6 +34,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; @@ -34,6 +34,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
34 import static org.junit.jupiter.api.Assertions.assertEquals; 34 import static org.junit.jupiter.api.Assertions.assertEquals;
35 import static org.junit.jupiter.api.Assertions.assertFalse; 35 import static org.junit.jupiter.api.Assertions.assertFalse;
36 36
  37 +// TODO 芋艿:单测详细 review 下
37 /** 38 /**
38 * {@link ProductCommentServiceImpl} 的单元测试类 39 * {@link ProductCommentServiceImpl} 的单元测试类
39 * 40 *
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/dto/TradeOrderRespDTO.java
@@ -23,26 +23,24 @@ public class TradeOrderRespDTO { @@ -23,26 +23,24 @@ public class TradeOrderRespDTO {
23 private Long id; 23 private Long id;
24 /** 24 /**
25 * 订单流水号 25 * 订单流水号
26 - * <p> 26 + *
27 * 例如说,1146347329394184195 27 * 例如说,1146347329394184195
28 */ 28 */
29 private String no; 29 private String no;
30 /** 30 /**
31 * 订单类型 31 * 订单类型
32 - * <p> 32 + *
33 * 枚举 {@link TradeOrderTypeEnum} 33 * 枚举 {@link TradeOrderTypeEnum}
34 */ 34 */
35 private Integer type; 35 private Integer type;
36 /** 36 /**
37 * 订单来源 37 * 订单来源
38 - * <p> 38 + *
39 * 枚举 {@link TerminalEnum} 39 * 枚举 {@link TerminalEnum}
40 */ 40 */
41 private Integer terminal; 41 private Integer terminal;
42 /** 42 /**
43 * 用户编号 43 * 用户编号
44 - * <p>  
45 - * 关联 MemberUserDO 的 id 编号  
46 */ 44 */
47 private Long userId; 45 private Long userId;
48 /** 46 /**
@@ -55,7 +53,7 @@ public class TradeOrderRespDTO { @@ -55,7 +53,7 @@ public class TradeOrderRespDTO {
55 private String userRemark; 53 private String userRemark;
56 /** 54 /**
57 * 订单状态 55 * 订单状态
58 - * <p> 56 + *
59 * 枚举 {@link TradeOrderStatusEnum} 57 * 枚举 {@link TradeOrderStatusEnum}
60 */ 58 */
61 private Integer status; 59 private Integer status;
@@ -73,7 +71,7 @@ public class TradeOrderRespDTO { @@ -73,7 +71,7 @@ public class TradeOrderRespDTO {
73 private LocalDateTime cancelTime; 71 private LocalDateTime cancelTime;
74 /** 72 /**
75 * 取消类型 73 * 取消类型
76 - * <p> 74 + *
77 * 枚举 {@link TradeOrderCancelTypeEnum} 75 * 枚举 {@link TradeOrderCancelTypeEnum}
78 */ 76 */
79 private Integer cancelType; 77 private Integer cancelType;
@@ -83,9 +81,6 @@ public class TradeOrderRespDTO { @@ -83,9 +81,6 @@ public class TradeOrderRespDTO {
83 private String remark; 81 private String remark;
84 /** 82 /**
85 * 是否评价 83 * 是否评价
86 - * <p>  
87 - * true - 已评价  
88 - * false - 未评价  
89 */ 84 */
90 private Boolean commentStatus; 85 private Boolean commentStatus;
91 86
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java
@@ -70,7 +70,6 @@ public class DeliveryExpressTemplateController { @@ -70,7 +70,6 @@ public class DeliveryExpressTemplateController {
70 return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list)); 70 return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list));
71 } 71 }
72 72
73 - // TODO @puhui999:DeliveryExpressTemplateRespVO 搞个 simple 的哈 fix  
74 @GetMapping("/list-all-simple") 73 @GetMapping("/list-all-simple")
75 @Operation(summary = "获取快递模版精简信息列表", description = "主要用于前端的下拉选项") 74 @Operation(summary = "获取快递模版精简信息列表", description = "主要用于前端的下拉选项")
76 public CommonResult<List<DeliveryExpressTemplateSimpleRespVO>> getSimpleTemplateList() { 75 public CommonResult<List<DeliveryExpressTemplateSimpleRespVO>> getSimpleTemplateList() {
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
@@ -100,6 +100,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -100,6 +100,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
100 private AdminUserApi adminUserApi; 100 private AdminUserApi adminUserApi;
101 @Resource 101 @Resource
102 private NotifyMessageSendApi notifyMessageSendApi; 102 private NotifyMessageSendApi notifyMessageSendApi;
  103 +
103 @Resource 104 @Resource
104 private TradeOrderProperties tradeOrderProperties; 105 private TradeOrderProperties tradeOrderProperties;
105 106
@@ -356,6 +357,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -356,6 +357,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
356 // TODO 芋艿:发送订单变化的消息 357 // TODO 芋艿:发送订单变化的消息
357 358
358 // TODO 芋艿:发送站内信 fix 359 // TODO 芋艿:发送站内信 fix
  360 + // TODO @puhui999:使用 sendSingleMessageToMember 呀;走模版;不用判断模版是否存在哈
359 // 1、获取模版编码为 order_delivery 的模版,判断是否存在 存在放回 true 361 // 1、获取模版编码为 order_delivery 的模版,判断是否存在 存在放回 true
360 if (!notifyMessageSendApi.validateNotifyTemplate("order_delivery")) { 362 if (!notifyMessageSendApi.validateNotifyTemplate("order_delivery")) {
361 // 1、1 站内信模版不存在则创建模版 363 // 1、1 站内信模版不存在则创建模版