From df3ab7ae2e3f33d9bd910c9e02b09e9497bcfe54 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 28 四月 2026 18:25:19 +0800
Subject: [PATCH] p0功能 小程序

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java |   84 +++++++++++++++++++++++++++++++++---------
 1 files changed, 66 insertions(+), 18 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 f6e065d..85d8976 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
@@ -32,8 +32,11 @@
 import com.ruoyi.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TIntegralRule;
 import com.ruoyi.other.api.domain.TVip;
+import com.ruoyi.other.api.dto.ExchangeCodeConsumeDTO;
 import com.ruoyi.other.api.feignClient.IntegralRuleClient;
+import com.ruoyi.other.api.feignClient.OtherClient;
 import com.ruoyi.other.api.feignClient.VipClient;
+import com.ruoyi.other.api.vo.ExchangeCodeConsumeResultVO;
 import com.ruoyi.payment.api.feignClient.AliPaymentClient;
 import com.ruoyi.payment.api.feignClient.H5AliPaymentClient;
 import com.ruoyi.payment.api.feignClient.WxPaymentClient;
@@ -128,6 +131,9 @@
     private AppUserIntegralChangeClient appUserIntegralChangeClient;
 
     @Resource
+    private OtherClient otherClient;
+
+    @Resource
     private WxPaymentClient wxPaymentClient;
 
     @Resource
@@ -144,6 +150,31 @@
     @Resource
     private RedissonClient redissonClient;
 
+
+
+    private boolean isBalancePayMode(Integer payMethod) {
+        return payMethod != null && (payMethod == 1 || payMethod == 2);
+    }
+
+    private BigDecimal money(BigDecimal amount) {
+        return amount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : amount.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private void recordBalanceRefund(TChargingOrder order, BigDecimal refundAmount, String refundNo) {
+        if (order == null || order.getAppUserId() == null || order.getId() == null
+                || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        ExchangeCodeConsumeDTO refundDTO = new ExchangeCodeConsumeDTO();
+        refundDTO.setUserId(order.getAppUserId());
+        refundDTO.setOrderId(order.getId());
+        refundDTO.setAmount(refundAmount);
+        refundDTO.setRefundNo(refundNo);
+        R<ExchangeCodeConsumeResultVO> result = otherClient.refundExchangeCodeBalance(refundDTO);
+        if (result == null || result.getCode() != 200) {
+            throw new RuntimeException("??????????");
+        }
+    }
 
     @Scheduled(fixedRate = 1000 * 60)
     public void taskOneMinutes() {
@@ -650,11 +681,19 @@
                         //用户推荐奖励
                         chargingOrderService.referralReward(order);
 
-                        //开始构建退款费用
+                        //????????
                         refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
                         if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
                             Integer rechargePaymentType = order.getRechargePaymentType();
-                            //构建退款明细
+                            BigDecimal thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
+                            order.setThirdRefundAmount(thirdRefundAmount);
+                            order.setBalanceRefundAmount(balanceRefundAmount);
+                            order.setRefundAmount(refundAmount);
+                            order.setRefundStatus(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2);
+                            chargingOrderService.updateById(order);
+                            //??????
                             TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                             chargingOrderRefund.setChargingOrderId(order.getId());
                             SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@@ -662,29 +701,28 @@
                             chargingOrderRefund.setRefundAmount(refundAmount);
                             chargingOrderRefund.setRefundStatus(1);
                             chargingOrderRefund.setPayType(rechargePaymentType);
-                            chargingOrderRefund.setRefundStatus(1);
                             chargingOrderRefund.setCode(order.getCode());
-                            chargingOrderRefund.setRefundTitle("充电完成退款");
-                            chargingOrderRefund.setRefundContent("充电完成退款");
-                            chargingOrderRefund.setRefundReason("充电完成退款");
-                            chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
+                            chargingOrderRefund.setRefundTitle("??????");
+                            chargingOrderRefund.setRefundContent("??????");
+                            chargingOrderRefund.setRefundReason("??????");
+                            chargingOrderRefund.setRefundRemark("?????????" + order.getPaymentAmount());
                             chargingOrderRefund.setRefundTotalAmount(refundAmount);
                             chargingOrderRefund.setPayAmount(rechargeAmount);
-                            if (1 == rechargePaymentType) {
+                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                                 WxPaymentRefundModel model = new WxPaymentRefundModel();
                                 model.setOut_trade_no(order.getCode());
                                 model.setOut_refund_no(chargingOrderRefund.getRefundCode());
-                                model.setReason("充电完成退款");
+                                model.setReason("??????");
                                 model.setNotify_url("/payment/wx/refund/notify");
                                 WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-                                amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
-                                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+                                amount.setTotal((isBalancePayMode(order.getPayMethod()) ? money(order.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
                                 amount.setCurrency("CNY");
                                 model.setAmount(amount);
                                 R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                                 if (200 == result.getCode()) {
                                     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));
@@ -692,30 +730,40 @@
                                     chargingOrderRefundService.updateById(chargingOrderRefund);
                                 }
                             }
-                            if (2 == rechargePaymentType) {
+                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
                                 RefundReq dto = new RefundReq();
                                 dto.setOutTradeNo(order.getCode());
                                 dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                                dto.setRefundAmount(refundAmount.toString());
-                                dto.setRefundReason("充电完成退款");
+                                dto.setRefundAmount(thirdRefundAmount.toString());
+                                dto.setRefundReason("??????");
                                 RefundResp resp = aliPaymentClient.refund(dto).getData();
                                 if (null != resp) {
                                     chargingOrderRefundService.save(chargingOrderRefund);
                                     chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                 }
                             }
-                            if (3 == rechargePaymentType) {
+                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
                                 RefundReq dto = new RefundReq();
                                 dto.setOutTradeNo(order.getRechargeSerialNumber());
                                 dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                                dto.setRefundAmount(refundAmount.toString());
-                                dto.setRefundReason("充电完成退款");
+                                dto.setRefundAmount(thirdRefundAmount.toString());
+                                dto.setRefundReason("??????");
                                 RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                                 if (null != resp && "10000".equals(resp.getCode())) {
                                     chargingOrderRefundService.save(chargingOrderRefund);
                                     chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                 }
                             }
+                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0 && balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
+                                chargingOrderRefund.setRefundStatus(2);
+                                chargingOrderRefund.setRefundSerialNumber("BALANCE");
+                                chargingOrderRefund.setRefundTime(LocalDateTime.now());
+                                chargingOrderRefundService.save(chargingOrderRefund);
+                                recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
+                                order.setRefundStatus(2);
+                                order.setRefundTime(LocalDateTime.now());
+                                chargingOrderService.updateById(order);
+                            }
                         }
                     }
 

--
Gitblit v1.7.1