From 99935242ecccd94e76978e2b71cbc46b87d31dc6 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期五, 09 十月 2026 11:17:44 +0800
Subject: [PATCH] 推式来源的工步与循环改为从采样段推导

---
 ruoyi-admin/src/test/java/com/battery/business/runtime/PushIngestLandingMigrationContractTest.java |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/battery/business/runtime/PushIngestLandingMigrationContractTest.java b/ruoyi-admin/src/test/java/com/battery/business/runtime/PushIngestLandingMigrationContractTest.java
index fe58e3f..c1b1d75 100644
--- a/ruoyi-admin/src/test/java/com/battery/business/runtime/PushIngestLandingMigrationContractTest.java
+++ b/ruoyi-admin/src/test/java/com/battery/business/runtime/PushIngestLandingMigrationContractTest.java
@@ -207,6 +207,33 @@
         assertTrue(latest.getPayloadJson().contains("Voltage"));
     }
 
+    /**
+     * 工步与循环的分段推导读的就是这条查询(ADR-0067):某一个来源库在该通道上的采样行,
+     * 按 (设备时间, 协议序号) 升序——推导依赖这个次序判断哪一段还在进行;其他来源库、
+     * 其他通道与其他来源的行都不混进来。
+     */
+    @Test
+    void samplesOfOneSourceRefComeBackInWatermarkOrderAndNothingElseDoes()
+    {
+        mapper.insertIngestRecord(sample(26, "DB_20260927_155209/Ws26_IV_0:12", 12L, "{\"Voltage\":1.3}",
+                Instant.parse("2026-09-27T07:53:20Z")));
+        mapper.insertIngestRecord(sample(26, "DB_20260927_155209/Ws26_IV_0:11", 11L, "{\"Voltage\":1.2}",
+                Instant.parse("2026-09-27T07:52:20Z")));
+        // 换了来源库(厂商侧另一次测试)、另一个通道:都不属于本次推导范围。
+        TDeviceIngestRecord laterTest = sample(26, "DB_20260928_101010/Ws26_IV_0:1", 1L, "{\"Voltage\":1.4}",
+                Instant.parse("2026-09-28T02:10:10Z"));
+        laterTest.setSourceRef("DB_20260928_101010/Ws26_IV_0");
+        mapper.insertIngestRecord(laterTest);
+        mapper.insertIngestRecord(sample(18, "DB_20260923_161840/Ws18_IV_0:5", 5L, "{\"Voltage\":1.1}",
+                Instant.parse("2026-09-23T08:18:40Z")));
+
+        List<TDeviceIngestRecord> rows = mapper.selectSamplesOfSource(ADAPTER, 0, 0, 1, 26,
+                "DB_20260927_155209/Ws26_IV_0");
+
+        assertEquals(List.of(11L, 12L), rows.stream().map(TDeviceIngestRecord::getRecordSequence).toList());
+        assertTrue(mapper.selectSamplesOfSource(ADAPTER, 0, 0, 1, 26, "DB_20261001_000000/Ws26_IV_0").isEmpty());
+    }
+
     /** 供 H2 别名使用的 HEX 等价实现;H2 没有 MySQL 的 HEX()。 */
     public static String hexOf(byte[] value)
     {

--
Gitblit v1.7.1