From 01c94663c22a8570030d7c83f3c14152b4a03cf2 Mon Sep 17 00:00:00 2001 From: zgw <13623675548@163.com> Date: Fri, 28 Aug 2026 10:17:16 +0800 Subject: [PATCH] fix(shadow): start queue cursor at database time --- .../java/com/ruoyi/shadow/facts/ShadowReadCursor.java | 4 ++++ .../com/ruoyi/shadow/facts/SqlServerShadowFactReader.java | 8 ++++++-- .../ruoyi/shadow/facts/SqlServerShadowFactReaderTest.java | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/ShadowReadCursor.java b/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/ShadowReadCursor.java index a7dbc71..df014c4 100644 --- a/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/ShadowReadCursor.java +++ b/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/ShadowReadCursor.java @@ -35,4 +35,8 @@ public final class ShadowReadCursor { public Instant getLastCreateDate() { return lastCreateDate; } public Instant getOverlapStart() { return lastCreateDate; } public String getLastGuid() { return lastGuid; } + + public boolean isInitial() { + return BEGINNING.equals(lastCreateDate) && lastGuid.isEmpty(); + } } diff --git a/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/SqlServerShadowFactReader.java b/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/SqlServerShadowFactReader.java index 7eece7f..86966cc 100644 --- a/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/SqlServerShadowFactReader.java +++ b/ruoyi-wcs-shadow/src/main/java/com/ruoyi/shadow/facts/SqlServerShadowFactReader.java @@ -69,7 +69,7 @@ public final class SqlServerShadowFactReader { } try { ShadowFactBatch batch = sourceTransaction.execute(status -> - collect(cursor.withOverlap(CURSOR_OVERLAP), deadline)); + collect(cursor, deadline)); if (batch == null) { throw new ShadowFactReadException("SOURCE_EMPTY_BATCH", Duration.ZERO); @@ -94,7 +94,11 @@ public final class SqlServerShadowFactReader { private ShadowFactBatch collect(ShadowReadCursor cursor, Instant deadline) { ensureTime(deadline); Instant databaseStartedAt = source.readDatabaseClock(deadline); - List queues = immutable(source.readQueues(cursor, deadline)); + ShadowReadCursor queryCursor = cursor.isInitial() + ? new ShadowReadCursor(databaseStartedAt, "") : cursor; + queryCursor = queryCursor.withOverlap(CURSOR_OVERLAP); + List queues = immutable(source.readQueues( + queryCursor, deadline)); requireLimit("QUEUE", queues.size(), QUEUE_LIMIT); List vehicles = immutable(source.readVehicles(deadline)); diff --git a/ruoyi-wcs-shadow/src/test/java/com/ruoyi/shadow/facts/SqlServerShadowFactReaderTest.java b/ruoyi-wcs-shadow/src/test/java/com/ruoyi/shadow/facts/SqlServerShadowFactReaderTest.java index 787ea07..b102cb3 100644 --- a/ruoyi-wcs-shadow/src/test/java/com/ruoyi/shadow/facts/SqlServerShadowFactReaderTest.java +++ b/ruoyi-wcs-shadow/src/test/java/com/ruoyi/shadow/facts/SqlServerShadowFactReaderTest.java @@ -61,6 +61,7 @@ class SqlServerShadowFactReaderTest { siteIds(batch.getMaps())); assertEquals(3, batch.getSourceQueues().size()); assertEquals("070502", batch.vehicle("1").getCurrentSite()); + assertEquals(NOW.minusMillis(5_500), source.cursor.getOverlapStart()); assertTrue(batch.getDatabaseCapturedAt().isBefore(NOW.plusSeconds(4))); assertEquals(1, transactions.calls); assertTrue(transactions.readOnly);