# 基线卡片 06:预警设置端点预警自身生命周期统计 > 按决策票 [05 真实联调基线与收口证据门槛](../../issues/05-integration-baseline-and-evidence.md) 的固定骨架产出,对应执行票 [41 预警设置端点改为预警自身生命周期统计](../../issues/41-warning-settings-endpoint-rework.md)。**状态判定:③ 真实数据联调完成**(2026-10-14 第二实例实测通过,见 §4;共享实例部署窗口与前端走查不在本票范围)。 ## 一、基线 | 项 | 值 | | --- | --- | | 记录时间 | 2026-10-14(本地时钟) | | 记录角色 | 后端执行代理(实施 + 编译 + 契约测试 + 第二实例复验 + 推送) | | 联调环境 baseUrl | `http://192.168.110.96:8301`(共享实例)+ 复验用第二实例 `http://127.0.0.1:8399`(本票构建,已停机) | | 后端仓库 / 分支 / 提交 | `http://192.168.110.30:3000/shaoy/pipe-ner-server` / `master` / **`b047a60d`**(本票 `fix(cockpit): 预警设置端点改为预警自身生命周期统计 (#41)`,变基含上游 `05c23774`) | | 复验方式 | 不动共享实例:`t41` 本地 profile(同库同 Redis,端口 8399、nacos 注册关闭、推送任务 delay 1h)起第二实例实测;对照共享实例区分上游修复与本票新契约 | | 后端推送状态 | **已推送**;远端 `master=b047a60d`,`05c23774..b047a60d` | | 前端仓库 | 本票**不涉及**前端(消费侧另立票,见票面「前端后续」) | | 访问控制 | 驾驶舱只读 REST 免鉴权(ADR 0005);两实例实测无凭据 HTTP 200 | | 只读数据源 | 联调库只读快照;`readOnly: true` | ## 二、收口条件五行 | # | 条件 | 状态 | 证据 | 未完成项 | | --- | --- | --- | --- | --- | | ① | 后端提交 / 编译 / 契约测试 | **已完成** | 编译通过;针对性 24/24;全量 `Cockpit*Test,BusinessCockpit*Test` **498/498**(变基后复跑) | 无 | | ② | 新字段形状(状态/等级/趋势/分布) | **已完成** | §4.2 实测:六态/1–4/四行业/三片区+未分区全铺,和恒等于 total | 无 | | ③ | 趋势窗口跟随 `range` | **已完成** | §4.2 实测:`LAST_7_DAYS` 只留窗口内日桶(窗外桶被裁) | 无 | | ④ | 空态 | **已完成** | 契约测试 `emptyFamilyUsesExplicitEmptyState`:`state=EMPTY`、处置率 `NO_WARNINGS`、分布仍全铺计数 0 | 无 | | ⑤ | 真实环境复验「不再 500」 | **已完成(第二实例)** | §4.1 实测 `code=200`;共享实例 8301 的 500 已由上游 `94bb7e4d`(删 `dept_id`)先行消除,与本票改动叠加后新契约生效 | 共享实例滚动重启窗口归票 17;前端走查归前端消费票 | ## 三、契约变更摘要 | 维度 | 预警族(`warning`) | 报警族(`alarm`) | | --- | --- | --- | | 状态分布 | `statusDistribution`:`WarningWorkflow` 六态(DRAFT/PENDING/RECEIVED/PROCESSING/HANDLED/CLOSED)全铺 | `statusDistribution`:`alarm_status` 归一 `UNHANDLED/HANDLED`(新增) | | 工单口径字段 | **`null`**(`handled/pending/cancelledCount/unlinkedEventCount/invalidWorkOrderStateCount/workOrderStates`) | **原样保留**(含 `workOrderStates` 0–7、未回联/脏码/已取消分列) | | `handlingEfficiency` | 已解除 ÷ 预警总数(预警自身口径;分母 0 → `NO_WARNINGS`) | 状态 5 ÷ 状态 0–6 工单数(工单口径,决策票 06) | | 等级分布 | `levelDistribution` 1–4 全铺(`warning_level` 字符串解析) | `levelDistribution` 1–4 全铺(`alarm_level`) | | 行业 / 片区 | 沿 `equipment_base` + `equipment_type` 树上溯;未知/未分区显式入桶 | 同左 | | 趋势 | 按发布时间分桶;`handled`=桶内已解除 | 按更新时间分桶;`handled`=关联工单已结案 | 分布读数取整个快照(不随 `range` 收缩),故 `sum(分布桶) == total` 可被审计复算;只有趋势桶跟随窗口。 ## 四、实测记录 ### 4.1 端点 200 复验(第二实例,真实联调库) ```powershell $r = Invoke-WebRequest 'http://127.0.0.1:8399/api/cockpit/v1/overview/warning-settings?mode=WARNING&range=LAST_7_DAYS' -UseBasicParsing # HTTP 200, code=200(改造前同库同端点为 HTTP 200 + body code=500:字段 "dept_id" 不存在) ``` ### 4.2 预警族自洽性(真实数据复算) | 分布 | 实测计数 | 和 | | --- | --- | --- | | 状态 | DRAFT 2 + PENDING 4 + RECEIVED 0 + PROCESSING 4 + HANDLED 2 + CLOSED 19 | **31 = total** ✓ | | 等级 | 1级 13 + 2级 5 + 3级 1 + 4级 12 | **31** ✓ | | 行业 | 供水 2 + 排水 24 + 窨井 1 + UNKNOWN 4(燃气 0) | **31** ✓ | | 片区 | 城南 24 + 城北 1 + 太常 2 + 未分区 4 | **31** ✓ | | 处置率 | 19/31 = `0.6129`(已解除÷总数) | ✓ | | 趋势 | 2026-10-09/10/14 三桶(`LAST_7_DAYS` 窗内) | ✓ | 报警族:`total=66`,`handled=64`,`statusDistribution` 2+64=66 ✓,`workOrderStates` 0–7 齐全,处置率 `1/5=0.2000`(工单口径)。 ### 4.3 对照证据(共享实例 vs 第二实例,同时刻) | 实例 | 构建 | HTTP/body code | 契约 | | --- | --- | --- | --- | | `8301` 共享 | 上游 `05c23774`(已被他人重启) | 200/200 | **旧契约**:`warning.handled=0`、`workOrderStates` 在、无 `statusDistribution`、处置率 0.2000 | | `8399` 第二 | 本票 `b047a60d` | 200/200 | **新契约**:见 §4.2 | > 判读:8301 的 500→200 恢复来自上游 `94bb7e4d` 删 `dept_id`(诊断期实测 `dispatch_user` → 复测 `dept_id`,两形态都是「实体声明了库中已删列」);本票在其上把预警族口径换为自身生命周期,8399 实测生效。 ## 五、已知边界与后续 - 共享实例重启加载 `b047a60d` 前,8301 仍回旧契约(预警族工单字段为旧口径);滚动部署归票 17。 - 前端消费侧(`toOverviewWarningSettings` / `alertSettingsPanel` / `contractMocks.js`)尚未读新分布块, 预警半边会显示全 0 —— 按票面验收另立前端票,不阻塞本票收口。 - 预警族 `handlingEfficiency` 语义已从「工单处置率」改为「已解除率」;消费方必须连 `state/reason` 一起读, 分母 0 显示「不适用」而非 0%。