From 506f0dc2e5b0f95047d0b6fe60b286928a4b863a Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 25 五月 2026 15:33:38 +0800
Subject: [PATCH] bug
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 39 +++++++++++++++----
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java | 29 ++++++++++++--
2 files changed, 55 insertions(+), 13 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 9400899..328bc82 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
@@ -449,6 +449,26 @@
}
/**
+ * 获取第三方实付金额,兼容早期未写入third_pay_amount的纯第三方支付订单。
+ *
+ * @param order 充电订单
+ * @return 第三方可退款本金
+ */
+ private BigDecimal getRefundableThirdPayAmount(TChargingOrder order) {
+ if (order == null || isWhitelistAllFreeOrder(order)) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ BigDecimal thirdPayAmount = money(order.getThirdPayAmount());
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) {
+ return thirdPayAmount;
+ }
+ if (Integer.valueOf(3).equals(order.getPayMethod())) {
+ return money(order.getRechargeAmount());
+ }
+ return thirdPayAmount;
+ }
+
+ /**
* 调整用户余额
*
* @param userId 用户ID
@@ -1281,7 +1301,7 @@
// 白名单全部免费启动失败同样只记录预估金额,避免未支付订单进入实际退款流程。
BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? rechargeAmount : totalRefundAmount;
BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : totalRefundAmount;
- BigDecimal thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal thirdRefundAmount = channelRefundAmount.min(getRefundableThirdPayAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
//构建退款明细
TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
@@ -1326,7 +1346,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
amount.setCurrency("CNY");
model.setAmount(amount);
R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -1477,7 +1497,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
amount.setCurrency("CNY");
model.setAmount(amount);
R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -3300,7 +3320,8 @@
Integer payMethod = chargingOrder.getPayMethod();
BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- BigDecimal refundableAmount = money(chargingOrder.getThirdPayAmount()).add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal refundableThirdPayAmount = getRefundableThirdPayAmount(chargingOrder);
+ BigDecimal refundableAmount = refundableThirdPayAmount.add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
// 全部免费订单启动时未拉起支付,渠道可退金额固定为0,避免误触发微信/支付宝/余额退款。
BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder)
? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)
@@ -3308,12 +3329,12 @@
if (Integer.valueOf(1).equals(payMethod)) {
balanceRefundAmount = channelRefundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
} else if (Integer.valueOf(2).equals(payMethod)) {
- thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
} else {
- thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
}
- BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
+ BigDecimal actualThirdPayAmount = refundableThirdPayAmount.subtract(thirdRefundAmount);
if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
actualThirdPayAmount = BigDecimal.ZERO;
}
@@ -3469,7 +3490,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
amount.setCurrency("CNY");
model.setAmount(amount);
R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
@@ -3751,7 +3772,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal((isBalancePayMode(tChargingOrder.getPayMethod()) ? money(tChargingOrder.getThirdPayAmount()) : money(tChargingOrder.getRechargeAmount())).multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
amount.setCurrency("CNY");
model.setAmount(amount);
R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
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 3ea5448..d1d0b5e 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
@@ -176,6 +176,26 @@
}
/**
+ * 获取第三方实付金额,兼容早期未写入third_pay_amount的纯第三方支付订单。
+ *
+ * @param order 充电订单
+ * @return 第三方可退款本金
+ */
+ private BigDecimal getRefundableThirdPayAmount(TChargingOrder order) {
+ if (order == null || isWhitelistAllFreeOrder(order)) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ BigDecimal thirdPayAmount = money(order.getThirdPayAmount());
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) {
+ return thirdPayAmount;
+ }
+ if (Integer.valueOf(3).equals(order.getPayMethod())) {
+ return money(order.getRechargeAmount());
+ }
+ return thirdPayAmount;
+ }
+
+ /**
* 判断订单是否为白名单订单
*
* @param order 充电订单
@@ -766,7 +786,8 @@
//开始构建退款费用
refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
- BigDecimal refundableAmount = money(order.getThirdPayAmount()).add(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal refundableThirdPayAmount = getRefundableThirdPayAmount(order);
+ BigDecimal refundableAmount = refundableThirdPayAmount.add(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
// 白名单全部免费只记录预估预充金额,实际渠道退款金额保持0,防止补偿任务重复发起退款。
BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(order) ? money(order.getRechargeAmount()) : refundAmount;
BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(order)
@@ -779,10 +800,10 @@
if (Integer.valueOf(1).equals(payMethod)) {
balanceRefundAmount = channelRefundAmount.min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
} else if (Integer.valueOf(2).equals(payMethod)) {
- thirdRefundAmount = channelRefundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
} else {
- thirdRefundAmount = channelRefundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
}
if (channelRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
@@ -825,7 +846,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal((isBalancePayMode(order.getPayMethod()) ? money(order.getThirdPayAmount()) : rechargeAmount).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);
--
Gitblit v1.7.1