From 74f55db1acd945f4860b2d0b4bae48e2b918b32b Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 02 九月 2026 11:30:30 +0800
Subject: [PATCH] 移除接收区间补采与完整性旧链路

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TestDataReceptionServiceImpl.java |   34 ++++++++++++++++------------------
 1 files changed, 16 insertions(+), 18 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 025c217..381adfb 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
@@ -6,8 +6,6 @@
 import java.util.Date;
 import java.util.HexFormat;
 import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.device.bts.BtsDevelopmentSimulator;
@@ -15,7 +13,6 @@
 import com.ruoyi.system.domain.TTest;
 import com.ruoyi.system.domain.TTestBattery;
 import com.ruoyi.system.domain.TTestChannelBinding;
-import com.ruoyi.system.domain.TTestReceptionInterval;
 import com.ruoyi.system.mapper.TTestMapper;
 import com.ruoyi.system.service.ITTestService;
 import com.ruoyi.system.service.ITestDataReceptionService;
@@ -43,6 +40,9 @@
         if (testIds == null) return;
         for (Long testId : testIds)
         {
+            // 锁住测试行直到本轮采样写入完成,暂停/停止动作只能在本轮接收提交后生效。
+            TTest locked = mapper.selectTestByIdForUpdate(testId);
+            if (locked == null || !"RECEIVING".equals(locked.getReceptionStatus())) continue;
             TTest test = tests.selectTestById(testId);
             if (test == null || !"RECEIVING".equals(test.getReceptionStatus())) continue;
             captureTest(test);
@@ -55,45 +55,43 @@
         {
             TTestChannelBinding binding = battery.getBinding();
             if (binding == null || binding.getDevid() == null || binding.getChlid() == null) continue;
-            Optional<TTestReceptionInterval> open = mapper.selectTestReceptionIntervals(test.getTestId()).stream()
-                    .filter(item -> Objects.equals(item.getBindingId(), binding.getBindingId())
-                            && "CABINET_CHANNEL".equals(item.getSourceType())
-                            && Objects.equals(item.getSourceId(), binding.getChannelId())
-                            && "OPEN".equals(item.getIntervalStatus()))
-                    .findFirst();
-            if (open.isEmpty()) continue;
-            Date start = open.get().getStartBoundaryAtUtc();
             List<BtsHistoryRecord> records;
             try { records = simulator.btsRecords(binding.getDevid(), binding.getChlid()); }
             catch (IllegalArgumentException ignored) { continue; }
             for (BtsHistoryRecord record : records)
             {
-                if (start != null && record.deviceTime().isBefore(start.toInstant())) continue;
-                save(test, battery, binding, open.get(), record);
+                save(test, binding, record);
             }
         }
     }
 
-    private void save(TTest test, TTestBattery battery, TTestChannelBinding binding,
-            TTestReceptionInterval interval, BtsHistoryRecord record)
+    private void save(TTest test, TTestChannelBinding binding,
+            BtsHistoryRecord record)
     {
         // 模拟器历史 testid 按通道固定;接收事实必须再带测试作用域,避免顺序测试共用全局幂等键。
         String btsTestId = "SIM-" + binding.getDevid() + "-" + binding.getChlid() + "-T" + test.getTestId();
         byte[] hash = hash(record);
-        String old = mapper.selectSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId());
+        String old = mapper.selectBtsSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId());
         if (old != null)
         {
             if (!old.equalsIgnoreCase(HexFormat.of().formatHex(hash)))
-                mapper.insertBackfillConflict(test.getTestId(), binding.getChannelId(),
+                mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(),
                         "实时接收内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId());
             return;
         }
-        mapper.insertBtsSample(test.getTestId(), binding.getBindingId(), binding.getChannelId(), interval.getIntervalId(),
+        int inserted = mapper.insertBtsSample(test.getTestId(), binding.getBindingId(), binding.getChannelId(), null,
                 btsTestId, record.sequenceId(), Date.from(record.deviceTime()),
                 record.deviceTime().toString(), new Date(), record.cycleNo(), record.stepNo(), record.stepType(),
                 record.stepName(), null,
                 BigDecimal.valueOf(record.voltageV()), BigDecimal.valueOf(record.currentA()),
                 BigDecimal.valueOf(record.capacityAh()), BigDecimal.valueOf(record.energyWh()), hash);
+        if (inserted == 0)
+        {
+            String actual = mapper.selectBtsSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId());
+            if (actual != null && !actual.equalsIgnoreCase(HexFormat.of().formatHex(hash)))
+                mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(),
+                        "实时接收并发内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId());
+        }
     }
 
     private byte[] hash(BtsHistoryRecord record)

--
Gitblit v1.7.1