# -*- coding: utf-8 -*- """外发脱敏 — 送到第三方模型之前的实体去标识。 与 scripts/windscada_cloud_pack.py 的分工: cloud_pack 管**产物**(HTML 源码级, 含文档名正则等 HTML 特有规则), 是上云前的一次性闸; 本模块 管**外发**(每次调用在线模型时逐条消息脱敏), 是运行期持续生效的闸。 两者共用下面这张实体表 —— 实体只在这里定义一次, 免得两处规则各自漂移。 为什么外发也必须脱: 演示时客户每问一次, 证据包就整包发给第三方模型一次。 产物脱敏管不到这条路径 —— 那是两个不同的出口。 """ from app_common.app_common_guanlan.api import paths as P import re # 实体映射: 长串在前 (中广核如东 → 先替场名会留下 "中广核the site") ENTITIES = [ ('中广核', '[owner]'), ('华能', '[owner]'), ('国家能源', '[owner]'), ('国电投', '[owner]'), ('大唐', '[owner]'), ('华电', '[owner]'), ('三峡', '[owner]'), ('上海电气', 'OEM'), ('西门子', 'OEM'), ('Siemens', 'OEM'), ('Envision', 'supplier'), ('远景', 'supplier'), ('ABB', 'supplier'), ('如东海上', 'the offshore site'), ('如东', 'the site'), ('rudong', 'site'), ('RUDONG', 'SITE'), ('Rudong', 'Site'), ('SWT-4.0-130', '4.0 MW class'), ('SWT130-4000', '4.0 MW class'), ] _RE_PATH = re.compile(r'/(?:Users|Volumes)/[^\s;,)"\']+') _RE_TARIFF = re.compile(r'[\d.]+\s*(?:~\s*[\d.]+\s*)?元/kWh') # 显式台数: 2026-08-31 双模审第 5 条逮到 —— 我写了外发脱敏却没拿产物侧那 14 项闸验过它, # 实测证据包里 "38 台" 原样外发。写了代码 ≠ 验过, 闸必须对**两个出口**都跑。 _RE_FLEET = re.compile(r'(?