From 262eb0096f28537c2859f79cdfa466092dc4f898 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 15 九月 2026 10:38:45 +0800
Subject: [PATCH] 修改bug
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVinChargingOrderServiceImpl.java | 25 +++++++++++++++++++++++++
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinOrderCompensationTest.java | 4 ++++
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinSettlementTimeAlignmentTest.java | 31 ++++++++++++++++++++++++++++++-
3 files changed, 59 insertions(+), 1 deletions(-)
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVinChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVinChargingOrderServiceImpl.java
index 408089f..475efee 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVinChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVinChargingOrderServiceImpl.java
@@ -1068,6 +1068,8 @@
final BigDecimal totalElec = totalElectricity;
final BigDecimal elecTotal = electrovalenceTotal;
final BigDecimal svcTotal = serviceChargeTotal;
+ final BigDecimal startSoc = getMonitoringSocQuietly(code, "asc");
+ final BigDecimal endSoc = getMonitoringSocQuietly(code, "desc");
// 本地事务:写计费明细 + 更新订单(状态5;VD后付记账模式,不做账户扣款)
transactionTemplate.execute(status -> {
@@ -1085,6 +1087,12 @@
update.setServiceCharge(svcTotal);
update.setOrderAmount(orderAmount);
update.setPaymentAmount(orderAmount);
+ if (startSoc != null) {
+ update.setStartSoc(startSoc);
+ }
+ if (endSoc != null) {
+ update.setEndSoc(endSoc);
+ }
update.setEndTime(parseDeviceTime(vo.getEnd_time(), LocalDateTime.now()));
if (order.getStartTime() == null) {
update.setStartTime(parseDeviceTime(vo.getStart_time(), null));
@@ -1209,6 +1217,23 @@
}
}
+ /**
+ * 容错读取订单最早/最新监控记录的 SOC;Mongo 数据缺失或查询异常不阻断主结算流程。
+ */
+ private BigDecimal getMonitoringSocQuietly(String code, String sort) {
+ if (monitoringDataService == null) {
+ return null;
+ }
+ try {
+ UploadRealTimeMonitoringData monitoringData = monitoringDataService.getDataByOrderCode(code, sort);
+ return monitoringData == null || monitoringData.getSoc() == null
+ ? null : BigDecimal.valueOf(monitoringData.getSoc().longValue());
+ } catch (Exception ex) {
+ log.error("[VD结算] 查询监控SOC失败 code={} sort={}", code, sort, ex);
+ return null;
+ }
+ }
+
private LocalDateTime parseDeviceTime(String value, LocalDateTime fallback) {
if (StringUtils.isEmpty(value)) {
return fallback;
diff --git a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinOrderCompensationTest.java b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinOrderCompensationTest.java
index d811c52..e802b5c 100644
--- a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinOrderCompensationTest.java
+++ b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinOrderCompensationTest.java
@@ -22,6 +22,7 @@
import com.ruoyi.order.service.TCardChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TVinAccountingStrategyDetailOrderService;
import com.ruoyi.order.service.TVinChargingOrderAccountingStrategyService;
+import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -277,8 +278,10 @@
TVinChargingOrderServiceImpl service = new TVinChargingOrderServiceImpl();
TVinChargingOrderMapper mapper = mock(TVinChargingOrderMapper.class);
ChargingGunClient gunClient = mock(ChargingGunClient.class);
+ UploadRealTimeMonitoringDataService monitoringDataService = mock(UploadRealTimeMonitoringDataService.class);
ReflectionTestUtils.setField(service, "baseMapper", mapper);
ReflectionTestUtils.setField(service, "chargingGunClient", gunClient);
+ ReflectionTestUtils.setField(service, "monitoringDataService", monitoringDataService);
ReflectionTestUtils.setField(service, "redissonClient", mockedRedisson(mockedLock(true)));
TVinChargingOrder finished = new TVinChargingOrder();
@@ -296,6 +299,7 @@
assertEquals(R.SUCCESS, result.getCode());
verify(gunClient, never()).updateChargingGunById(any(TChargingGun.class));
+ verifyNoInteractions(monitoringDataService);
}
// ===== VD:结算明细补齐计费策略明细id与首次添加时间 =====
diff --git a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinSettlementTimeAlignmentTest.java b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinSettlementTimeAlignmentTest.java
index 5299faf..7e46dfb 100644
--- a/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinSettlementTimeAlignmentTest.java
+++ b/ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/CardVinSettlementTimeAlignmentTest.java
@@ -10,6 +10,7 @@
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.TCardAccountingStrategyDetailOrder;
import com.ruoyi.order.api.model.TCardChargingOrder;
import com.ruoyi.order.api.model.TCardChargingOrderAccountingStrategy;
@@ -23,6 +24,7 @@
import com.ruoyi.order.service.TCardChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TVinAccountingStrategyDetailOrderService;
import com.ruoyi.order.service.TVinChargingOrderAccountingStrategyService;
+import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -45,6 +47,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -268,11 +271,13 @@
TVinChargingOrderServiceImpl service = new TVinChargingOrderServiceImpl();
TVinChargingOrderMapper mapper = mock(TVinChargingOrderMapper.class);
ChargingGunClient gunClient = mock(ChargingGunClient.class);
+ UploadRealTimeMonitoringDataService monitoringDataService = mock(UploadRealTimeMonitoringDataService.class);
TVinAccountingStrategyDetailOrderService detailOrderService = mock(TVinAccountingStrategyDetailOrderService.class);
TVinChargingOrderAccountingStrategyService strategyService = mock(TVinChargingOrderAccountingStrategyService.class);
TransactionTemplate txTemplate = mock(TransactionTemplate.class);
ReflectionTestUtils.setField(service, "baseMapper", mapper);
ReflectionTestUtils.setField(service, "chargingGunClient", gunClient);
+ ReflectionTestUtils.setField(service, "monitoringDataService", monitoringDataService);
ReflectionTestUtils.setField(service, "vinAccountingStrategyDetailOrderService", detailOrderService);
ReflectionTestUtils.setField(service, "vinChargingOrderAccountingStrategyService", strategyService);
ReflectionTestUtils.setField(service, "transactionTemplate", txTemplate);
@@ -287,6 +292,12 @@
charging.setEndTime(LocalDateTime.of(2026, 9, 14, 21, 45, 0));
when(mapper.selectOne(any())).thenReturn(charging);
when(mapper.updateById(any())).thenReturn(1);
+ UploadRealTimeMonitoringData firstMonitoring = new UploadRealTimeMonitoringData();
+ firstMonitoring.setSoc(18);
+ UploadRealTimeMonitoringData lastMonitoring = new UploadRealTimeMonitoringData();
+ lastMonitoring.setSoc(87);
+ when(monitoringDataService.getDataByOrderCode("VD1", "asc")).thenReturn(firstMonitoring);
+ when(monitoringDataService.getDataByOrderCode("VD1", "desc")).thenReturn(lastMonitoring);
stubGunAndUpdate(gunClient, 7);
stubVinStrategyQuerySave(detailOrderService, strategyService, vinThreePeriodSnapshots());
@@ -301,6 +312,13 @@
R result = service.vinEndChargeBillingCharge(vo);
assertEquals(R.SUCCESS, result.getCode());
+
+ ArgumentCaptor<TVinChargingOrder> orderCaptor = ArgumentCaptor.forClass(TVinChargingOrder.class);
+ verify(mapper).updateById(orderCaptor.capture());
+ assertEquals(0, new BigDecimal("18").compareTo(orderCaptor.getValue().getStartSoc()));
+ assertEquals(0, new BigDecimal("87").compareTo(orderCaptor.getValue().getEndSoc()));
+ verify(monitoringDataService).getDataByOrderCode("VD1", "asc");
+ verify(monitoringDataService).getDataByOrderCode("VD1", "desc");
ArgumentCaptor<Collection<TVinChargingOrderAccountingStrategy>> captor = ArgumentCaptor.forClass(Collection.class);
verify(strategyService).saveBatch(captor.capture());
@@ -336,11 +354,13 @@
TVinChargingOrderServiceImpl service = new TVinChargingOrderServiceImpl();
TVinChargingOrderMapper mapper = mock(TVinChargingOrderMapper.class);
ChargingGunClient gunClient = mock(ChargingGunClient.class);
+ UploadRealTimeMonitoringDataService monitoringDataService = mock(UploadRealTimeMonitoringDataService.class);
TVinAccountingStrategyDetailOrderService detailOrderService = mock(TVinAccountingStrategyDetailOrderService.class);
TVinChargingOrderAccountingStrategyService strategyService = mock(TVinChargingOrderAccountingStrategyService.class);
TransactionTemplate txTemplate = mock(TransactionTemplate.class);
ReflectionTestUtils.setField(service, "baseMapper", mapper);
ReflectionTestUtils.setField(service, "chargingGunClient", gunClient);
+ ReflectionTestUtils.setField(service, "monitoringDataService", monitoringDataService);
ReflectionTestUtils.setField(service, "vinAccountingStrategyDetailOrderService", detailOrderService);
ReflectionTestUtils.setField(service, "vinChargingOrderAccountingStrategyService", strategyService);
ReflectionTestUtils.setField(service, "transactionTemplate", txTemplate);
@@ -351,9 +371,11 @@
charging.setCode("VD1");
charging.setStatus(4);
charging.setChargingGunId(7);
- // startTime/endTime 均为 null
+ // startTime/endTime 均为 null,Mongo 首末监控记录也不存在
when(mapper.selectOne(any())).thenReturn(charging);
when(mapper.updateById(any())).thenReturn(1);
+ when(monitoringDataService.getDataByOrderCode("VD1", "asc")).thenReturn(null);
+ when(monitoringDataService.getDataByOrderCode("VD1", "desc")).thenReturn(null);
stubGunAndUpdate(gunClient, 7);
stubVinStrategyQuerySave(detailOrderService, strategyService, vinThreePeriodSnapshots());
@@ -368,6 +390,13 @@
R result = service.vinEndChargeBillingCharge(vo);
assertEquals(R.SUCCESS, result.getCode());
+ ArgumentCaptor<TVinChargingOrder> orderCaptor = ArgumentCaptor.forClass(TVinChargingOrder.class);
+ verify(mapper).updateById(orderCaptor.capture());
+ assertNull(orderCaptor.getValue().getStartSoc());
+ assertNull(orderCaptor.getValue().getEndSoc());
+ verify(monitoringDataService).getDataByOrderCode("VD1", "asc");
+ verify(monitoringDataService).getDataByOrderCode("VD1", "desc");
+
ArgumentCaptor<Collection<TVinChargingOrderAccountingStrategy>> captor = ArgumentCaptor.forClass(Collection.class);
verify(strategyService).saveBatch(captor.capture());
List<TVinChargingOrderAccountingStrategy> saved = new ArrayList<>(captor.getValue());
--
Gitblit v1.7.1