From 76cd5948e95ddbde9dd4411b466ee75ba20b562e Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期四, 03 九月 2026 17:28:29 +0800
Subject: [PATCH] 实现测试预警异常管理
---
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java
index a0f426c..107d501 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java
@@ -11,6 +11,7 @@
import java.util.List;
import com.alibaba.fastjson2.JSON;
import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.device.bts.BtsDevelopmentSimulator;
import com.ruoyi.device.simulator.BtsSimulatorStateStore.BtsHistoryRecord;
@@ -30,15 +31,23 @@
private final TTestMapper mapper;
private final ITTestService tests;
private final BtsDevelopmentSimulator simulator;
+ private final TestWarningExceptionService warningExceptions;
private final Map<String, Instant> lastSnapshotAt = new java.util.concurrent.ConcurrentHashMap<>();
private final Map<Long, Instant> lastRawCaptureAt = new java.util.concurrent.ConcurrentHashMap<>();
- public TestDataReceptionServiceImpl(TTestMapper mapper, ITTestService tests, BtsDevelopmentSimulator simulator)
+ @Autowired
+ public TestDataReceptionServiceImpl(TTestMapper mapper, ITTestService tests, BtsDevelopmentSimulator simulator,
+ TestWarningExceptionService warningExceptions)
{
this.mapper = mapper;
this.tests = tests;
this.simulator = simulator;
+ this.warningExceptions = warningExceptions;
}
+
+ /** 保留单元测试及旧调用方构造契约。 */
+ public TestDataReceptionServiceImpl(TTestMapper mapper, ITTestService tests, BtsDevelopmentSimulator simulator)
+ { this(mapper, tests, simulator, new TestWarningExceptionService(mapper)); }
@Override
@Transactional(rollbackFor = Exception.class)
@@ -169,7 +178,15 @@
{
// 模拟器保留通道历史;只接收本次测试开始后产生的设备时间记录,避免顺序测试串入旧事实。
if (startedAt != null && record.deviceTime().isBefore(startedAt.toInstant())) continue;
- save(test, binding, record);
+ if (save(test, binding, record)) {
+ String source = String.join(":", java.util.Objects.toString(binding.getAdapterCode(), ""),
+ java.util.Objects.toString(binding.getDevtype(), ""), java.util.Objects.toString(binding.getDevid(), ""),
+ java.util.Objects.toString(binding.getSubdevid(), ""), java.util.Objects.toString(binding.getChlid(), ""));
+ warningExceptions.evaluate(test, "CABINET", source, "VOLTAGE", BigDecimal.valueOf(record.voltageV()), "V", Date.from(record.deviceTime()));
+ warningExceptions.evaluate(test, "CABINET", source, "CURRENT", BigDecimal.valueOf(record.currentA()), "A", Date.from(record.deviceTime()));
+ warningExceptions.evaluate(test, "CABINET", source, "CAPACITY", BigDecimal.valueOf(record.capacityAh()), "Ah", Date.from(record.deviceTime()));
+ warningExceptions.evaluate(test, "CABINET", source, "ENERGY", BigDecimal.valueOf(record.energyWh()), "Wh", Date.from(record.deviceTime()));
+ }
}
}
}
@@ -192,11 +209,12 @@
java.util.Objects.equals(mapping.getChannelCode(), measurement.channelCode())
&& metricMatches(mapping.getMeasurementCode(), measurement.metricCode()));
if (!mapped) continue;
- saveCollector(test, battery, measurement);
+ if (saveCollector(test, battery, measurement))
+ warningExceptions.evaluate(test, "COLLECTOR", measurement.adapterCode() + ":" + battery.getCollectorId() + ":" + measurement.channelCode(), measurement.metricCode(), measurement.value(), measurement.unit(), Date.from(measurement.deviceTime()));
}
}
- private void saveCollector(TTest test, TTestBattery battery, CollectorRealtimeMeasurement measurement)
+ private boolean saveCollector(TTest test, TTestBattery battery, CollectorRealtimeMeasurement measurement)
{
byte[] hash = hash(measurement);
String old = mapper.selectCollectorSampleContentHash(battery.getCollectorId(), measurement.channelCode(),
@@ -209,7 +227,7 @@
"采集器实时接收内容冲突 collector=" + battery.getCollectorId() + ", channel="
+ measurement.channelCode() + ", metric=" + measurement.metricCode()
+ ", seqid=" + measurement.sequenceId());
- return;
+ return false;
}
Date receivedAt = new Date();
int inserted = mapper.insertCollectorSample(test.getTestId(), battery.getBinding().getBindingId(), battery.getCollectorId(),
@@ -228,9 +246,10 @@
+ measurement.channelCode() + ", metric=" + measurement.metricCode()
+ ", seqid=" + measurement.sequenceId());
}
+ return inserted > 0;
}
- private void save(TTest test, TTestChannelBinding binding,
+ private boolean save(TTest test, TTestChannelBinding binding,
BtsHistoryRecord record)
{
// 模拟器历史 testid 按通道固定;接收事实必须再带测试作用域,避免顺序测试共用全局幂等键。
@@ -242,7 +261,7 @@
if (!old.equalsIgnoreCase(HexFormat.of().formatHex(hash)))
mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(),
"实时接收内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId());
- return;
+ return false;
}
int inserted = mapper.insertBtsSample(test.getTestId(), binding.getBindingId(), binding.getChannelId(),
btsTestId, record.sequenceId(), Date.from(record.deviceTime()),
@@ -257,6 +276,7 @@
mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(),
"实时接收并发内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId());
}
+ return inserted > 0;
}
private byte[] hash(BtsHistoryRecord record)
--
Gitblit v1.7.1