From 814eb11d2f44c4cda6d675e882f4665c6400c11d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 14 Oct 2026 17:26:41 +0800 Subject: [PATCH] fix(selfop): avoid loading routing manifests during idle planning --- .../analytics/sync/SelfopSchedulePlanner.java | 5 ++++- .../analytics/sync/SelfopSchedulePlannerTest.java | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlanner.java b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlanner.java index 131bb315e..11eab9fca 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlanner.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlanner.java @@ -73,7 +73,10 @@ public class SelfopSchedulePlanner { var last=today.minusDays(local.toLocalTime().isBefore(LocalTime.of(0,5))?2:1); var first=today.minusMonths(2); String digest=hash(config.getWarehouses()); - var roots=tasks.selectList(new QueryWrapper().eq("source_account",config.getSourceAccount()) + // Idle planning needs only day identity; routing manifests can contain thousands of orders. + var roots=tasks.selectList(new QueryWrapper() + .select("request_key","query_from_utc","query_until_utc","scope_hash","status","query_scope_json") + .eq("source_account",config.getSourceAccount()) .eq("execution_purpose","BUSINESS").eq("task_role","ACCOUNT_DISCOVERY").eq("task_type","BACKFILL") .eq("discovery_scope_id",account.getId()).isNull("upstream_task_id").isNull("validation_root_task_id") .ge("query_from_utc",first.atStartOfDay().minusHours(8)).le("query_until_utc",last.plusDays(1).atStartOfDay().minusHours(8))); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlannerTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlannerTest.java index 0ef8cf949..a1191d188 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlannerTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopSchedulePlannerTest.java @@ -103,7 +103,18 @@ class SelfopSchedulePlannerTest { com.baomidou.mybatisplus.core.conditions.query.QueryWrapper query=call.getArgument(0);query.getSqlSegment(); return query.getParamNameValuePairs().containsValue("INVENTORY")?List.of(stock):List.of(scope);}); var account=new SelfopOutboundDiscoveryScope();account.setId(30L);when(taskService.initializeAccount()).thenReturn(account); - var state=new ArrayList();when(tasks.selectList(any())).thenAnswer(call->new ArrayList<>(state)); + var state=new ArrayList();when(tasks.selectList(any())).thenAnswer(call->{ + com.baomidou.mybatisplus.core.conditions.query.QueryWrapper query=call.getArgument(0);query.getSqlSegment(); + if(!query.getParamNameValuePairs().containsValue("BACKFILL"))return new ArrayList<>(state); + // Model the actual database projection so deduplication tests cannot rely on unselected fields. + assertThat(query.getSqlSelect()).isEqualTo("request_key,query_from_utc,query_until_utc,scope_hash,status,query_scope_json"); + return state.stream().map(source->{ + var row=new SelfopSyncTask();row.setRequestKey(source.getRequestKey()); + row.setQueryFromUtc(source.getQueryFromUtc());row.setQueryUntilUtc(source.getQueryUntilUtc()); + row.setScopeHash(source.getScopeHash());row.setStatus(source.getStatus());row.setQueryScopeJson(source.getQueryScopeJson()); + return row; + }).toList(); + }); when(tasks.selectCount(any())).thenAnswer(call->{ com.baomidou.mybatisplus.core.conditions.query.QueryWrapper query=call.getArgument(0);query.getSqlSegment(); var values=query.getParamNameValuePairs().values();