Optimized the root .gitignore to exclude virtual environments, node modules, and temp folders to ensure clean and lightweight version tracking. Co-authored-by: Cursor <cursoragent@cursor.com>
669 lines
29 KiB
JavaScript
669 lines
29 KiB
JavaScript
// 【重要】必须使用 const Component 作为组件变量名
|
||
// ONEOS-web - 加氢站数字孪生监控大屏(1920×1080 设计稿级布局,高对比科技风)
|
||
|
||
const Component = function () {
|
||
var useState = React.useState;
|
||
var useEffect = React.useEffect;
|
||
|
||
var _now = useState(function () { return new Date(); });
|
||
var now = _now[0];
|
||
var setNow = _now[1];
|
||
|
||
useEffect(function () {
|
||
var t = setInterval(function () { setNow(new Date()); }, 1000);
|
||
return function () { clearInterval(t); };
|
||
}, []);
|
||
|
||
var pad = function (n) { return n < 10 ? '0' + n : '' + n; };
|
||
var timeStr = now.getFullYear() + '-' + pad(now.getMonth() + 1) + '-' + pad(now.getDate()) + ' ' + pad(now.getHours()) + ':' + pad(now.getMinutes()) + ':' + pad(now.getSeconds());
|
||
|
||
var h2PanelTitle = {
|
||
margin: 0,
|
||
fontSize: 15,
|
||
fontWeight: 600,
|
||
letterSpacing: '0.06em',
|
||
color: '#e8f4ff',
|
||
textShadow: '0 0 12px rgba(0, 242, 255, 0.35)',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
gap: 8
|
||
};
|
||
|
||
var panelShell = {
|
||
background: 'linear-gradient(145deg, rgba(6, 28, 58, 0.88) 0%, rgba(4, 15, 35, 0.92) 100%)',
|
||
border: '1px solid rgba(0, 242, 255, 0.22)',
|
||
borderRadius: 4,
|
||
boxShadow: 'inset 0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.45)',
|
||
backdropFilter: 'blur(8px)',
|
||
overflow: 'hidden',
|
||
position: 'relative'
|
||
};
|
||
|
||
var panelHead = {
|
||
height: 40,
|
||
padding: '0 14px',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'space-between',
|
||
background: 'linear-gradient(90deg, rgba(0, 242, 255, 0.12) 0%, transparent 55%)',
|
||
borderBottom: '1px solid rgba(0, 242, 255, 0.15)'
|
||
};
|
||
|
||
var kpiCard = function (label, value, unit, sub) {
|
||
return React.createElement('div', {
|
||
key: label,
|
||
style: {
|
||
flex: 1,
|
||
minWidth: 0,
|
||
padding: '12px 16px',
|
||
background: 'linear-gradient(180deg, rgba(10, 40, 72, 0.75) 0%, rgba(4, 18, 40, 0.85) 100%)',
|
||
border: '1px solid rgba(0, 242, 255, 0.2)',
|
||
borderRadius: 4,
|
||
position: 'relative',
|
||
overflow: 'hidden'
|
||
}
|
||
},
|
||
React.createElement('div', { style: { position: 'absolute', inset: 0, background: 'radial-gradient(ellipse 80% 50% at 0% 0%, rgba(0,242,255,0.12), transparent 55%)', pointerEvents: 'none' } }),
|
||
React.createElement('div', { style: { fontSize: 12, color: '#7a9bb8', marginBottom: 6, letterSpacing: '0.04em' } }, label),
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'baseline', gap: 6 } },
|
||
React.createElement('span', { style: { fontSize: 26, fontWeight: 700, color: '#00f2ff', fontFamily: '"DIN Alternate", "Roboto Mono", monospace', textShadow: '0 0 20px rgba(0,242,255,0.45)' } }, value),
|
||
React.createElement('span', { style: { fontSize: 12, color: '#5a8aad' } }, unit)
|
||
),
|
||
sub && React.createElement('div', { style: { marginTop: 6, fontSize: 11, color: '#4a7a9c' } }, sub)
|
||
);
|
||
};
|
||
|
||
var navItem = function (label, active) {
|
||
return React.createElement('div', {
|
||
key: label,
|
||
style: {
|
||
padding: '6px 14px',
|
||
fontSize: 12,
|
||
color: active ? '#00f2ff' : '#6a8faf',
|
||
border: active ? '1px solid rgba(0,242,255,0.5)' : '1px solid transparent',
|
||
borderRadius: 2,
|
||
background: active ? 'rgba(0,242,255,0.08)' : 'transparent',
|
||
cursor: 'pointer',
|
||
letterSpacing: '0.05em',
|
||
whiteSpace: 'nowrap'
|
||
}
|
||
}, label);
|
||
};
|
||
|
||
var subNavBtn = function (label, icon) {
|
||
return React.createElement('div', {
|
||
key: label,
|
||
style: {
|
||
width: 72,
|
||
height: 64,
|
||
display: 'flex',
|
||
flexDirection: 'column',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
gap: 6,
|
||
background: 'linear-gradient(180deg, rgba(0,40,80,0.5) 0%, rgba(4,20,45,0.8) 100%)',
|
||
border: '1px solid rgba(0, 242, 255, 0.18)',
|
||
borderRadius: 4,
|
||
fontSize: 11,
|
||
color: '#9ec8e8',
|
||
cursor: 'pointer'
|
||
}
|
||
},
|
||
React.createElement('div', { style: { width: 28, height: 28, borderRadius: 4, border: '1px solid rgba(0,242,255,0.35)', background: 'rgba(0,242,255,0.06)', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 14, color: '#00f2ff' } }, icon),
|
||
label
|
||
);
|
||
};
|
||
|
||
var alarmRows = [
|
||
{ t: '10:28:06', lv: '紧急', name: '压缩机出口压力超限', loc: '压缩单元-A' },
|
||
{ t: '10:15:42', lv: '一般', name: '储罐液位波动提醒', loc: '储氢区-3#' },
|
||
{ t: '09:52:11', lv: '重要', name: '加氢枪通讯短时中断', loc: '加氢岛-2' }
|
||
];
|
||
|
||
return React.createElement('div', {
|
||
className: 'h2-station-screen-root',
|
||
style: {
|
||
width: 1920,
|
||
height: 1080,
|
||
margin: '0 auto',
|
||
position: 'relative',
|
||
background: '#040b1a',
|
||
color: '#e8f4ff',
|
||
fontFamily: '"Inter", "PingFang SC", "Microsoft YaHei", sans-serif',
|
||
overflow: 'hidden',
|
||
boxSizing: 'border-box',
|
||
textRendering: 'geometricPrecision',
|
||
WebkitFontSmoothing: 'antialiased'
|
||
}
|
||
},
|
||
React.createElement('style', null, `
|
||
.h2-station-screen-root * { box-sizing: border-box; }
|
||
@keyframes h2-pulse-border {
|
||
0%, 100% { box-shadow: 0 0 0 1px rgba(0,242,255,0.15), 0 0 24px rgba(0,242,255,0.08); }
|
||
50% { box-shadow: 0 0 0 1px rgba(0,242,255,0.35), 0 0 36px rgba(0,242,255,0.15); }
|
||
}
|
||
.h2-station-screen-root .h2-center-stage {
|
||
animation: h2-pulse-border 4s ease-in-out infinite;
|
||
}
|
||
@keyframes h2-scan {
|
||
0% { transform: translateY(-100%); opacity: 0; }
|
||
10% { opacity: 0.06; }
|
||
90% { opacity: 0.06; }
|
||
100% { transform: translateY(100%); opacity: 0; }
|
||
}
|
||
.h2-station-screen-root .h2-scanline::after {
|
||
content: '';
|
||
position: absolute;
|
||
left: 0; right: 0; top: 0;
|
||
height: 120px;
|
||
background: linear-gradient(180deg, transparent, rgba(0,242,255,0.04), transparent);
|
||
animation: h2-scan 8s linear infinite;
|
||
pointer-events: none;
|
||
}
|
||
`),
|
||
|
||
/* 背景网格与光晕 */
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
inset: 0,
|
||
backgroundImage: `
|
||
linear-gradient(rgba(0, 242, 255, 0.03) 1px, transparent 1px),
|
||
linear-gradient(90deg, rgba(0, 242, 255, 0.03) 1px, transparent 1px)
|
||
`,
|
||
backgroundSize: '48px 48px',
|
||
pointerEvents: 'none'
|
||
}
|
||
}),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
width: 900,
|
||
height: 900,
|
||
left: '50%',
|
||
top: '42%',
|
||
transform: 'translate(-50%, -50%)',
|
||
background: 'radial-gradient(circle, rgba(22, 93, 255, 0.12) 0%, transparent 65%)',
|
||
pointerEvents: 'none'
|
||
}
|
||
}),
|
||
|
||
/* 顶栏 */
|
||
React.createElement('header', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 24,
|
||
right: 24,
|
||
top: 16,
|
||
height: 56,
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'space-between',
|
||
zIndex: 20
|
||
}
|
||
},
|
||
React.createElement('div', { style: { fontSize: 13, color: '#7a9bb8', letterSpacing: '0.02em' } },
|
||
timeStr, React.createElement('span', { style: { margin: '0 12px', color: 'rgba(0,242,255,0.35)' } }, '|'),
|
||
'24°C 晴', React.createElement('span', { style: { margin: '0 12px', color: 'rgba(0,242,255,0.35)' } }, '|'),
|
||
'空气质量:优'
|
||
),
|
||
React.createElement('div', {
|
||
style: {
|
||
fontSize: 28,
|
||
fontWeight: 700,
|
||
letterSpacing: '0.12em',
|
||
color: '#f0f8ff',
|
||
textShadow: '0 0 24px rgba(0, 242, 255, 0.55), 0 0 60px rgba(22, 93, 255, 0.35)'
|
||
}
|
||
}, '加氢站数字孪生监控平台'),
|
||
React.createElement('div', { style: { display: 'flex', gap: 8 } },
|
||
['首页', '三维监控', '设备管理', '告警管理', '运营报表', '系统设置'].map(function (x, i) {
|
||
return React.createElement('div', {
|
||
key: x,
|
||
style: {
|
||
padding: '6px 10px',
|
||
fontSize: 12,
|
||
color: i === 1 ? '#00f2ff' : '#6a8faf',
|
||
borderBottom: i === 1 ? '2px solid #00f2ff' : '2px solid transparent'
|
||
}
|
||
}, x);
|
||
})
|
||
)
|
||
),
|
||
|
||
/* KPI 行 */
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 24,
|
||
right: 24,
|
||
top: 84,
|
||
display: 'flex',
|
||
gap: 12,
|
||
zIndex: 15
|
||
}
|
||
},
|
||
kpiCard('氢气最高压力', '35.0', 'MPa', '设计上限 45 MPa'),
|
||
kpiCard('氢气平均温度', '22.5', '°C', '管束区均值'),
|
||
kpiCard('储罐液位', '85', '%', '5 座储罐加权'),
|
||
kpiCard('瞬时流量', '120', 'Nm³/h', '加氢岛合计'),
|
||
kpiCard('H₂ 浓度', '0', 'ppm', '站区环测'),
|
||
kpiCard('安全等级', '一级', '', '连续安全运行 337 天')
|
||
),
|
||
|
||
/* 左列 */
|
||
React.createElement('aside', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 24,
|
||
top: 168,
|
||
width: 400,
|
||
bottom: 200,
|
||
display: 'flex',
|
||
flexDirection: 'column',
|
||
gap: 10,
|
||
zIndex: 12
|
||
}
|
||
},
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 auto' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '站点概况')
|
||
),
|
||
React.createElement('div', { style: { padding: '14px 16px', fontSize: 12, lineHeight: 2, color: '#9ec8e8' } },
|
||
React.createElement('div', null, '投运日期:', React.createElement('span', { style: { color: '#00f2ff' } }, '2023-06-18')),
|
||
React.createElement('div', null, '接入设备:', React.createElement('span', { style: { color: '#00f2ff' } }, '28'), ' 台'),
|
||
React.createElement('div', null, '累计加氢量:', React.createElement('span', { style: { color: '#00f2ff' } }, '385,621'), ' kg'),
|
||
React.createElement('div', null, '安全运行:', React.createElement('span', { style: { color: '#00f2ff' } }, '337'), ' 天')
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '1 1 0', minHeight: 0 }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '加氢量统计'),
|
||
React.createElement('div', { style: { display: 'flex', gap: 4 } }, navItem('日', true), navItem('月', false), navItem('年', false))
|
||
),
|
||
React.createElement('div', { style: { padding: '8px 12px 4px', fontSize: 11, color: '#5a8aad' } }, '较昨日 ', React.createElement('span', { style: { color: '#52c41a' } }, '+12.5%')),
|
||
React.createElement('div', { style: { padding: '0 8px 8px', height: 140 } },
|
||
React.createElement('svg', { width: '100%', height: '100%', viewBox: '0 0 360 120', preserveAspectRatio: 'none' },
|
||
React.createElement('defs', null,
|
||
React.createElement('linearGradient', { id: 'h2lg1', x1: '0', y1: '0', x2: '0', y2: '1' },
|
||
React.createElement('stop', { offset: '0%', stopColor: 'rgba(0,242,255,0.45)' }),
|
||
React.createElement('stop', { offset: '100%', stopColor: 'rgba(0,242,255,0)' })
|
||
)
|
||
),
|
||
React.createElement('polyline', { fill: 'none', stroke: 'rgba(0,242,255,0.35)', strokeWidth: '1', points: '0,100 360,100' }),
|
||
React.createElement('polygon', { fill: 'url(#h2lg1)', points: '0,100 0,70 40,55 80,62 120,40 160,48 200,35 240,50 280,38 320,45 360,30 360,100' }),
|
||
React.createElement('polyline', { fill: 'none', stroke: '#00f2ff', strokeWidth: '2', points: '0,70 40,55 80,62 120,40 160,48 200,35 240,50 280,38 320,45 360,30' })
|
||
)
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 160px' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '设备状态统计')
|
||
),
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'center', padding: '8px 16px', gap: 16 } },
|
||
React.createElement('svg', { width: 100, height: 100, viewBox: '0 0 100 100' },
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 38, fill: 'none', stroke: 'rgba(0,242,255,0.15)', strokeWidth: 10 }),
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 38, fill: 'none', stroke: '#00f2ff', strokeWidth: 10, strokeDasharray: '80 159', strokeLinecap: 'round', transform: 'rotate(-90 50 50)' }),
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 38, fill: 'none', stroke: '#165dff', strokeWidth: 10, strokeDasharray: '50 159', strokeDashoffset: -80, strokeLinecap: 'round', transform: 'rotate(-90 50 50)' }),
|
||
React.createElement('text', { x: 50, y: 54, textAnchor: 'middle', fill: '#e8f4ff', fontSize: 14, fontWeight: 700 }, '28')
|
||
),
|
||
React.createElement('div', { style: { fontSize: 11, lineHeight: 1.8, color: '#7a9bb8' } },
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#00f2ff' } }, '●'), ' 运行 22'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#165dff' } }, '●'), ' 待机 4'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#faad14' } }, '●'), ' 维护 2')
|
||
)
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 140px' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '能耗统计'),
|
||
React.createElement('div', { style: { display: 'flex', gap: 4 } }, navItem('时', true), navItem('日', false))
|
||
),
|
||
React.createElement('div', { style: { padding: '12px 16px', display: 'flex', alignItems: 'flex-end', gap: 6, height: 88 } },
|
||
[40, 65, 55, 80, 48, 72, 60, 90, 52, 68, 75, 58].map(function (h, i) {
|
||
return React.createElement('div', {
|
||
key: i,
|
||
style: {
|
||
flex: 1,
|
||
height: h + '%',
|
||
background: 'linear-gradient(180deg, #00f2ff 0%, rgba(22,93,255,0.4) 100%)',
|
||
borderRadius: 2,
|
||
opacity: 0.85
|
||
}
|
||
});
|
||
})
|
||
)
|
||
)
|
||
),
|
||
|
||
/* 右列 */
|
||
React.createElement('aside', {
|
||
style: {
|
||
position: 'absolute',
|
||
right: 24,
|
||
top: 168,
|
||
width: 400,
|
||
bottom: 200,
|
||
display: 'flex',
|
||
flexDirection: 'column',
|
||
gap: 10,
|
||
zIndex: 12
|
||
}
|
||
},
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 200px' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#ff4d4f', borderRadius: 1 } }), '实时报警')
|
||
),
|
||
React.createElement('div', { style: { display: 'flex', gap: 8, padding: '8px 12px', fontSize: 11 } },
|
||
React.createElement('span', { style: { color: '#ff4d4f' } }, '紧急 1'),
|
||
React.createElement('span', { style: { color: '#faad14' } }, '重要 1'),
|
||
React.createElement('span', { style: { color: '#52c41a' } }, '一般 1')
|
||
),
|
||
React.createElement('div', { style: { padding: '0 8px 8px', overflow: 'auto', maxHeight: 120 } },
|
||
React.createElement('table', { style: { width: '100%', fontSize: 11, borderCollapse: 'collapse', color: '#9ec8e8' } },
|
||
React.createElement('thead', null,
|
||
React.createElement('tr', { style: { color: '#5a8aad' } },
|
||
React.createElement('th', { style: { textAlign: 'left', padding: '4px 4px', borderBottom: '1px solid rgba(0,242,255,0.12)' } }, '时间'),
|
||
React.createElement('th', { style: { textAlign: 'left', padding: '4px 4px', borderBottom: '1px solid rgba(0,242,255,0.12)' } }, '级别'),
|
||
React.createElement('th', { style: { textAlign: 'left', padding: '4px 4px', borderBottom: '1px solid rgba(0,242,255,0.12)' } }, '事件')
|
||
)
|
||
),
|
||
React.createElement('tbody', null,
|
||
alarmRows.map(function (r) {
|
||
return React.createElement('tr', { key: r.t },
|
||
React.createElement('td', { style: { padding: '6px 4px', borderBottom: '1px solid rgba(255,255,255,0.04)' } }, r.t),
|
||
React.createElement('td', { style: { padding: '6px 4px', borderBottom: '1px solid rgba(255,255,255,0.04)', color: r.lv === '紧急' ? '#ff4d4f' : r.lv === '重要' ? '#faad14' : '#52c41a' } }, r.lv),
|
||
React.createElement('td', { style: { padding: '6px 4px', borderBottom: '1px solid rgba(255,255,255,0.04)' } }, r.name)
|
||
);
|
||
})
|
||
)
|
||
)
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 160px' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '储氢系统监控')
|
||
),
|
||
React.createElement('div', { style: { padding: '12px 16px', display: 'flex', gap: 10, alignItems: 'flex-end' } },
|
||
[88, 92, 76, 85, 79].map(function (pct, i) {
|
||
return React.createElement('div', { key: i, style: { flex: 1, textAlign: 'center' } },
|
||
React.createElement('div', { style: { height: 72, background: 'rgba(0,30,60,0.6)', borderRadius: 2, position: 'relative', border: '1px solid rgba(0,242,255,0.15)' } },
|
||
React.createElement('div', { style: { position: 'absolute', bottom: 0, left: 2, right: 2, height: pct + '%', background: 'linear-gradient(180deg, #00f2ff, #165dff)', borderRadius: '0 0 2px 2px' } })
|
||
),
|
||
React.createElement('div', { style: { fontSize: 10, marginTop: 4, color: '#6a8faf' } }, (i + 1) + '#')
|
||
);
|
||
})
|
||
),
|
||
React.createElement('div', { style: { padding: '0 16px 10px', fontSize: 11, color: '#7a9bb8', display: 'flex', justifyContent: 'space-between' } },
|
||
React.createElement('span', null, '管汇压力 ', React.createElement('b', { style: { color: '#00f2ff' } }, '35.2'), ' MPa'),
|
||
React.createElement('span', null, '可用氢量 ', React.createElement('b', { style: { color: '#00f2ff' } }, '4,250'), ' kg')
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '0 0 120px' }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '安全环境监测')
|
||
),
|
||
React.createElement('div', { style: { padding: '10px 12px', display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 8, fontSize: 10 } },
|
||
['氢浓度', '可燃气体', '温度', '湿度', '风速', '风向'].map(function (lab) {
|
||
return React.createElement('div', { key: lab, style: { background: 'rgba(0,40,70,0.4)', padding: '6px 8px', borderRadius: 2, border: '1px solid rgba(0,242,255,0.1)' } },
|
||
React.createElement('div', { style: { color: '#5a8aad' } }, lab),
|
||
React.createElement('div', { style: { color: '#52c41a', marginTop: 2 } }, '正常')
|
||
);
|
||
})
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: '1 1 0', minHeight: 0 }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '当日关键指标')
|
||
),
|
||
React.createElement('div', { style: { display: 'flex', justifyContent: 'space-around', padding: '16px 8px' } },
|
||
[{ v: 78, l: '完成率' }, { v: 92, l: '能效' }, { v: 100, l: '安全' }].map(function (g) {
|
||
return React.createElement('div', { key: g.l, style: { textAlign: 'center' } },
|
||
React.createElement('svg', { width: 72, height: 72, viewBox: '0 0 72 72' },
|
||
React.createElement('circle', { cx: 36, cy: 36, r: 30, fill: 'none', stroke: 'rgba(0,242,255,0.12)', strokeWidth: 8 }),
|
||
React.createElement('circle', {
|
||
cx: 36, cy: 36, r: 30, fill: 'none', stroke: '#00f2ff', strokeWidth: 8,
|
||
strokeDasharray: (g.v / 100 * 188) + ' 188',
|
||
strokeLinecap: 'round',
|
||
transform: 'rotate(-90 36 36)'
|
||
}),
|
||
React.createElement('text', { x: 36, y: 40, textAnchor: 'middle', fill: '#e8f4ff', fontSize: 14, fontWeight: 700 }, g.v + '%')
|
||
),
|
||
React.createElement('div', { style: { fontSize: 11, color: '#7a9bb8', marginTop: 6 } }, g.l)
|
||
);
|
||
})
|
||
)
|
||
)
|
||
),
|
||
|
||
/* 中央孪生区 */
|
||
React.createElement('div', {
|
||
className: 'h2-center-stage',
|
||
style: {
|
||
position: 'absolute',
|
||
left: 448,
|
||
right: 448,
|
||
top: 168,
|
||
bottom: 288,
|
||
borderRadius: 6,
|
||
border: '1px solid rgba(0, 242, 255, 0.28)',
|
||
background: 'linear-gradient(165deg, rgba(6, 22, 48, 0.92) 0%, rgba(2, 8, 22, 0.96) 100%)',
|
||
zIndex: 10,
|
||
overflow: 'hidden'
|
||
}
|
||
},
|
||
React.createElement('div', { className: 'h2-scanline', style: { position: 'absolute', inset: 0, overflow: 'hidden', pointerEvents: 'none' } }),
|
||
/* 模拟夜景站场视觉 */
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
inset: 0,
|
||
background: `
|
||
radial-gradient(ellipse 70% 45% at 50% 55%, rgba(0, 80, 120, 0.35) 0%, transparent 60%),
|
||
linear-gradient(180deg, #020810 0%, #061a32 40%, #02060c 100%)
|
||
`
|
||
}
|
||
}),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: '8%',
|
||
top: '42%',
|
||
width: 120,
|
||
height: 48,
|
||
border: '1px solid rgba(0,242,255,0.45)',
|
||
borderRadius: 4,
|
||
background: 'rgba(0,20,40,0.5)',
|
||
fontSize: 11,
|
||
color: '#00f2ff',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
boxShadow: '0 0 20px rgba(0,242,255,0.2)'
|
||
}
|
||
}, '制氢单元'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: '38%',
|
||
top: '28%',
|
||
width: 100,
|
||
height: 44,
|
||
border: '1px solid rgba(22,93,255,0.5)',
|
||
borderRadius: 4,
|
||
background: 'rgba(10,30,60,0.45)',
|
||
fontSize: 11,
|
||
color: '#7ab6ff',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center'
|
||
}
|
||
}, '压缩系统'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
right: '18%',
|
||
top: '38%',
|
||
width: 110,
|
||
height: 52,
|
||
border: '1px solid rgba(0,242,255,0.4)',
|
||
borderRadius: 4,
|
||
background: 'rgba(0,30,55,0.5)',
|
||
fontSize: 11,
|
||
color: '#00f2ff',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center'
|
||
}
|
||
}, '储氢罐组'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: '42%',
|
||
bottom: '22%',
|
||
width: 140,
|
||
height: 56,
|
||
border: '1px solid rgba(0,242,255,0.55)',
|
||
borderRadius: 4,
|
||
background: 'rgba(0,40,70,0.55)',
|
||
fontSize: 11,
|
||
color: '#e8f4ff',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
boxShadow: '0 0 24px rgba(0,242,255,0.25)'
|
||
}
|
||
}, '加氢岛 · 数字孪生'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
right: 16,
|
||
top: 16,
|
||
width: 56,
|
||
height: 56,
|
||
borderRadius: '50%',
|
||
border: '2px solid rgba(0,242,255,0.35)',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
fontSize: 10,
|
||
color: '#7a9bb8'
|
||
}
|
||
}, 'N'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 16,
|
||
bottom: 72,
|
||
fontSize: 11,
|
||
color: 'rgba(0,242,255,0.6)',
|
||
letterSpacing: '0.08em'
|
||
}
|
||
}, '视角:鸟瞰 · LOD 高 · 实时数据叠加'),
|
||
React.createElement('div', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 0,
|
||
right: 0,
|
||
bottom: 0,
|
||
height: 76,
|
||
padding: '10px 12px',
|
||
background: 'linear-gradient(0deg, rgba(4,12,28,0.95) 0%, transparent 100%)',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
gap: 10
|
||
}
|
||
},
|
||
subNavBtn('总览', '◎'),
|
||
subNavBtn('压缩', '▣'),
|
||
subNavBtn('储氢', '◉'),
|
||
subNavBtn('加氢', '⬡'),
|
||
subNavBtn('安全', '⚠'),
|
||
subNavBtn('能耗', '⌁'),
|
||
subNavBtn('管网', '⊞'),
|
||
subNavBtn('报表', '≡')
|
||
)
|
||
),
|
||
|
||
/* 底栏三图表面板 */
|
||
React.createElement('footer', {
|
||
style: {
|
||
position: 'absolute',
|
||
left: 448,
|
||
right: 448,
|
||
bottom: 24,
|
||
height: 160,
|
||
display: 'flex',
|
||
gap: 12,
|
||
zIndex: 12
|
||
}
|
||
},
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: 1 }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '加氢车辆统计')
|
||
),
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'center', padding: '12px 20px', gap: 20 } },
|
||
React.createElement('svg', { width: 100, height: 100, viewBox: '0 0 100 100' },
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 36, fill: 'none', stroke: 'rgba(0,242,255,0.12)', strokeWidth: 14 }),
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 36, fill: 'none', stroke: '#00f2ff', strokeWidth: 14, strokeDasharray: '90 226', strokeLinecap: 'round', transform: 'rotate(-90 50 50)' }),
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 36, fill: 'none', stroke: '#165dff', strokeWidth: 14, strokeDasharray: '55 226', strokeDashoffset: -90, strokeLinecap: 'round', transform: 'rotate(-90 50 50)' }),
|
||
React.createElement('circle', { cx: 50, cy: 50, r: 36, fill: 'none', stroke: '#52c41a', strokeWidth: 14, strokeDasharray: '40 226', strokeDashoffset: -145, strokeLinecap: 'round', transform: 'rotate(-90 50 50)' })
|
||
),
|
||
React.createElement('div', { style: { fontSize: 11, lineHeight: 1.9, color: '#7a9bb8' } },
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#00f2ff' } }, '●'), ' 重卡 38%'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#165dff' } }, '●'), ' 物流 28%'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#52c41a' } }, '●'), ' 公交 22%'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#8b9bb5' } }, '●'), ' 其他 12%')
|
||
)
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: 1.2 }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '累计加氢量趋势')
|
||
),
|
||
React.createElement('div', { style: { padding: '8px 12px', height: 108 } },
|
||
React.createElement('svg', { width: '100%', height: '100%', viewBox: '0 0 400 100', preserveAspectRatio: 'none' },
|
||
React.createElement('polyline', { fill: 'none', stroke: 'rgba(0,242,255,0.25)', strokeWidth: '1', points: '0,80 400,80' }),
|
||
React.createElement('polyline', { fill: 'none', stroke: '#00f2ff', strokeWidth: '2', points: '0,85 40,78 80,72 120,65 160,58 200,50 240,45 280,38 320,32 360,28 400,22' }),
|
||
React.createElement('polyline', { fill: 'none', stroke: 'rgba(122,155,184,0.6)', strokeWidth: '1.5', strokeDasharray: '4 3', points: '0,90 40,88 80,86 120,82 160,78 200,75 240,72 280,68 320,65 360,62 400,58' })
|
||
)
|
||
),
|
||
React.createElement('div', { style: { padding: '0 12px 8px', fontSize: 10, color: '#5a8aad', display: 'flex', gap: 16 } },
|
||
React.createElement('span', null, '━━ 本年累计'),
|
||
React.createElement('span', null, '- - 去年同期')
|
||
)
|
||
),
|
||
React.createElement('div', { style: Object.assign({}, panelShell, { flex: 1 }) },
|
||
React.createElement('div', { style: panelHead },
|
||
React.createElement('h2', { style: h2PanelTitle }, React.createElement('span', { style: { width: 3, height: 14, background: '#00f2ff', borderRadius: 1 } }), '运行时长统计')
|
||
),
|
||
React.createElement('div', { style: { padding: '16px 20px', display: 'flex', flexDirection: 'column', gap: 10, justifyContent: 'center', height: 108 } },
|
||
[
|
||
{ n: '加氢系统', p: 92 },
|
||
{ n: '压缩系统', p: 88 },
|
||
{ n: '冷却循环', p: 76 },
|
||
{ n: '站控 PLC', p: 100 }
|
||
].map(function (row) {
|
||
return React.createElement('div', { key: row.n, style: { display: 'flex', alignItems: 'center', gap: 10 } },
|
||
React.createElement('div', { style: { width: 72, fontSize: 10, color: '#7a9bb8' } }, row.n),
|
||
React.createElement('div', { style: { flex: 1, height: 8, background: 'rgba(0,40,70,0.5)', borderRadius: 4, overflow: 'hidden' } },
|
||
React.createElement('div', { style: { width: row.p + '%', height: '100%', background: 'linear-gradient(90deg, #165dff, #00f2ff)', borderRadius: 4 } })
|
||
),
|
||
React.createElement('div', { style: { width: 36, fontSize: 10, color: '#00f2ff', textAlign: 'right' } }, row.p + '%')
|
||
);
|
||
})
|
||
)
|
||
)
|
||
),
|
||
|
||
/* 四角装饰线 */
|
||
React.createElement('div', { style: { position: 'absolute', left: 12, top: 12, width: 48, height: 48, borderLeft: '2px solid #00f2ff', borderTop: '2px solid #00f2ff', opacity: 0.6, pointerEvents: 'none' } }),
|
||
React.createElement('div', { style: { position: 'absolute', right: 12, top: 12, width: 48, height: 48, borderRight: '2px solid #00f2ff', borderTop: '2px solid #00f2ff', opacity: 0.6, pointerEvents: 'none' } }),
|
||
React.createElement('div', { style: { position: 'absolute', left: 12, bottom: 12, width: 48, height: 48, borderLeft: '2px solid #00f2ff', borderBottom: '2px solid #00f2ff', opacity: 0.6, pointerEvents: 'none' } }),
|
||
React.createElement('div', { style: { position: 'absolute', right: 12, bottom: 12, width: 48, height: 48, borderRight: '2px solid #00f2ff', borderBottom: '2px solid #00f2ff', opacity: 0.6, pointerEvents: 'none' } })
|
||
);
|
||
};
|
||
|
||
if (typeof module !== 'undefined' && module.exports) module.exports = Component;
|