版本记录.md 54 KB

版本记录(观澜·如东样板 v2)

本文件由 scripts/version_log.py 生成,勿手改:事实(版本号、级别、变更)写在 src/version.py 的 HISTORY 里,改完跑 python scripts/version_log.py --write。 guanlan.py check 与打包器都会校验本文件与代码里的版本号是否一致。

版本号规则(用户令 2026-09-17)

编号 v<大版本号>.<中版本号>.<小版本号>,例如 v2.14.0。

级别 含义
大版本号 系统解决方案、架构或核心功能改变
中版本号 非核心功能新增、减少、修改
小版本号 消缺完善

怎么改:改动落在"解决方案/架构/核心功能" → 大 +1(中/小归 0);落在"非核心功能的新增/减少/修改" → 中 +1(小归 0);只是"消缺完善" → 小 +1;一次发布混了几类,取最高那一级

打包文件名 = app_guanlang_v2.14.0.zip(规则:app_guanlang_v<版本号>.zip)。

版本号只写在 src/version.py 一行(VERSION = '2.14.0');打包器、安装脚本、安装记录 install-info.json、自检都读它,不另设真源。

版本 日期 级别 主要变更 说明
v2.14.0 2026-09-29 中 分别打包:前端 / 后端 / 算法 / 数据接入与管理 各自成包(含依赖闭包 + 独立 install/run/uninstall) 功能新增(打包形态)⇒ 中版本 +1。用户令 2026-09-28「前端、后端、算法、数据接入及管理 支持分别打包」。① 打包器加 --module <名>:产物 app_guanlangv<版本><模块>.zip;模块包 = 该模块 + 它依赖的模块(按 configs/modules.yaml 的 allow 递归闭包)+ 公共层 + 共享支撑件(src 兼容壳 / scripts / configs 单件 / wheels·vendor 离线依赖 / reference;前端与后端另带 release·resources,算法带 resources)。② 包根写 MODULE_PACKAGE.json(模块 + 闭包 + 版本),模块目录里的 install/run/uninstall(bat+sh)改双模:总包内调安装根统一入口;独立模块包走新增的 app_common/.../bootstrap.py(自建 .venv、离线装依赖、自检、按模块起服务或跑链、卸载)。③ bootstrap 自检覆盖:目录与 6 个入口脚本、版本一致、配置单源、公开面可导入;run 支持 --cmd(后端 serve/check/status/stop;前端 portal 静态服务;ETL/算法按脚本名跑,ETL 默认 --dry-run);list 列出各模块可运行入口。④ 新增门:根 VERSION 镜像文件必须与 version.py 同号(version_log --check 里查 —— 此前它是 0.2.0 的历史遗留,与真源脱节)。⑤ 打包验证加 --verify <zip> --module <名>:解压 → 入口引用闭合与编码守则 → bootstrap 自检 → 可运行入口列举。验收:四个模块包各自出包并验证通过;总包开箱 5/5 + 卸载核验;全门禁 rc=0;guanlan.py check 全绿。
v2.13.0 2026-09-28 中 P9 源码目录结构变更:实现包上提模块根 + 每模块 common/configs/data/README/入口脚本 + 配置双根 用户令 2026-09-28 变更重构要求(架构布局变更)⇒ 中版本 +1。① 实现包上提:app<模块>/common/app<模块>guanlan/ → app<模块>/app_<模块>guanlan/(7 模块),全仓点号 540 处 + 实路径 190 处一次改写(src/** 壳、scripts/** 壳、api.py、安装器、打包器、门禁、文档)。② 旧前缀兼容:common/app<模块>_guanlan/init.py 用 sys.meta_path 前缀重定向(sys.modules[旧名] is sys.modules[新名],不产生两份模块对象),保留一个版本。③ 每模块补齐 common/(模块内通用组件)、configs/(模块专属配置)、data/(数据件预留)、README.MD(含安装部署与运行)、install/uninstall/run(bat+sh,内部调安装根统一入口;纳入入口引用闭合,92 条)。④ 配置双根:app_ETL/configs/{canonical,contracts,farms}(164 件)与 app_frontEnd/configs/terms(3 件)下放;安装根 configs/ 只留共用单件(serve.json/models.json/portal_pages.yaml/modules.yaml/registry.yaml);P.config()/P.config_dir() 多根查找 + 单源校验;登记表加 owner,config_audit 按归属根校验。⑤ 门禁联动:模块边界 R1/R2/R5 改新布局(并修 _TARGETS 带注解写法漏检);uninstall --all 纳入模块目录。验收:189 个模块文件新旧前缀同体导入;全门禁 rc=0;guanlan.py check 全绿;起服务逐页(/detail/v2 唯一差异为页内注释里的配置路径 +13 字节);打包开箱 5/5 + 卸载核验通过。
v2.12.1 2026-09-28 小 源码梳理与死代码清理:删 cms_availability(275 行,另有实现)+ 清本地残留 15.4 MB 清理类改动(不改行为口径)⇒ 小版本 +1。用户令「梳理源代码,及清理无用源代码程序」。新增 docs/源代码梳理_v0.1.md(761 受管件 / 437 .py / 72,787 行 / 158 兼容壳的规模与分层、十条根入口、23 个质量门、依赖纪律 R1–R8,以及按"引用计数 + 出处"取证的五类无用件清单)。① 删死代码: app_ontology/.../sop/cms_availability.py(275 行)与壳 src/sop/cms_availability.py(23 行)——全仓无调用,L0 数据可用性判据的实际实现在 scripts/rudong_model_run.py::l0_layer;并从 app_ontology/api.py 摘掉 sop_cms_availability 公开名。④ 清本地残留: scripts/sim_hub/frames/(37 张 PNG,8.7 MB,本就 .gitignore)+ 全仓 46 个 pycache 与散落 .pyc,共释放约 15.4 MB(.venv 未动)。②③ 两批(8 件零引用一次性生成器、33 个无人使用的旧路径壳)经用户裁示保留;C 类接入点契约(MinIO objectstore / Redis cache)保留。验收: 全门禁 rc=0(模块边界 R1–R8 / 配置统一 / 页面归口 / 产物反向呼应 / 链路缺口 / 可移植 / 版本记录 / 依赖台账)+ guanlan.py check 全绿 + 起服务逐页探活 + 打包开箱 5/5 + 卸载核验。
v2.12.0 2026-09-28 中 模块化重构收官 P7:质量门与打包安装迁移(23 件 / 7,426 行)——七个模块齐备 重构收官的架构里程碑(七个模块目录 + 公开面 + 兼容壳齐备)⇒ 中版本 +1。P7 把质量门与打包安装 23 件 / 7,426 行迁入 app_qualityGate/app_qualityGate_guanlan/{audits,docs,pack}/;旧路径 scripts/<件>.py 留 CLI 壳(公开名同面转发 + main(),guanlan.py check 的 importlib 载入照旧)。*根引导脚本 install.ps1/install.sh/uninstall./check.bat/pack.*/start
v2.11.9 2026-09-28 小 模块化重构 P6:本体与知识层实体迁移(58 模块 / 19,775 行) 重构推进(源码组织层)⇒ 小版本 +1。本体 20 件 + SOP 38 件迁入 app_ontology/app_ontology_guanlan/{ontology,sop}/;旧路径 src/ontology/<件>.py、src/sop/<件>.py 全部留兼容壳 (模块别名 + python -m 经 runpy 重跑实现,重算链 ⑦ 步命令不变)。实逮: ① 包内 from .. import paths(23 处)改绝对路径;② 19 处 file 取根改 install_root();③ -m 入口必须由壳 runpy.run_module(run_name="main") 兜住;④ 按源码路径读本层的审计器与登记表(audit_chinese_terms、check_portability 的 ALLOW 键、products_reverse_audit 的生成端、configs/{registry,terms/jargon_rules}.yaml)同步改位置。验收: 58/58 模块新旧路径同体导入 + 取根抽查正确 + 十条本体/SOP 路由响应体逐字节等于迁移前 + -m 旧入口冒烟通过 + 全门禁 rc=0 + 开箱验证 5/5。
v2.11.8 2026-09-28 小 消缺:guanlan.py stop 在 pids.json 读不动/删不掉时抛异常中断 消缺(不改行为口径,只修坏掉的路径)⇒ 小版本 +1。根因: cli.py::cmd_stop() 直接 PIDS.unlink(),而服务宿主与启动器并存时 run/pids.json 可能已被清掉、被句柄占用或读到一半;2026-09-28 远端同步 2.11.7 时实逮:guanlan.py stop 以 FileNotFoundError 中断,组件其实已停掉。修法: 读记录失败按空记录处理(如实报一句);删记录失败只报一句,不影响停机结果与退出码;v.get("pid") 容忍记录缺字段。回归: pids.json 不存在 / 是目录(读+删都失败)/ 内容损坏 三种情形均不抛异常且 rc=0。验收: 本机 guanlan.py stop 正常停六个组件并删记录、再跑一次给友好提示 rc=0;三情形回归 3/3 通过;全门禁 rc=0。
v2.11.7 2026-09-28 小 模块化重构 P5:前端层实体迁移(13 件;经典页模板从 serve.py 抽出) 重构推进(源码组织层)⇒ 小版本 +1。前端层迁入 app_frontEnd/app_frontEnd_guanlan/:assets/{app.js,app.css,charts.js,favicon.svg,classicchart.js}、pages/{shell.html,build.py,snapshot.py,classic.py,classic*.html}、design.py、lang.py、terms.py(经用户裁:语言包与显示层术语归前端)、builders/{portal_build,portal_fix_anchors,portal_inject_claims}.py。serve.py 的经典页模板(CHART_JS/PAGE_FLEET/PAGE_PROBLEM/PAGE_TURBINE,约 246 KB)抽成真资源件 + 只读装载器,serve.py 5549 → 2707 行,模板值逐字节一致。旧路径全部留壳(5 个模块别名壳 + 3 个 CLI 壳,python -m 照旧)。实逮:① 资源件无壳可留 ⇒ 六个按路径读它们的审计器/登记表同步改;② 子目录取根层数变 ⇒ 统一 install_root();③ 模板装载必须 newline=""(否则换行翻译改掉字节);④ 搬迁中被工具改写的换行风格要按 HEAD blob 对齐,避免整文件伪 diff。验收:build.render 四组合与 design 两段 CSS 逐字节等于迁移前;四个模板常量与三张经典页渲染逐字节一致;portal_build --verify 与 20.19 MB 门户逐字节一致;服务重启后门户//detail/v2//ops//cms/ 页面体 sha256 一致;全门禁 rc=0;开箱验证 5/5。
v2.11.6 2026-09-28 小 消缺:服务 restart 的等待判据把 STOP_PENDING 当成已停(远端实测吃 1056) 消缺(承 2.11.5,同一动作的判据收紧)⇒ 小版本 +1。2.11.5 把 sc.exe restart 拆成"停 → 等 → 起"后,等待判据写成"状态不是 RUNNING 就算停稳"—— 而 sc.exe stop 是异步的,SCM 先回 STOP_PENDING,该判据立刻为真,于是 start 抢跑,远端 Windows 服务上实测报 1056(服务的一个实例已在运行),网关/仿真/三维端口被停掉约一分钟(站点短暂不可用)。修法: 新增 win_state()(按 STOP_PENDING / START_PENDING / RUNNING / STOPPED 顺序认状态字)与 wait_state("STOPPED", 120s),必须等于 STOPPED 才继续;start 再给三次机会(间隔 5 s)兜 SCM 状态刚落地的偶发 1056/1058。补回归测试: 用真实 sc query 的四种输出喂 win_state(),并断言 STOP_PENDING 下 wait_state("STOPPED") 不会提前为真。验收: 本地回归 6/6 + restart --dry-run 三步全打印 + 远端 Windows 服务用新 restart 真重启成功(服务 RUNNING、六个端口重新监听、七条路由全 200)。
v2.11.5 2026-09-28 小 消缺:Windows 服务 restart 是无效命令(sc.exe 无 restart 子命令) 消缺(不改行为口径,只修坏掉的动作)⇒ 小版本 +1。根因: scripts/service_ctl.py restart 在 Windows 上落成 sc.exe restart guanlan,而 sc.exe 没有 restart 子命令 ⇒ 实际只打印用法帮助并以非零码退出,服务从未被重启(此前只能用 stop + start 两步绕过)。修法: 新增 win_restart() / wait_stopped() —— 先 sc.exe stop,轮询 sc.exe query 直到不再是 RUNNING(最长 90 s),再 sc.exe start;因为 stop 是异步的,不等停稳就 start 会吃 1056/1058 错。--dry-run 现在会把"停 / 等停稳 / 起"三步都打印出来。Linux 侧 systemctl restart 本来就对,不动。验收: restart --dry-run 打出 stop+start 两条;真跑到远端 Windows 服务上又逮到"等待判据只看不是 RUNNING"⇒ STOP_PENDING 抢跑、紧接着 start 吃 1056(服务的一个实例已在运行),网关等端口被停掉 ⇒ 见 2.11.6。
v2.11.4 2026-09-28 小 模块化重构 P4:后端层实体迁移(21 文件 / 10,482 行,服务与入口留壳) 重构推进(源码组织层)⇒ 小版本 +1。后端层(cli/serve/gateway/ops/service/starthidden/ops*/windcms 服务侧 4 件/config/terms/i18n/lang/report_export/deid*)迁入 app_backEnd/app_backEnd_guanlan/;根 guanlan.py 与 scripts/<9 件> 留 CLI 壳、src/<库件> 留模块别名壳;网关—Nginx 接入点契约改名 gateway_contract.py 避免与真实现撞名;13 处 file 安装根推算改为公共层 install_root()。实逮并修掉: ① CLI 壳 sys.path 插错层;② serve/gateway 无 main()(入口在 main 守卫)⇒ 壳改 runpy 兜底;③ P0 接口契约同名挡住 git mv;④ 审计器 detail_deps 按旧路径读 serve 源码(改读新位置);⑤ 网关按同目录兄弟名找 guanlan_ops.py(改找同包 ops.py)。验收: 服务起停 + 六条路由全 200(/、/detail/v2、/detail/api/fleet、/ops、/ops/api/state、/cms/、/sim/)+ 全门禁 rc=0 + 开箱验证 5/5。
v2.11.3 2026-09-22 小 模块化重构 P3:算法层实体迁移(26 文件 / 3,858 行,逐值对拍零变化) 重构推进(源码组织层)⇒ 小版本 +1。落地: 算法层(taxonomy、audit、perf/、subsys/ 与随迁的 windcms 分析件 6 个)迁入 app_algorithmModel/app_algorithmModel_guanlan/;旧路径留兼容转发壳;跨模块依赖改经公开面(数据层 app_ETL…api,本轮为它补函数级公开名 load_10min/contracted_cols 与 slim;安装根 app_common…api)。验收=逐值对拍: 同一时间窗下 25 项算法输出(判级矩阵/七镜头曲线/M9/可靠性/四轴 registry/限电/故障/趋势/功率曲线),迁移前后 24 项逐字节一致,唯一差异为 trend.attribution_router 报出的缺件名(快照自身写产物所致);同状态重跑两次 25/25 一致(同一总哈希 ee80df59…→77319d18…→77319d18…)。实逮并修掉: ① 导入改写规则顺序误伤 windcms 侧 .data/.config(5 处);② from . import X 类模块对象导入未覆盖;③ 函数级公开名需在 api 显式暴露。全门禁 rc=0(含模块边界 R2/R3/R6/R7/R8),开箱验证 5/5。
v2.11.2 2026-09-22 小 模块化重构 P2:数据接入管理实体迁移(4 库模块 + 12 构建器,scripts 留 CLI 壳) 重构推进(源码组织层)⇒ 小版本 +1。落地: ① 四个库模块(data/scada_source/slim/mdb_names)与十二个构建器(rebuild_from_raw、rebuild_all、scada_slim_build、windscada_monthly_build、vib_raw_build、raw_scan、raw_data_check、place_raw_data、pitch_face_build、baseline_38_build、component_history_build、csv_to_mdb)迁入 app_ETL/app_ETL_guanlan/;② scripts/<同名>.py 留 CLI 兼容壳(导入实现并原样返回退出码)—— scripts/<构建器>.py 这条路径被链、审计器与文档引用约 269 处,必须保留;③ 构建器安装根推算改用公共层公开面 install_root(不再用 file.parents[1]);④ 公共层 api.py 公开 install_root,满足「模块间只经 api 调用」的边界规则。实逮并修掉: 包内相对导入(from .config、from . import scada_source、from .mdb_names 共 6 处)在换包后指向不存在的模块。验证: 12/12 构建器可导入;raw_scan --check、scada_slim_build --check、rebuild_all --dry-run(26 步 / --skip-scada 23 步)全部 rc=0;库模块旧路径别名与模块身份实测一致;guanlan.py check、config_audit、pages_audit、chain_gap、version_log、detail_deps、check_portability、products_reverse_audit、module_boundary_audit 全 rc=0;开箱验证 5/5。
v2.11.1 2026-09-22 小 模块化重构 P1:公共层九个平台件实体迁移(旧路径留兼容转发壳,零行为变化) 重构推进(源码组织层)⇒ 小版本 +1。落地: ① 九个平台件(paths/version/logfile/proc/entry_refs/console/opsjob/derived_manifest/tabfmt)实体迁入 app_common/app_common_guanlan/; ② 安装根推算由 file.parents[1] 改为 _root.install_root()(按 configs/ 与 guanlan.py 标记向上查找, 位置无关; 移深三层后仍算得对); ③ 旧路径 src/<件>.py 变兼容转发壳(sys.modules 别名, 含私有名)⇒ from src import paths as P / from src.proc import NO_WINDOW / importlib.import_module(src.version) 三种写法全部照旧, 全仓约 120 处引用无需一次性改完; ④ config_audit 的「配置取用口豁免」由按旧路径判改为按取用口所在文件判(位置无关), 以后 paths.py 再搬也不会误报 R6。⚠ P1 附带逮到并修掉的入口耦合缺陷: 安装器原先按 src/version.py 的字面量读包版本,该文件变转发壳后读不到 ⇒ 回落到读 dist-manifest.json,而 PS 5.1 的 Get-Content 默认按 ANSI 解码无 BOM 的 UTF-8 ⇒ 中文乱码、ConvertFrom-Json 抛异常 ⇒ 安装中断(开箱验证从 5/5 掉到 0)。修法: install.ps1 与 install.sh 改为按候选路径解析(公共层新路径优先,旧路径兜底),且 JSON 一律按 UTF-8 读;并新增两条门防复发 —— R6「入口与布局解耦」(安装器必须能在当前布局下解析出版本)与 R7「入口读 JSON 必须指定 UTF-8」,都并入 module_边界审计。 验证: 旧路径导入与安装根实测正确(P.ROOT/P.RAW_ROOT/P.store/P.config 全对, 模块身份同一); raw_scan --check rc=0、rebuild_all --dry-run rc=0(23 步计划不变)、三份交付文档重渲通过; guanlan.py check、config_audit、pages_audit、chain_gap、version_log、detail_deps、check_portability、module_boundary_audit 全 rc=0。
v2.11.0 2026-09-22 中 源码模块化重构 P0:七个模块目录 + 接口层 + 模块边界门(每模块只经 api 调用,可插拔) 源码组织层重构 ⇒ 中版本 +1(运行形态、交付形态与核心功能未变)。用户令: 「对观澜的源代码,按算法、数据接入管理、前端、后端 等系统模块进行重构,每个模块一个目录;遵循组件化、高内聚低耦合、可复用、可扩展(支持热插拔)、兼容性、性能优化、高可用、分布式、面向对象、代码精简;系统组件: TiDB community、MinIO、Redis、Nginx」。本轮按用户选择执行:只重构目录与接口(暂不引入四个组件,只留接入点)、零行为变化、逐版本可回滚。落地: ① 七个模块目录(每模块一个目录): app_common(公共层)/ app_ETL(数据接入管理)/ app_algorithmModel(算法)/ app_ontology(本体与知识层)/ app_backEnd(后端)/ app_frontEnd(前端)/ app_qualityGate(质量门与审计 + 打包安装);每个模块下 common/app_<模块>_guanlan/ 放观澜实现,api.py 是唯一对外公开面(PEP 562 惰性转发到既有实现,因此行为与重构前一致)。② configs/modules.yaml 模块登记表(职责/允许依赖/实现落点/迁移阶段/组件接入点)。③ 新增 scripts/module_boundary_audit.py 并接入 guanlan.py check: 查结构齐、模块间只经 api、依赖方向合规(不得反向成环)、公共层不依赖业务模块、api 转发目标真实存在;并统计迁移进度。④ 四个系统组件的接入点先立接口契约(无实现,默认仍走本地/进程内): TiDB community ↔ app_ETL 的标准仓读写接口、MinIO ↔ 源件与产物对象存储接口、Redis ↔ app_backEnd 的按时间窗缓存与作业状态接口、Nginx ↔ 统一入口与路由表接口。⑤ 设计说明新增「源码模块化布局与边界」一节(模块表 + 目录树 + 边界规则 + 分阶段迁移 P1–P7),方案全文见 docs/重构方案_模块化_v0.1.md。⑥ 三份交付文档随版本号改名重渲(内容口径不变)。验证: 边界审计 rc=0;旧路径(src/、scripts/)与页面/CLI/产物零变化;guanlan.py check、配置统一、页面归口、反向呼应、可移植性、可转移、文档三检 全绿。
v2.10.4 2026-09-22 小 数据要求说明补测点:安全链与数字输入、执行器与热管理、计数账、CMS 采集参数、位号字典 纯交付物修订 ⇒ 小版本 +1。用户令: 「测点遗漏体检的方案补进数据要求说明」。体检口径(六组真源): 现场件表头 595 个 10 分钟通道(9 前缀)· 标准仓契约 164 登记项(10 中文域)·窄仓 48 列 · 1 分钟转发层 76 列 · CMS 振动 71 项 · 状态与告警与工单与整定值 44 字段;逐列判定(参考/覆盖/缺失/待判): 595/325/151/119、164/117/31/16、48/46/0/2、76/61/11/4、71/50/19/2、44/33/6/5。三块结构性遗漏: ① din_ 数字输入 93 列几乎整片未登记(烟雾/急停/外部停机/UPS/油位/滤芯/接地刀闸/能见度);② dot_ 执行器 69 列整片为空(泵/阀/加热器/冷却器/通风),而文档把「热链与冷却」列为支撑功能;③ cnt_ 计数账 69 列只登记 6 条(外部错误小时= IEC 责任剥离并列账、OK 与可用小时、各类停机小时、寿命小时)。补齐内容: 10 分钟节新增「数字输入与安全链」「执行器命令与热管理」两域,扩充计数与统计及 tur/flg/int/prs/grd;秒级节补 11 条;CMS 节新增「采集参数与溯源要求」小节(键相/转速脉冲、窗函数、采样频率、量程与过载、序列号与配置、触发时刻、标称频率等 —— 没有键相无法做真阶次跟踪,窗函数在振动侧两侧都缺);第 5 章增「位号释义」质量要求;第 8 章收资清单增「测点与位号字典」一项(119 条待判通道没有位号释义就永远只能存而不解)。口径不变: 只写中文业务含义名 + 度量单位 + 必须性,不出现英文列名/文件名/落盘位置/机组编号/样本场现状;单位只取自已取证口径(canonical 词典 unit_majority、机型契约 unit),查不到写「未取证」;中文业务名取自 src/windscada/i18n.py 的 STEM 中译(源西门子 WTC-3 IO 表)与产物列名。验证: 严格模式(英文标识/扩展名/路径/机组编号/现状字样)0 命中;去标识化 0 命中;21 类逐类仍有四列测点表;表号引用闭合;guanlan.py check 全绿;三份 docx 重渲到 2.10.4。
v2.10.3 2026-09-22 小 交付件定名:设计说明改为「系统设计说明」(与需求分析、数据要求说明命名对齐) 纯交付物修订(文档内容未变,只改交付件名称与随之而来的引用)⇒ 小版本 +1。用户令: 「设计说明_观澜 word 文档,改名为:系统设计说明观澜[版本号].docx」。做法: ① 渲染器的交付件定义改名 —— docs/设计说明_观澜_<版本>.docx → docs/系统设计说明_观澜_<版本>.docx(封面标题、页眉、markdown 源件名一并改为「系统设计说明」);② 三份稿里指向该交付件的交叉引用与「编写依据」路径同步改名(《设计说明_观澜_…》→《系统设计说明_观澜_…》、docs/src/设计说明_观澜_….md→docs/src/系统设计说明_观澜_….md),以及"三份交付文档(需求分析、设计说明、数据要求说明)"这类并列清单;③ 仓库内的内部文档 docs/系统设计说明.md 不受影响(替换模式带 _观澜_ 或书名号,不会误伤同名内部件);④ 三份 markdown 源件随批次改名到 2.10.3,正文"当前版本"口径(系统版本行、包名、本文版本、变更级别、版本表新增 2.10.3 一行、HISTORY 计数 15 条)同步更新,历史行保留。文档内容与图表未变。2026-09-22 用户复核补记: 用户对交付的《数据要求说明》做了一处口径修改 —— 秒级 SCADA 的采样频率由「1 秒或 5 秒(二选一)」放宽为「1 秒至 30 秒之间」(共 7 个落点: 第 3.2 节正文、第 5 章质量要求、数据分类总表、必须性分档表、收资 21 项对照表、面向现场的收资清单、附录 B 收资原文第 2 项)。已按「相关内容以后照此描述」并入源件,并把该口径写进 docs/系统设计说明.md §17 的描述口径清单;附录 B 的标题与说明同步改为「第 2 项采样频率按现场最新口径」,不再声称逐字。验证: 三份 markdown 与 docx 重渲染后 delivery_docs_build --verify rc=0(目录/页码域、去标识化、数据稿去实现细节、表号引用闭合);新文件名含当前版本号,guanlan.py check 的「交付文档三件」门按新名核验通过;包内只带 2.10.3 三份 docx,无同名旧版残留。
v2.10.2 2026-09-22 小 数据要求说明改成纯数据需求规格(去现状/去实现细节)+ 新增 SCADA 秒级数据要求 纯交付物修订 ⇒ 小版本 +1。用户令: 「数据要求说明不要体现样本场的接入情况、英文测点名称、机组名称、文件名称、落盘位置,只体现测点真实业务含义名称;每类数据的测点以列表呈现(测点/字段名、业务含义、度量单位、是否必须);增加 SCADA 秒级数据的要求」。做法: ① 删掉一切样本场现状: 到位情况/缺口/催缴状态、件数体量、行数、时间覆盖、日期全部不再出现(该文只写"对数据的要求",不描述任何具体场站);机组范围改写为「全场机组(按场实际台数)」。② 去实现细节: 正文与表格不再出现英文测点名(snake_case)、文件名与扩展名、目录与落盘位置、机组编号;测点一律用中文业务含义名称(有功功率、齿轮箱油温、机舱风速…),单位取自app_ETL/configs/canonical/dictionary.yaml 的 unit_majority 与机型—场站契约的 unit,查不到就写「未取证」。③ 测点列表化: 每类数据一节 + 一张四列表(测点/字段名
v2.10.1 2026-09-22 小 交付文档对外版:去样本场标识(全文不体现具体风电场)+ 新增多场适用性章节 纯交付物修订(系统功能未变)⇒ 小版本 +1。用户令: 「修改三份文档,内容参考如东风电场,但不体现如东风电场,且具有不同风电场适用性」。做法: ① 去标识化(中文与罗马化形态一并去): 场名/业主/地域/OEM/第三方机构/系统名里的样本场代号一律换成中性表述(样本风电场 / 本场 / 业主单位(从略)/ 主机制造商(OEM,名称从略)/ 4.0 MW 级海上机组(机型代号从略)/ 观澜 v2(风电场智能分析系统));路径写成模板(data/raw/<场站>/…、outputs/<场>/…、reference/<场>/…、app_ETL/configs/contracts/<机型>_<场>.yaml、app_ETL/configs/farms/<场>.yaml、WINDSCADA_FARM=<场>),并在「编写依据」表下写明占位符替换规则;实测数字与结论全部保留,标注「样本场实测(2026-09-22)」。② 多场适用性(用户令第二句): 需求分析新增第 11 章(FR-44…FR-52 + NFR-12: 场配置化、机组与机型可替换、数据源形态可适配、阈值按场标定、术语与单位可配、跨场统一口径、按场裁剪收资、换场验收检查表);设计说明新增第 16 章(场抽象层与配置 schema、场无关引擎 vs 场相关参数分层表、换场作业单与检查表、接新 OEM/新数据形态的扩展点、换场会失效的假设如实列);数据要求说明新增第 12 章(通用必选/可选判定规则、场配置字段对照、数据源形态适配、换场收资差异清单、按场裁剪步骤)。③ 去标识化做成机器可查的硬门(不靠人自觉): scripts/delivery_docs_build.py 增 FORBIDDEN 词表并在 --check/--verify 里逐份扫描(命中即报 FAIL),guanlan.py check 的「交付文档三件」门同步带上该扫描;图表器里出现的样本场字样一并中性化(图题写「样本场实测」)。验证: 三份 markdown 源件与 docx 对 12 个禁用词 0 命中;delivery_docs_build --verify rc=0;guanlan.py check 全绿;三份 docx 与插图重渲,图表数字仍与正文同源(图解析文档表)。
v2.10.0 2026-09-22 中 交付文档三件(需求分析 / 设计说明 / 数据要求说明)与源代码化生成器 非核心功能新增(交付物)⇒ 中版本 +1。用户令: 「整理观澜的需求/设计/数据接入,各写一份 Word 文档,要求区分章节目录、文表图并茂、字体字号分类统一;数据要求说明结合现场《数据分析收资要求-v3.docx》」。① 新增三份交付文档(落 docs/,文件名带本版本号): 需求分析_观澜_2.10.0.docx(需求来源与演进、角色场景、功能需求 FR、非功能需求 NFR、页面与信息架构、验收门、需求跟踪矩阵)、设计说明_观澜_2.10.0.docx(总体架构、目录与路径真源、重算链、判级与算法、时间窗口径、服务与前端、本体与模型、运维编排、安装与版本、质量保证、安全与边界、可移植性)、数据要求说明_观澜_2.10.0.docx(数据分类总表、逐类要求、核心测点/字段/单位/必须性、质量与对齐、落位流程、收资要求 v3 的 21 项逐条对照、缺失与替代、核对锚点、面向现场的收资清单); ② 两份源件均源代码化(用户令「所有的计算均要形成观澜的源代码」): scripts/delivery_docs_build.py 把 docs/src/*.md 渲染成 docx(Word 域目录 + 标题/正文/表格/图题四级字体字号分类统一: 黑体标题 + 宋体正文小四 + 表格五号 + 图题五号居中, 页眉页脚页码, 附录排版规范); scripts/delivery_docs_figures.py 生成 14 张插图, 每张图的数字都从真件取: src/version.py 的 HISTORY、configs/portal_pages.yaml、configs/serve.json、data/raw/<场>/**、outputs/<场>/**、并落 guanlan.py check 与 rebuild_all.py --dry-run 的实跑底稿到 docs/src/_*.txt(可复核); ③ 文档口径遵循用户令 §17: 含"窗"且指时间窗口写全"时间窗"、影响机组写"影响机组数"、英文简写写"中文(英文简写)"(平均无故障间隔(MTBF)/平均停机间隔(MTBO)/单次停机时长(MDT)); ④ 不确定与缺件一律如实写(测风塔零交付、m5_cms_tcm 正本缺失由观澜自算件顶上、故障录波仅 4 台、远端未装 Ollama),不编造; 每份文档附「编写依据」表逐章列出源文件; ⑤ guanlan.py check 增一行「交付文档三件 · v<版本>」: 校验三份 docx 在位且文件名含当前版本号、markdown 源件与所引插图都在位 —— 否则升一次版本号, 旧文档名就悄悄过期(同名旧版会跟着进包); ★2026-09-22 用户令「三份文档不同步到远端服务器」⇒ 该行先看 docs/src 在不在: 不在 = 本机是不随文档的部署(远端演示机即此),只报提示行、不 FAIL,且在 import python-docx 之前分流(那台机未装该依赖,直接进渲染器会炸成 ModuleNotFoundError)。
v2.9.2 2026-09-22 小 升级后验收补缺:版本/文档漂移有了自动拦截点(重算链增 ⑧d 版本记录门) 纯消缺 ⇒ 小版本 +1。检查: 远端 2.9.1 升级 + 重算完成后跑 guanlan.py check,出现两处 FAIL —— ① docs/版本记录.md 与 src/version.py 不一致(version_log rc=6);② 安装根多出 _pre290_backup/(16 件扁平旧副本)让 config_audit rc=8。根因: 这次升级的差异盘点只覆盖 src/+scripts/+configs/(remote_src_inv.py),文档从不在盘点面上 ⇒ 代码升到 2.9.1、文档留在旧版(版本记录 13,277 vs 21,284 字节、系统设计说明缺 §17);而重算链里没有版本门(rebuild_all 只到 ⑧c 页面归口审计),于是 24/24 步全 OK、控制台写"重算完成",漂移照样静默过关 —— 没有任何自动拦截点。解决: ① scripts/rebuild_all.py 增「⑧d 版本记录一致性」(version_log.py --check,tolerate=(6,) —— 与 ⑧c 同口径: 缺的是"文档同步"这一路,报出来但不打断整条链);② 远端补齐 4 份文档(版本记录/系统设计说明/输入数据放置指导/detail 页面依赖台账),逐件 sha256 与本地一致;③ 远端把 _pre290_backup 移出安装根到 D:\产品\_pre290_backup_20260921(备份保留,不删除)。验证: 远端 version_log.py --check rc=0、config_audit.py rc=0;本地 guanlan.py check 全绿 + 反向审计/页面归口/chain_gap 全 rc=0。遗留(如实记录,未处理): 远端没有装 Ollama(无二进制、PATH 无、11434 拒绝连接)⇒ 本机模型探针在远端必然 FAIL,问答/升档类功能在远端不可用;要不要在远端装 Ollama 与拉哪几档模型,等用户定。
v2.9.1 2026-09-22 小 人工测试 7 项消缺(描述口径 + 依据空白 + 问题页空 + 门户链接 404 + 闭环文案 + Ollama 档位) 纯消缺(无功能增减)⇒ 小版本 +1。逐项「检查→根因→解决→验证」: ① 描述口径: 「窗」确实指时间窗者一律写「时间窗」(预设窗→预设时间窗、判级窗→判级时间窗、窗内→时间窗内、证据窗→证据时间窗、随所选窗→随所选时间窗…;天气窗/作业窗/预览窗/观测窗属领域词,保持原样);「影响台」→「影响机组」(含报告构建器表头);英文简写改「中文(英文简写)」(平均停机间隔(MTBO)/平均无故障间隔(MTBF)/单次停机时长(MDT)),英文映射键同步; ② 需要关注「查看完整依据」空白: 根因=行的来源是融合面链盘(d.fus.链盘.rows),依据却只从 SCADA 的 d.watch 查 ⇒ 两边机组集合不同时 why[t] 为空(实测 WTG09 齿轮箱 bad 台)。改为按本行字段自组句(部件/链路进度/卡在哪步/证据源),永不空; ③ 报警机组「该问题页」打开空白 + ⑤ 命中系统链接: 根因=链接传slug(pitch)而页面/接口按中文系统名取数 ⇒ /api/problem 返回 0 条,页面还写"该系统在判级窗内无非常态"(对报警机组是假陈述)。改为: 链接传中文名 + 服务端 sys_norm() 双向归一(slug/中文/大小写都认)+ 页面区分"系统标识无法识别 / 本时间窗无异常"两者,绝不把认不出说成正常; ④ /turbine 页「返回观澜门户」→ 原写死 http://127.0.0.1:18084/观澜_如东样板_门户_单文件.html(用户机器上等于访问自己的 loopback,且该文件服务端没有)⇒ 网关回 not found。修法: 用根相对 /,并给网关加 data-abs="1" 豁免(作者显式声明某链接不按组件前缀改写,否则根相对链接一律被改写成 /detail/… 永远回不到门户),普通链接前缀行为不变(有单测); ⑥ 振动「端到端闭环」文案: 去掉内部黑话 handoff,改为「暂无端到端闭环证据:现场提交的振动数据包里没有「报警→检修→复测」的成对记录」; ⑦ 观澜↔本机 Ollama: 链路实测可用(探针 OK、/api/ask 提交成功、8B 出答但未过校闸→触发升档),但升档目标硬编码在 src/ontology/fast_agent.py 的 ESCALATE(写的是本机没装的 qwen3.8:27b,configs/models.json 只是同处笔误的另一份)⇒ 升档 digest=None、ask 终态 error(用户只看到"复核中")。修法: ESCALATE 改 qwen3:32b + 新增 installed_models()/escalate_target() —— 升档目标按「配置档位且确已安装」解析,没装则响亮回落并打日志,不再把答案静默卡死;初答文案里的"27B"改为实际目标名;BUDGET_S 随档位更新(32B 给 120 s)。验证: escalate_target("qwen3:8b") → qwen3:32b(本机实装 4 档实测);另: 远端 106.120.102.238 与本地各跑一遍 HTTP 抽样(门户链接=/、slug 归一出 1 条问题、文案含时间窗/影响机组/(MTBO)、闭环新文案、WTG09 依据不再空),网关改写 data-abs 豁免单测通过,config_audit/pages_audit/反向审计/raw_scan selftest 全 rc=0,guanlan.py check 全绿
v2.9.0 2026-09-21 中 时间窗真正生效(用户令):「部件问题」与「发电性能」随所选窗重算,并新增自定义起止日期窗 功能增减改 ⇒ 中版本 +1。要点: ① 窗口词表新增自定义起止日期(YYYY-MM-DD~YYYY-MM-DD,含两端):months_of() 取相交月、新增 win_range()/in_win() 供日粒度件做含端过滤;v2 顶栏加两个日期输入框 + 应用(校验 a≤b),月度件按所跨月取整、日粒度件按日精确,页上写明; ② 判级四轴按窗重算:taxonomy.system_matrix(span=…) 把窗透到 变桨(日粒度件切片, 精确)/偏航/蓄能/温度(走新窄仓重算);reliability.overview(span=…) 让部件可靠性表按窗;温度面的 ref/ref_sm 对照窗仍固定(季节解耦基线,跟着漂就失去对照意义); ③ 发电性能按窗:/api/curves?win= 七镜头按窗重算 + 7 张月度时序图按窗过滤;选到 2025-07~2025-12(限电前干净判别窗)时直接用正式产物不重算;④ 新产物 windscada/slim10min/*(公共列子集,不裁剪行)作按窗重算底座:一次全量扫≈2 分钟,把"每换一个窗重读 15 GB"降到秒级;已进重算链 ③b 并登记反向审计族表; ④b M9 控制参数一致性(就摆在发电性能页上)此前仍钉死 2025-H2 ⇒ control.registry(span=…) 按窗重算(窄仓补 grd_wtc_ActPower_max/tur_wtc_GenRpm_max 两列 ⇒ 48 列;≈0.6 s/窗,P封顶中位 4190(干净窗) → 4181.7(2026年) / 4177.5(2026Q1)),fleet 响应加 m9_pending/win_pending 并由页面轮询(5 s)—— 至此判级四轴 + 可靠性 + 控制参数 + 七镜头 + 7 张月度图全部随窗;远端两窗对比只剩 all_months/note/*_pending 三个元数据键不变; ⑤ 按窗重算一律"后台算+进程缓存"(判级≈25 s/窗、镜头≈10~45 s/窗):命中即回,未命中先回 pending/building 并由页面轮询,不静默拿旧口径当新窗;启动时后台预热 6 个预设窗(判级+默认窗镜头); ⑥ 实测(本机 38 台): 判级逐系统报警台数随窗变(变桨 15/13/10、偏航 15/11/5、齿轮箱 7/4/4 对应2026年/2025H2/2026-07),曲线图注窗=所选窗且样本量随窗变;验收: 反向审计 3548 件 0 未归类、pages_audit/detail_deps/config_audit/raw_scan(selftest,rc=0)/chain_gap 全绿;⑦ 远端部署(D:\产品\app,2026-09-21)实逮两处并已修: (a) 预热与请求各自起线程 ⇒ 同时算两份按窗中间帧,改为重活全局串行(_HEAVY_LOCK)并打印可用内存;(b) 退化窗("近30日"=2026-09只有 1 个节拍 ⇒ 比档件为空)时 groupby().apply() 返回空表 ⇒ .rename("dev_K") 抛 TypeError 把整面判级打断,改为如实"不可判(样本不足)";另: 远端进程须由 Windows 服务 guanlan 托管(SSH 会话里起的进程会随会话关闭而死,实测全端口消失 ⇒ 已装服务并 RUNNING),远端核验: fleet 两窗 pending→就位、变桨报警 15→7 / 偏航 15→3、rel 窗随窗、curves 图注"窗 2026-07-01 ~ 2026-07-31 (随所选窗)"、v2 页含自定义起止控件
v2.8.2 2026-09-21 小 消缺:扫描器的"变化"判据被两类非摄入件常年占住 —— 现场按类目交付的月度通道组库(scada_mdb/<年>年/<月>月/<年>-<月>-<类>.mdb)被当成"数据没人读·缺口",用户指定的按月提取件(<场站>/scada_10min_<YYYYMM>.csv)被当成"未归类";两者每次扫描都计一次变化 ⇒ raw_scan --check 永远 rc=4,rebuild_all.py --auto 与 raw_watch 会每轮都以为来了新数据 纯消缺(无功能变化)⇒ 小版本 +1。要点: ① CONSUME 新增 upstream 口径(信息级):类目库是 10min 同台补充件的上游,取数层不直接读它 ⇒ 不再算缺口、不计变化,改按"上游归档件(要先转换才被消费)"列出并写清转换口径; ② 新增 IGNORE_PATTERNS:scada_\d+min_\d{6}\.csv 是按月提取/核对件(位置由用户指定、不是摄入源)⇒ 不报未归类、不计变化;③ 实测(2026-09-21 落位 7-8 月交付后):修前 --check rc=4 且每轮都报"2 处变化",修后 --check rc=0「与上次快照一致,没有新数据」,--selftest 通过,24 件类目库如实以信息级列出; ④ 口径写进 docs/输入数据放置指导_v0.1.md §4.1(含 12 组中文目录↔类目码、9 类↔主件 595 通道一一对应、float32+ISO 对齐、以及"类目库→同台补充件"的落位转换)
v2.8.1 2026-09-20 小 消缺:重算链末步「台账等价验收」在全新机器上必然 rc=5(交付包不含产物 ⇒ 没有随包基线),原先把它判成失败 ⇒ 门户上写"重算失败"(实测服务器 2.8.0 一轮 24/24 步全 OK 却整轮 rc=1) 纯消缺(无功能变化)⇒ 小版本 +1。要点: ① rebuild_all.py 的 ⑧ 台账等价验收由 tolerate=(4,) 改成 tolerate=(4, 5) —— rc=5 = "找不到随包基线 ⇒ 没做验收",与 ④ 的口径对齐(④ 一直容忍 5 并写明"跳过等价验收≠通过");步名与步说明都改写清楚"rc=4 = 有需人工看的差异 / rc=5 = 没基线 ⇒ 没验收(不是失败,也不是通过)",并指路 scripts/set_baseline.py(用已核实的当前产物快照登记基线,之后这一项才会真比对); ② 远端复核(服务器 D:\产品\app): 该轮 24 个实质步骤全绿(①b 扫描 53.7s · ② 164s · ③ 1025s · ④ 99s · ④b 2118s · ④c 385s · ④d 41.6s · ④e 15.3s · ⑤b/⑤c/⑤a/⑤ · ⑥ · ⑦×6 · ⑦b 78s · ⑧ 7.1s · ⑧b 3s · ⑧c 9.5s),只有第 25 步判失败;且同批数据已真进产物:temp_monthly 21 个月、末四格 2026-06/07/08/09、2026-08 = 1,026 行(服务器 scada_10min 也有 76 件含 38 个 WTG??-B2.csv 同台补充件,说明步骤 B 的同台多件合并已在服务器上生效); ③ 已把修好的 scripts/rebuild_all.py(+ src/version.py / docs/版本记录.md)单文件部署到服务器,无需重装整包。交付包 app_guanlang_v2.8.1.zip
v2.8.0 2026-09-20 中 输入数据自动扫描识别:<安装目录>/data/raw 逐族指纹 → 发现新增/变化 → 指明该跑哪几步;重算链加 ①b 步 + rebuild_all.py --auto(新数据不被 --skip-* 漏掉)+ 服务侧可选看门狗 非核心功能新增 ⇒ 中版本 +1(无架构改动)。要点: ① 新增 scripts/raw_scan.py(用户令 2026-09-19「对 <安装目录>/data/raw 目录下的接入数据处理,增加自动扫描识别机制,以能发现新增数据,并纳入重算」):逐族指纹 = 件数/体积/最新落盘时间/清单摘要(--deep 再叠内容哈希),与快照 outputs/<场>/_raw_scan.json 比;rc: 0 无变化 · 4 有新增/变化 · 5 还没有基线; --write 记基线, --json 给机器读, --selftest 对账"族表覆盖反查族表里所有 raw 输入 + 步骤名都能在链上找到"(防两处漂移); ② 族表把每个 raw 子目录映射到链上步骤(故障报警/工单/油样→②;scada_10min→③④④c⑤b;scada_1min→④c;scada_mdb→③④④c;windcms→④b④d④e;m5_cms_tcm→④b;西门子4.0技术资料→⑦),data/raw/<场>/ 下出现族表没有的目录则如实报"未归类、没有已知消费者"(不猜); ③ 进重算链作 ①b 步(--check --write,容忍 rc=4/5,并在步说明里写清"4 = 有新数据不是失败"); ④ rebuild_all.py --auto:先扫一遍,新数据落在被 --skip-scada/--skip-vib 跳过的族里就自动取消跳过(实测: scada_10min 新增 1 件 → 计划从 22 步变 24 步并打印取消原因); ⑤ 服务侧看门狗(scripts/service_worker.py::raw_watch,配置 configs/serve.json 的 raw_watch,默认关):每 N 分钟扫一次,有新数据写 logs/service.log 并列出该跑的步;auto_rebuild=true 时顺手发起一次重算(走 ops 同一条路;run/ops_job.json 显示在跑则不重复发起)。★2026-09-20 按用户令「对 data/raw(含嵌套子目录)下文件的增减做到监听;重算要按该目录最新的变化算」逐条查证并补了三处: ⑥ 扫描改成递归统计全部文件(不限扩展名; 白名单命中的另记 matched, 差额单列为"信息,不计变化")+ 子目录清单进指纹(新建空目录也发现) + 未归类改成全树逐件找(不再只看一层); ⑦ 产物 = 当前源件的函数(删/换源件后, 那些行不再产出并大声报出"哪几件不在盘、少多少行、涉及哪些月"): 报警/工单/油样三个摄入器原先是"只替换本次涉及的件、其余原样保留" ⇒ 源件删了行还在; ⑧★报警台账改键集合并集去重(键=Name/Alarmcode/TimeOn, 归属取最窄的源件)—— 原先按"逐件累加、没新键就跳过"的贪心判快照, 实测删一个源件反而让总行数从 39,211 涨到 56,593(被跳过的大快照件整件摄入, 重复计数) ⇒ 既不是源集的函数也会虚增; 现在 39,211 键稳定、重复 3.6 万行如实去掉; ⑨ 振动窗: 同名窗已存在时原来一律改名 _reimport(被 EXCLUDE_DEFAULT 排除 ⇒ 补进来的 CMS 数据根本进不了生产集), 现在默认替换同名窗(旧窗留档 _superseded_<时分>, 已加入排除表; 要旧行为用 --reimport-as-new)。★另按用户令「按你的建议执行 先 C 再 B」补完"同台多件 10min 进不来"这条链: ⑩ 步骤 C(让"放了没人读"当场可见):raw_scan.py 新增 CONSUME 表(逐族写清消费者真实取数口径),判据从"扩展名白名单没命中"改成"全部文件里没被消费者读的"—— 实测 data/raw/如东/scada_10min/WTG01-B2.csv(856 列 / 2026-08 数据)扩展名 *.csv 命中白名单,旧判据永远发现不了它;现在报成缺口级(计入变化 rc=4 + ★[缺口] 块写明消费者口径与件例),附件类(.rar/.jpg/厂商软件)仍只列信息;建议行也分流说明"缺口类重算也纳入不了"。raw_data_check.py 同步: 同台补充件不再误报"文件名不是本场机组",改为 info 行。⑪ 步骤 B(真正把新月份的 10min 件吃进来):scada_source.load 取数从"只认 <台号>.csv"扩到 <台号>.csv + 同台补充件 <台号>-*.csv/<台号>_*.csv:按列名对齐(新导出把类型前缀去掉了: din_wtc_HydLevel_timeon → wtc_HydLevel_timeon,实测老件 598 列里 597 列能这样对上)、按时间戳排序去重(主件优先,重叠条数写进 attrs.scada_overlap 并打印)、来路件名与各件行数写进 attrs.scada_files/scada_rows。实测 WTG01:主件 77,551 行 + 补充件 5,820 行 → 合并 83,353 行(重叠 18 行去重),时间范围由 2026-07-07 延到 2026-09-01,2026-08 的 5,819 行关键通道非空率 77%(空白是源件自带的:该月 144 行/日齐全但约 23% 行的通道为空,如实保留 NaN)。交付包 app_guanlang_v2.8.0.zip
v2.7.0 2026-09-19 中 远程部署消缺:振动窗发布被杀软/索引占用不再打断整条重算链(+ --publish-only 恢复通道);门户可对外监听(public_host,组件仍只本机);GBK 控制台打印不炸 一次消缺 + 一项非核心功能新增(对外监听)⇒ 按规则取最高一级(minor)。要点: ① ★远端实逮(服务器 D:\产品\app):索引 719 s + 谱 894 s 落进 windows_staging_ingest 后,staging.rename(final) 回 PermissionError: [WinError 5] 拒绝访问(360 实时扫描/索引器持着刚写的 1710 件小文件的句柄,Windows 的目录改名要求树里无打开句柄)⇒ ④b 失败 ⇒ 链停在第 4 步,页面表现为「需要关注 0 台 + 融合面缺件」。修法:发布改 _move_tree()(整目录 rename 退避重试 → 逐件搬,rename 不行就 copy+删 → 仍锁住的逐条如实报出);并加 --publish-only:已算完的暂存窗可直接发布,不必白等 25 分钟重跑索引/谱; ② 用户令「观澜改为监听所有 IP」:configs/serve.json 增 public_host(空=跟 host=只本机;设 0.0.0.0=所有网卡),只有门户网关用它,detail/cms/viewer/sim 仍绑 127.0.0.1 ⇒ 对外只有 28084 一个入口;启动时打印对外地址并提示"页面无鉴权,请在防火墙侧限来源"; ③ 消缺: 新生成端在 GBK 控制台打印 m/s² / ⇒ 时抛 UnicodeEncodeError(远端 baseline_38 整件没出)⇒ 四个生成端加 stdout 守卫;trend_ingest 的"台账止 2024-11"过期断言改实话;CMS 三层基线卡的"健康期窗 N"重复措辞; ④ 部署口径: 用 SSH 起的服务在会话断开时会被一起收掉 ⇒ 现场改注册 Windows 服务(guanlan)(scripts/service_ctl.py install),开机自启、SCM 崩溃重启。交付包 app_guanlang_v2.7.0.zip
v2.6.0 2026-09-19 中 「所有的计算均要形成观澜的源代码」:融合面/总览页/事实契约/发布层/掩码阈值/六层链两步/变桨面/振动在升与三层基线 全部落成观澜自算;SCADA 接入兼容 CSV+MDB;交付包带输入数据目录结构(不含文件) 功能新增为主、夹带多项消缺 ⇒ 按规则取最高一级(minor)。要点: ① 六层链 model_run/fusion 两步按口径重建(报告的"融合级"列从此有值)+ energy_share 步补上 + 峰值拾取口径定案(观澜口径,四件 *_freq_scan 形式不再复刻); ② 融合面 handoff 与总览页 windscada/index.html 由观澜自算生成(原为"包内无生成端",新机器上 /detail/v2 的"需要关注/全场状态"必空白); ③ 事实契约改为从重算台账生成 claim(门户结论段/问答/报告随重算刷新,/api/facts 不再 503); ④ 本体发布层 r1/r2、TCM 掩码阈值(观澜自算口径,非厂商)分别落成生成端; ⑤ SCADA 接入统一取数层兼容 CSV 与 MDB(含老库列位错位如实拒绝;37 个月库按修好的建库脚本重建并逐分片对拍); ⑥ 变桨面 pitch/** 落成生成端(10min 开关量/压力锯齿 + 1min 桨距角;零位口径按用户令停机段/满发段分列,并据实测反推补上运行段同工况分档这一真正的判据轴 —— 它能把现场确诊的 19# 单独拎出来); ⑦ 振动 component_history.json(在升/换件闭环)与 baseline_38.json(自/机群/绝对三层基线)落成生成端(窗数不足时如实空表并写明数据边界); ⑧ 打包:带输入数据目录结构(30 个空目录, 含 data/raw/西门子4.0技术资料)+ 放置说明文件随包, 仍不含数据文件; ⑨ 消缺: report 步踩可选包 tabulate 致整链中断、语言包闸拦下的 /v2 500、振动页看不出数据区间与"3 月数据消失"(趋势按日聚合)、账目单位错(kWh/MW)、Access 锁文件误报、日志保留策略等。交付包 app_guanlang_v2.6.0.zip
v2.5.0 2026-09-17 中 卸载闭环(uninstall.bat / uninstall.sh)+ 版本管理与打包命名规则 + 版本记录 二代架构(大版本 2,与 NAME 里的 v2 对齐)的第 5 次功能性发布,无消缺项;交付包 app_guanlang_v2.5.0.zip
v0.4.0 2026-09-17 旧编号 打包默认不含 输入数据/产物/日志/临时文件;无窗口启动(去掉 VBScript);统一配置与日志;页面归口审计;输入数据放置检查;安装时版本检查与服务化 旧编号体系;交付包 app_guanlan_v2_0.4.0.zip(= guanlan-v0.4.0_dist_20260917.zip)
v0.2.0 2026-09-01 旧编号 含产物的旧交付基线(历史上用作"包内无生成端"那批产物的补救源;该用途 2026-09-19 起已失效) 旧编号体系;交付包 guanlan-rudong-v2_0.2.0_test_win64.zip —— ★2026-09-19 用户令从工作树清理(943 MB):① 「所有的计算均要形成观澜的源代码」落地后无生成端件 = 0(反向呼应审计 1,800 件全部 raw-derived)⇒ 它作为"补救源"的用途消失;② 该包仍留在 git 历史里(blob 可随时 git 取回),需要时用 git show 恢复即可

本次交付

  • 版本:v2.14.0(观澜·如东样板 v2)
  • 交付包:app_guanlang_v2.14.0.zip
  • 服务名:guanlan(Windows 服务 / systemd 单元)
  • 安装 / 卸载:install.bat、install.sh / uninstall.bat、uninstall.sh