|
@@ -80,8 +80,42 @@ start.bat.bak-healthz
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-## 场站扫描辨识 + 两个验收场景 (2026-09-11)
|
|
|
|
|
|
|
+## 路径跨平台化(①+②, 2026-09-11)
|
|
|
|
|
|
|
|
|
|
+**用户令**: 后续部署到其它电脑; 兼容 Windows / Linux; **系统内目录路径必须使用相对路径**。
|
|
|
|
|
+
|
|
|
|
|
+**三条口径**(写进 `docs\数据目录结构与落位约定_v0.2.md` §7, 并由门禁自动检查):
|
|
|
|
|
+① 只写相对路径(相对**安装根**), 不写机器绝对路径;② 相对基准是安装根、**不是 cwd**, 一律经 `src\paths.py` 解析;
|
|
|
|
|
+③ 写进产物/清单/页面的用 POSIX 相对形式(`P.rel()`), 显示给人看时才用本机分隔符(`P.disp_dir()`)。
|
|
|
|
|
+
|
|
|
|
|
+**新增**
|
|
|
|
|
+- `src\paths.py` —— 唯一路径真源(`ROOT/RAW_ROOT` + `store()/ont()/cms()/m5()/sop()/guanlan()/pitch()/tcm_replay()`
|
|
|
|
|
+ + `RELEASE/PORTAL/VIEWER/SIM_DIR/LOGS/RUN` + `rel()/disp()/disp_dir()/resolve()/venv_python()`)。
|
|
|
|
|
+ `ROOT` = env `WINDSCADA_ROOT` → 否则按本文件位置回溯 ⇒ **整个安装目录可整拷到别的电脑/别的盘**。
|
|
|
|
|
+- `scripts\check_portability.py` —— 静态门禁: 机器绝对路径 / cwd 相对字面量 / `os.sep` 拼库存字符串 = ERROR;
|
|
|
|
|
+ 例外必须具名登记理由。**当前通过**。
|
|
|
|
|
+- `scripts\page_fingerprint.py` —— 10 个端点的回归指纹(`status` + 归一化 sha256, 自动剔除 `checked/ms/repo_head`
|
|
|
|
|
+ 这类设计上会变的字段、并把安装根前缀归一成 `<ROOT>`)。换机验收也用它: 基准机 `--save`, 新机 `--diff`。
|
|
|
|
|
+
|
|
|
|
|
+**清理的机器绝对路径**(换机必失配, 且是静默故障): windcms `MAIN_ROOT` 默认 mac 检出、windcms/ontology 写死的
|
|
|
|
|
+mac venv 解释器、`kb_ingest` 的 mac 技术资料路径、`ingest_ops_2025` 的 `/Volumes/BIG/…`、`place_raw_data` 的
|
|
|
|
|
+`F:\temp\…`、界面占位符里的 `/Users/…`。**清理的 cwd 相对路径**: 20+ 处 `Path('outputs/rudong/…')`(ontology 14 个
|
|
|
|
|
+模块、windscada 4 个、windcms、serve/gateway、sop 8 个)全部归到 `paths`; `sop` 里写死的 `rudong` 改为跟场走。
|
|
|
|
|
+
|
|
|
|
|
+**配置/安装器**: `configs\serve.json` 的 `python` 改为相对(`.venv/Scripts/python.exe`); 启动器 `py()` 支持
|
|
|
|
|
+"相对→按安装根解析 / 绝对 / 留空自动探测 venv"; `install.ps1|sh` 写配置时写相对路径。
|
|
|
|
|
+
|
|
|
|
|
+**验证**
|
|
|
|
|
+- 门禁: 运行期 0 处机器路径、0 处 cwd 相对, `os.sep` 只留在显示函数里 ✔
|
|
|
|
|
+- 回归指纹: 改造前后 **10/10 端点逐字节一致** ⇒ 只换了路径解析, 页面与取数面零变化 ✔
|
|
|
|
|
+- 换 cwd 实测: 从 `C:\` 且不设 `PYTHONPATH` 跑 `scan_stations.py` / `farm()` → 场站辨识与 `store/src_10min` 均正确 ✔
|
|
|
|
|
+- 过程中我自己引入并修掉两处: 服务端 `from src import paths` 插在 `sys.path` 引导之前(导致 detail 起不来),
|
|
|
|
|
+ 以及 `subsys` 子包导入深度写成两点(应为三点)。这两处都是**靠"重启+指纹比对"逮到**的 —— 印证了那把尺子的价值。
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+## 场站扫描辨识 + 两个验收场景 (2026-09-11)
|
|
|
|
|
+
|
|
|
**用户令**: 离线数据统一放 `data\raw\`, **下一级目录约定为「场站名称」**, 观澜系统**扫描辨识**。
|
|
**用户令**: 离线数据统一放 `data\raw\`, **下一级目录约定为「场站名称」**, 观澜系统**扫描辨识**。
|
|
|
|
|
|
|
|
- `src/windscada/config.py`: 新增 `scan_stations()` / `station_scan()` / `station_report()`; `_expand()`
|
|
- `src/windscada/config.py`: 新增 `scan_stations()` / `station_scan()` / `station_report()`; `_expand()`
|