fix:完善商品评论 review 提到的问题

This commit is contained in:
puhui999
2023-06-20 18:12:39 +08:00
parent 8dfb298376
commit 700d95a43d
28 changed files with 310 additions and 296 deletions

View File

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
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.dto.ProductCommentCreateReqDTO;
import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi;
import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.*;
@@ -35,6 +36,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
@Tag(name = "用户 App - 交易订单")
@RestController
@@ -138,16 +140,20 @@ public class AppTradeOrderController {
@PostMapping("/item/create-comment")
@Operation(summary = "创建交易订单项的评价")
public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) {
// 校验订单项,订单项存在订单就存在
// TODO @puhui999要去查询订单是不是自己的不然别人模拟请求哈
TradeOrderItemDO item = tradeOrderService.getOrderItem(createReqVO.getUserId(), createReqVO.getOrderItemId());
if (item == null) {
Long loginUserId = getLoginUserId();
// 先通过订单项 ID 查询订单项是否存在
TradeOrderItemDO orderItemDO = tradeOrderService.getOrderItemByIdAndUserId(createReqVO.getOrderItemId(), loginUserId);
if (orderItemDO == null) {
throw exception(ORDER_ITEM_NOT_FOUND);
}
// 校验订单
TradeOrderDO orderDO = tradeOrderService.getOrderByIdAndUserId(orderItemDO.getOrderId(), loginUserId);
if (orderDO == null) {
throw exception(ORDER_NOT_FOUND);
}
return success(productCommentApi.createComment(TradeOrderConvert.INSTANCE.convert04(createReqVO), item.getOrderId()));
ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItemDO);
return success(productCommentApi.createComment(productCommentCreateReqDTO));
}
// TODO 合并代码后发现只有商家回复功能 用户追评不要了吗?不要了哈;
}

View File

