fix(lastleg): search frozen warehouse code and name

This commit is contained in:
2026-09-08 13:14:13 +08:00
parent 096ab8d48b
commit 3c05525e27
5 changed files with 71 additions and 6 deletions
@@ -14,6 +14,9 @@ import java.util.List;
@Mapper
public interface LastlegOrderMapper extends BaseMapper<LastlegOrder> {
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&lt;&gt;'' " +
@@ -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<LastlegOrder>()
.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())
@@ -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 } }
@@ -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"));
}
}
@@ -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<LastlegOrder>(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<com.baomidou.mybatisplus.core.conditions.Wrapper<LastlegOrder>> 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<LastlegOrder>) 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());
}
}