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

61 lines
4.5 KiB
Markdown
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.
# 运营航班字段语义矩阵(v2 权威口径)
状态:定稿(ACM2-29 P2-5 收口,原 P0-A 交付物)。
依据:[flight-state-design-v2.md](flight-state-design-v2.md) §3/§4/§9、[SIS_AODB_RMS-V0.1.md](legacy/SIS_AODB_RMS-V0.1.md)、`FlightStateEngine` 实现。
本文是「当前有效规则」的唯一索引;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_VERSION``CREATED_AT/UPDATED_AT`PK `(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)。