Files
msgexchange-v2/src/main/resources/db/migration/V1__flight_state_baseline.sql
T
windyboy e57152dd83 docs(acm2-75): 规范全面对齐新需求口径
specification.md 按新需求重写:
- 扫描模型反转:水位/ID 区间 → 处理标记为谓词(C-30 取代 C-1/C-2/C-13;INV-2b 替代 INV-2/4/5)
- Redis 回归为查询投影:处理完成门(INV-23)、投影治理与同源读取(INV-24),INV-11b 扩充非权威清单
- 日计划快照语义反转:缺席航班删除、未携带字段清除(INV-15b),增量报文语义另立(INV-14b)
- 终态记录归档 → 到期删除(INV-25),G-PROC-HST/G-HST-RETENTION/G-REPLAY-CHANNEL/G-FLOP-DIRECTION 关闭并清扫全仓引用
- 重放移出交付范围:R_keep 公式收窄、CLM-3 重定义为重处理幂等、Q6 删除
- 新增 INV-23~28:Redis 完成门、投影治理、清理谓词、参考数据逐类保存/门控、历史先行红线
- C-25/C-26 定案(原子级联不回发 EROR;快照未携带字段清除),Q13/Q14 关闭,Q6/Q12 删除,新增 C-30/C-31

联动:implementation.md 收报/回填/快照/生命周期/FLOP 方向各章按新口径重写;architecture.md
D1/D4 改删除语义;reference.md 退役 archive-after;requirements.md OPS 表改为注册表定义
语法;AGENTS.md 状态边界随新口径更新;check-docs.py OPS 注册表节名同步。

scripts/check-docs.sh 全部通过。
2026-09-14 16:40:00 +08:00

