From 3c05525e27a357590cc2b4cd31300c0ac0cc8af7 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 8 Sep 2026 13:14:13 +0800 Subject: [PATCH] fix(lastleg): search frozen warehouse code and name --- .../lastleg/mapper/LastlegOrderMapper.java | 3 ++ .../lastleg/service/LastlegOrderService.java | 7 +-- .../openapi/overseas-business-v1.yaml | 2 +- ...astlegOrderWarehouseQueryContractTest.java | 19 ++++++++ .../service/LastlegOrderServiceTest.java | 46 +++++++++++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/mapper/LastlegOrderWarehouseQueryContractTest.java diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java index b44ff99e3..cae686970 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java @@ -14,6 +14,9 @@ import java.util.List; @Mapper public interface LastlegOrderMapper extends BaseMapper { + String WAREHOUSE_FILTER_SQL = "(LOWER(TRIM(overseas_warehouse_code)) LIKE CONCAT('%',LOWER({0}),'%') " + + "OR LOWER(TRIM(overseas_warehouse_name)) LIKE CONCAT('%',LOWER({0}),'%'))"; + String CONTAINER_PROGRESS_FILTER = " FROM ll_order o LEFT JOIN ll_inbound_plan p " + "ON p.customer_id=o.customer_id AND p.source_order_id=o.id " + "WHERE o.source_container_booking_id IS NOT NULL AND o.source_container_booking_id<>'' " + 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 8490574b0..9c965b470 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 @@ -511,6 +511,7 @@ public class LastlegOrderService { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "createdFrom must not be after createdTo"); } String currentStatus = StringUtils.hasText(query.currentStatus()) ? query.currentStatus() : query.status(); + String warehouse = StringUtils.hasText(query.warehouse()) ? query.warehouse().trim() : null; return new LambdaQueryWrapper() .eq(StringUtils.hasText(customerId), LastlegOrder::getCustomerId, customerId) .like(StringUtils.hasText(query.orderNo()), LastlegOrder::getOrderNo, query.orderNo()) @@ -520,11 +521,7 @@ public class LastlegOrderService { .like(StringUtils.hasText(query.sourceOrderNo()), LastlegOrder::getSourceOrderNo, query.sourceOrderNo()) .like(StringUtils.hasText(query.containerNo()), LastlegOrder::getContainerNo, query.containerNo()) .eq(StringUtils.hasText(currentStatus), LastlegOrder::getCurrentStatus, currentStatus) - .and(StringUtils.hasText(query.warehouse()), wrapper -> wrapper - .like(LastlegOrder::getOverseasWarehouseId, query.warehouse()) - .or().like(LastlegOrder::getOverseasWarehouseName, query.warehouse()) - .or().like(LastlegOrder::getTransferWarehouseCode, query.warehouse()) - .or().like(LastlegOrder::getTransferWarehouseName, query.warehouse())) + .apply(StringUtils.hasText(warehouse), LastlegOrderMapper.WAREHOUSE_FILTER_SQL, warehouse) .eq(StringUtils.hasText(query.transferWarehouseCode()), LastlegOrder::getTransferWarehouseCode, query.transferWarehouseCode()) .eq(query.abnormal() != null, LastlegOrder::getAbnormal, query.abnormal()) diff --git a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml index f51b51f67..887c14925 100644 --- a/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml +++ b/lastleg-service/src/main/resources/openapi/overseas-business-v1.yaml @@ -160,7 +160,7 @@ paths: - { name: inboundCode, in: query, schema: { type: string } } - { name: sourceOrderNo, in: query, schema: { type: string } } - { name: containerNo, in: query, schema: { type: string } } - - { name: warehouse, in: query, schema: { type: string } } + - { name: warehouse, in: query, description: 按尾程订单冻结的海外接柜仓名称或编码进行大小写无关的包含匹配, schema: { type: string } } - { name: transferWarehouseCode, in: query, schema: { type: string } } - { name: abnormal, in: query, schema: { type: boolean } } - { name: detained, in: query, schema: { type: boolean } } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/mapper/LastlegOrderWarehouseQueryContractTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/mapper/LastlegOrderWarehouseQueryContractTest.java new file mode 100644 index 000000000..81f692eac --- /dev/null +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/mapper/LastlegOrderWarehouseQueryContractTest.java @@ -0,0 +1,19 @@ +package com.baiyue.lastleg.mapper; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class LastlegOrderWarehouseQueryContractTest { + @Test + void warehouseFilterUsesOnlyFrozenReceivingWarehouseCodeAndName() { + String sql = LastlegOrderMapper.WAREHOUSE_FILTER_SQL; + + assertTrue(sql.contains("LOWER(TRIM(overseas_warehouse_code))")); + assertTrue(sql.contains("LOWER(TRIM(overseas_warehouse_name))")); + assertTrue(sql.contains("LIKE CONCAT('%',LOWER({0}),'%')")); + assertFalse(sql.contains("overseas_warehouse_id")); + assertFalse(sql.contains("transfer_warehouse")); + } +} 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 0acce48a0..bd7fd3eaa 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 @@ -282,6 +282,26 @@ class LastlegOrderServiceTest { assertEquals(25, page.getValue().getSize()); } + @Test + void pageWarehouseFilterMatchesFrozenWarehouseName() { + assertWarehouseFilter("洛杉矶仓", "洛杉矶仓", true); + } + + @Test + void pageWarehouseFilterMatchesFrozenWarehouseCodeIgnoringCaseAndSpaces() { + assertWarehouseFilter(" us-lax-01 ", "us-lax-01", true); + } + + @Test + void pageWarehouseFilterMatchesPartialFrozenWarehouseCode() { + assertWarehouseFilter("LAX-0", "LAX-0", true); + } + + @Test + void pageWarehouseFilterReturnsEmptyPageWhenNothingMatches() { + assertWarehouseFilter("WAREHOUSE-NOT-FOUND", "WAREHOUSE-NOT-FOUND", false); + } + @Test void containerProgressPageUsesServerSideAggregatePagination() { var query = new LastlegOrderRequests.ContainerProgressQuery(2, 10, "CONT-", null, null); @@ -480,4 +500,30 @@ class LastlegOrderServiceTest { return order; } + @SuppressWarnings({"rawtypes", "unchecked"}) + private void assertWarehouseFilter(String input, String normalized, boolean matched) { + var resultPage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page(1, 10); + LastlegOrder row = order(11L, "100", "PENDING_ASSIGNMENT", null); + row.setOverseasWarehouseCode("US-LAX-01"); + row.setOverseasWarehouseName("洛杉矶仓"); + resultPage.setRecords(matched ? List.of(row) : List.of()); + resultPage.setTotal(matched ? 1 : 0); + when(orders.selectPage(any(), any())).thenReturn(resultPage); + + var result = service.page(null, new LastlegOrderRequests.Query(1L, 10L, null, null, null, null, + null, null, null, null, input, null, null, null, null, null)); + + ArgumentCaptor> filter = + ArgumentCaptor.forClass(com.baomidou.mybatisplus.core.conditions.Wrapper.class); + verify(orders).selectPage(any(), filter.capture()); + var wrapper = (com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper) filter.getValue(); + String warehouseSql = wrapper.getExpression().getNormal().getSqlSegment(); + assertTrue(warehouseSql.contains("LOWER(TRIM(overseas_warehouse_code))")); + assertTrue(warehouseSql.contains("LOWER(TRIM(overseas_warehouse_name))")); + assertTrue(wrapper.getParamNameValuePairs().containsValue(normalized), + wrapper.getParamNameValuePairs().toString()); + assertEquals(matched ? 1 : 0, result.total()); + assertEquals(matched ? 1 : 0, result.records().size()); + } + }