docs: 航班状态设计重写为当前基线,按请求/下载与动态两条线讲清状态变更 (ACM2-30)

This commit is contained in:
windyboy
2026-09-08 18:50:34 +08:00
parent 1fc2b2c895
commit bb81deae0a
11 changed files with 530 additions and 369 deletions
+15 -14
View File
@@ -1,12 +1,12 @@
# 运营航班字段语义矩阵(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 中历史口径与此冲突时以本文为准
状态:2026-09-08 实现核对;以下明确区分当前行为与待验收语义。
依据:[航班状态设计](flight-state-design-v2.md)、[SIS 规范](legacy/SIS_AODB_RMS-V0.1.md)、`FlightStateEngine` 实现。
本文是字段语义入口;历史决策不覆盖本文。已发现的不一致和修正计划见 [核查报告](acm2-29-audit-and-simplification.md)
## 1. 命令模型
解码/Handler 层产生显式命令,仓储不做字符串猜测
当前 Handler 返回字段集,FlightStateEngine 再解析为命令;仓储仍会解析异常/文本 JSON。显式命令尚未贯通所有边界
| 命令 | 标量 | 集合 |
|---|---|---|
@@ -14,11 +14,11 @@
| Set(value) | 覆盖 | — |
| Clear | 删除该键,物理列置 NULL | 删除全部明细行 |
| Replace(list) | — | 同事务 DELETE + 批量 INSERT 整集合替换 |
| Apply(item, sourceSeq) | — | SOURCE_SEQ 定位更新,缺失则追加 |
| Apply(item, sourceSeq) | — | 引擎内预留,按首个 SOURCE_SEQ 匹配更新,则追加;无生产调用方,尚非已确认业务协议。 |
- 序号属性为 `"0"` 的条目是协议显式清除标记:**仅当集合内全部条目均为 0** 时翻译为 Clear;与常规条目混排属非法结构,fail fast 拒绝。
- 空数组 `[]` = Replace(空集):明细行清空(区别于 Unchanged 的键缺失)。
- 非法 JSON、未知形状、超容输入不得截断后成功。
- 验收目标:非法 JSON、未知形状、超容输入不得截断后成功。当前 parseCollection 未校验数组元素必须是对象,仓储会忽略未知属性;该目标尚未完成。
## 2. 16 类结构映射
@@ -29,7 +29,7 @@
| 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 拒绝 |
| DELY 延误 | `flight_delay` | 无(仓储残留 DLNO 映射待清理) | Replace(仅保存本次集合,不追加历史) | `[]` 清空 | 不支持(协议无定位键 |
| 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 全清 | 支持 |
@@ -37,24 +37,25 @@
| 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) |
| SRVT 服务 | 主表 `SRVT_TEXT` | — | Set | 当前字段转换器不将 null/{}/空串转 Clear;显式 ScalarCommand.Clear 可清列 | — |
| VIPF 贵宾 | 主表 `VIPF_TEXT` | — | Set | 同 SRVT | — |
| MAFL 共享航班 | 主表 `MAFL_TEXT` | — | Set | 同 SRVT | 无查询需求时维持现有载体 |
公共明细列:`FLID` FK、`ORDINAL`本集合内输入顺序,1 起)、`SOURCE_SEQ`源序号字符串,不强转整数、不唯一)、`RECORD_VERSION``CREATED_AT/UPDATED_AT`PK `(FLID, ORDINAL)`。相同资源号不代表同一条分配记录,**禁止按资源号去重**
公共明细列:`FLID`(逻辑归属,当前没有数据库 FK`ORDINAL`(输入顺序,1 起)、`SOURCE_SEQ`字符串、不唯一)、`RECORD_VERSION``CREATED_AT/UPDATED_AT`当前 PK `(FLID, ORDINAL)`路线表还需将 ROUTE_KIND 纳入主键,避免 ROUT/ERUT 冲突。相同资源号不代表同一条分配记录,禁止按资源号去重。表中“支持 Apply”仅指引擎分支,生产只生成 Replace/Clear
## 3. 清除的库内与线上表达
- 库内:标量/异常/文本键 Clear → 对应列 `NULL`;集合键 Clear/Replace(空) → 明细行删除。
- 线上(KAFKA_SCHD):被清除的键**缺失**(不输出 `"[]"`/`"null"`)。下游契约如需显式清除表达(如 `"GTDT":[]`),由阶段 2 Handler 按下游契约决定,不在存储层擅自改变线格式(v2 §9.1)
- 线上(KAFKA_SCHD):Clear 会移除键;Replace(空集) 当前仍生成 `[]`,数据库读回却缺键,尚未统一。下游清除契约必须固定黄金样例,再同时修正 nextState、落库读回与 wire;不得宣称已等值
- 异常对象 Set 在增量 SQL 中只写出现的属性;旧对象被省略的属性可能残留。这与对象替换目标不一致,待回归修正。
## 4. 快照(DNLD)与增量(FLOP/ADFT
- DNLD:外层标量字段级合并;集合为整包快照 Replace;集合缺失 = Unchanged(不自动清空旧资源)。删除航班`SCHD_GEN` 差集 + `deleteDiffByDay`FDAY 域化ADFT/跨代迁移行受保护)
- DNLD 事务内核:外层标量字段级合并;出现的集合 Replace;集合缺失 = Unchanged。删除走 `SCHD_GEN` 差集 + `deleteDiffByDay`FDAY 域化)。真实 XML parser/生产路由仍未接通,不能视为端到端协议已验收
- 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)
- PG 当前保留字符串空值,集合 JSON null 属性会被解析为空串。Oracle 的空字符串/NULL 等价性还未在目标库验证;显式命令本身不能保证持久化往返保真