2026-08-28 13:54:32 +08:00
|
|
|
package com.baiyue.lastleg.service;
|
|
|
|
|
|
|
|
|
|
import com.baiyue.lastleg.dto.ContainerPlanProgressDetail;
|
|
|
|
|
import com.baiyue.lastleg.dto.ContainerPlanProgressSummary;
|
|
|
|
|
import com.baiyue.lastleg.dto.LastlegOrderRequests;
|
|
|
|
|
import com.baiyue.lastleg.mapper.LastlegOrderMapper;
|
|
|
|
|
import org.apache.ibatis.annotations.Select;
|
|
|
|
|
import org.apache.ibatis.mapping.SqlSource;
|
|
|
|
|
import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
|
|
|
|
|
import org.apache.ibatis.session.Configuration;
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
|
import java.nio.file.Files;
|
|
|
|
|
import java.nio.file.Path;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
2026-09-08 11:51:04 +08:00
|
|
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
2026-08-28 13:54:32 +08:00
|
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
|
|
|
|
|
|
|
class ContainerPlanProgressContractTest {
|
|
|
|
|
@Test
|
|
|
|
|
void responseFieldsAndServerAggregateStayFrozen() throws Exception {
|
2026-09-07 15:07:34 +08:00
|
|
|
assertEquals(List.of("sourceContainerBookingId", "containerNo", "overseasWarehouseId",
|
|
|
|
|
"overseasWarehouseCode", "overseasWarehouseName", "assignmentVersion",
|
|
|
|
|
"canChangeReceivingWarehouse", "receivingWarehouseLockReason", "totalOrderCount", "inboundCodeCount",
|
2026-08-28 13:54:32 +08:00
|
|
|
"missingInboundCodeCount", "planCount", "plannedInboundCodeCount", "pendingPlanCount",
|
|
|
|
|
"plannedArrivalAt", "allPlansReady", "blockingReason"),
|
|
|
|
|
Arrays.stream(ContainerPlanProgressSummary.class.getRecordComponents())
|
|
|
|
|
.map(value -> value.getName()).toList());
|
|
|
|
|
assertEquals(List.of("orderId", "customerId", "orderNo", "inboundCode", "orderStatus", "planId",
|
|
|
|
|
"planNo", "planStatus", "planValid", "plannedArrivalAt"),
|
|
|
|
|
Arrays.stream(ContainerPlanProgressDetail.Item.class.getRecordComponents())
|
|
|
|
|
.map(value -> value.getName()).toList());
|
|
|
|
|
|
|
|
|
|
Select rows = LastlegOrderMapper.class.getMethod("pageContainerProgress",
|
|
|
|
|
LastlegOrderRequests.ContainerProgressQuery.class, long.class, long.class).getAnnotation(Select.class);
|
|
|
|
|
String sql = String.join("", rows.value()).toLowerCase();
|
|
|
|
|
assertTrue(sql.contains("left join ll_inbound_plan"));
|
|
|
|
|
assertTrue(sql.contains("o.estimated_warehouse_at"));
|
2026-09-08 11:51:04 +08:00
|
|
|
assertTrue(sql.contains("group by o.source_container_booking_id"));
|
|
|
|
|
assertFalse(sql.contains("having "));
|
2026-08-28 13:54:32 +08:00
|
|
|
assertTrue(sql.contains("progress.plannedarrivalat asc"));
|
|
|
|
|
assertTrue(sql.contains("progress.sourcecontainerbookingid asc"));
|
|
|
|
|
assertTrue(sql.contains("limit #{limit} offset #{offset}"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void openApiAndSchemaExposeReadinessAndUnpagedDetail() throws Exception {
|
|
|
|
|
String openApi = Files.readString(Path.of("src/main/resources/openapi/overseas-business-v1.yaml"),
|
|
|
|
|
StandardCharsets.UTF_8);
|
|
|
|
|
String schema = Files.readString(Path.of("src/main/resources/db/lastleg.sql"), StandardCharsets.UTF_8);
|
|
|
|
|
String deployment = Files.readString(Path.of("../deploy/sql/海外区域统一增量-MySQL8.sql"),
|
|
|
|
|
StandardCharsets.UTF_8);
|
|
|
|
|
|
|
|
|
|
assertTrue(openApi.contains("/api/platform/v1/last-leg/orders/container-summaries/{sourceContainerBookingId}:"));
|
|
|
|
|
assertTrue(openApi.contains("ContainerPlanProgressSummary:"));
|
|
|
|
|
assertTrue(openApi.contains("allPlansReady:"));
|
2026-09-08 11:51:04 +08:00
|
|
|
assertTrue(openApi.contains("返回全部稳定来源柜"));
|
|
|
|
|
assertTrue(openApi.contains("全部入仓码均已生成有效独立计划的柜仍保留"));
|
|
|
|
|
assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:list"));
|
|
|
|
|
assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:edit"));
|
|
|
|
|
assertFalse(openApi.contains("platform:overseas-warehouse:order:list"));
|
|
|
|
|
assertFalse(openApi.contains("platform:overseas-warehouse:order:edit"));
|
2026-08-28 13:54:32 +08:00
|
|
|
assertTrue(openApi.contains("ll_order.estimated_warehouse_at"));
|
|
|
|
|
assertTrue(schema.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)"));
|
|
|
|
|
assertTrue(deployment.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)"));
|
|
|
|
|
assertTrue(deployment.contains("assert_container_progress_index_ready"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void mybatisRendersExecutableProgressSqlWithoutXmlEntities() throws Exception {
|
|
|
|
|
Select select = LastlegOrderMapper.class.getMethod("pageContainerProgress",
|
|
|
|
|
LastlegOrderRequests.ContainerProgressQuery.class, long.class, long.class).getAnnotation(Select.class);
|
|
|
|
|
SqlSource source = new XMLLanguageDriver().createSqlSource(new Configuration(),
|
|
|
|
|
String.join("", select.value()), Map.class);
|
|
|
|
|
String sql = source.getBoundSql(Map.of(
|
|
|
|
|
"q", new LastlegOrderRequests.ContainerProgressQuery(1, 20, null, null, null),
|
|
|
|
|
"limit", 20L, "offset", 0L)).getSql().replaceAll("\\s+", " ").trim();
|
|
|
|
|
|
|
|
|
|
assertTrue(sql.contains("source_container_booking_id<>''"));
|
|
|
|
|
assertTrue(sql.contains("LEFT JOIN ll_inbound_plan"));
|
2026-09-08 11:51:04 +08:00
|
|
|
assertTrue(sql.contains("GROUP BY o.source_container_booking_id"));
|
|
|
|
|
assertFalse(sql.contains("HAVING "));
|
2026-08-28 13:54:32 +08:00
|
|
|
assertTrue(!sql.contains("<"));
|
|
|
|
|
}
|
|
|
|
|
}
|