code review:商品评价哈

This commit is contained in:
YunaiV 2023-06-17 21:57:52 +08:00
parent 08535d6019
commit 35df912be7
21 changed files with 80 additions and 99 deletions

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.product.api.comment; package cn.iocoder.yudao.module.product.api.comment;
import cn.iocoder.yudao.module.product.api.comment.dto.CommentCreateReqDTO; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
/** /**
* 产品评论 API 接口 * 产品评论 API 接口
@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.product.api.comment.dto.CommentCreateReqDTO;
*/ */
public interface ProductCommentApi { public interface ProductCommentApi {
// TODO @puhuiLong orderId 放到 createReqDTO 里噶
/** /**
* 创建评论 * 创建评论
* *
@ -16,6 +17,6 @@ public interface ProductCommentApi {
* @param orderId 订单 id * @param orderId 订单 id
* @return 返回评论创建后的 id * @return 返回评论创建后的 id
*/ */
Long createComment(CommentCreateReqDTO createReqDTO, Long orderId); Long createComment(ProductCommentCreateReqDTO createReqDTO, Long orderId);
} }

View File

@ -10,71 +10,64 @@ import java.util.List;
* @author HUIHUI * @author HUIHUI
*/ */
@Data @Data
public class CommentCreateReqDTO { public class ProductCommentCreateReqDTO {
/** /**
* 是否匿名 * 商品 SKU 编号
*/ */
private Boolean anonymous; private Long skuId;
/** /**
* 交易订单项编号 * 交易订单项编号
*/ */
private Long orderItemId; private Long orderItemId;
// TODO @huihuispuIdspuName 去查询哇通过 skuId
/** /**
* 商品 SPU 编号 * 商品 SPU 编号
*/ */
private Long spuId; private Long spuId;
/** /**
* 商品 SPU 名称 * 商品 SPU 名称
*/ */
private String spuName; private String spuName;
/**
* 商品 SKU 编号
*/
private Long skuId;
/** /**
* 评分星级 1-5 * 评分星级 1-5
*/ */
private Integer scores; private Integer scores;
/** /**
* 描述星级 1-5 * 描述星级 1-5
*/ */
private Integer descriptionScores; private Integer descriptionScores;
/** /**
* 服务星级 1-5 * 服务星级 1-5
*/ */
private Integer benefitScores; private Integer benefitScores;
/** /**
* 评论内容 * 评论内容
*/ */
private String content; private String content;
/** /**
* 评论图片地址数组以逗号分隔最多上传9张 * 评论图片地址数组以逗号分隔最多上传 9
*/ */
private List<String> picUrls; private List<String> picUrls;
/**
* 是否匿名
*/
private Boolean anonymous;
/**
* 评价人
*/
private Long userId;
// TODO @puhui999是不是 userNicknameuserAvatar 去掉通过 userId 查询
/** /**
* 评价人名称 * 评价人名称
*/ */
private String userNickname; private String userNickname;
/** /**
* 评价人头像 * 评价人头像
*/ */
private String userAvatar; private String userAvatar;
/**
* 评价人
*/
private Long userId;
} }

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.product.api.comment; package cn.iocoder.yudao.module.product.api.comment;
import cn.iocoder.yudao.module.product.api.comment.dto.CommentCreateReqDTO; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert;
import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; import cn.iocoder.yudao.module.product.service.comment.ProductCommentService;
@ -17,12 +17,14 @@ import javax.annotation.Resource;
@Service @Service
@Validated @Validated
public class ProductCommentApiImpl implements ProductCommentApi { public class ProductCommentApiImpl implements ProductCommentApi {
@Resource @Resource
private ProductCommentService productCommentService; private ProductCommentService productCommentService;
@Override @Override
public Long createComment(CommentCreateReqDTO createReqDTO, Long orderId) { public Long createComment(ProductCommentCreateReqDTO createReqDTO, Long orderId) {
ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqDTO, orderId); ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqDTO, orderId);
return productCommentService.createComment(commentDO); return productCommentService.createComment(commentDO);
} }
} }

View File

