fix(codec): FLOP 子类型白名单,白名单外 STYP 落 Unsupported(ACM2-84)

- kindOf FLOP 分支仅放行现行七类(US-05 AC1),FDEL 独立分派不受影响
- 白名单外子类型(ACTT/CNCL 等 Q3 闭合目标)解码为 Unsupported,经 ACM2-83 路径记 SKIPPED、不改航班
- 补 codec 白名单回归与处理层「跳过且不触碰航班」用例
This commit is contained in:
windyboy
2026-09-21 11:44:43 +08:00
parent 3c577b4d1e
commit 29465e2131
3 changed files with 54 additions and 1 deletions
@@ -88,6 +88,8 @@ class JacksonXmlCodec : XmlCodec {
* 子类型分派必须是**白名单**:未知的 SCHD 子类型不能静默当成全量日计划(DNLD)——
* 那会让一条本该"暂不支持、等人工处置"的报文走最重的整包合并写入路径。
* 空 STYP 按 legacy 约定视为 DNLD(该约定待与 SIS 逐类对拍确认,见 Q3)。
* FLOP 同样按白名单:仅现行七类(`implementation.md`「动态运行事件」`US-05` AC1
* 走合并路径,其余 STYP 是 `Q3` 闭合目标,落 `Unsupported`(`FDEL` 单独成类,不参与白名单)。
* 静态参考数据类别码(`implementation.md`「静态参考数据」`SIS:3.1``3.14`)单列成
* [MsgKind.RefData]:它们必须走参考数据处理(US-13),不得混入"不支持"跳过。
*/
@@ -98,11 +100,18 @@ class JacksonXmlCodec : XmlCodec {
"DNLD", "" -> MsgKind.Schd(MsgKind.SchdSubtype.DNLD)
else -> MsgKind.Unsupported("SCHD-$styp")
}
"FLOP" -> if (styp == "FDEL") MsgKind.Fdel else MsgKind.Flop(styp)
"FLOP" -> when {
styp == "FDEL" -> MsgKind.Fdel
styp in FLOP_SUBTYPES -> MsgKind.Flop(styp)
else -> MsgKind.Unsupported("FLOP-$styp")
}
in REF_DATA_TYPES -> MsgKind.RefData(type)
else -> MsgKind.Unsupported("$type-$styp")
}
/** 现行 FLOP 白名单 7 类(`US-05` AC1);表内其余行是 `Q3` 闭合目标,不是现行白名单。 */
private val FLOP_SUBTYPES = setOf("ABTM", "DELY", "PSDT", "CKDT", "CLDT", "CHDT", "GTDT")
private val REF_DATA_TYPES = setOf(
"COUL", "ARPT", "AIRL", "AIRC", "REGN", "ORGN", "FLTL",
"TLST", "GLST", "SLST", "CLST", "BLST", "CHLT", "RSTA",