From 227b029030818925089cbe91dc1288594a5d4aa9 Mon Sep 17 00:00:00 2001
From: xin <1099200748@qq.com>
Date: Thu, 21 Aug 2025 14:28:58 +0800
Subject: [PATCH] 退款订单

---
 oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java |  196 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 172 insertions(+), 24 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java
index f8fe21d..1d6d032 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java
@@ -1,27 +1,34 @@
 package com.oying.modules.sh.service.impl;
 
+import com.oying.exception.BadRequestException;
+import com.oying.modules.hwc.service.SwiftPassService;
+import com.oying.modules.sh.domain.Order;
+import com.oying.modules.sh.domain.OrderProductSnapshot;
 import com.oying.modules.sh.domain.OrderReturn;
+import com.oying.modules.sh.domain.OrderReturnProductSnapshot;
 import com.oying.modules.sh.domain.request.AuditOrderReturn;
-import com.oying.utils.FileUtil;
+import com.oying.modules.sh.domain.request.ProductOrder;
+import com.oying.modules.sh.domain.request.ReturnOrder;
+import com.oying.modules.sh.domain.vo.OrderResponse;
+import com.oying.modules.sh.domain.vo.OrderReturnResponse;
+import com.oying.modules.sh.service.*;
+import com.oying.utils.*;
+import com.oying.utils.enums.GenerateEnum;
+import com.oying.utils.enums.OrderStatusEnum;
+import com.oying.utils.enums.PayTypeEnum;
 import com.oying.utils.enums.ReturnAuditEnum;
 import lombok.RequiredArgsConstructor;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.oying.modules.sh.service.OrderReturnService;
 import com.oying.modules.sh.domain.dto.OrderReturnQueryCriteria;
 import com.oying.modules.sh.mapper.OrderReturnMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.oying.utils.PageUtil;
 
