This commit is contained in:
2026-08-14 10:57:05 +08:00
parent 66089f9b99
commit 91e781b3ff
16 changed files with 219 additions and 119 deletions
@@ -1,6 +1,8 @@
package com.baiyue.firstleg.repository;
import org.junit.jupiter.api.Test;
import org.apache.ibatis.annotations.Select;
import com.baiyue.firstleg.mapper.ContainerOverviewMapper;
import org.springframework.core.io.ClassPathResource;
import java.nio.charset.StandardCharsets;
@@ -10,6 +12,14 @@ import java.nio.file.Path;
import static org.assertj.core.api.Assertions.assertThat;
class ContainerOverviewSqlContractTest {
@Test void pdaSummarySelectsRecordFieldsExplicitlyIncludingTaskVersion() throws Exception {
String sql = String.join(" ", ContainerOverviewMapper.class.getDeclaredMethod("pickTask", long.class)
.getAnnotation(Select.class).value());
assertThat(sql).contains("loading_plan_id AS loadingPlanId",
"container_booking_id AS containerBookingId", "task_status AS taskStatus", "version")
.doesNotContain("SELECT *");
}
@Test void developmentAndUnifiedSchemasContainImmutableIdempotentExceptionHistory() throws Exception {
String development = new ClassPathResource("db/phase3-smart-loading-schema.sql")
.getContentAsString(StandardCharsets.UTF_8);
@@ -60,12 +60,16 @@ class Phase3ChannelContainerMigrationContractTest {
.contains("@phase3_channel_message = MESSAGE_TEXT")
.contains("渠道柜迁移失败:货柜只读触发器未恢复")
.contains("渠道柜迁移失败:PDA任务只读触发器未恢复")
.contains("装柜完成后货柜全部只读,不允许修改")
.contains("current_plan_status IN ('LOADING', 'COMPLETED')")
.contains("装柜作业开始后仅允许修改集装箱号与放舱运输数据")
.contains("已完成PDA拣货任务不可修改")
.contains("NOT (OLD.channel_code <=> NEW.channel_code)")
.contains("NOT (OLD.channel_name <=> NEW.channel_name)")
.contains("NOT (OLD.ocean_booking_id <=> NEW.ocean_booking_id)")
.contains("NOT (OLD.ocean_booking_requirement_id <=> NEW.ocean_booking_requirement_id)")
.doesNotContain("NOT (OLD.bill_of_lading_no <=> NEW.bill_of_lading_no)")
.doesNotContain("NOT (OLD.vessel_name <=> NEW.vessel_name)")
.doesNotContain("NOT (OLD.estimated_sailing_at <=> NEW.estimated_sailing_at)")
.doesNotContain("p.plan_status='COMPLETED'");
assertThat(call).isGreaterThan(0);
assertThat(containerRestore).isGreaterThan(call);
@@ -81,7 +81,8 @@ class SmartLoadingSqlContractTest {
assertThat(Files.readString(Path.of("src/main/resources/db/phase3-simple-customs-document-migration.sql"),
StandardCharsets.UTF_8))
.contains("CREATE TRIGGER trg_container_booking_before_update")
.contains("IF current_plan_status='COMPLETED' THEN")
.contains("current_plan_status IN ('LOADING','COMPLETED')")
.contains("装柜作业开始后仅允许修改集装箱号与放舱运输数据")
.contains("NEW.document_type NOT IN ('DESTINATION_CLEARANCE', 'CUSTOMS_DECLARATION')")
.contains("OLD.document_type NOT IN ('DESTINATION_CLEARANCE', 'CUSTOMS_DECLARATION')");
}
@@ -145,8 +146,11 @@ class SmartLoadingSqlContractTest {
.contains("SET frozen_at = COALESCE(frozen_at, NEW.confirmed_at, CURRENT_TIMESTAMP(3))")
.contains("已有PDA拣货记录的装柜明细仅允许收敛部分拣货实际箱数")
.contains("装柜完成后的明细永久冻结")
.contains("装柜中仅允许修改集装箱号与航次")
.contains("装柜完成后货柜全部只读,不允许修改")
.contains("current_plan_status IN ('LOADING', 'COMPLETED')")
.contains("装柜作业开始后仅允许修改集装箱号与放舱运输数据")
.doesNotContain("NOT (OLD.bill_of_lading_no <=> NEW.bill_of_lading_no)")
.doesNotContain("NOT (OLD.vessel_name <=> NEW.vessel_name)")
.doesNotContain("NOT (OLD.estimated_sailing_at <=> NEW.estimated_sailing_at)")
.doesNotContain("preload_status")
.doesNotContain("PRELOAD_PUSHED")
.doesNotContain("PRELOADING")