From c5a4bbfbe2e7858446cc54c7b474af0d1380944b Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 08 五月 2026 17:01:41 +0800
Subject: [PATCH] Merge branch '2.0' into 2.0.1
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 66 ++++++++++++++++++---
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java | 50 ++++++----------
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java | 40 ++++++++-----
3 files changed, 100 insertions(+), 56 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 9b540b5..0ba71ac 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
@@ -1320,14 +1320,29 @@
if (chargingOrder.getOrderSource() == 1) {
BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+ Integer payMethod = chargingOrder.getPayMethod();
//构建退款明细
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(money);
- chargingOrderRefund.setBalanceRefundAmount(BigDecimal.ZERO);
- chargingOrderRefund.setThirdRefundAmount(money);
+ BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ if (Integer.valueOf(1).equals(payMethod)) {
+ balanceRefundAmount = money.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else if (Integer.valueOf(2).equals(payMethod)) {
+ BigDecimal refundableThirdAmount = money(chargingOrder.getThirdPayAmount()).subtract(money(chargingOrder.getThirdRefundAmount()));
+ if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
+ refundableThirdAmount = BigDecimal.ZERO;
+ }
+ thirdRefundAmount = money.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP);
+ balanceRefundAmount = money.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else {
+ thirdRefundAmount = money;
+ }
+ chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+ chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
chargingOrderRefund.setRefundStatus(1);
chargingOrderRefund.setPayType(rechargePaymentType);
chargingOrderRefund.setRefundStatus(1);
@@ -1338,6 +1353,11 @@
chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
chargingOrderRefund.setRefundTotalAmount(money);
chargingOrderRefund.setPayAmount(money);
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ chargingOrderRefund.setRefundSerialNumber("BALANCE");
+ finishManualChargingRefund(chargingOrder, chargingOrderRefund, money, balanceRefundAmount, thirdRefundAmount);
+ return;
+ }
if (1 == rechargePaymentType) {
WxPaymentRefundModel model = new WxPaymentRefundModel();
model.setOut_trade_no(chargingOrder.getCode());
@@ -1345,7 +1365,7 @@
model.setReason("充电完成退款");
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(money.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);
@@ -1363,8 +1383,8 @@
if (2 == rechargePaymentType) {
RefundReq dto = new RefundReq();
dto.setOutTradeNo(chargingOrder.getCode());
- dto.setOutRequestNo(chargingOrderRefund.getCode());
- dto.setRefundAmount(money.toString());
+ dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
dto.setRefundReason("充电完成退款");
RefundResp resp = aliPaymentClient.refund(dto).getData();
if (null != resp) {
@@ -1380,8 +1400,8 @@
if (3 == rechargePaymentType) {
RefundReq dto = new RefundReq();
dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
- dto.setOutRequestNo(chargingOrderRefund.getCode());
- dto.setRefundAmount(money.toString());
+ dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
dto.setRefundReason("充电完成退款");
RefundResp resp = h5AliPaymentClient.refund(dto).getData();
if (null != resp && "10000".equals(resp.getCode())) {
@@ -2999,8 +3019,17 @@
chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
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);
+ Integer payMethod = chargingOrder.getPayMethod();
+ BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ if (Integer.valueOf(1).equals(payMethod)) {
+ balanceRefundAmount = refundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else if (Integer.valueOf(2).equals(payMethod)) {
+ thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else {
+ thirdRefundAmount = refundAmount;
+ }
BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
actualThirdPayAmount = BigDecimal.ZERO;
@@ -3124,6 +3153,8 @@
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
chargingOrderRefund.setRefundAmount(refundAmount);
+ chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+ chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
chargingOrderRefund.setPayType(rechargePaymentType);
chargingOrderRefund.setRefundStatus(1);
chargingOrderRefund.setCode(chargingOrder.getCode());
@@ -3133,7 +3164,20 @@
chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
chargingOrderRefund.setRefundTotalAmount(refundAmount);
chargingOrderRefund.setPayAmount(rechargeAmount);
- if (1 == rechargePaymentType) {
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ chargingOrderRefund.setRefundStatus(2);
+ chargingOrderRefund.setRefundSerialNumber("BALANCE");
+ chargingOrderRefund.setRefundTime(LocalDateTime.now());
+ chargingOrderRefundService.save(chargingOrderRefund);
+ if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
+ changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
+ recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode());
+ }
+
+ chargingOrder.setRefundStatus(2);
+ chargingOrder.setRefundTime(LocalDateTime.now());
+ this.updateById(chargingOrder);
+ } else if (1 == rechargePaymentType) {
WxPaymentRefundModel model = new WxPaymentRefundModel();
model.setOut_trade_no(chargingOrder.getCode());
model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -3141,7 +3185,7 @@
model.setNotify_url("/payment/wx/refund/notify");
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal(rechargeAmount.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>> result = 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 4ac4e4a..401c549 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
@@ -685,8 +685,17 @@
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);
+ Integer payMethod = order.getPayMethod();
+ BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ if (Integer.valueOf(1).equals(payMethod)) {
+ balanceRefundAmount = refundAmount.min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else if (Integer.valueOf(2).equals(payMethod)) {
+ thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+ balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ } else {
+ thirdRefundAmount = refundAmount;
+ }
refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
order.setThirdRefundAmount(thirdRefundAmount);
order.setBalanceRefundAmount(balanceRefundAmount);
@@ -708,7 +717,18 @@
chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
chargingOrderRefund.setRefundTotalAmount(refundAmount);
chargingOrderRefund.setPayAmount(rechargeAmount);
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ chargingOrderRefund.setRefundStatus(2);
+ chargingOrderRefund.setRefundSerialNumber("BALANCE");
+ chargingOrderRefund.setRefundTime(LocalDateTime.now());
+ chargingOrderRefundService.save(chargingOrderRefund);
+ if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
+ recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
+ }
+ order.setRefundStatus(2);
+ order.setRefundTime(LocalDateTime.now());
+ chargingOrderService.updateById(order);
+ } else if (1 == rechargePaymentType) {
WxPaymentRefundModel model = new WxPaymentRefundModel();
model.setOut_trade_no(order.getCode());
model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -730,7 +750,7 @@
chargingOrderRefundService.updateById(chargingOrderRefund);
}
}
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
+ else if (2 == rechargePaymentType) {
RefundReq dto = new RefundReq();
dto.setOutTradeNo(order.getCode());
dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -742,7 +762,7 @@
chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
}
}
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
+ else if (3 == rechargePaymentType) {
RefundReq dto = new RefundReq();
dto.setOutTradeNo(order.getRechargeSerialNumber());
dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -753,16 +773,6 @@
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);
}
}
}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
index 70224b1..21c7215 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -959,11 +959,7 @@
if (record == null || userId == null || record.getId() == null) {
return;
}
- List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
- .eq("user_id", userId)
- .le("id", record.getId())
- .orderByAsc("id"));
- record.setCurrentBalance(calculateCurrentBalance(records));
+ record.setCurrentBalance(calculateCurrentBalanceAfterRecord(userId, record.getId()));
}
/**
@@ -978,49 +974,43 @@
}
List<TExchangeCodeUseRecord> allRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
.eq("user_id", userId)
- .orderByAsc("id"));
+ .orderByDesc("id"));
Map<Long, BigDecimal> balanceMap = new HashMap<>();
- BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balance = getCurrentExchangeCodeBalance(userId);
for (TExchangeCodeUseRecord item : allRecords) {
- balance = applyUseRecordChange(balance, item);
balanceMap.put(item.getId(), balance);
+ balance = rollbackUseRecordChange(balance, item);
}
for (TExchangeCodeUseRecord item : records) {
item.setCurrentBalance(balanceMap.getOrDefault(item.getId(), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)));
}
}
- /**
- * 根据流水列表计算用户当前余额。
- *
- * @param records 余额流水列表
- * @return 当前余额
- */
- private BigDecimal calculateCurrentBalance(List<TExchangeCodeUseRecord> records) {
- BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- if (records == null) {
- return balance;
- }
+
+ private BigDecimal calculateCurrentBalanceAfterRecord(Long userId, Long recordId) {
+ BigDecimal balance = getCurrentExchangeCodeBalance(userId);
+ List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
+ .eq("user_id", userId)
+ .gt("id", recordId)
+ .orderByDesc("id"));
for (TExchangeCodeUseRecord item : records) {
- balance = applyUseRecordChange(balance, item);
+ balance = rollbackUseRecordChange(balance, item);
}
return balance;
}
- /**
- * 将单条余额流水变动应用到当前余额。
- *
- * @param balance 当前余额
- * @param record 余额流水记录
- * @return 应用流水后的余额
- */
- private BigDecimal applyUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
+ private BigDecimal rollbackUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
BigDecimal amount = defaultMoney(record == null ? null : record.getUsedAmount());
Integer changeType = record == null ? null : record.getChangeType();
if (USE_RECORD_TYPE_CONSUME.equals(changeType)) {
- return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
+ return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
}
- return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
+ return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
+ }
+
+ private BigDecimal getCurrentExchangeCodeBalance(Long userId) {
+ Map<Long, BigDecimal> balanceMap = getUserExchangeCodeBalanceMap(Collections.singletonList(userId));
+ return defaultMoney(balanceMap.get(userId));
}
/**
--
Gitblit v1.7.1