浏览代码

修改代码

jinshihui 3 天之前
父节点
当前提交
ffa2d75bf6

+ 4 - 3
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductOrderController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.massage.domain.ProductOrderInfo;
 import com.ylx.massage.domain.dto.*;
 import com.ylx.massage.domain.vo.*;
@@ -86,13 +87,13 @@ public class ProductOrderController extends BaseController {
      *
      * @param openId  用户openId
      * @param orderNo 订单编号
-     * @return R<ProductOrderDetailVo> 订单详情
+     * @return R<ProductOrderDetailResponse> 订单详情
      */
     @GetMapping("/detail")
-    public R<ProductOrderDetailVo> getProductOrderDetail(@RequestParam("openId") String openId, @RequestParam("orderNo") String orderNo) {
+    public R<ProductOrderDetailResponse> getProductOrderDetail(@RequestParam("openId") String openId, @RequestParam("orderNo") String orderNo) {
         try {
             log.info("查询商品订单详情,openId:{},订单编号:{}", openId, orderNo);
-            ProductOrderDetailVo detail = productOrderInfoService.getProductOrderDetail(orderNo, openId);
+            ProductOrderDetailResponse detail = productOrderInfoService.getProductOrderDetail(orderNo, openId);
             return R.ok(detail);
         } catch (Exception e) {
             log.error("查询商品订单详情失败:{}", e.getMessage(), e);

+ 1 - 7
nightFragrance-massage/src/main/java/com/ylx/massage/domain/AfterSaleOrder.java

@@ -27,15 +27,9 @@ public class AfterSaleOrder implements Serializable {
     /** 用户openId */
     private String openId;
 
-    /**
-     * 收货状态
-     * 1未收货 2已收货
-     */
-    private Integer receiptStatus;
-
     /**
      * 售后类型
-     * 1退货 2换货
+     * 1退货 2换货 3:未收到货
      */
     private Integer afterSaleType;
 

+ 135 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/AfterSaleInfoVo.java

@@ -0,0 +1,135 @@
+package com.ylx.massage.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 售后信息VO
+ */
+@Data
+public class AfterSaleInfoVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 售后单号
+     */
+    private String afterSaleNo;
+
+    /**
+     * 原订单ID
+     */
+    private Long orderId;
+
+    /**
+     * 原订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 收货状态(1未收货 2已收货)
+     */
+    private Integer receiptStatus;
+
+    /**
+     * 售后类型(1退货 2换货)
+     */
+    private Integer afterSaleType;
+
+    /**
+     * 售后类型描述
+     */
+    private String afterSaleTypeName;
+
+    /**
+     * 售后状态(0待审核 1审核通过 2审核拒绝 3待买家退货 4待商家收货 5退款处理中 6售后完成)
+     */
+    private Integer afterSaleStatus;
+
+    /**
+     * 售后状态描述
+     */
+    private String afterSaleStatusName;
+
+    /**
+     * 申请原因
+     */
+    private String applyReason;
+
+    /**
+     * 问题描述
+     */
+    private String applyDesc;
+
+    /**
+     * 凭证图片URL
+     */
+    private String applyImages;
+
+    /**
+     * 申请退款金额(分)
+     */
+    private Integer applyAmount;
+
+    /**
+     * 实际退款金额(分)
+     */
+    private Integer actualRefundAmount;
+
+    /**
+     * 退款方式(1原路退回 2退至余额)
+     */
+    private Integer refundType;
+
+    /**
+     * 审核时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime auditTime;
+
+    /**
+     * 审核备注
+     */
+    private String auditRemark;
+
+    /**
+     * 拒绝原因(1超过售后期限 2不符合售后条件 3凭证不足 4其他)
+     */
+    private Integer rejectReason;
+
+    /**
+     * 退款完成时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime refundTime;
+
+    /**
+     * 换货新订单编号
+     */
+    private String exchangeOrderNo;
+
+    /**
+     * 售后完成时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime finishTime;
+
+    /**
+     * 退货快递单号
+     */
+    private String logisticsNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+}

+ 153 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/OrderInfoVo.java

@@ -0,0 +1,153 @@
+package com.ylx.massage.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 订单信息VO
+ */
+@Data
+public class OrderInfoVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单ID
+     */
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 用户openId
+     */
+    private String openId;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+
+    /**
+     * 订单状态描述
+     */
+    private String orderStatusName;
+
+    /**
+     * 买家备注
+     */
+    private String buyerRemark;
+
+    /**
+     * 配送方式
+     */
+    private Integer deliveryType;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    // ========== 支付信息 ==========
+
+    /**
+     * 支付状态
+     */
+    private Integer payStatus;
+
+    /**
+     * 支付方式
+     */
+    private Integer payType;
+
+    /**
+     * 支付时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime payTime;
+
+    /**
+     * 支付过期时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime payExpireTime;
+
+    /**
+     * 剩余秒数
+     */
+    private Long remainSeconds;
+
+    /**
+     * 商品总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 优惠金额
+     */
+    private BigDecimal discountAmount;
+
+    /**
+     * 运费
+     */
+    private BigDecimal freightAmount;
+
+    /**
+     * 实付金额
+     */
+    private BigDecimal payAmount;
+
+    /**
+     * 使用积分数量
+     */
+    private Integer pointsUsed;
+
+    // ========== 地址信息 ==========
+
+    /**
+     * 收货人姓名
+     */
+    private String receiverName;
+
+    /**
+     * 收货人手机号
+     */
+    private String receiverPhone;
+
+    /**
+     * 地址名称
+     */
+    private String addressName;
+
+    // ========== 物流信息 ==========
+
+    /**
+     * 快递公司
+     */
+    private String logisticsCompany;
+
+    /**
+     * 快递单号
+     */
+    private String logisticsNo;
+
+    /**
+     * 发货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime deliveryTime;
+
+    /**
+     * 确认收货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime receiveTime;
+}

+ 39 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductInfoVo.java

@@ -0,0 +1,39 @@
+package com.ylx.massage.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 商品信息VO
+ */
+@Data
+public class ProductInfoVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * SKU规格信息
+     */
+    private String skuSpec;
+
+    /**
+     * SKU图片
+     */
+    private String skuImage;
+
+    /**
+     * 商品的付款类型(1:积分 2:金额 3:积分+金额)
+     */
+    private Integer paymentType;
+}

+ 29 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOrderDetailResponse.java

@@ -0,0 +1,29 @@
+package com.ylx.massage.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 商品订单详情响应包装类
+ */
+@Data
+public class ProductOrderDetailResponse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品信息
+     */
+    private ProductInfoVo productInfo;
+
+    /**
+     * 订单信息
+     */
+    private OrderInfoVo orderInfo;
+
+    /**
+     * 售后信息(无售后信息时为空对象)
+     */
+    private AfterSaleInfoVo afterSaleInfo;
+}

+ 12 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/enums/AfterSaleStatusEnum.java

@@ -29,4 +29,16 @@ public enum AfterSaleStatusEnum {
         this.code = code;
         this.desc = desc;
     }
+
+    public static String getDescByCode(Integer code) {
+        if (code == null) {
+            return "";
+        }
+        for (AfterSaleStatusEnum value : AfterSaleStatusEnum.values()) {
+            if (value.getCode().equals(code)) {
+                return value.getDesc();
+            }
+        }
+        return "";
+    }
 }

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/IProductOrderInfoService.java

@@ -43,9 +43,9 @@ public interface IProductOrderInfoService extends IService<ProductOrderInfo> {
      *
      * @param orderNo 订单编号
      * @param openId 用户openId
-     * @return 订单详情
+     * @return 订单详情(结构化响应)
      */
-    ProductOrderDetailVo getProductOrderDetail(String orderNo, String openId);
+    ProductOrderDetailResponse getProductOrderDetail(String orderNo, String openId);
 
     /**
      * 取消订单

+ 133 - 8
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductOrderInfoServiceImpl.java

@@ -15,9 +15,11 @@ import com.ylx.common.utils.SecurityUtils;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.*;
 import com.ylx.massage.domain.vo.*;
+import com.ylx.massage.enums.AfterSaleStatusEnum;
 import com.ylx.massage.enums.BillTypeEnum;
 import com.ylx.massage.enums.PaymentStatusEnum;
 import com.ylx.massage.enums.ProductOrderStatusEnum;
+import com.ylx.massage.mapper.AfterSaleOrderMapper;
 import com.ylx.massage.mapper.ProductMapper;
 import com.ylx.massage.mapper.ProductOrderInfoMapper;
 import com.ylx.massage.mapper.ProductOrderItemMapper;
@@ -65,6 +67,10 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
 
     @Autowired
     private ProductSkuMapper productSkuMapper;
+
+    @Autowired
+    private AfterSaleOrderMapper afterSaleOrderMapper;
+
     @Resource
     private IAfterSaleOrderService afterSaleOrderService;
     @Resource
@@ -335,10 +341,10 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
      *
      * @param orderNo 订单编号
      * @param openId  用户openId
-     * @return ProductOrderDetailVo 订单详情
+     * @return ProductOrderDetailResponse 订单详情(结构化响应)
      */
     @Override
-    public ProductOrderDetailVo getProductOrderDetail(String orderNo, String openId) {
+    public ProductOrderDetailResponse getProductOrderDetail(String orderNo, String openId) {
         if (StringUtils.isBlank(openId)) {
             throw new ServiceException("用户openId不能为空");
         }
@@ -349,14 +355,133 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         if (detail == null) {
             throw new ServiceException("订单不存在");
         }
-        detail.setOrderStatusName(ProductOrderStatusEnum.getDescByCode(detail.getOrderStatus()));
-        //根据商品ID查询商品的付款类型
+
+        // 构建商品信息
+        ProductInfoVo productInfo = buildProductInfo(detail);
+        // 构建订单信息
+        OrderInfoVo orderInfo = buildOrderInfo(detail);
+        // 查询并构建售后信息
+        AfterSaleInfoVo afterSaleInfo = buildAfterSaleInfo(detail.getId());
+        // 组装响应
+        ProductOrderDetailResponse response = new ProductOrderDetailResponse();
+        response.setProductInfo(productInfo);
+        response.setOrderInfo(orderInfo);
+        response.setAfterSaleInfo(afterSaleInfo);
+        return response;
+    }
+
+    /**
+     * 构建商品信息
+     */
+    private ProductInfoVo buildProductInfo(ProductOrderDetailVo detail) {
+        ProductInfoVo productInfo = new ProductInfoVo();
+        productInfo.setProductId(detail.getProductId());
+        productInfo.setProductName(detail.getProductName());
+        productInfo.setSkuSpec(detail.getSkuSpec());
+        productInfo.setSkuImage(detail.getSkuImage());
+        // 根据商品ID查询商品的付款类型
         Product product = productMapper.selectById(detail.getProductId());
-        detail.setPaymentType(product.getPaymentType());
+        if (product != null) {
+            productInfo.setPaymentType(product.getPaymentType());
+        }
+        return productInfo;
+    }
+
+    /**
+     * 构建订单信息
+     */
+    private OrderInfoVo buildOrderInfo(ProductOrderDetailVo detail) {
+        OrderInfoVo orderInfo = new OrderInfoVo();
+        // 基础订单信息
+        orderInfo.setId(detail.getId());
+        orderInfo.setOrderNo(detail.getOrderNo());
+        orderInfo.setOpenId(detail.getOpenId());
+        orderInfo.setOrderStatus(detail.getOrderStatus());
+        orderInfo.setOrderStatusName(ProductOrderStatusEnum.getDescByCode(detail.getOrderStatus()));
+        orderInfo.setBuyerRemark(detail.getBuyerRemark());
+        orderInfo.setDeliveryType(detail.getDeliveryType());
+        orderInfo.setCreateTime(detail.getCreateTime());
+
+        // 支付信息
+        orderInfo.setPayStatus(detail.getPayStatus());
+        orderInfo.setPayType(detail.getPayType());
+        orderInfo.setPayTime(detail.getPayTime());
+        orderInfo.setPayExpireTime(detail.getPayExpireTime());
         // 计算剩余秒数
-        long remainSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), detail.getPayExpireTime());
-        detail.setRemainSeconds(remainSeconds);
-        return detail;
+        if (detail.getPayExpireTime() != null) {
+            long remainSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), detail.getPayExpireTime());
+            orderInfo.setRemainSeconds(remainSeconds);
+        }
+        orderInfo.setTotalAmount(detail.getTotalAmount());
+        orderInfo.setDiscountAmount(detail.getDiscountAmount());
+        orderInfo.setFreightAmount(detail.getFreightAmount());
+        orderInfo.setPayAmount(detail.getPayAmount());
+        orderInfo.setPointsUsed(detail.getPointsUsed());
+
+        // 地址信息
+        orderInfo.setReceiverName(detail.getReceiverName());
+        orderInfo.setReceiverPhone(detail.getReceiverPhone());
+        orderInfo.setAddressName(detail.getAddressName());
+
+        // 物流信息
+        orderInfo.setLogisticsCompany(detail.getLogisticsCompany());
+        orderInfo.setLogisticsNo(detail.getLogisticsNo());
+        orderInfo.setDeliveryTime(detail.getDeliveryTime());
+        orderInfo.setReceiveTime(detail.getReceiveTime());
+        return orderInfo;
+    }
+
+    /**
+     * 构建售后信息
+     *
+     * @param orderId 订单ID
+     * @return AfterSaleInfoVo 售后信息
+     */
+    private AfterSaleInfoVo buildAfterSaleInfo(Long orderId) {
+        AfterSaleInfoVo afterSaleInfo = new AfterSaleInfoVo();
+        // 查询售后订单
+        LambdaQueryWrapper<AfterSaleOrder> queryWrapper = new LambdaQueryWrapper<AfterSaleOrder>()
+                .eq(AfterSaleOrder::getOrderId, orderId)
+                .orderByDesc(AfterSaleOrder::getCreateTime)
+                .last("LIMIT 1");
+        AfterSaleOrder afterSaleOrder = afterSaleOrderMapper.selectOne(queryWrapper);
+
+        if (afterSaleOrder != null) {
+            afterSaleInfo.setAfterSaleNo(afterSaleOrder.getAfterSaleNo());
+            afterSaleInfo.setOrderId(afterSaleOrder.getOrderId());
+            afterSaleInfo.setOrderNo(afterSaleOrder.getOrderNo());
+            afterSaleInfo.setAfterSaleType(afterSaleOrder.getAfterSaleType());
+            afterSaleInfo.setAfterSaleTypeName(getAfterSaleTypeName(afterSaleOrder.getAfterSaleType()));
+            afterSaleInfo.setAfterSaleStatus(afterSaleOrder.getAfterSaleStatus());
+            afterSaleInfo.setAfterSaleStatusName(AfterSaleStatusEnum.getDescByCode(afterSaleOrder.getAfterSaleStatus()));
+            afterSaleInfo.setApplyReason(afterSaleOrder.getApplyReason());
+            afterSaleInfo.setApplyDesc(afterSaleOrder.getApplyDesc());
+            afterSaleInfo.setApplyImages(afterSaleOrder.getApplyImages());
+            afterSaleInfo.setApplyAmount(afterSaleOrder.getApplyAmount());
+            afterSaleInfo.setActualRefundAmount(afterSaleOrder.getActualRefundAmount());
+            afterSaleInfo.setRefundType(afterSaleOrder.getRefundType());
+            afterSaleInfo.setAuditTime(afterSaleOrder.getAuditTime());
+            afterSaleInfo.setAuditRemark(afterSaleOrder.getAuditRemark());
+            afterSaleInfo.setRejectReason(afterSaleOrder.getRejectReason());
+            afterSaleInfo.setRefundTime(afterSaleOrder.getRefundTime());
+            afterSaleInfo.setExchangeOrderNo(afterSaleOrder.getExchangeOrderNo());
+            afterSaleInfo.setFinishTime(afterSaleOrder.getFinishTime());
+            afterSaleInfo.setLogisticsNo(afterSaleOrder.getLogisticsNo());
+            afterSaleInfo.setRemark(afterSaleOrder.getRemark());
+            afterSaleInfo.setCreateTime(afterSaleOrder.getCreateTime());
+        }
+        // 如果没有售后信息,返回空对象(Spring会自动初始化为空对象而非null)
+        return afterSaleInfo;
+    }
+
+    /**
+     * 获取售后类型名称
+     */
+    private String getAfterSaleTypeName(Integer afterSaleType) {
+        if (afterSaleType == null) {
+            return "";
+        }
+        return afterSaleType == 1 ? "退货" : "换货";
     }