From df22fbc272a1a8debe24ae037470a7c3fcb06571 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 17 七月 2026 18:21:11 +0800
Subject: [PATCH] 增加退款前的数据校验,防止重复退款

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java |   54 ++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
index eb4fb70..348e439 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -272,6 +272,9 @@
             List<TChargingOrder> upStatusChargingOrder = chargingOrderService.findUpStatusChargingOrder();
             log.info("定时任务执行,查询需要手动修改状态的订单数量:{}", upStatusChargingOrder.size());
             for (TChargingOrder order : upStatusChargingOrder) {
+                if(!order.getCode().contains("CD")){
+                    continue;
+                }
                 Integer status = null;
                 if(2 == order.getStatus()){
                     status = -1;
@@ -295,6 +298,9 @@
             List<TChargingOrder> failedStartupOrder = chargingOrderService.findFailedStartupOrder();
             log.info("定时任务执行,查询到启动失败的订单数量:{}", failedStartupOrder.size());
             for (TChargingOrder order : failedStartupOrder) {
+                if(!order.getCode().contains("CD")){
+                    continue;
+                }
                 log.info("定时任务执行,查询到启动失败的订单:{}", order.getCode());
                 //查询是否有充电信息
                 List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
@@ -352,6 +358,9 @@
             List<TChargingOrder> stoppedOrder = chargingOrderService.findStoppedOrder();
             log.info("定时任务执行,查询到停止中的订单数量:{}", stoppedOrder.size());
             for (TChargingOrder order : stoppedOrder) {
+                if(!order.getCode().contains("CD")){
+                    continue;
+                }
                 log.info("定时任务执行,查询到停止中的订单:{}", order.getCode());
                 TransactionRecord one = transactionRecordService.findOne(order.getCode());
                 if(null != one){
@@ -396,6 +405,9 @@
             List<TChargingOrder> chargingOrder = chargingOrderService.findChargingOrder();
             log.info("定时任务执行,查询到充电中的订单数量:{}", chargingOrder.size());
             for (TChargingOrder order : chargingOrder) {
+                if(!order.getCode().contains("CD")){
+                    continue;
+                }
                 log.info("定时任务执行,查询到充电中的订单:{}", order.getCode());
                 TransactionRecord one = transactionRecordService.findOne(order.getCode());
                 if(null != one && StringUtils.isNotEmpty(one.getResult())){
@@ -444,6 +456,9 @@
             List<TChargingOrder> endChargingOrder = chargingOrderService.findEndChargingOrder();
             log.info("定时任务执行,查询到已结束未退款的订单数量:{}", endChargingOrder.size());
             for (TChargingOrder order : endChargingOrder) {
+                if(!order.getCode().contains("CD")){
+                    continue;
+                }
                 Integer status = null;
                 if(-1 == order.getStatus()){
                     status = 2;
@@ -879,10 +894,10 @@
                                     .eq(TChargingOrder::getAppUserId, order.getAppUserId()));
 
                             //构建退款明细
+                            String refundCode = "CDF" + order.getCode().substring(2);
                             TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                             chargingOrderRefund.setChargingOrderId(order.getId());
-                            SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-                            chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+                            chargingOrderRefund.setRefundCode(refundCode);
                             chargingOrderRefund.setRefundAmount(refundAmount);
                             chargingOrderRefund.setRefundStatus(1);
                             chargingOrderRefund.setPayType(rechargePaymentType);
@@ -908,21 +923,28 @@
                                         .eq(TChargingOrder::getId, order.getId())
                                         .eq(TChargingOrder::getAppUserId, order.getAppUserId()));
                             } else if (1 == rechargePaymentType) {
-                                WxPaymentRefundModel model = new WxPaymentRefundModel();
-                                model.setOut_trade_no(order.getCode());
-                                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
-                                model.setReason("充电完成退款");
-                                model.setNotify_url("/payment/wx/refund/notify");
-                                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-                                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-                                amount.setTotal(getRefundableThirdPayAmount(order).multiply(new BigDecimal(100)).intValue());
-                                amount.setCurrency("CNY");
-                                model.setAmount(amount);
-                                R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
-                                if (200 == result.getCode()) {
+                                Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
+                                Map<String, Object> amount1 = null;
+                                if(null != objectMap && null != objectMap.get("refund_id")){
+                                    amount1 = (Map<String, Object>) objectMap.get("amount");
+                                }else{
+                                    WxPaymentRefundModel model = new WxPaymentRefundModel();
+                                    model.setOut_trade_no(order.getCode());
+                                    model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+                                    model.setReason("充电完成退款");
+                                    model.setNotify_url("/payment/wx/refund/notify");
+                                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+                                    amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+                                    amount.setTotal(getRefundableThirdPayAmount(order).multiply(new BigDecimal(100)).intValue());
+                                    amount.setCurrency("CNY");
+                                    model.setAmount(amount);
+                                    R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
+                                    if (200 == result.getCode()) {
+                                        amount1 = (Map<String, Object>) result.getData().get("amount");
+                                    }
+                                }
+                                if (null != amount1) {
                                     chargingOrderRefundService.save(chargingOrderRefund);
-                                    //???
-                                    Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
                                     Object refund_fee1 = amount1.get("refund_fee");
                                     BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
                                     chargingOrderRefund.setRefundFee(refund_fee);

--
Gitblit v1.7.1