From a3657cc4e9fd9f13e4838db8eebaf914c529beee Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 15 七月 2026 14:34:44 +0800
Subject: [PATCH] 结算的已支付订单

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java     |   67 ++++++++++++----
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java                    |    9 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java     |   64 ++++++++++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java        |    2 
 ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java |   52 +++++++++++++
 5 files changed, 175 insertions(+), 19 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index c6323f7..9c4a40e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -984,7 +984,7 @@
 
     @ResponseBody
     @GetMapping("/simulation/current")
-    @ApiOperation(value = "查询当前枪可模拟结算的工行订单", tags = {"小程序-模拟充电"})
+    @ApiOperation(value = "查询当前枪可模拟结算的已支付订单", tags = {"小程序-模拟充电"})
     public AjaxResult<ChargingSimulationVO> getCurrentSimulationOrder(@RequestParam("gunId") Integer gunId) {
         return AjaxResult.success(chargingOrderService.getCurrentSimulationOrder(gunId));
     }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java
index 3b54db4..950b585 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingSimulationSupport.java
@@ -1,10 +1,12 @@
 package com.ruoyi.order.service.impl;
 
 import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
@@ -16,6 +18,68 @@
     private ChargingSimulationSupport() {
     }
 
+    static BigDecimal availableAmount(TChargingOrder order) {
+        if (order == null) {
+            return BigDecimal.ZERO.setScale(2);
+        }
+        BigDecimal chargeAmount = money(order.getChargeAmount());
+        return chargeAmount.compareTo(BigDecimal.ZERO) > 0 ? chargeAmount : money(order.getRechargeAmount());
+    }
+
+    static String paymentMode(TChargingOrder order) {
+        if (order == null) {
+            return "未知";
+        }
+        if (Integer.valueOf(1).equals(order.getIsWhitelist())
+                && Integer.valueOf(1).equals(order.getWhitelistBenefitType())) {
+            return "免支付";
+        }
+        BigDecimal balanceAmount = money(order.getBalancePayAmount());
+        BigDecimal thirdAmount = thirdPayAmount(order);
+        if (balanceAmount.compareTo(BigDecimal.ZERO) == 0 && thirdAmount.compareTo(BigDecimal.ZERO) == 0) {
+            return "免支付";
+        }
+        String thirdChannel = thirdChannel(order);
+        if (balanceAmount.compareTo(BigDecimal.ZERO) > 0 && thirdAmount.compareTo(BigDecimal.ZERO) == 0) {
+            return "余额支付";
+        }
+        if (balanceAmount.compareTo(BigDecimal.ZERO) > 0 && thirdAmount.compareTo(BigDecimal.ZERO) > 0) {
+            return "余额+" + thirdChannel;
+        }
+        return thirdChannel;
+    }
+
+    static BigDecimal thirdPayAmount(TChargingOrder order) {
+        if (order == null) {
+            return BigDecimal.ZERO.setScale(2);
+        }
+        BigDecimal thirdAmount = money(order.getThirdPayAmount());
+        if (thirdAmount.compareTo(BigDecimal.ZERO) > 0 || Integer.valueOf(1).equals(order.getPayMethod())) {
+            return thirdAmount;
+        }
+        return money(order.getRechargeAmount())
+                .subtract(money(order.getBalancePayAmount()))
+                .max(BigDecimal.ZERO)
+                .setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private static String thirdChannel(TChargingOrder order) {
+        if ("ICBC".equalsIgnoreCase(order.getSourceName())) {
+            return "工行支付";
+        }
+        if (Integer.valueOf(2).equals(order.getRechargePaymentType())) {
+            return "支付宝支付";
+        }
+        if (Integer.valueOf(3).equals(order.getRechargePaymentType())) {
+            return "支付宝H5支付";
+        }
+        return "微信支付";
+    }
+
+    private static BigDecimal money(BigDecimal amount) {
+        return amount == null ? BigDecimal.ZERO.setScale(2) : amount.setScale(2, RoundingMode.HALF_UP);
+    }
+
     static PreparedSimulation prepare(String orderCode,
                                       List<AccountingStrategyDetailOrder> tariffs,
                                       BigDecimal electricityFee,
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 27a9ac5..6a4f6e3 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
@@ -274,7 +274,10 @@
 		Map<String, Object> map = new HashMap<>();
 		int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
 		map.put("number", size);
-		query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
+		Integer pageCurr = query.getPageCurr() == null || query.getPageCurr() < 1 ? 1 : query.getPageCurr();
+		Integer pageSize = query.getPageSize() == null || query.getPageSize() < 1 ? 10 : query.getPageSize();
+		query.setPageCurr((pageCurr - 1) * pageSize);
+		query.setPageSize(pageSize);
 		List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
 		List<MyChargingOrderList> orderLists = new ArrayList<>();
 		for (TChargingOrder tChargingOrder : list) {
@@ -282,16 +285,19 @@
 			myChargingOrderList.setId(tChargingOrder.getId().toString());
 			myChargingOrderList.setSiteId(tChargingOrder.getSiteId());
 			myChargingOrderList.setStatus(tChargingOrder.getStatus());
-			Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
-			myChargingOrderList.setTitle(site.getName());
+			Site site = getOrderSite(tChargingOrder.getSiteId());
+			myChargingOrderList.setTitle(site == null ? "未知电站" : site.getName());
 			myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
-			String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
+			String name = getChargingGunName(tChargingOrder.getChargingGunId());
 			myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId());
 			myChargingOrderList.setName(name);
 			myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
-			BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
+			Integer status = tChargingOrder.getStatus();
+			BigDecimal payMoney = status != null && status < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
 			myChargingOrderList.setPayMoney(payMoney);
-			myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			if (tChargingOrder.getCreateTime() != null) {
+				myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			}
 			long count = orderEvaluateService.count(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderType, 1)
 					.eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0));
 			myChargingOrderList.setEvaluate(count + 1L);
