|
@@ -857,6 +857,39 @@ class HarOrderServiceTest {
|
|
|
assertNotNull(o.getNextQueryTime());
|
|
assertNotNull(o.getNextQueryTime());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 退避表逐格钉值(2026-10-15 用户裁定 B:未支付观察期内 5 分钟封顶)。
|
|
|
|
|
+ *
|
|
|
|
|
+ * <p>来历:上游未支付单自带关单时刻 —— 码被扫过的 5~6 分钟关、没扫的
|
|
|
|
|
+ * 30~31 分钟关。旧表 240s 之后直接跳 900s,两个关单窗(300~360s /
|
|
|
|
|
+ * 1800~1860s)都落在查询空档里,最坏晚 8~9 分钟才收敛。新表落点
|
|
|
|
|
+ * 30/60/120/240/540/840/1140/1440/1740/2040s,两个窗都在 ≤5 分钟的
|
|
|
|
|
+ * 检出界内;此后 15 分钟封顶。
|
|
|
|
|
+ *
|
|
|
|
|
+ * <p>count=10 那一格钉的是「300s 只到 count=9 为止」的边界:把封顶行
|
|
|
|
|
+ * 放宽成 count<=10 就会在这一格变红。
|
|
|
|
|
+ */
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void reschedulePoll_backoffLadder_cappedAt5minThroughUnpaidWindow() {
|
|
|
|
|
+ // {queryCount, 期望延迟秒}
|
|
|
|
|
+ int[][] cases = {
|
|
|
|
|
+ {0, 30}, {1, 30}, {2, 60}, {3, 120},
|
|
|
|
|
+ {4, 300}, {5, 300}, {9, 300},
|
|
|
|
|
+ {10, 900}, {12, 900},
|
|
|
|
|
+ };
|
|
|
|
|
+ for (int[] c : cases) {
|
|
|
|
|
+ HarOrderEntity o = order("HAR1", HarOrderStatus.WAIT_PAY);
|
|
|
|
|
+ o.setQueryCount(c[0]);
|
|
|
|
|
+ java.time.OffsetDateTime before = java.time.OffsetDateTime.now();
|
|
|
|
|
+
|
|
|
|
|
+ service.reschedulePoll(o);
|
|
|
|
|
+
|
|
|
|
|
+ long delta = java.time.Duration.between(before, o.getNextQueryTime()).getSeconds();
|
|
|
|
|
+ assertTrue(Math.abs(delta - c[1]) <= 2,
|
|
|
|
|
+ "queryCount=" + c[0] + " 期望约 " + c[1] + "s,实得 " + delta + "s");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/** 上游将来加了新状态,继续查比静默停掉安全 */
|
|
/** 上游将来加了新状态,继续查比静默停掉安全 */
|
|
|
@Test
|
|
@Test
|
|
|
void reschedulePoll_unknownStatus_keepsPolling() {
|
|
void reschedulePoll_unknownStatus_keepsPolling() {
|