Files
msgexchange-v2/docs/flight-state-semantics.md
T
windyboy 20aafb9ab0 feat(processing): 快照流程锁内复核收敛 + 异常显式清除语义 + 语义矩阵定稿 (ACM2-29 P2-5/M3)
- SnapshotFlow 收敛到 v2 §5 事务顺序:锁外仅解析校验;取得 PIPELINE_LOCK 后
  锁内复核快照身份(last_message_id 重放短路)→ 锁内读代与当前航班态 →
  计算 nextState → 写入 → CAS → 事件 → SUCCEEDED。锁内 CAS 失败属数据异常,
  一律回滚 FAILED(INFRA),删除「版本号相同即视为重放」的推断路径(评审 F7/F8 收口)
- M3/F4:异常对象(FDIV/FRET/FLAB)显式清除语义——null 字面量/空对象/空串
  翻译为 Clear 命令;FlightNextState.clearedKeys 携带本次清除键;增量路径按
  映射把前缀标量列置 NULL;库内清除后读视图无该键(线格式保持键缺失,显式
  清除表达留待阶段 2 按下游契约定)
- StubFlightSchd 增量分支改为 nextState 权威整体替换(引擎已合并当前态),
  天然承载 Clear;flattenScalarsOnly 去除冗余循环(L2)
- docs/flight-state-semantics.md:16 类结构语义矩阵定稿(P0-A 交付物落库)
- 新测试:引擎 0 标记/异常清除/混排 fail-fast 单测;JDBC 异常清除回环用例

验证:MSGX_PG_PORT=5433 真实 PG ./gradlew test --rerun-tasks
105 用例 0 失败 0 跳过
2026-09-08 15:44:48 +08:00

4.5 KiB
Raw Blame History

运营航班字段语义矩阵(v2 权威口径)

状态:定稿(ACM2-29 P2-5 收口,原 P0-A 交付物)。
依据:flight-state-design-v2.md §3/§4/§9、SIS_AODB_RMS-V0.1.mdFlightStateEngine 实现。
本文是「当前有效规则」的唯一索引;decision-flight-state.md 中历史口径与此冲突时以本文为准。

1. 命令模型

解码/Handler 层产生显式命令,仓储不做字符串猜测:

命令 标量 集合
Unchanged(未出现) 不修改 不修改
Set(value) 覆盖
Clear 删除该键,物理列置 NULL 删除全部明细行
Replace(list) 同事务 DELETE + 批量 INSERT 整集合替换
Apply(item, sourceSeq) 按 SOURCE_SEQ 定位更新,缺失则追加
  • 序号属性为 "0" 的条目是协议显式清除标记:仅当集合内全部条目均为 0 时翻译为 Clear;与常规条目混排属非法结构,fail fast 拒绝。
  • 空数组 [] = Replace(空集):明细行清空(区别于 Unchanged 的键缺失)。
  • 非法 JSON、未知形状、超容输入不得截断后成功。

2. 16 类结构映射

集合键 存储载体 序号属性 出现语义 显式清除 Apply
GTDT 登机口 flight_gate GTNO Replace GTNO=0 全清 支持(GTNO 定位)
CKDT 值机柜台 flight_checkin CKNO Replace CKNO=0 全清 支持;同 CHKC 多舱位分配按 CKNO 区分,不按资源号去重
CLDT 行李转盘 flight_belt CLNO Replace CLNO=0 全清 支持
PSDT 计划机位 flight_stand_plan PSNO Replace PSNO=0 全清 支持
CHDT 行李滑槽 flight_chute CHNO Replace CHNO=0 全清 支持
DELY 延误 flight_delay 无(DLNO 非协议属性) Replace(当前单有效延误 + 历史保留) [] 清空 不支持(协议无定位键;Apply 对 DELY 拒绝)
ABTM 靠撤桥 flight_bridge_op ASNO Replace(操作全集) ASNO=0 全清 支持(ASNO 定位;多次靠/撤桥各占一行)
CHOT 轮挡 flight_chock_op CSNO Replace CSNO=0 全清 支持(CHID=ON/OFF 为业务属性,非序号)
ROUT 计划航路 flight_route_point(route_kind=ROUT) RTNO Replace RTNO=0 全清 支持
ERUT 扩展航路 flight_route_point(route_kind=ERUT) RTNO Replace RTNO=0 全清 支持
FDIV 备降 主表前缀列 FDIV_* Set(对象) "null"/{}/空串 → Clear
FRET 返航 主表前缀列 FRET_* Set 同上
FLAB 中止 主表前缀列 FLAB_* Set 同上
SRVT 服务 主表 SRVT_TEXT(无损 JSON 文本) Set 同异常(Clear 置 NULL
VIPF 贵宾 主表 VIPF_TEXT Set 同上
MAFL 共享航班 主表 MAFL_TEXT Set 同上 一旦出现关联查询需求,升级为显式关系表(v2 §8.2)

公共明细列:FLID FK、ORDINAL(本集合内输入顺序,1 起)、SOURCE_SEQ(源序号字符串,不强转整数、不设唯一)、RECORD_VERSIONCREATED_AT/UPDATED_ATPK (FLID, ORDINAL)。相同资源号不代表同一条分配记录,禁止按资源号去重

3. 清除的库内与线上表达

  • 库内:标量/异常/文本键 Clear → 对应列 NULL;集合键 Clear/Replace(空) → 明细行删除。
  • 线上(KAFKA_SCHD):被清除的键缺失(不输出 "[]"/"null")。下游契约如需显式清除表达(如 "GTDT":[]),由阶段 2 Handler 按下游契约决定,不在存储层擅自改变线格式(v2 §9.1)。

4. 快照(DNLD)与增量(FLOP/ADFT

  • DNLD:外层标量字段级合并;集合为整包快照 Replace;集合键缺失 = Unchanged(不自动清空旧资源)。删除航班走 SCHD_GEN 差集 + deleteDiffByDay(FDAY 域化,ADFT/跨代迁移行受保护)。
  • FLOP:字段级合并;Handler 产生的集合键出现即全量替换。
  • 重放判定凭 schd_gen.last_message_id(快照)与 identity_key(消息去重);版本号只是顺序令牌。锁内 CAS 失败一律回滚 FAILED(INFRA)

5. 时区与空值

  • SIS 时间串(DDMONYYHHMM 机场当地时)原值保存;类型化提升按查询需要另行定案(ACM2-29 遗留 3)。
  • PG 保存空字符串;Oracle 11g 空串按 NULL——命令层保留 presence 信息,清除一律走显式 Clear 命令,不把「缺失、空串、NULL」混同(v2 §6)。