docs(acm2): 重构 spec 并整理 Q 编号
- specification:直白说法、编号一览、合并 Q 台账、补 Q2/Q15 - interface-contract:POST /cminmsgs/send 待确认项指向 Q15 - 代码:SRVT/VIPF 清空语义 Q11 → Q2
This commit is contained in:
@@ -23,7 +23,7 @@ data class ScheduleBody(
|
||||
* 只保留在 wire/domain、尚未映射到持久化明细的集合键(`[G-SRVT-VIPF]`)。
|
||||
*
|
||||
* 它们不参与合并、不进快照、不落库;保留的目的是不让入站事实在解码层被静默抹平,并让真实
|
||||
* 流量里的出现情况可观测——决定"缺席是否等于删除"的 `Q11` 需要真实报文才能定案。
|
||||
* 流量里的出现情况可观测——决定"缺席是否等于删除"的 `Q2` 需要真实报文才能定案。
|
||||
*/
|
||||
private val UNPERSISTED_COLLECTION_KEYS: Set<String> = setOf("SRVT", "VIPF")
|
||||
|
||||
@@ -132,7 +132,7 @@ data class FlightRecordXml(
|
||||
@param:JacksonXmlElementWrapper(useWrapping = false) @param:JacksonXmlProperty(localName = "ROUT") val rout: List<RoutXml> = emptyList(),
|
||||
@param:JacksonXmlElementWrapper(useWrapping = false) @param:JacksonXmlProperty(localName = "ERUT") val erut: List<RoutXml> = emptyList(),
|
||||
// SRVT/VIPF 用可空表达"段是否出现":null = 未出现;出现即为列表(空元素得到一行空行)。
|
||||
// 两者都不落明细表、不参与合并,清空语义待 `Q11`(`[G-SRVT-VIPF]`)。
|
||||
// 两者都不落明细表、不参与合并,清空语义待 `Q2`(`[G-SRVT-VIPF]`)。
|
||||
@param:JacksonXmlElementWrapper(useWrapping = false) @param:JacksonXmlProperty(localName = "SRVT") val srvt: List<SrvtXml>? = null,
|
||||
@param:JacksonXmlElementWrapper(useWrapping = false) @param:JacksonXmlProperty(localName = "VIPF") val vipf: List<VipfXml>? = null,
|
||||
)
|
||||
|
||||
@@ -38,7 +38,7 @@ internal object SisWireMapper {
|
||||
* `filterValues` 去掉的正是"缺席",避免整包凭空清空本地明细(合并语义见 docs/implementation.md「SCHD 日计划」)。
|
||||
*
|
||||
* `SRVT`/`VIPF` 尚未有明细表(`[G-SRVT-VIPF]`):只用"键是否存在"表达段是否出现,保留原始
|
||||
* 内容与顺序,不参与合并、不判断清空语义(`Q11`)——出现(哪怕为空)与缺席不再被抹平。
|
||||
* 内容与顺序,不参与合并、不判断清空语义(`Q2`)——出现(哪怕为空)与缺席不再被抹平。
|
||||
*/
|
||||
private fun FlightRecordXml.collections(): Map<String, List<Map<String, String>>> {
|
||||
val mapped = linkedMapOf(
|
||||
|
||||
@@ -21,7 +21,7 @@ class PipelineCounters {
|
||||
* 入站记录里出现 `SRVT`/`VIPF` 段的条数(`[G-SRVT-VIPF]`)。
|
||||
*
|
||||
* 这两个集合目前只保留在 wire/domain,不落明细表、不参与合并;计数是"真实报文有没
|
||||
* 有在用"的唯一取证渠道(清空语义 `Q11` 需要真实样例才能定案)。> 0 表示确有流量携带该段。
|
||||
* 有在用"的唯一取证渠道(清空语义 `Q2` 需要真实样例才能定案)。> 0 表示确有流量携带该段。
|
||||
*/
|
||||
fun unpersistedCollectionSeenAdd(hits: Map<String, Int>) {
|
||||
hits["SRVT"]?.let { srvtSeen.addAndGet(it.toLong()) }
|
||||
|
||||
@@ -94,7 +94,7 @@ class PipelineMetrics(
|
||||
.strongReference(true)
|
||||
.register(registry)
|
||||
|
||||
// SRVT/VIPF 尚未落明细表([G-SRVT-VIPF]):计数替代静默丢弃,为 Q11 提供真实流量证据。
|
||||
// SRVT/VIPF 尚未落明细表([G-SRVT-VIPF]):计数替代静默丢弃,为 Q2 提供真实流量证据。
|
||||
Gauge.builder("msgx.pipeline.codec.srvt_seen.total", counters) { it.srvtSeenCount().toDouble() }
|
||||
.strongReference(true)
|
||||
.register(registry)
|
||||
|
||||
@@ -190,7 +190,7 @@ class MessageProcessor(
|
||||
}
|
||||
}
|
||||
|
||||
// [G-SRVT-VIPF]:SRVT/VIPF 段只保留在解码载荷里,尚未落明细表(清空语义待 Q11)。
|
||||
// [G-SRVT-VIPF]:SRVT/VIPF 段只保留在解码载荷里,尚未落明细表(清空语义待 Q2)。
|
||||
// 计数 + 告警替代此前的静默丢弃;出现即证明真实报文携带该段,可作为定案依据。
|
||||
val unpersisted = unpersistedCollectionHits(decoded.body)
|
||||
if (unpersisted.isNotEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user