From 2b4ccf5ba9e76e8f73f0c5821877e48a24db5f60 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 21 七月 2026 10:10:38 +0800
Subject: [PATCH] fix: 修正特殊退款累计金额

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 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 aee5754..9eb57b9 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
@@ -4821,6 +4821,7 @@
 		if (order == null) {
 			return R.fail("未查询到支付成功的充电订单");
 		}
+		mergeSuccessfulRefundAmounts(order);
 		PayOrderInfoDto dto = new PayOrderInfoDto();
 		dto.setOrderId(order.getId().toString());
 		dto.setCode(order.getCode());
@@ -4862,6 +4863,7 @@
 			if (order == null) {
 				return R.fail("充电订单不存在");
 			}
+			mergeSuccessfulRefundAmounts(order);
 			BigDecimal refundAmount = money(payOrderQueryDto.getRefundAmount());
 			BigDecimal refundableAmount = money(order.getPaymentAmount()).subtract(money(order.getRefundAmount())).setScale(2, RoundingMode.HALF_UP);
 			if (refundAmount.compareTo(refundableAmount) > 0) {
@@ -4928,6 +4930,40 @@
 		}
 	}
 
+	private void mergeSuccessfulRefundAmounts(TChargingOrder order) {
+		if (order == null || order.getId() == null) {
+			return;
+		}
+		List<TChargingOrderRefund> refunds = chargingOrderRefundService.list(
+				new LambdaQueryWrapper<TChargingOrderRefund>()
+						.eq(TChargingOrderRefund::getChargingOrderId, order.getId())
+						.eq(TChargingOrderRefund::getRefundStatus, 2));
+		if (refunds == null || refunds.isEmpty()) {
+			return;
+		}
+		BigDecimal successfulAmount = BigDecimal.ZERO;
+		BigDecimal explicitBalanceAmount = BigDecimal.ZERO;
+		BigDecimal explicitThirdAmount = BigDecimal.ZERO;
+		BigDecimal unspecifiedAmount = BigDecimal.ZERO;
+		for (TChargingOrderRefund refund : refunds) {
+			BigDecimal amount = money(refund.getRefundAmount());
+			BigDecimal balanceAmount = money(refund.getBalanceRefundAmount());
+			BigDecimal thirdAmount = money(refund.getThirdRefundAmount());
+			successfulAmount = successfulAmount.add(amount);
+			explicitBalanceAmount = explicitBalanceAmount.add(balanceAmount);
+			explicitThirdAmount = explicitThirdAmount.add(thirdAmount);
+			if (balanceAmount.add(thirdAmount).compareTo(BigDecimal.ZERO) == 0) {
+				unspecifiedAmount = unspecifiedAmount.add(amount);
+			}
+		}
+		BigDecimal inferredThirdAmount = unspecifiedAmount.min(
+				getRefundableThirdPayAmount(order).subtract(explicitThirdAmount).max(BigDecimal.ZERO));
+		BigDecimal inferredBalanceAmount = unspecifiedAmount.subtract(inferredThirdAmount).max(BigDecimal.ZERO);
+		order.setRefundAmount(money(order.getRefundAmount()).max(money(successfulAmount)));
+		order.setThirdRefundAmount(money(order.getThirdRefundAmount()).max(money(explicitThirdAmount.add(inferredThirdAmount))));
+		order.setBalanceRefundAmount(money(order.getBalanceRefundAmount()).max(money(explicitBalanceAmount.add(inferredBalanceAmount))));
+	}
+
 	private R refundIcbcShareBeforeMainRefund(TChargingOrder order, TChargingOrderRefund refund, BigDecimal thirdRefundAmount) {
 		if (order == null || refund == null || thirdRefundAmount == null || thirdRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
 			return R.ok();

--
Gitblit v1.7.1