@@ -301,6 +307,23 @@
 		map.put("list", orderLists);
 		map.put("totle", list.size());
 		return map;
+	}
+
+	private Site getOrderSite(Integer siteId) {
+		if (siteId == null) {
+			return null;
+		}
+		R<List<Site>> result = siteClient.getSiteByIds(Collections.singletonList(siteId));
+		List<Site> sites = result == null ? Collections.emptyList() : result.getData();
+		return sites == null || sites.isEmpty() ? null : sites.get(0);
+	}
+
+	private String getChargingGunName(Integer chargingGunId) {
+		if (chargingGunId == null) {
+			return "";
+		}
+		R<String> result = chargingGunClient.getAllName(chargingGunId);
+		return result == null || result.getData() == null ? "" : result.getData();
 	}
 	
 	
@@ -510,14 +533,7 @@
         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;
+        return ChargingSimulationSupport.thirdPayAmount(order);
     }
 
     /**
@@ -1019,8 +1035,7 @@
 		BigDecimal electricityFee = money(request.getElectricityFee());
 		BigDecimal serviceFee = money(request.getServiceFee());
 		BigDecimal simulationTotal = electricityFee.add(serviceFee).setScale(2, RoundingMode.HALF_UP);
-		BigDecimal availableAmount = money(order.getChargeAmount()).compareTo(BigDecimal.ZERO) > 0
-				? money(order.getChargeAmount()) : money(order.getRechargeAmount());
+		BigDecimal availableAmount = ChargingSimulationSupport.availableAmount(order);
 		if (simulationTotal.compareTo(availableAmount) > 0) {
 			throw new ServiceException("模拟消费金额不能超过订单可消费金额" + availableAmount.toPlainString() + "元");
 		}
@@ -1060,7 +1075,6 @@
 		TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
 				.eq(TChargingOrder::getAppUserId, userId)
 				.eq(TChargingOrder::getChargingGunId, gunId)
-				.eq(TChargingOrder::getSourceName, "ICBC")
 				.eq(TChargingOrder::getRechargePaymentStatus, 2)
 				.in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
 				.eq(TChargingOrder::getDelFlag, 0)
@@ -1068,7 +1082,7 @@
 				.orderByDesc(TChargingOrder::getId)
 				.last("limit 1"));
 		if (order == null) {
-			throw new ServiceException("当前枪没有属于你的可模拟ICBC已支付订单");
+			throw new ServiceException("当前枪没有属于你的可模拟已支付订单");
 		}
 		return order;
 	}
@@ -1078,12 +1092,21 @@
 		result.setOrderId(order.getId());
 		result.setOrderCode(order.getCode());
 		result.setOrderStatus(order.getStatus());
+		result.setPaymentMode(ChargingSimulationSupport.paymentMode(order));
+		result.setPayMethod(order.getPayMethod());
+		result.setRechargePaymentType(order.getRechargePaymentType());
+		result.setSourceName(order.getSourceName());
 		result.setRechargeAmount(order.getRechargeAmount());
 		result.setChargeAmount(order.getChargeAmount());
+		result.setAvailableAmount(ChargingSimulationSupport.availableAmount(order));
+		result.setBalancePayAmount(order.getBalancePayAmount());
+		result.setThirdPayAmount(order.getThirdPayAmount());
 		result.setElectricityFee(order.getElectrovalence());
 		result.setServiceFee(order.getServiceCharge());
 		result.setPaymentAmount(order.getPaymentAmount());
 		result.setRefundAmount(order.getRefundAmount());
+		result.setBalanceRefundAmount(order.getBalanceRefundAmount());
+		result.setThirdRefundAmount(order.getThirdRefundAmount());
 		result.setRefundStatus(order.getRefundStatus());
 		result.setIcbcOrderId(order.getRechargeSerialNumber());
 		TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectOne(
@@ -1093,6 +1116,14 @@
 						.eq(TChargingOrderShareRecord::getDelFlag, false)
 						.orderByDesc(TChargingOrderShareRecord::getId)
 						.last("limit 1"));
+		if (shareRecord == null) {
+			shareRecord = chargingOrderShareRecordMapper.selectOne(
+					new LambdaQueryWrapper<TChargingOrderShareRecord>()
+							.eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
+							.eq(TChargingOrderShareRecord::getDelFlag, false)
+							.orderByDesc(TChargingOrderShareRecord::getId)
+							.last("limit 1"));
+		}
 		if (shareRecord != null) {
 			result.setShareAmount(shareRecord.getShareAmount());
 			result.setShareStatus(shareRecord.getOnlineShareStatus());
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java
index 922ca1b..9cbeeef 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingSimulationVO.java
@@ -9,12 +9,21 @@
     private Long orderId;
     private String orderCode;
     private Integer orderStatus;
+    private String paymentMode;
+    private Integer payMethod;
+    private Integer rechargePaymentType;
+    private String sourceName;
     private BigDecimal rechargeAmount;
     private BigDecimal chargeAmount;
+    private BigDecimal availableAmount;
+    private BigDecimal balancePayAmount;
+    private BigDecimal thirdPayAmount;
     private BigDecimal electricityFee;
     private BigDecimal serviceFee;
     private BigDecimal paymentAmount;
     private BigDecimal refundAmount;
+    private BigDecimal balanceRefundAmount;
+    private BigDecimal thirdRefundAmount;
     private Integer refundStatus;
     private BigDecimal shareAmount;
     private String shareStatus;
diff --git a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java
index 13d2754..f6a7bfb 100644
--- a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java
+++ b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingSimulationSupportTest.java
@@ -1,6 +1,7 @@
 package com.ruoyi.order.service.impl;
 
 import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
 import org.junit.jupiter.api.Test;
 
@@ -13,6 +14,57 @@
 class ChargingSimulationSupportTest {
 
     @Test
+    void supportsBalanceAndMixedPaymentAmounts() {
+        TChargingOrder balance = new TChargingOrder();
+        balance.setPayMethod(1);
+        balance.setRechargeAmount(new BigDecimal("10.00"));
+        balance.setChargeAmount(new BigDecimal("10.00"));
+        balance.setBalancePayAmount(new BigDecimal("10.00"));
+        balance.setThirdPayAmount(BigDecimal.ZERO);
+
+        assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(balance));
+        assertEquals("余额支付", ChargingSimulationSupport.paymentMode(balance));
+
+        TChargingOrder mixed = new TChargingOrder();
+        mixed.setPayMethod(2);
+        mixed.setRechargePaymentType(1);
+        mixed.setSourceName("ICBC");
+        mixed.setRechargeAmount(new BigDecimal("10.00"));
+        mixed.setBalancePayAmount(new BigDecimal("4.00"));
+        mixed.setThirdPayAmount(new BigDecimal("6.00"));
+
+        assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(mixed));
+        assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(mixed));
+
+        TChargingOrder alipay = new TChargingOrder();
+        alipay.setPayMethod(3);
+        alipay.setRechargePaymentType(2);
+        alipay.setRechargeAmount(new BigDecimal("10.00"));
+        alipay.setBalancePayAmount(BigDecimal.ZERO);
+        alipay.setThirdPayAmount(new BigDecimal("10.00"));
+
+        assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(alipay));
+
+        TChargingOrder legacyAlipay = new TChargingOrder();
+        legacyAlipay.setPayMethod(3);
+        legacyAlipay.setRechargePaymentType(2);
+        legacyAlipay.setRechargeAmount(new BigDecimal("10.00"));
+
+        assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(legacyAlipay));
+        assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.thirdPayAmount(legacyAlipay));
+
+        TChargingOrder legacyMixed = new TChargingOrder();
+        legacyMixed.setPayMethod(2);
+        legacyMixed.setRechargePaymentType(1);
+        legacyMixed.setSourceName("ICBC");
+        legacyMixed.setRechargeAmount(new BigDecimal("10.00"));
+        legacyMixed.setBalancePayAmount(new BigDecimal("4.00"));
+
+        assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(legacyMixed));
+        assertEquals(new BigDecimal("6.00"), ChargingSimulationSupport.thirdPayAmount(legacyMixed));
+    }
+
+    @Test
     void buildsOneKwhRecordForSelectedTariffPeriod() {
         AccountingStrategyDetailOrder first = detail(1, 1, "00:00", "12:00");
         AccountingStrategyDetailOrder second = detail(2, 3, "12:00", "23:59");

--
Gitblit v1.7.1