# -*- coding: utf-8 -*- r"""维护面视图适配(P12):把详情层 `serve.py` 的两段维护面逻辑**搬到算法服务**(目标栈内,逐字保留)。 来源:`app_backEnd/app_backEnd_guanlan/serve.py` 的 `maint_framework_view()`(361-394) 与 `/api/maint_std` 分支内联逻辑(2079-2110 一带)。 """ from __future__ import annotations import json import pathlib from typing import Any def _objects() -> dict[str, Any]: from app_common.app_common_guanlan.api import paths as P return json.loads(P.objects_json().read_text(encoding='utf-8')) def maint_framework(lang: str = 'zh') -> dict[str, Any]: """运维管理体系三维骨架 —— 与详情层 `maint_framework_view()` **逐字一致**。""" from src.windscada.maint import framework as _fw db = _objects() wo = [(v.get('props') or {}) for k, v in db.items() if k.startswith('workorder/')] r = dict(systems=_fw.system_load(wo)['rows'], tiers=_fw.systems_by_tier(), stages=_fw.stage_matrix(), records=_fw.RECORDS, gaps=_fw.capability_gaps(wo), coverage=_fw.coverage(wo)) # unmapped_top = 未映射到系统码的现场手写部件名(不是枚举,码表投影对它无效)⇒ 走 part_en 自由文本解析 if lang and lang != 'zh' and (r.get('gaps') or {}).get('unmapped_top'): try: from src.windscada import en_text as _et out = [] for it in r['gaps']['unmapped_top']: if isinstance(it, (list, tuple)) and len(it) == 2: e = _et.part_en(it[0]) or it[0] out.append(['(not recorded)' if e == '\u2014' else e, it[1]]) else: out.append(it) r['gaps'] = dict(r['gaps'], unmapped_top=out) except Exception: # noqa: BLE001 pass return r def maint_std() -> dict[str, Any]: """运维标准四判据 + 成熟度评分 —— 与详情层 `/api/maint_std` 分支**逐字一致**。""" try: from src.windscada.maint import standards as _st db = _objects() wo = [(v.get('props') or {}) for k, v in db.items() if k.startswith('workorder/')] r = _st.run_all(wo) r['score'] = _st.score(wo, r) return r except Exception as e: # noqa: BLE001 return dict(err=('运维标准判据失败: %s' % e)[:200])