-import java.util.List;
-import java.util.Map;
+import java.sql.Timestamp;
+import java.util.*;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-
-import com.oying.utils.PageResult;
 
 /**
  * @author lixin
@@ -33,6 +40,15 @@
 public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, OrderReturn> implements OrderReturnService {
 
     private final OrderReturnMapper orderReturnMapper;
+    private final OrderOperationLogService operationLogService;
+    private final OrderService orderService;
+    private final OrderReturnProductSnapshotService productSnapshotService;
+    private final RedisUtils redisUtils;
+    private final SwiftPassService swiftPassService;
+    private final OrderAddressSnapshotService addressSnapshotService;
+    private static final String ORDER_RETURN_KEY = "oying:order:refund";
+    private static final String ORDER_CODE = "REFUND";
+    public static final Integer DAY = 30;
 
     @Override
     public PageResult<OrderReturn> queryAll(OrderReturnQueryCriteria criteria, Page<Object> page) {
@@ -48,19 +64,115 @@
     }
 
     @Override
-    public OrderReturn getByReturnNum(String returnNum) {
-        return orderReturnMapper.getByReturnNum(returnNum);
+    public OrderReturnResponse getByReturnNum(String returnNum) {
+        OrderReturn orderReturn = orderReturnMapper.getByReturnNum(returnNum);
+        return new OrderReturnResponse(orderReturn,
+                addressSnapshotService.queryByOrderNum(orderReturn.getOrderNum()),
+                operationLogService.getByOrderNum(orderReturn.getOrderNum(), ORDER_CODE));
     }
 
     @Override
-    public void updatePayStatus(String returnNum, String status, String time) {
-        orderReturnMapper.updatePayStatus(returnNum, status, time);
+    public void updatePayStatus(String returnNum, String refundStatus, String successTime) {
+        orderReturnMapper.updatePayStatus(returnNum, refundStatus, successTime);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void create(OrderReturn resources) {
-        orderReturnMapper.insert(resources);
+    public synchronized void create(ReturnOrder resources) {
+        Order order = orderService.queryByOrderNum(resources.getOrderNum());
+        if (order == null) {
+            throw new BadRequestException("订单不存在!");
+        }
+        if (Objects.equals(order.getOrderStatus(), OrderStatusEnum.ZERO.getKey())) {
+            throw new BadRequestException("订单未支付");
+        }
+        OrderReturn returnOrder1 = orderReturnMapper.getByOrderNum(resources.getOrderNum(), ReturnAuditEnum.ZERO.getKey());
+        if (returnOrder1 != null) {
+            throw new BadRequestException("退款订单已提交");
+        }
+        OrderReturn returnOrder2 = orderReturnMapper.getByOrderNum(resources.getOrderNum(), ReturnAuditEnum.TWO.getKey());
+        if (returnOrder2 != null) {
+            throw new BadRequestException("退款订单已处理");
+        }
+        if (!DateUtil.isBefore(order.getPayTime(), DAY)) {
+            throw new BadRequestException("订单已超过售后有效期");
+        }
+        // 退款订单
+        OrderReturn returnOrder = new OrderReturn();
+        // 退款订单号
+        String returnNum = redisUtils.generateSn(ORDER_RETURN_KEY, GenerateEnum.ORDER_RETURN.getKey());
+        returnOrder.setReturnNum(returnNum);
+        returnOrder.setReturnStatus(ReturnAuditEnum.ZERO.getKey());
+        returnOrder.setReturnStatusDescribe(ReturnAuditEnum.ZERO.getValue());
+        returnOrder.setOrderNum(resources.getOrderNum());
+        returnOrder.setOrderTime(order.getOrderTime());
+        returnOrder.setOrderStoreNum(order.getOrderStoreNum());
+        returnOrder.setPackagingPrice(order.getPackagingPrice());
+        returnOrder.setSendPrice(order.getSendPrice());
+        returnOrder.setSendType(order.getSendType() != null ? order.getSendType() : null);
+        returnOrder.setRiderId(order.getRiderId() != null ? order.getRiderId() : null);
+        returnOrder.setRiderPhone(order.getRiderPhone() != null ? order.getRiderPhone() : null);
+        returnOrder.setRiderName(order.getRiderName() != null ? order.getRiderName() : null);
+        returnOrder.setPayType(order.getPayType());
+        returnOrder.setUserId(order.getUserId());
+        returnOrder.setUsername(order.getUsername());
+        returnOrder.setStoreId(order.getStoreId());
+        returnOrder.setStoreName(order.getStoreName());
+        returnOrder.setStoreLogo(order.getStoreLogo());
+        returnOrder.setOriginalPrice(order.getOriginalPrice());
+        returnOrder.setPaidPrice(order.getPaidPrice());
+        returnOrder.setActuallyPayPrice(order.getActuallyPayPrice());
+        returnOrder.setReason(resources.getReason());
+        returnOrder.setRemark(resources.getRemark());
+        returnOrder.setPhotos(resources.getPhotos());
+        returnOrder.setAuditStatus(ReturnAuditEnum.ZERO.getKey());
+        orderReturnMapper.insert(returnOrder);
+        List<OrderReturnProductSnapshot> productSnapshots = new ArrayList<>();
+        for (ProductOrder productOrder : resources.getProductOrders()) {
+            for (OrderProductSnapshot snapshot : order.getProductSnapshots()) {
+                if (productOrder.getProductId().equals(snapshot.getProductId())) {
+                    OrderReturnProductSnapshot productSnapshot = getSnapshot(snapshot, returnNum);
+                    productSnapshots.add(productSnapshot);
+                }
+            }
+        }
+        productSnapshotService.saveBatch(productSnapshots);
+    }
+
+    private static OrderReturnProductSnapshot getSnapshot(OrderProductSnapshot snapshot, String returnNum) {
+        OrderReturnProductSnapshot productSnapshot = new OrderReturnProductSnapshot();
+        productSnapshot.setReturnNum(returnNum);
+        productSnapshot.setStoreId(snapshot.getStoreId());
+        productSnapshot.setProductId(snapshot.getProductId());
+        productSnapshot.setProductCode(snapshot.getProductCode() != null ? snapshot.getProductCode() : null);
+        productSnapshot.setProductBarcode(snapshot.getProductBarcode());
+        productSnapshot.setProductName(snapshot.getProductName());
+        productSnapshot.setProductTitle(snapshot.getProductTitle());
+        productSnapshot.setProductMainImage(snapshot.getProductMainImage());
+        productSnapshot.setProductDescription(snapshot.getProductDescription());
+        productSnapshot.setParamData(snapshot.getParamData() != null ? snapshot.getParamData() : null);
+        productSnapshot.setUnitPrice(snapshot.getUnitPrice());
+        productSnapshot.setDetailCount(snapshot.getDetailCount());
+        productSnapshot.setOriginalPrice(snapshot.getOriginalPrice());
+        productSnapshot.setPaidPrice(snapshot.getPaidPrice());
+        productSnapshot.setActuallyPayPrice(snapshot.getActuallyPayPrice());
+        return productSnapshot;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancel(String returnNum) {
+        OrderReturn orderReturn = orderReturnMapper.getByReturnNum(returnNum);
+        if (orderReturn == null) {
+            throw new BadRequestException("订单不存在!");
+        }
+        if (!orderReturn.getUserId().equals(SecurityUtils.getCurrentUserId())) {
+            throw new BadRequestException("不能修改他人订单");
+        }
+        orderReturnMapper.updateStatus(returnNum, OrderStatusEnum.FIFTEEN.getKey(), OrderStatusEnum.FIFTEEN.getValue(),
+                ReturnAuditEnum.THREE.getKey());
+        OrderResponse response = orderService.getByOrderNum(orderReturn.getOrderNum());
+        operationLogService.create(response, OrderStatusEnum.FIFTEEN, null);
     }
 
     @Override
@@ -73,14 +185,50 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void audit(AuditOrderReturn resources) {
-
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void deleteAll(List<Long> ids) {
-        orderReturnMapper.deleteBatchIds(ids);
+    public synchronized void audit(AuditOrderReturn resources) {
+        OrderReturn orderReturn = orderReturnMapper.getByReturnNum(resources.getReturnNum());
+        if (orderReturn == null) {
+            throw new BadRequestException("订单不存在!");
+        }
+        if (!Objects.equals(orderReturn.getReturnStatus(), ReturnAuditEnum.ZERO.getKey())) {
+            throw new BadRequestException("订单已处理或取消");
+        }
+        if (resources.getAmount().compareTo(orderReturn.getActuallyPayPrice()) > 0) {
+            throw new BadRequestException("退款金额超过订单金额");
+        }
+        switch (resources.getAuditStatus()) {
+            case ONE:
+                break;
+            case TWO:
+                long total = BigDecimalUtils.yuanToCents(orderReturn.getActuallyPayPrice());
+                long refund = BigDecimalUtils.yuanToCents(resources.getAmount());
+                orderReturn.setRefundPrice(resources.getAmount());
+                PayTypeEnum status = PayTypeEnum.find(orderReturn.getPayType());
+                switch (status) {
+                    case HWC:
+                    case HWC2:
+                        if (refund > 0) {
+                            Map<String, String> re = swiftPassService.refund(orderReturn.getReturnNum(), orderReturn.getOrderNum(),
+                                    resources.getMessage(), refund, total, status);
+                            orderReturn.setChannel(re.get("refund_channel"));
+                        }
+                        break;
+                    default:
+                        throw new BadRequestException("暂未开通其余支付模式");
+                }
+                break;
+            default:
+                throw new BadRequestException("审核状态错误");
+        }
+        // 审核状态
+        orderReturn.setAuditStatus(resources.getAuditStatus().getKey());
+        // 审核人
+        orderReturn.setAuditUser(SecurityUtils.getCurrentUsername());
+        // 审核时间
+        orderReturn.setAuditTime(new Timestamp(System.currentTimeMillis()));
+        // 审核信息
+        orderReturn.setAuditMessage(resources.getMessage());
+        orderReturnMapper.updateById(orderReturn);
     }
 
     @Override
@@ -99,7 +247,7 @@
             map.put("退款状态", orderReturn.getRefundStatus());
             map.put("退款成功时间", orderReturn.getSuccessTime());
             map.put("退款渠道", orderReturn.getChannel());
-            map.put("退款原因", orderReturn.getReason());
+            map.put("退货类型", orderReturn.getReason());
             map.put("备注", orderReturn.getRemark());
             map.put("图片", orderReturn.getPhotos());
             map.put("审核状态", ReturnAuditEnum.getValue(orderReturn.getAuditStatus()));

--
Gitblit v1.9.3