refactor(flight-state): 按 flight-state.md 审计定稿全量重构脚手架与 SQL (ACM2-31)
- SQL 基线 V1__flight_state_baseline.sql 整体取代 V1.0.0–V1.4.0: PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/BACKFILL_TODO/FLIGHT_SCHD + 8 张资源明细表 + FLIGHT_ROUTE_POINT + SCHD_SNAP_LOG 留痕层 - 废除 FDAY 日代/SCHD_GEN/名单差删:OPERATION_DAY 不可变(应用层校验 + 条件更新强化 §7.4),STATE 仅 ACTIVE/DELETED,物理清除只在历史归档后 - 处理器化:applyScheduleRecords(§5.1 七步同一事务,重放判定/整包 DEAD(PROTOCOL)/归属冲突不落地)+ FLOP/FDEL/ADFT(tombstone 仅 ACTIVE→DELETED,重复 FDEL 幂等不推进版本) - 投递:KAFKA_SCHD 同 FLID 按最新 STATE_VERSION 合并,被压掉事件关闭, TOMBSTONE 发 null 值消息(键缺失=删除旧值 §7.3) - 回填待办改为业务事务内预登记,消除提交后写待办的崩溃窗口(§7.2/§10) - XML 解码改为 jackson-dataformat-xml 数据类直接映射(SIS 信封强类型, FLTR 开放标签泛型承载) - 历史归档/物理清除顺序不可颠倒:归档确认成功集才物理删除,未接通删 0 条 - 移除 PUMP_JOB 队列/ReferenceService/FlightStoreDiffTool 等旧机制与测试, 新增运营日/引擎/快照/FDEL/归档顺序不变性回归测试
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package com.gzzn.omms.msgexchange.domain
|
||||
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertFalse
|
||||
import org.junit.jupiter.api.Assertions.assertNull
|
||||
import org.junit.jupiter.api.Test
|
||||
import java.time.LocalDate
|
||||
import java.time.ZoneId
|
||||
|
||||
/**
|
||||
* 运营日计算(docs/flight-state.md §3.5):SODT(ddMMMyyHHmm)+ 机场时区 + 业务切日边界。
|
||||
*/
|
||||
class OperationDayTest {
|
||||
|
||||
private val zone: ZoneId = ZoneId.of("Asia/Shanghai")
|
||||
|
||||
@Test
|
||||
fun `computes operation day from SODT with zero cutoff`() {
|
||||
val calc = OperationDayCalculator(zone, cutoffHour = 0)
|
||||
assertEquals(LocalDate.of(2026, 12, 15), calc.compute("15DEC261723"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `time before cutoff rolls back to previous operation day`() {
|
||||
val calc = OperationDayCalculator(zone, cutoffHour = 4)
|
||||
// 04:00 之前 → 前一运营日
|
||||
assertEquals(LocalDate.of(2026, 12, 14), calc.compute("15DEC260230"))
|
||||
// 04:00 整点起归属当日
|
||||
assertEquals(LocalDate.of(2026, 12, 15), calc.compute("15DEC260400"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invalid or missing SODT returns null`() {
|
||||
val calc = OperationDayCalculator(zone, 0)
|
||||
assertNull(calc.compute(null))
|
||||
assertNull(calc.compute(""))
|
||||
assertNull(calc.compute("garbage"))
|
||||
assertNull(calc.compute("99XXC12345"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `cutoff outside 0 to 23 is clamped to 23`() {
|
||||
val calc = OperationDayCalculator(zone, cutoffHour = 99)
|
||||
// 越界收敛为 23:当日 00:00 早于 23 点 → 归属前一运营日
|
||||
assertEquals(LocalDate.of(2026, 12, 14), calc.compute("15DEC260000"))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user