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

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  104 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 67 insertions(+), 37 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 31e5fea..118a94b 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -639,7 +639,7 @@
 		}
 		accountingStrategyDetailOrderService.saveBatch(list1);
 		
-		if (balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
+		if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
 			changeUserBalance(userId, balancePayAmount.negate());
 		}
 		if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
@@ -703,6 +703,15 @@
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
 		if (chargingOrder.getRechargePaymentStatus() == 2) {
 			return AjaxResult.success();
+		}
+		if (isBalancePayMode(chargingOrder.getPayMethod())
+				&& money(chargingOrder.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
+				&& money(chargingOrder.getBalancePayAmount()).compareTo(BigDecimal.ZERO) > 0) {
+			TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+			if (money(appUser.getBalance()).compareTo(money(chargingOrder.getBalancePayAmount())) < 0) {
+				throw new RuntimeException("余额不足,支付回调处理失败");
+			}
+			changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate());
 		}
 		chargingOrder.setRechargePaymentStatus(2);
 		chargingOrder.setRechargeSerialNumber(transaction_id);
@@ -1101,15 +1110,24 @@
             if(tryLock){
                 log.info(code + ":-------------------充电启动失败,执行退款-------------------");
                 TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
-                if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) {
+                if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2
+                        && (chargingOrder.getRefundStatus() == null || chargingOrder.getRefundStatus() != 2)) {
                     Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
-                    BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+                    BigDecimal rechargeAmount = money(chargingOrder.getRechargeAmount());
+                    BigDecimal totalRefundAmount = isBalancePayMode(chargingOrder.getPayMethod())
+                            ? money(chargingOrder.getBalancePayAmount()).add(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP)
+                            : rechargeAmount;
+                    BigDecimal thirdRefundAmount = totalRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                    if (!isBalancePayMode(chargingOrder.getPayMethod())) {
+                        thirdRefundAmount = totalRefundAmount;
+                    }
+                    BigDecimal balanceRefundAmount = totalRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                     //构建退款明细
                     TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                     chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                     chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
-                    chargingOrderRefund.setRefundAmount(rechargeAmount);
+                    chargingOrderRefund.setRefundAmount(totalRefundAmount);
                     chargingOrderRefund.setRefundStatus(1);
                     chargingOrderRefund.setPayType(rechargePaymentType);
                     chargingOrderRefund.setRefundStatus(1);
@@ -1118,8 +1136,25 @@
                     chargingOrderRefund.setRefundContent("充电失败");
                     chargingOrderRefund.setRefundReason("充电失败");
                     chargingOrderRefund.setRefundRemark("全额退款");
-                    chargingOrderRefund.setRefundTotalAmount(rechargeAmount);
+                    chargingOrderRefund.setRefundTotalAmount(totalRefundAmount);
                     chargingOrderRefund.setPayAmount(rechargeAmount);
+                    chargingOrder.setBalanceRefundAmount(balanceRefundAmount);
+                    chargingOrder.setThirdRefundAmount(thirdRefundAmount);
+                    chargingOrder.setRefundAmount(totalRefundAmount);
+                    chargingOrder.setRefundStatus(thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2);
+                    if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+                        if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
+                            changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
+                        }
+                        chargingOrderRefund.setRefundStatus(2);
+                        chargingOrderRefund.setRefundSerialNumber("BALANCE");
+                        chargingOrderRefund.setRefundTime(LocalDateTime.now());
+                        chargingOrderRefundService.save(chargingOrderRefund);
+                        this.updateById(chargingOrder);
+                        return;
+                    }
+                    this.updateById(chargingOrder);
+                    chargingOrderRefund.setRefundAmount(thirdRefundAmount);
                     if (1 == rechargePaymentType) {
                         WxPaymentRefundModel model = new WxPaymentRefundModel();
                         model.setOut_trade_no(chargingOrder.getCode());
@@ -1127,8 +1162,8 @@
                         model.setReason("充电失败,取消充电订单");
                         model.setNotify_url("/payment/wx/refund/notify");
                         WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-                        amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
-                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                        amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+                        amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
                         amount.setCurrency("CNY");
                         model.setAmount(amount);
                         R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -1158,7 +1193,7 @@
                         RefundReq dto = new RefundReq();
                         dto.setOutTradeNo(chargingOrder.getCode());
                         dto.setOutRequestNo(chargingOrderRefund.getCode());
-                        dto.setRefundAmount(rechargeAmount.toString());
+                        dto.setRefundAmount(thirdRefundAmount.toString());
                         dto.setRefundReason("充电失败,取消充电订单");
                         RefundResp resp = aliPaymentClient.refund(dto).getData();
                         if (null != resp) {
@@ -1188,7 +1223,7 @@
                         RefundReq dto = new RefundReq();
                         dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
                         dto.setOutRequestNo(chargingOrderRefund.getCode());
-                        dto.setRefundAmount(rechargeAmount.toString());
+                        dto.setRefundAmount(thirdRefundAmount.toString());
                         dto.setRefundReason("充电失败,取消充电订单");
                         RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                         if (null != resp && "10000".equals(resp.getCode())) {
@@ -1333,6 +1368,9 @@
                     chargingOrderRefundService.updateById(one);
 
                     TChargingOrder order = this.getById(one.getChargingOrderId());
+                    if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) {
+                        changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount()));
+                    }
                     TChargingOrder chargingOrder = new TChargingOrder();
                     chargingOrder.setId(one.getChargingOrderId());
                     chargingOrder.setAppUserId(order.getAppUserId());
