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