# -*- coding: utf-8 -*- """版本与安装信息的**唯一真源**(2026-09-17 用户令 1:安装时检查已装版本、提示差异、问是否重装)。 为什么单开一个模块:以前版本号散在三处(`scripts/pack_dist.py` 的 `VERSION`、README 抬头、说明书标题), 改一处忘一处就会出现"包说 0.4.0、安装记录说 0.2.0"这种对不上的事。现在: src/version.py ← 唯一真源(本文件) scripts/pack_dist.py ← 读它写进 dist-manifest.json 与默认包名 install.ps1 / install.sh ← 读它写进 <安装目录>/install-info.json,并与已装的比对 guanlan.py / 各文档 ← 读它(文档里的人工版本号以它为准) `install-info.json` 落在安装根本身(不在 run/ 里):它是**交付物级别的安装记录**, 卸载/重装/拷机都要跟着走,所以和 `configs/`、`dist-manifest.json` 同级。 """ from __future__ import annotations try: from ._root import install_root as _install_root except ImportError: # 直接当脚本跑(python <本文件>)时没有包上下文 from _root import install_root as _install_root import datetime as dt import json import pathlib NAME = '观澜·如东样板 v2' VERSION = '2.80.1' # ★ 版本只改这里 EDITION = 'offline-single-package' PACKAGE_STEM = 'app_guanlang' # 交付包文件名前缀(用户令 2026-09-17) INSTALL_INFO = 'install-info.json' # 相对安装根 SERVICE_NAME = 'guanlan' # Windows 服务名 / systemd 单元名(用户令 1) SERVICE_DISPLAY = '观澜·如东样板 v2 (Guanlan Wind Asset Intelligence)' # ── 版本号规则(用户令 2026-09-17)──────────────────────────────────────────────── # 编号: v<大版本号>.<中版本号>.<小版本号> 例: v2.5.0 # 定义: 大版本号 —— 系统解决方案、架构或核心功能改变 # 中版本号 —— 非核心功能新增、减少、修改 # 小版本号 —— 消缺完善 # 包名: 打包文件名 = app_guanlang_v<版本号>.zip 例: app_guanlang_v2.5.0.zip # 用法: 用户/发布者定"这次算哪一级"→ VERSION 改一行 → 打包器与安装脚本自动跟着变 # (级别判据见 BUMP_RULE;一次发布混了几类就取最高那一级) RULE = 'v<大版本号>.<中版本号>.<小版本号>' LEVEL_MEANING = { 'major': '大版本号 —— 系统解决方案、架构或核心功能改变', 'minor': '中版本号 —— 非核心功能新增、减少、修改', 'patch': '小版本号 —— 消缺完善', } BUMP_RULE = ('改动落在"解决方案/架构/核心功能" → 大 +1(中/小归 0);' '落在"非核心功能的新增/减少/修改" → 中 +1(小归 0);' '只是"消缺完善" → 小 +1;一次发布混了几类,取最高那一级') # 版本记录(人读的那份由 scripts/version_log.py 生成到 docs/版本记录.md;这里只有事实,不重复描述) # level: major/minor/patch 表示这一版**相对上一版**是哪一级变化;legacy 表示该版用的是 # 旧编号体系(0.x,未按本规则),仅作历史对账用。 HISTORY: tuple[dict, ...] = ( dict(version='2.80.1', date='2026-10-04', level='patch', title='振动融合分析(含 5 个子页面)与 v2.9.2 差异核定;修 cms 子页面未取 /api/vibcms', note='用户令:核定「振动融合分析」中所有页面(含子页面)与 v2.9.2 的差异并修改。① **判据补强**:`tools/struct_diff.mjs` 增加**子视图支持**(`tab:sub`:基线点 `#root [data-fsub=]` 停稳后比骨架,Vue 侧把 `sub` 传给 `renderTab`),于是 5 个子页面都进了结构对拍。② **结构**:vibration `matrix/loop/units/events/cms` = **5/5 一致**(1126 / 13 / 3398 / 626 / 543 个元素)。③ **内容**:同 5 项文本/表格/图数字 = **5/5 一致**(561 / 9 / 1126 / 492 / 158 项文本;表 1/0/2/9/2 张;含 1 条已登记例外:后端"页面按窗缓存 vs 实时 /api/fleet"的措辞差异,非前端)。④ **实逮到一处真实差异(工具此前掩盖)**:旧页在选中 cms 子视图时会**按需异步取 `/api/vibcms`**(`app.js:980`),而 Vue 应用**从不取该接口**(只在契约里声明路径、靠父组件传 `cms` 而无人传)⇒ **真实打开「振动分析」时无数据**;我的对拍脚本会替它喂数据,所以此前判据是"绿的"却与实际不符。已修:`Vibration.vue` 选中 cms 时按需 `fetch(\'/api/vibcms\')`(prop 优先,保持对拍同源口径 + `cmsErr` 兜底)。**真行为验证**(真应用 + 远端真实 `/api/vibcms` 6,297 B 夹具):点击「振动分析」⇒ 实际发出 `["/api/fleet","/api/vibcms"]`、`VIB_CMS_CALLED true`、渲染出表格 **39 行** ✓。'), dict(version='2.80.0', date='2026-10-04', level='minor', title='页签精简(去「架构与资料/门户」、数据重算并入系统维护)+ 删除页头模式按钮(修布局乱)', note='用户两项:① **页签精简** —— 工作台页签由 14 减为 **11**:去掉「架构与资料」(其首个子选项卡即"系统架构")与「门户」;「数据重算」不再单列页签,改为并入 **系统维护** 页签内的一个区块(`System.vue` 内渲染 ``)。现页签为:总览 · 电量算账 · 部件问题 · 振动融合分析 · 发电性能 · 故障统计 · 检修决策 · 检修助手 · 汇报定制 · 系统维护 · 交付文档。② **修布局乱** —— **实逮**根因:页头里还残留一组"模式按钮"(工作台 / 契约自检 / 关于本前端),它们用的容器也是 `