@@ -2724,32 +2762,24 @@
                 }
                 chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
                 chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
-                BigDecimal balanceUsedAmount = BigDecimal.ZERO;
-                if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null && payAmount.compareTo(BigDecimal.ZERO) > 0) {
-                    balanceUsedAmount = money(chargingOrder.getBalancePayAmount()).min(payAmount).setScale(2, RoundingMode.HALF_UP);
-                    if (balanceUsedAmount.compareTo(BigDecimal.ZERO) > 0) {
-                        ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO();
-                        exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId());
-                        exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId());
-                        exchangeCodeConsumeDTO.setAmount(balanceUsedAmount);
-                        R<ExchangeCodeConsumeResultVO> consumeResult = otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO);
-                        if (consumeResult != null && consumeResult.getData() != null
-                                && consumeResult.getData().getDeductedAmount() != null) {
-                            balanceUsedAmount = consumeResult.getData().getDeductedAmount();
-                        }
-                    }
-                }
-                BigDecimal balanceRefundAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceUsedAmount);
-                if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
-                    changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
-                }
-                BigDecimal actualThirdPayAmount = payAmount.subtract(balanceUsedAmount);
+                refundAmount = refundAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
                 if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
                     actualThirdPayAmount = BigDecimal.ZERO;
                 }
-                BigDecimal thirdRefundAmount = money(chargingOrder.getThirdPayAmount()).subtract(actualThirdPayAmount);
-                if (thirdRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
-                    thirdRefundAmount = BigDecimal.ZERO;
+                BigDecimal actualBalancePayAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceRefundAmount);
+                if (actualBalancePayAmount.compareTo(BigDecimal.ZERO) < 0) {
+                    actualBalancePayAmount = BigDecimal.ZERO;
+                }
+                if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null
+                        && actualBalancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
+                    ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO();
+                    exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId());
+                    exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId());
+                    exchangeCodeConsumeDTO.setAmount(actualBalancePayAmount);
+                    otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO);
                 }
                 refundAmount = thirdRefundAmount.add(balanceRefundAmount);
                 chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP));
@@ -2882,7 +2912,7 @@
                             model.setReason("充电完成退款");
                             model.setNotify_url("/payment/wx/refund/notify");
                             WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-                            amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+                            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                             amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                             amount.setCurrency("CNY");
                             model.setAmount(amount);
@@ -2896,11 +2926,11 @@
                                 chargingOrderRefundService.save(chargingOrderRefund);
                             }
                         }
-                        if (2 == rechargePaymentType) {
+                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
                             RefundReq dto = new RefundReq();
                             dto.setOutTradeNo(chargingOrder.getCode());
                             dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                            dto.setRefundAmount(refundAmount.toString());
+                            dto.setRefundAmount(thirdRefundAmount.toString());
                             dto.setRefundReason("充电完成退款");
                             RefundResp resp = aliPaymentClient.refund(dto).getData();
                             if (null != resp) {
@@ -2908,11 +2938,11 @@
                                 this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                             }
                         }
-                        if (3 == rechargePaymentType) {
+                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
                             RefundReq dto = new RefundReq();
                             dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
                             dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                            dto.setRefundAmount(refundAmount.toString());
+                            dto.setRefundAmount(thirdRefundAmount.toString());
                             dto.setRefundReason("充电完成退款");
                             RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                             if (null != resp && "10000".equals(resp.getCode())) {

--
Gitblit v1.7.1