Files

83 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 配置化驾驶舱内核模块(iAOP-Core / cockpit)
对齐 PRD 5.5「⑤ 配置化驾驶舱」:把驾驶舱抽象为模板化配置资产,按"布局/配置"渲染,
切换行业模板零改前端代码(PRD 5.5 验收口径)。
## 模块状态
| 能力 | Issue | 状态 |
| --- | --- | --- |
| 布局 JSON Schema 定义 + 校验/解析 | #50 | feature/issue-50(推进中) |
| 图表组件配置化渲染引擎(RenderPlan) | #51 | feature/issue-51(推进中) |
| **报警看板配置化(阈值/规则外置)** | **#52** | **本分支 feature/issue-52** |
#52「报警看板配置化」把告警面板(`alarm_panel`)的展示语义外置为模板配置资产,
让"换行业只换配置、前端代码零改动"也覆盖到告警面板。配置点:
- **严重度→颜色映射**(`severityColors`):P0/P1/P2 三级各自的 `fg`/`bg`/可选 `icon`/`border`,
覆盖主题默认告警色;驾驶舱红色告警(PRD 5.3 ③ 场景A)即由 `P0` 的 `fg` 决定。
- **告警规则 / 阈值源绑定**(`rulesSource` / `thresholdsSource`):告警面板订阅哪份
规则资产(`kind: asset` + `ref`)或内联规则(`kind: inline` + `data`)——把"看哪条规则"
也变成配置项,避免把规则 id 写死在前端。
- **SOP 联动**(`showSop`):PRD 场景A「LLM 生成原因+处置建议 → 值班长确认」是否在面板展开。
- **确认 / 静默行为**(`requireAck` / `ackTimeoutS` / `muteLower`):关键告警是否强制人工确认、
超时升级、是否静默低于某 severity 的提示。
- **分组 / 排序 / 最大条数**(`groupBy` / `sortBy` / `maxItems`):大屏展示策略外置。
## 用法
```python
from cockpit import (
validate_alarm_config, load_alarm_config, render_alarm_panel_props,
)
# 1) 配置资产(通常来自模板 YAML;这里用 dict 示意)
config = {
"$schema": "iAOP-cockpit-alarm-panel-v1",
"severityColors": [
{"severity": "P0", "fg": "#ff3b30", "bg": "rgba(255,59,48,0.12)", "icon": "alert-octagon"},
{"severity": "P1", "fg": "#f5a623", "bg": "rgba(245,166,35,0.12)"},
{"severity": "P2", "fg": "#3aa0ff", "bg": "rgba(58,160,255,0.10)"},
],
"rulesSource": {"kind": "asset", "ref": "ti-cl4/impurity-forecast/config/alert_rules.template.yaml"},
"showSop": True, "requireAck": True, "ackTimeoutS": 300, "muteLower": "P2",
"groupBy": "severity", "sortBy": "severity", "maxItems": 50,
}
# 2) 校验(聚合全部字段级错误,便于配置台「错误列表」展示)
result = validate_alarm_config(config)
assert result.ok, result.errors
# 3) 加载为内存模型
cfg = load_alarm_config(config)
# 4) 编译为 alarm_panel 组件的 props(#51 渲染层在 _build_props 里合并即可)
props = render_alarm_panel_props(cfg)
# -> {'subscribe': 'alarm_stream', 'severityStyles': {...}, 'rulesSource': {...},
# 'showSop': True, 'requireAck': True, 'ackTimeoutS': 300, ...}
```
切换行业模板(如树脂)= 换一份配置资产(不同配色 / 规则源),`render_alarm_panel_props`
随配置变化产出不同 props,**前端代码零改动**。
## 设计要点
- **零运行时依赖**:只用标准库,配置资产是可 `json.dumps` 的纯 dict,便于配置台发布与审计。
- **声明式 + 强校验**:`validate_alarm_config` 收集全部字段级错误(沿用 #50
`LayoutValidationResult` 风格);`load_alarm_config` 校验失败抛 `AlarmConfigError`
并携带错误清单。
- **与 #50/#51 解耦**:本模块不 import `layout` / `renderer`(它们在各自 feature 分支上推进),
避免对未合并分支形成硬依赖;`render_alarm_panel_props` 仅产出 `alarm_panel` 组件的 props dict,
由 #51 渲染层在 `_build_props` 里合并即可。#50/#51 合入 main 后,本模块的 `__init__`
会合并它们的导出(`CockpitLayout` / `validate_layout` / `RenderPlan` 等)。
## 测试 / 验收
```bash
# 在 core/cockpit 目录下
python -m unittest discover -s tests -p "test_alarm_config.py" -v # 28 用例
python scripts/verify_alarm_config.py # 验收脚本
```
参考资产:`templates/ti-cl4/dashboard/alarm_panel.ti.yaml`(氯化车间/海绵钛告警面板配置)。