@@ -21,7 +21,7 @@ public class AppTradeOrderSettlementReqVO {
@Deprecated // TODO 芋艿:后续干掉这个字段,对于前端不需要关注这个
private Integer type;
@Schema(description = "商品项数组", required = true)
@Schema(description = "商品项数组", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "商品不能为空")
private List<Item> items;

View File

@@ -12,13 +12,13 @@ import java.util.List;
@Data
public class AppTradeOrderSettlementRespVO {
@Schema(description = "购物项数组", required = true)
@Schema(description = "购物项数组", requiredMode = Schema.RequiredMode.REQUIRED)
private List<Item> items;
@Schema(description = "费用", required = true)
@Schema(description = "费用", requiredMode = Schema.RequiredMode.REQUIRED)
private Price price;
@Schema(description = "收件地址", required = true)
@Schema(description = "收件地址", requiredMode = Schema.RequiredMode.REQUIRED)
private Address address;
@Schema(description = "购物项")
@@ -27,29 +27,29 @@ public class AppTradeOrderSettlementRespVO {
// ========== SPU 信息 ==========
@Schema(description = "SPU 编号", required = true, example = "2048")
@Schema(description = "SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long spuId;
@Schema(description = "SPU 名字", required = true, example = "Apple iPhone 12")
@Schema(description = "SPU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "Apple iPhone 12")
private String spuName;
// ========== SKU 信息 ==========
@Schema(description = "SKU 编号", required = true, example = "1024")
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer skuId;
@Schema(description = "价格,单位:分", required = true, example = "100")
@Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer price;
@Schema(description = "图片地址", required = true, example = "https://www.iocoder.cn/1.png")
@Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png")
private String picUrl;
@Schema(description = "属性数组", required = true, example = "100")
@Schema(description = "属性数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private List<AppProductPropertyValueDetailRespVO> properties;
// ========== 购物车信息 ==========
@Schema(description = "购物车编号", required = true, example = "100")
@Schema(description = "购物车编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Long cartId;
@Schema(description = "购买数量", required = true, example = "1")
@Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer count;
}
@@ -60,19 +60,19 @@ public class AppTradeOrderSettlementRespVO {
@AllArgsConstructor
public static class Price {
@Schema(description = "商品原价(总),单位:分", required = true, example = "500")
@Schema(description = "商品原价(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "500")
private Integer totalPrice;
@Schema(description = "运费金额,单位:分", required = true, example = "50")
@Schema(description = "运费金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
private Integer deliveryPrice;
@Schema(description = "优惠劵减免金额,单位:分", required = true, example = "100")
@Schema(description = "优惠劵减免金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer couponPrice;
@Schema(description = "积分抵扣的金额,单位:分", required = true, example = "50")
@Schema(description = "积分抵扣的金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
private Integer pointPrice;
@Schema(description = "实际支付金额(总),单位:分", required = true, example = "450")
@Schema(description = "实际支付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "450")
private Integer payPrice;
}
@@ -81,34 +81,34 @@ public class AppTradeOrderSettlementRespVO {
@Data
public static class Address {
@Schema(description = "编号", required = true, example = "1")
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "收件人名称", required = true, example = "小王")
@Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小王")
private String name;
@Schema(description = "手机号", required = true, example = "15601691300")
@Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300")
private String mobile;
@Schema(description = "省份编号", required = true, example = "1")
@Schema(description = "省份编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer provinceId;
@Schema(description = "省份名字", required = true, example = "北京")
@Schema(description = "省份名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京")
private String provinceName;
@Schema(description = "城市编号", required = true, example = "1")
@Schema(description = "城市编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer cityId;
@Schema(description = "城市名字", required = true, example = "北京")
@Schema(description = "城市名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京")
private String cityName;
@Schema(description = "地区编号", required = true, example = "1")
@Schema(description = "地区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer districtId;
@Schema(description = "地区名字", required = true, example = "朝阳区")
@Schema(description = "地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "朝阳区")
private String districtName;
@Schema(description = "详细地址", required = true, example = "望京悠乐汇 A 座")
@Schema(description = "详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "望京悠乐汇 A 座")
private String detailAddress;
@Schema(description = "是否默认收件地址", required = true, example = "true")
@Schema(description = "是否默认收件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
private Boolean defaulted;
}

View File

@@ -11,59 +11,33 @@ import java.util.List;
@Data
public class AppTradeOrderItemCommentCreateReqVO {
@Schema(description = "是否匿名", required = true, example = "true")
@Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
@NotNull(message = "是否匿名不能为空")
private Boolean anonymous;
@Schema(description = "交易订单项编号", required = true, example = "2312312")
@Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2312312")
@NotNull(message = "交易订单项编号不能为空")
private Long orderItemId;
// TODO @puhuispuId、spuName、skuId 直接查询出来;
@Schema(description = "商品SPU编号", required = true, example = "29502")
@NotNull(message = "商品SPU编号不能为空")
private Long spuId;
@Schema(description = "商品SPU名称", required = true, example = "丝滑飘逸小短裙")
@NotNull(message = "商品SPU名称不能为空")
private String spuName;
@Schema(description = "商品SKU编号", required = true, example = "3082")
@NotNull(message = "商品SKU编号不能为空")
private Long skuId;
@Schema(description = "评分星级 1-5 分", required = true, example = "5")
@Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
@NotNull(message = "评分星级 1-5 分不能为空")
private Integer scores;
@Schema(description = "描述星级 1-5 分", required = true, example = "5")
@Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
@NotNull(message = "描述星级 1-5 分不能为空")
private Integer descriptionScores;
@Schema(description = "服务星级 1-5 分", required = true, example = "5")
@Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
@NotNull(message = "服务星级 1-5 分不能为空")
private Integer benefitScores;
@Schema(description = "评论内容", required = true, example = "穿身上很漂亮诶(*^▽^*)")
@Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "穿身上很漂亮诶(*^▽^*)")
@NotNull(message = "评论内容不能为空")
private String content;
@Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xx.png]")
@Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xx.png]")
@Size(max = 9, message = "评论图片地址数组长度不能超过 9 张")
private List<String> picUrls;
@Schema(description = "评价人名称", required = true, example = "小姑凉")
@NotNull(message = "评价人名称不能为空")
private String userNickname;
// TODO @puhuiuserAvatar、userAvatar、userId 直接查询出来;
@Schema(description = "评价人头像", required = true, example = "https://www.iocoder.cn/xx.png")
@NotNull(message = "评价人头像不能为空")
private String userAvatar;
@Schema(description = "评价人", required = true, example = "16868")
@NotNull(message = "评价人不能为空")
private Long userId;
}

View File

@@ -10,15 +10,15 @@ import java.util.List;
@Data
public class AppTradeOrderItemRespVO {
@Schema(description = "编号", required = true, example = "1")
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "商品 SPU 编号", required = true, example = "1")
@Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long spuId;
@Schema(description = "商品 SPU 名称", required = true, example = "芋道源码")
@Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码")
private String spuName;
@Schema(description = "商品 SKU 编号", required = true, example = "1")
@Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long skuId;
/**
@@ -26,18 +26,18 @@ public class AppTradeOrderItemRespVO {
*/
private List<AppProductPropertyValueDetailRespVO> properties;
@Schema(description = "商品图片", required = true, example = "https://www.iocoder.cn/1.png")
@Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png")
private String picUrl;
@Schema(description = "购买数量", required = true, example = "1")
@Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer count;
@Schema(description = "是否评价", required = true, example = "true")
@Schema(description = "是否评价", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
private Boolean commentStatus;
// ========== 价格 + 支付基本信息 ==========
@Schema(description = "商品原价(单)", required = true, example = "100")
@Schema(description = "商品原价(单)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer price;
// ========== 营销基本信息 ==========
@@ -46,7 +46,7 @@ public class AppTradeOrderItemRespVO {
// ========== 售后基本信息 ==========
@Schema(description = "售后状态", required = true, example = "1")
@Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer afterSaleStatus;
}

View File

@@ -259,7 +259,17 @@ public interface TradeOrderConvert {
AppTradeOrderItemRespVO convert03(TradeOrderItemDO bean);
ProductCommentCreateReqDTO convert04(AppTradeOrderItemCommentCreateReqVO createReqVO);
@Mapping(target = "skuId", source = "tradeOrderItemDO.skuId")
@Mapping(target = "orderId", source = "tradeOrderItemDO.orderId")
@Mapping(target = "orderItemId", source = "tradeOrderItemDO.id")
@Mapping(target = "scores", source = "createReqVO.scores")
@Mapping(target = "descriptionScores", source = "createReqVO.descriptionScores")
@Mapping(target = "benefitScores", source = "createReqVO.benefitScores")
@Mapping(target = "content", source = "createReqVO.content")
@Mapping(target = "picUrls", source = "createReqVO.picUrls")
@Mapping(target = "anonymous", source = "createReqVO.anonymous")
@Mapping(target = "userId", source = "tradeOrderItemDO.userId")
ProductCommentCreateReqDTO convert04(AppTradeOrderItemCommentCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItemDO);
default TradePriceCalculateReqBO convert(Long userId, AppTradeOrderSettlementReqVO settlementReqVO,
List<TradeCartDO> cartList) {

View File

@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.trade.dal.mysql.order;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -24,4 +25,9 @@ public interface TradeOrderItemMapper extends BaseMapperX<TradeOrderItemDO> {
return selectList(TradeOrderItemDO::getOrderId, orderIds);
}
default TradeOrderItemDO selectOrderItemByIdAndUserId(Long orderItemId, Long loginUserId) {
return selectOne(new LambdaQueryWrapperX<TradeOrderItemDO>()
.eq(TradeOrderItemDO::getId, orderItemId)
.eq(TradeOrderItemDO::getUserId, loginUserId));
}
}

View File

@@ -50,4 +50,10 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
.eqIfPresent(TradeOrderDO::getStatus, status)
.eqIfPresent(TradeOrderDO::getCommentStatus, commentStatus));
}
default TradeOrderDO selectOrderByIdAndUserId(Long orderId, Long loginUserId) {
return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
.eq(TradeOrderDO::getId, orderId)
.eq(TradeOrderDO::getUserId, loginUserId));
}
}

View File

@@ -160,4 +160,21 @@ public interface TradeOrderService {
*/
List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds);
/**
* 得到订单项通过 订单项 id 和用户 id
*
* @param orderItemId 订单项 id
* @param loginUserId 登录用户 id
* @return 得到订单项
*/
TradeOrderItemDO getOrderItemByIdAndUserId(Long orderItemId, Long loginUserId);
/**
* 得到订单通过 id 和 用户 id
*
* @param orderId 订单 id
* @param loginUserId 登录用户 id
* @return 得到订单
*/
TradeOrderDO getOrderByIdAndUserId(Long orderId, Long loginUserId);
}

View File

@@ -565,6 +565,16 @@ public class TradeOrderServiceImpl implements TradeOrderService {
return tradeOrderItemMapper.selectListByOrderId(orderIds);
}
@Override
public TradeOrderItemDO getOrderItemByIdAndUserId(Long orderItemId, Long loginUserId) {
return tradeOrderItemMapper.selectOrderItemByIdAndUserId(orderItemId, loginUserId);
}
@Override
public TradeOrderDO getOrderByIdAndUserId(Long orderId, Long loginUserId) {
return tradeOrderMapper.selectOrderByIdAndUserId(orderId, loginUserId);
}
/**
* 判断指定订单的所有订单项,是不是都售后成功
*