Commit 2132de9dd1e2edfa849794404f707700b0df679b

Authored by owen
1 parent da8b2eab

商品:完善后台商品评论功能

yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java
... ... @@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*;
6 6 import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert;
7 7 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
  8 +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
8 9 import cn.iocoder.yudao.module.product.service.comment.ProductCommentService;
  10 +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
9 11 import io.swagger.v3.oas.annotations.Operation;
10 12 import io.swagger.v3.oas.annotations.tags.Tag;
11 13 import org.springframework.security.access.prepost.PreAuthorize;
... ... @@ -14,8 +16,10 @@ import org.springframework.web.bind.annotation.*;
14 16  
15 17 import javax.annotation.Resource;
16 18 import javax.validation.Valid;
  19 +import java.util.List;
17 20  
18 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  22 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
19 23 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
20 24  
21 25 @Tag(name = "管理后台 - 商品评价")
... ... @@ -26,13 +30,19 @@ public class ProductCommentController {
26 30  
27 31 @Resource
28 32 private ProductCommentService productCommentService;
  33 + @Resource
  34 + private ProductSkuService productSkuService;
29 35  
30 36 @GetMapping("/page")
31 37 @Operation(summary = "获得商品评价分页")
32 38 @PreAuthorize("@ss.hasPermission('product:comment:query')")
33 39 public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) {
34 40 PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO);
35   - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult));
  41 +
  42 + List<ProductSkuDO> skuList = productSkuService.getSkuList(
  43 + convertSet(pageResult.getList(), ProductCommentDO::getSkuId));
  44 +
  45 + return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList));
36 46 }
37 47  
38 48 @PutMapping("/update-visible")
... ... @@ -51,7 +61,7 @@ public class ProductCommentController {
51 61 return success(true);
52 62 }
53 63  
54   - @PutMapping("/create")
  64 + @PostMapping("/create")
