本文用途(2026-09-22 用户说明):本文供开发团队后续迭代观澜时使用,目标是让系统对不同风电场、不同机型尽可能适用与通用。本文以观澜当前实现为基础编写(口径取自现有代码、配置与产物),但它不是对当前实现的描述,也不是改造现有系统的要求:凡本文列出而当前实现尚未覆盖的条目,只作为后续迭代的候选需求,不得据此改动现有系统的行为与产物。
本文是「观澜 v2(风电场智能分析系统)」的需求分析文档,回答四个问题:这套系统究竟要满足谁的什么需要;这些需要从哪来、经过哪些版本变成现在的样子;每一条需要对应什么功能、什么输入、什么输出、拿什么判据验收;以及哪些事本版明确不做。本文与同批交付的《系统设计说明_观澜_2.84.1.docx》《数据要求说明_观澜_2.84.1.docx》配套:本文讲「要什么、凭什么算做到了」,设计说明讲「怎么做的」,数据要求说明讲「要哪些数据、什么形态、什么单位」。
本文的写作口径是只写能取证的事实:每个数字、每条结论都能指到仓库里的某个文件、某次实跑输出或某条版本记录;查不到、取不到的一律写明「未取证」或「未到位」,不做推测性补全。因此文中会出现少量「未取证」的说明句,那是刻意留下的诚实边界,不是遗漏。
本文面向四类读者:场站侧的运行、点检、管理人员用它核对「系统答应做的事是否都做到了」;研发与交付人员用它做需求变更的基线(改需求先改本文的 FR 编号与验收判据);验收与审计人员用第 9 章的门清单与退出码语义逐条核对;新加入项目的工程师用第 2、3 章在半小时内建立全局认识。
需要提醒的是:本文不是操作手册。放数据、重算、安装、卸载的具体命令在《重算操作手册》《输入数据放置指导》《README_先读我.MD》里,本文只在功能需求条目里给出判据与依据文件的位置。
系统版本号只有一个真源:仓库内的 src/version.py 的 VERSION 一行。本版 VERSION = 2.84.1,版本记录(HISTORY)共 152 条,人读的版本表由 scripts/version_log.py 从 HISTORY 生成到 docs/版本记录.md,并由 version_log.py --check 与 guanlan.py check 双重校验「记录表与代码一致」。
表 1-1 版本与文档的对应关系
| 项 | 值 | 取证方式 |
|---|---|---|
| 系统版本 | 2.84.1 | src/version.py 的 VERSION;guanlan.py check 实跑报「版本管理: 观澜 v2(风电场智能分析系统) v2.84.1」 |
| 交付包名 | app_guanlang_v2.84.1.zip | src/version.py 的 package_name();同一条 check 输出 |
| 本文版本 | 2.84.1(与系统版本同号) | 本文标题与 src/version.py 的 VERSION |
| 版本史条目数 | 13 条(最新一条即本次文档交付) | src/version.py 的 HISTORY;docs/版本记录.md |
| 版本号规则 | v大版本号.中版本号.小版本号;大改方案或架构、中改非核心功能、小为消缺 | src/version.py 的 BUMP_RULE 与 LEVEL_MEANING;docs/系统设计说明.md §15 |
| 版本级别机器判据 | level_of(旧, 新) 返回 major 或 minor 或 patch 或 same | src/version.py 的 level_of() |
| 本次变化级别 | 小(patch,源码模块化重构推进 P1:公共层九个平台件实体迁移,旧路径留兼容转发壳;系统功能与运行为未变) | HISTORY 中 2.59.0 条目的 level 字段 |
本版相对 2.10.0 的实质变化是交付文档对外化:三份交付文档(需求分析、系统设计说明、数据要求说明)全文不体现具体风电场(去标识化),并新增多风电场适用性一章;系统功能未变,属交付物修订。依据用户令原文:「修改三份文档,内容参考样本风电场,但不体现样本风电场,且具有不同风电场适用性」(引用时把样本场名按去标识化口径写成「样本风电场」)。
本文的取证方式分四种,文中出现数字时都能归到其中一种:读源(读代码、配置、登记表)、读文档(读仓库内已交付的设计与操作文档)、实跑(跑只读的自检与只读的审计脚本)、实测计数(对 data 与 outputs 目录做文件级计数与求和)。为避免把「文档里写过」当成「现在就是这样」,凡与现状有关的数字,本文优先采用实跑与实测计数,并在文中标注日期。本文出现的全部实测数字(件数、体量、行数、日期覆盖、耗时、退出码等)都出自样本场实测(2026-09-22):保留它们是为了说明判据与量级,换场后必须按新场重新标定与重跑,不能直接当作新场的预期值——第 11 章的多风电场适用性要求正是围绕「结构不变、参数与数据随场变」写的。
表 1-2 取证方式与本版关键数字(样本场实测(2026-09-22))
| 取证方式 | 本版用到的实跑或实测 | 关键数字 |
|---|---|---|
| 只读自检 | guanlan.py check(2026-09-22 本机) | 结论「全绿,可 serve」,退出码 0,无 FAIL 项,41 条判定行 |
| 只读审计 | scripts/pages_audit.py --check(2026-09-22) | 检查 21 项,不一致 0,已知缺口 19,退出码 0 |
| 只读计划 | scripts/rebuild_all.py --dry-run(2026-09-22) | 默认 26 步;加 --skip-scada 为 23 步 |
| 实测计数 | data/raw/<场站> 与 outputs/<场> 递归计数(2026-09-22) | 输入 26,504 件 / 224.67 GB;产物 3,549 件 / 7,157.5 MB |
| 读源 | src/version.py、configs/portal_pages.yaml、configs/serve.json、guanlan.py、scripts/rebuild_all.py | 13 条版本史;25 条顶层页面条目(含 7 条子页共 154 条);6 个服务端口 |
| 读文档 | docs/系统设计说明.md(56 个标题)、docs/说明书_观澜…v0.2.md、docs/输入数据放置指导_v0.1.md、docs/数据目录结构与落位约定_v0.2.md、docs/重算操作手册_v0.1.md、docs/页面输出体检_v0.1.md、README_先读我.MD | 逐章依据见附录 A |
本版全文遵守三条写作口径,它们是用户令落成的硬要求,也是机器清扫过的(依据 docs/系统设计说明.md §17.1):第一,描述里含「窗」且确实指时间窗口的,一律写全「时间窗」——预设时间窗、判级时间窗、证据时间窗、随所选时间窗、时间窗内;而领域词里的天气窗、作业窗、预览窗、观测窗保持原样,不误改。第二,影响的是风电机组时统一写「影响机组」或「影响机组数」,不使用以「台」计数的旧写法;数据字段名里的旧写法暂留以兼容数据契约,显示层统一。第三,用英文简写时必须写成「中文(英文简写)」,例如平均无故障间隔(MTBF)、平均停机间隔(MTBO)、单次停机时长(MDT);英文映射的键同步改,否则英文页会回落中文。
表 1-3 三条描述口径与落地位置
| 口径 | 要求 | 落地与证据 |
|---|---|---|
| 时间窗 | 含「窗」且指时间窗口者写全「时间窗」 | docs/系统设计说明.md §17.1;v2 页面顶栏控件与图注均写「随所选时间窗」 |
| 影响机组 | 影响风电机组时写「影响机组」 | 表头与说明含报告构建器;数据字段名暂保留 |
| 英文简写 | 中文(英文简写) | 平均无故障间隔(MTBF)、平均停机间隔(MTBO)、单次停机时长(MDT);i18n_en 键同步 |
另外,本文出现的台号(如 WTG01 至 WTG38 一类写法)是样本场内部编号,保留编号形态只是为了与产物、台账和依据逐条对得上;换场时按实际台号替换,编号本身不构成接口约定。
术语的完整解释见附录 B。
本系统(观澜 v2,风电场智能分析系统)是一套纯离线的海上风电场智能分析单包系统,对象是样本风电场(下称「本场」)的 38 台 4.0 MW 级海上机组;机型代号与主机制造商(OEM)名称从略,业主单位名称从略。它把现场给来的运行数据、状态监测、报警、工单、油样落到每台机组的正确部件上,给出带证据、带边界、带责任人的检修结论;判断在代码里,本机模型只负责问答、解释与引用,不发明结论。软件不含任何联网功能,也不需要现场系统配合改造:原始件从 data/raw 读入,产物落在 outputs 下,页面只读产物,产物由数据算出来。
一页话术(给第一次接触的人的三十秒版本):这套系统不控制风机、不下发指令、不改现场任何系统。它做的是「把现场已有的数据读进来,算出一份能说清依据的体检报告,然后用一个门户和三个服务把它讲清楚」。放数据之前,页面会如实显示「无产物」并告诉你缺哪一件、怎么补;放了数据之后,一条命令重算,页面立刻有数。所有结论都能往回指到源件与算法,指不到的地方它会写「不可判」或「缺件」,而不是编一个数字。
交付形态是离线单包(EDITION = offline-single-package):一个安装目录里同时是程序、配置、交付件与数据入口。安装目录不要带空格与中文。程序侧有 6 个常驻服务,全部由安装目录下的启动器或系统服务托管;组件的内部接口只监听本机回环地址,只有门户网关按配置可对外监听。
表 2-1 常驻服务与端口(依据 configs/serve.json 与 guanlan.py 内置默认,两者口径一致)
| 服务 | 默认端口 | 监听地址 | 作用 |
|---|---|---|---|
| 门户网关 | 28084 | host 与 public_host(出厂 public_host 为 0.0.0.0) | 门户单文件页、路由与改写、运维控制台、/healthz、/api/version |
| 分析工作台 | 18033 | host(127.0.0.1) | 十个标签的分析工作台与全部 /api 取数 |
| 振动诊断 | 18020 | host(127.0.0.1) | CMS 振动报告页、逐台页、工作台页、谱图 |
| 仿真与回放 | 18791 | host(127.0.0.1) | 整机联调仿真台静态资产 |
| 仿真四系统合页 | 18792 | host(127.0.0.1) | 从冻结资料包读取的四系统合页 |
| 三维拆装工作台 | 64292 | host(127.0.0.1) | 三维资产页 |
| 本机模型(可选) | 11434 | 本机 | 本地大模型推理服务,只影响问答与本地初筛 |
对外只有一个入口 28084。这不是省事,而是边界:页面没有鉴权,把组件直接暴露出去等于把全场的运行数据摊开。要对外访问时的正确做法是限来源(防火墙白名单或反向代理加认证),或把 public_host 改回空串只用本机加隧道。
表 2-2 系统能力清单(能力域、给谁用、载体、验收锚点,样本场实测(2026-09-22))
| 能力域 | 能力 | 主要载体 | 验收锚点或判据 |
|---|---|---|---|
| 判级 | 38 台乘九系统判级矩阵,四轴随时间窗重算 | 工作台系统矩阵、逐台页、问题页 | 判级报警机组数随所选时间窗变化;样本不足如实写不可判 |
| 部件问题 | 部件可靠性表、问题下钻、完整依据 | 工作台 component 与 vibration 标签 | 平均无故障间隔(MTBF)、平均停机间隔(MTBO)、单次停机时长(MDT)随所选时间窗变化;依据展开永不为空 |
| 发电性能 | 七镜头曲线、七张月度时序图、控制参数一致性 | 工作台 energy 与 generation 标签 | 图注写「随所选时间窗」;样本量随时间窗变化;控制参数按所选时间窗重算 |
| 振动 | 振动窗索引、谱库、CMS 报告、逐台页、在升与换件闭环、三层基线 | CMS 服务、工作台 vibration 标签 | 振动窗 w0316 索引 2,066,686 行;谱 420,742 条;缺件时如实空表并写边界 |
| 台账 | 报警、工单、油样三门台账与停机事件 | 工作台 fault 标签、数据层维护页 | 报警 39,211 行、工单 5,876 行、油样 404 行 |
| 本体与问答 | 对象库、检索索引、决策链、趋势证据、问答与校闸 | 工作台 assistant 与 decision 标签 | 本体审计 0 问题;两档模型都拦则不出文并给原因 |
| 报告 | CMS 标准模版报告、事实契约与派生、门户结论段 | 报告页、门户、qc 派生件 | 契约改一条 claim 则四个消费端全变 |
| 运维 | 一条命令重算、控制台按钮、清产物、数据扫描与看门狗 | 门户数据重算页、运维控制台 | 默认 26 步计划;并发动作返回 409;扫描退出码 0 与 4 与 5 |
| 门户与检索 | 单文件门户、页面归口与陈旧检测、知识检索 | 门户、页面归口登记表 | 归口审计退出码 0;页面陈旧报 7 |
| 数据接入 | 落位、体检、增量三清单、场站辨识 | 命令行脚本与维护页 | 结构合规;冲突拦下;场站辨识四条规则 |
| 交付与运维 | 打包、开箱验证、服务化、版本检查、卸载 | install、pack、uninstall 入口与服务注册器 | 入口引用闭合 48 条;卸载入口 2 个;版本记录与代码一致 |
需求从三条线汇拢。第一条是现场运行的需要:值班要一眼看清全场哪几台机组有问题,点检要顺着问题找到部件与证据,管理要一份能对外的结论。第二条是交付与运维的需要:机器上没有网络、现场不会敲命令、数据每月增量、程序要能装能卸能升级。第三条是用户令:每一次人工测试或现场事故之后,用户用一句话把要求定下来(例如「所有的计算均要形成观澜的源代码」「对 data/raw 下文件的增减做到监听」「增加自定义时间段」),研发把它落成代码、机器守卫与文档。
三条线里,用户令是最硬的驱动力:它带来的是可核验的验收判据,而不是一段描述。本版 13 条版本记录里,绝大多数条目的形态都是「检查到的问题 → 根因 → 解决 → 验证」,其中「验证」一栏写的就是实跑的退出码与逐值对拍结果。
表 3-1 版本史与用户令要点(依据 src/version.py 的 HISTORY,共 152 条)
| 版本 | 日期 | 用户令要点 | 变化级别 |
|---|---|---|---|
| 2.84.1 | 2026-10-05 | 清产物/重算后工作台自动重取数;实测空数据各页显示空态 | 小(patch) |
| 2.84.0 | 2026-10-05 | 修「清除产物 404」:网关加 Path=/ops/api/** 专用路由 | 中(minor) |
| 2.83.3 | 2026-10-05 | 修「系统维护」数据重算按钮消失:内嵌改为直接 iframe src=/ops | 小(patch) |
| 2.83.2 | 2026-10-05 | 修「汇报定制」按钮不可用:照旧页逐条接线 | 小(patch) |
| 2.83.1 | 2026-10-05 | 修「振动 CMS 不随时间窗变化」:改用随窗 KPI 并注明证据窗口径 | 小(patch) |
| 2.83.0 | 2026-10-05 | 方案 B:「振动 CMS」按门户原页逐条保真 | 中(minor) |
| 2.82.2 | 2026-10-05 | 「振动 CMS」改用与其它子选项卡相同的渲染路径 | 小(patch) |
| 2.82.1 | 2026-10-05 | 修「振动 CMS」看着没内容:影子树内 :root 失效,改为 :host | 小(patch) |
| 2.82.0 | 2026-10-05 | 门户去掉三项已迁移导航;「振动 CMS」改 Shadow DOM 渲染 | 中(minor) |
| 2.81.7 | 2026-10-05 | 修「振动 CMS 展示不出」:TDZ;内嵌 iframe 改 Blob URL | 小(patch) |
| 2.81.6 | 2026-10-05 | 修「振动 CMS」展示:改门户同款渲染,实时 chip 归位 | 小(patch) |
| 2.81.5 | 2026-10-05 | 修「系统维护」等页签内容未加载:App 改为按页签按需取数 | 小(patch) |
| 2.81.4 | 2026-10-05 | 修「数据重算」看不到清除产物/重算按钮:网关去掉 X-Frame-Options 默认 DENY | 小(patch) |
| 2.81.3 | 2026-10-04 | 「系统维护」内的「数据重算」改为同源 iframe + 门户 CSS | 小(patch) |
| 2.81.2 | 2026-10-04 | 「系统维护」内的「数据重算」改为 v2.9.2 原样 | 小(patch) |
| 2.81.1 | 2026-10-04 | 「振动 CMS」页数值全部按窗/CMS 实时 | 小(patch) |
| 2.81.0 | 2026-10-04 | 门户「振动·CMS」迁入「振动融合分析」为并列子选项卡「振动 CMS」 | 中(minor) |
| 2.80.2 | 2026-10-04 | 修「振动融合分析」点击子选项卡页面不变 | 小(patch) |
| 2.80.1 | 2026-10-04 | 振动融合分析与 v2.9.2 差异核定;修 cms 子页面未取 /api/vibcms | 小(patch) |
| 2.80.0 | 2026-10-04 | 页签精简+ 删除页头模式按钮 | 中(minor) |
| 2.79.1 | 2026-10-04 | 入库「整页外壳对比」工具;回滚一次导致挂载失败的外壳对齐尝试 | 小(patch) |
| 2.79.0 | 2026-10-04 | 工作台补全套时间窗控件;门户装配改分阶段 | 中(minor) |
| 2.78.4 | 2026-10-04 | 修 /detail/v2 空白:vite base 由相对 ./ 改为绝对 /web/ |
小(patch) |
| 2.78.3 | 2026-10-04 | 修「点登录不进工作台」:iframe 内捕获期接管 4 个入口 + 外层 hashchange | 小(patch) |
| 2.78.2 | 2026-10-04 | 修「登录后进不了工作台」:补 /detail/v2 路径判定 + 修 TDZ;门户三入口改 target=_top | 小(patch) |
| 2.78.1 | 2026-10-04 | 修门户正文出现原始标记文字:装配口径照 portal_build.py | 小(patch) |
| 2.78.0 | 2026-10-04 | 门户整页化 + /detail/v2 指向 Vue 工作台 |
中(minor) |
| 2.77.0 | 2026-10-03 | 修「不居中」:补 v2.9.2 的外层容器 .wrap | 中(minor) |
| 2.76.1 | 2026-10-03 | 门户模式标题取门户自身;真机两版并排结果记档 | 小(patch) |
| 2.76.0 | 2026-10-03 | 结构对拍 10/10 全部一致 | 中(minor) |
| 2.75.1 | 2026-10-03 | component +1 的诊断记档 | 小(patch) |
| 2.75.0 | 2026-10-03 | 内容对拍 10/10 全绿;结构 9/10 | 中(minor) |
| 2.74.0 | 2026-10-03 | 对拍判据稳定化;步骤⑤之一:文本/表格/图数字复核 | 中(minor) |
| 2.73.0 | 2026-10-03 | component 收敛到 +1;9/10 稳定达标 + 记录两处待办 | 中(minor) |
| 2.72.0 | 2026-10-03 | energy / generation / fault 结构一致;component 收敛到 +6 | 中(minor) |
| 2.71.0 | 2026-10-03 | decision 结构一致+ energy/generation 图表改用 v2.9.2 的 SVG 渲染器 | 中(minor) |
| 2.70.0 | 2026-10-03 | 新版根路径 / = 门户;工作台走 #workbench |
中(minor) |
| 2.69.0 | 2026-10-03 | 新增 v-unwrap 指令:消除 v-html 宿主多出的一层 ⇒ vibration / assistant 结构一 | 中(minor) |
| 2.68.0 | 2026-10-03 | overview 结构对齐 | 中(minor) |
| 2.67.0 | 2026-10-03 | Fault 页图表改用 v2.9.2 的 SVG 渲染器+ 结构判据透明化 | 中(minor) |
| 2.66.1 | 2026-10-03 | 修可移植性门禁红项 | 小(patch) |
| 2.66.0 | 2026-10-03 | 门户在 Vue 中严格实现+ 静态附加件放置助手 | 中(minor) |
| 2.65.0 | 2026-10-03 | 图表改为复用 v2.9.2 的 SVG 渲染器 | 中(minor) |
| 2.64.0 | 2026-10-03 | 结构级对拍:工具落地 + 逐页签差距实测 | 中(minor) |
| 2.63.1 | 2026-10-03 | 恢复呈现对拍基线:10 个页签实测与重构前一致 | 小(patch) |
| 2.63.0 | 2026-10-03 | 前端与 v2.9.2 一致:Vue 采用旧页样式表 + 提供 v2.9.2 原样经典页 | 中(minor) |
| 2.62.1 | 2026-10-03 | 「门户栏目」收敛为在线服务两项;「架构与资料」内嵌四节整页展开 | 小(patch) |
| 2.62.0 | 2026-10-03 | 门户四节原样内嵌进工作台+ 修 Workbench 模板分支未命中 | 中(minor) |
| 2.61.0 | 2026-10-03 | 工作台补「门户栏目」页签;记档一次失败的网关路由尝试 | 中(minor) |
| 2.60.1 | 2026-10-03 | 两个 Java 进程纳入 serve 托管 | 小(patch) |
| 2.60.0 | 2026-10-03 | 门户「交付文档」「数据重算」迁入工作台页签+ 后端接口 | 中(minor) |
| 2.59.0 | 2026-10-01 | 产品机就绪收尾:重算链安全清理 + 逐件台账再生 + 暂存件移出产物仓 | 中(minor) |
| 2.58.0 | 2026-10-01 | 旧产物件清理+ 台账误删的自我修复 | 中(minor) |
| 2.57.2 | 2026-10-01 | 修回被删残的重算链并留待办提示 | 小(patch) |
| 2.57.1 | 2026-10-01 | 系统设计说明补“三栈重写的删除批次与能力承接”一节 | 小(patch) |
| 2.57.0 | 2026-10-01 | 单文件烘焙页随旧页退役 ⇒ 旧页渲染批已全部删除 | 中(minor) |
| 2.56.1 | 2026-10-01 | lang.py 退役+ 补 en.ts ⇒ 项目检查全绿 | 小(patch) |
| 2.56.0 | 2026-10-01 | 删除旧 Python 业务后端;产物生成端取数改指算法服务 | 中(minor) |
| 2.55.0 | 2026-10-01 | 入口改为 Vue 工作台 · 门户退役 | 中(minor) |
| 2.54.1 | 2026-10-01 | 删除旧页 design/terms+ 摘除 api 转发 ⇒ 全门禁保持通过 | 小(patch) |
| 2.54.0 | 2026-10-01 | 删被替掉的旧页前端资源+ 台账与门禁随退役对齐 ⇒ 全门禁通过 | 中(minor) |
| 2.53.2 | 2026-10-01 | detail 依赖台账按退役后的现场重写 ⇒ 全门禁恢复绿 | 小(patch) |
| 2.53.1 | 2026-10-01 | 产物登记按“不随包”入册 + 审计先看 known_gap ⇒ 开箱验证全绿 | 小(patch) |
| 2.53.0 | 2026-10-01 | 网关精确路径别名+ 契约面收敛 ⇒ 复核 40/40 全绿 | 中(minor) |
| 2.52.1 | 2026-10-01 | 修 config_audit 逮到的“手拼 configs 路径”⇒ 全门禁恢复 | 小(patch) |
| 2.52.0 | 2026-10-01 | HTTP 契约复核基址随架构更新⇒ 36/42;6 条页级不一致已列明 | 中(minor) |
| 2.51.1 | 2026-10-01 | 开箱核验页面清单随架构更新⇒ 页面 5/5 | 小(patch) |
| 2.51.0 | 2026-10-01 | 交付形态补齐:四模块可单独打包 + 根 run.bat/run.sh + install/uninstall 支持按模块 | 中(minor) |
| 2.50.0 | 2026-10-01 | 停用 Python 业务后端:运行期验证不再需要它 | 中(minor) |
| 2.49.0 | 2026-10-01 | 门户制品化:Java 网关文件优先伺服 release/portal.html | 中(minor) |
| 2.48.0 | 2026-09-30 | 补 /api/rpt_compose 探针⇒ 前端对拍恢复 10/10 | 中(minor) |
| 2.47.1 | 2026-09-30 | 修门户回归+ 登记 gateway_java 端口 ⇒ 门禁恢复全绿 | 小(patch) |
| 2.47.0 | 2026-09-30 | 入口切到 Java 网关;Python 网关退到 28086 继续供 /ops;旧页 /detail/v2 仍可达 | 中(minor) |
| 2.46.0 | 2026-09-30 | Java 网关补齐入口——为删 Python 源码铺路 | 中(minor) |
| 2.45.0 | 2026-09-30 | 灰度切换:同源 /api/* 直通 Java | 中(minor) |
| 2.44.0 | 2026-09-30 | 问答管线真跑成功;裁判把 ask_status 状态字段整组登记忽略 | 中(minor) |
| 2.43.0 | 2026-09-30 | 问答管线端到端接通;仅因本机模型服务未启动而报错 | 中(minor) |
| 2.42.1 | 2026-09-30 | 问答管线搬进算法服务;Java 侧接线暂撤回以保树可编译 | 小(patch) |
| 2.42.0 | 2026-09-30 | POST /api/ask 校验语义对齐 + 裁判加 POST 能力 ⇒ Java 范围 17/17 全部一致 | 中(minor) |
| 2.41.0 | 2026-09-30 | rpt_export 收口+ 裁判加解包文本比对 ⇒ 计分板 16/17 | 中(minor) |
| 2.40.1 | 2026-09-30 | rpt_export 组装侧就绪;HTTP 与 Java 侧下一轮接通 | 小(patch) |
| 2.40.0 | 2026-09-30 | vibcms 与 reload 迁移 + 裁判对有状态端点加固 ⇒ 计分板 15/17 | 中(minor) |
| 2.39.0 | 2026-09-30 | ask_models 与 ask_status 用 Java 实现并逐值一致 ⇒ 计分板 13/17 | 中(minor) |
| 2.38.0 | 2026-09-30 | curves 迁移 + 裁判学会等落定 ⇒ 计分板 11/17 | 中(minor) |
| 2.37.0 | 2026-09-30 | /api/fleet 逐值一致 ⇒ 计分板 10/17;裁判加预热消除冷启假差异 | 中(minor) |
| 2.36.2 | 2026-09-30 | fleet 链路打通但差异收敛到单字段,未计一致 | 小(patch) |
| 2.36.1 | 2026-09-30 | fleet 搬运完成但未计一致:自检仅剩 kpi.关注台 一处差异 | 小(patch) |
| 2.36.0 | 2026-09-30 | /api/channels 一致⇒ 计分板 9/17 | 中(minor) |
| 2.35.0 | 2026-09-30 | /api/maint_std 逐值一致 ⇒ 计分板 8/17 | 中(minor) |
| 2.34.0 | 2026-09-30 | /api/maint_framework 逐值一致 ⇒ 计分板 7/17 | 中(minor) |
| 2.33.0 | 2026-09-30 | /api/ont_chain 逐值一致 ⇒ 计分板 6/17 | 中(minor) |
| 2.32.0 | 2026-09-30 | 本体两端点逐值一致 ⇒ 计分板 5/17;算法服务通用参数透传 | 中(minor) |
| 2.31.0 | 2026-09-30 | /api/maint_survey 逐值一致:定下数据类端点迁移范式 + Java 复刻对外脱敏 | 中(minor) |
| 2.30.1 | 2026-09-30 | Java 迁移范围澄清:契约 42 条中属 Java 后端的是 17 条,算法 13 条本就是目标栈 | 小(patch) |
| 2.30.0 | 2026-09-30 | Java 第二批端点 /api/dq_findings 逐值一致 | 中(minor) |
| 2.29.1 | 2026-09-30 | Java 迁移裁判修正:未实现只按 HTTP 状态判;澄清 /api/facts/claim 不在 42 条契约内 | 小(patch) |
| 2.29.0 | 2026-09-30 | Java 后端迁移开工:逐条比对裁判 + 同一源站灰度路由 + 首批端点 /api/facts 已一致 | 中(minor) |
| 2.28.1 | 2026-09-29 | 灰度切换第一步就绪:Vue 产物经网关可作并列入口 | 小(patch) |
| 2.28.0 | 2026-09-29 | report 页签迁移完成 ⇒ 10/10 页签全部通过严格整页签对拍 | 中(minor) |
| 2.27.0 | 2026-09-29 | assistant 与 system 两个页签迁移完成 ⇒ 已迁页签 9/10 | 中(minor) |
| 2.26.0 | 2026-09-29 | decision 页签迁移完成⇒ 已迁页签 7/10 | 中(minor) |
| 2.25.0 | 2026-09-29 | generation 页签迁移完成⇒ 已迁页签 6/10 | 中(minor) |
| 2.24.2 | 2026-09-29 | generation 继续推进:补曲线图组 HTML 图例、候选机整串渲染;对拍仍受 /api/curves 建设态影响 | 小(patch) |
| 2.24.1 | 2026-09-29 | generation 页签迁移进行中 | 小(patch) |
| 2.24.0 | 2026-09-29 | vibration 页签迁移完成⇒ 已迁页签 5/10 | 中(minor) |
| 2.23.3 | 2026-09-29 | vibration 的 events 子视图迁移完成 | 小(patch) |
| 2.23.2 | 2026-09-29 | vibration 的 units 子视图迁移完成 | 小(patch) |
| 2.23.1 | 2026-09-29 | vibration 的 loop 子视图迁移完成 | 小(patch) |
| 2.23.0 | 2026-09-29 | vibration 的 matrix 子视图迁移完成,对拍 561 条文本一致 | 中(minor) |
| 2.22.1 | 2026-09-29 | 对拍门支持子视图;vibration 侦察结论入档 | 小(patch) |
| 2.22.0 | 2026-09-29 | fault 页签迁移完成;对拍门加“显式例外”并记下后端一处口径文案不一致 | 中(minor) |
| 2.21.2 | 2026-09-29 | fault 对拍推进:Pareto 图内 HTML 摘要逐字复现,图数据改用原值 | 小(patch) |
| 2.21.1 | 2026-09-29 | fault 页签迁移进行中+ 对拍门两处口径修正 | 小(patch) |
| 2.21.0 | 2026-09-29 | 三页签通过严格整页签对拍· ECharts 图表数据级一致 | 中(minor) |
| 2.20.0 | 2026-09-29 | ECharts 引入 + Java 网关/OAuth2/Security 落地;呈现对拍门升级为“严格整页签” | 中(minor) |
| 2.19.0 | 2026-09-29 | Vue 迁移第一个页签+ 呈现对拍门:jsdom 跑旧页面 vs Vue SSR,锚点逐项一致 | 中(minor) |
| 2.18.0 | 2026-09-29 | 后端 Java 化:Spring Boot 2.7.18 + springfox Swagger 离线可编可跑,与算法服 | 中(minor) |
| 2.17.0 | 2026-09-29 | 前端 Vue 化:Vue3+Vite+TS 工程落 release/web、经网关 /web 同源伺服、契约冒烟两侧一致 | 中(minor) |
| 2.16.0 | 2026-09-29 | 冻契约:现有 HTTP 面固化成契约正本 + 在线复核门 | 中(minor) |
| 2.15.2 | 2026-09-29 | 算法服务随 serve 默认起 | 小(patch) |
| 2.15.1 | 2026-09-29 | 算法服务消缺:日志纳入统一格式+ 端点登记表按实测收口 + 模块入口可起服务 | 小(patch) |
| 2.15.0 | 2026-09-29 | 算法服务化:算法层包成 FastAPI 服务,离线依赖随包 | 中(minor) |
| 2.14.0 | 2026-09-29 | 分别打包:前端 / 后端 / 算法 / 数据接入与管理 各自成包 | 中(minor) |
| 2.13.0 | 2026-09-28 | P9 源码目录结构变更:实现包上提模块根 + 每模块 common/configs/data/README/入口脚本 + | 中(minor) |
| 2.12.1 | 2026-09-28 | 源码梳理与死代码清理:删 cms_availability+ 清本地残留 15.4 MB | 小(patch) |
| 2.12.0 | 2026-09-28 | 模块化重构收官 P7:质量门与打包安装迁移——七个模块齐备 | 中(minor) |
| 2.11.9 | 2026-09-28 | 模块化重构 P6:本体与知识层实体迁移 | 小(patch) |
| 2.11.8 | 2026-09-28 | 消缺:guanlan.py stop 在 pids.json 读不动/删不掉时抛异常中断 | 小(patch) |
| 2.11.7 | 2026-09-28 | 模块化重构 P5:前端层实体迁移 | 小(patch) |
| 2.11.6 | 2026-09-28 | 消缺:服务 restart 的等待判据把 STOP_PENDING 当成已停 | 小(patch) |
| 2.11.5 | 2026-09-28 | 消缺:Windows 服务 restart 是无效命令 | 小(patch) |
| 2.11.4 | 2026-09-28 | 模块化重构 P4:后端层实体迁移 | 小(patch) |
| 2.11.3 | 2026-09-22 | 模块化重构 P3:算法层实体迁移 | 小(patch) |
| 2.11.2 | 2026-09-22 | 模块化重构 P2:数据接入管理实体迁移 | 小(patch) |
| 2.11.1 | 2026-09-22 | 模块化重构 P1:公共层九个平台件实体迁移 | 小(patch) |
| 2.11.0 | 2026-09-22 | 源码模块化重构 P0:七个模块目录 + 接口层 + 模块边界门 | 中(minor) |
| 2.10.4 | 2026-09-22 | 数据要求说明补测点:安全链与数字输入、执行器与热管理、计数账、CMS 采集参数、测点与位号字典(系统功能未变) | 小(patch) |
| 2.10.3 | 2026-09-22 | 交付件定名:《设计说明》定名为《系统设计说明》,与另外两份的交付命名对齐(文档内容未变) | 小(patch) |
| 2.10.2 | 2026-09-22 | 数据要求说明改为纯数据需求规格:去样本场现状与实现细节、测点按业务含义列表、新增 SCADA 秒级数据要求(系统功能未变) | 小(patch) |
| 2.10.1 | 2026-09-22 | 交付文档对外版:全文去样本场标识,并新增多风电场适用性一章(系统功能未变) | 小(patch) |
| 2.10.0 | 2026-09-22 | 整理需求、设计、数据接入各写一份 Word 文档,并源代码化其生成器 | 中(minor) |
| 2.9.2 | 2026-09-22 | 升级后验收补缺:重算链增 ⑧d 版本记录一致性门,版本与文档漂移有了自动拦截点 | 小(patch) |
| 2.9.1 | 2026-09-22 | 人工测试 7 项消缺:描述口径、依据空白、问题页空、门户链接 404、闭环文案、本机模型升档档位 | 小(patch) |
| 2.9.0 | 2026-09-21 | 时间窗真正生效:部件问题与发电性能随所选时间窗重算,新增自定义起止日期时间窗 | 中(minor) |
| 2.8.2 | 2026-09-21 | 扫描器的变化判据被两类非摄入件常年占住:新増上游归档口径与忽略模式 | 小(patch) |
| 2.8.1 | 2026-09-20 | 台账等价验收在全新机器上必然非零:改为容忍并写明「没做验收」 | 小(patch) |
| 2.8.0 | 2026-09-20 | 输入数据自动扫描识别:逐族指纹发现新增与变化,指明该跑哪几步并纳入重算 | 中(minor) |
| 2.7.0 | 2026-09-19 | 远程部署消缺:振动窗发布被占用不再打断重算链;门户可对外监听;控制台打印不炸 | 中(minor) |
| 2.6.0 | 2026-09-19 | 所有的计算均要形成观澜的源代码:融合面、总览页、事实契约、发布层、变桨面、振动基线与在升全部自算 | 中(minor) |
| 2.5.0 | 2026-09-17 | 卸载闭环、版本管理与打包命名规则、版本记录 | 中(minor) |
| 0.4.0 | 2026-09-17 | 打包默认不含输入数据与产物与日志与临时文件;无窗口启动;统一配置与日志;页面归口;服务化 | 旧编号(legacy) |
| 0.2.0 | 2026-09-01 | 含产物的旧交付基线,历史上用作「包内无生成端」那批产物的补救源 | 旧编号(legacy) |
需求的演进如图 1-1 所示。该图依据 src/version.py 的 HISTORY 绘制,覆盖上表 152 条记录(即两级旧编号 0.4.0 与 0.2.0,以及从 2.5.0 起按规则递增的150个版本)。按级别统计,这150个版本里「中」级变化80条(2.84.0、2.83.0、2.82.0、2.81.0、2.80.0、2.79.0、2.78.0、2.77.0、2.76.0、2.75.0、2.74.0、2.73.0、2.72.0、2.71.0、2.70.0、2.69.0、2.68.0、2.67.0、2.66.0、2.65.0、2.64.0、2.63.0、2.62.0、2.61.0、2.60.0、2.59.0、2.58.0、2.57.0、2.56.0、2.55.0、2.54.0、2.53.0、2.52.0、2.51.0、2.50.0、2.49.0、2.48.0、2.47.0、2.46.0、2.45.0、2.44.0、2.43.0、2.42.0、2.41.0、2.40.0、2.39.0、2.38.0、2.37.0、2.36.0、2.35.0、2.34.0、2.33.0、2.32.0、2.31.0、2.30.0、2.29.0、2.28.0、2.27.0、2.26.0、2.25.0、2.24.0、2.23.0、2.22.0、2.21.0、2.20.0、2.19.0、2.18.0、2.17.0、2.16.0、2.15.0、2.14.0、2.13.0、2.12.0、2.11.0、2.10.0、2.9.0、2.8.0、2.7.0、2.6.0、2.5.0),「小」级变化70条(2.84.1、2.83.3、2.83.2、2.83.1、2.82.2、2.82.1、2.81.7、2.81.6、2.81.5、2.81.4、2.81.3、2.81.2、2.81.1、2.80.2、2.80.1、2.79.1、2.78.4、2.78.3、2.78.2、2.78.1、2.76.1、2.75.1、2.66.1、2.63.1、2.62.1、2.60.1、2.57.2、2.57.1、2.56.1、2.54.1、2.53.2、2.53.1、2.52.1、2.51.1、2.47.1、2.42.1、2.40.1、2.36.2、2.36.1、2.30.1、2.29.1、2.28.1、2.24.2、2.24.1、2.23.3、2.23.2、2.23.1、2.22.1、2.21.2、2.21.1、2.15.2、2.15.1、2.12.1、2.11.9、2.11.8、2.11.7、2.11.6、2.11.5、2.11.4、2.11.3、2.11.2、2.11.1、2.10.4、2.10.3、2.10.2、2.10.1、2.9.2、2.9.1、2.8.2、2.8.1),没有大版本升级。这个分布清楚地显示出这条线的性质——功能面在 2.5.0 到 2.7.0 之间快速铺开,之后转入以消缺与口径统一为主的密集收敛期。
从时间轴能看出三个事实。第一,2.5.0 到 2.7.0 三天内出了三个中版本,全部是「装上、卸掉、打包、对外监听」这类交付能力,说明这一阶段的需求主线从「算得对」转向「交付得出去」。第二,2.7.0 之后密集出现小版本消缺,且每一条都带实跑验证,说明需求进入了「现场怎么用就怎么改」的收敛期。第三,2.10.0 是规格化的标志:需求不再只由代码与脚本承载,而是被写成可评审的文档,且文档本身也源代码化,可机器重生成。2.10.1 在这条线上再走一步:文档去样本场标识并补上多风电场适用性一章,使同一份文档能被别的风电场直接拿去用。2.10.2 把《数据要求说明》改成纯数据需求规格:不写样本场的接入现状、不写英文测点名与文件名与落盘位置,测点一律用业务含义名称按类列表(含单位与必须性),并补上 SCADA 秒级数据的要求。2.10.3 把《设计说明》定名为《系统设计说明》,与另外两份交付文档的命名对齐(文档内容未变)。2.10.4 按测点遗漏体检补齐《数据要求说明》:新增安全链与数字输入、执行器与热管理两域,扩充计数账与 CMS 采集参数,并加上"测点与位号字典"这项收资要求。2.11.0 起按用户令做源码模块化重构(七个模块目录 + 接口层 + 模块边界门),2.11.1 把公共层九个平台件实体迁入模块目录、旧路径留兼容转发壳——两步都是源码组织层变化,行为零变化。
用户令通常是一句话,落到系统里要经过「变成判据、变成机器守卫、变成可复核证据」三步。第一步最关键:把一句中文要求翻译成一个可判定的条件。例如「时间窗变化时部件问题要跟着变」,翻译成「给定时间窗 w,判级矩阵的返回必须随 w 而变,且月度件按月取整、日粒度件按日精确」,这样才有办法验。第二步是把它做成每次都会跑的守卫,而不是靠人记得。第三步是留下可复核的证据(日志、退出码、逐值对拍结果、sha256)。
表 3-2 用户令到程序化落点的对照(节选,按版本递进,样本场实测(2026-09-22))
| 用户令(原话要点) | 程序化落点 | 可核验证据 |
|---|---|---|
| 部件问题与发电性能应随下拉框值变化,并增加自定义时间段 | months_of(win) 与 win_range 与 in_win;taxonomy.system_matrix(span=);reliability.overview(span=);/api/curves?win= | 变桨报警 15 与 13 与 10、偏航 15 与 11 与 5、齿轮箱 7 与 4 与 4 分别对应 2026年与 2025H2 与 2026-07 |
| 对 data/raw 含嵌套子目录下文件的增减做到监听 | scripts/raw_scan.py 逐族指纹(件数、体积、最新落盘、清单摘要、子目录清单);重算链 ①b 步;rebuild_all --auto | 实测 --check 由 rc=4 转 rc=0(与上次快照一致);空目录新建也能发现 |
| 所有的计算均要形成观澜的源代码 | 逐族补生成端:变桨面、在升闭环、三层基线、融合面 handoff、总览页、由台账生成 claim | 反向呼应审计成立 3,548 件、不成立 0 件、未归类 0 件 |
| 运行期一律不从交付包补齐 | 第 ⑤ 步由「补齐随包件」改为「反向呼应审计」,只报账不搬运 | rebuild_all --dry-run 计划中 ⑤ 步命令为 products_reverse_audit.py --check |
| 清除产物不留备份 | products_state.py --off --yes 改真删除;--on 与门户恢复按钮移除 | 控制台按钮语义与 409 前置校验;docs/系统设计说明.md §7 |
| 装成服务并在安装时检查版本 | win_service.py 以 ctypes 直连 SCM;service_main.py 与 systemd 单元;install-info.json 记录版本并比对 | check 实跑报「卸载入口在位 2 个」「版本管理 v2.84.1」 |
| 观澜改为监听所有 IP | serve.json 增 public_host 且出厂为 0.0.0.0,仅门户网关用它,组件仍绑本机 | check 实跑显示 6 个端口全部运行中;README 第二节写明无鉴权风险与回退口径 |
| 描述口径:时间窗、影响机组、中文(英文简写) | 界面文案与报告构建器统一改写;i18n_en 键同步 | docs/系统设计说明.md §17.1 与 §17.2;语言包 845 条前后端成对 |
| 整理需求与设计与数据接入各写一份 Word 文档 | docs/src 下 markdown 源件;渲染器输出带域目录的 docx;插图生成器生成 14 张图,数字全部从真件取 | HISTORY 2.10.0 条目;本版三份文档 |
系统没有账号体系,角色划分是使用场景的划分,不是权限的划分。这一点必须在需求层面写清:当前版本没有页面鉴权,谁打开浏览器谁就能看到全场的运行数据;对外可达时的风险控制靠网络层(防火墙白名单、反向代理加认证、只绑内网地址)而不是靠系统内部。角色表的价值在于把「谁要什么」变成可核对的功能覆盖清单。
表 4-1 角色与核心诉求
| 角色 | 典型身份 | 核心诉求 | 主要页面与入口 | 对应功能需求 |
|---|---|---|---|---|
| 值班运行 | 场站值班员、集控值班员 | 一眼看清全场状态;报警是否集中;有没有正在恶化的机组 | 门户总览、系统状态、工作台 overview 与 energy、振动与 CMS | FR-01 至 FR-05、FR-09 至 FR-12 |
| 点检与检修 | 点检员、检修工程师、专业工程师 | 从现象定位到部件;要证据、要边界、要处置建议;看换件后是否回落 | 工作台 component 与 vibration 与 decision、问题页、CMS 逐台页 | FR-03 至 FR-05、FR-13 至 FR-17、FR-22 至 FR-25 |
| 场站管理 | 场长、技术负责人、生产管理 | 结论能否对外;停机损失与可靠性账;治理进展 | 门户经验发现与交付文档、汇报纸与报告导出、治理清单交付件 | FR-03、FR-09 至 FR-12、FR-26 至 FR-28 |
| 研发与交付 | 观澜维护方、交付工程师、审计人员 | 数据怎么接、重算是否成功、安装升级卸载是否干净、口径是否一致 | 运维控制台、数据重算页、命令行入口、版本记录与设计说明 | FR-29 至 FR-52、NFR 全部 |
场景不必多,八个够覆盖日常。每个场景都要能回答「谁、在什么时刻、要完成什么、打开哪一页、看到什么算成功」。这一步是需求分析里最有用的动作:它把抽象的「系统要好用」变成「点开这页三秒内能看出哪几台报警」。角色、场景与页面的关系如图 2-1 所示。
表 4-2 场景到任务到页面
| 场景 | 任务 | 页面或入口 | 成功的样子 |
|---|---|---|---|
| 交班巡检 | 看全场状态与报警集中度 | 门户总览、系统状态、数据重算页 | 一屏内看清哪几台报警、服务是否在跑 |
| 例行点检 | 逐台看判级与四轴 | 工作台系统矩阵、逐台页 | 点台号即出该台各系统判级与依据 |
| 异常追因 | 从报警下钻到部件与证据 | 问题页、部件问题页 | 依据展开有部件、链路进度、卡点、证据源 |
| 振动专题 | 看振动判级、谱图、在升与换件闭环 | CMS 服务、工作台 vibration | 六层判读清楚,未闭环时明写「没有成对记录」 |
| 时间窗对比 | 换一个时间窗看判级与性能是否变化 | v2 顶栏时间窗与两个日期输入框 | 图注写「随所选时间窗」;样本量随之变化 |
| 月度汇报 | 出结论与报告 | 汇报纸、CMS 标准模版报告、门户结论段 | 结论带证据级、审级与处置措施 |
| 数据接入 | 放新数据、体检、重算 | 命令行落位与体检脚本、运维控制台 | 冲突被拦下;重算结束出每步 OK 与耗时 |
| 交付与升级 | 打包、开箱验证、装服务、卸载 | pack 与 install 与 uninstall 入口、服务注册器 | 版本检查提示正确;卸载后数据一件不少 |
与角色相关的一条硬需求是「没有产物也要能打开页面」。现场第一次装完、或者在控制台上点了「清除产物」之后,页面必须仍然可访问,并明确说出缺哪一件、怎么补,而不是白屏或掐断连接。这条需求来自两次现场事故:振动服务在无产物时曾因空表拼接抛异常带走进程,工作台在缺件时曾直接返回 500 让人分不清「没放数据」还是「程序坏了」。现在的口径是:缺件时返回结构化缺件页与 err=no_source,页面写清缺件与补齐办法。相关功能需求见 FR-33 与 NFR-06。
功能需求按十二个域组织,编号从 FR-01 到 FR-52,共 154 条。编号是稳定的:新增需求往后排号,不重排已有编号;需求作废时保留编号并标注作废,不改用它。每条需求都给出五项:需求描述、输入、输出、验收判据、依据文件。其中「验收判据」是可判定的条件,「依据文件」指向仓库内的源或文档,便于复核。
表 5-1 功能需求域与编号分配
| 域 | 编号区间 | 条数 | 一句话概括 |
|---|---|---|---|
| 判级与部件问题 | FR-01 至 FR-05 | 5 | 38 台乘九系统判级、四轴随时间窗重算、部件问题与依据 |
| 时间窗与自定义区间 | FR-06 至 FR-08 | 3 | 时间窗词表、自定义起止日期、按时间窗重算的等待契约 |
| 发电性能与可靠性 | FR-09 至 FR-12 | 4 | 七镜头、月度时序、控制参数一致性、损失与功率曲线 |
| 振动与融合面 | FR-13 至 FR-17 | 5 | 摄入、报告、融合判级、在升闭环、三层基线 |
| 停机与台账 | FR-18 至 FR-21 | 4 | 报警、工单、油样、停机与损失 |
| 本体与问答 | FR-22 至 FR-25 | 4 | 知识层、铺开、决策链与趋势、问答与校闸 |
| 报告导出 | FR-26 至 FR-28 | 3 | 标准模版报告、事实契约与派生、门户结论段与汇报纸 |
| 运维控制台与重算 | FR-29 至 FR-32 | 4 | 一条命令重算、控制台、清产物、数据扫描 |
| 门户与检索 | FR-33 至 FR-35 | 3 | 门户装配、页面归口与陈旧检测、检索索引 |
| 数据接入与体检 | FR-36 至 FR-38 | 3 | 落位与体检、场站辨识、同台多件与上游归档 |
| 安装与服务化与卸载 | FR-39 至 FR-43 | 5 | 离线安装、服务化、版本检查、卸载、打包与开箱验证 |
| 多风电场适用性 | FR-44 至 FR-52 | 9 | 场配置化、机组与机型与数据源替换、判据按场标定、跨场口径与换场验收 |
表 5-2 判级与部件问题(FR-01 至 FR-05,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-01 | 给出 38 台机组乘九系统的判级矩阵,逐台逐系统带判级与依据,四轴判级随所选时间窗重算 | scada_10min 与 scada_1min 序列、报警台账、振动报告转录、机型契约 | 工作台系统矩阵、逐台页、问题页;taxonomy.system_matrix 结果 | 判级报警机组数随所选时间窗变化(实测变桨 15 与 13 与 10、偏航 15 与 11 与 5、齿轮箱 7 与 4 与 4);样本不足时如实写不可判 | docs/系统设计说明.md §16.2;src/windscada/taxonomy.py |
| FR-02 | 判级四轴(变桨、偏航、蓄能、温度)随时间窗重算,其中变桨按日粒度精确切片、其余走窄仓重算 | 窄仓 slim10min 公共列子集;pitch 面的日粒度件;1min 桨距角 | 各面 registry(span=) 结果与判级单元格 | 同一台同一系统在不同时间窗下可给出不同判级;温度面的对照基线 ref 与 ref_sm 故意固定并在页面标注 | docs/系统设计说明.md §16.2 与 §16.3;scripts/scada_slim_build.py |
| FR-03 | 部件可靠性表按所选时间窗重算,给出平均无故障间隔(MTBF)、平均停机间隔(MTBO)、单次停机时长(MDT)与停机时长 | 停机事件、报警事件(均为日粒度) | 可靠性表与部件问题页表格 | 停机事件与报警按时间窗精确过滤;三个指标随时间窗变化 | docs/系统设计说明.md §16.2;src/windscada/perf/availability |
| FR-04 | 部件问题下钻:问题页与问题接口按中文系统名取数,服务端做双向归一,认不出时如实报「系统标识无法识别」 | 台号、系统标识(中文名或前端标识或大小写变体)、时间窗 | 问题页、/api/problem 响应 | 传前端标识与中文名都能取到同一份问题;认不出时不写「本时间窗无异常」这类假陈述 | docs/系统设计说明.md §17.2;scripts/windscada_serve.py 的 sys_norm() |
| FR-05 | 需要关注的卡片必须给出完整依据,依据按本行字段自组句,永不为空 | 融合面链盘行、SCADA 关注集合、部件与链路进度 | 卡片依据文本 | 实测曾出现依据空白(WTG09 齿轮箱),现行口径为按部件、链路走到第几步、卡在哪一步、证据源自组句 | docs/系统设计说明.md §17.3;HISTORY 2.9.1 |
时间窗是本版需求里最容易被误解的一块,因此口径要写死两句话:月度件按月取整,日粒度件按日精确;页面上要写明这两句,不让读者以为月度均值能切到天。
表 5-3 时间窗与自定义区间(FR-06 至 FR-08,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-06 | 提供预设时间窗词表:近30日、近90日、2026年、2026H1、2025H2、全程、单月、月区间 | 用户选择 | months_of(win) 与 win_range(win) 结果 | 每种写法都能落到覆盖的月集合与起止日期;近30日在末月只有 1 个节拍时如实按样本不足处理 | docs/系统设计说明.md §16.1 |
| FR-07 | 新增自定义起止日期时间窗,写法为起日期~止日期,含两端;顶栏提供两个日期输入框与「应用」并校验起不晚于止 | 两个日期输入框 | 与区间相交的月集合(月度件)、原样的日区间(日粒度件) | 非法输入被拒绝并给出提示;相交月取整与按日精确两套口径同时生效 | docs/系统设计说明.md §16.1;HISTORY 2.9.0 |
| FR-08 | 按时间窗重算一律「命中进程缓存即回,未命中先回等待状态并由页面轮询」,绝不静默拿旧口径当新时间窗 | 时间窗参数、进程缓存、后台重算线程 | 判级矩阵与七镜头结果、等待与构建中的状态标记 | 判级约 25 秒每个时间窗、镜头约 10 至 45 秒每个时间窗;等待期间页面写明「下面这几张卡还是上一份口径」;选到 2025-07 至 2025-12 时直接用正式产物不重算 | docs/系统设计说明.md §16.4;docs/系统设计说明.md §16.2 |
表 5-4 发电性能与可靠性(FR-09 至 FR-12,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-09 | 发电性能七镜头曲线随所选时间窗重算,曲线图注写明随所选时间窗且样本量随时间窗变化 | 窄仓 10min 子集、风速与功率通道、限电命令 | /api/curves 响应与七张镜头图 | 换时间窗后分箱结果变化,样本量变化;限电前干净判别窗(2025-07 至 2025-12)走正式产物 | docs/系统设计说明.md §16.2;HISTORY 2.9.0 |
| FR-10 | 发电性能七张月度时序图随时间窗过滤 | 月度派生件 | 七张月度时序图 | 图注写「随所选时间窗」;月度件按月取整 | docs/系统设计说明.md §16.2 |
| FR-11 | 控制参数一致性随时间窗重算,输出功率封顶与转速上限等一致性结论 | 窄仓补入的控制参数列(窄仓共 48 列) | 控制参数一致性卡片 | 按时间窗重算约 0.6 秒;功率封顶中位实测由 4,190(干净时间窗)变为 4,181.7(2026年)与 4,177.5(2026Q1) | HISTORY 2.9.0;docs/系统设计说明.md §16.3 |
| FR-12 | 损失、功率曲线与可用率派生件由原始件重算,替换随包件时逐值对拍 | scada_10min 与报警台账 | loss_monthly、powercurve_bins、powercurve_dev、stop_events 等 | 实测损失月表 3,729 行、功率曲线偏差 38 行、功率曲线分箱 912 行与基线逐值一致 | docs/数据目录结构与落位约定_v0.2.md §4 |
振动这一域的写法要特别克制:它是全系统里人工判断成分最多的一段,因此需求必须区分「测量数据的函数」与「需要人工裁定的件」,不能把后者当成自动产物来承诺。
表 5-5 振动与融合面(FR-13 至 FR-17,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-13 | 振动窗索引与谱库摄入:解析厂家导出文件,按振动窗落索引表与谱分片,并登记清单 | windcms 下的解码导出文件(25,693 件) | 振动窗索引表(54 列)、谱分片、谱元数据、摄入清单 | 振动窗 w0316 索引 2,066,686 行、谱 420,742 条与 1,712 分片;重复摄入同名时间窗默认替换并留档旧窗 | docs/系统设计说明.md §13.1;docs/数据目录结构与落位约定_v0.2.md §2b |
| FR-14 | 生成 CMS 标准模版评估报告与逐台页、工作台页,缺融合级时如实写破折号 | 振动窗索引、标量缓存、三层基线 | 报告 md 与 docx、逐台页、总览页、登记 csv | 38 台判级齐全(实测报警 3 台、优秀 35 台);缺融合级列时写破折号而不是编造 | docs/系统设计说明.md §13.1;HISTORY 2.6.0 |
| FR-15 | 融合面判级:由链盘、手交件与模型过闸线生成融合表与融合级,作为报告与判级矩阵的输入 | 振动窗索引、模型过闸线、厂家报告转录 | 融合表、handoff、全场标量 z 值 | 融合表 38 台逐台有裁决;handoff 与手交件同结构且标注由观澜自算 | docs/系统设计说明.md §13.1 与 §13.6 |
| FR-16 | 在升与换件闭环证据:逐振动窗标量算在升判据,给出检出、换件、复测回落的成对记录 | 振动窗索引、融合面链盘 | 部件历史件、趋势证据对象 | 时间窗数不足时如实出空表并写明数据边界;现场提交的数据包里没有成对记录时文案写「暂无端到端闭环证据」 | HISTORY 2.6.0 与 HISTORY 2.9.1 |
| FR-17 | 三层基线:自基线、机群基线与绝对限,用于振动判级的对照 | 振动窗索引标量、健康期分段 | 三层基线件 | 健康期分段中位与正常带按件算;绝对限引用标准限值;样本不足时如实空表 | docs/系统设计说明.md §13.1 |
表 5-6 停机与台账(FR-18 至 FR-21,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-18 | 报警台账摄入,按事件键集合并集去重,归属取最窄源件;源件删改后产物随之变化并大声报出 | 故障报警导出件(16 件) | 报警台账 | 39,211 行稳定;同一事件不重复计数;删一个源件不会让总数虚增 | HISTORY 2.8.0;docs/系统设计说明.md §13.1 |
| FR-19 | 工单台账摄入,按固定模板解析(第三行为列名,数据自第四行起),字符串化口径与随包件一致 | 风机故障记录(137 件,其中台账 123 件) | 工单台账 | 5,876 行;与基线差异逐条可归类 | docs/系统设计说明.md §13.1 |
| FR-20 | 油液化验索引,从文件名抽取台号、部件、日期与样品号,不读正文;采合并语义,认不出的历史行原样保留 | 油样报告(404 件) | 油样索引 | 404 行;2026-07 批 102 行的源件不在现场包内,清空重建会缺这 102 行,如实记账 | docs/系统设计说明.md §7 与 §13.1 |
| FR-21 | 停机事件与停机损失:由报警与运行状态派生停机记录并绑定损失,作为可靠性表的输入 | scada_10min、报警台账 | 停机事件件、损失月表 | 停机事件按台落盘;损失月表与输入跨度对拍通过 | docs/系统设计说明.md §13.1;docs/数据目录结构与落位约定_v0.2.md §4 |
表 5-7 本体与问答(FR-22 至 FR-25,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-22 | 本体知识层:把厂商技术资料(手册、对译表、维护作业指导书、图纸)结构化,每条声明出处 | 主机制造商(OEM)技术资料(318 件 / 2.94 GB) | 对象库、检索索引、实机参数表 | 故障码覆盖 263 与 322;本体审计 0 问题 | docs/系统设计说明.md §13.1 |
| FR-23 | 本体铺开:零判级权,只转录一层正本;同部件多源判级并存不合并;每条判定带审级与证据回溯 | 判级矩阵、融合表、各产物台账 | 对象库对象与判定条目 | 对象库实测规模为 9,613 对象(另见口径差异说明,§11.3);审计退出码 0 | docs/系统设计说明.md §13.1 |
| FR-24 | 决策链进度与趋势证据:每台一个决策对象记六步状态、卡点与下一步;在升与闭环证据挂到机组与部件 | 运行时链盘接口、部件历史件 | 决策对象与趋势证据对象 | 需服务在跑;重复执行幂等覆盖 | docs/系统设计说明.md §13.1 |
| FR-25 | 问答:模型只转述本体与事实契约,不产生新判级;校闸拦不下的句子不出文并给原因;升档目标按「配置档位且确已安装」解析 | 问题文本、本体与契约、本机模型(可选) | 答案与引文块、校闸结论、模型审计日志 | 台号与数字能回抓源记录;两档都拦则不出文并给原因;升档目标没装时响亮回落并打日志 | docs/说明书_观澜…v0.2.md §4.2;HISTORY 2.9.1 |
表 5-8 报告导出(FR-26 至 FR-28)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-26 | 生成 CMS 标准模版评估报告,三轴表述:状态等级、证据状态、行动等级建议;同时出登记表 | 振动窗索引标量、三层基线、融合级 | 报告 md 与 docx、登记 csv | 38 台逐台有条目;报告章节可跳转;相对判据封顶为候选 | docs/系统设计说明.md §13.1;HISTORY 2.6.0 |
| FR-27 | 事实契约:每条结论含结论编号、脱敏来源引用(文件加 sha16 与章节)、本条 sha256、时间窗、聚合层级与裁决枚举;派生四个消费端 | 由重算台账生成的 claim、评审底稿 | 契约件与门户结论段、工作台卡片、问答引用、报告摘要 | 实测改一条 claim 则四个消费端全变;契约自检不过时报退出码 2 并需人看 | docs/系统设计说明.md §13.1 与 §13.2 |
| FR-28 | 门户结论段重装与汇报纸导出:产物变化后门户结论段随重装刷新;工作台可导出汇报纸 | 契约派生件、门户外壳与内嵌件 | 门户单文件页、汇报纸 | 装配先写临时文件再原子替换,失败不破坏在服务的门户;行尾强制 LF;产物挪走时缺该段属预期 | docs/数据目录结构与落位约定_v0.2.md §6;docs/系统设计说明.md §13.2 |
表 5-9 运维控制台与重算(FR-29 至 FR-32)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-29 | 一条命令重算全部:固定依赖顺序、写死验收锚点、幂等可整条重跑;默认 26 步,加跳过 SCADA 为 23 步 | data/raw 原始件、可选现场包目录 | 各仓产物、每步退出码与耗时汇总 | 实跑 --dry-run 得默认 26 步、跳过 SCADA 23 步;某步失败即停并打印该步说明;各步幂等 | scripts/rebuild_all.py;docs/src/_rebuild_plan.txt |
| FR-30 | 运维控制台:按钮按真实状态启用,一个时刻只允许一个动作,越权调用返回 409;显示端口、产物件数与来源台账、进度、退出码与日志尾巴 | 服务状态、产物状态、任务状态 | 控制台页面与动作接口 | 组件都在跑时点启动返回 409;有任务在跑时全按钮灰;停组件服务保留控制台 | docs/重算操作手册_v0.1.md §0b |
| FR-31 | 清除产物为直接删除不留备份,且不动原始件与交付层;运行期一律不从交付包补齐缺件 | 用户确认动作 | 产物清空后的状态与缺件说明 | 清除后再点返回 409;页面显示无产物并给出补件办法;补齐入口定位为离线人工补救 | docs/说明书_观澜…v0.2.md §4.1;docs/系统设计说明.md §13.5 |
| FR-32 | 输入数据自动扫描:逐族指纹发现新增与变化,列出该跑哪几步并记基线;支持自动取消跳过与可选看门狗 | data/raw 递归文件树、族表 | 扫描结论与基线快照、看门狗日志 | 退出码 0 表示无变化、4 表示有新数据(不是失败)、5 表示还没有基线;族表外的目录报未归类且不猜 | docs/输入数据放置指导_v0.1.md §4;HISTORY 2.8.0 |
表 5-10 门户与检索(FR-33 至 FR-35)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-33 | 门户为单文件装配产物,壳与件分离;顶部菜单含总览、系统架构、方法、经验发现、案例、振动与 CMS、仿真与回放、交付文档、系统状态、数据重算、登录 | 受管外壳、内嵌交付件、契约派生件 | 门户单文件页 | 拆装回到逐字节相同;行尾 LF 有自检;数据重算页用内嵌版懒加载避免空转轮询 | docs/系统设计说明.md §5.2;docs/数据目录结构与落位约定_v0.2.md §6 |
| FR-34 | 页面归口:登记每一页与子页的内容类型、是否随输入数据变、凭什么这么判;对数据派生页面做陈旧检测 | 页面登记表、产物台账、页面实物 | 归口表与审计结论 | 实跑检查 21 项、不一致 0、已知缺口 19;陈旧检测报退出码 7;未登记页单独列出 | configs/portal_pages.yaml;scripts/pages_audit.py |
| FR-35 | 检索索引:由本体与知识层构建检索索引,词法检索在任何机器上可用,向量检索在装有嵌入模型时启用 | 对象库、CMS 知识库、嵌入模型(可选) | 检索索引件 | 无模型时保持纯词法可用并写明;索引缺失时页面如实说明而不是报错 | docs/数据目录结构与落位约定_v0.2.md §4;docs/系统设计说明.md §13.1 |
表 5-11 数据接入与体检(FR-36 至 FR-38,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-36 | 现场包按映射表落位,落位前自动体检:结构、命名、后缀与增量三清单(新增、相同跳过、冲突) | 现场包目录、约定目录树 | 落位结果与体检结论 | 同名不同大小判为冲突并默认拒绝落位;覆盖需显式确认;同尺寸自动跳过可反复跑 | docs/输入数据放置指导_v0.1.md §2 与 §3 |
| FR-37 | 场站扫描辨识:按四条规则辨识 data/raw 下的场站目录,多目录且都不匹配时报未识别并列出扫到的目录 | data/raw 下一级目录、场配置 | 辨识结论与依据 | 依据逐条打印;单站唯一性也要标注为凭唯一性而不是精确匹配;不猜 | docs/数据目录结构与落位约定_v0.2.md §2 |
| FR-38 | 同台多件的 10min 件合并与上游归档口径:同台补充件按列名对齐并按时间戳去重(主件优先);类目库按信息级列出且不计变化 | 同台补充件、现场年度归档库、类目库 | 合并后的取数结果与扫描结论 | 实测 WTG01 主件 77,551 行加补充件 5,820 行合并 83,353 行、重叠 18 行去重;类目库不再造成每轮误报变化 | HISTORY 2.8.0 与 HISTORY 2.8.2;docs/输入数据放置指导_v0.1.md §4.1 |
表 5-12 安装与服务化与卸载(FR-39 至 FR-43,样本场实测(2026-09-22))
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-39 | 离线安装:Windows 侧包内带全部离线依赖轮子可完全离线安装;无合格解释器时用包内便携运行时;安装目录不得含空格与中文 | 交付包、机器上的解释器与架构 | 虚拟环境与配置、安装记录 | 实装实测约 10 分钟量级(本机记录 172 秒);麒麟与统信与 Ubuntu 与 CentOS 走对应脚本 | docs/说明书_观澜…v0.2.md §3;README_先读我.MD 第一节 |
| FR-40 | 服务化常驻:Windows 服务或 systemd 单元或登录自启三种形态,两平台共用同一工作体,行为与手工启动一致 | 服务注册器、服务体脚本、服务配置 | 托管进程与开机自启 | 巡检周期 15 秒;无权限时给出可执行建议并返回退出码 3 而不是抛异常 | docs/系统设计说明.md §14.1 与 §14.3 |
| FR-41 | 安装时版本检查:读安装记录与本包版本比对,分没装过、相同、升级、降级、老安装无记录五类提示并询问是否重装 | install-info.json、本包版本 | 提示与交互、更新的安装记录 | 五类提示文案与动作与规则一致;跳过询问的开关可用;非交互时自动继续并打印说明 | docs/系统设计说明.md §14.2 |
| FR-42 | 卸载闭环:默认只拆本程序装上去的东西(停服务、注销服务、撤自启、删快捷方式、清运行态、删安装记录),默认保留数据、产物、日志、虚拟环境与程序目录 | 卸载入口与实现脚本 | 卸载结果与手工收尾命令 | 自检两类断言:步骤齐全、只读预演无副作用;实跑断言记录与运行态与快捷方式都被拆掉且数据与产物一件不少 | docs/系统设计说明.md §14.5 |
| FR-43 | 打包与开箱验证:一条命令出包,默认不含输入数据、产物、运行日志与临时文件;打包器自带入口引用闭合与编码守则两道闸;开箱验证解压后真装真起 | 源码树、版本真源 | 交付包与清单文件、开箱验证结论 | 入口引用闭合实跑 48 条全在位;包内出现安装记录或快捷方式即删包并非零退出;页面可用数要求不少于 4 个 | docs/系统设计说明.md §9 与 §9.1 |
非功能需求编号 NFR-01 至 NFR-12,共 154 条。它们大多是「性质」而不是「功能」:判据往往是一次实跑的输出,或者一条机器守卫的退出码。
表 6-1 非功能需求(NFR-01 至 NFR-06,样本场实测(2026-09-22))
| 编号 | 需求 | 判据 | 依据文件 |
|---|---|---|---|
| NFR-01 | 离线性:全部计算与页面在本机完成,不依赖外网;本机模型为可选件,缺它时只有问答与本地初筛不可用 | 组件只绑回环地址;模型服务不可达时探针报失败但其余功能不受影响;远端未装模型时如实记录为遗留项 | docs/说明书_观澜…v0.2.md §3.3 与 §4.2;HISTORY 2.9.2 |
| NFR-02 | 单机性能:一条命令重算在单机上可完成,按时间窗重算的单次等待可控 | 实测量级见 6.2;判级约 25 秒每个时间窗、镜头约 10 至 45 秒每个时间窗;模型探针实测 0.77 秒 | docs/系统设计说明.md §16.4;F:\temp_req_check_out2.txt |
| NFR-03 | 可移植与零配置:路径只有一个真源,全部按安装根解析而不按当前工作目录;跨 Windows 与国产化 Linux | 路径助手清单与解析基准;便携运行时覆盖三平台;跨平台部署三条硬约定由脚本门禁 | docs/系统设计说明.md §3.1;docs/数据目录结构与落位约定_v0.2.md §7 |
| NFR-04 | 中文与描述口径:界面文案前后端成对,三条描述口径机器可查 | 语言包实跑 845 条成对;口径清扫覆盖时间窗写法、机组计量说法、英文简写三类 | F:\temp_req_check_out2.txt;docs/系统设计说明.md §17.1 |
| NFR-05 | 审计与可追溯:每件产物能说清谁生成、谁消费、来源是原始件重算还是随包补齐 | 逐件来源台账;反向呼应审计成立 3,548 件、不成立 0 件、未归类 0 件;契约每条带自身 sha256 | F:\temp_req_check_out2.txt;docs/系统设计说明.md §13.4 |
| NFR-06 | 可用性:没有产物也要能打开页面并说清缺件与补齐办法 | 清产物后工作台与振动页返回结构化缺件说明而不是白屏或掐断;无源件时返回 err=no_source | docs/系统设计说明.md §11.4;docs/数据目录结构与落位约定_v0.2.md §5 |
表 6-2 非功能需求(NFR-07 至 NFR-12,样本场实测(2026-09-22))
| 编号 | 需求 | 判据 | 依据文件 |
|---|---|---|---|
| NFR-07 | 可观测性:日志只有一个落点与统一行格式,服务状态与任务进度可见 | 日志实跑无不一致、提示 87 条;网关提供健康自检与版本指纹;控制台显示退出码与日志尾巴并有心跳 | F:\temp_req_check_out2.txt;docs/系统设计说明.md §11.2;docs/重算操作手册_v0.1.md §0b |
| NFR-08 | 数据体量:能在单机上承载本场当前的数据规模并给出资源下限 | 输入实测 26,504 件 / 224.67 GB、产物 3,549 件 / 7,157.5 MB;内存建议 16 GB 起、32 GB 更稳;磁盘 5 GB 加三维资产 1 GB、模型另计 30 至 60 GB | 2026-09-22 实测计数;docs/说明书_观澜…v0.2.md §2 |
| NFR-09 | 安全只读:不写回现场系统、不改原始件、不产生控制指令;对外暴露时须自行在网侧限来源 | 原始件按只读输入对待,落位冲突默认拒绝;对外只有一个网关入口;启动日志每次提醒页面无鉴权 | docs/输入数据放置指导_v0.1.md §3;README_先读我.MD 第二节 |
| NFR-10 | 可维护性:单一真源,改一处不必改多处;关键口径有机器守卫 | 版本号只有一行真源并由三处守卫盯住;路径、配置、日志、语言各有唯一取用口与审计器 | docs/系统设计说明.md §15.2 与 §11.1;docs/系统设计说明.md §3.1 |
| NFR-11 | 无人值守与自愈:长跑的服务要能被托管并自动拉起 | 服务体每 15 秒巡检并拉起掉线组件;崩溃重启策略;远程部署一律用服务,不用会话前台进程 | docs/系统设计说明.md §14.1 与 §14.4;README_先读我.MD 第二节 |
| NFR-12 | 收资清单按场裁剪:以通用收资模板为底,按本场的机型与数据源形态与专题范围裁剪,逐条写明必须、建议、可选或可替代以及「不收会怎样」 | 每一族都有必须性分级与缺件后果且可复核;换场时清单随场定义与机型变化,不是照抄样本场 | 本文第 11 章;《数据要求说明_观澜_2.84.1.docx》第 8 章与第 12 章 |
性能需求不能只写「要快」,要写「在哪台机器上、什么规模、花了多久」。下表把已取证的耗时集中列出,未取证的项如实标注。
表 6-3 耗时实测汇总(来源见「证据」列;未标日期者为 HISTORY 或文档中的既有记录,样本场实测(2026-09-22))
| 环节 | 耗时 | 证据 |
|---|---|---|
| 自检整体与模型探针 | 模型探针 0.77 秒;同一次 check 结论为全绿 | guanlan.py check 实跑(2026-09-22,本机) |
| 一行命令重算(远端一轮 24 个实质步骤汇总) | 单步量级:输入扫描 53.7 秒、三门台账 164 秒、SCADA 侧 1,025 秒、月度派生 99 秒、振动摄入 2,118 秒、变桨面 385 秒、在升 41.6 秒、基线 15.3 秒、总览页 78 秒、本体审计 7.1 秒、门户重装 3 秒、页面归口 9.5 秒 | HISTORY 2.8.1(远端复核记录) |
| 窄仓全量扫(按时间窗重算的底座) | 约 2 分钟一次全量 | docs/系统设计说明.md §16.3 |
| 判级矩阵按时间窗重算 | 约 25 秒每个时间窗 | docs/系统设计说明.md §16.4 |
| 七镜头曲线按时间窗重算 | 约 10 至 45 秒每个时间窗 | docs/系统设计说明.md §16.4 |
| 控制参数一致性按时间窗重算 | 约 0.6 秒每个时间窗 | HISTORY 2.9.0 |
| SCADA 侧十个构建器(逐台读 10min) | 约 15 分钟 | scripts/rebuild_all.py 步说明 |
| 振动摄入(索引与谱) | 约 14 分钟;153 GB 量级导出约 25 分钟 | docs/系统设计说明.md §13.2;docs/输入数据放置指导_v0.1.md §4.1 |
| 启动到门户就绪 | 约 7 秒内健康自检就绪;批处理入口约 2.3 秒返回 | docs/系统设计说明.md §4.2 |
| 安装(Windows 离线) | 约 10 分钟量级;本机记录 172 秒 | docs/说明书_观澜…v0.2.md §3.1;docs/系统设计说明.md §4.2 |
| 本机问答 | 显存不足时首答 30 至 60 秒;复杂题在升档下 5 至 15 分钟 | docs/说明书_观澜…v0.2.md §2 与 §11 |
「零配置」在本系统里有一个明确的技术含义:路径只有一个真源,且解析基准是安装根而不是当前工作目录。这条需求来自一串真实缺陷:写死场站名的路径在多场部署时会静默串场;按当前目录解析的相对路径在从别处启动时会读不到;同一个规则在三个文件里各写一遍就会出现两套显示口径。现在的口径是:代码与配置里只写相对路径,运行期由路径助手解析成绝对路径;产物只落在产物仓,原始件只从原始件目录读,交付静态层只为分发而存在;三者不互相写。
与可移植相关的还有两条:一是解释器探测顺序(先看配置里指定的解释器,再看安装目录下的虚拟环境,最后回落到当前解释器),这让安装目录整体拷到别的盘或别的机器后仍然可用;二是输入输出脚本的字符守则(安装脚本用带 BOM 的 UTF-8 加 CRLF、批处理纯 ASCII 且 CRLF 无 BOM、shell 脚本 LF),三条都是现场真实事故换来的,并由打包、开箱验证与装机自检三处强制执行。
单一真源的范围在本版已经覆盖五项:版本号、路径、配置、日志、界面文案。每一项都配了「改一处、机器替你查其余几处」的守卫,例如版本号改动后由版本记录一致性门与打包器读真源保证同步,配置改动由配置审计器检查目录约定、命名、内容与引用闭合,日志改动由日志审计器检查唯一落点与行格式,界面文案改动由语言包检查保证前后端成对。
表 6-4 单一真源与对应守卫(样本场实测(2026-09-22))
| 真源 | 管什么 | 守卫与实跑结果 |
|---|---|---|
| src/version.py | 名称、版本、版本规则、版本史、包名 | 版本记录一致性检查;check 实跑报 v2.84.1 且记录表与代码一致 |
| src/paths.py | 一切路径解析的基准与助手 | 配置审计器检查不手拼路径;实跑无不一致 |
| configs 目录与登记表 | 端口、模型档、场配置、页面归口、配置登记 | 配置审计实跑已知缺口与白名单 14 条、提示 7 条 |
| src/logfile.py | 日志目录、命名、行格式、保留策略 | 日志审计实跑无不一致、提示 87 条 |
| src/windscada/lang.py | 中英界面文案成对 | 语言包实跑 845 条成对 |
| src/entry_refs.py | 入口脚本引用的文件必须都在包里 | check 实跑入口引用闭合 48 条全在位;编码守则通过 |
系统的数据需求可以概括成一句话:七类现场源件加一类共享机理资料,喂出九个产物仓,页面只读产物。每个源类目录名就是摄入接口,改名等于换接口。数据族与功能的对应关系如下表;逐类的字段、单位、必须性与质量要求见同批交付的《数据要求说明_观澜_2.84.1.docx》。
表 7-1 数据族到功能的映射(样本场实测(2026-09-22))
| 源族(约定落位) | 谁消费 | 喂出什么功能 | 进链步骤 | 现状 |
|---|---|---|---|---|
| 故障报警 | 报警摄入器 | 报警台账、停机损失、限电绑定 | ② 三门台账 | 16 件 / 23.8 MB,结构合规 |
| 风机故障记录 | 工单摄入器 | 检修工单台账、重复检修、闭环验证 | ② 三门台账 | 137 件 / 149.8 MB,其中台账 123 件、附件 14 件 |
| 油样报告 | 油样索引摄入器 | 油液化验索引、油液时效、融合面油样轴 | ② 三门台账 | 404 件 / 176.2 MB,两级目录合规 |
| scada_10min | 取数层与十个构建器 | 功率曲线、损失、温度、停机、偏航、液压、热链、变桨面日粒度 | ③ 与 ④ 与 ④c 与 ⑤b | 114 件 / 16.75 GB,含同台补充件 |
| scada_1min | 取数层 | 变桨面零位三口径与越线计数 | ④c 变桨面 | 38 件 / 13.71 GB |
| scada_mdb | 取数层(CSV 缺失时回落) | 同上(年度归档库) | ③ 与 ④ 与 ④c | 100 件 / 48.25 GB,其中消费 76 件、缺口 24 件 |
| windcms | 振动摄入与报告转录 | 振动窗索引、谱库、CMS 报告、逐台页、在升闭环、三层基线 | ④b 与 ④d 与 ④e | 25,693 件 / 161.22 GB,其中解码导出 25,679 件 |
| m5_cms_tcm | 融合面与报告侧 | 现场正本优先的 handoff 与部件历史、厂家报告转录 | ④b 振动摄入 | 1 件 / 21.8 MB;正本缺失时由观澜自算件顶上 |
| 主机制造商(OEM)技术资料(与场站并列的共享目录) | 本体层 | 码表、手册、工单展开、失效树、实机参数、检索索引 | ⑦ 本体层 | 318 件 / 2.94 GB,结构合规 |
表 7-2 数据与产物现状(源族数字取自 2026-09-21 的扫描快照,合计取自 2026-09-22 实测计数,样本场实测(2026-09-22))
| 项 | 数量 | 体积 | 备注 |
|---|---|---|---|
| 输入源件(data/raw/<场站>,递归) | 26,504 件 | 224.67 GB | 同一棵树在 guanlan.py check 里报 26,503 件,两者相差 1 件,计数口径差异未取证 |
| 产物(outputs/<场>,递归) | 3,549 件 | 7,157.5 MB | 含仓级台账 3 件;反向呼应审计报成立 3,548 件 |
| 其中振动窗与谱仓 | 3,417 件 | 占比最大 | 谱分片与窗级分析件 |
| 其中标准仓 | 57 件 | — | 含窄仓子目录与总览单页 |
| 未归类件 | 1 件 | — | 场站目录下的一份按月提取核对件,按设计不作为摄入源 |
| 缺口 | 24 项 | — | 年度归档库中 7 月的十个类目库,扫描器按缺口级列出并写明消费者口径 |
数据现状里有两处必须如实说明。第一处是缺口:年度归档库 2026 年 7 月有 10 个类目库不在位(每类一件,扫描器按缺口级列出并提供消费者口径),另外类目库本身是上游归档件,取数层不直接读它,需要先合成为同台补充件才会被摄入。第二处是按月提取核对件:场站目录下有一份按月提取的核对件,位置由用户指定、不是摄入源,扫描器按名字模式忽略,既不报未归类也不计入变化。
本文只回答「要哪些数据、这些数据支撑什么功能」。数据的字段级要求(核心测点的名称、单位、必须性、缺失替代、对齐规则、质量门与核对锚点)以及面向现场的收资清单,写在《数据要求说明_观澜_2.84.1.docx》里。该文档按用户令要求与现场收资文件逐条对照,并对现场收资层面的已知缺失逐条如实记录,例如测风塔数据为零交付、故障录波只有 4 台、振动侧 handoff 正本缺失由观澜自算件顶上、远端机器未安装本机模型等。
页面归口要回答两个问题:这一页该不该随输入数据变化;它算不算产物。答案落在五类内容类型上,每一类都有机器可查的规则,登记表里逐条写明判定依据(看的是页面里有没有内嵌数据、有没有实时取数、有没有产物引用,以及内容是不是由原始件算出来的)。要改分类,先改证据,这是需求层面的一条纪律。
表 8-1 五类页面内容类型与机器规则
| 类型 | 该随数据变 | 算不算产物 | 机器查什么 |
|---|---|---|---|
| 受管静态 | 否 | 不是 | 正文不得引用产物,引用了说明分类错了 |
| 实时取数 | 是,永远一致 | 页面本体不是 | 内嵌或链接的端口必须在已知服务表里 |
| 产物引用脚注 | 否,正文不变 | 正文不是,被引产物是 | 被引用的产物路径必须存在,悬空即报 |
| 数据派生 | 是 | 是 | 必须有来源加指纹或生成时间;有指纹就与当前产物比对做陈旧检测 |
| 冻结交付件 | 否,按交付版本变 | 不是运行时产物 | 文件名或正文必须能读到版本号与日期 |
表 8-2 按登记表逐条列出页面与子页的归口结论。登记表顶层条目 25 条,含 7 条子页共 154 条;归口审计实跑输出为「检查 21 项:不一致 0、已知缺口 19」,其中 21 项是审计的检查行数(19 条为引用悬空或溯源缺失的已知缺口项,2 条为两个数据派生页面的溯源检查项,均一致),与登记表的条目数不是同一个口径,两者都不矛盾,此处一并写明以免混淆。
表 8-2 门户页面与子页归口表(25 条顶层条目加 7 条子页,样本场实测(2026-09-22))
| 页面或子页 | 类型 | 随输入数据变 | 判定依据摘要 |
|---|---|---|---|
| index 总览 | 受管静态 | 否 | 外壳段约 2,519 字节,无内嵌与取数与产物引用,正文是产品承诺与入口导航 |
| architecture 系统架构 | 受管静态 | 否 | 外壳段约 3,037 字节,无数据引用,描述分层架构 |
| method 方法 | 受管静态 | 否 | 外壳段约 2,959 字节,无数据引用 |
| findings 经验发现 | 受管静态 | 否 | 外壳段约 2,322 字节,内容是公司级经验与内部检查条数,不是本场站数据的函数 |
| case_hydraulic 案例与液压 | 受管静态 | 否 | 外壳段约 6,187 字节,无数据引用 |
| cms 振动与 CMS | 实时取数 | 是 | 一个内嵌加两个链接指向振动服务,服务按需读产物,页面本身不存快照 |
| recalc 数据重算 | 实时取数 | 是 | 链接到运维控制台,后端即真实状态 |
| login 登录 | 实时取数 | 是 | 链接到工作台 |
| admin 系统状态 | 实时取数 | 是 | 外壳脚本拉健康自检接口渲染,段内无静态数字 |
| sim 仿真与回放 | 受管静态 | 否 | 外壳段约 50,767 字节为静态叙述,六个链接指向仿真台与三维台;输入是图纸与机型参数 |
| 子页 控制律仿真台资料包(5 页) | 冻结交付件 | 否 | 仿真合页服务直接从冻结资料包读取,日期在包名里 |
| 子页 三维拆装工作台 | 受管静态 | 否 | 三维资产由图纸与模型构建,与原始件无关 |
| 子页 控制律仪表台面板(门户内嵌) | 产物引用脚注 | 否 | 静态判据说明加一条产物脚注引用,被引目录不在包内,已按悬空如实记账 |
| 子页 四系统判据面板(门户内嵌 4 份) | 产物引用脚注 | 否 | 同上,静态正文加产物脚注 |
| documents 交付文档 | 受管静态 | 否 | 外壳段约 5,690 字节为导航页,一个内嵌指向网关下发的治理清单页,段内不含数据快照 |
| 子页 治理清单交付包 | 冻结交付件 | 否 | 文件名自带版本号与日期,客户交付件按交付版本冻结 |
| 子页 全场状态一览(脱敏) | 冻结交付件 | 否 | 性质是数据派生但无指纹无生成端,按用户裁决按冻结交付件管并把会变旧的风险如实记账 |
| 子页 场站取数单 | 冻结交付件 | 否 | 只有日期没有指纹,无生成端,且它引用的两棵产物树不在包内;保留不删并记账 |
| page_product_cms CMS 报告页与件 | 数据派生 | 是 | 振动服务读的就是产物页面件;已在产物台账中登记并有溯源 |
| page_product_vib_raw_manifest 振动摄入清单 | 数据派生 | 是 | 每次振动摄入重写,记件数、跨度与未随包缺口;已在台账中登记 |
| embed_replay_chain 传动链回放(内嵌) | 数据派生 | 是 | 内嵌数据带来源与指纹,源产物在本包不在位,故现只能按生成时间判新旧 |
| embed_standard_panel 标准面板(内嵌) | 数据派生 | 是 | 正文带生成时间与产物引用,缺指纹;被引的发布件不在包内 |
| embed_coverage_ch0 覆盖度报告(内嵌) | 数据派生 | 是 | 正文写有来源与指纹,但那份源件不在包内,溯源链断在包外 |
| embed_u6_sim 变桨液压仿真台(内嵌) | 受管静态 | 否 | 图纸派生的物理回路仿真面板,无内嵌数据与指纹 |
| embed_u6_health 液压公共站健康报告(内嵌) | 冻结交付件 | 否 | 客户交付报告,无数据指纹,按交付件冻结 |
| embed_gearbox_report 整机综合诊断报告(内嵌) | 冻结交付件 | 否 | 报告类交付件,文件名带修订版号 |
| embed_reports_4 分系统评估报告(内嵌 4 份) | 冻结交付件 | 否 | 交付报告,无内嵌数据与指纹 |
| embed_governance_12 治理清单分册(内嵌 12 份) | 冻结交付件 | 否 | 与交付层分册同源,冻结交付件 |
| embed_sc1_local 本地占位(内嵌) | 受管静态 | 否 | 小体积占位面板 |
| detail_tabs 工作台十个标签 | 实时取数 | 是 | 单页应用按标签现场取数,产物指纹变化自动重载,页面本体不存快照 |
| delivery_pages_all 交付页 | 冻结交付件 | 否 | 客户交付件自带版本号与日期;其中两页性质上是数据派生,另见逐页判定 |
| viewer_pages_all 三维页 | 受管静态 | 否 | 图纸与模型派生的资产页,与原始件无关 |
按类型统计的分布如图 3-1 所示。本表口径下 32 条条目中,受管静态 11 条、实时取数 5 条、数据派生 5 条、冻结交付件 9 条、产物引用脚注 2 条。这张统计的意义在于:真正需要随输入数据变的只有 5 条数据派生条目与 5 条实时取数条目,其余 22 条要么是受管正文、要么是按版本冻结的交付件,把它们混进「产物管理」只会制造无谓的维护负担。
数据派生页面的核心风险是「数据换了页面没换」,也就是页面里烘进去的快照与当前产物不一致。需求因此要求三件事:一是每条数据派生条目必须有来源路径,并且有指纹或生成时间;二是有指纹的必须与当前产物比对(逐字节比对哈希),不一致即报陈旧;三是登记表里写清「为什么这么判」,可复核。检查器的退出码语义为:0 表示一致,5 表示缺文件或未登记,6 表示溯源缺失,7 表示页面陈旧,8 表示交付件缺版本号,9 表示分类错。
当前如实状态是:登记表里 19 条已知缺口全部是「页面引用了本包没有的产物树」,逐条写明理由而不装作通过;这些页面因此拿不到当前值做比对,其中两条数据派生页面没有生成端、三条内嵌快照缺指纹只能按生成时间判断。这三类都记账在案,待相应产物线随包后复检。
系统的验收分两层:装机自检看「这台机器能不能用」,重算链验收看「这一轮数据算得对不对」。前者是 guanlan.py check 的四十余条判定行,后者是重建命令每一环的退出码与容忍口径。两层的关系是:自检不通过就不该跑重算(环境或依赖有问题),重算链跑完再由自检复核产物与台账。
表 9-1 验收门分类与数量(依据 guanlan.py check 实跑输出,2026-09-22,本机,样本场实测(2026-09-22))
| 分类 | 判定条数 | 代表门 | 实跑结果 |
|---|---|---|---|
| 运行环境与依赖 | 10 | Python 版本不低于 3.11(实测 3.12.10);九个第三方依赖逐个导入 | 全 OK |
| 静态质量门 | 4 | 源码可编译 229 个文件;语言包 845 条成对;入口引用闭合 48 条;入口脚本编码守则 | 全 OK |
| 子进程口径 | 3 | 捕获输出可用;无窗口启动输出进日志;无窗口位已设,标志位 0x8000200 | 全 OK |
| 版本与卸载入口 | 2 | 版本管理与记录表一致(v2.84.1,包名 app_guanlang_v2.84.1.zip);卸载入口两个都在位 | 全 OK |
| 制品与台账审计 | 5 | 反向呼应 3,548 件成立;页面归口检查 21 项;配置统一;日志统一;输入数据放置体检 26,503 件结构合规 | 全 OK |
| 产物与发布件在位 | 10 | 标准仓、本体对象库、findings、事实契约、门户、仿真合页服务与资料包、三维资产、仿真回放资产、治理清单交付件 | 全 OK |
| 原始件目录 | 1 | 原始件目录存在(无数据时此项不影响页面) | 全 OK |
| 模型闸 | 6 | 默认档探针 0.77 秒;四个模型档逐个在位;模型可用性正常并记录审计日志 | 全 OK |
| 合计 | 41 | 另有 6 条端口状态行不计入判定 | 结论全绿,可 serve,退出码 0 |
验收门的分类与数量如图 7-1 所示。该图与上表同源,都取自本次自检实跑的 41 条判定行;按上表的分类口径,环境与依赖一类共 154 条、静态质量门 4 条、子进程口径 3 条、版本与卸载入口 2 条、制品与台账审计 5 条、产物与发布件在位 10 条、原始件目录 1 条、模型闸 6 条。其中真正体现「这个系统有没有把口径管住」的是制品与台账审计那五条门与四条静态质量门。
重算链默认 26 步,加跳过 SCADA 为 23 步(另有第 ① 步仅在给了现场包目录时才跑)。每一步都是一个验收门:非零退出即停下并打印该步说明,容忍清单里的退出码不算失败,但会在汇总行里如实标出退出码。这个设计的关键在于「容忍不等于通过」:例如月度派生件找不到基线时返回 5,含义是「跳过了等价验收」,而不是「验收通过」。
表 9-2 重算链逐步验收门(默认 26 步,样本场实测(2026-09-22))
| 序 | 步骤 | 主要脚本或命令 | 容忍退出码 | 非零的含义 |
|---|---|---|---|---|
| 1 | ① 放数据(仅当给了现场包目录) | place_raw_data.py | 无 | 落位失败或冲突被拦下 |
| 2 | ①b 输入数据扫描 | raw_scan.py --check --write | 4 与 5 | 4 表示有新数据(不是失败),5 表示还没有快照 |
| 3 | ② 三门台账 | rebuild_from_raw.py | 无 | 报警或工单或油样摄入失败 |
| 4 | ③ SCADA 侧十个构建器 | rebuild_from_raw.py --scada | 无 | 原始件缺失或读取失败 |
| 5 | ③b 标准仓窄仓 | scada_slim_build.py | 无 | 按时间窗重算的底座没建起来 |
| 6 | ④ 月度派生件 | windscada_monthly_build.py | 5 | 找不到随包基线,跳过等价验收 |
| 7 | ④b 振动摄入与报告与标量 | vib_raw_build.py | 无 | 解析出错;没有振动原始件时空跑属正常 |
| 8 | ④c 变桨面 | pitch_face_build.py | 4 | 找不到 SCADA 原始件,按缺件如实报 |
| 9 | ④d 振动在升与换件闭环 | component_history_build.py | 4 | 本机没有振动窗索引,按缺件如实报 |
| 10 | ④e 三层基线 | baseline_38_build.py | 4 | 同上 |
| 11 | ⑤b 由重算台账生成 claim | sop_findings_from_ledger.py | 无 | 台账不足以生成结论 |
| 12 | ⑤c 事实契约构建与渲染 | guanlan_facts_contract.py build | 2 | 契约自检不过,需要人看 |
| 13 | ⑤a 逐件来源台账 | products_restore_missing.py --refresh | 无 | 账实不符 |
| 14 | ⑤ 反向呼应审计 | products_reverse_audit.py --check | 5 | 有未归类件或判据失败,停下看清单 |
| 15 | ⑥ 重启组件服务(停,保留网关) | _ops_stop_keep_gateway.py | 无 | 停服务失败 |
| 16 | ⑥ 重启组件服务(起) | guanlan.py serve | 1 | 有模块未就绪属降级正常状态 |
| 17 | ⑦ 本体码表与手册与文档 | kb_ingest | 无 | 技术资料缺失会降级并打印提示 |
| 18 | ⑦ 本体铺开判级与台账 | populate | 无 | 一层正本缺失或来源不足 |
| 19 | ⑦ 本体决策链进度 | chain_ingest | 无 | 服务未在跑则取不到链盘 |
| 20 | ⑦ 本体在升与闭环证据 | trend_ingest | 无 | 源缺失 |
| 21 | ⑦ 本体检索索引 | retrieval.build | 无 | 索引构建失败 |
| 22 | ⑦ 本体实机参数表 | maintenance.refresh_params | 无 | 参数源缺失 |
| 23 | ⑦b 全场状态总览页 | windscada_overview_build.py | 无 | 缺产物时响亮报错,不产出半张页 |
| 24 | ⑧ 本体审计 | ontology.audit | 无 | 期望 0 问题 |
| 25 | ⑧b 重装门户 | portal_build.py | 1 | 缺契约产物时属预期,门户保留原样 |
| 26 | ⑧c 页面归口审计 | pages_audit.py --check | 5 与 6 与 7 | 7 表示有页面陈旧;5 表示被引产物不在位;6 表示溯源缺失 |
| 27 | ⑧d 版本记录一致性 | version_log.py --check | 6 | 文档与版本真源不一致,需同步文档 |
| 28 | ⑧ 台账等价验收(仅加开关时) | rebuild_from_raw.py --verify | 4 与 5 | 4 表示有需人工看的差异;5 表示没基线即没做验收 |
关于步数需要两点说明以免误读。第一,表中共列出 28 条命令行,其中第 1 步(放数据)仅在给了现场包目录时才执行,最后一步(台账等价验收)仅在加了对应开关时才执行,因此默认计划的实跑步数是 26 步,加跳过 SCADA 选项后是 23 步。第二,「门」与「步」不是一一对应:第 ⑥ 步拆成停与起两条命令各算一步,第 ⑦ 步拆成六条命令各算一步,所以表里的命令行数多于环节数。
表 9-3 主要检查器的退出码语义与容忍口径
| 检查器 | 退出码语义 | 链上容忍 |
|---|---|---|
| guanlan.py check | 0 全绿可启动;2 有失败项 | 不作为链上步骤,装机后人工核 |
| rebuild_all.py | 0 全部完成;1 有步骤失败(失败即停) | 汇总行逐条标 OK 或 OK 带退出码或 FAIL |
| pages_audit.py | 0 一致;5 缺文件或未登记;6 溯源缺失;7 页面陈旧;8 交付件缺版本;9 分类错 | 容忍 5 与 6 与 7 |
| products_reverse_audit.py | 0 全部有来路;5 有未归类件或判据失败 | 容忍 5 |
| version_log.py | 0 与版本真源一致;6 记录表需重生成 | 容忍 6 |
| config_audit.py | 0 无不一致;8 存在旧副本等结构问题 | 未进链,由 check 报 |
| raw_scan.py | 0 无变化;4 有新增或变化(不是失败);5 还没有基线 | 容忍 4 与 5 |
| raw_data_check.py | 0 合规;5 结构或命名违例;6 增量冲突;7 缺源类或时间空洞;8 仅有提示 | 未进链,由 check 报 |
| rebuild_from_raw.py --verify | 0 逐值一致;4 有需人工看的差异;5 找不到基线即没做验收 | 容忍 4 与 5 |
| ontology.audit | 0 无问题 | 不容忍 |
| service_ctl.py | 0 成功;3 权限不足(给出可执行建议) | 未进链,人工执行 |
交付质量有两条独立的核验路径:打包后的开箱验证(在临时副本上真解压、真安装、真起服务、真核页面)与卸载核验(在刚装好的副本上真跑卸载并断言拆除范围与保留范围)。两条路径的意义是:它们都作用在副本上,不打扰正在运行的实例。
表 9-4 开箱验证与卸载核验的项与判据(样本场实测(2026-09-22))
| 核验路径 | 核验项 | 判据 | 实测记录 |
|---|---|---|---|
| 开箱验证 | 入口引用闭合与编码守则 | 入口脚本引用的文件必须都在包内;编码与字符守则全部通过 | 解压 3,734 件,入口引用闭合通过(2026-09-17 记录) |
| 开箱验证 | 离线安装 | 安装脚本退出码 0 | 本机记录 172 秒、退出码 0 |
| 开箱验证 | 快捷方式与无窗口 | 两份快捷方式在位;无控制台窗口断言成立;包内无被弃用的脚本宿主文件 | 窗口句柄为 0,断言通过 |
| 开箱验证 | 页面可用性 | 核验门户与工作台与振动与运维控制台与健康自检五个入口,要求不少于 4 个可用 | 实测 4 个可用(振动入口因无产物返回 503,属预期) |
| 开箱验证 | 逐件复核 | 包内每个文件与工作树逐字节相同 | 3,733 件逐字节相同 |
| 卸载核验 | 拆除范围 | 安装记录、运行态、快捷方式都被拆掉 | 在临时副本上真跑卸载,退出码 0 |
| 卸载核验 | 保留范围 | 数据与产物一件不少,端口已释放 | 件数不变,断言通过 |
| 卸载核验 | 只读预演 | 内容断言(步骤齐全)与副作用断言(预演后关键目录与文件的存在性与字节数完全不变) | 自检全绿 |
关于「五个入口全可用」这一条,需要如实说明:判据本身是「不少于 4 个可用」,实测记录为 4 个可用,第 5 个(振动入口)在没有产物的机器上按设计返回 503 并给出缺件说明。本次编写未取到 5 个全部可用的实测记录,因此本文不写「5 个全通过」,只写「判据为不少于 4 个、实测 4 个」,并把「在产物在位的机器上复跑取证」列为后续动作(未取证)。
本次编写期间对只读项做了三次实跑:自检(guanlan.py check)结论为全绿可启动、退出码 0、无失败项;归口审计(pages_audit.py --check)结论为全部一致、退出码 0、21 项检查里 19 项是已登记的已知缺口;重算计划(rebuild_all.py --dry-run)打印默认 26 步、跳过 SCADA 为 23 步,全部步骤命令与脚本都在位。没有执行任何重算或耗时计算,本文中与耗时有关的数字全部来自既有的 HISTORY 记录与设计文档,来源逐条列在表 6-3。
需求的可信度一半来自「写清了不做什么」。本系统的边界不多但很硬:它是只读分析系统,不是控制系统,也不是云端服务。
表 10-1 约束、假设与明确不做(样本场实测(2026-09-22))
| 类别 | 条目 | 说明与依据 |
|---|---|---|
| 约束 | 不写回现场系统 | 全部产物落在本机产物仓,不下发指令、不修改现场任何系统;原始件按只读输入对待,落位冲突默认拒绝 |
| 约束 | 不做实时控制 | 最小时间粒度是分钟级数据(10min 与 1min),系统的输出是分析与建议(带证据级与处置措施),没有控制回路 |
| 约束 | 无外网 | 计算、页面、检索都在本机完成;Windows 侧离线安装件与便携运行时随包;本机模型为可选件且单独交付 |
| 约束 | 不做云端 | 事实契约层留有可上云面孔(脱敏派生件),但本版不部署云服务、不做账号体系、不做多租户 |
| 约束 | 页面无鉴权 | 这是知情取舍而非疏忽:对外监听等于把全场运行数据摊开,必须在网侧限来源或在反向代理加认证,启动日志每次提醒 |
| 约束 | 安装目录不得含空格与中文 | 安装脚本、批处理与部分第三方组件的既有约束,写在说明书的系统要求一节 |
| 约束 | 数据规模受单机资源限制 | 当前输入 26,504 件 / 224.67 GB;整条重算在单机上以小时计,建议内存 16 GB 起 |
| 假设 | 现场数据按约定目录与命名交付 | 源类目录名即摄入接口,改名或多套一层会导致摄入静默读不到,因此用体检器与落位脚本前置把关 |
| 假设 | 现场具备解释器或允许使用包内便携运行时 | 麒麟与统信自带解释器多为 3.7 与 3.9,跑不了本项目依赖,故包内带便携运行时 |
| 假设 | 有至少一份能解析的厂商报告与至少一段原始运行数据 | 否则相关面按缺件如实报,不产出假数;这也是标定一次基线的前提 |
| 假设 | 无人值守场景会使用服务而非会话前台进程 | 会话里起的进程会随会话关闭被一起收掉,远程部署必须用服务 |
| 不做 | 不做训练回路 | 本版不含训练,模型只做转述与解释,判断在代码里 |
| 不做 | 不做知识图谱的自动推断 | 本体层零判级权,只转录一层正本;同部件多源判级并存不合并 |
| 不做 | 不做实时数据流接入 | 数据以批的方式落位、体检、重算;服务侧看门狗只做到发现变化并列出该跑的步骤,不做流式处理 |
| 不做 | 不为「无生成端」的件做运行期补齐 | 运行期一律不从交付包补齐;缺件要么放原始件重算,要么由研发补生成端 |
| 不做 | 本版不承诺「多场并存运行」的完整交付 | 场配置机制与场定义装载已接通,但本版端到端跑通并留下实测记录的只有样本风电场;新场接入按第 11 章的多风电场适用性需求与换场验收检查表执行,不把「配置里放一个场文件」当作换场完成 |
本章回答一个问题:换一座风电场,要改什么、不要改什么。目标是同一套系统(同一份代码、同一个交付包)与同一份需求文档,在不改代码的前提下换场运行;换场时只改两类东西——配置与数据。凡是必须改代码才能换场的,都视为不满足本章要求,回到第 5 章走需求变更。本章的功能需求编号接着原有编号往下排,为 FR-44 至 FR-52;非功能需求为 NFR-12。
适用性目标分三层写清。入口不换:安装、落位、重算、页面与验收的入口和流程与样本场完全一致,现场人员不需要学第二套操作。口径不散:场名、机组数与机组清单、机型参数、原始件路径、判据阈值与界面单位都从配置取,不在代码里写死;一旦写死,多场并存时就会静默串场。缺件不造:新场某一族数据没到位时,系统如实标注缺件并按缺族降级,绝不拿别的场的数字顶替,也不把样本场的阈值当成新场的阈值。
本章有两个词要先定义。「本场」指当前被选中的场,由配置选定,不必然等于本文取数的样本风电场;「换场」指从一场切到另一场运行的整套动作(改配置、放数据、重跑、按检查表复验),不是把两场的数据混在一棵树里。本章沿用的占位符与附录 A 一致:<场>、<场站>、<机型> 按实际风电场替换。
本章需求与《数据要求说明_观澜_2.84.1.docx》《系统设计说明_观澜_2.84.1.docx》配套使用:本章讲「换场要满足什么」,数据要求说明讲「要向新场收哪些数据、哪些可以裁剪」,《设计说明》讲「配置在哪一层生效、哪些参数属于场相关层」。
取证边界要如实写一句:FR-44 至 FR-51 与 NFR-12 有既有的场配置层、摄入层与场级字段语义登记作依据;FR-52 的跨场横向对比是本次新增的口径要求,其实跑记录与机器守卫随后续版本补齐——本文不谎称已经通过。
场相关的一切取值都落在场定义文件 app_ETL/configs/farms/<场>.yaml 里,它是场相关事实的唯一真源:代码只读它,不在代码里写场名、机组数或原始件路径。当前场由环境变量 WINDSCADA_FARM=<场> 或程序内的 set_current() 选择,命令行脚本与服务走同一条路。
表 11-1 场配置化需求(FR-44 至 FR-46)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-44 | 场定义必须有七个必填键:name、n_turbines、turbines、src_10min、src_alarm、store、rated_kw;缺任何一个都在装载时响亮报出缺少的键名,绝不带病进入分析 |
场定义文件 app_ETL/configs/farms/<场>.yaml |
通过校验的场对象 | 七个必填键逐个在位;人为删去任一键时启动即报错并打印所缺键名 | src/windscada/config.py 的 REQUIRED 与 _expand() |
| FR-45 | 当前场由 WINDSCADA_FARM=<场> 或 set_current() 选择,切换只改选择不改代码;以 app_ETL/configs/farms/<场>.yaml 为准(历史 json 兼容);选到未定义的场,或选到「文件存在但不是场定义」的机型与物理约束 profile 时,必须报未知场并列出可用场 |
环境变量或选择调用、场定义文件 | 当前场对象与其派生的原始件根、标准仓与契约路径 | 换到另一份场定义后,重算与页面取到的是新场的路径与机组数,没有一处残留上一场的取值(不串场) | src/windscada/config.py 的 farm() 与 set_current() 与 available() |
| FR-46 | 场站目录按规则扫描辨识而不写死:场定义里的场站名与目录名完全相同者优先,其次是场名写法互为子串,再次是单站唯一性并标注「凭唯一性」;多个目录且都不匹配时如实报未识别并列出扫到的目录,不猜 | data/raw 下一级目录、场定义 |
辨识结论与依据、本场原始件根 | 四条规则的依据逐条可打印;未识别时页面显示无数据并给出约定位置而不是空路径 | src/windscada/config.py 的 station_scan() 与 station_report();FR-37 |
机组数、台号、机型与主机制造商(OEM)的差异不进入引擎:引擎按场对象给出的机组清单与额定容量工作,机型差异通过机型—场站数据契约 app_ETL/configs/contracts/<机型>_<场>.yaml 落到列名、单位与阈值上。换机型等于换契约,不改引擎。
表 11-2 机组与机型替换需求(FR-47)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-47 | 机组清单、机组数、额定容量与机型参数一律取自场定义与机型契约;turbines 同时支持逐台列举与「前缀加台号区间」两种写法,且 n_turbines 与 turbines 必须自洽;机型的拓扑差异(例如有无齿轮箱)只体现在契约与阈值层,不产生引擎分支 |
场定义的 turbines、n_turbines、rated_kw;app_ETL/configs/contracts/<机型>_<场>.yaml |
逐台循环范围、列名与单位映射、额定容量 | 换一个机组数不同的场后,矩阵行数与台账件数随 n_turbines 变化;同一份判据代码在有机型差异的两场上都能跑完 |
src/windscada/config.py 的 _expand();app_ETL/configs/farms/<场>.yaml;appETL/configs/contracts/<机型><场>.yaml |
现场给什么形态,系统都得能接:同一族数据可能以 CSV 转发层、现场月度类目归档库,或其它主机制造商(OEM)的导出形态到场。形态差异由取数层吸收,判据、报告与页面不变。缺族时的口径与「能接」同等重要:如实标注、按缺族降级,不造数。
表 11-3 数据源形态适配与缺族降级需求(FR-48 至 FR-49)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-48 | 数据源形态可适配:同一族数据以 CSV 转发层、现场月度类目归档库(需先落位成同台补充件)或其它主机制造商(OEM)导出形态到场时,取数层按族统一入口读取,字段语义按本场登记对齐,形态差异不下传到判据、报告与页面 | 各族源件与同台补充件、类目归档库、场级字段语义登记 | 统一取数结果与合并后的序列 | 同台多件按列名对齐并按时间戳去重(主件优先),合并行数与重叠行数如实打印;类目库按信息级列出且不计变化;字段语义与登记不一致时如实标注,不照名字硬用 | FR-38;app_ETL/configs/farms/<场>/field_semantic_registry.yaml;docs/输入数据放置指导_v0.1.md §4.1 |
| FR-49 | 缺族降级口径:某族缺件或缺列时,该族消费者按缺件如实标注并降级,不造数、不用他场数字顶替、不把「认不出」写成「无异常」;缺件清单与补齐办法在页面上可读到 | 各族在位情况、场定义 | 缺件标注、降级后的产物与页面提示 | 每一族的缺失都对应一句可复核的缺件说明;降级不改变其它族的结论;清空产物后页面仍可打开并说清缺件与补齐办法 | FR-31 与 NFR-06;docs/系统设计说明.md §11.4 |
同一套判据结构,参数必须按场标定:结构不变、参数随场变。引擎与判据的层级、判级四轴与七镜头的算法、口径的写法都不因场而异,变的只是参数值。
至少要按场标定的有六类:判级阈值(偏航与变桨的 P95 告警线、绕组与轴承温度的预警与告警档、健康分档线);额定功率与切入切出风速;时间窗锚点(对照基线与健康期分段的起止);限电窗(可作为干净判别时间窗的起止区间);温度档带宽(对照基线与正常带);机组数与额定容量。标定值落场定义或其引用的机型与物理约束件,不落代码。
参数整组省略是合法写法而不是缺件:直驱机型没有齿轮箱,齿轮箱温度档整组省略即不判该轴;省略要在页面与依据里写明「本场无此判据」,不取一套默认阈值继续判。
表 11-4 判据与阈值按场标定需求(FR-50)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-50 | 阈值、时间窗锚点、限电窗、温度档带宽等场相关参数一律按场标定并可配:参数落场定义或其引用的机型与物理约束件,同一份判据代码用不同参数跑不同场;本场用不到的参数可以整组省略,省略即不判该轴而不是取默认值硬判 | 场定义的参数段、机型与物理约束件 | 本场生效的阈值集合与判据结果 | 同一台同一系统在两场不同阈值下可以得出不同判级且各自可复算;整组省略的参数在页面与依据里写明「本场无此判据」 | app_ETL/configs/farms/<场>.yaml 的参数段与机型契约;docs/系统设计说明.md §16.2 |
术语与单位不写在页面里,随场取:部件与系统名的写法、功率与温度与转速与风速的单位、中英界面文案三样都要可配;同一字段在不同主机制造商(OEM)的导出里叫法不同时,按本场的字段语义登记对齐,不按名字猜。写英文简写时一律写成「中文(英文简写)」,英文映射的键与中文成对;某条术语或单位在本场没有对应写法时,页面回落中文并如实标注未配置,不显示空白,也不沿用上一场的写法。
表 11-5 术语、单位与语言可配需求(FR-51)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-51 | 术语、单位与界面语言按场可配:部件与系统名的写法、功率与温度与转速与风速的单位、中英界面文案从配置取;字段语义按本场登记对齐;英文简写一律写成「中文(英文简写)」且中英键成对;缺映射时回落中文并标注 | 场级字段语义登记、机型契约里的单位写法、语言包 | 页面与报告里的术语、单位与文案 | 语言包前后端成对(样本场实测(2026-09-22)为 845 条成对);换场后单位随配置变化且报告与页面一致;缺映射不显示空白 | src/windscada/lang.py;app_ETL/configs/farms/<场>/field_semantic_registry.yaml;NFR-04 |
多场并用时,最容易被误读的是「同一个指标在不同场之间能不能直接比」。本文的口径是:先同口径,再横向比。同口径的前提有四项:同一套判据结构与版本、同一套单位与术语写法、同一套时间窗锚点与样本量判据、同一版本文档与产物口径。四项都成立时,跨场对比只在同一指标、同一时间窗、同一聚合层级上做,并同时给出各场样本量;任一项不成立时,该行标注「口径不可比」并写明差在哪一项,不给可被误读的数字。跨场比的是场与场之间的差异;机组绝对值的对照要在场内做(机群基线与绝对限)。
表 11-6 跨场统一口径与横向对比需求(FR-52)
| 编号 | 需求描述 | 输入 | 输出 | 验收判据 | 依据文件 |
|---|---|---|---|---|---|
| FR-52 | 多场结果按同一判据结构、同一单位与术语、同一时间窗锚点与同一聚合层级输出,支持同口径横向对比;口径不一致时必须标注「口径不可比」并写明差在哪一项,不给可被误读的数字 | 各场同口径产物、场定义、版本真源 | 跨场对比表与其口径说明 | 对比表逐行写出指标、时间窗、聚合层级与各场样本量;任一口径项不一致时该行标注不可比而不是照常出数 | 第 5 章各条判据;NFR-10 |
收资不是「有多少收多少」,而是按场裁剪:先按通用收资模板判定每一族是必须、建议、可选还是可替代,再按本场的机型拓扑、数据源形态与专题范围裁掉用不上的条目(例如直驱机型不收齿轮箱相关件,不做振动专题的场把振动侧整族列为可选)。裁剪后的清单要写清「不收会怎样」,并作为换场验收的数据侧判据。
表 11-7 按场裁剪的收资清单需求(NFR-12)
| 编号 | 需求 | 判据 | 依据文件 |
|---|---|---|---|
| NFR-12 | 收资清单按场裁剪:以通用收资模板为底,按本场的机型、数据源形态与专题范围裁剪,逐条写明必须、建议、可选或可替代以及「不收会怎样」 | 每一族都有必须性分级与缺件后果且可复核;换场时清单随场定义与机型变化,不是照抄样本场 | 《数据要求说明_观澜_2.84.1.docx》第 8 章与第 12 章;docs/输入数据放置指导_v0.1.md |
换场不等于「放完数据能打开页面」,要按固定检查表逐项复验。检查表分五类:配置(场定义本身对不对)、数据(源件在位且可解析)、产物(重算是否真跑出来)、页面(换场后能不能用)、门禁(机器守卫是否全绿)。每一类的通过口径如表 11-8 所示;任一项不通过即视为换场未完成,不允许「先上线再补验」。
表 11-8 换场验收检查表(配置与数据与产物与页面与门禁)
| 类别 | 检查项 | 通过口径 | 对应需求 |
|---|---|---|---|
| 配置 | 场定义七个必填键齐全且自洽 | 装载无报错;n_turbines 与 turbines 的台数一致;rated_kw 与本场容量一致 |
FR-44 |
| 配置 | 选择当前场的方式生效 | WINDSCADA_FARM=<场> 或 set_current() 选定后,取到的路径与机组数都属本场,无上一场残留 |
FR-45 |
| 配置 | 场站目录辨识有依据 | 辨识结论与依据可打印;未识别时指向约定位置而不是空路径 | FR-46 |
| 配置 | 机型契约按机型就位 | app_ETL/configs/contracts/<机型>_<场>.yaml 在位,列名与单位可加载 |
FR-47 |
| 配置 | 判据参数按场标定 | 阈值、时间窗锚点、限电窗、温度档带宽逐项有值,或有「本场不判该轴」的明确省略记录 | FR-50 |
| 数据 | 各族源件按约定目录与命名就位 | 体检结论为结构合规;冲突默认拦下;同尺寸件可反复跳过 | FR-36 |
| 数据 | 源件形态能被取数层读到 | 各族消费者实跑到数;同台多件合并行数与重叠行数如实打印 | FR-48 |
| 数据 | 缺族如实记账 | 每一族缺失都有缺件说明与补齐办法且页面可读到;无造数 | FR-49 |
| 产物 | 一条命令重算全链走通 | 重算按默认步数跑完,每步退出码在容忍口径内或明确报出,整轮退出码 0 | FR-29 |
| 产物 | 产物件数与输入跨度对得上 | 核对锚点逐项达标;台账等价验收通过,或如实标注「没做验收」 | FR-12 与 FR-21 |
| 产物 | 逐件有来路 | 反向呼应审计无未归类件 | NFR-05 |
| 页面 | 门户与各服务按本场数据可用 | 门户、工作台、振动、运维控制台与健康自检五个入口中可用数不少于 4 个;无产物时返回结构化缺件说明 | NFR-06 与 FR-43 |
| 页面 | 页面归口与陈旧检测通过 | 归口审计无不一致;本场数据派生页面无陈旧项(陈旧检测退出码 7 为 0 项) | FR-34 |
| 页面 | 术语、单位与语言随场生效 | 页面与报告的单位、术语、语言与配置一致;未配置项回落中文并标注 | FR-51 |
| 门禁 | 装机自检全绿 | guanlan.py check 无失败项,退出码 0 | NFR-07 与 FR-41 |
| 门禁 | 版本与文档一致 | 版本记录一致性检查通过;安装记录版本与本包版本一致 | FR-41 与 FR-42 |
| 门禁 | 对外口径与去标识化 | 交付文档对样本场标识 0 命中;描述口径(时间窗、影响机组、中文(英文简写))机器可查 | NFR-04 |
换场要动的配置与数据,逐条对应到需求、配置项与验收方式,如表 11-9 所示。这张表是换场作业单的底稿:第一列是需求,第二列是要改或要核对的东西,后两列是凭什么算通过、换场时具体做什么。
表 11-9 多风电场适用性需求与配置项与验收对照
| 需求 | 配置项或真源 | 验收方式 | 换场时的动作 |
|---|---|---|---|
| FR-44 | app_ETL/configs/farms/<场>.yaml 的 name、n_turbines、turbines、src_10min、src_alarm、store、rated_kw |
装载报错清单为空;台数与机组清单一致 | 新建或改写场定义并填齐七个必填键 |
| FR-45 | WINDSCADA_FARM=<场> 或 set_current();app_ETL/configs/farms/<场>.yaml |
换场后路径与机组数无残留(不串场) | 设定场选择并确认取到本场路径 |
| FR-46 | data/raw/<场站> 的目录名与场名写法 |
辨识依据逐条打印;未识别时报出扫到的目录 | 按约定改名或补场名写法 |
| FR-47 | turbines、n_turbines、rated_kw;app_ETL/configs/contracts/<机型>_<场>.yaml |
机组数变化则矩阵行数与台账件数随之变化 | 换机型契约,台号按实际替换 |
| FR-48 | 取数层的族入口;类目归档库与同台补充件;场级字段语义登记 | 合并行数与重叠行数打印;类目库不计变化 | 按现场形态落位并体检 |
| FR-49 | 各族在位情况与缺件标注 | 每一族缺失都有可复核的缺件说明;无造数 | 能补的补件,补不了的如实记账 |
| FR-50 | 场定义与机型契约里的参数段 | 同系统在两场不同阈值下判级可各自复算;省略项写明不判该轴 | 按新场标定阈值、时间窗锚点、限电窗与温度档带宽 |
| FR-51 | 场级字段语义登记、单位写法、语言包 | 页面与报告单位一致;语言包成对;缺映射回落中文 | 配置本场的术语与单位写法 |
| FR-52 | 各场同口径产物 | 对比表逐行写口径与样本量;不一致标不可比 | 口径项齐备后再出对比 |
| NFR-12 | 通用收资模板加本场裁剪清单 | 逐族必须性分级与缺件后果可复核 | 按本场机型与专题裁剪清单 |
| 换场验收 | 表 11-8 检查表 | 配置、数据、产物、页面、门禁五类逐项通过 | 换场后逐项复验并留记录 |
跟踪矩阵把 52 条功能需求接到实现、页面或产物、验收门三列上。用它的方式很简单:改一条需求,先在矩阵里找到它对应的实现与验收门,改完之后按验收门那一列重跑对应检查;如果某一行的验收门是「人工核」,说明这条目前没有机器守卫,评审时要特别留意。
表 12-1 需求跟踪矩阵
| 编号 | 实现(脚本或模块) | 页面或产物 | 验收门 |
|---|---|---|---|
| FR-01 | taxonomy.system_matrix;scripts/windscada_serve.py | 系统矩阵、逐台页、问题页 | 判级随所选时间窗变化的实测记录;check 归口与反向呼应 |
| FR-02 | scada_slim_build.py;subsys 各面 registry | 窄仓、判级单元格 | 重算链 ③b 步;窄仓列数与口径同源 |
| FR-03 | perf/availability;reliability.overview | 可靠性表、部件问题页 | 判级与可靠性随时间窗变化的实测记录 |
| FR-04 | windscada_serve.py 的 sys_norm() | 问题页与问题接口 | 传前端标识与中文名都能取到同一份问题(HTTP 抽样) |
| FR-05 | 组件页面自组句逻辑 | 需要关注卡片 | HTTP 抽样:依据不再为空(WTG09 齿轮箱) |
| FR-06 | months_of;win_range;in_win | v2 顶栏时间窗控件 | 时间窗词表逐项验证;退化时间窗按样本不足处理 |
| FR-07 | 顶栏两个日期输入框与校验 | v2 页面自定义起止控件 | 起晚于止时拒绝并提示 |
| FR-08 | 进程缓存与后台线程与预热 | 等待与构建中状态标记 | 判级约 25 秒每个时间窗;等待期页面写明旧口径 |
| FR-09 | curves.build_store;/api/curves | 七镜头曲线 | 图注写随所选时间窗;样本量随时间窗变化 |
| FR-10 | 月度派生件过滤 | 七张月度时序图 | 图注与按月取整口径 |
| FR-11 | control.registry(span=) | 控制参数一致性卡片 | 按时间窗重算约 0.6 秒;封顶中位随窗变化 |
| FR-12 | rebuild_from_raw.py --scada | 损失、功率曲线、停机事件 | 与基线逐值对拍;重算链 ③ 步 |
| FR-13 | <场>_tcm_index.py;<场>_tcm_spectra.py;vib_raw_build.py | 振动窗索引、谱分片、摄入清单 | 振动窗 w0316 索引 2,066,686 行、谱 420,742 条 |
| FR-14 | windcms.py report;report_std 与 report 构建器 | 报告 md 与 docx、逐台页、总览页 | 38 台判级齐;缺融合级写破折号 |
| FR-15 | <场>_fusion_run.py;<场>_fusion_handoff.py;fusion 模块 | 融合表、handoff、全场标量 | 反向呼应审计按族逐件成立 |
| FR-16 | component_history_build.py;trend_ingest | 部件历史件、趋势证据对象 | 重算链 ④d 步;时间窗不足出空表并写边界 |
| FR-17 | baseline_38_build.py | 三层基线件 | 重算链 ④e 步;样本不足如实空表 |
| FR-18 | windscada_alarms_ingest.py | 报警台账 | 39,211 行;键集合并集去重 |
| FR-19 | windscada_workorder_ingest.py | 工单台账 | 5,876 行;差异可归类 |
| FR-20 | windscada_watch_channels_build.py | 油样索引 | 404 行;102 行缺口如实记账 |
| FR-21 | 停机与损失构建器 | 停机事件件、损失月表 | 与输入跨度对拍 |
| FR-22 | app_ontology/.../ontology/kb_ingest.py | 对象库、检索索引、实机参数表 | 本体审计退出码 0;故障码覆盖 263 与 322 |
| FR-23 | app_ontology/.../ontology/populate.py | 对象库对象 | 本体审计退出码 0 |
| FR-24 | chain_ingest;trend_ingest | 决策对象与趋势证据对象 | 幂等覆盖;服务在跑时取链盘 |
| FR-25 | app_ontology/.../ontology/fast_agent.py;llm_gate;检索 | 问答区与引文块、模型审计日志 | 已知答案回放;两档都拦时不出文并给原因 |
| FR-26 | src/windcms/report_std.py;report.py | 报告 md 与 docx、登记 csv | 38 台逐台有条目;相对判据封顶候选 |
| FR-27 | guanlan_facts_contract.py | 契约件与四个消费端派生件 | 改一条 claim 四个消费端全变;自检不过报 2 |
| FR-28 | portal_build.py;门户装配脚本 | 门户单文件页、汇报纸 | 拆装逐字节相同;产物挪走时缺结论段属预期 |
| FR-29 | scripts/rebuild_all.py | 各仓产物与步汇总 | 计划步数实跑;失败即停;幂等 |
| FR-30 | guanlan_ops.py;_ops_run.py;_ops_launch.py | 运维控制台 | 并发动作返回 409;停组件保留控制台 |
| FR-31 | products_state.py;products_restore_missing.py | 产物状态与缺件说明 | 清除后再点返回 409;补齐定位为离线人工补救 |
| FR-32 | raw_scan.py;rebuild_all --auto;service_worker 的看门狗 | 扫描结论与基线快照、看门狗日志 | 退出码 0 与 4 与 5;族表外目录不猜 |
| FR-33 | portal_build.py;shell 与模板装配 | 门户单文件页 | 拆装逐字节相同;行尾 LF 自检 |
| FR-34 | configs/portal_pages.yaml;pages_audit.py | 归口表与审计结论 | 检查 21 项、不一致 0;陈旧报 7 |
| FR-35 | retrieval.build;windcms 知识库构建 | 检索索引件 | 无模型时纯词法可用;索引缺失如实说明 |
| FR-36 | place_raw_data.py;raw_data_check.py | 落位结果与体检结论 | 冲突默认拒绝;同尺寸跳过 |
| FR-37 | scan_stations.py;config 场站辨识 | 辨识结论与依据 | 四条规则逐条打印;多目录不匹配报未识别 |
| FR-38 | scada_source 取数层;raw_scan 族表 | 合并取数结果与扫描结论 | 主件与补充件合并行数与重叠数打印;类目库不计变化 |
| FR-39 | install.bat 与 install.ps1 与 install.sh;便携运行时 | 虚拟环境、配置、安装记录 | 离线安装退出码 0;入口引用闭合 |
| FR-40 | service_ctl.py;win_service.py;service_main.py;service_worker.py | 托管进程与自启项 | 巡检 15 秒;无权限返回 3 并给建议 |
| FR-41 | 安装脚本的版本检查步骤;src/version.py | 安装记录与提示 | 五类提示与动作;check 版本行一致 |
| FR-42 | guanlan_uninstall.py;uninstall 入口两个 | 卸载结果 | 自检两类断言;实跑断言拆除与保留范围 |
| FR-43 | pack_dist.py;pack 入口;开箱验证入口 | 交付包与清单文件 | 两道闸;包内不得有安装记录或快捷方式;页面可用不少于 4 个 |
| FR-44 | src/windscada/config.py 的 REQUIRED 与 _expand() | 场定义装载与报错清单 | 七个必填键逐个在位;缺键即报并打印键名 |
| FR-45 | src/windscada/config.py 的 farm() 与 set_current() 与 available() | 当前场对象与派生路径 | 换场后路径与机组数不串场 |
| FR-46 | src/windscada/config.py 的 station_scan() 与 station_report() | 数据层维护页的辨识结论 | 辨识规则逐条打印;未识别时不猜 |
| FR-47 | _expand();appETL/configs/contracts/<机型><场>.yaml | 机组清单、列名与单位映射 | 矩阵行数随 n_turbines 变化;两场同代码可跑完 |
| FR-48 | 取数层族入口;app_ETL/configs/farms/<场>/field_semantic_registry.yaml | 合并取数结果与字段对齐 | 合并与重叠行数打印;类目库不计变化 |
| FR-49 | 各族消费者的缺件分支;products_state.py | 缺件标注与降级产物 | 每族缺失有可复核缺件说明;无造数 |
| FR-50 | 场定义与机型契约的参数段 | 本场阈值集合与判据结果 | 两场不同阈值各自可复算;省略项写明不判该轴 |
| FR-51 | src/windscada/lang.py;场级字段语义登记;契约单位写法 | 页面与报告的术语与单位 | 语言包成对;单位随场变;缺映射回落中文 |
| FR-52 | 各场同口径产物 | 跨场对比表与口径说明 | 逐行写口径与样本量;不一致标不可比 |
表 A-1 编写依据(章节或事实与来源文件) | 章节或事实 | 来源文件(仓库相对路径) | |---|---| | 版本号真源、版本规则、12 条版本史、包名 | src/version.py | | 系统是什么、产物全景、路径约定、进程口径、页面取数 | docs/系统设计说明.md 第 1 至第 6 章 | | 缺口与边界(未随包脚本、缺件、源件缺失) | docs/系统设计说明.md 第 7 章 | | 变更记录(按日期逐条事故与处置) | docs/系统设计说明.md 第 8 章 | | 交付包组成与入口引用闭合 | docs/系统设计说明.md 第 9 章与 §9.1 | | 页面归口规则、五类内容类型、门户逐页识别、全部网页总清点 | docs/系统设计说明.md 第 10 章与第 12 章 | | 配置与日志统一口径、无产物时的可用性 | docs/系统设计说明.md 第 11 章 | | 输入到功能到算法到产物、端到端顺序、反向呼应审计、可逆性 | docs/系统设计说明.md 第 13 章与 §13.6 | | 服务化安装与卸载、安装时版本检查 | docs/系统设计说明.md 第 14 章 | | 版本管理与打包命名、单一真源与三处守卫 | docs/系统设计说明.md 第 15 章 | | 时间窗词表、随窗与不随窗、窄仓、等待契约 | docs/系统设计说明.md 第 16 章 | | 三条描述口径与服务端链接契约、依据不得为空 | docs/系统设计说明.md 第 17 章 | | 面向用户的功能与使用、系统要求、模型档、目录结构、常见故障、已知限制 | docs/说明书_观澜…v0.2.md | | 页面与子页的归口登记(类型、依据、已知缺口) | configs/portal_pages.yaml | | 服务端口与监听地址真源、看门狗开关 | configs/serve.json | | 模型档位与拉取命令 | configs/models.json | | 自检门清单与退出码、服务定义 | guanlan.py | | 重算链步骤、容忍口径、自动取消跳过 | scripts/rebuild_all.py | | 归口审计规则与退出码语义 | scripts/pages_audit.py | | 输入数据放置规则、增量语义、放完跑什么 | docs/输入数据放置指导_v0.1.md | | 落位约定、场站辨识四条规则、各目录功用、能重建与不能重建 | docs/数据目录结构与落位约定_v0.2.md | | 手工重算步骤、运维控制台三条纪律、二次启动原因 | docs/重算操作手册_v0.1.md | | 页面输出体检的判定口径与逐页原因 | docs/页面输出体检_v0.1.md 与 docs/页面输出体检_逐页原因_v0.1.md | | 打包与安装与卸载与版本检查的用户视角说明 | README_先读我.MD | | 自检实跑输出(41 条判定行) | docs/src/_guanlan_check.txt 与本机 2026-09-22 实跑 | | 重算计划实跑输出(23 步) | docs/src/_rebuild_plan.txt | | 四张插图的数字来源 | docs/figures 下的四张需求分析插图与其生成器 scripts/delivery_docs_figures.py | | 场定义必填键、场选择与场站目录辨识 | src/windscada/config.py 的 REQUIRED 与 farm() 与 set_current() 与 station_scan() | | 场定义与机型与物理约束参数的写法样例 | app_ETL/configs/farms/<场>.yaml | | 机型—场站数据契约与字段单位真源 | appETL/configs/contracts/<机型><场>.yaml 与 app_ETL/configs/canonical/dictionary.yaml | | 场级字段语义登记与其它厂商导出形态的对齐 | app_ETL/configs/farms/<场>/field_semantic_registry.yaml | | 按场裁剪的收资清单与必须性分级 | docs/src/数据要求说明_观澜_2.84.1.md | | 场无关引擎与场相关参数的分层与换场作业单 | docs/src/系统设计说明_观澜_2.84.1.md |
表中 <场>、<场站>、<机型> 为占位符,按实际风电场替换。
表 B-1 术语表(按主题分组)
| 术语 | 英文或写法 | 含义 | 出处 |
|---|---|---|---|
| 时间窗 | — | 一个由用户选择或自定义的数据观察区间;月度件按月取整、日粒度件按日精确 | docs/系统设计说明.md §16 |
| 预设时间窗 | — | 词表内置的时间窗:近30日、近90日、2026年、2026H1、2025H2、全程 | docs/系统设计说明.md §16.1 |
| 自定义起止日期时间窗 | — | 写法为起日期~止日期的时间窗,含两端 | docs/系统设计说明.md §16.1 |
| 判级时间窗 | — | 判级矩阵与四轴重算所用的时间窗 | docs/系统设计说明.md §17.1 |
| 证据时间窗 | — | 支撑某条结论的证据所在的时间窗,随判定一并给出 | docs/系统设计说明.md §17.1 |
| 天气窗 | — | 领域词,指气象条件适合的时段,不属于时间窗口径的统一范围 | docs/系统设计说明.md §17.1 |
| 作业窗 | — | 领域词,指检修作业可实施的时段,保持原样 | docs/系统设计说明.md §17.1 |
| 平均无故障间隔(MTBF) | MTBF | 相邻两次故障之间的平均运行时长,按所选时间窗内的停机事件与报警计算 | docs/系统设计说明.md §16.2 与 §17.1 |
| 平均停机间隔(MTBO) | MTBO | 相邻两次停机之间的平均间隔,与可靠性表同源 | docs/系统设计说明.md §17.1 |
| 单次停机时长(MDT) | MDT | 每次停机的平均持续时长 | docs/系统设计说明.md §17.1 |
| 窄仓 | slim10min | 由十分钟数据抽出的公共列子集(不裁剪行),作为按时间窗重算的秒级底座 | docs/系统设计说明.md §16.3 |
| 等待契约 | pending | 按时间窗重算未命中缓存时先回等待或构建中,由页面轮询,绝不静默用旧口径 | docs/系统设计说明.md §16.4 |
| 判级四轴 | — | 变桨、偏航、蓄能、温度四个随所选时间窗重算的判级方向 | docs/系统设计说明.md §16.2 |
| 融合面 | — | 把模型过闸线与振动窗索引裁决合到一起的判级面,输出融合级 | docs/系统设计说明.md §13.1 |
| 链盘 | — | 运行时的决策链进度集合,每台一个对象记六步状态、卡点与下一步 | docs/系统设计说明.md §13.1 |
| 产物 | outputs | 由原始件算出来、页面只读的输出数据,统一落在产物仓 | docs/系统设计说明.md §3 与 §13.4 |
| 逐件来源台账 | — | 记录每件产物属于原始件重算还是随包补齐的台账 | docs/系统设计说明.md §2.1 |
| 反向呼应审计 | — | 从输出回溯到生成端与输入的审计,检查每件产物有没有来路 | docs/系统设计说明.md §13.6 |
| 页面归口 | — | 判定每一页是否随输入数据变、是否算产物,并逐条写明依据 | configs/portal_pages.yaml |
| 陈旧检测 | — | 对数据派生页面比对内嵌指纹与当前产物,不一致即报页面陈旧 | scripts/pages_audit.py |
| 数据派生 | data-derived | 五类页面内容类型之一:把产物烘进页面,属于产物,必须登记来源并做陈旧检测 | configs/portal_pages.yaml 头部 |
| 受管静态 | static | 受管外壳正文,不随输入数据变,也不得引用产物 | configs/portal_pages.yaml 头部 |
| 实时取数 | live | 页面本体不存快照,永远与产物一致 | configs/portal_pages.yaml 头部 |
| 产物引用脚注 | data-citing | 静态正文加产物引用,正文不变但被引产物必须在位 | configs/portal_pages.yaml 头部 |
| 冻结交付件 | frozen-delivery | 带版本号与日期的客户交付件,按交付版本冻结,不随数据自动变 | configs/portal_pages.yaml 头部 |
| 开箱验证 | — | 打包后在临时副本上真解压真安装真起服务的核验路径 | docs/系统设计说明.md §9 |
| 容忍口径 | tolerate | 重算链允许某步返回特定退出码而不打断整条链,且明确「容忍不等于通过」 | scripts/rebuild_all.py |
| 核对锚点 | — | 重算后应达到的条数指标,用于快速判断数据是否真的进去了 | docs/输入数据放置指导_v0.1.md §4 |
| 收资 | — | 向现场收集原始数据与资料的过程与其清单要求 | docs/现场收资接入_v0.1.md |
| 场定义 | farm config | 一个场的最小事实集合:名称、机组数与机组清单、原始件路径、标准仓与额定容量;落 app_ETL/configs/farms/<场>.yaml |
src/windscada/config.py 的 REQUIRED |
| 换场 | — | 从一场切到另一场运行的整套动作:改配置、放数据、重跑、按检查表复验 | 本文 §11.9 |
| 缺族降级 | — | 某族数据缺失时按缺件如实标注并降低该族功能,不造数、不用他场数字顶替 | 本文 FR-49 |
| 按场标定 | — | 把阈值、时间窗锚点、限电窗、温度档带宽等场相关参数按本场取值 | 本文 FR-50 |
| 通用收资模板 | — | 与场无关的收资条目底稿,按场裁剪后作为现场收资清单 | docs/src/数据要求说明_观澜_2.84.1.md |