343 lines
22 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =====================================================================
-- 自有 PostgreSQL 全量基线(单迁移链条目)
-- ---------------------------------------------------------------------
-- 范围:本迁移只作用于自有 PostgreSQL。共享 MySQL 信箱(CMINMSGS/COUTMSGS)是他人
-- 系统库,只做契约内 DML,不建表、不改结构(C-14)。
--
-- 本文件原为 V1 基线;原 V2–V10 的净结构已全部合并进来,版本链收敛为一条:
-- · INBOX_CURSOR 及 SEEDED_AT(原 V2/V5);
-- · PROC_STATE 的收信/入队时间与回填事实列,独立待办表 BACKFILL_TODO 不再存在
-- (原 V2/V3/V4/V6/V7:回填意图并入 PROC_STATE,处理开始时间列加后即删);
-- · REQ_TRACK 开放态部分唯一索引 uq_req_open(原 V8);
-- · MSG_EVENT 的 schd 单行唯一索引 uq_schd_event、SENT_AT,以及已无消费者的
-- idx_evt_flid 下线(原 V9/V10)。
-- 原 V2–V10 中只对既有库有意义的数据搬迁语句(存量 RECEIVED_AT / ENQUEUED_AT 回填、
-- 重复开放请求与重复 schd 事件去重、存量 SENT_AT 回写)一律不再保留——基线只服务
-- 全新库,而 Flyway 的迁移链一旦发布即不可改写,故这些语句的语义只能在此说明。
--
-- 升级路径:已应用过 V1–V10 的库无法直接升级(版本链与校验和都对不上)。重建 schema
-- 或删除数据卷后重跑迁移;禁止对生产库手工 repair 或改写 flyway_schema_history。
--
-- 分层(职责与写者见 docs/implementation.md「航班域」):
-- · 决策层:FLIGHT_SCHD + 8 张资源明细表 + FLIGHT_ROUTE_POINT —— 权威当前态(INV-11);
-- · 管道层:PIPELINE_LOCK / INBOX_CURSOR / PROC_STATE / MSG_EVENT / REQ_TRACK
-- · 留痕层:SCHD_SNAP_LOG —— 只追加、可重建、不参与决策;
-- · 证据层:报文原文归档 —— 冷路径,尚未交付(ARCHIVE_KEY 仅留引用位)。
-- 类型口径:TIMESTAMP(6) WITH TIME ZONE 统一 UTC 语义;BIGSERIAL 为 PostgreSQL 方言
-- Oracle 11g 等价 DDL 见同目录 oracle11g/README.md)。
-- =====================================================================
-- ① 单行锁:事务内串行化状态写事务(只串行化本地 DB 事务,不代替消息认领、选主或
-- 故障切换,PRE-5)。历史清理与主泵处理器共用它互斥(INV-18)。
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)。
-- 一信一行、一身份一记录(INV-9);MSG_ID 已有成功终态即判重放,直接记幂等成功。
-- 处理终态与回填意图在本表同表同行:不存在第二处落账,也不存在独立的回填待办表(INV-8)。
-- 状态不可逆:已提交的 SUCCEEDED 不因回填或投递失败回改(INV-6)。
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|SEQN,解码后首次绑定
ATTEMPTS INT NOT NULL DEFAULT 0,
NEXT_ATTEMPT_AT TIMESTAMP(6) WITH TIME ZONE, -- 退避到期时刻;未到期不得被后续消息越过(INV-3)
ERROR_CLASS VARCHAR(20), -- MALFORMED/PROTOCOL/INFRA/UNSUPPORTED/EXHAUSTED
LAST_ERROR VARCHAR(1000),
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
-- ==== 时间基准 ====
RECEIVED_AT TIMESTAMP(6) WITH TIME ZONE, -- 复制自信箱 DATE_RECEIVED:库方时钟、可为 NULL,仅用于对账与展示(PRE-4)
ENQUEUED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT now(), -- 本地入队时间:非空、与判据 NOW 同源,是超期期限 R 的唯一比较对象(PRE-4、CLM-4
-- ==== 回填事实(INV-7/INV-8====
BACKFILL_AT TIMESTAMP(6) WITH TIME ZONE, -- 非空 = 处理标记已确认写入
BACKFILL_NEXT_AT TIMESTAMP(6) WITH TIME ZONE, -- 非空 = 还欠一次回填;与终态同语句写下
BACKFILL_ATTEMPTS INT NOT NULL DEFAULT 0,
BACKFILL_ERROR VARCHAR(512),
BACKFILL_ABANDONED_AT TIMESTAMP(6) WITH TIME ZONE, -- 非空 = 已停止自动重试;**不等于**标记已确认(C-8、C-16)
BACKFILL_ABANDONED_REASON VARCHAR(64), -- MISSING_ROW(确定性)/ TRANSIENT_DEADLINE(暂时性耗尽 R
CONSTRAINT uk_proc_identity UNIQUE (IDENTITY_KEY)
);
CREATE INDEX idx_proc_head ON PROC_STATE (STATE, MSG_ID); -- 主泵队头查询(严格 FIFOINV-3)
-- 回填扫描:只覆盖仍需自动回填的行;按 (ATTEMPTS, MSG_ID) 轮转,避免最旧失败行长期占满批次。
CREATE INDEX idx_proc_backfill_due ON PROC_STATE (BACKFILL_ATTEMPTS, MSG_ID)
WHERE BACKFILL_AT IS NULL AND BACKFILL_ABANDONED_AT IS NULL;
-- ③ 消费水位:全表只有一行。W 只随新 ID 成功入队推进、只增不减,遇空洞即停;
-- 入队与水位推进同事务(INV-2),因此不存在「水位已推进、消息未入队」的持久化状态。
-- HOLE_SINCE 持久化空洞观测时刻,进程重启不丢计时;老化阈值取
-- PARAM:msgx.pipeline.max-commit-delay,超期只放行空洞本身、不越过任何已存在的行。
CREATE TABLE INBOX_CURSOR (
CURSOR_ID INT NOT NULL PRIMARY KEY, -- 固定为 1
COMMITTED_UP_TO BIGINT NOT NULL, -- 水位 W:到哪个 ID 为止已全部读进自有库
HOLE_SINCE TIMESTAMP(6) WITH TIME ZONE, -- 后续缺号最早被发现的时间;不缺号时为 NULL
UPDATED_AT TIMESTAMP(6) WITH TIME ZONE NOT NULL,
SEEDED_AT TIMESTAMP(6) WITH TIME ZONE -- 记录「已按 PARAM:msgx.pipeline.cutover-watermark 播种」这一事实;
-- 为 NULL **不等于**从未消费——已有库新增列后同样为 NULL
);
-- 初值 W=0:首轮把信箱现存行全部重新读一遍,重复登记不会建出第二行。
INSERT INTO INBOX_CURSOR (CURSOR_ID, COMMITTED_UP_TO, HOLE_SINCE, UPDATED_AT) VALUES (1, 0, NULL, now());
-- ④ 航班当前态主行:一行一 FLID(决策层权威;展示视图是投影,不是权威,INV-11)
CREATE TABLE FLIGHT_SCHD (
FLID VARCHAR(32) NOT NULL PRIMARY KEY, -- AODB 实例 IDNumber(1-12));不得由航班号或资源号推断
OPERATION_DAY DATE NULL, -- 运营保障日:未由日计划收录时为 NULL;非空后不可改变(INV-12
STATE VARCHAR(8) NOT NULL, -- ACTIVE/DELETED,无第三态;删除只由 FDEL 或受控历史清理触发(INV-15)
STATE_VERSION BIGINT NOT NULL DEFAULT 0, -- 每次成功写入 +1,重复消息不重复推进(INV-13)
LAST_MSG_ID BIGINT NULL, -- 最近一次成功写入的消息 ID
-- ==== SCHD.FLTR 标量字段(保持 AODB 字符串原样;未携带不隐式清空,INV-14)====
ALCD VARCHAR(64) NULL, -- 航空公司代码
ALSC VARCHAR(64) NULL, -- 航空公司简称
FLNO VARCHAR(64) NULL, -- 航班号(展示用,不参与身份判定)
MVIN VARCHAR(64) NULL, -- 进离港标识(A/D
SODT VARCHAR(64) NULL, -- 计划运行时间(ddMMMyyHHmmOPERATION_DAY 的推导源)
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:主/共享关系的事实来源;MAFL 由它派生(INV-21、INV-22
ESTT VARCHAR(64) NULL, -- 预计时间
ACTT VARCHAR(64) NULL, -- 实际时间
STND VARCHAR(64) NULL, -- 备降站/机位
PHAG VARCHAR(64) NULL, -- 地服代理(值机)
CNCL VARCHAR(64) NULL, -- 取消时间;受控历史清理的判定依据之一(INV-15、INV-18
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, -- 到港终态时间(业务含义待术语表确认)
NEAT VARCHAR(64) NULL, -- 离港终态时间(业务含义待术语表确认)
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 不可变(INV-12)的库层强化方式:快照 upsert 一律带
-- WHERE OPERATION_DAY IS NULL OR OPERATION_DAY = :day,行级条件更新即满足;
-- 不使用触发器(Oracle/PG 双方言成本)。
-- ⑤ 资源明细表 ×8 + 路线点表:每 FLID 多行;每次完整状态写入按该 FLID 先删后插,
-- 以完整合并结果为准(INV-14)。ORDINAL 是持久化顺序(从 1 起),SOURCE_SEQ 是上游
-- 序号(允许为空或重复);相同资源号不代表同一条分配,禁止按资源号去重。删除一律
-- 标记在主行 STATE,明细物理清除只发生在受控历史归档(INV-15)。
-- ⑤-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), -- 计划开始
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)
);
-- ⑤-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 区分两类;主键含该列,避免序号冲突)
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);
-- ⑥ 统一投递事件 outboxINV-10、INV-17):KAFKA:schd 发整态、KAFKA:msg 只通知变化;
-- tombstone 仅在 ACTIVE→DELETED 时与删除同事务登记,投递失败按退避持续重试。
-- 目标级全序投递是当前实现,按 FLID 保序见 CLM-7。
CREATE TABLE MSG_EVENT (
EVENT_ID BIGSERIAL PRIMARY KEY, -- 对 KAFKA:msg 是稳定事件身份并决定投递顺序;对 KAFKA:schd 是每次接受 upsert 时替换的写代次
TARGET VARCHAR(30) NOT NULL, -- KAFKA:msg / KAFKA:schd
PARTITION_KEY VARCHAR(32) NOT NULL, -- 当前恒为 FLID(Q4 定案前为假定,C-29
EVENT_TYPE VARCHAR(16) NOT NULL DEFAULT 'UPSERT', -- UPSERT / TOMBSTONE
STATE_VERSION BIGINT NOT NULL, -- 发布时航班版本;schd 聚合按 FLID 只进不退
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,
SENT_AT TIMESTAMP(6) WITH TIME ZONE -- 投递确认的同一条 UPDATE 内写入;是保留期判定的唯一基准
);
CREATE INDEX idx_evt_head ON MSG_EVENT (TARGET, STATE, EVENT_ID); -- 每 target 队头
-- KAFKA:schd 按 FLID 单行(只保留最新 STATE_VERSION);KAFKA:msg 仍是多行 append-log,不受此约束。
CREATE UNIQUE INDEX uq_schd_event
ON MSG_EVENT (TARGET, PARTITION_KEY)
WHERE TARGET = 'KAFKA:schd';
-- ⑦ 请求状态机:只有 RESP 完成 RQFD 请求,按(运营日、发送方、请求类型)匹配最新一条
-- 开放请求。同类请求只留一条有效,新请求置旧请求为 EXPIRED。登记、超时与应答匹配
-- 尚未实现(G-REQ-TRACK、C-24)。
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); -- 仍服务含关闭态的查询
-- 开放态(PENDING/SENT)内 (REQ_TYPE, OPERATION_DAY, SENDER) 唯一;关闭态行可并存。
CREATE UNIQUE INDEX uq_req_open
ON REQ_TRACK (REQ_TYPE, OPERATION_DAY, SENDER)
WHERE STATE IN ('PENDING', 'SENT');
-- ⑧ SCHD 快照留痕:事务外追加,只追加留痕、不参与决策;一行=一次尝试,重放也记。
-- RESULT 与 FLAGS 分列(可「成功且告警」);写失败只记指标。
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);