mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-14 02:01:53 +08:00
fix:完善商品评论 review 提到的问题
This commit is contained in:
@@ -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 合并代码后发现只有商家回复功能 用户追评不要了吗?不要了哈;
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
}
|
||||
|
@@ -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 @puhui:spuId、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 @puhui:userAvatar、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;
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断指定订单的所有订单项,是不是都售后成功
|
||||
*
|
||||
|
Reference in New Issue
Block a user