Forráskód Böngészése

现场收资落位: 25年.zip/26年.zip 放入 data/raw/如东/scada_mdb(新约定层, 已登记进 STATION_SUBDIRS 与 raw_data_check.EXPECT)

用户令: 25年.zip、26年.zip 替代 10分钟数据.zip、1分钟数据.zip, 放入 <安装目录>/data/raw/如东 的对应路径下。

· 落位: data/raw/如东/scada_mdb/25年.zip (1,071,376,695 B, sha256 E451FF68…) 与 26年.zip
  (1,007,354,282 B, sha256 0B641309…) —— 与源目录逐字节 sha256 一致(已核)。
· 为什么单开 scada_mdb/ 一层: 年度归档内层是**每月 12 类** Access 库
  (cnt din dot flg grd int prs scd std sum tmp tur), 不是"一台一个 CSV"; 硬塞进 scada_10min/
  会破坏该目录"平铺 每台一个 csv"的既有约定(R2 规则)。
· 新约定登记进两处真源: src/windscada/config.py::STATION_SUBDIRS += 'scada_mdb';
  scripts/raw_data_check.py::EXPECT += 'scada_mdb': ({'.zip','.mdb'}, ...)。
  复检: 现场收资体检不再报"未约定的子目录", 现认 scada_mdb 2 件 1982.4 MB; 退出码 8 = 仅有提示(无新增源件)。
· 工具可直接吃安装目录里的归档(不必再指向 F:\temp): --src data/raw/如东/scada_mdb --list
  ⇒ 25年.zip 12 个月 · 12 类; 26年.zip 9 个月 · 12 类。
· docs/现场收资接入_v0.1.md 增 §6 落位约定(目录树/体量/sha256/为什么单开一层), 并写明**尚未做**的两步
  (解出每月 MDB; 是否把 MDB 转成 scada_10min/scada_1min 的 CSV 以取代现有 27 GB CSV) ——
  那两步影响既有输入的去留, 等用户定后再动。
zhouyang.xie 3 hete
szülő
commit
8e8cee5694
3 módosított fájl, 37 hozzáadás és 2 törlés
  1. 27 0
      docs/现场收资接入_v0.1.md
  2. 4 0
      scripts/raw_data_check.py
  3. 6 2
      src/windscada/config.py

+ 27 - 0
docs/现场收资接入_v0.1.md

@@ -70,3 +70,30 @@ python scripts/rebuild_all.py               # 或门户「数据重算」
 | `风机故障记录` | 10 件(`*.rar` / `*.xlsx`) | — |
 | `油样报告` | **0 件** | 现场 PDF 报告 |
 | `windcms` / `m5_cms_tcm` | **0 件** | 振动侧 CMS 导出件(取料单第 7、8 项) |
+
+---
+
+## 6. 落位约定(用户令 2026-09-17:用年度 MDB 归档取代此前的两个 CSV zip)
+
+```
+<安装目录>/data/raw/如东/
+├─ scada_mdb/            ← ★ 现场原始收资(Access 按月分类),就地归档
+│   ├─ 25年.zip          (1,071,376,695 B, sha256 E451FF68…;内层 25年/1-12月/2025-<月>-<类>.zip)
+│   └─ 26年.zip          (1,007,354,282 B, sha256 0B641309…;内层 26年/1-9月/2026-<月>-<类>.zip)
+├─ scada_10min/          38 件 WTG01..WTG38.csv(源: 10分钟数据.zip,已对账 38/38 同大小)
+├─ scada_1min/           38 件 01E..38B.csv(源: 1分钟数据.zip,已对账 38/38 同大小)
+├─ 故障报警/ 风机故障记录/ 油样报告/ windcms/ m5_cms_tcm/
+```
+
+- **为什么要单开 `scada_mdb/`**:年度归档里是**每月 12 类**的 Access 库(`cnt din dot flg grd int prs scd
+  std sum tmp tur`),不是"一台一个 CSV",硬塞进 `scada_10min/` 会破坏该目录"平铺 `<机组>.csv`"的约定。
+- 目录已登记进两份真源:`src/windscada/config.py::STATION_SUBDIRS` 与
+  `scripts/raw_data_check.py::EXPECT`(允许 `.zip` 原样归档与 `.mdb` 解出件)⇒ 现场收资体检认它,
+  不再报"未约定的子目录"。
+- 工具直接吃这个目录(不必再指向 `F:\temp`):
+  `python scripts/extract_site_data.py --src data/raw/如东/scada_mdb --list`
+  ⇒ 实测 `25年.zip`:12 个月 · 12 类;`26年.zip`:9 个月 · 12 类。
+
+⚠️ **尚未做的一步(等你定)**:把年度 zip **解出**(每月 12 个 `.mdb`,约十几 GB),
+以及是否把 MDB **转成** `scada_10min/`、`scada_1min/` 的 CSV(即"用 MDB 取代现有 CSV")。
+}这个决定会影响现有 27 GB 的 CSV 输入要不要保留, 故先只做"放进去"这一步。

