package com.gzzn.omms.msgexchange.codec import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty import com.gzzn.omms.msgexchange.domain.flight.ScheduleRecord import java.time.LocalDate /** * FLOP 报文解析体(单航班增量 §6.1)。 * scalars:FLID 以外的标量;collections:GTDT/CKDT 等重复集合(含源序号属性)。 */ data class FlopPayload( val flid: String, val scalars: Map = emptyMap(), val collections: Map>> = emptyMap(), ) /** * SCHD(DNLD/RESP/ADFT)解析体(docs/flight-state.md §5)。 * RECS 声明数与实收 FLTR 记录分离承载,完整性校验(§5.2)在处理层执行; * 协议无报文级覆盖日字段——scope 由处理层按记录 SODT 推导。 */ data class ScheduleBody( val recsDeclared: Int, val records: List, val scopeStart: LocalDate? = null, val scopeEnd: LocalDate? = null, ) // ===================================================================== // XML 直接映射(jackson-dataformat-xml 数据绑定,不再手写 DOM 遍历)。 // 信封强类型(META/段结构),FLTR/航班段内标签为开放集 → Map // 泛型承载(45+ 标签逐一建模不成比例);集合项 = 属性 + 子元素展平的 Map。 // 已知弱项:DELY 的混合文本(元素文本)在 XmlMapper 绑定下不保证保留, // 属性 CODE/STRT/DURA 保留;备注文本待真实报文验收(§10)。 // ===================================================================== @JsonIgnoreProperties(ignoreUnknown = true) data class SisMessage( @JacksonXmlProperty(localName = "META") val meta: SisMeta? = null, @JacksonXmlProperty(localName = "SCHD") val schd: SchdSection? = null, @JacksonXmlProperty(localName = "FLOP") val flop: Map? = null, @JacksonXmlProperty(localName = "FDEL") val fdel: Map? = null, ) @JsonIgnoreProperties(ignoreUnknown = true) data class SisMeta( @JacksonXmlProperty(localName = "SNDR") val sndr: String? = null, @JacksonXmlProperty(localName = "SEQN") val seqn: Long? = null, @JacksonXmlProperty(localName = "DTTM") val dttm: Long? = null, @JacksonXmlProperty(localName = "TYPE") val type: String? = null, @JacksonXmlProperty(localName = "STYP") val styp: String? = null, ) /** SCHD 段:RECS 声明数 + FLTR 记录集(SIS §3.16 样例结构)。 */ @JsonIgnoreProperties(ignoreUnknown = true) data class SchdSection( @JacksonXmlProperty(localName = "RECS") val recs: Int? = null, @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "FLTR") val fltr: List> = emptyList(), )