package com.baiyue.lastleg.service; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baiyue.lastleg.dto.LastlegOrderRequests; import com.baiyue.lastleg.dto.LastlegOrderSummary; import com.baiyue.lastleg.entity.LastlegOrder; import com.baiyue.lastleg.mapper.LastlegOrderMapper; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.util.*; import java.util.regex.Pattern; import static org.junit.jupiter.api.Assertions.*; class LastlegOrderBusinessSourceTest { @Test void projectsAndFiltersFormalSourcesWithinTheOrderCustomer() throws Exception { var config = new MybatisConfiguration(); config.setEnvironment(new Environment("test", new JdbcTransactionFactory(), new UnpooledDataSource("org.h2.Driver", "jdbc:h2:mem:business-source;MODE=MySQL", "sa", ""))); config.addMapper(LastlegOrderMapper.class); TableInfoHelper.initTableInfo(new MapperBuilderAssistant(config, "source-test"), LastlegOrder.class); try (var session = new SqlSessionFactoryBuilder().build(config).openSession()) { var db = session.getConnection(); var sql = db.createStatement(); sql.execute("CREATE TABLE ll_order (id BIGINT, customer_id VARCHAR, order_type VARCHAR, source_order_no VARCHAR)"); sql.execute("CREATE TABLE ll_fleet_pool_order_link (lastleg_order_id BIGINT, customer_id VARCHAR, business_type VARCHAR, business_order_no VARCHAR)"); sql.execute("CREATE TABLE ll_fleet_external_booking (customer_id VARCHAR, incoming_no VARCHAR, booking_no VARCHAR)"); sql.execute("INSERT INTO ll_order VALUES (1,'A','LOCAL_LOOSEBOARD','LB-DIRECT'),(2,'A','WAREHOUSE_TRANSFER','WT-POOL')," + "(3,'A','WAREHOUSE_TRANSFER','WT-TRUCK'),(4,'A','WAREHOUSE_TRANSFER','WT-NORMAL')," + "(5,'B','WAREHOUSE_TRANSFER','WT-POOL'),(6,'A','WAREHOUSE_TRANSFER','WT-EXTERNAL')"); sql.execute("INSERT INTO ll_fleet_pool_order_link VALUES (2,'A','LOCAL_LOOSEBOARD','LB-POOL')," + "(3,'A','US_TRUCK','TRUCK-POOL'),(5,'B','LOCAL_LOOSEBOARD','LB-OTHER')," + "(4,'B','LOCAL_LOOSEBOARD','LB-WRONG-CUSTOMER')"); sql.execute("INSERT INTO ll_fleet_external_booking VALUES ('A','WT-POOL','FB-POOL'),('A','WT-TRUCK','FB-TRUCK')," + "('B','WT-POOL','FB-OTHER'),('A','WT-EXTERNAL','FB-EXTERNAL')"); var mapper = session.getMapper(LastlegOrderMapper.class); var sources = mapper.findBusinessSources(List.of(1L,2L,3L,4L,5L,6L)); assertEquals(6, sources.size()); var service = new LastlegOrderService(); ReflectionTestUtils.setField(service,"orderMapper",mapper); List orders = sources.stream().map(row -> { var o = new LastlegOrder(); o.setId(row.orderId()); return o; }).toList(); Map values = ReflectionTestUtils.invokeMethod(service,"businessSources",orders); assertEquals(new LastlegOrderSummary.BusinessSource("LOCAL_LOOSEBOARD","本土散板 · 独立下单","LB-DIRECT",null),values.get(1L)); assertEquals(new LastlegOrderSummary.BusinessSource("LOCAL_LOOSEBOARD","本土散板 · 拼车需求池","LB-POOL","FB-POOL"),values.get(2L)); assertEquals(new LastlegOrderSummary.BusinessSource("US_TRUCK","本土卡车 · 拼车需求池","TRUCK-POOL","FB-TRUCK"),values.get(3L)); assertEquals(new LastlegOrderSummary.BusinessSource("WAREHOUSE_TRANSFER","仓储转运",null,null),values.get(4L)); assertEquals("FB-OTHER",values.get(5L).externalBookingNo()); assertEquals(new LastlegOrderSummary.BusinessSource("WAREHOUSE_TRANSFER","仓储转运 · 外接来货",null,"FB-EXTERNAL"),values.get(6L)); assertEquals(List.of(1L,2L),find(db,"A","LOCAL_LOOSEBOARD",null,null)); assertEquals(List.of(1L,2L,5L),find(db,null,"LOCAL_LOOSEBOARD",null,null)); assertEquals(List.of(4L,6L),find(db,"A","WAREHOUSE_TRANSFER",null,null)); assertEquals(List.of(3L),find(db,"A","US_TRUCK",null,null)); assertEquals(List.of(2L),find(db,"A",null,"LB-POOL","FB-POOL")); assertEquals(List.of(),find(db,"A",null,"LB-OTHER",null)); assertEquals(List.of(),find(db,"A",null,null,"FB-OTHER")); assertEquals(List.of(),find(db,"A",null,"' OR 1=1 --",null)); } } private List find(java.sql.Connection db,String customer,String businessType,String businessOrderNo,String bookingNo) throws Exception { var query = new LastlegOrderRequests.Query(1L,20L,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,businessType,businessOrderNo,bookingNo); LambdaQueryWrapper filter = ReflectionTestUtils.invokeMethod(new LastlegOrderService(),"filter",customer,query); var matcher = Pattern.compile("#\\{ew.paramNameValuePairs.([^}]+)}").matcher(filter.getSqlSegment()); var parameters = new ArrayList(); var bound = new StringBuilder(); while(matcher.find()) { parameters.add(filter.getParamNameValuePairs().get(matcher.group(1))); matcher.appendReplacement(bound,"?"); } matcher.appendTail(bound); try(var statement = db.prepareStatement("SELECT id FROM ll_order WHERE " + bound + " ORDER BY id")) { for(int i=0;i(); try(var rows=statement.executeQuery()){while(rows.next())ids.add(rows.getLong(1));} return ids; } } }