+ 4 - 0
scripts/raw_data_check.py

@@ -68,6 +68,10 @@ EXPECT = {
     '油样报告': ({'.pdf'}, '两级: <台号>/<部件>/*.pdf'),
     'windcms': ({'.json', '.pdf', '.docx'}, 'CMS 原始导出 *_decode.json(可套 <包名>/measurement/ 层) + 厂家报告/'),
     'm5_cms_tcm': ({'.json', '.docx', '.pdf', '.md'}, 'handoff 正本 + 厂家报告/'),
+    # 2026-09-17 用户令: 现场交来的年度 MDB 归档(25年.zip / 26年.zip)就地放在这里 —— 它就是
+    # 原始收资(Access 按月分类),取代此前的"已导出 CSV"两个 zip(10分钟数据.zip / 1分钟数据.zip)。
+    # 允许 .zip(原样归档)+ .mdb(已解出时);解出的目录层次 `<年>/<月>/` 由 R2 的子目录规则放行。
+    'scada_mdb': ({'.zip', '.mdb'}, '年度归档 <年>年.zip(内层 <年>/<月>/<年-月-类>.zip → .mdb)'),
 }
 DATE_RE = re.compile(r'(20\d{2})[-_年]?(0[1-9]|1[0-2])')
 

+ 6 - 2
src/windscada/config.py

@@ -54,10 +54,14 @@ RAW_ROOT = P.RAW_ROOT
 # 「振动线 handoff」遵循 data/raw/如东/m5_cms_tcm) —— 它们此前只在 outputs/ 下以**产物**形式存在,
 # 源件不在 data/raw, 于是"从零重算"时振动侧无源可算。加进来后扫描/落位/数据层页都能认它们。
 STATION_SUBDIRS = ('scada_10min', 'scada_1min', '故障报警', '风机故障记录', '油样报告',
-                   'windcms', 'm5_cms_tcm')
+                   'windcms', 'm5_cms_tcm',
+                   # 2026-09-17 用户令: 现场交来的**年度 MDB 归档**(25年.zip / 26年.zip, 内层是
+                   # `<年>/<月>/<年-月-类>.zip → .mdb`)就地放在场站目录下, 取代此前的"已导出 CSV"
+                   # 那两个 zip(10分钟数据.zip / 1分钟数据.zip)。原始收资是 Access 库, 故单独一层。
+                   'scada_mdb')
 _SRC_KEYS = (('src_10min', 'scada_10min'), ('src_1min', 'scada_1min'), ('src_alarm', '故障报警'),
              ('src_workorder', '风机故障记录'), ('src_oil', '油样报告'),
-             ('src_windcms', 'windcms'), ('src_m5', 'm5_cms_tcm'))
+             ('src_windcms', 'windcms'), ('src_m5', 'm5_cms_tcm'), ('src_mdb', 'scada_mdb'))
 
 _BUILTIN = {
     'rudong': {