registry.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # -*- coding: utf-8 -*-
  2. r"""端点登记表:**唯一需要维护的清单** —— 端点名 → (算法模块, 函数, 允许的查询参数)。
  3. 判据:只登记"能无参或仅带可选参数调用、返回可 JSON 化数据、不改盘上产物"的算法函数。
  4. 带写盘副作用的函数一律固定成只读参数(如 `curves.build_store(write=False)`)。
  5. """
  6. from __future__ import annotations
  7. import importlib
  8. from typing import Any, Callable
  9. # 端点 → dict(module=算法模块点号名, fn=函数名, args=允许的查询参数 → (类型, 转发名, 固定值/None))
  10. # · 类型: 'str' | 'int' | 'bool'
  11. # · 固定值不为 None 时,该参数**不接受外部传入**,恒用固定值(防止服务被用来写盘)
  12. ENDPOINTS: dict[str, dict[str, Any]] = {
  13. 'systems': dict(module='app_algorithmModel.app_algorithmModel_guanlan.taxonomy', fn='__systems__',
  14. doc='判级维度字典(七系统 SYSTEMS + 温度通道→系统 TEMP2SYS)', args={}),
  15. 'matrix': dict(module='app_algorithmModel.app_algorithmModel_guanlan.taxonomy', fn='system_matrix',
  16. doc='七系统判级矩阵(与 /detail/api/fleet 的 sysmx 同源)',
  17. args={}), # span 见文件头实逮说明:不是窗口字符串,P10 不传
  18. 'reconcile': dict(module='app_algorithmModel.app_algorithmModel_guanlan.taxonomy', fn='reconcile',
  19. doc='判级与台账对账', args={}),
  20. 'reliability': dict(module='app_algorithmModel.app_algorithmModel_guanlan.perf.reliability', fn='overview',
  21. doc='可靠性总览(含可用率与故障统计)',
  22. args={'since': ('str', 'since', None)}), # span 是跨度对象,P10 不传
  23. 'problems': dict(module='app_algorithmModel.app_algorithmModel_guanlan.perf.reliability',
  24. fn='current_problems', doc='当前问题清单', args={}),
  25. # ★2026-09-29 实逮:`availability.build()` 返回 None(它只写盘、不返值)⇒ 不是接口,已撤。
  26. # 可用率对外只经 `availability_summary`(=`summary()`,返回结构化摘要)。
  27. 'availability_summary': dict(module='app_algorithmModel.app_algorithmModel_guanlan.perf.availability',
  28. fn='summary', doc='可用率摘要',
  29. args={'month_from': ('str', 'month_from', None)}),
  30. 'fusion': dict(module='app_algorithmModel.app_algorithmModel_guanlan.subsys.fusion', fn='fusion_table',
  31. doc='融合面四源表', args={'all_turbines': ('bool', 'all_turbines', None)}),
  32. 'handoff': dict(module='app_algorithmModel.app_algorithmModel_guanlan.subsys.fusion', fn='load_handoff',
  33. doc='振动融合交接件(handoff_vibration_v2)', args={}),
  34. 'pitch': dict(module='app_algorithmModel.app_algorithmModel_guanlan.subsys.pitch', fn='registry',
  35. doc='变桨面(日粒度 + 零位三口径)', args={}),
  36. 'curves': dict(module='app_algorithmModel.app_algorithmModel_guanlan.perf.curves', fn='build_store',
  37. doc='功率/转速曲线仓(**只读**:write 固定 False)',
  38. args={'write': ('bool', 'write', False)}),
  39. # ★2026-09-30 用户令(P12):数据类端点的计算归算法服务(目标栈 = Python+FastAPI),
  40. # Java 业务后端经 /algorithm 取数后按契约组装(`/api/maint_survey` 是首个)。
  41. 'ont_chain': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.ontology_views',
  42. fn='ont_chain', doc='本体链(fault/prev/tree/plan/doc 五路,详情层同形)',
  43. args={'kind': ('str', 'kind', 'fault'), 'code': ('str', 'code', None),
  44. 'system': ('str', 'system', None), 'top': ('int', 'top', 10),
  45. 'keyword': ('str', 'keyword', None), 'dkind': ('str', 'dkind', None)}),
  46. 'ont_list': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.ontology_views',
  47. fn='ont_list_rows', doc='本体对象清单(详情层 /api/ont_list 同形)',
  48. args={'type': ('str', 'type', None), 't': ('str', 't', None),
  49. 'limit': ('int', 'limit', 60)}),
  50. 'ont_obj': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.ontology_views',
  51. fn='ont_obj_bundle', doc='本体对象 + 链接(详情层 /api/ont_obj 同形)',
  52. args={'id': ('str', 'id', None)}),
  53. 'vibcms': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.fleet_views',
  54. fn='vibcms', doc='windcms 评估报告转录(详情层 /api/vibcms 同形)', args={}),
  55. 'reload': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.fleet_views',
  56. fn='reload', doc='产物重载(返回旧/新指纹与文件数)',
  57. args={'why': ('str', 'why', None)}),
  58. 'curves_view': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.fleet_views',
  59. fn='curves', doc='曲线视图(详情层 /api/curves 同形;注意与算法原生 curves 区分)',
  60. args={'win': ('str', 'win', None)}),
  61. 'fleet': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.fleet_views',
  62. fn='fleet', doc='整场取数(10 个页签的取数源,详情层同形)',
  63. args={'win': ('str', 'win', None)}),
  64. 'maint_std': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.maint_views',
  65. fn='maint_std', doc='运维标准四判据 + 成熟度评分(详情层同形)', args={}),
  66. 'maint_framework': dict(module='app_algorithmModel.app_algorithmModel_guanlan.service.maint_views',
  67. fn='maint_framework', doc='运维管理体系三维骨架(详情层同形)',
  68. args={'lang': ('str', 'lang', None)}),
  69. 'maint_survey': dict(module='app_ontology.app_ontology_guanlan.ontology.maintenance',
  70. fn='survey', doc='维护面盘点(数据/机理两层的数据源清单与覆盖)', args={}),
  71. 'curves_check': dict(module='app_algorithmModel.app_algorithmModel_guanlan.perf.curves', fn='physics_check',
  72. doc='曲线物理性检查', args={}),
  73. }
  74. _cache: dict[str, Any] = {}
  75. def _mod(name: str):
  76. return importlib.import_module(name)
  77. def call(name: str, params: dict[str, Any]) -> Any:
  78. """按登记表取数(params 已由 HTTP 层按类型解析好)。"""
  79. spec = ENDPOINTS.get(name)
  80. if not spec:
  81. raise KeyError(f'未登记端点 {name!r};可用: {", ".join(sorted(ENDPOINTS))}')
  82. m = _mod(spec['module'])
  83. if spec['fn'] == '__systems__':
  84. return {'SYSTEMS': list(m.SYSTEMS), 'TEMP2SYS': dict(m.TEMP2SYS)}
  85. fn: Callable = getattr(m, spec['fn'])
  86. kwargs: dict[str, Any] = {}
  87. for qname, (_t, fname, fixed) in (spec.get('args') or {}).items():
  88. val = fixed if fixed is not None else params.get(fname)
  89. if val is not None:
  90. kwargs[fname] = val
  91. return fn(**kwargs)
  92. def spec_list() -> list[dict[str, Any]]:
  93. return [dict(name=k, module=v['module'], fn=v['fn'], doc=v['doc'],
  94. params=sorted((v.get('args') or {}).keys())) for k, v in sorted(ENDPOINTS.items())]
  95. __all__ = ['ENDPOINTS', 'call', 'spec_list']