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:
windyboy
2026-09-09 17:53:08 +08:00
parent 6af292d103
commit 879d658159
83 changed files with 3435 additions and 6355 deletions
+14 -9
View File
@@ -5,12 +5,11 @@
# 口令/端点全部环境变量外置——零入库。
# 存储边界:自有 PostgreSQLdatasources.default,全部内部状态与运营航班权威 FLIGHT_SCHD/SCHD_GEN+
# 共享 MySQL 信箱(mailbox.shared-mysql,仅 DML,不建表)+
# Kafka + Eureka/logstash(见 ACM2-28 与 docsRedis 彻底退出阶段 A 权威与写路径)
# Kafka + Eureka/logstash。权威设计:docs/flight-state.md
# 键位口径:Micronaut 5.1U03):datasources.* / flyway.datasources.* /
# kafka.producers.<name>.* / eureka.client.*Micronaut 原生键)。
# =====================================================================
msgx:
phase: A # 航班动态权威落自有 PG(FLIGHT_SCHD,主泵单线程写,I5ACM2-28 定案)
service-name: msgexchangeapi # 契约冻结;影子实例用 msgexchangeapi-shadow
register-eureka: true # 影子对拍期置 false 或独立服务名
pipeline: # —— ACMA-8 参数表初值(阶段 0 基线校准)——
@@ -24,11 +23,16 @@ msgx:
schd:
flush-period: 3s # KEEP 现役推送节律
flush-limit: 500 # 批上限,防积压尖峰
identity:
include-day-boundary: false # CONFIRM(矩阵 #11):SEQN 重置作用域确认前保持关闭
consistency-check: # 一致性哨兵(实装属 U25
on-startup: true
daily-sample-ratio: 0.01
operation-day: # §3.5:SODT + 机场时区 + 切日边界(默认占位 0 点,待业务确认 §10)
zone: Asia/Shanghai
cutoff-hour: 0
history: # §8:历史判定窗口与保留期
cancelled-hours: 48
terminal-hours: 48
deleted-hours: 48
idle-hours: 168
snap-log-retention-days: 90
history-store-enabled: false # 未接通历史存储时 HISTORY_SWEEP 删 0 条(§8.2
micronaut:
application:
@@ -37,8 +41,9 @@ micronaut:
port: 8080
# 管理端点(U03/N32):/env、/beans 默认 sensitive;仅开发/影子环境放开——见 application-dev.yml
# 自有 PostgreSQL:全部内部状态(消息管道 PROC_STATE/MSG_EVENT、PUMP_JOB、REQ_TRACK、
# 21 类 REF_MASTER、运营航班表 FLIGHT_SCHD 与 SCHD_GEN;迁移 db/migrationACM2-28)。数据层实装前 enabled=false
# 自有 PostgreSQL:全部内部状态(PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/BACKFILL_TODO/
# FLIGHT_SCHD 及明细表/SCHD_SNAP_LOG;迁移 db/migration/V1__flight_state_baseline.sql
# 数据层实装前 enabled=falsestub 模式不建连)。
datasources:
default:
enabled: false
@@ -1,79 +0,0 @@
-- =====================================================================
-- 自有 PostgreSQL 库(唯一自有数据库)· ACM2-12 定稿口径
-- ---------------------------------------------------------------------
-- 存储边界(ACM2-12,取代 ACMA-8 v4「MySQL 六辅助表」口径,原 MySQL V2.0.0
-- 六表脚本已删除,定义见 git 历史):
-- · 自有 PG:全部内部状态 —— 消息管道(PROC_STATE / MSG_EVENT+ 调度与请求
-- PUMP_JOB / REQ_TRACK+ 21 类静态主数据(REF_MASTER)。本地事务只在此库。
-- · 共享 MySQLcdairport,他人系统库):仅信箱 DML —— 上游外部写 CMINMSGS
-- 本系统 JDBC 轮询读 + 处理回填;出站写 COUTMSGS(他人读取发送);
-- 本系统不在此建表/schema(迁移不覆盖)。
-- · Redis:航班动态 flightInfo + 快照 SCHD_GENLua 原子,另行脚本)。
-- · FLIGHT_STATE(阶段 B 权威):缓做,不落表(Redis 永续动态权威)。
-- 21 类静态表 REF_MASTER 为通用 rtype/rkey 形态(SOURCE 审计;gen/SCHD_GEN
-- 已迁 Redis,不再需要 VERSION/CAS 列)。
-- 影子对拍:本库开独立 schema/实例;共享信箱只读水位/回放(见 ACM2-12 影响面)。
-- =====================================================================
-- ① 处理伴生状态(取消息侧;与共享库 CMINMSGS 一一对应,CMINMSGS_ID 沿用其主键;
-- 入队由 JDBC 轮询发现新信后写入,非本系统创建 CMINMSGS 原文)
CREATE TABLE PROC_STATE (
CMINMSGS_ID BIGINT PRIMARY KEY,
STATE VARCHAR(16) NOT NULL, -- PENDING/FAILED/SUCCEEDED/SKIPPED/DEAD
IDENTITY_KEY VARCHAR(200), -- SNDR|TYPE|STYP|SEQNdecode 后首次绑定(I3
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP,
ERROR_CLASS VARCHAR(20), -- MALFORMED/CODEC_ERROR/EXHAUSTED/INFRA/UNSUPPORTED
LAST_ERROR VARCHAR(1000),
UPDATED_AT TIMESTAMP NOT NULL,
CONSTRAINT uk_proc_identity UNIQUE (IDENTITY_KEY)
);
CREATE INDEX idx_proc_head ON PROC_STATE (STATE, CMINMSGS_ID); -- 主泵队头查询(I1
-- ② 统一投递事件 outbox(发消息侧)
CREATE TABLE MSG_EVENT (
EVENT_ID BIGSERIAL PRIMARY KEY,
TARGET VARCHAR(30) NOT NULL, -- KAFKA:msg / KAFKA:schdA起);ES:flight_hts / REDIS:flightInfoB起)
PARTITION_KEY VARCHAR(64), -- schd 事件恒为 FLID
PAYLOAD_JSON TEXT NOT NULL,
STATE VARCHAR(16) NOT NULL, -- PENDING/SENT/DEAD
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP,
ERROR_CLASS VARCHAR(20),
LAST_ERROR VARCHAR(1000),
CREATED_AT TIMESTAMP NOT NULL
);
CREATE INDEX idx_evt_head ON MSG_EVENT (TARGET, STATE, EVENT_ID); -- 每 target 队头(I1 双层)
-- ③ 泵作业调度记录(作业不插队:仅在消息队头空闲/退避窗口由主泵执行,决策 1 修订)
CREATE TABLE PUMP_JOB (
JOB_ID BIGSERIAL PRIMARY KEY,
KIND VARCHAR(20) NOT NULL, -- ARCHIVE / HISTORY_SWEEP / PROJECTION_REBUILD
STATE VARCHAR(16) NOT NULL, -- QUEUED/RUNNING/DONE/FAILED
CREATED_AT TIMESTAMP NOT NULL,
UPDATED_AT TIMESTAMP NOT NULL,
LAST_ERROR VARCHAR(1000)
);
-- ④ 15 类请求状态机(Reference & Query 域;与共享库 COUTMSGS 跨库:
-- 先落 COUTMSGS 成功 → 再标 SENT,补偿重扫,最终一致)
CREATE TABLE REQ_TRACK (
REQ_ID BIGSERIAL PRIMARY KEY,
REQ_TYPE VARCHAR(20) NOT NULL,
PARAMS_JSON TEXT NOT NULL,
STATE VARCHAR(16) NOT NULL, -- REGISTERED/SENT/WAITING/DONE/EXPIRED
COUTMSGS_ID BIGINT, -- U18 修正:BIGINT(原 MySQL 版 INT
SENT_AT TIMESTAMP,
COMPLETED_AT TIMESTAMP
);
CREATE INDEX idx_req_open ON REQ_TRACK (REQ_TYPE, STATE);
-- ⑤ 21 类静态主数据(SOURCE=ADMINAPI/AODB/PIPELINE 审计;弱事务 upsert
CREATE TABLE REF_MASTER (
RTYPE VARCHAR(20) NOT NULL, -- AIRL/ARPT/...
RKEY VARCHAR(64) NOT NULL,
PAYLOAD_JSON TEXT NOT NULL,
SOURCE VARCHAR(20) NOT NULL,
REFRESHED_AT TIMESTAMP NOT NULL,
PRIMARY KEY (RTYPE, RKEY)
);
@@ -1,115 +0,0 @@
-- =====================================================================
-- 自有库 · 阶段 A 运营航班表与计划代迁移 · ACM2-28 定案(选项 C)· 11g 修订
-- ---------------------------------------------------------------------
-- 存储边界(ACM2-28 定案,取代 ACM2-12「FLIGHT_STATE 缓做不落表、Redis 永续权威」口径):
-- · FLIGHT_SCHDSCHD 日计划快照 + FLOP/ADFT 增量合并后的当前运营航班权威态,一行一航班。
-- · SCHD_GEN / SCHD_GEN_FLID:各日代版本(SQL CAS)与当前代航班全量集合(差删依据)。
-- · Redis:彻底退出动态权威与全部写路径;阶段 A 读写事务全在自有库原子完成。
-- · 增量 Upsert 语义:
-- - 快照全量写入(DNLD):声明/更新 FDAY 归属,航班字段整体替换;
-- - 增量写入(FLOP/ADFT):新插置 NULL FDAY,已有行保留原 FDAY,按字段列更新
-- (与 legacy flightInfo hash「仅新增/覆盖 field」同语义);
-- - 按代差删域化:DELETE FROM FLIGHT_SCHD WHERE FDAY = :day AND FLID IN (:diffSet)
-- 仅删除仍属旧代的行,ADFT(FDAY=NULL)与已迁移至新代的同 FLID 行天然存活。
-- · 时间列规范:统一使用 TIMESTAMP(6) WITH TIME ZONE。
-- ---------------------------------------------------------------------
-- 11g 修订(现场数据库版本 11g,废除 FLTR_JSON JSONB 整文档存储):
-- · 表形态 = 运营航班宽表:一行一航班,字段即列,天然可索引、可直查、可加约束;
-- · 列清单锚定 legacy SIS 契约(unisysaodbsis.xsd SCHD.FLTR 记录,ACMA-4 基线,
-- 32 个 Handler 的 KEEP/FIX 翻译即以此为闭集):
-- - 标量字段 → 真实列(约 45 列 + legacy 派生列 ABDG/LPSDT/ABN);
-- - 1:N 明细集合(登机口/柜台/转盘/桥/延误/航线等,单航班可达 99 条)各占一列
-- 存序列化文本(TEXT;11g 移植为 CLOB),阶段 2/3 语义钉死后按需升独立子表;
-- · 值语义保持 legacy 字符串原样(不做库端类型转换),保证影子对拍逐字段保真;
-- 范围查询需要的类型化列(如 SODT→DATE)按查询需求逐列后置提升。
-- =====================================================================
-- ① 运营航班表(当前运营航班动态权威,FLID 与 legacy flightInfo 同键;一行一航班)
CREATE TABLE FLIGHT_SCHD (
FLID VARCHAR(32) NOT NULL PRIMARY KEY, -- AODB 唯一航班标识
FDAY DATE NULL, -- 所属日计划代;NULL = 非代所有(ADFT/增量增建)
-- ==== SCHD.FLTR 标量字段(unisysaodbsis.xsd,值保持 legacy 字符串原样)====
ALCD VARCHAR(64) NULL, -- 航空公司代码
ALSC VARCHAR(64) NULL, -- 航空公司简称
FLNO VARCHAR(64) NULL, -- 航班号
MVIN VARCHAR(64) NULL, -- 进离港标识(A=到港 D=离港)
SODT VARCHAR(64) NULL, -- 计划时间(ddMMMyyHHmm
FLTY VARCHAR(64) NULL, -- 航班类型
FLIN VARCHAR(64) NULL, -- 国内/国际/混合属性
ACFT VARCHAR(64) NULL, -- 机型
RENO VARCHAR(64) NULL, -- 机尾号
TAOP VARCHAR(64) NULL, -- 实际承运人代码
TAFL VARCHAR(64) NULL, -- 实际承运航班号
TAID VARCHAR(64) NULL, -- 实际承运航班 FLID
TRML VARCHAR(64) NULL, -- 航站楼
MAXP VARCHAR(64) NULL, -- 最大旅客数
CSOP VARCHAR(64) NULL, -- 共享承运人代码
CSFT VARCHAR(64) NULL, -- 共享航班号
MAID VARCHAR(32) NULL, -- 共享主航班 FLID
ESTT VARCHAR(64) NULL, -- 预计时间
ACTT VARCHAR(64) NULL, -- 实际时间
STND VARCHAR(64) NULL, -- 备降站
PHAG VARCHAR(64) NULL, -- 地服代理(值机)
CNCL VARCHAR(64) NULL, -- 取消时间
REMC VARCHAR(80) NULL, -- 备注
BOTM VARCHAR(64) NULL, -- 摆渡车时间
LACL VARCHAR(64) NULL, -- 行李确认时间
FINT VARCHAR(64) NULL, -- 完成时间
APPT VARCHAR(64) NULL, -- 旅客到达时间
EGSR VARCHAR(64) NULL, -- 保障开始时间
EGST VARCHAR(64) NULL, -- 保障结束时间
FHAG VARCHAR(64) NULL, -- 地服代理(货运)
MHAG VARCHAR(64) NULL, -- 地服代理(机务)
VIPP VARCHAR(64) NULL, -- VIP 旅客数
VIPR VARCHAR(64) NULL, -- VIP 等级
LBNO VARCHAR(64) NULL, -- 行李件数
LBWT VARCHAR(64) NULL, -- 行李重量
PAXC VARCHAR(64) NULL, -- 旅客计数
EXSC VARCHAR(64) NULL, -- 例外代码
EXSR VARCHAR(256) NULL, -- 例外原因
FTSS VARCHAR(64) NULL, -- 航班状态
PEDT VARCHAR(64) NULL, -- 前序估计时间
NEAT VARCHAR(64) NULL, -- 下机完成时间
PADT VARCHAR(64) NULL, -- 旅客登机时间
NAAT VARCHAR(64) NULL, -- 关门时间
-- ==== legacy flightInfo 派生标量字段(user-stories §SCHD.FLTR====
ABDG VARCHAR(64) NULL, -- 当前登机桥(派生)
LPSDT VARCHAR(64) NULL, -- 历史计划机位(派生)
ABN VARCHAR(64) NULL, -- 异常标识(派生)
-- ==== 1:N 明细集合(序列化文本,一列一集合;阶段 2/3 按需升独立子表)====
ROUT_TXT TEXT NULL, -- 航线(ROUTEDAILY ×6
ERUT_TXT TEXT NULL, -- 扩展航线(ROUTEDAILY ×2..7
CHDT_TXT TEXT NULL, -- 廊桥/ chute 数据(×99
GTDT_TXT TEXT NULL, -- 登机口(×99
PSDT_TXT TEXT NULL, -- 机位(×9
CKDT_TXT TEXT NULL, -- 值机柜台(×99
CLDT_TXT TEXT NULL, -- 行李转盘(×99
DELY_TXT TEXT NULL, -- 延误(不限)
CHOT_TXT TEXT NULL, -- 客桥桥载(×99
ABTM_TXT TEXT NULL, -- 登机桥(×99
SRVT_TXT TEXT NULL, -- 服务(不限)
VIPF_TXT TEXT NULL, -- VIP(不限)
MAFL_TXT TEXT NULL, -- 共享航班列表(legacy 派生集合)
FDIV_TXT TEXT NULL, -- 备降明细
FRET_TXT TEXT NULL, -- 返航明细
FLAB_TXT TEXT NULL, -- 中止明细
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_flight_schd_fday ON FLIGHT_SCHD (FDAY); -- 日代扫描与影子对拍分片
-- 运营查询索引按需逐列追加(11g/PG 均为普通 B-tree,零方言成本)
-- ② 日计划代与差删元数据表(代版本推进与版本 CAS)
CREATE TABLE SCHD_GEN (
FDAY DATE NOT NULL PRIMARY KEY, -- 计划日(yyyy-MM-dd
VERSION BIGINT NOT NULL, -- 代版本号(单调递增)
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
-- ③ 当前代有效航班 FLID 集合(差删依据)
CREATE TABLE SCHD_GEN_FLID (
FDAY DATE NOT NULL, -- 所属计划日(FK 级联删除)
FLID VARCHAR(32) NOT NULL, -- 当前代有效航班
CONSTRAINT pk_schd_gen_flid PRIMARY KEY (FDAY, FLID),
CONSTRAINT fk_schd_gen_flid FOREIGN KEY (FDAY) REFERENCES SCHD_GEN (FDAY) ON DELETE CASCADE
);
@@ -1,118 +0,0 @@
-- =====================================================================
-- ACM2-29 · 全宽表·零子表(Zero-Subtable Wide Table)定案落地
-- ---------------------------------------------------------------------
-- 废除「16 个明细集合保留 *_TXT 并逐个升独立子表」的原规划(对 XSD
-- maxOccurs=99 的过度设计)。结合 docs/legacy/SIS_AODB_RMS-V0.1.md 报文
-- 样例与成都现场(双流/天府)地服实际规律——登机门 1~2 个、值机柜台专属
-- 1~3 个、转盘 1~2 个、延误单有效、靠撤桥/轮挡各 1 次——全部集合收敛为
-- FLIGHT_SCHD 宽表的标准 VARCHAR 标量列或紧凑格式化字串,零子表、零 CLOB:
-- · 平铺标量列(属性名 + 出现槽位序号,可按需直接追加普通 B-tree,
-- 11g/PG 零方言成本):
-- GTDT → GATE/PGOT/PGCT/GOTM/GCTM/GTYP ×2 组(登机门 1~2 个)
-- CKDT → CHKC/CCLS/PCOT/PCCT/COTM/CCTM/CTYP ×3 组
-- (值机柜台 1~3 个;同柜台分舱复用条目在写侧抹平去重)
-- CLDT → BELT/BCLS/BPCOT/BPCCT/FBAG/LBAG/BTYP ×2 组(转盘 1~2 个;
-- B 前缀时刻 = BELT 专属,避免与值机 PCOT/PCCT 同名)
-- PSDT → PSST/STST/STET ×2 组(计划机位 1~2 个)
-- CHDT → CHUT/CHCLS/PCBT/PCET/CBTM/CETM/CHTYP ×2 组(离港通道 1~2 个;
-- CH 前缀 = CHUTE 专属,避免与值机 CCLS/CTYP 同名)
-- DELY → DELY_CODE/DELY_STRT/DELY_DURA/DELY_REMC(单有效覆盖语义)
-- ABTM → ABTM_A/ABTM_D(靠桥/撤桥时刻;桥号沿用派生列 ABDG)
-- CHOT → CHOT_ON/CHOT_OFF(上/下轮挡时刻;机位沿用派生列 STND)
-- FDIV/FRET/FLAB → 前缀标量列(规范 1:0..1 单值异常)
-- 超出现场定界的条目按定案丢弃(不再为 XSD 理论上限设计)。
-- · 紧凑 VARCHAR 字串列(无界/航路型集合,11g VARCHAR2 内联存储,非 CLOB):
-- ROUT/ERUT → ROUT_PATH/ERUT_PATH(≤7 站紧凑航路 "APCD/SCAT/SCDT,..."
-- SRVT/VIPF/MAFL → *_TEXT(服务/VIP/共享列表条数无 XSD 上限,存 JSON 数组;
-- 超长写侧 fail fast,不允许静默截断)
-- · 值语义保持 legacy 字符串原样;读侧视图由标量列重建集合键,
-- 与 legacy flightInfo hash 同构(KAFKA_SCHD 线格式与 FS7 对拍不变)。
-- · 运营资源消息语义 = 单资源集合级全量快照替换;外层航班字段仍为
-- 字段级增量合并(集合键出现即整集合覆盖,缺槽位置 NULL)。
-- ---------------------------------------------------------------------
-- 交叉实例单写者互斥(I5 修正定案):PIPELINE_LOCK 行级锁。主泵写事务
-- 持有 FLIGHT_SCHD_WRITER 行 SELECT ... FOR UPDATE;连接断开、提交或回滚
-- 时由数据库释放,PG 与 Oracle 11g 同构,无 DBMS_LOCK DBA 特权依赖。
-- =====================================================================
ALTER TABLE FLIGHT_SCHD
-- 登机门 GTDT(现场 1~2 个)
ADD COLUMN GATE1 VARCHAR(64), ADD COLUMN PGOT1 VARCHAR(64), ADD COLUMN PGCT1 VARCHAR(64),
ADD COLUMN GOTM1 VARCHAR(64), ADD COLUMN GCTM1 VARCHAR(64), ADD COLUMN GTYP1 VARCHAR(64),
ADD COLUMN GATE2 VARCHAR(64), ADD COLUMN PGOT2 VARCHAR(64), ADD COLUMN PGCT2 VARCHAR(64),
ADD COLUMN GOTM2 VARCHAR(64), ADD COLUMN GCTM2 VARCHAR(64), ADD COLUMN GTYP2 VARCHAR(64),
-- 值机柜台 CKDT(现场专属 1~3 个,分舱复用条目写侧抹平)
ADD COLUMN CHKC1 VARCHAR(64), ADD COLUMN CCLS1 VARCHAR(64),
ADD COLUMN PCOT1 VARCHAR(64), ADD COLUMN PCCT1 VARCHAR(64),
ADD COLUMN COTM1 VARCHAR(64), ADD COLUMN CCTM1 VARCHAR(64), ADD COLUMN CTYP1 VARCHAR(64),
ADD COLUMN CHKC2 VARCHAR(64), ADD COLUMN CCLS2 VARCHAR(64),
ADD COLUMN PCOT2 VARCHAR(64), ADD COLUMN PCCT2 VARCHAR(64),
ADD COLUMN COTM2 VARCHAR(64), ADD COLUMN CCTM2 VARCHAR(64), ADD COLUMN CTYP2 VARCHAR(64),
ADD COLUMN CHKC3 VARCHAR(64), ADD COLUMN CCLS3 VARCHAR(64),
ADD COLUMN PCOT3 VARCHAR(64), ADD COLUMN PCCT3 VARCHAR(64),
ADD COLUMN COTM3 VARCHAR(64), ADD COLUMN CCTM3 VARCHAR(64), ADD COLUMN CTYP3 VARCHAR(64),
-- 行李转盘 CLDT(现场 1~2 个;B 前缀时刻 = BELT 专属)
ADD COLUMN BELT1 VARCHAR(64), ADD COLUMN BCLS1 VARCHAR(64),
ADD COLUMN BPCOT1 VARCHAR(64), ADD COLUMN BPCCT1 VARCHAR(64),
ADD COLUMN FBAG1 VARCHAR(64), ADD COLUMN LBAG1 VARCHAR(64), ADD COLUMN BTYP1 VARCHAR(64),
ADD COLUMN BELT2 VARCHAR(64), ADD COLUMN BCLS2 VARCHAR(64),
ADD COLUMN BPCOT2 VARCHAR(64), ADD COLUMN BPCCT2 VARCHAR(64),
ADD COLUMN FBAG2 VARCHAR(64), ADD COLUMN LBAG2 VARCHAR(64), ADD COLUMN BTYP2 VARCHAR(64),
-- 计划机位 PSDT(现场 1~2 个)
ADD COLUMN PSST1 VARCHAR(64), ADD COLUMN STST1 VARCHAR(64), ADD COLUMN STET1 VARCHAR(64),
ADD COLUMN PSST2 VARCHAR(64), ADD COLUMN STST2 VARCHAR(64), ADD COLUMN STET2 VARCHAR(64),
-- 离港行李通道 CHDT(现场 1~2 个;CH 前缀 = CHUTE 专属)
ADD COLUMN CHUT1 VARCHAR(64), ADD COLUMN CHCLS1 VARCHAR(64),
ADD COLUMN PCBT1 VARCHAR(64), ADD COLUMN PCET1 VARCHAR(64),
ADD COLUMN CBTM1 VARCHAR(64), ADD COLUMN CETM1 VARCHAR(64), ADD COLUMN CHTYP1 VARCHAR(64),
ADD COLUMN CHUT2 VARCHAR(64), ADD COLUMN CHCLS2 VARCHAR(64),
ADD COLUMN PCBT2 VARCHAR(64), ADD COLUMN PCET2 VARCHAR(64),
ADD COLUMN CBTM2 VARCHAR(64), ADD COLUMN CETM2 VARCHAR(64), ADD COLUMN CHTYP2 VARCHAR(64),
-- 延误 DELY(单有效覆盖语义)
ADD COLUMN DELY_CODE VARCHAR(64),
ADD COLUMN DELY_STRT VARCHAR(64),
ADD COLUMN DELY_DURA VARCHAR(64),
ADD COLUMN DELY_REMC VARCHAR(80),
-- 靠撤桥 ABTM / 轮挡 CHOT(保障里程碑时刻)
ADD COLUMN ABTM_A VARCHAR(64),
ADD COLUMN ABTM_D VARCHAR(64),
ADD COLUMN CHOT_ON VARCHAR(64),
ADD COLUMN CHOT_OFF VARCHAR(64),
-- 异常明细 FDIV/FRET/FLAB(规范 1:0..1 单值异常)
ADD COLUMN FDIV_DDES VARCHAR(64),
ADD COLUMN FDIV_DDIR VARCHAR(64),
ADD COLUMN FDIV_REMC VARCHAR(80),
ADD COLUMN FRET_REID VARCHAR(64),
ADD COLUMN FRET_RSN VARCHAR(80),
ADD COLUMN FLAB_ARES VARCHAR(64),
ADD COLUMN FLAB_RSN VARCHAR(80),
-- 紧凑航路字串(≤7 站,免除多表关联)
ADD COLUMN ROUT_PATH VARCHAR(256),
ADD COLUMN ERUT_PATH VARCHAR(256),
-- 无界集合紧凑 JSON 数组字串(11g VARCHAR2 内联,非 CLOB;超长写侧 fail fast
ADD COLUMN SRVT_TEXT VARCHAR(2000),
ADD COLUMN VIPF_TEXT VARCHAR(512),
ADD COLUMN MAFL_TEXT VARCHAR(512);
-- 16 个集合的过渡 *_TXT 文本列全清场
ALTER TABLE FLIGHT_SCHD
DROP COLUMN ROUT_TXT, DROP COLUMN ERUT_TXT, DROP COLUMN CHDT_TXT,
DROP COLUMN GTDT_TXT, DROP COLUMN PSDT_TXT, DROP COLUMN CKDT_TXT,
DROP COLUMN CLDT_TXT, DROP COLUMN DELY_TXT, DROP COLUMN CHOT_TXT,
DROP COLUMN ABTM_TXT, DROP COLUMN SRVT_TXT, DROP COLUMN VIPF_TXT,
DROP COLUMN MAFL_TXT, DROP COLUMN FDIV_TXT, DROP COLUMN FRET_TXT,
DROP COLUMN FLAB_TXT;
-- 运营查询索引按需逐列追加示例(11g/PG 均为普通 B-tree,零方言成本):
-- CREATE INDEX idx_flight_schd_gate1 ON FLIGHT_SCHD (GATE1);
-- CREATE INDEX idx_flight_schd_chkc1 ON FLIGHT_SCHD (CHKC1);
-- CREATE INDEX idx_flight_schd_dely_code ON FLIGHT_SCHD (DELY_CODE);
-- 交叉实例单写者互斥行(I5SELECT ... FOR UPDATE 行级锁)
CREATE TABLE PIPELINE_LOCK (
LOCK_KEY VARCHAR(32) NOT NULL PRIMARY KEY,
OWNER_INFO VARCHAR(128),
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
INSERT INTO PIPELINE_LOCK (LOCK_KEY, OWNER_INFO, UPDATED_AT)
VALUES ('FLIGHT_SCHD_WRITER', NULL, CURRENT_TIMESTAMP);
@@ -1,146 +0,0 @@
-- docs/flight-state.md (ACM2-29): lossless detail tables + tracking columns
ALTER TABLE flight_schd
ADD COLUMN IF NOT EXISTS last_message_id VARCHAR(64),
ADD COLUMN IF NOT EXISTS state_version BIGINT NOT NULL DEFAULT 0;
ALTER TABLE schd_gen
ADD COLUMN IF NOT EXISTS last_message_id VARCHAR(64);
CREATE TABLE IF NOT EXISTS flight_gate (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
gate VARCHAR(64),
pgot VARCHAR(64),
pgct VARCHAR(64),
gotm VARCHAR(64),
gctm VARCHAR(64),
gtyp VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_checkin (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
chkc VARCHAR(64),
ccls VARCHAR(64),
pcot VARCHAR(64),
pcct VARCHAR(64),
cotm VARCHAR(64),
cctm VARCHAR(64),
ctyp VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_belt (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
belt VARCHAR(64),
bcls VARCHAR(64),
pcot VARCHAR(64),
pcct VARCHAR(64),
fbag VARCHAR(64),
lbag VARCHAR(64),
btyp VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_stand_plan (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
psst VARCHAR(64),
stst VARCHAR(64),
stet VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_chute (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
chut VARCHAR(64),
chcls VARCHAR(64),
pcbt VARCHAR(64),
pcet VARCHAR(64),
cbtm VARCHAR(64),
cetm VARCHAR(64),
chtyp VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_delay (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
code VARCHAR(64),
strt VARCHAR(64),
dura VARCHAR(64),
remc VARCHAR(80),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_bridge_op (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
abdg VARCHAR(64),
abop VARCHAR(64),
aotm VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_chock_op (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
chid VARCHAR(64),
chst VARCHAR(64),
chtm VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE TABLE IF NOT EXISTS flight_route_point (
flid VARCHAR(32) NOT NULL,
ordinal INTEGER NOT NULL,
source_seq VARCHAR(64),
record_version BIGINT NOT NULL DEFAULT 0,
route_kind VARCHAR(8) NOT NULL,
apcd VARCHAR(64),
scat VARCHAR(64),
scdt VARCHAR(64),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (flid, ordinal)
);
CREATE INDEX IF NOT EXISTS idx_flight_gate_flid ON flight_gate (flid);
CREATE INDEX IF NOT EXISTS idx_flight_checkin_flid ON flight_checkin (flid);
CREATE INDEX IF NOT EXISTS idx_flight_belt_flid ON flight_belt (flid);
@@ -1,57 +0,0 @@
-- docs/flight-state.md §8 (ACM2-29 P2-2): compatibility read view.
-- 提供「首个/第二个资源 + 总数」的运营查询投影;完整明细仍在各明细表可查。
-- PG 专属语法(LATERAL);Oracle 11g 方言随 P3-B 单独提供 location。
CREATE OR REPLACE VIEW flight_schd_display AS
SELECT
f.flid,
f.fday,
f.flno,
f.mvin,
f.sodt,
f.stnd,
f.abdg,
f.state_version,
f.last_message_id,
g1.gate AS gate1,
g2.gate AS gate2,
COALESCE(g_total.cnt, 0) AS gate_total,
c1.chkc AS chkc1,
c2.chkc AS chkc2,
COALESCE(c_total.cnt, 0) AS checkin_total,
b1.belt AS belt1,
COALESCE(b_total.cnt, 0) AS belt_total,
dly.code AS dely_code,
dly.strt AS dely_strt
FROM flight_schd f
LEFT JOIN LATERAL (
SELECT gate FROM flight_gate WHERE flid = f.flid ORDER BY ordinal LIMIT 1 OFFSET 0
) g1 ON TRUE
LEFT JOIN LATERAL (
SELECT gate FROM flight_gate WHERE flid = f.flid ORDER BY ordinal LIMIT 1 OFFSET 1
) g2 ON TRUE
LEFT JOIN LATERAL (
SELECT count(*) AS cnt FROM flight_gate WHERE flid = f.flid
) g_total ON TRUE
LEFT JOIN LATERAL (
SELECT chkc FROM flight_checkin WHERE flid = f.flid ORDER BY ordinal LIMIT 1 OFFSET 0
) c1 ON TRUE
LEFT JOIN LATERAL (
SELECT chkc FROM flight_checkin WHERE flid = f.flid ORDER BY ordinal LIMIT 1 OFFSET 1
) c2 ON TRUE
LEFT JOIN LATERAL (
SELECT count(*) AS cnt FROM flight_checkin WHERE flid = f.flid
) c_total ON TRUE
LEFT JOIN LATERAL (
SELECT belt FROM flight_belt WHERE flid = f.flid ORDER BY ordinal LIMIT 1 OFFSET 0
) b1 ON TRUE
LEFT JOIN LATERAL (
SELECT count(*) AS cnt FROM flight_belt WHERE flid = f.flid
) b_total ON TRUE
LEFT JOIN LATERAL (
SELECT code, strt FROM flight_delay WHERE flid = f.flid ORDER BY ordinal LIMIT 1
) dly ON TRUE;
@@ -1,18 +0,0 @@
-- docs/flight-state.md §5 (ACM2-29 P2-3): 提交后共享信箱回填的持久补偿待办。
-- 业务事务已提交(PROC_STATE=SUCCEEDED)后回填失败 → 落本表重试;
-- 回填失败不得把已成功的业务事务重新标记为失败,也不得重放业务变更。
CREATE TABLE IF NOT EXISTS backfill_todo (
cminmsgs_id BIGINT PRIMARY KEY,
sndr VARCHAR(64) NOT NULL,
type VARCHAR(32) NOT NULL,
styp VARCHAR(32),
seqn BIGINT,
attempts INTEGER NOT NULL DEFAULT 0,
next_attempt_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
last_error VARCHAR(512),
created_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_backfill_todo_due ON backfill_todo (next_attempt_at);
@@ -1,45 +0,0 @@
-- docs/flight-state.md §7 步骤 5 (ACM2-29 P4): 旧损失性结构退场。
-- v2 无损明细表已是唯一权威存储(V1.3.0 起),槽位/里程碑/紧凑航路列自 V1.3.0 起零写入、
-- P2-2 起零读取;对拍(FS7 v2 双读 + 全结构回环矩阵)与升级链验证通过后关闭回退窗口,
-- 本迁移物理删除这些列与其冗余索引。SRVT/VIPF/MAFL_TEXT 与异常前缀列为无损承载,保留。
ALTER TABLE flight_schd
DROP COLUMN IF EXISTS gate1, DROP COLUMN IF EXISTS pgot1, DROP COLUMN IF EXISTS pgct1,
DROP COLUMN IF EXISTS gotm1, DROP COLUMN IF EXISTS gctm1, DROP COLUMN IF EXISTS gtyp1,
DROP COLUMN IF EXISTS gate2, DROP COLUMN IF EXISTS pgot2, DROP COLUMN IF EXISTS pgct2,
DROP COLUMN IF EXISTS gotm2, DROP COLUMN IF EXISTS gctm2, DROP COLUMN IF EXISTS gtyp2,
DROP COLUMN IF EXISTS chkc1, DROP COLUMN IF EXISTS ccls1, DROP COLUMN IF EXISTS pcot1,
DROP COLUMN IF EXISTS pcct1, DROP COLUMN IF EXISTS cotm1, DROP COLUMN IF EXISTS cctm1,
DROP COLUMN IF EXISTS ctyp1, DROP COLUMN IF EXISTS chkc2, DROP COLUMN IF EXISTS ccls2,
DROP COLUMN IF EXISTS pcot2, DROP COLUMN IF EXISTS pcct2, DROP COLUMN IF EXISTS cotm2,
DROP COLUMN IF EXISTS cctm2, DROP COLUMN IF EXISTS ctyp2, DROP COLUMN IF EXISTS chkc3,
DROP COLUMN IF EXISTS ccls3, DROP COLUMN IF EXISTS pcot3, DROP COLUMN IF EXISTS pcct3,
DROP COLUMN IF EXISTS cotm3, DROP COLUMN IF EXISTS cctm3, DROP COLUMN IF EXISTS ctyp3,
DROP COLUMN IF EXISTS belt1, DROP COLUMN IF EXISTS bcls1, DROP COLUMN IF EXISTS bpcot1,
DROP COLUMN IF EXISTS bpcct1, DROP COLUMN IF EXISTS fbag1, DROP COLUMN IF EXISTS lbag1,
DROP COLUMN IF EXISTS btyp1, DROP COLUMN IF EXISTS belt2, DROP COLUMN IF EXISTS bcls2,
DROP COLUMN IF EXISTS bpcot2, DROP COLUMN IF EXISTS bpcct2, DROP COLUMN IF EXISTS fbag2,
DROP COLUMN IF EXISTS lbag2, DROP COLUMN IF EXISTS btyp2,
DROP COLUMN IF EXISTS psst1, DROP COLUMN IF EXISTS stst1, DROP COLUMN IF EXISTS stet1,
DROP COLUMN IF EXISTS psst2, DROP COLUMN IF EXISTS stst2, DROP COLUMN IF EXISTS stet2,
DROP COLUMN IF EXISTS chut1, DROP COLUMN IF EXISTS chcls1, DROP COLUMN IF EXISTS pcbt1,
DROP COLUMN IF EXISTS pcet1, DROP COLUMN IF EXISTS cbtm1, DROP COLUMN IF EXISTS cetm1,
DROP COLUMN IF EXISTS chtyp1, DROP COLUMN IF EXISTS chut2, DROP COLUMN IF EXISTS chcls2,
DROP COLUMN IF EXISTS pcbt2, DROP COLUMN IF EXISTS pcet2, DROP COLUMN IF EXISTS cbtm2,
DROP COLUMN IF EXISTS cetm2, DROP COLUMN IF EXISTS chtyp2,
DROP COLUMN IF EXISTS dely_code, DROP COLUMN IF EXISTS dely_strt,
DROP COLUMN IF EXISTS dely_dura, DROP COLUMN IF EXISTS dely_remc,
DROP COLUMN IF EXISTS abtm_a, DROP COLUMN IF EXISTS abtm_d,
DROP COLUMN IF EXISTS chot_on, DROP COLUMN IF EXISTS chot_off,
DROP COLUMN IF EXISTS rout_path, DROP COLUMN IF EXISTS erut_path;
-- V1.3.0 的三个 (flid) 单列索引与 PK (flid, ordinal) 前缀冗余(L2),一并清理
DROP INDEX IF EXISTS idx_flight_gate_flid;
DROP INDEX IF EXISTS idx_flight_checkin_flid;
DROP INDEX IF EXISTS idx_flight_belt_flid;
@@ -0,0 +1,306 @@
-- =====================================================================
-- 航班运行数据接入与当前状态管理 · 全量基线
-- ---------------------------------------------------------------------
-- 权威设计:docs/flight-state.md(审计定稿)。本脚本整体取代历史迁移
-- V1.0.0V1.4.0 已删除),按 §3.2 表职责建立全部分层:
-- · 决策层:FLIGHT_SCHD + 8 张资源明细表 + FLIGHT_ROUTE_POINT —— 承担正确性;
-- · 管道层:PIPELINE_LOCK / PROC_STATE / MSG_EVENT(outbox) / REQ_TRACK / BACKFILL_TODO
-- · 留痕层:SCHD_SNAP_LOG —— 只追加、不参与决策、可重建;
-- · 证据层:报文原文归档 —— 冷路径,尚未交付(ARCHIVE_KEY 仅留引用位)。
-- 核心定案(对照文档章节):
-- · 身份:FLID 主键;OPERATION_DAY 一经确定不可变(§3.1/§5.3,应用层校验);
-- STATE ∈ {ACTIVE, DELETED},无 ARCHIVED —— 物理清除只发生在历史归档成功之后(§8.2);
-- · 无名单差删:主链路无集合删除;删除入口只有 FDEL(§6.2)与历史归档(§8.2);
-- · 版本:每次成功写入推进 STATE_VERSIONKafka 判旧 = (FLID, STATE_VERSION, UPDATED_AT)(§7.3);
-- · 出站:COUTMSGS 是共享 MySQL 信箱(他人系统库,本系统不建表,迁移不覆盖)。
-- 类型口径:TIMESTAMP(6) WITH TIME ZONE 统一 UTC 语义;无 JSONB/CLOB 依赖;
-- BIGSERIAL 为 PostgreSQL 方言(Oracle 适配见 §10,未定前不预设)。
-- =====================================================================
-- ① 单行锁:串行化状态写事务(§1 边界:只串行化 DB 事务,不代替消息认领/选主/故障切换)
CREATE TABLE PIPELINE_LOCK (
LOCK_ID INT NOT NULL PRIMARY KEY, -- 恒为 1
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
INSERT INTO PIPELINE_LOCK (LOCK_ID, UPDATED_AT) VALUES (1, now());
-- ② 处理伴生状态:与共享信箱 CMINMSGS 一一对应(MSG_ID = CMINMSGS_ID)。
-- 兼作快照重放判定(§5.1 步骤 2):MSG_ID 已有成功终态 → 重放,直接记幂等成功。
CREATE TABLE PROC_STATE (
MSG_ID BIGINT NOT NULL PRIMARY KEY,
STATE VARCHAR(16) NOT NULL, -- PENDING/FAILED/SUCCEEDED/SKIPPED/DEAD
IDENTITY_KEY VARCHAR(200), -- SNDR|TYPE|STYP|SEQNdecode 后首次绑定;SEQN 同会话顺序观测 §5.5)
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP(6) WITH TIME ZONE,
ERROR_CLASS VARCHAR(20), -- MALFORMED/PROTOCOL/INFRA/UNSUPPORTED/EXHAUSTED(§9
LAST_ERROR VARCHAR(1000),
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
CONSTRAINT uk_proc_identity UNIQUE (IDENTITY_KEY)
);
CREATE INDEX idx_proc_head ON PROC_STATE (STATE, MSG_ID); -- 主泵队头查询(严格 FIFO
-- ③ 航班当前态主行:一行一 FLID(决策层权威;展示视图是投影,不是权威 §3.3)
CREATE TABLE FLIGHT_SCHD (
FLID VARCHAR(32) NOT NULL PRIMARY KEY, -- AODB 实例 IDNumber(1-12)SIS §3.16.2
OPERATION_DAY DATE NULL, -- 运营保障日;一经确定不可变(§3.5);NULL=尚未被快照收录
STATE VARCHAR(8) NOT NULL, -- ACTIVE/DELETED(§3.1,无第三态)
STATE_VERSION BIGINT NOT NULL DEFAULT 0, -- 每次成功写入 +1(§4
LAST_MSG_ID BIGINT NULL, -- 最近一次成功写入的消息 ID
-- ==== SCHD.FLTR 标量字段(值保持 AODB 字符串原样;缺失语义由处理层决定,§5.4)====
ALCD VARCHAR(64) NULL, -- 航空公司代码
ALSC VARCHAR(64) NULL, -- 航空公司简称
FLNO VARCHAR(64) NULL, -- 航班号(展示用,不参与身份判定 §3.1)
MVIN VARCHAR(64) NULL, -- 进离港标识(A/D
SODT VARCHAR(64) NULL, -- 计划运行时间(ddMMMyyHHmmOPERATION_DAY 计算源 §3.5
FLTY VARCHAR(64) NULL, -- 航班类型
FLIN VARCHAR(64) NULL, -- 国内/国际/混合
ACFT VARCHAR(64) NULL, -- 机型
RENO VARCHAR(64) NULL, -- 机尾号
TAOP VARCHAR(64) NULL, -- 过站实际承运人代码(§3.4:过站关联,非代码共享)
TAFL VARCHAR(64) NULL, -- 过站实际承运航班号
TAID VARCHAR(64) NULL, -- 过站关联航班 FLID
TRML VARCHAR(64) NULL, -- 航站楼
MAXP VARCHAR(64) NULL, -- 最大旅客数
CSOP VARCHAR(64) NULL, -- 共享承运人代码(§3.4
CSFT VARCHAR(64) NULL, -- 共享航班号
MAID VARCHAR(32) NULL, -- 共享主航班 FLID
ESTT VARCHAR(64) NULL, -- 预计时间
ACTT VARCHAR(64) NULL, -- 实际时间
STND VARCHAR(64) NULL, -- 备降站/机位
PHAG VARCHAR(64) NULL, -- 地服代理(值机)
CNCL VARCHAR(64) NULL, -- 取消时间(§8.1 历史判定依据)
REMC VARCHAR(256) NULL, -- 备注
BOTM VARCHAR(64) NULL, -- 摆渡车时间
LACL VARCHAR(64) NULL, -- 行李确认时间
FINT VARCHAR(64) NULL, -- 完成时间
APPT VARCHAR(64) NULL, -- 旅客到达时间
EGSR VARCHAR(64) NULL, -- 保障开始时间
EGST VARCHAR(64) NULL, -- 保障结束时间
FHAG VARCHAR(64) NULL, -- 地服代理(货运)
MHAG VARCHAR(64) NULL, -- 地服代理(机务)
VIPP VARCHAR(64) NULL, -- VIP 旅客数
VIPR VARCHAR(64) NULL, -- VIP 等级
LBNO VARCHAR(64) NULL, -- 行李件数
LBWT VARCHAR(64) NULL, -- 行李重量
PAXC VARCHAR(64) NULL, -- 旅客计数
EXSC VARCHAR(64) NULL, -- 例外代码
EXSR VARCHAR(256) NULL, -- 例外原因
FTSS VARCHAR(64) NULL, -- 航班状态
PEDT VARCHAR(64) NULL, -- 前序估计时间
NAAT VARCHAR(64) NULL, -- 到港终态时间(§8.1;业务含义待术语表确认 §10)
NEAT VARCHAR(64) NULL, -- 离港终态时间(§8.1;业务含义待术语表确认 §10)
PADT VARCHAR(64) NULL, -- 旅客登机时间
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_flight_schd_opday ON FLIGHT_SCHD (OPERATION_DAY);
CREATE INDEX idx_flight_schd_state ON FLIGHT_SCHD (STATE);
-- OPERATION_DAY 不可变的数据库层强化(§7.4):快照 upsert 一律带
-- WHERE OPERATION_DAY IS NULL OR OPERATION_DAY = :day,行级条件更新即满足;
-- 不使用触发器(Oracle/PG 双方言成本)。
-- ④ 资源明细表 ×8 + 路线点表(每 FLID 多行;明细集合按组先删后插 §3.3;
-- ORDINAL 保留输入顺序,SOURCE_SEQ 只存上游序号 §3.2
-- 删除一律标记在主行 STATE,明细物理清除只发生在历史归档 §8.2)
-- ④-1 登机门 GTDT
CREATE TABLE FLIGHT_GATE (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
GATE VARCHAR(64),
PGOT VARCHAR(64), -- 计划登机开始
PGCT VARCHAR(64), -- 计划登机结束
GOTM VARCHAR(64), -- 实际登机开始
GCTM VARCHAR(64), -- 实际登机结束
GTYP VARCHAR(64),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-2 值机柜台 CKDT
CREATE TABLE FLIGHT_CHECKIN (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
CHKC VARCHAR(64),
CCLS VARCHAR(64),
PCOT VARCHAR(64), -- 计划开柜
PCCT VARCHAR(64), -- 计划关柜
COTM VARCHAR(64), -- 实际开柜
CCTM VARCHAR(64), -- 实际关柜
CTYP VARCHAR(64),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-3 行李转盘 CLDT
CREATE TABLE FLIGHT_BELT (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
BELT VARCHAR(64),
BCLS VARCHAR(64),
PCOT VARCHAR(64), -- 计划开转盘(转盘专属前缀,避免与柜台同名)
PCCT VARCHAR(64), -- 计划关转盘
FBAG VARCHAR(64), -- 首件行李
LBAG VARCHAR(64), -- 末件行李
BTYP VARCHAR(64),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-4 计划机位 PSDT
CREATE TABLE FLIGHT_STAND_PLAN (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
PSST VARCHAR(64),
STST VARCHAR(64), -- 计划开始
STET VARCHAR(64), -- 计划结束
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-5 滑槽 CHDT
CREATE TABLE FLIGHT_CHUTE (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
CHUT VARCHAR(64),
CHCLS VARCHAR(64),
PCBT VARCHAR(64), -- 计划开始(SIS 线格式 PCBT
PCET VARCHAR(64), -- 计划结束(PCET
CBTM VARCHAR(64), -- 实际开始(CBTM
CETM VARCHAR(64), -- 实际结束(CETM
CHTYP VARCHAR(64),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-6 延误 DELY(业务上任意时刻仅 1 个有效延误,保留多行能力以无损承接)
CREATE TABLE FLIGHT_DELAY (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
CODE VARCHAR(64),
STRT VARCHAR(64),
DURA VARCHAR(64),
REMC VARCHAR(256),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-7 靠撤桥 ABTM(桥号 ABDGA/D 各一条)
CREATE TABLE FLIGHT_BRIDGE_OP (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
ABDG VARCHAR(64),
ABOP VARCHAR(64), -- A=靠桥 D=撤桥
AOTM VARCHAR(64), -- 动作时间
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-8 轮挡 CHOT(机位 CHIDON/OFF 各一条)
CREATE TABLE FLIGHT_CHOCK_OP (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
CHID VARCHAR(64),
CHST VARCHAR(64), -- ON/OFF
CHTM VARCHAR(64), -- 动作时间
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ORDINAL)
);
-- ④-9 路线点 ROUT/ERUT 共用(ROUTE_KIND 区分 §3.210 类集合 9 张表)
CREATE TABLE FLIGHT_ROUTE_POINT (
FLID VARCHAR(32) NOT NULL,
ORDINAL INT NOT NULL,
SOURCE_SEQ VARCHAR(64),
ROUTE_KIND VARCHAR(8) NOT NULL, -- ROUT/ERUT
APCD VARCHAR(64), -- 机场代码
SCAT VARCHAR(64), -- 计划到达时间
SCDT VARCHAR(64), -- 计划出发时间
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
PRIMARY KEY (FLID, ROUTE_KIND, ORDINAL)
);
CREATE INDEX idx_flight_gate_flid ON FLIGHT_GATE (FLID);
CREATE INDEX idx_flight_checkin_flid ON FLIGHT_CHECKIN (FLID);
CREATE INDEX idx_flight_belt_flid ON FLIGHT_BELT (FLID);
CREATE INDEX idx_flight_stand_flid ON FLIGHT_STAND_PLAN (FLID);
CREATE INDEX idx_flight_chute_flid ON FLIGHT_CHUTE (FLID);
CREATE INDEX idx_flight_delay_flid ON FLIGHT_DELAY (FLID);
CREATE INDEX idx_flight_bridge_flid ON FLIGHT_BRIDGE_OP (FLID);
CREATE INDEX idx_flight_chock_flid ON FLIGHT_CHOCK_OP (FLID);
-- ⑤ 统一投递事件 outbox(§7.3KAFKA_MSG 只通知变化;KAFKA_SCHD 发整态;
-- tombstone 仅在 ACTIVE→DELETED 时与删除同事务登记,投递失败持续重试)
CREATE TABLE MSG_EVENT (
EVENT_ID BIGSERIAL PRIMARY KEY,
TARGET VARCHAR(30) NOT NULL, -- KAFKA_MSG / KAFKA_SCHD
PARTITION_KEY VARCHAR(32) NOT NULL, -- 恒为 FLID
EVENT_TYPE VARCHAR(16) NOT NULL DEFAULT 'UPSERT', -- UPSERT / TOMBSTONE
STATE_VERSION BIGINT NOT NULL, -- 发布时航班版本;聚合按 FLID 取最新(§7.3)
PAYLOAD_JSON TEXT NOT NULL, -- TOMBSTONE 时至少含 FLID/STATE_VERSION/DELETED
STATE VARCHAR(16) NOT NULL, -- PENDING/SENT/DEAD
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP(6) WITH TIME ZONE,
ERROR_CLASS VARCHAR(20),
LAST_ERROR VARCHAR(1000),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_evt_head ON MSG_EVENT (TARGET, STATE, EVENT_ID); -- 每 target 队头
CREATE INDEX idx_evt_flid ON MSG_EVENT (PARTITION_KEY, STATE_VERSION); -- 同 FLID 未发事件合并
-- ⑥ 请求状态机(§7.1:只有 RESP 完成 RQFD 请求,按(运营日、发送方、请求类型)
-- 匹配最新一条 PENDING;同类请求只留一条有效,新请求置旧为 EXPIRED)
CREATE TABLE REQ_TRACK (
REQ_ID BIGSERIAL PRIMARY KEY,
REQ_TYPE VARCHAR(20) NOT NULL,
OPERATION_DAY DATE NOT NULL, -- 请求覆盖运营日
SENDER VARCHAR(64) NOT NULL, -- 请求发送方(匹配键之一)
STATE VARCHAR(16) NOT NULL, -- PENDING/SENT/DONE/EXPIRED
COUTMSGS_ID BIGINT,
SENT_AT TIMESTAMP(6) WITH TIME ZONE,
COMPLETED_AT TIMESTAMP(6) WITH TIME ZONE,
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_req_open ON REQ_TRACK (REQ_TYPE, OPERATION_DAY, SENDER, STATE);
-- ⑦ 共享信箱回填补偿待办(§7.2:提交后回填;回填失败不得把 SUCCEEDED 改回 FAILED
-- 目标形态 = 业务事务内预登记,消除「提交后写待办」的崩溃窗口,§10 当前偏差)
CREATE TABLE BACKFILL_TODO (
MSG_ID BIGINT NOT NULL PRIMARY KEY,
SNDR VARCHAR(64) NOT NULL,
TYPE VARCHAR(32) NOT NULL,
STYP VARCHAR(32),
SEQN BIGINT,
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
LAST_ERROR VARCHAR(512),
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_backfill_todo_due ON BACKFILL_TODO (NEXT_ATTEMPT_AT);
-- ⑧ SCHD 快照留痕(§5.5):事务外追加,只追加留痕、不参与决策;一行=一次尝试,重放也记;
-- RESULT 与 FLAGS 分列(可「成功且告警」);写失败只记指标;保留 90 天,按 (SCOPE_END, RECV_AT) 清理
CREATE TABLE SCHD_SNAP_LOG (
LOG_ID BIGSERIAL PRIMARY KEY,
MSG_ID BIGINT NOT NULL,
RECV_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL, -- 接收时刻(UTC
SCOPE_START DATE NOT NULL, -- 报文覆盖运营日范围(单日时两者相等)
SCOPE_END DATE NOT NULL,
RECS INT NOT NULL, -- 报文声明记录数
UPSERTED INT NOT NULL, -- 实际写入数
DURATION_MS BIGINT NOT NULL,
RESULT VARCHAR(20) NOT NULL, -- COMMITTED/REPLAY_SKIPPED/ROLLED_BACK
FLAGS VARCHAR(200) NOT NULL DEFAULT '', -- 逗号分隔:EMPTY/RECS_DROP/SEQN_REGRESSION/DAY_MISMATCH/SCHD_REVIVE_CONFLICT
ARCHIVE_KEY VARCHAR(200), -- 原文归档引用(证据层,尚未交付)
CREATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL
);
CREATE INDEX idx_snaplog_cleanup ON SCHD_SNAP_LOG (SCOPE_END, RECV_AT);
CREATE INDEX idx_snaplog_msg ON SCHD_SNAP_LOG (MSG_ID);
@@ -13,12 +13,11 @@ Flyway 配置**PG 路径使用 `classpath:db/migration`,两者互不混用
## 计划内容
- V1.0.0 起:管道表(PROC_STATE/MSG_EVENT/PUMP_JOB/REQ_TRACK/REF_MASTER/PIPELINE_LOCK
的 11g DDL——`NUMBER`/序列、`TIMESTAMP WITH TIME ZONE``VARCHAR2` BYTE/CHAR 语义钉死。
- FLIGHT_SCHD 宽表 + V1.3.0 等价明细表 DDL(无 `ON CONFLICT`/`LATERAL` 依赖)
- `SRVT_TEXT/VIPF_TEXT/MAFL_TEXT` 映射 `CLOB`PG 为 TEXT)。
- `flight_schd_display` 11g 版视图(无 LATERAL,用标量子查询)。
- V1 起:`V1__flight_state_baseline.sql` 的 11g 等价 DDL——
PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/BACKFILL_TODO/FLIGHT_SCHD + 9 张明细表/SCHD_SNAP_LOG
`NUMBER`/序列替代 `BIGSERIAL``TIMESTAMP WITH TIME ZONE``VARCHAR2` BYTE/CHAR 语义钉死
- JdbcFlightStateRepository 的 `INSERT ... ON CONFLICT` 改 MERGEOPERATION_DAY 不可变条件 §7.4)。
- 空串按 NULL 的语义回归:命令层 presence 信息不得被 11g 空串语义吞掉
docs/flight-state.md §5)。
docs/flight-state.md §5/§10)。
版本号与 PG location 各自独立推进,禁止复用版本号语义。