# /detail 页面依赖与重算台账 v0.1 用户令 (2026-09-18): `/detail` 各页面不许用旧版产出补, 必须由 `data/raw` 重算; 旧版产物只可参照**呈现样式与内容**。逐页依赖见下表 (自动生成段)。 # /detail 页面依赖与重算台账 (自动生成, 禁手改) > 生成端: `python scripts/detail_deps.py --write`|场站 `rudong`|产物仓 `outputs/rudong`|盘上 1,780 件 > > 用户令 (2026-09-18): **/detail 各页面不许用旧版产出补**, 只能参照旧版产物的呈现样式与内容, 数值必须由 `data/raw` 重算。本表把每页的取数接口与产物件逐条列清, 缺的写明怎么补。 ## 1 页面 → 取数接口 | 页签 | 页面 | 取数接口 | |---|---|---| | overview | 总览 | `/api/fleet` | | energy | 发电与损失 | `/api/fleet` | | component | 部件与系统 | `/api/fleet` | | | | `/api/problem` | | | | `/api/turbine` | | vibration | 振动评估(CMS) | `/api/fleet` | | | | `/api/vibcms` | | generation | 特性曲线 | `/api/curves` | | fault | 故障与可用率 | `/api/fleet` | | decision | 决策链 | `/api/fleet` | | | | `/api/ont_chain` | | assistant | 问答 | `/api/fleet` | | | | `/api/ask` | | | | `/api/ask_status` | | | | `/api/ask_models` | | | | `/api/facts` | | | | `/api/facts/claim` | | report | 报告 | `/api/fleet` | | | | `/api/facts` | | | | `/api/rpt_compose` | | system | 系统自查 | `/api/fleet` | | | | `/api/maint_survey` | 注: `/api/maint_std` `/api/maint_framework` `/api/dq_findings` `/api/ontology` 属**经典页** (`/?…`, 组件根), `/v2` 工作台不取它们 —— 但同一批本体产物 (ontology/objects.json) 仍然决定着它们能不能出数, 故一并列在 §2。 ## 2 接口 → 产物 → 来源 / 生成端 | 接口 | 产物 | 件 | 大小 | 台账来源 | 生成端(族) | 判定 | |---|---|---:|---:|---|---|---| | /api/fleet | `windscada/temp_monthly.parquet` ✅必需 | 1 | 0.1 MB | raw-derived | scripts/windscada_monthly_build.py (scada_monthly) | 在位 | | | `windscada/alarms.parquet` ✅必需 | 1 | 0.9 MB | raw-derived | scripts/windscada_alarms_ingest.py (scada_alarms) | 在位 | | | `windscada/loss_monthly.parquet` ✅必需 | 1 | 0.1 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | | `windscada/powercurve_bins.parquet` ✅必需 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | | `windscada/powercurve_dev.parquet` ✅必需 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | /api/fleet | `windscada/*.parquet` ○可选 | 17 | 2.0 MB | raw-derived | scripts/windscada_alarms_ingest.py (scada_alarms·scada_derived·scada_oil·scada_monthly·scada_workorders) | 在位 | | | `ontology/turbine_params.parquet` ○可选 | 1 | 0.1 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | | `m5_cms_tcm/handoff_vibration_v2.json` ○可选 | 0 | 0.0 MB | — | — (vib_handoff_and_scans) | 缺(页面降级) | | | `m5_cms_tcm/fleet_scalar_z.parquet` ○可选 | 1 | 0.7 MB | raw-derived | scripts/rudong_fusion_run.py (vib_fleet_scalar_z) | 在位 | | | `pitch/pitch_daily.parquet` ○可选 | 0 | 0.0 MB | — | — (pitch_shipped) | 缺(页面降级) | | | `pitch/pitch_zero_monthly.parquet` ○可选 | 0 | 0.0 MB | — | — (pitch_shipped) | 缺(页面降级) | | /api/curves | `windscada/powercurve_bins.parquet` ✅必需 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | /api/curves | `windscada/curve_lenses.parquet` ○可选 | 1 | 0.1 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | | `windscada/curve_liveness.parquet` ○可选 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | | `windscada/control_profile.parquet` ○可选 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | | `windscada/hydraulic_accum.parquet` ○可选 | 1 | 0.0 MB | raw-derived | src/windscada/perf/powercurve.py (scada_derived) | 在位 | | /api/problem | `windscada/alarms.parquet` ✅必需 | 1 | 0.9 MB | raw-derived | scripts/windscada_alarms_ingest.py (scada_alarms) | 在位 | | /api/problem | `ontology/objects.json` ○可选 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | | `windscada/workorders.parquet` ○可选 | 1 | 0.5 MB | raw-derived | scripts/windscada_workorder_ingest.py (scada_workorders) | 在位 | | /api/turbine | `windscada/alarms.parquet` ✅必需 | 1 | 0.9 MB | raw-derived | scripts/windscada_alarms_ingest.py (scada_alarms) | 在位 | | /api/turbine | `ontology/objects.json` ○可选 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | | `windscada/workorders.parquet` ○可选 | 1 | 0.5 MB | raw-derived | scripts/windscada_workorder_ingest.py (scada_workorders) | 在位 | | /api/vibcms | `windcms/报告_CMS振动状态评估报告_*.md` ✅必需 | 2 | 0.0 MB | raw-derived | src/windcms/report_std.py (windcms_report_std) | 在位 | | /api/vibcms | `m5_cms_tcm/handoff_vibration_v2.json` ○可选 | 0 | 0.0 MB | — | — (vib_handoff_and_scans) | 缺(页面降级) | | | `windcms/cache/*` ○可选 | 1 | 2.2 MB | raw-derived | src/windcms/data.py (windcms_cache) | 在位 | | /api/maint_survey | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/maint_std | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/maint_framework | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/dq_findings | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/ont_chain | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/ontology | `ontology/objects.json` ✅必需 | 1 | 4.3 MB | raw-derived | src/ontology/kb_ingest.py (ontology_core) | 在位 | | /api/facts | `guanlan/facts_contract_v0.json` ✅必需 | 0 | 0.0 MB | — | — (guanlan_contract) | **缺** | | | `guanlan/derived/detail_cards.json` ✅必需 | 0 | 0.0 MB | — | — (guanlan_contract) | **缺** | | /api/facts | `guanlan/derived/qa_refs.json` ○可选 | 0 | 0.0 MB | — | — (guanlan_contract) | 缺(页面降级) | | | `guanlan/derived/portal_claims.json` ○可选 | 0 | 0.0 MB | — | — (guanlan_contract) | 缺(页面降级) | ## 3 缺口与处置 (缺的件谁生成、能不能从 data/raw 重算) | 接口 | 缺件 | 必需 | 生成端 | 能否由 data/raw 重算 | |---|---|---|---|---| | `/api/fleet` | `m5_cms_tcm/handoff_vibration_v2.json` | 否 | (无生成端) | **不能**: 振动六层链四步脚本未随包(oem_frequency_scan 等)⇒ 运行期不从交付包补(用户令 2026-09-17 ⇒ 需研发补生成端 | | `/api/fleet` | `pitch/pitch_daily.parquet` | 否 | (无生成端) | **不能**: 无生成端 ⇒ 运行期不从交付包补(用户令 2026-09-17), 页面降级; 要出件须研发补生成端 ⇒ 需研发补生成端 | | `/api/fleet` | `pitch/pitch_zero_monthly.parquet` | 否 | (无生成端) | **不能**: 无生成端 ⇒ 运行期不从交付包补(用户令 2026-09-17), 页面降级; 要出件须研发补生成端 ⇒ 需研发补生成端 | | `/api/vibcms` | `m5_cms_tcm/handoff_vibration_v2.json` | 否 | (无生成端) | **不能**: 振动六层链四步脚本未随包(oem_frequency_scan 等)⇒ 运行期不从交付包补(用户令 2026-09-17 ⇒ 需研发补生成端 | | `/api/facts` | `guanlan/facts_contract_v0.json` | 是 | (无生成端) | **不能**: 派生链的中间层: 它的"输入"本身是产物而非 data/raw ⇒ 与 raw 之间隔着不止一跳; 运行期不从交付包补( ⇒ 需研发补生成端 | | `/api/facts` | `guanlan/derived/detail_cards.json` | 是 | (无生成端) | **不能**: 派生链的中间层: 它的"输入"本身是产物而非 data/raw ⇒ 与 raw 之间隔着不止一跳; 运行期不从交付包补( ⇒ 需研发补生成端 | | `/api/facts` | `guanlan/derived/qa_refs.json` | 否 | (无生成端) | **不能**: 派生链的中间层: 它的"输入"本身是产物而非 data/raw ⇒ 与 raw 之间隔着不止一跳; 运行期不从交付包补( ⇒ 需研发补生成端 | | `/api/facts` | `guanlan/derived/portal_claims.json` | 否 | (无生成端) | **不能**: 派生链的中间层: 它的"输入"本身是产物而非 data/raw ⇒ 与 raw 之间隔着不止一跳; 运行期不从交付包补( ⇒ 需研发补生成端 | ## 4 与输入数据的对应 (重算口径) | 产物族 | 输入 (data/raw/<场站>/…) | 生成端 | |---|---|---| | scada_monthly | scada_10min | `scripts/windscada_monthly_build.py` | | scada_alarms | 故障报警 | `scripts/windscada_alarms_ingest.py` | | scada_derived | scada_10min | `src/windscada/perf/powercurve.py` | | ontology_core | 西门子4.0技术资料 | `src/ontology/kb_ingest.py` | | vib_handoff_and_scans | — | `—` | | vib_fleet_scalar_z | m5_cms_tcm | `scripts/rudong_fusion_run.py` | | pitch_shipped | — | `—` | | scada_workorders | 风机故障记录 | `scripts/windscada_workorder_ingest.py` | | guanlan_contract | — | `—` | ## 5 复现 ``` python scripts/detail_deps.py --probe # 实测在线接口 (页面同路径: 网关 → 组件 /v2) python scripts/products_restore_missing.py --refresh # 重算后维护逐件来源台账 python scripts/rebuild_all.py # 全量重算 (链上含 ⑤a 台账维护 → ⑤ 反向呼应审计) ``` ## P 实测 (本次运行, 走网关 28084 → 组件 /v2) | 页签 | 接口 | 判定 | 实测 | |---|---|---|---| | overview | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | energy | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | component | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/problem` | 有数 | HTTP 200 · 16 B | | | `/api/turbine` | 有数 | HTTP 200 · 14,417 B | | vibration | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/vibcms` | 有数 | HTTP 200 · 6,752 B | | generation | `/api/curves` | 有数 | HTTP 200 · 23,913 B | | fault | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | decision | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/ont_chain` | 有数 | HTTP 200 · 288 B | | assistant | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/ask` | 不适用(POST 接口) | HTTP 404 · 3 B | | | `/api/ask_status` | 有数 | HTTP 200 · 173 B | | | `/api/ask_models` | 有数 | HTTP 200 · 137 B | | | `/api/facts` | 无产物(如实) | HTTP 503 · facts derived 缺失: [Errno 2] No such file or directory: 'F:\\temp\\app\ | | | `/api/facts/claim` | — | — | | report | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/facts` | 无产物(如实) | HTTP 503 · facts derived 缺失: [Errno 2] No such file or directory: 'F:\\temp\\app\ | | | `/api/rpt_compose` | 不适用(本机模型未启动) | HTTP 200 · 本地模型不可达: | | system | `/api/fleet` | 有数 | HTTP 200 · 54,509 B | | | `/api/maint_survey` | 有数 | HTTP 200 · 7,498 B | 判读口径: 只认响应**顶层**的 `err`/`error`/`no_products`/`no_report`; `/api/ask*` `/api/rpt_compose` 依赖本机模型, 未启动时记「不适用」不算缺件。