From f15cd7be6470a4f5de2a6a5618aa62053b696b64 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 27 三月 2026 19:31:00 +0800
Subject: [PATCH] feat:预支付支付逻辑处理

---
 DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  137 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 132 insertions(+), 5 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 ebce842..a724b3a 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
@@ -109,6 +109,18 @@
     @Resource
     private IOpenCityService openCityService;
 
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
 
     /**
      * 获取司机端首页订单列表
@@ -789,12 +801,14 @@
             double estimateAmount = orderPrivateCar.getEstimateAmount() == null ? 0D : orderPrivateCar.getEstimateAmount();
             int compareResult = BigDecimal.valueOf(estimateAmount).compareTo(BigDecimal.valueOf(orderPrivateCar.getOrderMoney()));
             if (compareResult > 0) {
+                orderPrivateCar.setState(7);
+                orderPrivateCar.setPrepayStage(4);
                 handlePrepaidRefund(orderPrivateCar, estimateAmount - orderPrivateCar.getOrderMoney());
-                orderPrivateCar.setState(9);
             } else if (compareResult < 0) {
                 orderPrivateCar.setState(7);
+                orderPrivateCar.setPrepayStage(3);
             } else {
-                orderPrivateCar.setState(9);
+                finishPrepaidOrder(orderPrivateCar);
             }
         } else {
             orderPrivateCar.setState(7);
@@ -846,6 +860,17 @@
             }
         }).start();
 
+        if (Integer.valueOf(8).equals(orderPrivateCar.getState()) && Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage())) {
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if (pushMinistryOfTransport) {
+                        pushMinistryOfTransportUtil.operatePay(orderId);
+                    }
+                }
+            }).start();
+        }
+
         OrderPrivateCar finalOrderPrivateCar = orderPrivateCar;
         new Thread(new Runnable() {
             @Override
@@ -862,13 +887,115 @@
     }
 
     /**
-     * 先付订单退款预留逻辑,后续接入真实退款接口
+     * 处理预支付多退退款
      */
-    private void handlePrepaidRefund(OrderPrivateCar orderPrivateCar, Double refundAmount) {
+    private void handlePrepaidRefund(OrderPrivateCar orderPrivateCar, Double refundAmount) throws Exception {
         if (refundAmount == null || refundAmount <= 0) {
             return;
         }
-        // TODO 对接真实退款接口,当前先保留调用入口,避免阻塞订单完成流程
+        Double refundMoney = formatMoney(refundAmount);
+        String refundNo = buildPrepayRefundNo(1, orderPrivateCar.getId());
+        orderPrivateCar.setPrepayRefundNo(refundNo);
+        orderPrivateCar.setPrepayRefundAmount(refundMoney);
+
+        if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
+            UserInfo userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId());
+            if (userInfo != null) {
+                userInfo.setBalance(formatMoney((userInfo.getBalance() == null ? 0D : userInfo.getBalance()) + refundMoney));
+                userInfoMapper.updateById(userInfo);
+                finishPrepaidOrder(orderPrivateCar);
+            }
+            return;
+        }
+
+        PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2);
+        if (paymentRecord == null || ToolUtil.isEmpty(paymentRecord.getCode())) {
+            System.err.println("预支付退款数据异常(privateCarOrderId = " + orderPrivateCar.getId() + ")");
+            return;
+        }
+
+        if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) {
+            Map<String, String> map = payMoneyUtil.wxRefund(paymentRecord.getCode(), refundNo, paymentRecord.getAmount().toString(), refundMoney.toString(), "/base/prepayRefundWXPay");
+            if (!"SUCCESS".equals(map.get("return_code"))) {
+                System.err.println("专车预支付退款申请失败:" + map.get("return_msg"));
+            }
+            return;
+        }
+
+        if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) {
+            try {
+                Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundMoney.toString());
+                if ("10000".equals(map.get("code"))) {
+                    finishPrepaidOrder(orderPrivateCar);
+                } else {
+                    System.err.println("专车预支付退款申请失败:" + map.get("msg"));
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private void finishPrepaidOrder(OrderPrivateCar orderPrivateCar) throws Exception {
+        boolean refunded = Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())
+                && orderPrivateCar.getPrepayRefundAmount() != null
+                && orderPrivateCar.getPrepayRefundAmount() > 0;
+        if (refunded && orderPrivateCar.getPrepayRefundTime() == null) {
+            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车预支付退款", orderPrivateCar.getPrepayRefundAmount(), 1, 1, 1, 1, orderPrivateCar.getId());
+            orderPrivateCar.setPrepayRefundTime(new Date());
+        }
+        orderPrivateCar.setState(8);
+        orderPrivateCar.setPrepayStage(5);
+        orderPrivateCar.setPayMoney(formatMoney(orderPrivateCar.getOrderMoney()));
+
+        if (orderPrivateCar.getRecoveryOrder() == null || orderPrivateCar.getRecoveryOrder() == 0) {
+            Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus()
+                    ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
+            Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, orderMoney);
+            orderPrivateCar.setSplitAllocation(JSON.toJSONString(map));
+        }
+
+        if (orderPrivateCar.getAbnormal() != null && orderPrivateCar.getAbnormal() == 2
+                && orderPrivateCar.getAbnormalStatus() != null && orderPrivateCar.getAbnormalStatus() == 1) {
+            orderPrivateCar.setAbnormalStatus(3);
+            orderPrivateCar.setResponsibilityMoney(new BigDecimal(orderPrivateCar.getOrderMoney()));
+            orderPrivateCar.setResponsibilityType(3);
+            orderPrivateCar.setAbnormalRemark("乘客已完成预支付订单结算,申诉已自动关闭");
+        }
+    }
+
+    private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
+        return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
+    }
+
+    private Double formatMoney(Double money) {
+        return new BigDecimal(money == null ? 0D : money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+    }
+
+    @Override
+    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())) {
+            return;
+        }
+        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundTime())) {
+            return;
+        }
+        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundNo()) && !orderPrivateCar.getPrepayRefundNo().equals(refundNo)) {
+            return;
+        }
+        finishPrepaidOrder(orderPrivateCar);
+        this.updateById(orderPrivateCar);
+        pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
+        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if (pushMinistryOfTransport) {
+                    pushMinistryOfTransportUtil.operatePay(orderId);
+                }
+            }
+        }).start();
     }
 
 

--
Gitblit v1.7.1