From acfb83068486766f63284b479d30f78e3ec17dca Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 02:24:48 +0800
Subject: [PATCH] 完成测试生命周期与接收边界

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java |   35 +++++++++++++++++++++++------------
 1 files changed, 23 insertions(+), 12 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 d1dccbb..05d1688 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
@@ -61,9 +61,11 @@
         for (Long testId : testIds)
         {
             TTest locked = mapper.selectTestByIdForUpdate(testId);
-            if (locked == null || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
+            if (locked == null || !"RUNNING".equals(locked.getTestStatus())
+                    || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
             TTest test = tests.selectTestById(testId);
-            if (test == null || !"RECEIVING".equals(test.getReceptionStatus())) continue;
+            if (test == null || !"RUNNING".equals(test.getTestStatus())
+                    || !"RECEIVING".equals(test.getReceptionStatus())) continue;
             // 完整快照与原始事实在同一接收事务内写入;原始事实按发现频率限流,避免 100ms 开发调度重复扫描历史。
             Instant lastRaw = lastRawCaptureAt.get(testId);
             if (lastRaw == null || !now.toInstant().isBefore(lastRaw.plusSeconds(5)))
@@ -95,7 +97,8 @@
         try { collector = simulator.collectorRealtime(battery.getCollectorId().intValue()); } catch (IllegalArgumentException ignored) { return; }
         if (cabinet == null || !collector.online()) return;
         if (test.getStartedAtUtc() != null && cabinet.deviceTime().isBefore(test.getStartedAtUtc().toInstant())) return;
-        if (test.getUpdateTime() != null && cabinet.deviceTime().isBefore(test.getUpdateTime().toInstant())) return;
+        if (test.getReceptionBoundaryAtUtc() != null && cabinet.serverReceivedAt() != null
+                && cabinet.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant())) return;
         Map<String, CollectorRealtimeMeasurement> metrics = new LinkedHashMap<>();
         for (CollectorRealtimeMeasurement item : collector.measurements())
             if (battery.getCollectorChannels() != null && battery.getCollectorChannels().stream().anyMatch(mapping ->
@@ -109,9 +112,10 @@
         if (test.getStartedAtUtc() != null && (temp.deviceTime().isBefore(test.getStartedAtUtc().toInstant())
                 || pos.deviceTime().isBefore(test.getStartedAtUtc().toInstant())
                 || neg.deviceTime().isBefore(test.getStartedAtUtc().toInstant()))) return;
-        if (test.getUpdateTime() != null && (temp.serverReceivedAt().isBefore(test.getUpdateTime().toInstant())
-                || pos.serverReceivedAt().isBefore(test.getUpdateTime().toInstant())
-                || neg.serverReceivedAt().isBefore(test.getUpdateTime().toInstant()))) return;
+        if (test.getReceptionBoundaryAtUtc() != null
+                && (temp.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant())
+                || pos.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant())
+                || neg.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant()))) return;
         Date slot = new Date((now.getTime() / interval) * interval);
         byte[] hash = snapshotHash(cabinet, temp, pos, neg, slot.toInstant());
         mapper.insertRealtimeSnapshot(test.getTestId(), binding.getBindingId(), binding.getChannelId(), battery.getCollectorId(), slot,
@@ -143,9 +147,11 @@
         {
             // 锁住测试行直到本轮采样写入完成,暂停/停止动作只能在本轮接收提交后生效。
             TTest locked = mapper.selectTestByIdForUpdate(testId);
-            if (locked == null || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
+            if (locked == null || !"RUNNING".equals(locked.getTestStatus())
+                    || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
             TTest test = tests.selectTestById(testId);
-            if (test == null || !"RECEIVING".equals(test.getReceptionStatus())) continue;
+            if (test == null || !"RUNNING".equals(test.getTestStatus())
+                    || !"RECEIVING".equals(test.getReceptionStatus())) continue;
             captureTest(test);
         }
     }
@@ -160,9 +166,11 @@
         for (Long testId : testIds)
         {
             TTest locked = mapper.selectTestByIdForUpdate(testId);
-            if (locked == null || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
+            if (locked == null || !"RUNNING".equals(locked.getTestStatus())
+                    || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
             TTest test = tests.selectTestById(testId);
-            if (test == null || !"RECEIVING".equals(test.getReceptionStatus())) continue;
+            if (test == null || !"RUNNING".equals(test.getTestStatus())
+                    || !"RECEIVING".equals(test.getReceptionStatus())) continue;
             for (TTestBattery battery : test.getBatteries() == null ? List.<TTestBattery>of() : test.getBatteries())
                 captureCollectorMeasurements(test, battery);
         }
@@ -182,6 +190,8 @@
             {
                 // 模拟器保留通道历史;只接收本次测试开始后产生的设备时间记录,避免顺序测试串入旧事实。
                 if (startedAt != null && record.deviceTime().isBefore(startedAt.toInstant())) continue;
+                if (test.getReceptionBoundaryAtUtc() != null && record.serverReceivedAt() != null
+                        && record.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant())) continue;
                 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(), ""),
@@ -207,8 +217,9 @@
         for (CollectorRealtimeMeasurement measurement : realtime.measurements())
         {
             if (startedAt != null && measurement.deviceTime().isBefore(startedAt.toInstant())) continue;
-            // 继续接收只接受恢复动作之后查询到的快照;暂停期间采集器自行产生的历史不回补。
-            if (test.getUpdateTime() != null && measurement.serverReceivedAt().isBefore(test.getUpdateTime().toInstant())) continue;
+            // 继续接收只接受恢复动作之后服务器收到的采样;暂停期间采集器历史不回补。
+            if (test.getReceptionBoundaryAtUtc() != null
+                    && measurement.serverReceivedAt().isBefore(test.getReceptionBoundaryAtUtc().toInstant())) continue;
             boolean mapped = battery.getCollectorChannels().stream().anyMatch(mapping ->
                     java.util.Objects.equals(mapping.getChannelCode(), measurement.channelCode())
                     && metricMatches(mapping.getMeasurementCode(), measurement.metricCode()));

--
Gitblit v1.7.1