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