From 13378d4aa6192756e87e5851188653820b5021fb Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期四, 09 七月 2026 20:51:22 +0800
Subject: [PATCH] 用户端代为退款

---
 DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 54 insertions(+), 1 deletions(-)

diff --git a/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 08cc508..3ca11cd 100644
--- a/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -22,16 +22,25 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Service
 public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
+
+    private static final String PREPAY_REFUND_PENDING_PREFIX = "PREPAY_REFUND_PENDING:";
 
     @Resource
     private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -122,6 +131,9 @@
 
     @Autowired
     private PayMoneyUtil payMoneyUtil;
+
+    @Resource
+    private RestTemplate internalRestTemplate;
 
 
     /**
@@ -967,7 +979,14 @@
             request.setRefundOutRequestNo(refundNo);
             request.setRefundAmount(toFen(refundMoney));
             request.setRefundDesc("快车预支付多退退款");
-            JSONObject response = CbyzxPayUtil.closePayOrder(request);
+            markPrepayRefundPending(1, orderPrivateCar.getId(), refundNo, refundMoney);
+            JSONObject response;
+            try {
+                response = requestUserServerPrepayRefund(request);
+            } catch (Exception e) {
+                clearPrepayRefundPending(1, orderPrivateCar.getId());
+                throw e;
+            }
             if (isPrepayRefundSuccess(response)) {
                 String responseRefundNo = extractPrepayRefundNo(response);
                 if (ToolUtil.isNotEmpty(responseRefundNo)) {
@@ -975,6 +994,7 @@
                 }
                 finishPrepaidOrder(orderPrivateCar);
             } else {
+                clearPrepayRefundPending(1, orderPrivateCar.getId());
                 System.err.println("快车微信先付退款申请失败:" + extractPrepayRefundMessage(response));
             }
             return;
@@ -1029,6 +1049,36 @@
 
     private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
         return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
+    }
+
+    private String buildPrepayRefundPendingKey(Integer orderType, Integer orderId) {
+        return PREPAY_REFUND_PENDING_PREFIX + orderType + ":" + orderId;
+    }
+
+    private void markPrepayRefundPending(Integer orderType, Integer orderId, String refundNo, Double refundMoney) {
+        JSONObject marker = new JSONObject();
+        marker.put("refundNo", refundNo);
+        marker.put("refundAmount", refundMoney);
+        marker.put("createTime", System.currentTimeMillis());
+        redisTemplate.opsForValue().set(buildPrepayRefundPendingKey(orderType, orderId), marker.toJSONString(), 2, TimeUnit.HOURS);
+    }
+
+    private void clearPrepayRefundPending(Integer orderType, Integer orderId) {
+        redisTemplate.delete(buildPrepayRefundPendingKey(orderType, orderId));
+    }
+
+    private JSONObject requestUserServerPrepayRefund(CbyzxPayUtil.ClosePayOrderRequest request) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+        params.add("outRequestNo", request.getOutRequestNo());
+        params.add("refundOutRequestNo", request.getRefundOutRequestNo());
+        params.add("refundAmount", String.valueOf(request.getRefundAmount()));
+        params.add("refundDesc", request.getRefundDesc());
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
+        String response = internalRestTemplate.postForObject(
+                "http://user-server/base/internal/cbyzxPrepayRefund", requestEntity, String.class);
+        return JSON.parseObject(response);
     }
 
     private Integer toFen(Double amount) {
@@ -1086,9 +1136,11 @@
     public void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception {
         OrderPrivateCar orderPrivateCar = this.selectById(orderId);
         if (orderPrivateCar == null || !Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
+            clearPrepayRefundPending(1, orderId);
             return;
         }
         if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundTime())) {
+            clearPrepayRefundPending(1, orderId);
             return;
         }
         if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundNo()) && !orderPrivateCar.getPrepayRefundNo().equals(refundNo)) {
@@ -1096,6 +1148,7 @@
         }
         finishPrepaidOrder(orderPrivateCar);
         this.updateById(orderPrivateCar);
+        clearPrepayRefundPending(1, orderId);
         pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
         pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
         new Thread(new Runnable() {

--
Gitblit v1.7.1