| 123456789101112131415161718192021222324252627282930 |
- <!doctype html><meta charset="utf-8"><body style="margin:0;background:#fff">
- <style>.portal-full[data-v-77ae2ea1]{position:fixed;inset:0;background:var(--ground, #fff)}.portal-frame[data-v-77ae2ea1]{width:100%;height:100%;border:0;display:block}.portal-loading[data-v-77ae2ea1]{padding:60px 24px;color:var(--muted, #666);font-size:13px;text-align:center}.portal-wb[data-v-77ae2ea1]{position:fixed;right:14px;bottom:14px;z-index:9;padding:6px 12px;border-radius:14px;background:var(--accent, #0b5fa5);color:#fff;font-size:12px;text-decoration:none}.wb-tabs[data-v-3ea55616]{display:flex;flex-wrap:wrap;gap:6px;padding:10px 18px 0}.wb-tabs button[data-v-3ea55616]{padding:6px 12px;border:1px solid var(--line);background:#fff;border-radius:4px 4px 0 0;cursor:pointer;color:var(--ink)}.wb-tabs button.on[data-v-3ea55616]{background:var(--brand);border-color:var(--brand);color:#fff}.todo[data-v-3ea55616]{font-size:10px;color:var(--muted);margin-left:2px}.wb-tabs button.on .todo[data-v-3ea55616]{color:#ffe9a8}.page-head[data-v-3ea55616]{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:0}.page-head h1[data-v-3ea55616]{font-size:18px;margin:0}.window-badge[data-v-3ea55616]{color:var(--muted);font-size:12.5px}.win-bar[data-v-3ea55616]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.win-select[data-v-3ea55616]{max-width:220px}.winrng[data-v-3ea55616]{display:inline-flex;align-items:center;gap:4px}.winrng input[type=date][data-v-3ea55616]{width:132px}:root{--ink: #16202c;--muted: #6b7a8d;--line: #d7dee8;--bg: #f5f7fa;--card: #ffffff;--brand: #0b5fa5;--bad: #b42318}body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.6 Microsoft YaHei,PingFang SC,system-ui,sans-serif}.top{display:flex;align-items:center;padding:10px 18px;background:var(--brand);color:#fff}.top .brand{font-size:16px;font-weight:600;letter-spacing:.5px}.top nav button{margin-left:8px;padding:6px 12px;border:1px solid rgba(255,255,255,.5);background:transparent;color:#fff;border-radius:4px;cursor:pointer}.top nav button.on{background:#fff;color:var(--brand)}main{padding:0}.card{background:var(--card);border:1px solid var(--line);border-radius:6px;padding:14px 16px;margin-bottom:14px}.card h2{margin:0 0 10px;font-size:15px}.card h2 small{color:var(--muted);font-weight:400}.hint{color:var(--muted);font-size:12.5px}th,td{border-bottom:1px solid var(--line);padding:6px 8px;text-align:left}th{background:#eef2f7;font-weight:600}tr.bad td{color:var(--bad)}code{font-family:Consolas,Courier New,monospace;font-size:12.5px}button.re{margin-left:10px;padding:2px 10px;cursor:pointer}ul{margin:6px 0 0 18px;padding:0}body{max-width:none!important}main#root{padding:0!important}header.top{justify-content:normal!important;flex-wrap:nowrap!important}.page-head{padding:0!important;gap:16px!important;align-items:center!important}:root{--ground:#F5F7F8;--panel:#FFFFFF;--ink:#1B2430;--muted:#5C6B78;--line:#DDE3E8;--hair:#C9D1D8;--accent:#1F6F8B;--accent-deep:#175A71;--accent-soft:#BFDCE6;--wash:#E8F2F6;--critical:#C8372D;--warning:#D48A1E;--unknown:#8A96A0;--good:#2E8B6A;--excellent:#8FCBB5;--bad:var(--critical);--warn:var(--warning);--ok:var(--good);--info:var(--accent);--sans:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif;--mono:"SF Mono",Menlo,Consolas,monospace;--r:10px}*{box-sizing:border-box}html{background:var(--ground)}body{margin:0;background:var(--ground);color:var(--ink);font-family:var(--sans);font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased}body[data-lang=zh]{font-family:PingFang SC,Hiragino Sans GB,Microsoft YaHei,Inter,ui-sans-serif,system-ui,sans-serif}a{color:var(--accent-deep);text-decoration:none}a:hover{text-decoration:underline}.wrap{max-width:1200px;margin:0 auto;padding:0 28px 72px}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.num{font-variant-numeric:tabular-nums}.small{font-size:12.5px}.muted{color:var(--muted)}h1,h2,h3{margin:0;font-weight:600;letter-spacing:-.005em;text-wrap:balance}h2{font-size:15px}h3{font-size:14px}@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}header.top{display:flex;align-items:center;gap:14px;padding:18px 0 12px}.mark{display:inline-flex;align-items:center;gap:9px}.mark svg{width:26px;height:26px;color:var(--accent)}.brand{font-weight:600;font-size:18px;letter-spacing:-.01em}.brand small{font-weight:400;color:var(--muted);margin-left:8px;font-size:13px}.tag{font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border:1px solid var(--hair);border-radius:4px;padding:2px 7px}header.top .right{margin-left:auto;display:flex;gap:8px;align-items:center}select,input,button{font:inherit;font-size:13px;color:var(--ink)}select,input{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:6px 10px}input::placeholder{color:var(--muted)}.toggle{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden;background:var(--panel)}.toggle button{border:0;background:transparent;padding:6px 12px;cursor:pointer;color:var(--muted)}.toggle button.on{background:var(--ink);color:#fff}nav.tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);flex-wrap:wrap}nav.tabs button{font-size:13.5px;border:0;background:transparent;color:var(--muted);padding:9px 12px 10px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}nav.tabs button.on{color:var(--accent-deep);border-bottom-color:var(--accent);font-weight:500}section{margin-top:26px}.sechead{display:flex;align-items:baseline;gap:12px;margin-bottom:10px}.sechead .meta{color:var(--muted);font-size:12.5px}.sechead .legend{margin-left:auto}.legend{display:flex;gap:14px;font-size:12px;color:var(--muted)}.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;vertical-align:-1px;margin-right:5px}.eyebrow{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:22px 0 8px}.btn{padding:7px 16px;border-radius:7px;border:1px solid var(--accent);background:var(--accent);color:#fff;font-weight:500;cursor:pointer}.btn:hover{background:var(--accent-deep);border-color:var(--accent-deep)}.btn.quiet{background:transparent;color:var(--accent-deep)}.btn:disabled{opacity:.5;cursor:not-allowed}.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px}.mb{margin-bottom:12px}.tblwrap{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:13px}th{font-weight:500;color:var(--muted);text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);font-size:12px;letter-spacing:.02em;white-space:nowrap}td{padding:7px 10px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;vertical-align:top}tr:last-child td{border-bottom:0}td.r,th.r{text-align:right}.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}.kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 11px;position:relative}.kpi:before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:0 2px 2px 0;background:var(--accent)}.kpi.warn:before{background:var(--warning)}.kpi.bad:before{background:var(--critical)}.kpi.ok:before{background:var(--good)}.kpi b{display:block;font-size:24px;font-weight:600;letter-spacing:-.02em;line-height:1.15;font-variant-numeric:tabular-nums}.kpi b small{font-size:13px;font-weight:500;color:var(--muted);margin-left:2px}.kpi span{display:block;font-size:12px;color:var(--muted);margin-top:4px}.chip{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:500;padding:2px 8px;border-radius:5px;white-space:nowrap;line-height:1.5}.chip.bad{background:#c8372d1a;color:var(--critical)}.chip.warn{background:#d48a1e24;color:#9c6410}.chip.unk{background:#8a96a029;color:#4f5b66}.chip.ok{background:#2e8b6a1f;color:#22705a}.chip.ex{background:#8fcbb538;color:#2e7a62}.evid{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.tier{font-family:var(--mono);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;padding:2px 7px;border-radius:4px;border:1px solid var(--hair);color:var(--muted);white-space:nowrap}.tier.confirmed{background:var(--ink);border-color:var(--ink);color:#fff}.tier.near{border-color:var(--ink);color:var(--ink)}.tier.candidate{border-color:var(--muted);color:var(--muted)}.tier.insufficient{border-style:dashed}.tier.withdrawn{text-decoration:line-through}.rv{font-family:var(--mono);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}.rv:before{content:"·";margin-right:3px;color:var(--hair)}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:12px}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 12px 18px;position:relative;transition:box-shadow .15s}.card:before{content:"";position:absolute;left:0;top:12px;bottom:12px;width:3px;border-radius:0 2px 2px 0;background:var(--sev,var(--hair))}.card.lit{box-shadow:0 0 0 2px var(--accent-soft)}.card .head{display:flex;align-items:baseline;gap:10px}.card .unit{font-weight:600;font-size:19px;letter-spacing:-.02em;font-variant-numeric:tabular-nums}.card .sys{color:var(--muted);font-size:13px}.card .why{margin:8px 0 9px;font-size:13.5px}.caveat{font-size:12px;color:var(--muted);border-top:1px solid var(--line);padding-top:7px;margin-top:2px;line-height:1.5}.caveat b{font-family:var(--mono);font-weight:500;font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-right:7px}.spark{height:28px;display:flex;align-items:flex-end;gap:2px;margin:9px 0 8px}.spark i{flex:1;display:block;background:var(--accent);border-radius:1px 1px 0 0}.strip{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 8px}.cells{display:grid;grid-template-columns:repeat(var(--n,38),1fr);gap:4px}.cell{aspect-ratio:1;border-radius:3px;background:var(--excellent);transition:transform .1s}.cell.hot{cursor:pointer}.cell.hot:hover{transform:translateY(-2px)}.cell.bad{background:var(--critical)}.cell.warn{background:var(--warning)}.cell.unk{background:var(--unknown)}.cell.ok{background:var(--good)}.cell.lit{outline:2px solid var(--ink);outline-offset:1px}.nums{display:grid;grid-template-columns:repeat(var(--n,38),1fr);gap:4px;margin-top:5px;font-family:var(--mono);font-size:9.5px;color:var(--muted);text-align:center}.nums span.hot{color:var(--ink);font-weight:500}.quiet{color:var(--muted);font-size:13px;margin-top:10px}.quiet b{color:var(--ink);font-weight:500}.systems{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}.sysc{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:11px 13px;display:grid;gap:7px}.sysc .t{display:flex;justify-content:space-between;align-items:baseline}.sysc .t b{font-weight:500}.sysc .t a{font-size:12px}.bar{display:flex;height:6px;border-radius:3px;overflow:hidden;background:var(--line)}.bar i{display:block;height:100%}.sysc .cnt{display:flex;gap:10px;font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums}.sysc .cnt i{display:inline-block;width:7px;height:7px;border-radius:2px;margin-right:4px}.skel{height:12px;border-radius:6px;background:linear-gradient(90deg,var(--line),var(--panel),var(--line));background-size:200% 100%;animation:sk 1.2s linear infinite}@keyframes sk{to{background-position:-200% 0}}.verbatim{font-family:PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif}code{font-family:var(--mono);font-size:11.5px}.pill{font-size:13px;padding:6px 14px;border-radius:999px;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer}.pill.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500}.qitem{font-size:13px;cursor:pointer;border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin-top:8px;background:var(--panel)}.qitem:hover{border-color:var(--accent-soft);background:var(--wash)}.badge{display:inline-block;font-size:11.5px;padding:1px 8px;border-radius:5px;border:1px solid var(--hair);color:var(--muted)}.badge.ok{border-color:var(--good);color:var(--good)}.badge.warn{border-color:var(--warning);color:#9c6410}.paper{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:26px 30px;margin-top:14px}.paper-hd{display:flex;justify-content:space-between;align-items:flex-start;padding-bottom:12px;margin-bottom:16px;border-bottom:2px solid var(--ink)}.paper-ti{font-weight:600;font-size:17px;letter-spacing:-.01em}.paper-ft{display:flex;justify-content:space-between;gap:16px;font-size:11.5px;color:var(--muted);padding-top:10px;margin-top:16px;border-top:1px solid var(--line);flex-wrap:wrap}.paper .panel{border-radius:8px}svg.dt text{font-family:var(--sans)}@media print{.noprint,nav.tabs,header.top,footer{display:none!important}.wrap{padding:0;max-width:none}.paper{border:0;padding:0}body{background:#fff}}.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(480px,1fr));gap:12px}.grid2 .span2{grid-column:1/-1}i.bar{display:inline-block;height:10px;border-radius:2px;vertical-align:middle;margin-right:6px;opacity:.85}.duo{display:inline-flex;align-items:stretch;border:1px solid var(--c,var(--hair));border-radius:5px;overflow:hidden;font-size:11.5px;line-height:1.5;max-width:100%}.duo .st{padding:1px 7px;background:var(--c,var(--hair));color:#fff;font-weight:500;white-space:nowrap}.duo .ev{padding:1px 7px;color:var(--ink);background:var(--panel);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}.chain{display:inline-flex;gap:2px;vertical-align:middle}.chain i{display:inline-block;width:11px;height:11px;border-radius:2px;border:1px solid var(--hair);background:var(--panel)}.chain i.on{border-color:var(--accent)}table.fmx td{vertical-align:top;padding:6px 8px}table.fmx th div{line-height:1.3}.popm{position:fixed;inset:0;z-index:9999;background:#1b24308c;overflow:auto;padding:24px 16px}.popc{max-width:1120px;margin:0 auto;background:var(--ground);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px}.poph{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid var(--line)}.poph h3{font-size:16px}:root{--r:12px;--shadow:0 3px 16px rgba(23,51,68,.035)}.wrap{max-width:1360px;padding:0 32px 64px}header.top{padding:24px 0 20px;gap:24px}.brand{font-size:21px;letter-spacing:-.035em}.brand small{letter-spacing:0;font-size:12px}.mark{gap:12px}nav.tabs{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px;padding:6px;background:#eaf0f3;border:1px solid var(--line);border-radius:12px}nav.tabs button{margin:0;padding:10px 6px;min-height:40px;border:0;border-radius:7px;font-size:12px;line-height:1.3}nav.tabs button:hover{color:var(--accent-deep);background:#f5f9fa}nav.tabs button.on{color:var(--accent-deep);background:var(--panel);box-shadow:0 1px 5px #17334412;font-weight:600}.page-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:28px 0 16px}.page-head h1{font-size:28px;line-height:1.2;letter-spacing:-.035em}.window-badge{font-size:11px;font-weight:500;white-space:nowrap;color:var(--accent-deep);border:1px solid #CDDEE6;background:#ecf4f7;padding:5px 10px;border-radius:6px}.page-head+section{margin-top:0}.sechead{flex-wrap:wrap;row-gap:6px;margin-bottom:14px}.sechead h2{font-size:18px;letter-spacing:-.025em}.legend{flex-wrap:wrap;row-gap:5px}.panel,.card,.kpi,.strip,.sysc{box-shadow:var(--shadow)}.panel{padding:18px}.panel>h3{font-size:15px;line-height:1.45;margin-bottom:8px}.panel,.grid2>*{min-width:0}.kpis{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.kpi{padding:18px 20px;min-height:108px}.kpi:before{top:18px;bottom:18px}.kpi b{font-size:29px;line-height:1.1}.kpi b small{margin-left:5px;font-size:12px}.kpi span{font-size:12px;margin-top:9px;line-height:1.45;max-width:36ch}.cards{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:16px}.card{padding:20px 22px 18px}.card .head{align-items:start;flex-wrap:wrap;gap:8px}.card .unit{font-size:23px;line-height:1.15;white-space:nowrap}.card .sys{flex:1;min-width:90px;line-height:1.45}.card .head .chip{margin-left:auto}.card .evid{margin:12px 0 8px}.card .caveat{font-size:12px;line-height:1.65;padding-top:12px}.evidence-detail{margin-top:14px;background:#f5f8fa;border:1px solid #E5ECF0;border-radius:7px;padding:9px 12px}.evidence-detail summary{cursor:pointer;color:var(--accent-deep);font-size:12px;font-weight:500}.card .why{line-height:1.7;margin:10px 0 3px}.sysc{padding:16px;gap:12px}.sysc[role=button]{cursor:pointer}.sysc[role=button]:hover{border-color:#9dbeca;background:#fbfdfe}.grid2{grid-template-columns:repeat(auto-fit,minmax(min(100%,440px),1fr));gap:16px}.tblwrap{max-width:100%;border-radius:7px;overscroll-behavior-x:contain}th{background:#f4f7f9;font-size:11px;font-weight:600;letter-spacing:.025em;padding:10px 12px}td{padding:11px 12px;line-height:1.6}tr:hover>td{background:#f7fafc}td.r,th.r{white-space:nowrap}.strip{overflow-x:auto;padding:18px}.strip .cells,.strip .nums{min-width:850px}footer{border-top:1px solid var(--line);padding-top:18px;line-height:1.7;font-size:11px!important}.popm{padding:24px;background:#11232f94;backdrop-filter:blur(3px)}.popc{max-width:1240px;padding:0 0 8px;border-radius:16px;box-shadow:0 24px 80px #0e263640}.poph{position:sticky;top:-24px;z-index:2;align-items:center;padding:20px 24px;margin:0 0 20px;background:var(--panel);border-radius:16px 16px 0 0;box-shadow:0 2px 8px #17334405}.poph h3{font-size:23px;line-height:1.3;letter-spacing:-.025em}.poph .btn{flex-shrink:0;min-height:36px;border-color:var(--line);background:var(--ground)}.popc>.panel,.popc>p{margin:16px 20px}.popc>.panel{padding:20px}.popc>.panel>.head{align-items:center!important;margin-bottom:10px;font-size:17px}.popc>.panel>.small{max-width:105ch;line-height:1.7}.popc .grid2>.panel{padding:16px;box-shadow:none;background:#fbfcfd}.order-block{margin-top:24px;border-top:1px solid var(--line);padding-top:18px}.order-head{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin-bottom:12px}.order-head>b{font-size:14px}.action-counts{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.action-count{display:inline-flex;gap:7px;align-items:center;background:var(--wash);color:var(--accent-deep);border:1px solid #D5E7EF;border-radius:5px;padding:3px 8px;font-size:11px}.action-count b{font-variant-numeric:tabular-nums;font-weight:600}.order-table{table-layout:fixed;min-width:780px}.order-table .order-date{width:112px;white-space:nowrap}.order-table td{overflow-wrap:anywhere;padding-top:14px;padding-bottom:14px}.order-table td.order-date{overflow-wrap:normal;font-size:12px;color:var(--muted)}.popup-verbatim-note{color:var(--muted);font-size:11px;line-height:1.7;padding:0 4px}.verbatim{border-bottom:1px dotted #B9C6CF}@media(min-width:1440px){.kpis{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(max-width:900px){.wrap{padding:0 20px 48px}.brand small{display:block;margin:3px 0 0}.cards{grid-template-columns:1fr}.sechead .legend{margin-left:0;width:100%}.popm{padding:12px}.poph{top:-12px}.systems{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.wrap{padding:0 14px 40px}header.top{flex-wrap:wrap;gap:14px;padding:18px 0}.brand{font-size:20px}header.top .right{margin-left:0;width:100%;gap:8px}header.top select{flex:1;min-width:0}nav.tabs{grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;padding:5px}nav.tabs button{font-size:11.5px;min-height:36px;text-align:left;padding:8px 10px}.page-head{margin:22px 0 14px;align-items:flex-start}.page-head h1{font-size:23px}.window-badge{font-size:10px;padding:4px 7px}.kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.kpi{padding:14px;min-height:116px}.kpi b{font-size:24px}.kpi span{font-size:11px}.systems{grid-template-columns:1fr}.panel{padding:14px}.card{padding:16px}.card .head .sys{font-size:12px}.card .unit{font-size:21px}.popm{padding:8px}.popc{border-radius:12px}.poph{top:-8px;padding:15px 14px;border-radius:12px 12px 0 0;margin-bottom:12px}.poph h3{font-size:19px}.popc>.panel,.popc>p{margin:12px 10px}.popc>.panel{padding:14px}.popc .grid2>.panel{padding:12px}.order-head{gap:8px}.paper{padding:18px 14px}.paper-hd{gap:12px;flex-wrap:wrap}}@media print{.evidence-detail{display:block}.poph{position:static}nav.tabs,header.top,.page-head .window-badge{display:none!important}.card,.panel,.kpi{box-shadow:none}}body{background:radial-gradient(ellipse at 95% 0,rgba(41,201,187,.075),transparent 40%),var(--ground)}header.top{position:relative;isolation:isolate;overflow:hidden;min-height:128px;margin:22px 0 12px;padding:28px 30px;border:1px solid #1F526A;border-radius:18px;background:radial-gradient(ellipse at 68% 120%,#08788788,transparent 60%),linear-gradient(115deg,#092438,#103e55);box-shadow:0 10px 32px #0a344416}header.top:before{content:"";position:absolute;z-index:-1;inset:0;opacity:.16;background-image:linear-gradient(#73B4C425 1px,transparent 1px),linear-gradient(90deg,#73B4C425 1px,transparent 1px);background-size:28px 28px;pointer-events:none}.wind-field{position:absolute;width:420px;height:130px;left:35%;bottom:0;color:#61dbce;opacity:.4;pointer-events:none;z-index:-1}header.top .mark{gap:15px}header.top .mark>svg{width:36px;height:36px;color:#65e1d0;padding:5px;border:1px solid #66CCBE55;border-radius:10px;background:#73e4ce0d}header.top .brand{font-size:27px;color:#f4ffff;letter-spacing:-.035em}header.top .brand small{display:block;margin:3px 0 0;font-size:11px;letter-spacing:.035em;color:#b3d6df}header.top .right{position:relative;padding:9px 11px;border:1px solid #759EAD44;border-radius:10px;background:#092a3ebf}header.top .right label{color:#b9d7e1}header.top select{background:#153e52;color:#e5faff;border-color:#3a6576}header.top .toggle{background:#e9f5f7;border-color:#527887}nav.tabs{background:#e4eff2;border-color:#d1e3e8;gap:5px}nav.tabs button.on{color:#fff;background:linear-gradient(110deg,#087788,#006975);box-shadow:0 3px 8px #08778820}nav.tabs button:hover:not(.on){background:#f7ffff;color:#00636b}.page-head h1{position:relative;padding-left:14px}.page-head h1:before{content:"";position:absolute;left:0;top:4px;bottom:2px;width:4px;border-radius:3px;background:linear-gradient(#07949c,#46c7ab)}.window-badge{background:#e5f5f3;border-color:#bddcd8;color:#00636b}.kpi{background:linear-gradient(140deg,#fff 65%,#eef9f8)}.evidence-detail{background:#f0f8f9;border-color:#daecee}.panel,.card,.sysc{border-color:#d7e5eb}.sysc[role=button]:hover{border-color:#69aaa9}a:hover{color:#008591}:focus-visible{outline-color:#05a2ad;outline-width:3px}@media(max-width:900px){header.top{padding:24px;gap:16px}.wind-field{left:34%;width:280px;opacity:.25}}@media(max-width:600px){header.top{margin-top:14px;padding:20px 17px;min-height:156px;border-radius:14px;gap:18px}header.top .brand{font-size:25px}header.top .brand small{font-size:10px}header.top .right{padding:8px;width:100%}.wind-field{left:auto;right:-50px;bottom:46px;width:230px;opacity:.22}header.top .mark{gap:12px}}@media print{body{background:#fff}.page-head h1:before{display:none}.kpi{background:#fff}a{color:inherit}}.source-record{margin-top:5px;font-size:10px;color:var(--muted);font-weight:400;line-height:1.6}.source-record summary{cursor:pointer;display:list-item;color:var(--accent-deep)}.source-record[open]{background:var(--ground);border:1px solid var(--line);border-radius:6px;padding:7px}.source-record>div{margin-top:6px;font-size:12px;overflow-wrap:anywhere}header.top .right .back-portal,header.top .right .reselect{display:inline-block;margin-right:8px;padding:6px 11px;border:1px solid #759EAD66;border-radius:8px;background:#0e3446;color:#e5faff;font-size:12.5px;text-decoration:none;cursor:pointer;line-height:1.3}header.top .right .back-portal:hover,header.top .right .reselect:hover{background:#155069;border-color:#9bc6d3}
- </style>
- <div id="host"></div><pre id="out">pending</pre>
- <script>
- const svgs = {"water":"<svg class=\"dt\" viewBox=\"0 0 720 300\" style=\"width:720px;max-width:100%;height:auto\" role=\"img\"><line x1=\"8\" y1=\"236\" x2=\"712\" y2=\"236\" stroke=\"var(--line)\"></line><text x=\"8.0\" y=\"14.0\" font-size=\"9.5\" fill=\"var(--muted)\">MWh</text><rect x=\"20.3\" y=\"30.0\" width=\"63.4\" height=\"206.0\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"></rect><text x=\"52.0\" y=\"24.0\" font-size=\"10\" fill=\"var(--ink)\" text-anchor=\"middle\" font-weight=\"600\">287,713</text><text x=\"52.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">理论可发</text><rect x=\"108.3\" y=\"30.0\" width=\"63.4\" height=\"12.0\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"83.7\" y1=\"30.0\" x2=\"108.3\" y2=\"30.0\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"140.0\" y=\"24.0\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−16,799</text><text x=\"140.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">限电 (命令与实际功率…</text><title>限电 (命令与实际功率对得上): 损失 16,799 MWh, 占理论 5.8%, 时长 76,824h</title><rect x=\"196.3\" y=\"42.0\" width=\"63.4\" height=\"8.8\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"171.7\" y1=\"42.0\" x2=\"196.3\" y2=\"42.0\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"228.0\" y=\"36.0\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−12,249</text><text x=\"228.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">故障与检修停机</text><title>故障与检修停机: 损失 12,249 MWh, 占理论 4.3%, 时长 10,801h</title><rect x=\"284.3\" y=\"50.8\" width=\"63.4\" height=\"3.6\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"259.7\" y1=\"50.8\" x2=\"284.3\" y2=\"50.8\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"316.0\" y=\"44.8\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−5,080</text><text x=\"316.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">限电命令期 · 功率未…</text><title>限电命令期 · 功率未被压制: 损失 5,080 MWh, 占理论 1.8%, 时长 55,538h</title><rect x=\"372.3\" y=\"54.4\" width=\"63.4\" height=\"1.3\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"347.7\" y1=\"54.4\" x2=\"372.3\" y2=\"54.4\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"404.0\" y=\"48.4\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−1,872</text><text x=\"404.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">正常发电时的欠发</text><title>正常发电时的欠发: 损失 1,872 MWh, 占理论 0.7%, 时长 65,137h</title><rect x=\"460.3\" y=\"55.8\" width=\"63.4\" height=\"1.2\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"435.7\" y1=\"55.8\" x2=\"460.3\" y2=\"55.8\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"492.0\" y=\"49.8\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−828</text><text x=\"492.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">调度令停机</text><title>调度令停机: 损失 828 MWh, 占理论 0.3%, 时长 644h</title><rect x=\"548.3\" y=\"56.4\" width=\"63.4\" height=\"1.2\" rx=\"2\" fill=\"var(--critical)\" fill-opacity=\"0.55\"></rect><line x1=\"523.7\" y1=\"56.4\" x2=\"548.3\" y2=\"56.4\" stroke=\"var(--muted)\" stroke-dasharray=\"2 2\" stroke-opacity=\".6\"></line><text x=\"580.0\" y=\"50.4\" font-size=\"10\" fill=\"var(--critical)\" text-anchor=\"middle\" font-weight=\"600\">−141</text><text x=\"580.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">低风待机</text><title>低风待机: 损失 141 MWh, 占理论 0.0%, 时长 11,018h</title><rect x=\"636.3\" y=\"56.5\" width=\"63.4\" height=\"179.5\" rx=\"2\" fill=\"var(--good)\" fill-opacity=\"0.6\"></rect><text x=\"668.0\" y=\"50.5\" font-size=\"10\" fill=\"var(--good)\" text-anchor=\"middle\" font-weight=\"600\">250,744</text><text x=\"668.0\" y=\"250.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">实际上网</text></svg>","blame":"<svg class=\"dt\" viewBox=\"0 0 500 44\" style=\"width:500px;max-width:100%;height:auto\" role=\"img\"><text x=\"0.0\" y=\"8.0\" font-size=\"9\" fill=\"var(--muted)\">损失 36,969 MWh 按责任归属</text><rect x=\"0.0\" y=\"12\" width=\"307.1\" height=\"26\" rx=\"3\" fill=\"var(--accent)\" fill-opacity=\".55\"><title>交易与调度侧: 22,707 MWh</title></rect><text x=\"153.6\" y=\"29.0\" font-size=\"10.5\" fill=\"currentColor\" text-anchor=\"middle\" font-weight=\"600\">61%</text><rect x=\"307.1\" y=\"12\" width=\"165.7\" height=\"26\" rx=\"3\" fill=\"var(--critical)\" fill-opacity=\".55\"><title>设备侧: 12,249 MWh</title></rect><text x=\"389.9\" y=\"29.0\" font-size=\"10.5\" fill=\"currentColor\" text-anchor=\"middle\" font-weight=\"600\">33%</text><rect x=\"472.8\" y=\"12\" width=\"27.2\" height=\"26\" rx=\"3\" fill=\"var(--muted)\" fill-opacity=\".55\"><title>运行侧: 2,013 MWh</title></rect></svg>","ram":"<svg class=\"dt\" viewBox=\"0 0 720 340\" style=\"width:720px;max-width:100%;height:auto\" role=\"img\"><line x1=\"96.5\" y1=\"16\" x2=\"96.5\" y2=\"292\" stroke=\"var(--line)\" stroke-opacity=\".3\"></line><text x=\"96.5\" y=\"306.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">1k</text><line x1=\"195.1\" y1=\"16\" x2=\"195.1\" y2=\"292\" stroke=\"var(--line)\" stroke-opacity=\".3\"></line><text x=\"195.1\" y=\"306.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">2k</text><line x1=\"325.4\" y1=\"16\" x2=\"325.4\" y2=\"292\" stroke=\"var(--line)\" stroke-opacity=\".3\"></line><text x=\"325.4\" y=\"306.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">5k</text><line x1=\"424.0\" y1=\"16\" x2=\"424.0\" y2=\"292\" stroke=\"var(--line)\" stroke-opacity=\".3\"></line><text x=\"424.0\" y=\"306.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">10k</text><line x1=\"522.5\" y1=\"16\" x2=\"522.5\" y2=\"292\" stroke=\"var(--line)\" stroke-opacity=\".3\"></line><text x=\"522.5\" y=\"306.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">20k</text><text x=\"50.0\" y=\"295.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">0</text><text x=\"50.0\" y=\"234.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">5</text><text x=\"50.0\" y=\"173.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">10</text><text x=\"50.0\" y=\"112.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">15</text><text x=\"50.0\" y=\"51.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">20</text><line x1=\"56\" y1=\"292\" x2=\"608\" y2=\"292\" stroke=\"var(--line)\"></line><line x1=\"56\" y1=\"16\" x2=\"56\" y2=\"292\" stroke=\"var(--line)\"></line>\n <line x1=\"353.0\" y1=\"16\" x2=\"353.0\" y2=\"292\" stroke=\"var(--muted)\" stroke-dasharray=\"3 3\" stroke-opacity=\".45\"></line>\n <line x1=\"56\" y1=\"161.5\" x2=\"608\" y2=\"161.5\" stroke=\"var(--muted)\" stroke-dasharray=\"3 3\" stroke-opacity=\".45\"></line>\n <text x=\"62.0\" y=\"28.0\" font-size=\"10\" fill=\"var(--muted)\" text-anchor=\"start\" opacity=\"0.9\">常坏且难修</text><text x=\"62.0\" y=\"40.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"start\" opacity=\"0.62\">最高优先级</text><text x=\"602.0\" y=\"28.0\" font-size=\"10\" fill=\"var(--muted)\" text-anchor=\"end\" opacity=\"0.9\">罕发难修</text><text x=\"602.0\" y=\"40.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"end\" opacity=\"0.62\">备件与作业窗</text>\n <text x=\"62.0\" y=\"276.0\" font-size=\"10\" fill=\"var(--muted)\" text-anchor=\"start\" opacity=\"0.9\">频发易修</text><text x=\"62.0\" y=\"288.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"start\" opacity=\"0.62\">查根因, 换件无用</text><text x=\"602.0\" y=\"276.0\" font-size=\"10\" fill=\"var(--muted)\" text-anchor=\"end\" opacity=\"0.9\">少发好修</text><text x=\"602.0\" y=\"288.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"end\" opacity=\"0.62\">维持</text>\n <circle cx=\"82.2\" cy=\"243.2\" r=\"17.0\" fill=\"var(--muted)\" fill-opacity=\"0.3\" stroke=\"var(--muted)\" stroke-width=\"1.2\" stroke-dasharray=\"3 2\"><title>运维操作: 平均无故障间隔(MTBF)904h · 单次停机时长(MDT)4h · 停机 951h · 235起 · 38台 · 外部类不计设备可靠性</title></circle><text x=\"103.2\" y=\"246.7\" font-size=\"9.5\" fill=\"var(--muted)\">运维操作</text><circle cx=\"262.7\" cy=\"161.5\" r=\"15.2\" fill=\"var(--critical)\" fill-opacity=\"0.42\" stroke=\"var(--critical)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>变流器: 平均无故障间隔(MTBF)3218h · 单次停机时长(MDT)10.7h · 停机 707h · 66起 · 27台</title></circle><text x=\"281.9\" y=\"165.0\" font-size=\"9.5\" fill=\"currentColor\">变流器</text><circle cx=\"276.3\" cy=\"170.0\" r=\"14.3\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>偏航: 平均无故障间隔(MTBF)3540h · 单次停机时长(MDT)10h · 停机 602h · 60起 · 24台</title></circle><text x=\"294.6\" y=\"173.5\" font-size=\"9.5\" fill=\"currentColor\">偏航</text><circle cx=\"254.4\" cy=\"190.7\" r=\"14.2\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>未归类: 平均无故障间隔(MTBF)3034h · 单次停机时长(MDT)8.3h · 停机 581h · 70起 · 22台</title></circle><text x=\"272.5\" y=\"194.2\" font-size=\"9.5\" fill=\"currentColor\">未归类</text><circle cx=\"228.5\" cy=\"212.7\" r=\"13.9\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>变桨与液压: 平均无故障间隔(MTBF)2529h · 单次停机时长(MDT)6.5h · 停机 547h · 84起 · 32台</title></circle><text x=\"246.3\" y=\"216.2\" font-size=\"9.5\" fill=\"currentColor\">变桨与液压</text><circle cx=\"400.8\" cy=\"45.6\" r=\"13.5\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>主控与传感网: 平均无故障间隔(MTBF)8496h · 单次停机时长(MDT)20.2h · 停机 506h · 25起 · 16台</title></circle><text x=\"418.3\" y=\"49.1\" font-size=\"9.5\" fill=\"currentColor\">主控与传感网</text><circle cx=\"353.0\" cy=\"159.0\" r=\"12.2\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>塔架/结构: 平均无故障间隔(MTBF)6069h · 单次停机时长(MDT)10.9h · 停机 380h · 35起 · 21台</title></circle><text x=\"369.2\" y=\"162.5\" font-size=\"9.5\" fill=\"currentColor\">塔架/结构</text><circle cx=\"439.8\" cy=\"134.6\" r=\"10.6\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>轮毂/叶片: 平均无故障间隔(MTBF)11179h · 单次停机时长(MDT)12.9h · 停机 245h · 19起 · 10台</title></circle><text x=\"454.4\" y=\"138.1\" font-size=\"9.5\" fill=\"currentColor\">轮毂/叶片</text><circle cx=\"517.5\" cy=\"74.9\" r=\"9.9\" fill=\"var(--accent)\" fill-opacity=\"0.42\" stroke=\"var(--accent)\" stroke-width=\"1.2\" stroke-dasharray=\"\"><title>齿轮箱: 平均无故障间隔(MTBF)19310h · 单次停机时长(MDT)17.8h · 停机 196h · 11起 · 4台</title></circle><text x=\"531.4\" y=\"78.4\" font-size=\"9.5\" fill=\"currentColor\">齿轮箱</text><circle cx=\"581.8\" cy=\"66.3\" r=\"8.8\" fill=\"var(--muted)\" fill-opacity=\"0.3\" stroke=\"var(--muted)\" stroke-width=\"1.2\" stroke-dasharray=\"3 2\"><title>电网/供电(外部): 平均无故障间隔(MTBF)30344h · 单次停机时长(MDT)18.5h · 停机 130h · 7起 · 5台 · 外部类不计设备可靠性</title></circle><text x=\"594.6\" y=\"69.8\" font-size=\"9.5\" fill=\"var(--muted)\">电网/供电(外</text><circle cx=\"419.0\" cy=\"272.5\" r=\"6.5\" fill=\"var(--muted)\" fill-opacity=\"0.3\" stroke=\"var(--muted)\" stroke-width=\"1.2\" stroke-dasharray=\"3 2\"><title>风况(外部): 平均无故障间隔(MTBF)9655h · 单次停机时长(MDT)1.6h · 停机 35h · 22起 · 9台 · 外部类不计设备可靠性</title></circle><text x=\"429.5\" y=\"276.0\" font-size=\"9.5\" fill=\"var(--muted)\">风况(外部)</text><text x=\"332.0\" y=\"332.0\" font-size=\"9.5\" fill=\"var(--muted)\" text-anchor=\"middle\">平均无故障间隔(MTBF,h,对数)→ 越右越可靠</text>\n <text x=\"13.0\" y=\"154.0\" font-size=\"9.5\" fill=\"var(--muted)\" text-anchor=\"middle\" transform=\"rotate(-90 13 154.0)\">单次停机时长(MDT,h)→ 越上越难修</text>\n <circle cx=\"624\" cy=\"56\" r=\"5\" fill=\"var(--accent)\" fill-opacity=\".42\" stroke=\"var(--accent)\"></circle><text x=\"634.0\" y=\"60.0\" font-size=\"9\" fill=\"var(--muted)\">设备类</text>\n <circle cx=\"624\" cy=\"74\" r=\"5\" fill=\"var(--muted)\" fill-opacity=\".3\" stroke=\"var(--muted)\" stroke-dasharray=\"3 2\"></circle><text x=\"634.0\" y=\"78.0\" font-size=\"9\" fill=\"var(--muted)\">外部类</text>\n <text x=\"614.0\" y=\"100.0\" font-size=\"8.5\" fill=\"var(--muted)\">圆面积 = 累计停机时长</text><text x=\"614.0\" y=\"114.0\" font-size=\"8.5\" fill=\"var(--muted)\">虚线 = 本场中位分界</text></svg>","pareto":"<svg class=\"dt\" viewBox=\"0 0 520 236\" style=\"width:520px;max-width:100%;height:auto\" role=\"img\"><line x1=\"46\" y1=\"196\" x2=\"480\" y2=\"196\" stroke=\"var(--line)\"></line><line x1=\"46\" y1=\"14\" x2=\"46\" y2=\"196\" stroke=\"var(--line)\"></line><rect x=\"51.1\" y=\"14.0\" width=\"26.0\" height=\"182.0\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.85\"><title>3225 液压监控·轮毂(变桨)压力偏高: 5,925 条</title></rect><rect x=\"87.2\" y=\"151.8\" width=\"26.0\" height=\"44.2\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.85\"><title>3130 变桨轴承润滑(执行中): 1,439 条</title></rect><rect x=\"123.4\" y=\"161.4\" width=\"26.0\" height=\"34.6\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.85\"><title>3224 液压监控·系统油压偏高: 1,128 条</title></rect><rect x=\"159.6\" y=\"163.0\" width=\"26.0\" height=\"33.0\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>13902 变流器跳闸(自动重启): 1,074 条</title></rect><rect x=\"195.7\" y=\"174.0\" width=\"26.0\" height=\"22.0\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>10105 自动解缆停机: 716 条</title></rect><rect x=\"231.9\" y=\"179.5\" width=\"26.0\" height=\"16.5\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>1161 风速不足以切入: 536 条</title></rect><rect x=\"268.1\" y=\"181.8\" width=\"26.0\" height=\"14.2\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>13905 变流器降功率运行(DG): 463 条</title></rect><rect x=\"304.2\" y=\"181.8\" width=\"26.0\" height=\"14.2\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>1020 就地操作模式: 461 条</title></rect><rect x=\"340.4\" y=\"185.1\" width=\"26.0\" height=\"10.9\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>63003 电网停电停机: 354 条</title></rect><rect x=\"376.6\" y=\"185.6\" width=\"26.0\" height=\"10.4\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>5122 电网故障穿越(FRT)动作: 337 条</title></rect><rect x=\"412.7\" y=\"185.8\" width=\"26.0\" height=\"10.2\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>63004 UPS电池电压低: 331 条</title></rect><rect x=\"448.9\" y=\"187.6\" width=\"26.0\" height=\"8.4\" rx=\"2\" fill=\"var(--accent)\" fill-opacity=\"0.45\"><title>10400 偏航失败-等待: 273 条</title></rect>\n <line x1=\"46\" y1=\"50.4\" x2=\"480\" y2=\"50.4\" stroke=\"var(--warning)\" stroke-dasharray=\"4 3\" stroke-opacity=\".7\"></line>\n <text x=\"477.0\" y=\"46.4\" font-size=\"9\" fill=\"var(--warning)\" text-anchor=\"end\">累计 80%</text>\n <polyline points=\"64.1,113.3 100.2,93.2 136.4,77.4 172.6,62.5 208.8,52.5 244.9,45.0 281.1,38.5 317.2,32.1 353.4,27.1 389.6,22.4 425.7,17.8 461.9,14.0\" fill=\"none\" stroke=\"var(--warning)\" stroke-width=\"1.5\"></polyline><circle cx=\"64.1\" cy=\"113.3\" r=\"2.4\" fill=\"var(--warning)\"><title>3225 液压监控·轮毂(变桨)压力偏高 · 累计 45%</title></circle><circle cx=\"100.2\" cy=\"93.2\" r=\"2.4\" fill=\"var(--warning)\"><title>3130 变桨轴承润滑(执行中) · 累计 56%</title></circle><circle cx=\"136.4\" cy=\"77.4\" r=\"2.4\" fill=\"var(--warning)\"><title>3224 液压监控·系统油压偏高 · 累计 65%</title></circle><circle cx=\"172.6\" cy=\"62.5\" r=\"2.4\" fill=\"var(--warning)\"><title>13902 变流器跳闸(自动重启) · 累计 73%</title></circle><circle cx=\"208.8\" cy=\"52.5\" r=\"2.4\" fill=\"var(--warning)\"><title>10105 自动解缆停机 · 累计 79%</title></circle><circle cx=\"244.9\" cy=\"45.0\" r=\"2.4\" fill=\"var(--warning)\"><title>1161 风速不足以切入 · 累计 83%</title></circle><circle cx=\"281.1\" cy=\"38.5\" r=\"2.4\" fill=\"var(--warning)\"><title>13905 变流器降功率运行(DG) · 累计 87%</title></circle><circle cx=\"317.2\" cy=\"32.1\" r=\"2.4\" fill=\"var(--warning)\"><title>1020 就地操作模式 · 累计 90%</title></circle><circle cx=\"353.4\" cy=\"27.1\" r=\"2.4\" fill=\"var(--warning)\"><title>63003 电网停电停机 · 累计 93%</title></circle><circle cx=\"389.6\" cy=\"22.4\" r=\"2.4\" fill=\"var(--warning)\"><title>5122 电网故障穿越(FRT)动作 · 累计 95%</title></circle><circle cx=\"425.7\" cy=\"17.8\" r=\"2.4\" fill=\"var(--warning)\"><title>63004 UPS电池电压低 · 累计 98%</title></circle><circle cx=\"461.9\" cy=\"14.0\" r=\"2.4\" fill=\"var(--warning)\"><title>10400 偏航失败-等待 · 累计 100%</title></circle><text x=\"64.1\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">3225</text><text x=\"100.2\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">3130</text><text x=\"136.4\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">3224</text><text x=\"172.6\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">13902</text><text x=\"208.8\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">10105</text><text x=\"244.9\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">1161</text><text x=\"281.1\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">13905</text><text x=\"317.2\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">1020</text><text x=\"353.4\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">63003</text><text x=\"389.6\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">5122</text><text x=\"425.7\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">63004</text><text x=\"461.9\" y=\"209.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"middle\">10400</text><text x=\"41.0\" y=\"199.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">0</text><text x=\"41.0\" y=\"108.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">2,963</text><text x=\"41.0\" y=\"17.0\" font-size=\"9\" fill=\"var(--muted)\" text-anchor=\"end\">5,925</text><text x=\"485.0\" y=\"199.0\" font-size=\"9\" fill=\"var(--warning)\">0%</text><text x=\"485.0\" y=\"108.0\" font-size=\"9\" fill=\"var(--warning)\">50%</text><text x=\"485.0\" y=\"17.0\" font-size=\"9\" fill=\"var(--warning)\">100%</text>\n <text x=\"263.0\" y=\"233.0\" font-size=\"8.5\" fill=\"var(--muted)\" text-anchor=\"middle\">报警码 (悬停看全名)</text></svg>"};
- const keys = Object.keys(svgs);
- (async () => {
- const res = {};
- for (const k of keys) {
- const holder = document.createElement('div');
- holder.innerHTML = svgs[k];
- document.getElementById('host').appendChild(holder);
- const svg = holder.querySelector('svg');
- try {
- const xml = new XMLSerializer().serializeToString(svg);
- const vb = (svg.getAttribute('viewBox') || '').split(/[\s,]+/).map(Number);
- const W = (vb[2] || 720) * 2, H = (vb[3] || 300) * 2;
- const img = new Image();
- await new Promise((r) => { img.onload = r; img.onerror = r; img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(xml); });
- const cv = document.createElement('canvas'); cv.width = W; cv.height = H;
- const ctx = cv.getContext('2d'); ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, W, H);
- ctx.drawImage(img, 0, 0, W, H);
- res[k] = { url: cv.toDataURL('image/png'), w: W, h: H, ok: img.complete && img.naturalWidth > 0 };
- } catch (e) { res[k] = { err: String(e) }; }
- }
- document.getElementById('out').textContent = 'RESULT ' + JSON.stringify(res);
- document.title = 'DONE';
- })();
- </script></body>
|