55 65 @Operation(summary = "添加自评")
56 66 @PreAuthorize("@ss.hasPermission('product:comment:update')")
57 67 public CommonResult<Boolean> createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) {
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java
... ... @@ -11,11 +11,9 @@ import java.util.List;
11 11 public class ProductCommentBaseVO {
12 12  
13 13 @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868")
14   - @NotNull(message = "评价人不能为空")
15 14 private Long userId;
16 15  
17 16 @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292")
18   - @NotNull(message = "评价订单项不能为空")
19 17 private Long orderItemId;
20 18  
21 19 @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉")
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java
... ... @@ -52,4 +52,6 @@ public class ProductCommentRespVO extends ProductCommentBaseVO {
52 52 @NotNull(message = "商品 SPU 名称不能为空")
53 53 private String spuName;
54 54  
  55 + @Schema(description = "商品 SKU 图片地址", example = "https://www.iocoder.cn/yudao.jpg")
  56 + private String skuPicUrl;
55 57 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.product.convert.comment;
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6   -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 6 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
8 7 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
9 8 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO;
... ... @@ -23,6 +22,11 @@ import java.math.BigDecimal;
23 22 import java.math.RoundingMode;
24 23 import java.util.List;
25 24 import java.util.Map;
  25 +import java.util.Objects;
  26 +import java.util.stream.Collectors;
  27 +
  28 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  29 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
26 30  
27 31 /**
28 32 * 商品评价 Convert
... ... @@ -60,7 +64,7 @@ public interface ProductCommentConvert {
60 64 item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS);
61 65 }
62 66 // 设置 SKU 规格值
63   - MapUtils.findAndThen(skuMap, item.getSkuId(),
  67 + findAndThen(skuMap, item.getSkuId(),
64 68 sku -> item.setSkuProperties(convertList01(sku.getProperties())));
65 69 });
66 70 return page;
... ... @@ -101,6 +105,8 @@ public interface ProductCommentConvert {
101 105 return commentDO;
102 106 }
103 107  
  108 + @Mapping(target = "visible", constant = "true")
  109 + @Mapping(target = "replyStatus", constant = "false")
104 110 @Mapping(target = "userId", constant = "0L")
105 111 @Mapping(target = "orderId", constant = "0L")
106 112 @Mapping(target = "orderItemId", constant = "0L")
... ... @@ -111,4 +117,30 @@ public interface ProductCommentConvert {
111 117  
112 118 List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list);
113 119  
  120 + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO) {
  121 + ProductCommentDO commentDO = convert(createReq);
  122 + if (spuDO != null) {
  123 + commentDO.setSpuId(spuDO.getId());
  124 + commentDO.setSpuName(spuDO.getName());
  125 + }
  126 + return commentDO;
  127 + }
  128 +
  129 + default PageResult<ProductCommentRespVO> convertPage(PageResult<ProductCommentDO> pageResult, List<ProductSkuDO> skuList) {
  130 + Map<Long, ProductSkuDO> skuMap = convertMap(skuList, ProductSkuDO::getId);
  131 +
  132 + PageResult<ProductCommentRespVO> result = convertPage(pageResult);
  133 + for (ProductCommentRespVO vo : result.getList()) {
  134 + findAndThen(skuMap, vo.getSkuId(), sku -> {
  135 + String propertyNames = sku.getProperties().stream()
  136 + .map(ProductSkuDO.Property::getValueName)
  137 + .filter(Objects::nonNull)
  138 + .collect(Collectors.joining(" "));
  139 +
  140 + vo.setSkuPicUrl(sku.getPicUrl());
  141 + vo.setSpuName(vo.getSpuName() + " " + propertyNames);
  142 + });
  143 + }
  144 + return result;
  145 + }
114 146 }
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java
... ... @@ -20,6 +20,7 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
20 20 .eqIfPresent(ProductCommentDO::getOrderId, reqVO.getOrderId())
21 21 .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId())
22 22 .eqIfPresent(ProductCommentDO::getScores, reqVO.getScores())
  23 + .eqIfPresent(ProductCommentDO::getReplyStatus, reqVO.getReplyStatus())
23 24 .betweenIfPresent(ProductCommentDO::getCreateTime, reqVO.getCreateTime())
24 25 .likeIfPresent(ProductCommentDO::getSpuName, reqVO.getSpuName())
25 26 .orderByDesc(ProductCommentDO::getId));
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
... ... @@ -80,23 +80,18 @@ public class ProductCommentServiceImpl implements ProductCommentService {
80 80 @Override
81 81 @Transactional(rollbackFor = Exception.class)
82 82 public void createComment(ProductCommentCreateReqVO createReqVO) {
83   - // 校验评论
84   - validateComment(createReqVO.getSkuId(), createReqVO.getUserId(), createReqVO.getOrderItemId());
  83 + // 校验商品
  84 + ProductSpuDO spuDO = validateProduct(createReqVO.getSkuId());
85 85  
86   - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO);
  86 + ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO);
87 87 productCommentMapper.insert(commentDO);
88 88 }
89 89  
90 90 @Override
91 91 @Transactional(rollbackFor = Exception.class)
92 92 public Long createComment(ProductCommentCreateReqDTO createReqDTO) {
93   - // 通过 sku ID 拿到 spu 相关信息
94   - ProductSkuDO sku = productSkuService.getSku(createReqDTO.getSkuId());
95   - if (sku == null) {
96   - throw exception(SKU_NOT_EXISTS);
97   - }
98   - // 校验 spu 如果存在返回详情
99   - ProductSpuDO spuDO = validateSpu(sku.getSpuId());
  93 + // 校验商品
  94 + ProductSpuDO spuDO = validateProduct(createReqDTO.getSkuId());
100 95 // 校验评论
101 96 validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId());
102 97 // 获取用户详细信息
... ... @@ -116,6 +111,21 @@ public class ProductCommentServiceImpl implements ProductCommentService {
116 111 }
117 112 }
118 113  
  114 + private ProductSpuDO validateProduct(Long skuId) {
  115 + // 通过 sku ID 拿到 spu 相关信息
  116 + ProductSkuDO sku = validateSku(skuId);
  117 + // 校验 spu 如果存在返回详情
  118 + return validateSpu(sku.getSpuId());
  119 + }
  120 +
  121 + private ProductSkuDO validateSku(Long skuId) {
  122 + ProductSkuDO sku = productSkuService.getSku(skuId);
  123 + if (sku == null) {
  124 + throw exception(SKU_NOT_EXISTS);
  125 + }
  126 + return sku;
  127 + }
  128 +
119 129 private ProductSpuDO validateSpu(Long spuId) {
120 130 ProductSpuDO spu = productSpuService.getSpu(spuId);
121 131 if (null == spu) {
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
1 1 package cn.iocoder.yudao.module.product.service.sku;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
4 5 import cn.hutool.core.util.ObjectUtil;
5 6 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
6 7 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO;
... ... @@ -74,6 +75,9 @@ public class ProductSkuServiceImpl implements ProductSkuService {
74 75  
75 76 @Override
76 77 public List<ProductSkuDO> getSkuList(Collection<Long> ids) {
  78 + if (CollUtil.isEmpty(ids)) {
  79 + return ListUtil.empty();
  80 + }
77 81 return productSkuMapper.selectBatchIds(ids);
78 82 }
79 83  
... ...