فهرست منبع

2.83.0 方案B: 「振动 CMS」按门户原页 19 条文字逐条保真(内联 v-html + 应用自身样式) + 按窗实时 chip(TCM 一条按原文保留) + windcms 内嵌/两入口改同源 /cms; 逐条比对 MISSING 0

zhouyang.xie 6 روز پیش
والد
کامیت
0fff09922e

+ 1 - 1
VERSION

@@ -1 +1 @@
-2.82.2
+2.83.0

+ 3 - 0
app_common/app_common_guanlan/version.py

@@ -54,6 +54,9 @@ BUMP_RULE = ('改动落在"解决方案/架构/核心功能" → 大 +1(中/
 #   level: major/minor/patch 表示这一版**相对上一版**是哪一级变化;legacy 表示该版用的是
 #   旧编号体系(0.x,未按本规则),仅作历史对账用。
 HISTORY: tuple[dict, ...] = (
+    dict(version='2.83.0', date='2026-10-05', level='minor',
+         title='方案 B:「振动 CMS」按门户原页逐条保真(应用自身样式)',
+         note='用户选**方案 B(保真内容、不保皮肤)**。做法:仍走**已验证能显示**的内联 `v-html` 路径(不用 shadow/iframe-for-page ✗),把门户「振动·CMS」节的**全部文字条目逐条补进**:眉标「状态监测 · 振动诊断 (windcms)」· 标题「振动与 SCADA 联合分析」·六层模型说明(全文)· 「振动分析 · 方法与证据边界」三张卡(比较基准/证据关联/结论边界,含各自标题与整段正文)·「在线 · 客户版」+「CMS 振动分析工作台」+ 其说明段 · 两个入口链接(新窗口打开 windcms → / 工作台 →,改为同源 `/cms/…`)·并内嵌 windcms 页(`/cms/?theme=light`,原为写死的 `127.0.0.1:18020`,改同源相对路径)。按窗实时值:当前时间窗 / 需关注 N 台 / 未见异常 M 台 / 证据窗末 / 窗口内报警工单 / CMS 采集窗·时间范围 / CMS 裁决分布 / 行动项·数据时点;原页那条「TCM 六采集窗 · 320 万记录 · 160 万谱」因接口不提供计数,按原文**保留**(保真优先)。**核验(逐条比对)**:原页 19 条文字 → `REQ_TOTAL 19 · MISSING 0` ✓(首轮曾漏 1 条:`使用"持续恶化"…` 我误用直引号,已改为门户原文的中文引号)· `IFRAME Y`(windcms 内嵌)· `LINKS 2` ✓ · 元素 48。远端已部署 36 件。'),
     dict(version='2.82.2', date='2026-10-05', level='patch',
          title='「振动 CMS」改用与其它子选项卡相同的渲染路径(应用自身样式;弃门户 CSS/Shadow DOM/iframe)',
          note='用户反馈"问题没有解决"(「振动 CMS」选中后仍看不到内容)。此前四种方式在你的环境中均未显示:`v-html` + 门户 CSS ✗、`srcdoc` iframe ✗、**Blob URL** iframe ✗、**Shadow DOM** ✗(其中 Shadow DOM 一轮实逮到:门户 CSS 把变量定义在 `:root{}`,影子树里 `:root` 匹配不到 ⇒ `var(--ground/--ink)` 全失效 ⇒ 白底浅字;改 `:host` 后我这边能读到文本,但你的浏览器仍未显示)。**本轮决定性修法**:放弃"保真皮肤"路线,改用**与其它 5 个子选项卡完全相同、已被证明能显示**的路径 —— `v-html` 注入 `#root`(无 shadow、无 iframe、无门户 CSS);内容 = 门户原文案("状态监测 · 振动诊断 (windcms)"、"振动与 SCADA 联合分析"、"六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → 谱线八闸 → 六枚举裁决")+ **按窗实时值 chip**(当前时间窗 / 需关注 / 未见异常 / 窗口内报警工单 / CMS 采集窗·时间范围 / CMS 裁决分布 / 行动项·数据时点),chip 用**内联样式**(圆角胶囊,不依赖任何外部 CSS)。**核验(真应用 jsdom)**:`#root` → `ELEMENTS 26` · `HAS_TITLE true` · `HAS_LIVE true`(`当前时间窗 · 2026年` + `需关注 35 台`)· `CHIPS 7`;正文首段即上述文案 ✓。远端已部署 36 件。'),

+ 33 - 20
app_frontEnd/web/src/lib/vib.ts

@@ -280,33 +280,46 @@ export function portalCmsHtml(d: any, cms: any): string {
   const cmsRange = String(c['时间范围'] || '').replace(/^\S+\s*/, '').slice(0, 60)
   const cmsDate = String(c.date || '')
   const end = String(fus['证据窗末'] || c.date || '').slice(0, 10)
-  // ★P75 全部用**应用自身样式 + 内联样式**(不再依赖门户 CSS/S shadow DOM/iframe)——与其它 5 个子选项卡同一条路径。
-  const chip = (s: string, ev2 = false) =>
+  const chip = (s: string, warn = false) =>
     '<span style="display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:12.5px;'
-    + (ev2 ? 'border:1px solid var(--warning,#B7791F);color:var(--warning,#B7791F);background:transparent;'
-           : 'border:1px solid var(--line,#D8DDE3);color:var(--sub,#5A6472);background:var(--panel2,#EDF0F3);')
+    + (warn ? 'border:1px solid var(--warning,#B7791F);color:var(--warning,#B7791F)'
+            : 'border:1px solid var(--line,#D8DDE3);color:var(--sub,#5A6472);background:var(--panel2,#EDF0F3)')
     + '">' + s + '</span>'
-  const chips = [
-    chip('当前时间窗 · ' + win),
-    chip('需关注 ' + alert + ' 台', true),
-    chip('未见异常 ' + okn + ' 台'),
-    chip('窗口内报警工单 · ' + tickets + ' 条', true),
-    chip('CMS 采集窗 ' + (cmsWin || '—') + (cmsRange ? ' · ' + cmsRange : '')),
-    chip('CMS 裁决 · 优秀 ' + cnt('优秀') + ' / 良好 ' + cnt('良好') + ' / 报警 ' + cnt('报警')),
-    chip('行动项 ' + actions + ' 条' + (cmsDate ? ' · 数据时点 ' + cmsDate : '')),
-  ].join('')
+  const card = (k: string, h: string, p: string) =>
+    '<div class="panel" style="flex:1 1 280px;min-width:260px">'
+    + '<div class="small muted">' + k + '</div><h3 style="margin:4px 0 6px">' + h + '</h3>'
+    + '<p class="small muted" style="margin:0">' + p + '</p></div>'
+  // ★方案 B:门户「振动·CMS」**全部文字条目逐条保真**(仅"按窗实时"的三项用实时值),样式用应用自身
   return ''
     + '<div class="eyebrow">状态监测 · 振动诊断 (windcms)</div>'
     + '<div class="panel mb">'
     + '<h3 style="margin:0 0 6px">振动与 SCADA 联合分析</h3>'
-    + '<p class="small muted" style="margin:0 0 10px">六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → '
-    + '谱线八闸 → 六枚举裁决。厂商判据与模型融合,机制未定不命名部件。</p>'
-    + '<div style="display:flex;flex-wrap:wrap;gap:8px">' + chips + '</div>'
+    + '<p class="small muted" style="margin:0 0 10px">六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → 谱线八闸 → 六枚举裁决。厂商判据与模型融合,机制未定不命名部件。</p>'
+    + '<div style="display:flex;flex-wrap:wrap;gap:8px">'
+    + chip('当前时间窗 · ' + win)
+    + chip('需关注 ' + alert + ' 台', true)
+    + chip('未见异常 ' + okn + ' 台')
+    + chip('证据窗末 ' + (end || '—'))
+    + chip('窗口内报警工单 · ' + tickets + ' 条', true)
+    + chip('CMS 采集窗 ' + (cmsWin || '—') + (cmsRange ? ' · ' + cmsRange : ''))
+    + chip('CMS 裁决 · 优秀 ' + cnt('优秀') + ' / 良好 ' + cnt('良好') + ' / 报警 ' + cnt('报警'))
+    + chip('行动项 ' + actions + ' 条' + (cmsDate ? ' · 数据时点 ' + cmsDate : ''))
+    + chip('TCM 六采集窗 · 320 万记录 · 160 万谱')
+    + '</div></div>'
+    + '<div class="eyebrow">振动分析 · 方法与证据边界</div>'
+    + '<div style="display:flex;flex-wrap:wrap;gap:12px;margin-bottom:14px">'
+    + card('比较基准', '异常比较先核实基准', '先确认测点、工况、处理链和频带可比,再结合线能量占比与机群分布识别异常。阈值须注明来源、样本和适用范围;本底接近检测下限时,倍数不宜单独解释,诊断仍需补充证据。')
+    + card('证据关联', '多种特征不等于独立证据', '频谱、标量和时域特征若来自同一波形,应保留共同来源,避免重复计票。跨测点或跨窗口的一致性也需核查共同工况与采集依赖;结论升级应结合独立检修等证据,不以特征数量替代证据质量。')
+    + card('结论边界', '结论强度与证据匹配', '使用“持续恶化”“单调”或“唯一”等表述前,应明确观察范围、比较对象、样本依赖和对应检验。端段差异不能代替全程趋势证据;复核发现支持不足时,补充验证或降低结论强度,并保留不确定性。')
     + '</div>'
-    + '<div class="panel">'
-    + '<p class="small muted" style="margin:0">本条为门户「振动·CMS」迁入版:数值按**当前时间窗**与 CMS 证据包实时计算;'
-    + (end ? '证据窗末 ' + end + '。' : '')
-    + '完整的 CMS 六层明细与逐台评级见「振动分析」子选项卡。</p>'
+    + '<div class="eyebrow">在线 · 客户版</div>'
+    + '<div class="panel"><h3 style="margin:0 0 6px">CMS 振动分析工作台</h3>'
+    + '<p class="small muted" style="margin:0 0 10px">左栏"需关注 / 未见异常"按台展开四个测点判级;工作台可选机组、测点、分析类即时出图;交互页可提问。演示只停客户版与一次工作台运行。</p>'
+    + '<div style="display:flex;flex-wrap:wrap;gap:8px">'
+    + '<a class="chip" style="padding:5px 11px;border-radius:999px;border:1px solid var(--line,#D8DDE3);text-decoration:none" href="/cms/?theme=light" target="_blank" rel="noopener">新窗口打开 windcms →</a>'
+    + '<a class="chip" style="padding:5px 11px;border-radius:999px;border:1px solid var(--line,#D8DDE3);text-decoration:none" href="/cms/workbench.html?theme=light" target="_blank" rel="noopener">工作台 →</a>'
+    + '</div>'
+    + '<iframe title="windcms" src="/cms/?theme=light" style="width:100%;height:760px;border:1px solid var(--line,#D8DDE3);border-radius:8px;margin-top:12px"></iframe>'
     + '</div>'
 }
 

+ 45 - 0
app_frontEnd/web/tools/_check_cms_bfull.mjs

@@ -0,0 +1,45 @@
+
+import { readFileSync } from 'node:fs'
+import { fileURLToPath } from 'node:url'
+import { dirname, resolve } from 'node:path'
+import { JSDOM, VirtualConsole } from 'jsdom'
+const HERE = dirname(fileURLToPath(import.meta.url))
+const dist = resolve(HERE, '../../../release/web')
+const idx = readFileSync(dist + '/index.html', 'utf8')
+const jsFile = (idx.match(/src="([^"]+\.js)"/) || [])[1].replace(/^.*\//, '')
+const cssFile = (idx.match(/href="([^"]+\.css)"/) || [])[1].replace(/^.*\//, '')
+const code = readFileSync(dist + '/assets/' + jsFile, 'utf8')
+const css = readFileSync(dist + '/assets/' + cssFile, 'utf8')
+const fleet = readFileSync(resolve(HERE, '_fleet_fixture.json'), 'utf8')
+const vib = readFileSync(resolve(HERE, '_vibcms_fixture.json'), 'utf8')
+const dom = new JSDOM(idx.replace('</head>', '<style>' + css + '</style></head>'),
+  { url: 'http://127.0.0.1:28084/detail/v2#tab=vibration:portal_cms', runScripts: 'outside-only', pretendToBeVisual: true, virtualConsole: new VirtualConsole() })
+const w = dom.window
+w.fetch = async (u) => { const s = String(u); const body = /fleet/.test(s) ? fleet : (/vibcms/.test(s) ? vib : '{}')
+  return { ok: true, status: 200, json: async () => JSON.parse(body), text: async () => body } }
+try { w.eval(code) } catch (e) { console.log('EVAL_ERR ' + String(e).slice(0, 140)) }
+for (let i = 0; i < 20; i++) { await new Promise((r) => setTimeout(r, 400)); if (/振动与 SCADA/.test(w.document.body.textContent || '')) break }
+const root = w.document.querySelector('#root') || w.document.body
+const txt = (root.textContent || '').replace(/\s+/g, ' ')
+const REQ = [
+  '状态监测 · 振动诊断 (windcms)',
+  '振动与 SCADA 联合分析',
+  '六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → 谱线八闸 → 六枚举裁决。厂商判据与模型融合,机制未定不命名部件。',
+  'TCM 六采集窗 · 320 万记录 · 160 万谱',
+  '振动分析 · 方法与证据边界',
+  '比较基准', '异常比较先核实基准',
+  '先确认测点、工况、处理链和频带可比,再结合线能量占比与机群分布识别异常。阈值须注明来源、样本和适用范围;本底接近检测下限时,倍数不宜单独解释,诊断仍需补充证据。',
+  '证据关联', '多种特征不等于独立证据',
+  '频谱、标量和时域特征若来自同一波形,应保留共同来源,避免重复计票。跨测点或跨窗口的一致性也需核查共同工况与采集依赖;结论升级应结合独立检修等证据,不以特征数量替代证据质量。',
+  '结论边界', '结论强度与证据匹配',
+  '使用“持续恶化”“单调”或“唯一”等表述前,应明确观察范围、比较对象、样本依赖和对应检验。端段差异不能代替全程趋势证据;复核发现支持不足时,补充验证或降低结论强度,并保留不确定性。',
+  '在线 · 客户版', 'CMS 振动分析工作台',
+  '左栏"需关注 / 未见异常"按台展开四个测点判级;工作台可选机组、测点、分析类即时出图;交互页可提问。演示只停客户版与一次工作台运行。',
+  '新窗口打开 windcms →', '工作台 →',
+]
+const missing = REQ.filter((s) => !txt.includes(s.replace(/"/g, txt.includes('"') ? '"' : '"')))
+console.log('REQ_TOTAL ' + REQ.length + ' MISSING ' + missing.length)
+if (missing.length) console.log('MISSING_ITEMS ' + JSON.stringify(missing.slice(0, 3).map((s) => s.slice(0, 40))))
+console.log('LIVE ' + /当前时间窗 · \d|当前时间窗 · 全程|当前时间窗 · /.test(txt) + ' ' + /需关注 \d+ 台/.test(txt))
+console.log('IFRAME ' + (root.querySelector('iframe[src*="/cms/"]') ? 'Y' : 'N') + ' LINKS ' + root.querySelectorAll('a[href*="/cms/"]').length)
+console.log('ELEMENTS ' + root.querySelectorAll('*').length)

+ 4 - 3
docs/src/需求分析_观澜_2.82.2.md

@@ -18,7 +18,7 @@
 
 ### 1.3 版本对应关系
 
-系统版本号只有一个真源:仓库内的 src/version.py 的 VERSION 一行。本版 VERSION = 2.82.2,版本记录(HISTORY)共 146 条,人读的版本表由 scripts/version_log.py 从 HISTORY 生成到 docs/版本记录.md,并由 version_log.py --check 与 guanlan.py check 双重校验「记录表与代码一致」。
+系统版本号只有一个真源:仓库内的 src/version.py 的 VERSION 一行。本版 VERSION = 2.82.2,版本记录(HISTORY)共 147 条,人读的版本表由 scripts/version_log.py 从 HISTORY 生成到 docs/版本记录.md,并由 version_log.py --check 与 guanlan.py check 双重校验「记录表与代码一致」。
 
 表 1-1 版本与文档的对应关系
 
@@ -119,10 +119,11 @@
 
 ### 3.2 需求演进时间轴
 
-表 3-1 版本史与用户令要点(依据 src/version.py 的 HISTORY,共 146 条)
+表 3-1 版本史与用户令要点(依据 src/version.py 的 HISTORY,共 147 条)
 
 | 版本 | 日期 | 用户令要点 | 变化级别 |
 |---|---|---|---|
+| 2.83.0 | 2026-10-05 | 方案 B:「振动 CMS」按门户原页逐条保真 | 中(minor) |
 | 2.82.2 | 2026-10-05 | 「振动 CMS」改用与其它子选项卡相同的渲染路径 | 小(patch) |
 | 2.82.1 | 2026-10-05 | 修「振动 CMS」看着没内容:影子树内 :root 失效,改为 :host | 小(patch) |
 | 2.82.0 | 2026-10-05 | 门户去掉三项已迁移导航;「振动 CMS」改 Shadow DOM 渲染 | 中(minor) |
@@ -270,7 +271,7 @@
 | 0.4.0 | 2026-09-17 | 打包默认不含输入数据与产物与日志与临时文件;无窗口启动;统一配置与日志;页面归口;服务化 | 旧编号(legacy) |
 | 0.2.0 | 2026-09-01 | 含产物的旧交付基线,历史上用作「包内无生成端」那批产物的补救源 | 旧编号(legacy) |
 
-需求的演进如图 1-1 所示。该图依据 src/version.py 的 HISTORY 绘制,覆盖上表 146 条记录(即两级旧编号 0.4.0 与 0.2.0,以及从 2.5.0 起按规则递增的144个版本)。按级别统计,这144个版本里「中」级变化78条(2.82.0、2.81.0、2.80.0、2.79.0、2.78.0、2.77.0、2.76.0、2.75.0、2.74.0、2.73.0、2.72.0、2.71.0、2.70.0、2.69.0、2.68.0、2.67.0、2.66.0、2.65.0、2.64.0、2.63.0、2.62.0、2.61.0、2.60.0、2.59.0、2.58.0、2.57.0、2.56.0、2.55.0、2.54.0、2.53.0、2.52.0、2.51.0、2.50.0、2.49.0、2.48.0、2.47.0、2.46.0、2.45.0、2.44.0、2.43.0、2.42.0、2.41.0、2.40.0、2.39.0、2.38.0、2.37.0、2.36.0、2.35.0、2.34.0、2.33.0、2.32.0、2.31.0、2.30.0、2.29.0、2.28.0、2.27.0、2.26.0、2.25.0、2.24.0、2.23.0、2.22.0、2.21.0、2.20.0、2.19.0、2.18.0、2.17.0、2.16.0、2.15.0、2.14.0、2.13.0、2.12.0、2.11.0、2.10.0、2.9.0、2.8.0、2.7.0、2.6.0、2.5.0),「小」级变化66条(2.82.2、2.82.1、2.81.7、2.81.6、2.81.5、2.81.4、2.81.3、2.81.2、2.81.1、2.80.2、2.80.1、2.79.1、2.78.4、2.78.3、2.78.2、2.78.1、2.76.1、2.75.1、2.66.1、2.63.1、2.62.1、2.60.1、2.57.2、2.57.1、2.56.1、2.54.1、2.53.2、2.53.1、2.52.1、2.51.1、2.47.1、2.42.1、2.40.1、2.36.2、2.36.1、2.30.1、2.29.1、2.28.1、2.24.2、2.24.1、2.23.3、2.23.2、2.23.1、2.22.1、2.21.2、2.21.1、2.15.2、2.15.1、2.12.1、2.11.9、2.11.8、2.11.7、2.11.6、2.11.5、2.11.4、2.11.3、2.11.2、2.11.1、2.10.4、2.10.3、2.10.2、2.10.1、2.9.2、2.9.1、2.8.2、2.8.1),没有大版本升级。这个分布清楚地显示出这条线的性质——**功能面在 2.5.0 到 2.7.0 之间快速铺开,之后转入以消缺与口径统一为主的密集收敛期**。
+需求的演进如图 1-1 所示。该图依据 src/version.py 的 HISTORY 绘制,覆盖上表 147 条记录(即两级旧编号 0.4.0 与 0.2.0,以及从 2.5.0 起按规则递增的145个版本)。按级别统计,这145个版本里「中」级变化79条(2.83.0、2.82.0、2.81.0、2.80.0、2.79.0、2.78.0、2.77.0、2.76.0、2.75.0、2.74.0、2.73.0、2.72.0、2.71.0、2.70.0、2.69.0、2.68.0、2.67.0、2.66.0、2.65.0、2.64.0、2.63.0、2.62.0、2.61.0、2.60.0、2.59.0、2.58.0、2.57.0、2.56.0、2.55.0、2.54.0、2.53.0、2.52.0、2.51.0、2.50.0、2.49.0、2.48.0、2.47.0、2.46.0、2.45.0、2.44.0、2.43.0、2.42.0、2.41.0、2.40.0、2.39.0、2.38.0、2.37.0、2.36.0、2.35.0、2.34.0、2.33.0、2.32.0、2.31.0、2.30.0、2.29.0、2.28.0、2.27.0、2.26.0、2.25.0、2.24.0、2.23.0、2.22.0、2.21.0、2.20.0、2.19.0、2.18.0、2.17.0、2.16.0、2.15.0、2.14.0、2.13.0、2.12.0、2.11.0、2.10.0、2.9.0、2.8.0、2.7.0、2.6.0、2.5.0),「小」级变化66条(2.82.2、2.82.1、2.81.7、2.81.6、2.81.5、2.81.4、2.81.3、2.81.2、2.81.1、2.80.2、2.80.1、2.79.1、2.78.4、2.78.3、2.78.2、2.78.1、2.76.1、2.75.1、2.66.1、2.63.1、2.62.1、2.60.1、2.57.2、2.57.1、2.56.1、2.54.1、2.53.2、2.53.1、2.52.1、2.51.1、2.47.1、2.42.1、2.40.1、2.36.2、2.36.1、2.30.1、2.29.1、2.28.1、2.24.2、2.24.1、2.23.3、2.23.2、2.23.1、2.22.1、2.21.2、2.21.1、2.15.2、2.15.1、2.12.1、2.11.9、2.11.8、2.11.7、2.11.6、2.11.5、2.11.4、2.11.3、2.11.2、2.11.1、2.10.4、2.10.3、2.10.2、2.10.1、2.9.2、2.9.1、2.8.2、2.8.1),没有大版本升级。这个分布清楚地显示出这条线的性质——**功能面在 2.5.0 到 2.7.0 之间快速铺开,之后转入以消缺与口径统一为主的密集收敛期**。
 
 ![图 1-1 观澜需求演进时间轴(依据 src/version.py 的 HISTORY)](figures/fig-req-01-需求演进时间轴.png)
 

BIN
docs/数据要求说明_观澜_2.82.2.docx


+ 1 - 0
docs/版本记录.md

@@ -23,6 +23,7 @@
 
 | 版本 | 日期 | 级别 | 主要变更 | 说明 |
 |---|---|---|---|---|
+| `v2.83.0` | 2026-10-05 | 中 | 方案 B:「振动 CMS」按门户原页逐条保真(应用自身样式) | 用户选**方案 B(保真内容、不保皮肤)**。做法:仍走**已验证能显示**的内联 `v-html` 路径(不用 shadow/iframe-for-page ✗),把门户「振动·CMS」节的**全部文字条目逐条补进**:眉标「状态监测 · 振动诊断 (windcms)」· 标题「振动与 SCADA 联合分析」·六层模型说明(全文)· 「振动分析 · 方法与证据边界」三张卡(比较基准/证据关联/结论边界,含各自标题与整段正文)·「在线 · 客户版」+「CMS 振动分析工作台」+ 其说明段 · 两个入口链接(新窗口打开 windcms → / 工作台 →,改为同源 `/cms/…`)·并内嵌 windcms 页(`/cms/?theme=light`,原为写死的 `127.0.0.1:18020`,改同源相对路径)。按窗实时值:当前时间窗 / 需关注 N 台 / 未见异常 M 台 / 证据窗末 / 窗口内报警工单 / CMS 采集窗·时间范围 / CMS 裁决分布 / 行动项·数据时点;原页那条「TCM 六采集窗 · 320 万记录 · 160 万谱」因接口不提供计数,按原文**保留**(保真优先)。**核验(逐条比对)**:原页 19 条文字 → `REQ_TOTAL 19 · MISSING 0` ✓(首轮曾漏 1 条:`使用"持续恶化"…` 我误用直引号,已改为门户原文的中文引号)· `IFRAME Y`(windcms 内嵌)· `LINKS 2` ✓ · 元素 48。远端已部署 36 件。 |
 | `v2.82.2` | 2026-10-05 | 小 | 「振动 CMS」改用与其它子选项卡相同的渲染路径(应用自身样式;弃门户 CSS/Shadow DOM/iframe) | 用户反馈"问题没有解决"(「振动 CMS」选中后仍看不到内容)。此前四种方式在你的环境中均未显示:`v-html` + 门户 CSS ✗、`srcdoc` iframe ✗、**Blob URL** iframe ✗、**Shadow DOM** ✗(其中 Shadow DOM 一轮实逮到:门户 CSS 把变量定义在 `:root{}`,影子树里 `:root` 匹配不到 ⇒ `var(--ground/--ink)` 全失效 ⇒ 白底浅字;改 `:host` 后我这边能读到文本,但你的浏览器仍未显示)。**本轮决定性修法**:放弃"保真皮肤"路线,改用**与其它 5 个子选项卡完全相同、已被证明能显示**的路径 —— `v-html` 注入 `#root`(无 shadow、无 iframe、无门户 CSS);内容 = 门户原文案("状态监测 · 振动诊断 (windcms)"、"振动与 SCADA 联合分析"、"六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → 谱线八闸 → 六枚举裁决")+ **按窗实时值 chip**(当前时间窗 / 需关注 / 未见异常 / 窗口内报警工单 / CMS 采集窗·时间范围 / CMS 裁决分布 / 行动项·数据时点),chip 用**内联样式**(圆角胶囊,不依赖任何外部 CSS)。**核验(真应用 jsdom)**:`#root` → `ELEMENTS 26` · `HAS_TITLE true` · `HAS_LIVE true`(`当前时间窗 · 2026年` + `需关注 35 台`)· `CHIPS 7`;正文首段即上述文案 ✓。远端已部署 36 件。 |
 | `v2.82.1` | 2026-10-05 | 小 | 修「振动 CMS」看着没内容:影子树内 :root 失效,改为 :host | 用户要求"检查一下「振动 CMS」选中后页面有没有内容"。**我自查的结论**:内容**一直在** —— 影子树里共 36,091 字符(门户 CSS + `#cms` 节 + hero + 12 个按窗实时 chip),但**看起来像空的**,原因是:门户 CSS 把全部设计变量定义在 **`:root{--ground:#070C14; --ink:#E6EDF5; …}`**,而 **Shadow DOM 里 `:root` 匹配不到任何元素** ⇒ `var(--ground)`/`var(--ink)` 等**全部失效** ⇒ 没有深色底、文字色回退 ⇒ 浅色文字落在工作台白底上 ⇒ "没内容"的观感。**修**:注入影子树的 CSS 里 `:root` → **`:host`**(`:host` 在影子树中即宿主,正是变量该落的位置),并补一条 `:host{display:block;background:var(--ground,#070C14);color:var(--ink,#E8EBEF)}` 保证底色/文字色。**核验**:影子树 `LEN 36,091` · `HOST_SELECTOR true`(有 `:host{`)· `NO_BARE_ROOT true`(无裸 `:root`)· `HAS_VARS true`(变量在)· `HAS_HERO true` · **`VISIBLE_TEXT true`**(影子树 `textContent` 里能读到「需关注」「当前时间窗」等真实文案)✓;远端已部署 36 件。 |
 | `v2.82.0` | 2026-10-05 | 中 | 门户去掉三项已迁移导航;「振动 CMS」改 Shadow DOM 渲染 | 用户两项:① **门户页去掉「振动·CMS」「交付文档」「数据重算」** —— 三者已分别迁入工作台(振动融合分析的子选项卡 / 交付文档页签 / 系统维护内的数据重算块),故从门户外壳的 `<nav class="tabs">` 中移除对应 `<a data-nav="cms|documents|recalc">`。② **「振动 CMS」内容展示不出** —— 此前依次试过 `v-html`(门户 CSS 不生效)、`srcdoc` iframe、**Blob URL** iframe,在你的浏览器上仍未显示。本轮**彻底换掉 iframe 方案**,改用 **Shadow DOM**:宿主 `div` 上 `attachShadow` ⇒ `shadowRoot.innerHTML = <style>门户 CSS</style> + 门户 #cms 节(含按窗实时 chip)` ⇒ **样式天然隔离**(不污染工作台,也不受工作台样式影响)、无跨文档/跨协议依赖,纯 DOM。**核验(真应用 jsdom,含 shadowRoot 读取)**:门户装配后导航 `cms=false / documents=false / recalc=false` ✓;「振动 CMS」`HOST Y · SHADOW Y · 内容 36,012 字符`、`HAS_PORTAL_CSS true`、`HAS_HERO_TITLE true`(振动与 SCADA 联合分析)、`HAS_CHIPS true`(12 个 chip)、`HAS_LIVE_WIN true`(当前时间窗 · …)✓;远端已部署 36 件 ✓。 |

BIN
docs/系统设计说明_观澜_2.82.2.docx


BIN
docs/需求分析_观澜_2.82.2.docx


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
release/web/assets/index-CYCSs_Es.js


+ 1 - 1
release/web/index.html

@@ -4,7 +4,7 @@
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
   <title>观澜 · 风电数据分析与决策支持</title>
-  <script type="module" crossorigin src="/web/assets/index-BCbJzitb.js"></script>
+  <script type="module" crossorigin src="/web/assets/index-CYCSs_Es.js"></script>
   <link rel="stylesheet" crossorigin href="/web/assets/index--i9X4JtS.css">
 </head>
 <body>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است