From 2d7b6e438104e5d685279e370ef1dbf691a9dadd Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 13 Oct 2026 10:04:06 +0800 Subject: [PATCH] test(selfop): verify warehouse summary build transactions --- .../OutboundCandidateBuildMySqlAcceptanceTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/outbound/OutboundCandidateBuildMySqlAcceptanceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/outbound/OutboundCandidateBuildMySqlAcceptanceTest.java index b9f98120b..538c72b02 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/outbound/OutboundCandidateBuildMySqlAcceptanceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/outbound/OutboundCandidateBuildMySqlAcceptanceTest.java @@ -122,6 +122,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest { assertEquals(pointerBefore,jdbc.queryForMap("SELECT published_run_id,published_fact_revision FROM ll_selfop_sync_scope WHERE id=?",scopeId)); assertEquals(0L,jdbc.queryForObject("SELECT COUNT(*) FROM ll_selfop_outbound_discovery_scope WHERE source_account=?",Long.class,account)); assertTrue(transactionEvidence.inserts>0);assertFalse(transactionEvidence.nonTransactional); + assertEquals((skus*(long)days+499)/500,transactionEvidence.warehouseDailyInserts,"Each committed daily batch must write one warehouse summary"); BigDecimal quantity=jdbc.queryForObject("SELECT SUM(outbound_quantity) FROM ll_selfop_sku_daily_sales WHERE sales_run_id=?",BigDecimal.class,runId); assertEquals(0,BigDecimal.valueOf((long)skus*days).compareTo(quantity)); assertEquals(0,quantity.compareTo(jdbc.queryForObject("SELECT SUM(observed_quantity) FROM ll_selfop_warehouse_daily_sales WHERE sales_run_id=?",BigDecimal.class,runId))); @@ -188,6 +189,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest { private static int bounded(String key,int fallback,int min,int max){String value=System.getenv(key);int n=value==null?fallback:Integer.parseInt(value);assertTrue(n>=min&&n<=max,key+" outside bounded range");return n;} private void captureStatementMetrics(){ report.put("buildMappedStatementCalls",transactionEvidence.calls); + report.put("warehouseDailyInsertStatements",transactionEvidence.warehouseDailyInserts); report.put("buildMappedStatements",transactionEvidence.snapshot()); } private void writeProgress()throws java.io.IOException { @@ -200,7 +202,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest { @Intercepts({@Signature(type=Executor.class,method="update",args={MappedStatement.class,Object.class}), @Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,org.apache.ibatis.session.RowBounds.class,org.apache.ibatis.session.ResultHandler.class})}) public static class TransactionEvidence implements Interceptor { - long inserts,calls;boolean nonTransactional,active; + long inserts,warehouseDailyInserts,calls;boolean nonTransactional,active; private final Map metrics=new LinkedHashMap<>(); Map snapshot(){ Map result=new LinkedHashMap<>();metrics.forEach((id,m)->result.put(id,Map.of("calls",m[0],"failedCalls",m[1],"totalClientElapsedMs",m[2]/1000000.0,"maxClientElapsedMs",m[3]/1000000.0))); @@ -209,8 +211,10 @@ class OutboundCandidateBuildMySqlAcceptanceTest { @Override public Object intercept(Invocation invocation)throws Throwable { if(!active)return invocation.proceed(); String id=((MappedStatement)invocation.getArgs()[0]).getId(); - if(id.equals(OutboundAggregateMapper.class.getName()+".insertDaily")||id.equals(OutboundAggregateMapper.class.getName()+".insertProfiles")) { - inserts++;nonTransactional|=!TransactionSynchronizationManager.isActualTransactionActive(); + boolean warehouseDaily=id.equals(OutboundAggregateMapper.class.getName()+".insertWarehouseDaily"); + if(warehouseDaily||id.equals(OutboundAggregateMapper.class.getName()+".insertDaily")||id.equals(OutboundAggregateMapper.class.getName()+".insertProfiles")) { + inserts++;if(warehouseDaily)warehouseDailyInserts++; + nonTransactional|=!TransactionSynchronizationManager.isActualTransactionActive(); } long start=System.nanoTime();boolean succeeded=false;calls++; try {Object value=invocation.proceed();succeeded=true;return value;}