@ -30,15 +30,15 @@ public class ProductCommentBaseVO {
@NotNull(message = "商品 SKU 编号不能为空") @NotNull(message = "商品 SKU 编号不能为空")
private Long skuId; private Long skuId;
@Schema(description = "评分星级 1-5", required = true, example = "5") @Schema(description = "评分星级 1-5 ", required = true, example = "5")
@NotNull(message = "评分星级不能为空") @NotNull(message = "评分星级不能为空")
private Integer scores; private Integer scores;
@Schema(description = "描述星级 1-5", required = true, example = "5") @Schema(description = "描述星级 1-5 ", required = true, example = "5")
@NotNull(message = "描述星级不能为空") @NotNull(message = "描述星级不能为空")
private Integer descriptionScores; private Integer descriptionScores;
@Schema(description = "服务星级 1-5", required = true, example = "5") @Schema(description = "服务星级 1-5 ", required = true, example = "5")
@NotNull(message = "服务星级分不能为空") @NotNull(message = "服务星级分不能为空")
private Integer benefitScores; private Integer benefitScores;
@ -46,8 +46,8 @@ public class ProductCommentBaseVO {
@NotNull(message = "评论内容不能为空") @NotNull(message = "评论内容不能为空")
private String content; private String content;
@Schema(description = "评论图片地址数组,以逗号分隔最多上传9张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 ", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
@Size(max = 9, message = "评论图片地址数组长度不能超过9张") @Size(max = 9, message = "评论图片地址数组长度不能超过 9 ")
private List<String> picUrls; private List<String> picUrls;
} }

View File

@ -13,6 +13,7 @@ import javax.validation.constraints.NotNull;
@ToString(callSuper = true) @ToString(callSuper = true)
public class ProductCommentCreateReqVO extends ProductCommentBaseVO { public class ProductCommentCreateReqVO extends ProductCommentBaseVO {
// TODO @puhui999是不是也放到父类里
@Schema(description = "评价人", required = true, example = "16868") @Schema(description = "评价人", required = true, example = "16868")
@NotNull(message = "评价人不能为空") @NotNull(message = "评价人不能为空")
private Long userId; private Long userId;

View File

@ -31,7 +31,7 @@ public class ProductCommentPageReqVO extends PageParam {
@Schema(description = "商品SPU名称", example = "感冒药") @Schema(description = "商品SPU名称", example = "感冒药")
private String spuName; private String spuName;
@Schema(description = "评分星级 1-5", example = "5") @Schema(description = "评分星级 1-5 ", example = "5")
@InEnum(ProductCommentScoresEnum.class) @InEnum(ProductCommentScoresEnum.class)
private Integer scores; private Integer scores;

View File

@ -16,7 +16,7 @@ public class ProductCommentRespVO extends ProductCommentBaseVO {
@Schema(description = "订单项编号", required = true, example = "24965") @Schema(description = "订单项编号", required = true, example = "24965")
private Long id; private Long id;
@Schema(description = "是否匿名[false:不匿名 true:匿名]", required = true, example = "false") @Schema(description = "是否匿名", required = true, example = "false")
private Boolean anonymous; private Boolean anonymous;
@Schema(description = "交易订单编号", required = true, example = "24428") @Schema(description = "交易订单编号", required = true, example = "24428")

View File

@ -36,6 +36,7 @@ public class AppProductCommentController {
@Resource @Resource
private ProductCommentService productCommentService; private ProductCommentService productCommentService;
// TODO @puhui999可以实现下
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "获得最近的 n 条商品评价") @Operation(summary = "获得最近的 n 条商品评价")
@Parameters({ @Parameters({
@ -44,7 +45,6 @@ public class AppProductCommentController {
}) })
public CommonResult<List<AppProductCommentRespVO>> getCommentList(@RequestParam("spuId") Long spuId, public CommonResult<List<AppProductCommentRespVO>> getCommentList(@RequestParam("spuId") Long spuId,
@RequestParam(value = "count", defaultValue = "10") Integer count) { @RequestParam(value = "count", defaultValue = "10") Integer count) {
List<AppProductPropertyValueDetailRespVO> list = new ArrayList<>(); List<AppProductPropertyValueDetailRespVO> list = new ArrayList<>();
AppProductPropertyValueDetailRespVO item1 = new AppProductPropertyValueDetailRespVO(); AppProductPropertyValueDetailRespVO item1 = new AppProductPropertyValueDetailRespVO();
@ -101,6 +101,7 @@ public class AppProductCommentController {
return success(productCommentService.getCommentPage(pageVO, Boolean.TRUE)); return success(productCommentService.getCommentPage(pageVO, Boolean.TRUE));
} }
// TODO @puhuiget-statistics方法改成 getCommentStatisticsgetCommentPageTabsCount 也改掉哈
@GetMapping("/getCommentStatistics") @GetMapping("/getCommentStatistics")
@Operation(summary = "获得商品的评价统计") @Operation(summary = "获得商品的评价统计")
public CommonResult<AppCommentStatisticsRespVO> getCommentPage(@Valid @RequestParam("spuId") Long spuId) { public CommonResult<AppCommentStatisticsRespVO> getCommentPage(@Valid @RequestParam("spuId") Long spuId) {

View File

@ -8,11 +8,6 @@ import lombok.ToString;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
/**
* 用户 APP - 商品评价分页 Request VO
*
* @author HUIHUI
*/
@Schema(description = "用户APP - 商品评价分页 Request VO") @Schema(description = "用户APP - 商品评价分页 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -23,12 +18,10 @@ public class AppCommentPageReqVO extends PageParam {
* 好评 * 好评
*/ */
public static final Integer GOOD_COMMENT = 1; public static final Integer GOOD_COMMENT = 1;
/** /**
* 中评 * 中评
*/ */
public static final Integer MEDIOCRE_COMMENT = 2; public static final Integer MEDIOCRE_COMMENT = 2;
/** /**
* 差评 * 差评
*/ */

View File

@ -4,11 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
/**
* APP 商品评价页评论分类数统计 Response VO
*
* @author HUIHUI
*/
@Schema(description = "APP - 商品评价页评论分类数统计 Response VO") @Schema(description = "APP - 商品评价页评论分类数统计 Response VO")
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)

View File

@ -8,11 +8,6 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.util.List; import java.util.List;
/**
* 用户APP - 商品评价创建 Request VO
*
* @author HUIHUI
*/
@Schema(description = "用户APP - 商品评价创建 Request VO") @Schema(description = "用户APP - 商品评价创建 Request VO")
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@ -26,36 +21,36 @@ public class AppProductCommentCreateReqVO {
@NotNull(message = "交易订单项编号不能为空") @NotNull(message = "交易订单项编号不能为空")
private Long orderItemId; private Long orderItemId;
@Schema(description = "商品SPU编号", required = true, example = "91192") @Schema(description = "商品 SPU 编号", required = true, example = "91192")
@NotNull(message = "商品SPU编号不能为空") @NotNull(message = "商品SPU编号不能为空")
private Long spuId; private Long spuId;
@Schema(description = "商品SPU名称", required = true, example = "清凉丝滑小短袖") @Schema(description = "商品 SPU 名称", required = true, example = "清凉丝滑小短袖")
@NotNull(message = "商品SPU名称不能为空") @NotNull(message = "商品SPU名称不能为空")
private String spuName; private String spuName;
@Schema(description = "商品SKU编号", required = true, example = "81192") @Schema(description = "商品 SKU 编号", required = true, example = "81192")
@NotNull(message = "商品SKU编号不能为空") @NotNull(message = "商品SKU编号不能为空")
private Long skuId; private Long skuId;
@Schema(description = "评分星级 1-5", required = true, example = "5") @Schema(description = "评分星级 1-5 ", required = true, example = "5")
@NotNull(message = "评分星级 1-5分不能为空") @NotNull(message = "评分星级 1-5 分不能为空")
private Integer scores; private Integer scores;
@Schema(description = "描述星级 1-5", required = true, example = "5") @Schema(description = "描述星级 1-5 ", required = true, example = "5")
@NotNull(message = "描述星级 1-5分不能为空") @NotNull(message = "描述星级 1-5 分不能为空")
private Integer descriptionScores; private Integer descriptionScores;
@Schema(description = "服务星级 1-5", required = true, example = "5") @Schema(description = "服务星级 1-5 ", required = true, example = "5")
@NotNull(message = "服务星级 1-5分不能为空") @NotNull(message = "服务星级 1-5 分不能为空")
private Integer benefitScores; private Integer benefitScores;
@Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评") @Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评")
@NotNull(message = "评论内容不能为空") @NotNull(message = "评论内容不能为空")
private String content; private String content;
@Schema(description = "评论图片地址数组,以逗号分隔最多上传9张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 ", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
@Size(max = 9, message = "评论图片地址数组长度不能超过9张") @Size(max = 9, message = "评论图片地址数组长度不能超过 9 ")
private List<String> picUrls; private List<String> picUrls;
} }

View File

@ -60,7 +60,7 @@ public class AppProductCommentRespVO {
@Schema(description = "追加评价内容", example = "穿了很久都很丝滑诶") @Schema(description = "追加评价内容", example = "穿了很久都很丝滑诶")
private String additionalContent; private String additionalContent;
@Schema(description = "追评评价图片地址数组,以逗号分隔最多上传9张", example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") @Schema(description = "追评评价图片地址数组,以逗号分隔最多上传 9 ", example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
private List<String> additionalPicUrls; private List<String> additionalPicUrls;
@Schema(description = "追加评价时间") @Schema(description = "追加评价时间")
@ -86,24 +86,24 @@ public class AppProductCommentRespVO {
@Schema(description = "商品 SKU 属性", required = true) @Schema(description = "商品 SKU 属性", required = true)
private List<AppProductPropertyValueDetailRespVO> skuProperties; private List<AppProductPropertyValueDetailRespVO> skuProperties;
@Schema(description = "评分星级 1-5", required = true, example = "5") @Schema(description = "评分星级 1-5 ", required = true, example = "5")
@NotNull(message = "评分星级 1-5分不能为空") @NotNull(message = "评分星级 1-5 分不能为空")
private Integer scores; private Integer scores;
@Schema(description = "描述星级 1-5", required = true, example = "5") @Schema(description = "描述星级 1-5 ", required = true, example = "5")
@NotNull(message = "描述星级 1-5分不能为空") @NotNull(message = "描述星级 1-5 分不能为空")
private Integer descriptionScores; private Integer descriptionScores;
@Schema(description = "服务星级 1-5", required = true, example = "5") @Schema(description = "服务星级 1-5 ", required = true, example = "5")
@NotNull(message = "服务星级 1-5分不能为空") @NotNull(message = "服务星级 1-5 分不能为空")
private Integer benefitScores; private Integer benefitScores;
@Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评") @Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评")
@NotNull(message = "评论内容不能为空") @NotNull(message = "评论内容不能为空")
private String content; private String content;
@Schema(description = "评论图片地址数组,以逗号分隔最多上传9张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 ", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
@Size(max = 9, message = "评论图片地址数组长度不能超过9张") @Size(max = 9, message = "评论图片地址数组长度不能超过 9 ")
private List<String> picUrls; private List<String> picUrls;
} }

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.product.convert.comment; package cn.iocoder.yudao.module.product.convert.comment;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.api.comment.dto.CommentCreateReqDTO; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentRespVO; import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentRespVO;
import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO;
@ -49,7 +49,7 @@ public interface ProductCommentConvert {
* *
* @param descriptionScores 描述星级 * @param descriptionScores 描述星级
* @param benefitScores 服务星级 * @param benefitScores 服务星级
* @return {@link Integer} * @return 综合评分
*/ */
@Named("convertScores") @Named("convertScores")
default Integer convertScores(Integer descriptionScores, Integer benefitScores) { default Integer convertScores(Integer descriptionScores, Integer benefitScores) {
@ -61,7 +61,7 @@ public interface ProductCommentConvert {
@Mapping(target = "orderId", source = "orderId") @Mapping(target = "orderId", source = "orderId")
@Mapping(target = "scores", expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") @Mapping(target = "scores", expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))")
ProductCommentDO convert(CommentCreateReqDTO createReqDTO, Long orderId); ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, Long orderId);
@Mapping(target = "userId", constant = "0L") @Mapping(target = "userId", constant = "0L")
@Mapping(target = "orderId", constant = "0L") @Mapping(target = "orderId", constant = "0L")

View File

@ -97,7 +97,7 @@ public class ProductCommentDO extends BaseDO {
/** /**
* 评分星级 * 评分星级
* *
* 1-5 * 1-5
*/ */
private Integer scores; private Integer scores;
/** /**

View File

@ -25,6 +25,7 @@ public interface ProductCommentMapper extends BaseMapperX<ProductCommentDO> {
} }
// TODO 芋艿在看看这块 // TODO 芋艿在看看这块
// TODO @puhui999直接使用 scores 来算好评中评差评
static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) { static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) {
// 构建好评查询语句好评计算 (商品评分星级+服务评分星级) >= 8 // 构建好评查询语句好评计算 (商品评分星级+服务评分星级) >= 8
if (ObjectUtil.equal(type, AppCommentPageReqVO.GOOD_COMMENT)) { if (ObjectUtil.equal(type, AppCommentPageReqVO.GOOD_COMMENT)) {

View File

@ -54,7 +54,8 @@ public interface ProductCommentService {
PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible); PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible);
/** /**
* 创建商品评论 后台管理员创建评论使用 * 创建商品评论
* 后台管理员创建评论使用
* *
* @param createReqVO 商品评价创建 Request VO 对象 * @param createReqVO 商品评价创建 Request VO 对象
*/ */

View File

@ -86,6 +86,7 @@ public class ProductCommentServiceImpl implements ProductCommentService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void createComment(ProductCommentCreateReqVO createReqVO) { public void createComment(ProductCommentCreateReqVO createReqVO) {
// 校验订单 // 校验订单
// TODO @puhui999不校验哈尽可能解耦
Long orderId = tradeOrderApi.validateOrder(createReqVO.getUserId(), createReqVO.getOrderItemId()); Long orderId = tradeOrderApi.validateOrder(createReqVO.getUserId(), createReqVO.getOrderItemId());
// 校验评论 // 校验评论
validateComment(createReqVO.getSpuId(), createReqVO.getUserId(), orderId); validateComment(createReqVO.getSpuId(), createReqVO.getUserId(), orderId);
@ -104,8 +105,6 @@ public class ProductCommentServiceImpl implements ProductCommentService {
return commentDO.getId(); return commentDO.getId();
} }
// TODO 只有创建和更新诶 要不要删除接口
private void validateComment(Long spuId, Long userId, Long orderId) { private void validateComment(Long spuId, Long userId, Long orderId) {
ProductSpuDO spu = productSpuService.getSpu(spuId); ProductSpuDO spu = productSpuService.getSpu(spuId);
if (null == spu) { if (null == spu) {
@ -144,6 +143,7 @@ public class ProductCommentServiceImpl implements ProductCommentService {
public PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible) { public PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible) {
PageResult<AppProductCommentRespVO> result = ProductCommentConvert.INSTANCE.convertPage02( PageResult<AppProductCommentRespVO> result = ProductCommentConvert.INSTANCE.convertPage02(
productCommentMapper.selectPage(pageVO, visible)); productCommentMapper.selectPage(pageVO, visible));
// TODO @puhui999要不这块放到 controller 里拼接
Set<Long> skuIds = result.getList().stream().map(AppProductCommentRespVO::getSkuId).collect(Collectors.toSet()); Set<Long> skuIds = result.getList().stream().map(AppProductCommentRespVO::getSkuId).collect(Collectors.toSet());
List<ProductSkuDO> skuList = productSkuService.getSkuList(skuIds); List<ProductSkuDO> skuList = productSkuService.getSkuList(skuIds);
Map<Long, ProductSkuDO> skuDOMap = new HashMap<>(skuIds.size()); Map<Long, ProductSkuDO> skuDOMap = new HashMap<>(skuIds.size());

View File

@ -126,6 +126,7 @@ CREATE TABLE IF NOT EXISTS `product_property_value` (
PRIMARY KEY("id") PRIMARY KEY("id")
) COMMENT '规格值'; ) COMMENT '规格值';
-- TODO @puhui999格式不太对哈
CREATE TABLE IF NOT EXISTS `product_comment` CREATE TABLE IF NOT EXISTS `product_comment`
( (
`id` `id`
@ -166,7 +167,7 @@ CREATE TABLE IF NOT EXISTS `product_comment`
( (
1 1
) DEFAULT NULL COMMENT '是否可见true:显示false:隐藏', ) DEFAULT NULL COMMENT '是否可见true:显示false:隐藏',
`scores` tinyint DEFAULT NULL COMMENT '评分星级1-5', `scores` tinyint DEFAULT NULL COMMENT '评分星级1-5 ',
`description_scores` tinyint DEFAULT NULL COMMENT '描述星级1-5 ', `description_scores` tinyint DEFAULT NULL COMMENT '描述星级1-5 ',
`benefit_scores` tinyint DEFAULT NULL COMMENT '服务星级1-5 ', `benefit_scores` tinyint DEFAULT NULL COMMENT '服务星级1-5 ',
`content` varchar `content` varchar

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.controller.app.order;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO; import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi; import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
@ -49,13 +48,12 @@ public class AppTradeOrderController {
@Resource @Resource
private ProductPropertyValueApi productPropertyValueApi; private ProductPropertyValueApi productPropertyValueApi;
@Resource
private ProductCommentApi productCommentApi;
@Resource @Resource
private TradeOrderProperties tradeOrderProperties; private TradeOrderProperties tradeOrderProperties;
@Resource
private ProductCommentApi productCommentApi;
@GetMapping("/settlement") @GetMapping("/settlement")
@Operation(summary = "获得订单结算信息") @Operation(summary = "获得订单结算信息")
@PreAuthenticated @PreAuthenticated
@ -141,6 +139,7 @@ public class AppTradeOrderController {
@Operation(summary = "创建交易订单项的评价") @Operation(summary = "创建交易订单项的评价")
public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) { public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) {
// 校验订单项订单项存在订单就存在 // 校验订单项订单项存在订单就存在
// TODO @puhui999要去查询订单是不是自己的不然别人模拟请求哈
TradeOrderItemDO item = tradeOrderService.getOrderItem(createReqVO.getUserId(), createReqVO.getOrderItemId()); TradeOrderItemDO item = tradeOrderService.getOrderItem(createReqVO.getUserId(), createReqVO.getOrderItemId());
if (item == null) { if (item == null) {
throw exception(ORDER_ITEM_NOT_FOUND); throw exception(ORDER_ITEM_NOT_FOUND);
@ -149,6 +148,6 @@ public class AppTradeOrderController {
return success(productCommentApi.createComment(TradeOrderConvert.INSTANCE.convert04(createReqVO), item.getOrderId())); return success(productCommentApi.createComment(TradeOrderConvert.INSTANCE.convert04(createReqVO), item.getOrderId()));
} }
// TODO 合并代码后发现只有商家回复功能 用户追评不要了吗 // TODO 合并代码后发现只有商家回复功能 用户追评不要了吗不要了哈
} }

View File

@ -7,11 +7,6 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.util.List; import java.util.List;
/**
* 商品评价创建 Request VO
*
* @author HUIHUI
*/
@Schema(description = "用户APP - 商品评价创建 Request VO") @Schema(description = "用户APP - 商品评价创建 Request VO")
@Data @Data
public class AppTradeOrderItemCommentCreateReqVO { public class AppTradeOrderItemCommentCreateReqVO {
@ -24,6 +19,7 @@ public class AppTradeOrderItemCommentCreateReqVO {
@NotNull(message = "交易订单项编号不能为空") @NotNull(message = "交易订单项编号不能为空")
private Long orderItemId; private Long orderItemId;
// TODO @puhuispuIdspuNameskuId 直接查询出来
@Schema(description = "商品SPU编号", required = true, example = "29502") @Schema(description = "商品SPU编号", required = true, example = "29502")
@NotNull(message = "商品SPU编号不能为空") @NotNull(message = "商品SPU编号不能为空")
private Long spuId; private Long spuId;
@ -36,30 +32,32 @@ public class AppTradeOrderItemCommentCreateReqVO {
@NotNull(message = "商品SKU编号不能为空") @NotNull(message = "商品SKU编号不能为空")
private Long skuId; private Long skuId;
@Schema(description = "评分星级 1-5", required = true, example = "5") @Schema(description = "评分星级 1-5 ", required = true, example = "5")
@NotNull(message = "评分星级 1-5分不能为空") @NotNull(message = "评分星级 1-5 分不能为空")
private Integer scores; private Integer scores;
@Schema(description = "描述星级 1-5", required = true, example = "5") @Schema(description = "描述星级 1-5 ", required = true, example = "5")
@NotNull(message = "描述星级 1-5分不能为空") @NotNull(message = "描述星级 1-5 分不能为空")
private Integer descriptionScores; private Integer descriptionScores;
@Schema(description = "服务星级 1-5", required = true, example = "5") @Schema(description = "服务星级 1-5 ", required = true, example = "5")
@NotNull(message = "服务星级 1-5分不能为空") @NotNull(message = "服务星级 1-5 分不能为空")
private Integer benefitScores; private Integer benefitScores;
@Schema(description = "评论内容", required = true, example = "穿身上很漂亮诶(*^▽^*)") @Schema(description = "评论内容", required = true, example = "穿身上很漂亮诶(*^▽^*)")
@NotNull(message = "评论内容不能为空") @NotNull(message = "评论内容不能为空")
private String content; private String content;
@Schema(description = "评论图片地址数组,以逗号分隔最多上传9张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xx.png]") @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 ", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xx.png]")
@Size(max = 9, message = "评论图片地址数组长度不能超过9张") @Size(max = 9, message = "评论图片地址数组长度不能超过 9 ")
private List<String> picUrls; private List<String> picUrls;
@Schema(description = "评价人名称", required = true, example = "小姑凉") @Schema(description = "评价人名称", required = true, example = "小姑凉")
@NotNull(message = "评价人名称不能为空") @NotNull(message = "评价人名称不能为空")
private String userNickname; private String userNickname;
// TODO @puhuiuserAvataruserAvataruserId 直接查询出来
@Schema(description = "评价人头像", required = true, example = "https://www.iocoder.cn/xx.png") @Schema(description = "评价人头像", required = true, example = "https://www.iocoder.cn/xx.png")
@NotNull(message = "评价人头像不能为空") @NotNull(message = "评价人头像不能为空")
private String userAvatar; private String userAvatar;

View File

@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.product.api.comment.dto.CommentCreateReqDTO; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO; import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO;
@ -227,6 +227,7 @@ public interface TradeOrderConvert {
AppProductPropertyValueDetailRespVO convert02(ProductPropertyValueDetailRespDTO bean); AppProductPropertyValueDetailRespVO convert02(ProductPropertyValueDetailRespDTO bean);
// TODO 芋艿可简化
default AppTradeOrderDetailRespVO convert02(TradeOrderDO order, List<TradeOrderItemDO> orderItems, default AppTradeOrderDetailRespVO convert02(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
List<ProductPropertyValueDetailRespDTO> propertyValueDetails, TradeOrderProperties tradeOrderProperties) { List<ProductPropertyValueDetailRespDTO> propertyValueDetails, TradeOrderProperties tradeOrderProperties) {
AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems); AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems);
@ -258,7 +259,7 @@ public interface TradeOrderConvert {
AppTradeOrderItemRespVO convert03(TradeOrderItemDO bean); AppTradeOrderItemRespVO convert03(TradeOrderItemDO bean);
CommentCreateReqDTO convert04(AppTradeOrderItemCommentCreateReqVO createReqVO); ProductCommentCreateReqDTO convert04(AppTradeOrderItemCommentCreateReqVO createReqVO);
default TradePriceCalculateReqBO convert(Long userId, AppTradeOrderSettlementReqVO settlementReqVO, default TradePriceCalculateReqBO convert(Long userId, AppTradeOrderSettlementReqVO settlementReqVO,
List<TradeCartDO> cartList) { List<TradeCartDO> cartList) {
@ -302,5 +303,4 @@ public interface TradeOrderConvert {
AppTradeOrderSettlementRespVO convert0(TradePriceCalculateRespBO calculate, AddressRespDTO address); AppTradeOrderSettlementRespVO convert0(TradePriceCalculateRespBO calculate, AddressRespDTO address);
} }