# 观澜 · 算法(`app_algorithmModel/`) **职责**:七系统判级矩阵、七镜头曲线、可靠性指标、控制参数一致性、融合面四源、振动与温度面、趋势与可用率 **允许依赖**:app_common, app_ETL **对外公开面**:`common/app_algorithmModel_guanlan/api.py` —— 模块间调用**只许**走这里(`scripts/module_boundary_audit.py` 机器检查)。 **当前实现落点(P3 已实体迁入)**:src/windscada/{taxonomy,audit}.py、src/windscada/perf/*、src/windscada/subsys/*、src/windcms/{report_std,tcm,knowledge,cross_review,audit_rules,pipeline}.py **迁移状态**:**P3 已完成(2026-09-22)** —— 26 个文件 / 3,858 行迁入本模块(taxonomy、audit、perf/*、subsys/*、随迁的 windcms 分析件 6 个);旧路径 `src/windscada/{taxonomy,audit,perf/*,subsys/*}` 与 `src/windcms/<6 件>` 留兼容转发壳。65 处相对导入按表改写 50 处(其余是包内相对导入,子包结构未变故保持原样)。**验收:逐值对拍** —— 迁移前后 25 项算法输出(判级矩阵、七镜头曲线、M9、可靠性、四轴 registry、曲线/限电/故障/趋势/功率曲线)**24 项逐字节一致**,唯一差异是 `trend.attribution_router` 报出的"缺件名"(因快照自身写产物而变);同状态重跑两次 **25/25 完全一致**(总哈希相同)⇒ 算法输出零变化。实逮并修掉:① 改写规则顺序误伤 windcms 侧 `.data`/`.config`(5 处);② `from . import data` 类相对导入未在规则内(已覆盖);③ 公共层/数据层的**函数级公开名**需在 api 中显式暴露(已补 load_10min/contracted_cols/slim)。 > 依据:`docs/重构方案_模块化_v0.1.md`(用户令 2026-09-22:只重构目录与接口、零行为变化、逐版本可回滚)。 ## 安装部署与运行 本系统是**单包离线交付**:解压到无空格无中文路径 → 安装 → 自检 → 启动(一套安装,七个模块共用一份 `.venv`)。 本模块目录里的脚本只是**入口包装**,内部调安装根的统一入口,保证"进模块目录也能装/跑/卸": | 动作 | Windows | Linux/macOS | 内部实际调用 | |---|---|---|---| | 安装 | `install.bat` | `sh install.sh` | 安装根 `install.bat` / `install.sh`(建 `.venv`、装依赖、自检、注册服务) | | 运行 | `run.bat` | `sh run.sh` | 安装根 `start.bat`(Windows)/`python guanlan.py serve`(跨平台) | | 卸载 | `uninstall.bat` | `sh uninstall.sh` | 安装根 `uninstall.bat` / `uninstall.sh` | 目录约定(P9,2026-09-28 用户令): ``` app_algorithmModel/ common/ 模块内通用插件/组件(旧导入前缀的兼容别名在此保留一个版本) configs/ 本模块专属配置域(共用单件在安装根 configs/) data/ 模块相关数据件(运行期数据在安装根 data/、outputs/) app_algorithmModel_guanlan/ 观澜在本模块的实现包(模块间调用只许经其中的 api.py) README.MD 本文件(职责 / 公开面 / 安装部署与运行) install.bat|sh uninstall.bat|sh run.bat|sh ``` 自检与打包:安装根 `check.bat`(=`python guanlan.py check`)、`pack.bat` / `sh pack.sh` (打包 + 开箱验证:页面 5/5 + 卸载核验)。 ## 算法服务(FastAPI,P10 起) 算法层对外提供 **HTTP 服务**(用户令 2026-09-29 的目标技术栈:算法 = Python + FastAPI), 它是后端(各栈)与前端调用算法的统一入口,**只读、不改盘上产物**: ```bash python scripts/algorithm_service.py --host 127.0.0.1 --port 18050 # 端口登记在 configs/serve.json 的 algorithm # Swagger UI: http://127.0.0.1:18050/docs OpenAPI: /openapi.json ``` | 端点 | 取数 | 参数 | |---|---|---| | `/api/systems` | 判级维度字典(七系统 + 温度通道→系统) | — | | `/api/matrix` | 七系统判级矩阵(与 `/detail/api/fleet` 的 `sysmx` 同源) | — | | `/api/reconcile` | 判级与台账对账 | — | | `/api/reliability` | 可靠性总览 | `since` | | `/api/problems` | 当前问题清单 | — | | `/api/availability_summary` | 可用率摘要 | `month_from` | | `/api/fusion` | 融合面四源表 | `all_turbines` | | `/api/handoff` | 振动融合交接件 | — | | `/api/pitch` | 变桨面(日粒度 + 零位三口径) | — | | `/api/curves` · `/api/curves_check` | 曲线仓(只读)· 曲线物理性检查 | — | | `/healthz` · `/api/endpoints` · `/api/{名}/raw` | 存活 · 端点自述 · 确定性 JSON 文本(对拍用) | — | * **不改行为的证明**:`/api/<端点>/raw` 的确定性 JSON 与进程内直调同一函数的 JSON **逐字节相同** (2026-09-29 实测 11 端点 + 3 带参抽查全部一致)。 * **离线依赖**:FastAPI 运行栈随包在 `vendor/pyfastapi/`(15.9 MB),`service/deps.py` 在导入失败时插 `sys.path`。 * 模块包独立运行时也可用:`run.bat service` / `sh run.sh service`(内部走 bootstrap)。