feat(firstleg): add sailing calendar facts and APIs

This commit is contained in:
2026-09-27 18:55:19 +08:00
parent 93e2e8fb44
commit 4525790534
34 changed files with 2694 additions and 5 deletions
@@ -73,7 +73,7 @@ class Phase3FinalUnifiedSqlContractTest {
@Test
void initializationPassIsUniqueAndFinal() throws Exception {
String sql = sql();
String pass = "SELECT 'PASS' AS initialization_status, 'CN' AS region, 210 AS initialized_tables;";
String pass = "SELECT 'PASS' AS initialization_status, 'CN' AS region, 219 AS initialized_tables;";
assertThat(count(sql, pass)).isEqualTo(1);
assertThat(sql.trim()).endsWith(pass);
assertThat(sql)
@@ -0,0 +1,52 @@
package com.baiyue.firstleg.sailingcalendar.fact;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.assertj.core.api.Assertions.assertThat;
class SailingFactsSqlContractTest {
@Test
void definesVersionedReceiptForecastAssignmentAndBookingFacts() throws Exception {
String sql = new ClassPathResource("db/phase4-sailing-facts-schema.sql")
.getContentAsString(StandardCharsets.UTF_8);
assertThat(sql)
.contains("CREATE TABLE fl_sailing_receipt_batch_fact")
.contains("CREATE TABLE fl_sailing_inbound_volume_forecast")
.contains("CREATE TABLE fl_sailing_assignment")
.contains("CREATE TABLE fl_sailing_booking_link")
.contains("receipt_batch_key VARCHAR(64) NOT NULL")
.contains("fact_version INT UNSIGNED NOT NULL")
.contains("received_at DATETIME(3) NOT NULL")
.contains("actual_volume_cbm DECIMAL(18,4) NOT NULL")
.contains("expected_arrival_at DATETIME(3) NOT NULL")
.contains("forecast_volume_cbm DECIMAL(18,4) NOT NULL")
.contains("match_status IN ('FORECAST_MATCHED','RECEIVED','LATE','UNMATCHED','SUPERSEDED')")
.contains("booking_status_snapshot='RELEASED'")
.contains("UNIQUE KEY uk_sailing_booking_active (ocean_booking_id, active_booking_guard)");
}
@Test
void doesNotUseLegacyInboundTimestampOrDeclarationVolumeAsFact() throws Exception {
String sql = new ClassPathResource("db/phase4-sailing-facts-schema.sql")
.getContentAsString(StandardCharsets.UTF_8);
assertThat(sql)
.doesNotContain("inbounded_at DATETIME")
.doesNotContain("original_volume_cbm DECIMAL");
}
@Test
void unifiedInitializationIncludesThePhase4FactsInTheFirstlegSchema() throws Exception {
String unified = Files.readString(Path.of("../deploy/sql/头程数据库统一增量-MySQL8.sql"));
assertThat(unified)
.contains("-- phase4-sailing-calendar-schema.sql")
.contains("-- phase4-sailing-facts-schema.sql")
.contains("USE baiyue_firstleg;")
.contains("CREATE TABLE fl_sailing_receipt_batch_fact")
.contains("CREATE TABLE fl_sailing_booking_link");
}
}