From e09f8785e186040e15c8ecf1619eb95dfe750b31 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 8 Oct 2026 15:31:56 +0800 Subject: [PATCH] fix(lastleg): export all pages when pagination caps batch size --- .../lastleg/service/LastlegOrderService.java | 10 +++++---- .../service/LastlegOrderServiceTest.java | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderService.java index 418c913c2..3c1043bee 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderService.java @@ -91,7 +91,7 @@ public class LastlegOrderService { public PageResult page(String customerId, LastlegOrderRequests.Query query, String relabelNo) { Page page = orderMapper.selectPage( - new Page<>(query.page(), query.size()), filter(customerId, query, relabelNo).orderByDesc(LastlegOrder::getCreatedAt)); + new Page<>(query.page(), query.size()), filter(customerId, query, relabelNo).orderByDesc(LastlegOrder::getCreatedAt).orderByDesc(LastlegOrder::getId)); Map> mergeRelations = palletMergeRelations(page.getRecords()); Map containerNodes = containerNodes(page.getRecords()); Map dispatchStatuses = dispatchStatuses(page.getRecords()); @@ -537,8 +537,9 @@ public class LastlegOrderService { final int batchSize = 1000; long page = 1; while (true) { - List orders = orderMapper.selectPage(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page, batchSize), - filter(customerId, query).orderByDesc(LastlegOrder::getCreatedAt).orderByDesc(LastlegOrder::getId)).getRecords(); + Page result = orderMapper.selectPage(new Page<>(page, batchSize), + filter(customerId, query).orderByDesc(LastlegOrder::getCreatedAt).orderByDesc(LastlegOrder::getId)); + List orders = result.getRecords(); if (orders.isEmpty()) break; Map containerNodes = containerNodes(orders); for (LastlegOrder order : orders) { @@ -558,7 +559,8 @@ public class LastlegOrderService { output.write(line.getBytes(StandardCharsets.UTF_8)); } output.flush(); - if (orders.size() < batchSize) break; + // The pagination interceptor may cap the requested batch size. + if (!result.hasNext()) break; page++; } } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java index e78748f87..228579147 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/service/LastlegOrderServiceTest.java @@ -414,6 +414,27 @@ class LastlegOrderServiceTest { assertEquals("处理中", LastlegOrderStatus.labelOf("PROCESSING")); } + @Test + void exportContinuesAfterThePaginationInterceptorCapsTheBatchSize() { + when(orders.selectPage(any(), any())).thenAnswer(invocation -> { + com.baomidou.mybatisplus.extension.plugins.pagination.Page page = invocation.getArgument(0); + page.setSize(500); + page.setTotal(501); + long start = (page.getCurrent() - 1) * page.getSize() + 1; + page.setRecords(java.util.stream.LongStream.rangeClosed(start, Math.min(start + 499, 501)) + .mapToObj(id -> order(id, "100", "PENDING_ASSIGNMENT", null)).toList()); + return page; + }); + var query = new LastlegOrderRequests.Query(1L, 20L, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, LastlegOrderRequests.SailingStage.BEFORE_DEPARTURE); + + String csv = new String(service.exportCsv("100", query), StandardCharsets.UTF_8); + + assertEquals(502, csv.lines().count()); + assertTrue(csv.contains("\"LM-501\"")); + verify(orders, org.mockito.Mockito.times(2)).selectPage(any(), any()); + } + @Test void pageWarehouseFilterMatchesFrozenWarehouseName() { assertWarehouseFilter("洛杉矶仓", "洛杉矶仓", true);