From 33dcbf88c118dab4d5b3c9c846b9f27cc52c5723 Mon Sep 17 00:00:00 2001 From: fengpu <18691763612@163.com> Date: Fri, 26 Jun 2026 17:32:36 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E8=A5=BF=E5=AE=89=E5=BA=94?= =?UTF-8?q?=E6=80=A5=E5=A4=A7=E5=B1=8F=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=88=E9=87=8D=E6=9E=84=E4=B8=BB=E5=B1=8F=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=BA=A4=E4=BA=92+=E6=96=B0=E5=A2=9E=E5=BF=83=E8=A1=80?= =?UTF-8?q?=E7=AE=A1=E7=9B=91=E6=B5=8B=E5=89=AF=E5=B1=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- other-module/canteen-device/.gitkeep | 0 .../emergency-screen/doc/CHANGELOG.md | 84 + .../xian-center/cv-monitor.html | 1321 ++++++ .../{index-v2.html => index-v1.html} | 383 +- .../xian-center/index-v3.html | 3617 ----------------- .../emergency-screen/xian-center/index.html | 2486 +++++++---- .../doc/缓存中转服务器产品需求说明书.md | 48 +- 7 files changed, 3209 insertions(+), 4730 deletions(-) delete mode 100644 other-module/canteen-device/.gitkeep create mode 100644 other-module/emergency-screen/xian-center/cv-monitor.html rename other-module/emergency-screen/xian-center/{index-v2.html => index-v1.html} (89%) delete mode 100644 other-module/emergency-screen/xian-center/index-v3.html diff --git a/other-module/canteen-device/.gitkeep b/other-module/canteen-device/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/other-module/emergency-screen/doc/CHANGELOG.md b/other-module/emergency-screen/doc/CHANGELOG.md index 6abc7fd..a0de81d 100644 --- a/other-module/emergency-screen/doc/CHANGELOG.md +++ b/other-module/emergency-screen/doc/CHANGELOG.md @@ -1,5 +1,89 @@ # 应急大屏 - 变更记录 +## [2026-06-26] feat: 西安应急中心大屏 v2 - 左下角"应急重点人员"改为"人员现状监测"环形图 + +### 变更(v2 文件 `xian-center/index-v2.html`) +- **面板替换**:左下角"应急求助重点人员"面板整体替换为"人员现状监测"面板 + - 删除原 `.help-person-list` / `.help-person-item` 等 CSS 与 5 行人员列表 HTML + - 保留面板头部下拉框(今日 / 近一周 / 近一月 / 近一年)与 `switchPeriod` 调用不变 +- **环形图(SVG,自包含)**:150×150 容器,viewBox `0 0 160 160`,圆心 (80,80)、半径 60、stroke-width 14 + - 底环衬底 `.hm-ring--bg`(rgba(24,144,255,0.08)) + - 5 段采用 `` + `stroke-dasharray` / `stroke-dashoffset` 实现,整环 `transform:rotate(-90deg)` 自顶端起顺时针绘制,段间留 3 单位间隔 + - 每段独立 `drop-shadow` 发光(与该段 stroke 色同色,alpha 0.55) +- **5 类人员与数据**: + - 健康人员 9,420 / 73.3%(#52C41A,dasharray "265 112" / offset 0) + - 慢病人员 1,860 / 14.5%(#FAAD14,dasharray "52 325" / offset -268) + - 指标异常 620 / 4.8%(#00e5ff,dasharray "18 359" / offset -323) + - 大病人员 580 / 4.5%(#FF4D4F,dasharray "16 361" / offset -344) + - 评估异常 376 / 2.9%(#b37feb,dasharray "11 366" / offset -363) +- **中心信息**:绝对定位居中显示「总人数 / 12,856 / 人」,主数字 26px 加粗 + 蓝色文字阴影 +- **图例**:环形图右侧 5 行图例,每行 = 色块(带同色 box-shadow 发光)+ 名称 + 数量 + 百分比 +- **配色依据**:健康=success 绿、慢病=warning 橙、指标异常=cyan 青、大病=danger 红、评估异常=紫(沿用大屏设计令牌) + +## [2026-06-26] feat: 西安应急中心大屏 v2 - 资源 Tab 图标化(色点升级为分类 SVG 图标) + +### 变更(v2 文件 `xian-center/index-v2.html`) +- **资源 Tab 图标升级**:7 个资源 Tab 标题前的色点(`.dot--xxx`)替换为各分类专属 inline SVG 图标 + - 新增 CSS:`.res-tab__icon`(14×14 基础尺寸)+ 7 个 `.res-tab__icon--xxx` 修饰类,按分类设置 `color`(沿用图例原配色:all/oilfield/local 用 #1890FF;cooperative 用 #722ED1;clinic 用 #13C2C2;ambulance 用 #FAAD14;aed 用 #FF4D4F) + - 激活态发光:`.res-tab.active .res-tab__icon{filter:drop-shadow(0 0 4px currentColor);}`,图标色不被激活态覆盖 + - 删除原 7 个 `.dot--xxx` 色点修饰类(`.dot--all/--oilfield/--cooperative/--local/--clinic/--ambulance/--aed`) + - 保留 `.res-tab .dot` 与 `.res-tab.active .dot` 规则,供「路径规划」Tab 继续使用通用灰点 +- **图标设计**(16×16 viewBox,stroke 线条风格,stroke-width 1.5,stroke-linecap/linejoin round): + - 全部资源 → 四方格网格(2×2 rect) + - 油田医院 → 油滴轮廓 + 中央十字 + - 合作医院 → 两个相扣圆圈 + - 地方医院 → 三角屋顶 + 矩形墙 + 中央十字 + - 医疗点 → 急救箱(带提手矩形 + 十字) + - 救护车 → 厢式车体 + 两车轮 + 车身十字 + - AED → 心形 + 内部闪电折线 +- **HTML 替换**:7 个资源 Tab 中 `` 替换为 `...`;数量徽标 `N` 保持不变;路径规划 Tab 维持原 `` + +## [2026-06-26] refactor: 西安应急中心大屏 v2 - 移除地图图例 + 资源 Tab 增加分类色点与数量 + +### 变更(v2 文件 `xian-center/index-v2.html`) +- **移除地图图例**:删除原悬浮于地图左上角的 `.map-legend` 整块 HTML(6 项图例)及对应 CSS(`.map-legend` / `.map-legend__item` / `.map-legend__item::before` / `.map-legend__dot`) + - 4 处 JS 中 `var legend=document.querySelector('.map-legend'); if(legend)legend.style.display=…` 调用因 `if` 守卫变为无害 no-op,未做改动以缩小变更面 +- **资源 Tab 增加分类色点**:每个资源 Tab 标题前的 `.dot` 由通用灰点改为各分类专属色(沿用图例原配色) + - 新增 CSS 修饰类:`.dot--all`(四色渐变 1890FF/722ED1/13C2C2/FAAD14)/ `.dot--oilfield`(#1890FF)/ `.dot--cooperative`(#722ED1)/ `.dot--local`(透明 + 1.5px 虚线 #1890FF)/ `.dot--clinic`(#13C2C2)/ `.dot--ambulance`(#FAAD14)/ `.dot--aed`(#FF4D4F) + - `.res-tab.active .dot` 由"覆盖为 success 绿色"改为"保留原色 + `box-shadow:0 0 6px currentColor` 发光" + - 「路径规划」Tab 维持原通用灰点,不改色 +- **资源 Tab 增加数量徽标**:每个资源 Tab 标题后追加 `N` 数量徽标 + - 数量与图例原计数一致:全部资源 11(1+1+2+3+2+2 之和)/ 油田医院 1 / 合作医院 1 / 地方医院 2 / 医疗点 3 / 救护车 2 / AED 2;路径规划 Tab 无数量 + - 新增 CSS `.res-tab__count`:11px tabular-nums,半透明胶囊背景;激活态白字 + 高对比背景 +- **微调**:`.res-tab` 左右内边距由 `0 18px` 改为 `0 14px`,以容纳新增的数量徽标并控制 Tab 栏总宽 + +## [2026-06-26] feat: 西安应急中心大屏 v2 - 统计卡片下移 + 地图图例左上角单行化 + +### 变更(v2 文件 `xian-center/index-v2.html`) +- **统计卡片从地图上方移至下方**:`.top-stats` 块从 `.center` 内 `map-wrap` 之前移动到之后 + - `.center` 当前结构:地图容器(flex:1)→ 底部统计卡片栏(flex-shrink:0) + - HTML 注释由"顶部统计卡片栏"改为"底部统计卡片栏" + - 卡片样式(去图标、数字居中)保持不变 +- **地图图例移至左上角并改为单行布局**:原位于地图左下角、2 列网格的图例改为左上角单行 + - CSS `.map-legend`:`bottom:12px;left:12px` → `top:12px;left:12px`;`display:grid;grid-template-columns:1fr 1fr;column-gap:16px;row-gap:6px;` → `display:flex;align-items:center;gap:12px;` + - 新增 `z-index:12`、`backdrop-filter:blur(8px)`、`box-shadow`,与 `.res-tabs`、`.map-layer` 同层悬浮 + - `.map-legend__item` 新增 `white-space:nowrap`,相邻项之间以竖线分隔符 `::before` 替代原网格间距 + - 6 项图例顺序不变:油田医院 / 合作医院 / 地方医院 / 医疗点 / 救护车 / AED + - HTML 注释由"地图图例"改为"地图图例:悬浮于地图左上角,单行展示" + +## [2026-06-26] feat: 西安应急中心大屏 v2 - 顶部统计卡片去图标化 + 视频通话弹窗化 + +### 变更(v2 文件 `xian-center/index-v2.html`) +- **顶部统计卡片去图标化**:4 张顶部 KPI 卡片(今日应急求助总数 / 今日待处理应急数 / 今日平均响应时长 / 今日告警次数)移除左侧图标,数字与标签整体居中显示 + - CSS:`.top-stat-card` 改为 `flex-direction:column;justify-content:center;align-items:center;text-align:center`,删除 `.top-stat-card__icon` 相关样式及 4 种色系变体的图标规则 + - HTML:删除 4 张卡片中的 `
` 块 + - 保留左侧 3px 色条 `::before`、数字+单位、标签、趋势小标记(↑12% / ↓8%) +- **视频通话按钮弹窗化**:地图右下角"视频通话"按钮点击行为由 `alert` 升级为选择弹窗 + - 新增 `[弹窗] 视频通话 - 选择加入的应急中心`(`#videoCallModal`),复用 `.modal-overlay` + `.modal` 基础结构,宽度 560px + - 弹窗内含 6 张应急中心卡片(救场/标准/长庆油田/延安/庆阳/榆林),2 列网格布局 + - 每张卡片显示:中心名称、在线状态徽章(在线/忙碌/离线 三态,含发光小圆点)、值班负责人、在线人数 + - 卡片支持多选:点击切换 `.vc-card--selected` 选中态,右上角显示对勾角标;离线卡片不可选(半透明 + 锁图标 + `cursor:not-allowed`) + - 默认预选「救场应急中心」「标准应急中心」两张在线卡片 + - 底部按钮:取消 / 发起通话;`confirmVideoCall()` 收集已选中中心名称,未选时提示并重新打开弹窗 + - `openEmergencyRoute()` 关闭序列同步追加 `closeVideoCallModal()` +- **新增 CSS 模块**:`.vc-modal` / `.vc-grid` / `.vc-card`(含 `--selected`/`--offline` 变体)/ `.vc-card__row` / `.vc-card__name` / `.vc-card__status`(`--online`/`--busy`/`--offline`)/ `.vc-card__dot`(三色)/ `.vc-card__meta` / `.vc-card__check` / `.vc-card__lock` +- **新增 JS 函数**:`onVideoCall()`(打开弹窗)/ `closeVideoCallModal()` / `toggleVcCard(el)` / `confirmVideoCall()` + ## [2026-06-25] feat: 西安应急中心大屏 v3 - 图表化重构 + 顶部 KPI 条 + 双栏可视化升级 ### 新增(v3 文件 `xian-center/index-v3.html`,v1/v2 保持不变) diff --git a/other-module/emergency-screen/xian-center/cv-monitor.html b/other-module/emergency-screen/xian-center/cv-monitor.html new file mode 100644 index 0000000..9ac1c11 --- /dev/null +++ b/other-module/emergency-screen/xian-center/cv-monitor.html @@ -0,0 +1,1321 @@ + + + + + + 心血管监测副屏 | 西安应急中心 + + + + + +
+
+
+
+
--
+
+
+ 西安应急中心 · 心血管监测副屏 +
+
+ 返回主屏 +
+ 系统累计运行 + 0 + +
+
+
+
+ + +
+ + + + +
+ +
+
+
+
3,268
+
总监测人数
+
+
+
+
+
1.28亿条
+
数据采集量
+
+
+
+
+
99.6%
+
数据采集率
+
+
+
+
+
1,847
+
告警次数
+
+
+
+ + +
+
+
手表位置分布
+ + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+ + +
+
正常
+
预警
+
告警
+
离线
+
+
+ + +
+
+
+ 单位手表配备情况统计 +
+
+
+
+
+
+
+
+ + + +
+ + + + + + + diff --git a/other-module/emergency-screen/xian-center/index-v2.html b/other-module/emergency-screen/xian-center/index-v1.html similarity index 89% rename from other-module/emergency-screen/xian-center/index-v2.html rename to other-module/emergency-screen/xian-center/index-v1.html index c8f5e49..8c5de2b 100644 --- a/other-module/emergency-screen/xian-center/index-v2.html +++ b/other-module/emergency-screen/xian-center/index-v1.html @@ -107,84 +107,27 @@ .side{width:320px;flex-shrink:0;display:flex;flex-direction:column;gap:12px;} .center{flex:1;display:flex;flex-direction:column;min-width:0;position:relative;gap:12px;} - /* ========== 地图内悬浮资源统计胶囊(医疗点/救护车/AED) ========== */ - /* [交互] 默认隐藏,点击医疗点/救护车/AED Tab 后在地图底部居中悬浮显示 */ - .res-stat-row{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);z-index:11; - display:none;align-items:center;gap:6px;padding:6px 10px; - background:rgba(10,22,48,0.78);border:1px solid var(--panel-border);border-radius:24px; - backdrop-filter:blur(12px);box-shadow:0 6px 24px rgba(0,0,0,0.45),0 0 18px rgba(24,144,255,0.08);} - .res-stat-row::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; - border-top:1.5px solid rgba(24,144,255,0.45);border-left:1.5px solid rgba(24,144,255,0.45);border-radius:24px 0 0 0;pointer-events:none;} - .res-stat-row::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; - border-bottom:1.5px solid rgba(24,144,255,0.45);border-right:1.5px solid rgba(24,144,255,0.45);border-radius:0 0 24px 0;pointer-events:none;} - .res-stat-card{display:flex;align-items:center;gap:8px;padding:6px 12px;border-radius:18px; - background:transparent;border:none;position:relative;transition:all .25s;} - .res-stat-card:hover{background:rgba(24,144,255,0.1);} - .res-stat-card + .res-stat-card::before{content:'';position:absolute;left:-3px;top:50%; - transform:translateY(-50%);width:1px;height:18px;background:rgba(74,107,138,0.35);} - .res-stat-card__icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center; - justify-content:center;flex-shrink:0;background:rgba(24,144,255,0.16);color:var(--primary);} - .res-stat-card__icon--cyan{background:rgba(19,194,194,0.16);color:var(--cyan);} - .res-stat-card__icon--warning{background:rgba(250,173,20,0.16);color:var(--warning);} - .res-stat-card__icon--danger{background:rgba(255,77,79,0.16);color:var(--danger);} - .res-stat-card__icon--success{background:rgba(82,196,26,0.16);color:var(--success);} - .res-stat-card__icon svg{width:16px;height:16px;} - .res-stat-card__body{display:flex;flex-direction:column;gap:0;min-width:0;line-height:1.1;} - .res-stat-card__num{font-size:18px;font-weight:700;color:#fff;line-height:1.1;text-shadow:0 0 10px rgba(24,144,255,0.3);} - .res-stat-card__label{font-size:10px;color:var(--text-sub);margin-top:1px;} - - /* ========== 路径规划面板(Tab 栏下方悬浮) ========== */ - /* [交互] 点击"路径规划"Tab 后在地图顶部 Tab 栏下方展开 */ - .plan-panel{position:absolute;top:62px;left:50%;transform:translateX(-50%);z-index:19; - display:none;align-items:center;gap:8px;padding:8px 14px; - background:rgba(10,22,48,0.9);border:1px solid var(--panel-border);border-radius:10px; - backdrop-filter:blur(10px);box-shadow:0 6px 22px rgba(0,0,0,0.5),0 0 16px rgba(24,144,255,0.1); - white-space:nowrap;} - .plan-panel--show{display:flex;} - .plan-panel::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; - border-top:1.5px solid rgba(24,144,255,0.45);border-left:1.5px solid rgba(24,144,255,0.45);border-radius:10px 0 0 0;pointer-events:none;} - .plan-panel::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; - border-bottom:1.5px solid rgba(24,144,255,0.45);border-right:1.5px solid rgba(24,144,255,0.45);border-radius:0 0 10px 0;pointer-events:none;} - .plan-panel__field{display:flex;align-items:center;gap:6px;} - .plan-panel__label{font-size:12px;color:var(--text-sub);white-space:nowrap;} - .plan-panel__label .dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px;vertical-align:middle;} - .plan-panel__label--start .dot{background:var(--success);box-shadow:0 0 6px var(--success);} - .plan-panel__label--end .dot{background:var(--danger);box-shadow:0 0 6px var(--danger);} - .plan-panel__select{height:28px;padding:0 24px 0 10px;font-size:12px;color:var(--text-main); - background:rgba(24,144,255,0.08);border:1px solid var(--panel-border);border-radius:6px; - cursor:pointer;outline:none;transition:all .2s;min-width:130px; - appearance:none;-webkit-appearance:none; - background-image:url("data:image/svg+xml;utf8,"); - background-repeat:no-repeat;background-position:right 8px center;} - .plan-panel__select:hover,.plan-panel__select:focus{border-color:var(--primary);background-color:rgba(24,144,255,0.14);} - .plan-panel__btn{display:flex;align-items:center;gap:5px;height:28px;padding:0 14px; - border-radius:6px;font-size:12px;cursor:pointer;transition:all .2s;white-space:nowrap; - background:linear-gradient(90deg,rgba(24,144,255,0.3),rgba(24,144,255,0.15)); - color:#fff;border:1px solid rgba(24,144,255,0.5);} - .plan-panel__btn:hover{background:linear-gradient(90deg,rgba(24,144,255,0.45),rgba(24,144,255,0.25)); - box-shadow:0 0 12px rgba(24,144,255,0.3);} - .plan-panel__btn svg{width:14px;height:14px;} - .plan-panel__btn--ghost{background:rgba(74,107,138,0.18);color:var(--text-sub);border-color:rgba(74,107,138,0.35);} - .plan-panel__btn--ghost:hover{background:rgba(74,107,138,0.28);color:var(--text-main);box-shadow:none;} - .plan-panel__divider{width:1px;height:18px;background:rgba(74,107,138,0.3);} - - /* ========== 路径规划 SVG 层(独立于急救路线) ========== */ - .plan-route-svg{position:absolute;inset:0;width:100%;height:100%;z-index:6;pointer-events:none;display:none;} - .plan-route-svg--show{display:block;} - .plan-route-svg .plan-route-path{fill:none;stroke:#00E5FF;stroke-width:0.6; - stroke-dasharray:1.2 0.8;filter:drop-shadow(0 0 1px rgba(0,229,255,0.8)); - animation:planRouteDash 1s linear infinite;} - @keyframes planRouteDash{0%{stroke-dashoffset:0;}100%{stroke-dashoffset:-20;}} - .plan-endpoint{transform-origin:center;animation:planEndpointPulse 1.6s ease-in-out infinite;} - @keyframes planEndpointPulse{0%,100%{opacity:1;}50%{opacity:0.55;}} - .plan-route-info{position:absolute;top:104px;right:12px;z-index:18;display:none; - background:rgba(10,22,48,0.88);border:1px solid var(--panel-border);border-radius:8px; - padding:8px 12px;font-size:11px;color:var(--text-sub);min-width:130px; - backdrop-filter:blur(6px);box-shadow:0 4px 16px rgba(0,0,0,0.4);} - .plan-route-info--show{display:block;} - .plan-route-info__title{font-size:12px;color:var(--text-main);font-weight:600;margin-bottom:4px;} - .plan-route-info__row{display:flex;justify-content:space-between;gap:12px;line-height:1.6;} - .plan-route-info__row b{color:#fff;font-weight:600;} + /* ========== 中心KPI卡片行 ========== */ + .kpi-row{display:flex;gap:12px;flex-shrink:0;} + .kpi-card{flex:1;background:linear-gradient(135deg,rgba(10,25,50,0.85),rgba(15,40,70,0.7)); + border:1px solid var(--panel-border);border-radius:10px;padding:14px 16px;position:relative; + overflow:hidden;transition:all .3s;} + .kpi-card:hover{border-color:rgba(24,144,255,0.4);box-shadow:0 0 20px rgba(24,144,255,0.12);} + .kpi-card::before{content:'';position:absolute;top:0;left:0;width:12px;height:12px; + border-top:1.5px solid rgba(24,144,255,0.4);border-left:1.5px solid rgba(24,144,255,0.4);} + .kpi-card::after{content:'';position:absolute;bottom:0;right:0;width:12px;height:12px; + border-bottom:1.5px solid rgba(24,144,255,0.4);border-right:1.5px solid rgba(24,144,255,0.4);} + .kpi-card__header{display:flex;align-items:center;gap:8px;margin-bottom:8px;} + .kpi-card__diamond{width:8px;height:8px;background:var(--primary);transform:rotate(45deg); + box-shadow:0 0 6px rgba(24,144,255,0.6);flex-shrink:0;} + .kpi-card__diamond--cyan{background:var(--cyan);box-shadow:0 0 6px rgba(0,229,255,0.6);} + .kpi-card__diamond--green{background:var(--success);box-shadow:0 0 6px rgba(82,196,26,0.6);} + .kpi-card__diamond--orange{background:var(--warning);box-shadow:0 0 6px rgba(250,173,20,0.6);} + .kpi-card__label{font-size:11px;color:var(--text-sub);} + .kpi-card__num{font-size:28px;font-weight:700;color:#fff;line-height:1.2;text-shadow:0 0 12px rgba(24,144,255,0.3);} + .kpi-card__trend{font-size:10px;color:var(--text-dim);margin-top:2px;display:flex;align-items:center;gap:4px;} + .kpi-card__trend--up{color:var(--success);} + .kpi-card__trend--down{color:var(--danger);} /* ========== 通用面板(增强) ========== */ .panel{background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:10px; @@ -652,8 +595,8 @@ box-shadow:0 0 12px rgba(24,144,255,0.2);} .map-ctrl__btn svg{width:16px;height:16px;flex-shrink:0;} - /* ========== 地图右上角:图层切换 ========== */ - .map-layer{position:absolute;top:12px;right:12px;z-index:12; + /* ========== 地图右下角:图层切换 ========== */ + .map-layer{position:absolute;bottom:12px;right:178px;z-index:12; background:rgba(10,22,48,0.88);border:1px solid var(--panel-border);border-radius:8px; padding:8px 10px;display:flex;flex-direction:column;gap:2px; backdrop-filter:blur(6px);} @@ -981,6 +924,43 @@
+ + +
+
+
+
+ 穿戴设备总数 +
+
156
+ +
+
+
+
+ 今日穿戴报警数 +
+
23
+
▲ 较昨日 +5
+
+
+
+
+ 今日应急求助数 +
+
7
+
▼ 待处理 3 条
+
+
+
+
+ 平均响应时长 +
+
2.4 分钟
+ +
+
+
@@ -1006,66 +986,7 @@
AED
-
- 路径规划 -
- - -
-
- - -
-
-
- - -
-
- - -
- - -
-
规划路线
-
总距离--
-
预计用时--
-
-
@@ -1316,38 +1237,6 @@ 视频通话
- - - - - - - - - -
-
-
-
-
--
-
--
-
-
-
-
-
-
--
-
--
-
-
-
-
-
-
--
-
--
-
-
-
@@ -2627,158 +2516,6 @@ function switchTab(el,type){ }else{ markers.forEach(function(m){if(m.getAttribute('data-type')===type)m.style.display='block';}); } - - /* 同步更新地图下方资源统计卡片行 */ - updateResStatRow(type); - - /* 切换到普通资源 Tab 时,关闭路径规划面板并清除已绘制路径 */ - var planPanel=document.getElementById('planPanel'); - if(planPanel)planPanel.classList.remove('plan-panel--show'); - clearRoutePlan(); -} - -/* ========== 路径规划(独立于急救路线) ========== */ -/* 路径规划备选点坐标(viewBox 0 0 100 100,与地图标记点位置一致) */ -var PLAN_POINTS = { - emp: {x:50, y:50, name:'当前位置'}, - clinic1: {x:35, y:38, name:'采油一厂医疗点'}, - clinic2: {x:65, y:43, name:'采油二厂医疗点'}, - clinic3: {x:50, y:80, name:'采油三厂医疗点'}, - hospital1: {x:12, y:18, name:'兴隆医院'}, - hospital2: {x:75, y:20, name:'宝石花医院'}, - hospital3: {x:60, y:55, name:'庆阳医院'}, - hospital4: {x:15, y:75, name:'高陵医院'}, - amb1: {x:35, y:60, name:'陕A·120-03'}, - amb2: {x:55, y:25, name:'陕A·120-01'}, - aed1: {x:28, y:33, name:'AED-001'}, - aed2: {x:68, y:47, name:'AED-002'} -}; - -/* 切换路径规划 Tab:展开/收起规划面板,并保持所有地图标记可见 */ -function toggleRoutePlan(el){ - var tab=document.getElementById('planTab'); - var panel=document.getElementById('planPanel'); - if(!tab||!panel)return; - var isActive=tab.classList.contains('active'); - if(isActive){ - /* 再次点击:收起面板并清除路径 */ - tab.classList.remove('active'); - panel.classList.remove('plan-panel--show'); - clearRoutePlan(); - }else{ - /* 激活:取消其他 Tab 选中、隐藏统计胶囊、显示全部标记 */ - document.querySelectorAll('.res-tab').forEach(function(t){t.classList.remove('active','res-tab--route-active');}); - tab.classList.add('active'); - panel.classList.add('plan-panel--show'); - var statRow=document.getElementById('resStatRow'); - if(statRow)statRow.style.display='none'; - document.querySelectorAll('.map-marker').forEach(function(m){m.style.display='block';}); - /* 仅清除已绘制路径,保留面板打开 */ - var svg=document.getElementById('planRouteSvg'); - var path=document.getElementById('planRoutePath'); - var info=document.getElementById('planRouteInfo'); - var sd=document.getElementById('planStartDot'); - var ed=document.getElementById('planEndDot'); - if(svg)svg.classList.remove('plan-route-svg--show'); - if(path)path.setAttribute('opacity','0'); - if(info)info.classList.remove('plan-route-info--show'); - if(sd)sd.setAttribute('opacity','0'); - if(ed)ed.setAttribute('opacity','0'); - } -} - -/* 清除路径规划已绘制的路径与信息卡片(不动 Tab 与面板状态) */ -function clearRoutePlan(){ - var svg=document.getElementById('planRouteSvg'); - var path=document.getElementById('planRoutePath'); - var info=document.getElementById('planRouteInfo'); - var sd=document.getElementById('planStartDot'); - var ed=document.getElementById('planEndDot'); - if(svg)svg.classList.remove('plan-route-svg--show'); - if(path)path.setAttribute('opacity','0'); - if(info)info.classList.remove('plan-route-info--show'); - if(sd)sd.setAttribute('opacity','0'); - if(ed)ed.setAttribute('opacity','0'); -} - -/* 执行路径规划:根据起点终点绘制曲线路径并显示距离与用时 */ -function executeRoutePlan(){ - var sk=document.getElementById('planStart').value; - var ek=document.getElementById('planEnd').value; - if(sk===ek){alert('起点和终点不能相同,请重新选择。');return;} - var s=PLAN_POINTS[sk], e=PLAN_POINTS[ek]; - if(!s||!e)return; - var path=document.getElementById('planRoutePath'); - var svg=document.getElementById('planRouteSvg'); - var info=document.getElementById('planRouteInfo'); - var sd=document.getElementById('planStartDot'); - var ed=document.getElementById('planEndDot'); - /* 二次贝塞尔曲线:控制点垂直偏移,使路径呈现弧形而非直线 */ - var mx=(s.x+e.x)/2, my=(s.y+e.y)/2; - var cx=mx+(e.y-s.y)*0.18, cy=my+(s.x-e.x)*0.18; - var d='M '+s.x+' '+s.y+' Q '+cx+' '+cy+' '+e.x+' '+e.y; - path.setAttribute('d',d); - path.setAttribute('opacity','1'); - sd.setAttribute('cx',s.x);sd.setAttribute('cy',s.y);sd.setAttribute('opacity','1'); - ed.setAttribute('cx',e.x);ed.setAttribute('cy',e.y);ed.setAttribute('opacity','1'); - svg.classList.add('plan-route-svg--show'); - /* Mock 距离/用时:按 viewBox 距离换算 */ - var dx=s.x-e.x, dy=s.y-e.y, dist=Math.sqrt(dx*dx+dy*dy); - var km=(dist*0.15).toFixed(1); - var min=Math.max(1,Math.round(dist*0.6)); - document.getElementById('planRouteDist').textContent=km+' km'; - document.getElementById('planRouteTime').textContent=min+' 分钟'; - info.classList.add('plan-route-info--show'); -} - -/* ========== 资源统计卡片行(医疗点/救护车/AED) ========== */ -/* 资源统计卡片数据:点击对应 Tab 后在地图下方展示 */ -var RES_STAT_CONFIG = { - clinic: { - cards: [ - {label:'医疗点总数', num:'3', icon:'', tone:''}, - {label:'覆盖人数', num:'2,860', icon:'', tone:'--cyan'}, - {label:'医护人员', num:'28', icon:'', tone:'--success'} - ] - }, - ambulance: { - cards: [ - {label:'急救型救护车', num:'5', icon:'', tone:'--warning'}, - {label:'转运型救护车', num:'3', icon:'', tone:''}, - {label:'出勤次数', num:'128', icon:'', tone:'--danger'} - ] - }, - aed: { - cards: [ - {label:'在线设备', num:'18', icon:'', tone:'--success'}, - {label:'离线设备', num:'2', icon:'', tone:''}, - {label:'使用次数', num:'36', icon:'', tone:'--danger'} - ] - } -}; - -/* 根据当前资源 Tab 类型更新地图下方统计卡片 */ -function updateResStatRow(type){ - var row=document.getElementById('resStatRow'); - if(!row)return; - var config=RES_STAT_CONFIG[type]; - if(!config){ - row.style.display='none'; - return; - } - row.style.display='flex'; - config.cards.forEach(function(card,idx){ - var i=idx+1; - var iconEl=document.getElementById('resStatIcon'+i); - var numEl=document.getElementById('resStatNum'+i); - var labelEl=document.getElementById('resStatLabel'+i); - if(iconEl){ - iconEl.innerHTML=card.icon; - iconEl.className='res-stat-card__icon'+(card.tone||''); - } - if(numEl)numEl.textContent=card.num; - if(labelEl)labelEl.textContent=card.label; - }); } /* ========== 地图标记脉冲动画优化 ========== */ diff --git a/other-module/emergency-screen/xian-center/index-v3.html b/other-module/emergency-screen/xian-center/index-v3.html deleted file mode 100644 index 99e716d..0000000 --- a/other-module/emergency-screen/xian-center/index-v3.html +++ /dev/null @@ -1,3617 +0,0 @@ - - - - - - 西安应急中心大屏 | 健康CQ原型 - - - - - -
-
-
--
-
-
-
- -
- 西安应急中心大屏 -
-
- - - - -
- 系统累计运行 - 0 - -
-
-
-
- - -
-
-
- -
-
-
1,286
-
在线监测设备
-
- ↑ 2.3% -
-
-
- -
-
-
109
-
今日告警总数
-
- ↑ 12.4% -
-
-
- -
-
-
7
-
待处理事件
-
- ↑ 3 -
-
-
- -
-
-
102
-
已处理事件
-
- ↓ 8.1% -
-
-
- -
-
-
4.2分钟
-
平均响应时长
-
- ↓ 0.6 -
-
- - -
- - - - -
- -
- - - - -
-
- - -
-
-
- - -
-
- - -
- - -
-
规划路线
-
总距离--
-
预计用时--
-
- -
- -
-
-
-
-
-
- -
兴隆医院
-
高陵医院
-
宝石花医院
-
庆阳医院
-
采油一厂
-
采油二厂
-
采油三厂
- -
CQ大道
-
能源北路
-
兴隆路
- - -
-
- -
兴隆医院
-
-
-
- -
高陵医院
-
-
-
- -
宝石花医院
-
-
-
- -
庆阳医院
-
- -
-
- -
采油一厂医疗点
-
-
-
- -
采油二厂医疗点
-
-
-
- -
采油三厂医疗点
-
- -
-
- -
AED-001
-
-
-
- -
AED-002
-
- -
-
- -
陕A·120-03
-
-
-
- -
陕A·120-01
-
- - - -
-
油田医院(1)
-
合作医院(1)
-
地方医院(2)
-
医疗点(3)
-
救护车(2)
-
AED(2)
-
- - -
-
- - - - - -
-
告警详情
-
-
- 异常类型 - 摔倒 -
-
- 异常值 - -- -
-
- 告警时间 - 2026-06-23 14:32:15 -
-
- 员工姓名 - 张建国 -
-
- 单位部门 - 采油一厂生产区 -
-
- 详细地址 - 采油一厂生产基地B区3号井组作业平台 -
-
-
-
- - -
-
-
-
详细地址
-
-
- - - - - - - - - - - - - - - - - - -
-
距离最近资源
- -
-
-
-
兴隆医院 油田医院
-
2.4 km约8分钟
-
-
-
-
-
-
宝石花医院 合作医院
-
5.2 km约15分钟
-
-
-
-
-
-
庆阳医院 地方医院
-
3.6 km约11分钟
-
-
-
-
-
-
采油一厂医疗点 医疗点
-
0.3 km约1分钟
-
-
-
-
-
-
陕A·120-03 救护车
-
2.2 km约7分钟
-
-
-
-
-
-
AED-001 AED
-
0.5 km约2分钟
-
-
-
- - -
-
- 急救提示书 - × -
-
-
    -
  1. 心率与血氧异常,可能是心梗前期
  2. -
  3. 立即停止活动,平躺减少能量和氧气消耗
  4. -
  5. 如有症状发生请立即拨打120
  6. -
  7. 请准备硝酸甘油准备服用
  8. -
  9. 距离350米处有AED可用,电话15698987876
  10. -
  11. 距离580米处有急救包可用,电话12569869896
  12. -
  13. 距离8.5公里处有救护车,电话1365695668815分钟可赶来
  14. -
  15. 距离8.5公里处有医疗点,电话1569896365615分钟可赶来
  16. -
  17. 距离18公里处有庆城县医院,救护车来回约45分钟,该医院内科李晓涛医生、王开来医生较为专长
  18. -
  19. 距离52公里处有庆阳市医院,救护车来回约75分钟,该医院心梗急救能力强,教授胡忠、副教授李悦、教授徐立专长心梗,徐立是油田专家库签约教授
  20. -
  21. 距离339公里有西京医院、唐都医院、交大一附院、交大二附院等,急救能力强,有油田签约教授,在征得医生意见后,可谨慎考虑前往
  22. -
  23. 距离335公里有油田应急就医服务中心,可咨询就医,可帮助对以上应急医疗资源进行联系、协调,电话02986565199
  24. -
-
-
- - -
- 默认地图 - 卫星地图 - 标准地图 -
- - -
-
- 当前接收状态 - -
- - -
- - - - - - - - - -
-
-
-
-
--
-
--
-
-
-
-
-
-
--
-
--
-
-
-
-
-
-
--
-
--
-
-
-
-
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - diff --git a/other-module/emergency-screen/xian-center/index.html b/other-module/emergency-screen/xian-center/index.html index 8c5de2b..809f887 100644 --- a/other-module/emergency-screen/xian-center/index.html +++ b/other-module/emergency-screen/xian-center/index.html @@ -56,12 +56,46 @@ /* ========== 顶部标题栏 ========== */ .header{height:64px;padding:0 24px;display:flex;align-items:center;justify-content:center; background:linear-gradient(90deg,rgba(10,30,60,0.9) 0%,rgba(15,40,80,0.95) 50%,rgba(10,30,60,0.9) 100%); - border-bottom:1px solid var(--panel-border);position:relative;z-index:10;} + border-bottom:1px solid var(--panel-border);position:relative;z-index:10;overflow:hidden;} - /* 标题栏扫描线 */ - .header__scan-line{position:absolute;bottom:0;left:0;width:100%;height:1px; + /* 标题栏背景网格(左右淡出) */ + .header::before{ + content:'';position:absolute;inset:0;pointer-events:none;z-index:0; + background-image: + linear-gradient(rgba(24,144,255,0.06) 1px,transparent 1px), + linear-gradient(90deg,rgba(24,144,255,0.06) 1px,transparent 1px); + background-size:32px 32px; + -webkit-mask-image:linear-gradient(90deg,transparent 0%,#000 12%,#000 88%,transparent 100%); + mask-image:linear-gradient(90deg,transparent 0%,#000 12%,#000 88%,transparent 100%); + } + + /* 标题栏四角科技角标(L 形) */ + .header::after{ + content:'';position:absolute;inset:0;pointer-events:none;z-index:0;opacity:0.7; + background: + linear-gradient(90deg,var(--cyan),var(--cyan)) left top/16px 1px no-repeat, + linear-gradient(180deg,var(--cyan),var(--cyan)) left top/1px 16px no-repeat, + linear-gradient(90deg,var(--cyan),var(--cyan)) right top/16px 1px no-repeat, + linear-gradient(180deg,var(--cyan),var(--cyan)) right top/1px 16px no-repeat, + linear-gradient(90deg,var(--cyan),var(--cyan)) left bottom/16px 1px no-repeat, + linear-gradient(0deg,var(--cyan),var(--cyan)) left bottom/1px 16px no-repeat, + linear-gradient(90deg,var(--cyan),var(--cyan)) right bottom/16px 1px no-repeat, + linear-gradient(0deg,var(--cyan),var(--cyan)) right bottom/1px 16px no-repeat; + } + + /* 标题栏扫描线(主线 + 副线双向流动) */ + .header__scan-line{position:absolute;bottom:0;left:0;width:100%;height:1px;z-index:3; background:linear-gradient(90deg,transparent,rgba(24,144,255,0.5),transparent); animation:scanLine 4s ease-in-out infinite;pointer-events:none;} + .header__scan-line::after{content:'';position:absolute;left:0;top:0;width:100%;height:1px; + background:linear-gradient(90deg,transparent,rgba(0,229,255,0.35),transparent); + animation:scanLineReverse 6s ease-in-out infinite;} + @keyframes scanLineReverse{ + 0%{transform:translateX(100%);opacity:0;} + 20%{opacity:0.8;} + 80%{opacity:0.8;} + 100%{transform:translateX(-100%);opacity:0;} + } @keyframes scanLine{ 0%{transform:translateX(-100%);opacity:0;} 20%{opacity:1;} @@ -69,15 +103,24 @@ 100%{transform:translateX(100%);opacity:0;} } - .header__title{display:flex;align-items:center;gap:12px;} - .header__title-icon{width:36px;height:36px;background:linear-gradient(135deg,var(--primary),#40a9ff); - border-radius:8px;display:flex;align-items:center;justify-content:center;box-shadow:0 0 12px rgba(24,144,255,0.35);} - .header__title-icon svg{width:22px;height:22px;} + .header__title{display:flex;align-items:center;gap:12px;position:relative;z-index:2;} + /* 标题左右装饰条:方块—线—菱形 */ + .header__title::before,.header__title::after{ + content:'';width:120px;height:14px;flex-shrink:0;background-repeat:no-repeat;background-position:center; + } + .header__title::before{ + margin-right:6px; + background-image:url("data:image/svg+xml;utf8,"); + } + .header__title::after{ + margin-left:6px; + background-image:url("data:image/svg+xml;utf8,"); + } .header__title-text{font-size:22px;font-weight:700;letter-spacing:1.5px; background:linear-gradient(90deg,#fff,#8CB8D9);-webkit-background-clip:text;-webkit-text-fill-color:transparent;} - .header__left{position:absolute;left:24px;top:50%;transform:translateY(-50%);} + .header__left{position:absolute;left:24px;top:50%;transform:translateY(-50%);z-index:2;} .header__clock{font-size:14px;color:var(--text-sub);font-variant-numeric:tabular-nums;letter-spacing:0.5px;} - .header__right{position:absolute;right:24px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:12px;} + .header__right{position:absolute;right:24px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:12px;z-index:2;} .header__btn{height:28px;padding:0 14px;border-radius:14px;font-size:11px;cursor:pointer;transition:all .2s; border:1px solid;font-weight:500;white-space:nowrap;} .header__btn--alarm{background:rgba(255,77,79,0.15);color:var(--danger);border-color:rgba(255,77,79,0.3);} @@ -89,45 +132,160 @@ .header__runtime{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-sub);} .header__runtime-num{font-size:18px;font-weight:700;color:var(--primary);text-shadow:0 0 8px rgba(24,144,255,0.4);} + /* header 顶部左右斜切几何条 */ + .header__deco{position:absolute;top:6px;width:88px;height:10px;pointer-events:none;z-index:1; + background-repeat:no-repeat;background-position:center;background-size:100% 100%;} + .header__deco--left{left:32px; + background-image:url("data:image/svg+xml;utf8,"); + } + .header__deco--right{right:32px; + background-image:url("data:image/svg+xml;utf8,"); + } + /* ========== 资源Tab栏 ========== */ .res-tabs{position:absolute;top:12px;left:50%;transform:translateX(-50%); display:flex;align-items:center;gap:8px;padding:6px 16px;z-index:20; background:rgba(10,20,44,0.85);border:1px solid var(--panel-border);border-radius:20px; backdrop-filter:blur(8px);white-space:nowrap;} - .res-tab{height:32px;padding:0 18px;border-radius:16px;font-size:13px;cursor:pointer;transition:all .25s; + .res-tab{height:32px;padding:0 14px;border-radius:16px;font-size:13px;cursor:pointer;transition:all .25s; display:flex;align-items:center;gap:6px;border:1px solid var(--panel-border);background:rgba(24,144,255,0.06);color:var(--text-sub);} .res-tab:hover{border-color:var(--primary);color:var(--text-main);} .res-tab.active{background:linear-gradient(90deg,rgba(24,144,255,0.25),rgba(24,144,255,0.1)); border-color:var(--primary);color:#fff;box-shadow:0 0 12px rgba(24,144,255,0.2);} - .res-tab .dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim);} - .res-tab.active .dot{background:var(--success);box-shadow:0 0 6px var(--success);} + /* 资源类型图标:各分类专属图标 + 专属配色,激活态追加发光 */ + .res-tab .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--text-dim);box-sizing:border-box;} + .res-tab.active .dot{box-shadow:0 0 6px currentColor;} + .res-tab__icon{width:14px;height:14px;flex-shrink:0;} + .res-tab.active .res-tab__icon{filter:drop-shadow(0 0 4px currentColor);} + .res-tab__icon--all{color:#1890FF;} + .res-tab__icon--oilfield{color:#1890FF;} + .res-tab__icon--cooperative{color:#722ED1;} + .res-tab__icon--local{color:#1890FF;} + .res-tab__icon--clinic{color:#13C2C2;} + .res-tab__icon--ambulance{color:#FAAD14;} + .res-tab__icon--aed{color:#FF4D4F;} + /* 资源数量徽标 */ + .res-tab__count{font-size:11px;font-weight:600;color:inherit;opacity:0.75; + padding:0 6px;border-radius:8px;background:rgba(74,107,138,0.25);min-width:18px;text-align:center; + font-variant-numeric:tabular-nums;line-height:1.4;} + .res-tab.active .res-tab__count{background:rgba(255,255,255,0.18);opacity:1;color:#fff;} /* ========== 主布局 ========== */ .main{display:flex;height:calc(100vh - 64px);gap:12px;padding:8px 12px 12px;} - .side{width:320px;flex-shrink:0;display:flex;flex-direction:column;gap:12px;} + .side{width:340px;flex-shrink:0;display:flex;flex-direction:column;gap:12px;} .center{flex:1;display:flex;flex-direction:column;min-width:0;position:relative;gap:12px;} - /* ========== 中心KPI卡片行 ========== */ - .kpi-row{display:flex;gap:12px;flex-shrink:0;} - .kpi-card{flex:1;background:linear-gradient(135deg,rgba(10,25,50,0.85),rgba(15,40,70,0.7)); - border:1px solid var(--panel-border);border-radius:10px;padding:14px 16px;position:relative; - overflow:hidden;transition:all .3s;} - .kpi-card:hover{border-color:rgba(24,144,255,0.4);box-shadow:0 0 20px rgba(24,144,255,0.12);} - .kpi-card::before{content:'';position:absolute;top:0;left:0;width:12px;height:12px; - border-top:1.5px solid rgba(24,144,255,0.4);border-left:1.5px solid rgba(24,144,255,0.4);} - .kpi-card::after{content:'';position:absolute;bottom:0;right:0;width:12px;height:12px; - border-bottom:1.5px solid rgba(24,144,255,0.4);border-right:1.5px solid rgba(24,144,255,0.4);} - .kpi-card__header{display:flex;align-items:center;gap:8px;margin-bottom:8px;} - .kpi-card__diamond{width:8px;height:8px;background:var(--primary);transform:rotate(45deg); - box-shadow:0 0 6px rgba(24,144,255,0.6);flex-shrink:0;} - .kpi-card__diamond--cyan{background:var(--cyan);box-shadow:0 0 6px rgba(0,229,255,0.6);} - .kpi-card__diamond--green{background:var(--success);box-shadow:0 0 6px rgba(82,196,26,0.6);} - .kpi-card__diamond--orange{background:var(--warning);box-shadow:0 0 6px rgba(250,173,20,0.6);} - .kpi-card__label{font-size:11px;color:var(--text-sub);} - .kpi-card__num{font-size:28px;font-weight:700;color:#fff;line-height:1.2;text-shadow:0 0 12px rgba(24,144,255,0.3);} - .kpi-card__trend{font-size:10px;color:var(--text-dim);margin-top:2px;display:flex;align-items:center;gap:4px;} - .kpi-card__trend--up{color:var(--success);} - .kpi-card__trend--down{color:var(--danger);} + /* ========== 中间区域顶部统计卡片栏 ========== */ + /* [布局] 位于地图上方独立一行,4 个卡片横向均分,高度紧凑避免占用过多地图空间 */ + .top-stats{display:flex;gap:10px;flex-shrink:0;} + /* [布局] 去除图标,数字与标签整体居中显示 */ + .top-stat-card{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:2px; + padding:12px 14px;min-height:70px;text-align:center; + background:linear-gradient(135deg,rgba(24,144,255,0.10),rgba(10,30,60,0.55)); + border:1px solid var(--panel-border);border-radius:8px;position:relative;overflow:hidden; + transition:all .2s;} + .top-stat-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px; + background:var(--primary);box-shadow:0 0 8px rgba(24,144,255,0.5);} + .top-stat-card:hover{border-color:rgba(24,144,255,0.4); + box-shadow:0 0 14px rgba(24,144,255,0.15);transform:translateY(-1px);} + .top-stat-card__body{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:2px;min-width:0;line-height:1.1;} + .top-stat-card__num{font-size:22px;font-weight:700;color:#fff;line-height:1; + text-shadow:0 0 8px rgba(255,255,255,0.2);font-variant-numeric:tabular-nums;letter-spacing:0.5px;} + .top-stat-card__num unit{font-size:12px;font-weight:400;color:var(--text-sub);margin-left:3px;} + .top-stat-card__label{font-size:11px;color:var(--text-sub);white-space:nowrap; + display:flex;align-items:center;gap:4px;justify-content:center;} + /* 色系变体 */ + .top-stat-card--primary::before{background:var(--primary);box-shadow:0 0 8px rgba(24,144,255,0.5);} + .top-stat-card--primary .top-stat-card__num{color:#fff;text-shadow:0 0 8px rgba(24,144,255,0.4);} + .top-stat-card--warning::before{background:var(--warning);box-shadow:0 0 8px rgba(250,173,20,0.5);} + .top-stat-card--warning .top-stat-card__num{color:var(--warning);text-shadow:0 0 8px rgba(250,173,20,0.35);} + .top-stat-card--success::before{background:var(--success);box-shadow:0 0 8px rgba(82,196,26,0.5);} + .top-stat-card--success .top-stat-card__num{color:var(--success);text-shadow:0 0 8px rgba(82,196,26,0.35);} + .top-stat-card--danger::before{background:var(--danger);box-shadow:0 0 8px rgba(255,77,79,0.5);} + .top-stat-card--danger .top-stat-card__num{color:var(--danger);text-shadow:0 0 8px rgba(255,77,79,0.35);} + /* 趋势小标记 */ + .top-stat-card__trend{font-size:10px;padding:1px 5px;border-radius:8px;font-weight:500;line-height:1.2;} + .top-stat-card__trend--up{background:rgba(255,77,79,0.14);color:var(--danger);} + .top-stat-card__trend--down{background:rgba(82,196,26,0.14);color:var(--success);} + + /* ========== 地图内悬浮资源统计胶囊(医疗点/救护车/AED) ========== */ + /* [交互] 默认隐藏,点击医疗点/救护车/AED Tab 后在地图底部居中悬浮显示 */ + .res-stat-row{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);z-index:11; + display:none;align-items:center;gap:6px;padding:6px 10px; + background:rgba(10,22,48,0.78);border:1px solid var(--panel-border);border-radius:24px; + backdrop-filter:blur(12px);box-shadow:0 6px 24px rgba(0,0,0,0.45),0 0 18px rgba(24,144,255,0.08);} + .res-stat-row::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; + border-top:1.5px solid rgba(24,144,255,0.45);border-left:1.5px solid rgba(24,144,255,0.45);border-radius:24px 0 0 0;pointer-events:none;} + .res-stat-row::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; + border-bottom:1.5px solid rgba(24,144,255,0.45);border-right:1.5px solid rgba(24,144,255,0.45);border-radius:0 0 24px 0;pointer-events:none;} + .res-stat-card{display:flex;align-items:center;gap:8px;padding:6px 12px;border-radius:18px; + background:transparent;border:none;position:relative;transition:all .25s;} + .res-stat-card:hover{background:rgba(24,144,255,0.1);} + .res-stat-card + .res-stat-card::before{content:'';position:absolute;left:-3px;top:50%; + transform:translateY(-50%);width:1px;height:18px;background:rgba(74,107,138,0.35);} + .res-stat-card__icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center; + justify-content:center;flex-shrink:0;background:rgba(24,144,255,0.16);color:var(--primary);} + .res-stat-card__icon--cyan{background:rgba(19,194,194,0.16);color:var(--cyan);} + .res-stat-card__icon--warning{background:rgba(250,173,20,0.16);color:var(--warning);} + .res-stat-card__icon--danger{background:rgba(255,77,79,0.16);color:var(--danger);} + .res-stat-card__icon--success{background:rgba(82,196,26,0.16);color:var(--success);} + .res-stat-card__icon svg{width:16px;height:16px;} + .res-stat-card__body{display:flex;flex-direction:column;gap:0;min-width:0;line-height:1.1;} + .res-stat-card__num{font-size:18px;font-weight:700;color:#fff;line-height:1.1;text-shadow:0 0 10px rgba(24,144,255,0.3);} + .res-stat-card__label{font-size:10px;color:var(--text-sub);margin-top:1px;} + + /* ========== 路径规划面板(Tab 栏下方悬浮) ========== */ + /* [交互] 点击"路径规划"Tab 后在地图顶部 Tab 栏下方展开 */ + .plan-panel{position:absolute;top:62px;left:50%;transform:translateX(-50%);z-index:19; + display:none;align-items:center;gap:8px;padding:8px 14px; + background:rgba(10,22,48,0.9);border:1px solid var(--panel-border);border-radius:10px; + backdrop-filter:blur(10px);box-shadow:0 6px 22px rgba(0,0,0,0.5),0 0 16px rgba(24,144,255,0.1); + white-space:nowrap;} + .plan-panel--show{display:flex;} + .plan-panel::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; + border-top:1.5px solid rgba(24,144,255,0.45);border-left:1.5px solid rgba(24,144,255,0.45);border-radius:10px 0 0 0;pointer-events:none;} + .plan-panel::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; + border-bottom:1.5px solid rgba(24,144,255,0.45);border-right:1.5px solid rgba(24,144,255,0.45);border-radius:0 0 10px 0;pointer-events:none;} + .plan-panel__field{display:flex;align-items:center;gap:6px;} + .plan-panel__label{font-size:12px;color:var(--text-sub);white-space:nowrap;} + .plan-panel__label .dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px;vertical-align:middle;} + .plan-panel__label--start .dot{background:var(--success);box-shadow:0 0 6px var(--success);} + .plan-panel__label--end .dot{background:var(--danger);box-shadow:0 0 6px var(--danger);} + .plan-panel__select{height:28px;padding:0 24px 0 10px;font-size:12px;color:var(--text-main); + background:rgba(24,144,255,0.08);border:1px solid var(--panel-border);border-radius:6px; + cursor:pointer;outline:none;transition:all .2s;min-width:130px; + appearance:none;-webkit-appearance:none; + background-image:url("data:image/svg+xml;utf8,"); + background-repeat:no-repeat;background-position:right 8px center;} + .plan-panel__select:hover,.plan-panel__select:focus{border-color:var(--primary);background-color:rgba(24,144,255,0.14);} + .plan-panel__btn{display:flex;align-items:center;gap:5px;height:28px;padding:0 14px; + border-radius:6px;font-size:12px;cursor:pointer;transition:all .2s;white-space:nowrap; + background:linear-gradient(90deg,rgba(24,144,255,0.3),rgba(24,144,255,0.15)); + color:#fff;border:1px solid rgba(24,144,255,0.5);} + .plan-panel__btn:hover{background:linear-gradient(90deg,rgba(24,144,255,0.45),rgba(24,144,255,0.25)); + box-shadow:0 0 12px rgba(24,144,255,0.3);} + .plan-panel__btn svg{width:14px;height:14px;} + .plan-panel__btn--ghost{background:rgba(74,107,138,0.18);color:var(--text-sub);border-color:rgba(74,107,138,0.35);} + .plan-panel__btn--ghost:hover{background:rgba(74,107,138,0.28);color:var(--text-main);box-shadow:none;} + .plan-panel__divider{width:1px;height:18px;background:rgba(74,107,138,0.3);} + + /* ========== 路径规划 SVG 层(独立于急救路线) ========== */ + .plan-route-svg{position:absolute;inset:0;width:100%;height:100%;z-index:6;pointer-events:none;display:none;} + .plan-route-svg--show{display:block;} + .plan-route-svg .plan-route-path{fill:none;stroke:#00E5FF;stroke-width:0.6; + stroke-dasharray:1.2 0.8;filter:drop-shadow(0 0 1px rgba(0,229,255,0.8)); + animation:planRouteDash 1s linear infinite;} + @keyframes planRouteDash{0%{stroke-dashoffset:0;}100%{stroke-dashoffset:-20;}} + .plan-endpoint{transform-origin:center;animation:planEndpointPulse 1.6s ease-in-out infinite;} + @keyframes planEndpointPulse{0%,100%{opacity:1;}50%{opacity:0.55;}} + .plan-route-info{position:absolute;top:104px;right:12px;z-index:18;display:none; + background:rgba(10,22,48,0.88);border:1px solid var(--panel-border);border-radius:8px; + padding:8px 12px;font-size:11px;color:var(--text-sub);min-width:130px; + backdrop-filter:blur(6px);box-shadow:0 4px 16px rgba(0,0,0,0.4);} + .plan-route-info--show{display:block;} + .plan-route-info__title{font-size:12px;color:var(--text-main);font-weight:600;margin-bottom:4px;} + .plan-route-info__row{display:flex;justify-content:space-between;gap:12px;line-height:1.6;} + .plan-route-info__row b{color:#fff;font-weight:600;} /* ========== 通用面板(增强) ========== */ .panel{background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:10px; @@ -178,7 +336,7 @@ /* ========== 左侧:服务详情 ========== */ .stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;} .stat-card{background:rgba(24,144,255,0.06);border:1px solid var(--panel-border);border-radius:8px; - padding:12px;text-align:center;transition:all .2s;} + padding:12px;text-align:center;transition:all .2s;cursor:pointer;} .stat-card:hover{border-color:rgba(24,144,255,0.35);box-shadow:0 0 12px rgba(24,144,255,0.1);} .stat-card__num{font-size:24px;font-weight:700;color:#fff;line-height:1;text-shadow:0 0 8px rgba(255,255,255,0.2);} .stat-card__label{font-size:11px;color:var(--text-sub);margin-top:6px;} @@ -232,19 +390,33 @@ /* ========== 中间:地图区域 ========== */ .map-wrap{flex:1;border-radius:10px;position:relative;overflow:hidden; - background:var(--map-bg);border:1px solid var(--panel-border);} - .map-bg{position:absolute;inset:0;background-image: - linear-gradient(rgba(24,144,255,0.04) 1px,transparent 1px), - linear-gradient(90deg,rgba(24,144,255,0.04) 1px,transparent 1px); - background-size:50px 50px;} - .map-road{position:absolute;background:rgba(24,144,255,0.08);} + background:radial-gradient(circle at 50% 48%,rgba(24,144,255,0.20),transparent 58%),var(--map-bg); + border:1px solid rgba(0,229,255,0.20);} + .map-bg{position:absolute;inset:0;z-index:0;background-image: + linear-gradient(rgba(0,229,255,0.10) 1px,transparent 1px), + linear-gradient(90deg,rgba(0,229,255,0.10) 1px,transparent 1px), + linear-gradient(rgba(24,144,255,0.18) 2px,transparent 2px), + linear-gradient(90deg,rgba(24,144,255,0.18) 2px,transparent 2px); + background-size:36px 36px,36px 36px,180px 180px,180px 180px; + background-position:center;} + .map-bg::before{content:'';position:absolute;inset:0;pointer-events:none; + background: + linear-gradient(90deg,transparent 0%,rgba(0,229,255,0.18) 50%,transparent 100%) center 32%/100% 1px no-repeat, + linear-gradient(0deg,transparent 0%,rgba(0,229,255,0.16) 50%,transparent 100%) 50% center/1px 100% no-repeat, + radial-gradient(circle at 33% 40%,rgba(24,144,255,0.24),transparent 18%), + radial-gradient(circle at 66% 46%,rgba(0,229,255,0.18),transparent 18%), + radial-gradient(circle at 50% 78%,rgba(24,144,255,0.20),transparent 16%); + opacity:.9;} + .map-bg::after{content:'';position:absolute;inset:10px;pointer-events:none;border-radius:8px; + border:1px solid rgba(0,229,255,0.16);box-shadow:inset 0 0 42px rgba(0,229,255,0.10);} + .map-road{position:absolute;z-index:1;background:rgba(0,229,255,0.18);box-shadow:0 0 10px rgba(0,229,255,0.16);} .map-road--h{height:2px;left:0;right:0;} .map-road--v{width:2px;top:0;bottom:0;} - .map-area{position:absolute;border:1px solid rgba(24,144,255,0.15);border-radius:6px; - background:rgba(24,144,255,0.03);display:flex;align-items:center;justify-content:center; - font-size:11px;color:var(--text-dim);transition:all .3s;} - .map-area:hover{border-color:rgba(24,144,255,0.4);background:rgba(24,144,255,0.08);color:var(--text-main);} - .map-label{position:absolute;font-size:10px;color:var(--text-dim);pointer-events:none;} + .map-area{position:absolute;z-index:1;border:1px solid rgba(0,229,255,0.22);border-radius:6px; + background:rgba(24,144,255,0.055);display:flex;align-items:center;justify-content:center; + font-size:11px;color:rgba(140,184,217,0.92);transition:all .3s;box-shadow:inset 0 0 18px rgba(0,229,255,0.04);} + .map-area:hover{border-color:rgba(0,229,255,0.48);background:rgba(24,144,255,0.12);color:var(--text-main);} + .map-label{position:absolute;z-index:1;font-size:10px;color:rgba(140,184,217,0.78);pointer-events:none;} /* 地图标记点 */ .map-marker{position:absolute;transform:translate(-50%,-100%);cursor:pointer;z-index:5;transition:all .2s;} @@ -256,13 +428,6 @@ width:40px;height:40px;border-radius:50%;animation:pulse 2s ease-out infinite;} @keyframes pulse{0%{transform:translate(-50%,-50%) scale(0.5);opacity:1;}100%{transform:translate(-50%,-50%) scale(2);opacity:0;}} - /* 地图图例 */ - .map-legend{position:absolute;bottom:12px;left:12px;background:rgba(10,20,40,0.85); - border:1px solid var(--panel-border);border-radius:8px;padding:10px 14px; - display:grid;grid-template-columns:1fr 1fr;column-gap:16px;row-gap:6px;} - .map-legend__item{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--text-sub);} - .map-legend__dot{width:10px;height:10px;border-radius:50%;} - /* ========== 右侧:一线医疗点 ========== */ .clinic-item{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid rgba(24,144,255,0.08);} .clinic-item:last-child{border-bottom:none;} @@ -275,25 +440,60 @@ .clinic-item__stats{display:flex;gap:10px;font-size:10px;color:var(--text-sub);margin-top:3px;} .clinic-item__stats span{display:flex;align-items:center;gap:3px;} - /* ========== 穿戴告警分布(柱状图) ========== */ - .alarm-bars{display:flex;flex-direction:column;gap:10px;} - .alarm-bar{display:flex;align-items:center;gap:8px;} - .alarm-bar__label{font-size:11px;width:56px;text-align:right;flex-shrink:0;font-weight:500;} - .alarm-bar__label--heart{color:var(--danger);} - .alarm-bar__label--spo2{color:#b37feb;} - .alarm-bar__label--bp{color:var(--primary);} - .alarm-bar__label--temp{color:var(--warning);} - .alarm-bar__label--fall{color:var(--danger);} - .alarm-bar__label--sos{color:var(--danger);} - .alarm-bar__track{flex:1;height:14px;background:rgba(24,144,255,0.08);border-radius:3px;overflow:hidden;} - .alarm-bar__fill{height:100%;border-radius:3px;transition:width .8s ease;} - .alarm-bar__fill--heart{background:linear-gradient(90deg,rgba(255,77,79,0.6),var(--danger));} - .alarm-bar__fill--spo2{background:linear-gradient(90deg,rgba(114,46,209,0.6),#b37feb);} - .alarm-bar__fill--bp{background:linear-gradient(90deg,rgba(24,144,255,0.6),var(--primary));} - .alarm-bar__fill--temp{background:linear-gradient(90deg,rgba(250,173,20,0.6),var(--warning));} - .alarm-bar__fill--fall{background:linear-gradient(90deg,rgba(255,77,79,0.7),var(--danger));} - .alarm-bar__fill--sos{background:linear-gradient(90deg,rgba(255,77,79,0.8),var(--danger));} - .alarm-bar__num{font-size:12px;font-weight:600;color:var(--text-main);width:24px;text-align:right;flex-shrink:0;} + /* ========== 穿戴告警分布(筛选 + 指标切换 + 环形图/睡眠柱图) ========== */ + .panel--wearable-dist .panel__body{padding:7px 10px 9px;overflow:hidden;} + .wearable-dist{display:flex;flex-direction:column;gap:7px;} + .wearable-dist__tabs{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;} + .wearable-dist__tab{height:28px;border-radius:4px;border:1px solid rgba(24,144,255,0.18); + background:rgba(24,144,255,0.05);color:var(--text-sub);font-size:11px;font-weight:600; + cursor:pointer;transition:all .18s;position:relative;padding:0;} + .wearable-dist__tab::before,.wearable-dist__tab::after{content:'';position:absolute;width:7px;height:7px;opacity:.55;} + .wearable-dist__tab::before{left:2px;top:2px;border-left:1px solid currentColor;border-top:1px solid currentColor;} + .wearable-dist__tab::after{right:2px;bottom:2px;border-right:1px solid currentColor;border-bottom:1px solid currentColor;} + .wearable-dist__tab:hover{color:var(--text-main);border-color:rgba(24,144,255,0.36);} + .wearable-dist__tab.active{color:#fff;background:rgba(24,144,255,0.18);border-color:var(--primary); + box-shadow:0 0 10px rgba(24,144,255,0.18);} + .wearable-chart{min-height:0;} + .wearable-chart--ring{height:136px;} + .wearable-chart--sleep{height:164px;} + .wearable-ring-layout{height:136px;display:flex;align-items:center;gap:8px;min-width:0;} + .wearable-ring{width:120px;height:120px;position:relative;flex-shrink:0;} + .wearable-ring svg{width:100%;height:100%;display:block;overflow:visible;} + .wearable-ring__segment{cursor:pointer;transition:opacity .18s,filter .18s,stroke-width .18s;} + .wearable-ring__segment:hover{opacity:1;stroke-width:20;filter:drop-shadow(0 0 6px currentColor);} + .wearable-ring__center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center; + justify-content:center;text-align:center;pointer-events:none;} + .wearable-ring__label{font-size:11px;color:var(--text-sub);font-weight:600;} + .wearable-ring__num{font-size:22px;font-weight:700;color:#fff;line-height:1.15;margin-top:3px; + text-shadow:0 0 10px rgba(24,144,255,0.42);font-variant-numeric:tabular-nums;} + .wearable-ring__unit{font-size:10px;color:var(--text-dim);margin-top:1px;} + .wearable-summary{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px;} + .wearable-summary__title{font-size:12px;font-weight:700;color:#fff;line-height:1.25;} + .wearable-summary__range{font-size:11px;color:var(--text-sub);line-height:1.35;} + .wearable-summary__range b{color:var(--cyan);font-weight:700;} + .wearable-legend{display:flex;flex-direction:column;gap:4px;} + .wearable-legend__item{display:grid;grid-template-columns:8px minmax(36px,1fr) auto;align-items:center;gap:5px; + font-size:10px;color:var(--text-sub);min-width:0;} + .wearable-legend__dot{width:8px;height:8px;border-radius:2px;box-shadow:0 0 7px currentColor;} + .wearable-legend__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} + .wearable-legend__value{font-weight:700;color:var(--text-main);font-variant-numeric:tabular-nums;white-space:nowrap;} + .sleep-chart{display:flex;flex-direction:column;gap:8px;} + .sleep-chart__summary{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:11px;color:var(--text-sub);} + .sleep-chart__summary b{color:#fff;font-size:13px;} + .sleep-chart__plot{height:118px;display:grid;grid-template-columns:repeat(7,1fr);align-items:end;gap:6px; + padding:8px 0 0;border-bottom:1px solid rgba(24,144,255,0.16);position:relative;} + .sleep-chart__plot::before,.sleep-chart__plot::after{content:'';position:absolute;left:0;right:0;border-top:1px dashed rgba(24,144,255,0.12);} + .sleep-chart__plot::before{top:36px;} + .sleep-chart__plot::after{top:72px;} + .sleep-day{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:4px;position:relative;z-index:1;} + .sleep-day__bars{height:88px;display:flex;align-items:flex-end;gap:3px;} + .sleep-day__bar{width:8px;border-radius:5px 5px 2px 2px;min-height:8px;box-shadow:0 0 8px currentColor;} + .sleep-day__bar--deep{background:#13C2C2;color:#13C2C2;} + .sleep-day__bar--light{background:#1890FF;color:#1890FF;} + .sleep-day__label{font-size:10px;color:var(--text-dim);line-height:1;} + .sleep-chart__legend{display:flex;align-items:center;justify-content:center;gap:12px;font-size:10px;color:var(--text-sub);} + .sleep-chart__legend span{display:flex;align-items:center;gap:5px;} + .sleep-chart__dot{width:8px;height:8px;border-radius:2px;box-shadow:0 0 7px currentColor;} /* ========== 右侧:应急求助事件 ========== */ .event-item{display:flex;gap:10px;padding:8px 0;border-bottom:1px solid rgba(24,144,255,0.08);} @@ -310,24 +510,63 @@ .event-item__desc{font-size:11px;color:var(--text-sub);margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .event-item__loc{font-size:10px;color:var(--text-dim);margin-top:2px;} - /* ========== 右侧:应急求助重点人员 ========== */ - .help-person-list{display:flex;flex-direction:column;} - .help-person-item{display:flex;align-items:center;padding:8px 0;border-bottom:1px solid rgba(24,144,255,0.08);gap:6px;} - .help-person-item:last-child{border-bottom:none;} - .help-person-item__name{font-size:12px;color:var(--text-main);font-weight:600;flex-shrink:0;} - .help-person-item__dept{font-size:10px;color:var(--text-dim);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} - .help-person-item__count{font-size:11px;color:var(--text-sub);flex-shrink:0;} - .help-person-item__count b{font-weight:700;color:var(--primary);} + /* ========== 左下:人员现状监测(环形图) ========== */ + .panel--health-monitor .panel__body{padding:6px 8px 8px;overflow:hidden;} + .health-monitor{display:flex;align-items:center;justify-content:center;gap:6px;padding:0;} + .health-monitor__chart{position:relative;width:208px;height:208px;flex-shrink:0;} + .health-monitor__chart svg{width:100%;height:100%;display:block;overflow:visible;} + .health-monitor__chart .hm-ring{fill:none;stroke-width:16;} + .health-monitor__chart .hm-ring--bg{stroke:rgba(24,144,255,0.08);} + .health-monitor__chart .hm-ring--seg{transition:stroke-dasharray .8s ease,stroke-dashoffset .8s ease;} + .health-monitor__chart .hm-label-line{fill:none;stroke-width:1;opacity:.72;stroke-linecap:round;stroke-linejoin:round;} + .health-monitor__chart .hm-value-label{font-size:11px;font-weight:700;font-variant-numeric:tabular-nums; + paint-order:stroke;stroke:#071224;stroke-width:4px;stroke-linejoin:round;} + .health-monitor__center{position:absolute;inset:0;display:flex;flex-direction:column; + align-items:center;justify-content:center;pointer-events:none;text-align:center;} + .health-monitor__center-label{font-size:10px;color:var(--text-sub);letter-spacing:1.5px;} + .health-monitor__center-num{font-size:26px;font-weight:700;color:#fff;line-height:1.05;margin-top:2px; + text-shadow:0 0 10px rgba(24,144,255,0.5);font-variant-numeric:tabular-nums;letter-spacing:0.5px;} + .health-monitor__center-unit{font-size:10px;color:var(--text-dim);margin-top:2px;letter-spacing:1px;} + .health-monitor__legend{width:72px;display:flex;flex-direction:column;gap:6px;min-width:0;flex-shrink:0;} + .health-monitor__legend-item{display:flex;align-items:center;gap:5px;font-size:10px;min-width:0;line-height:1.1;} + .health-monitor__legend-dot{width:7px;height:7px;border-radius:2px;flex-shrink:0; + box-shadow:0 0 6px currentColor;} + .health-monitor__legend-name{color:var(--text-sub);white-space:nowrap;overflow:hidden; + text-overflow:ellipsis;font-size:10px;} + .health-monitor__legend-value{color:var(--text-main);font-weight:600;font-variant-numeric:tabular-nums;} + .health-monitor__legend-pct{color:var(--text-dim);font-size:10px;margin-left:3px;min-width:34px;text-align:right;} - /* ========== 心脑血管AI预警 ========== */ - .ai-warn-list{height:180px;overflow:hidden;position:relative;} - .ai-warn-list__track{animation:aiScroll 22s linear infinite;} - .ai-warn-list__track:hover{animation-play-state:paused;} - @keyframes aiScroll{0%{transform:translateY(0);}100%{transform:translateY(-50%);}} - .ai-warn-item{padding:8px 0;border-bottom:1px solid rgba(24,144,255,0.06);cursor:pointer;transition:background .2s;} - .ai-warn-item:hover{background:rgba(114,46,209,0.06);} - .ai-warn-item:last-child{border-bottom:none;} - .ai-warn-item__header{display:flex;align-items:center;gap:6px;margin-bottom:3px;} + /* ========== AI智能预警分析 ========== */ + .panel--ai-analysis .panel__body{padding:8px 10px 10px;overflow:hidden;} + .ai-analysis{display:flex;flex-direction:column;gap:7px;} + .ai-analysis__summary{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;} + .ai-analysis__metric{min-width:0;padding:6px 7px;border:1px solid rgba(24,144,255,0.14); + border-radius:6px;background:rgba(24,144,255,0.06);display:flex;flex-direction:column;gap:2px;} + .ai-analysis__metric--danger{background:rgba(255,77,79,0.08);border-color:rgba(255,77,79,0.18);} + .ai-analysis__metric--warning{background:rgba(250,173,20,0.08);border-color:rgba(250,173,20,0.18);} + .ai-analysis__metric-num{font-size:18px;font-weight:700;color:#fff;line-height:1;font-variant-numeric:tabular-nums;} + .ai-analysis__metric--danger .ai-analysis__metric-num{color:var(--danger);text-shadow:0 0 8px rgba(255,77,79,0.28);} + .ai-analysis__metric--warning .ai-analysis__metric-num{color:var(--warning);text-shadow:0 0 8px rgba(250,173,20,0.25);} + .ai-analysis__metric-label{font-size:10px;color:var(--text-sub);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} + .ai-analysis__metric-trend{font-size:10px;color:var(--danger);font-weight:600;white-space:nowrap;} + .ai-analysis__section-head{display:flex;align-items:center;justify-content:space-between;gap:8px; + font-size:10px;color:var(--text-sub);line-height:1;} + .ai-analysis__section-head b{font-size:11px;color:var(--text-main);font-weight:600;} + .ai-risk-chart{height:104px;display:grid;grid-template-columns:repeat(4,1fr);gap:7px; + padding:3px 0 0;border-bottom:1px solid rgba(24,144,255,0.10);} + .ai-risk-col{min-width:0;display:flex;flex-direction:column;align-items:center;gap:4px;} + .ai-risk-stack{height:72px;width:32px;display:flex;flex-direction:column;justify-content:flex-end; + border-radius:5px 5px 3px 3px;overflow:hidden;background:rgba(24,144,255,0.06); + box-shadow:inset 0 0 0 1px rgba(24,144,255,0.12);} + .ai-risk-stack__seg{width:100%;min-height:4px;box-shadow:0 0 8px currentColor;} + .ai-risk-stack__seg--high{background:linear-gradient(180deg,#ff7875,var(--danger));color:var(--danger);} + .ai-risk-stack__seg--mid{background:linear-gradient(180deg,#ffc53d,var(--warning));color:var(--warning);} + .ai-risk-stack__seg--low{background:linear-gradient(180deg,#40a9ff,var(--primary));color:var(--primary);} + .ai-risk-col__name{font-size:10px;color:var(--text-sub);white-space:nowrap;} + .ai-risk-col__count{font-size:11px;color:#fff;font-weight:700;font-variant-numeric:tabular-nums;} + .ai-analysis__legend{display:flex;align-items:center;justify-content:center;gap:10px;font-size:10px;color:var(--text-sub);} + .ai-analysis__legend span{display:flex;align-items:center;gap:4px;white-space:nowrap;} + .ai-analysis__legend i{width:7px;height:7px;border-radius:2px;display:inline-block;box-shadow:0 0 6px currentColor;} .ai-warn-item__tag{font-size:10px;padding:1px 8px;border-radius:3px;font-weight:600;flex-shrink:0;} .ai-warn-item__tag--mi{background:rgba(255,77,79,0.15);color:var(--danger);border:1px solid rgba(255,77,79,0.25);} .ai-warn-item__tag--ci{background:rgba(114,46,209,0.15);color:#b37feb;border:1px solid rgba(114,46,209,0.25);} @@ -337,9 +576,6 @@ .ai-warn-item__level--high{background:rgba(255,77,79,0.1);color:var(--danger);} .ai-warn-item__level--mid{background:rgba(250,173,20,0.1);color:var(--warning);} .ai-warn-item__level--low{background:rgba(24,144,255,0.1);color:var(--primary);} - .ai-warn-item__score{font-size:11px;font-weight:700;color:var(--text-main);margin-left:auto;font-variant-numeric:tabular-nums;} - .ai-warn-item__desc{font-size:11px;color:var(--text-sub);} - .ai-warn-item__reason{font-size:10px;color:var(--text-dim);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} /* ========== 弹窗 ========== */ .modal-overlay{position:fixed;inset:0;z-index:100;background:rgba(0,0,0,0.25); @@ -378,6 +614,52 @@ .modal__section-title{font-size:12px;font-weight:600;color:var(--primary);margin-bottom:10px; padding-left:10px;border-left:3px solid var(--primary);letter-spacing:0.5px;} + /* ========== 视频通话选择弹窗 ========== */ + /* [交互] 点击地图右下角"视频通话"按钮后弹出,选择需要加入通话的应急中心(可多选) */ + .vc-modal{width:560px;} + .vc-modal .modal__body{padding:16px 18px 18px;} + .vc-hint{font-size:12px;color:var(--text-sub);margin-bottom:12px;line-height:1.6;} + .vc-hint b{color:var(--primary);font-weight:600;} + .vc-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;} + .vc-card{position:relative;display:flex;flex-direction:column;gap:6px;padding:12px 14px; + background:linear-gradient(135deg,rgba(24,144,255,0.06),rgba(10,30,60,0.55)); + border:1px solid var(--panel-border);border-radius:8px;cursor:pointer;transition:all .2s; + min-height:78px;} + .vc-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;border-radius:8px 0 0 8px; + background:rgba(74,107,138,0.45);transition:all .2s;} + .vc-card:hover{border-color:rgba(24,144,255,0.45); + box-shadow:0 0 12px rgba(24,144,255,0.18);transform:translateY(-1px);} + .vc-card--selected{border-color:rgba(24,144,255,0.65); + background:linear-gradient(135deg,rgba(24,144,255,0.18),rgba(10,30,60,0.55)); + box-shadow:0 0 14px rgba(24,144,255,0.25);} + .vc-card--selected::before{background:var(--primary);box-shadow:0 0 8px rgba(24,144,255,0.5);} + .vc-card--offline{opacity:0.55;cursor:not-allowed;} + .vc-card--offline:hover{transform:none;box-shadow:none;border-color:var(--panel-border);} + .vc-card__row{display:flex;align-items:center;justify-content:space-between;gap:8px;} + .vc-card__name{font-size:13px;font-weight:600;color:var(--text-main);letter-spacing:0.3px;} + .vc-card__status{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text-sub); + padding:2px 8px;border-radius:10px;background:rgba(74,107,138,0.18);white-space:nowrap;} + .vc-card__status--online{color:var(--success);background:rgba(82,196,26,0.14);} + .vc-card__status--busy{color:var(--warning);background:rgba(250,173,20,0.14);} + .vc-card__status--offline{color:var(--text-dim);background:rgba(74,107,138,0.22);} + .vc-card__dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;} + .vc-card__dot--online{background:var(--success);box-shadow:0 0 6px var(--success);} + .vc-card__dot--busy{background:var(--warning);box-shadow:0 0 6px var(--warning);} + .vc-card__dot--offline{background:var(--text-dim);} + .vc-card__meta{font-size:11px;color:var(--text-dim);display:flex;align-items:center;gap:10px;} + .vc-card__meta b{color:var(--text-sub);font-weight:600;} + /* 选中态右上角对勾角标 */ + .vc-card__check{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%; + background:var(--primary);display:none;align-items:center;justify-content:center; + box-shadow:0 0 8px rgba(24,144,255,0.5);} + .vc-card--selected .vc-card__check{display:flex;} + .vc-card__check svg{width:11px;height:11px;color:#fff;} + /* 离线卡片右上角禁用角标 */ + .vc-card__lock{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%; + background:rgba(74,107,138,0.35);display:none;align-items:center;justify-content:center;} + .vc-card--offline .vc-card__lock{display:flex;} + .vc-card__lock svg{width:11px;height:11px;color:var(--text-dim);} + /* ========== 急救路线:员工标记 ========== */ .emp-marker{position:absolute;transform:translate(-50%,-100%);z-index:10;display:none;animation:empBounce 1s ease-in-out infinite;} .emp-marker--show{display:block;} @@ -418,7 +700,7 @@ .map-marker--route .map-marker__pulse{animation-duration:1s !important;} /* ========== 急救路线:右侧资源面板 ========== */ - .route-panel{position:absolute;top:12px;right:12px;z-index:15;width:220px;display:none; + .route-panel{position:absolute;top:64px;right:12px;z-index:15;width:220px;display:none; background:rgba(10,25,55,0.95);border:1px solid var(--panel-border);border-radius:10px; padding:14px;flex-direction:column;gap:10px;backdrop-filter:blur(6px);} .route-panel--show{display:flex;} @@ -565,6 +847,28 @@ .marker-popup__cat span{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;vertical-align:middle;} .marker-popup__label{font-size:10px;color:var(--text-dim);margin-bottom:2px;letter-spacing:0.5px;} .marker-popup__addr{font-size:11px;color:var(--text-sub);line-height:1.5;} + /* 联系电话行:等宽字 + 复制提示色 */ + .marker-popup__phone{font-size:12px;color:var(--cyan);font-weight:600;line-height:1.4; + font-variant-numeric:tabular-nums;letter-spacing:0.3px;} + /* 下发急救通知按钮:默认隐藏,仅 route 模式显示 */ + .marker-popup__dispatch{display:none;margin-top:10px;width:100%;height:28px;border-radius:6px; + border:1px solid rgba(255,77,79,0.55);cursor:pointer;transition:all .2s;align-items:center;justify-content:center;gap:5px; + font-size:12px;font-weight:600;color:#fff;white-space:nowrap; + background:linear-gradient(90deg,rgba(255,77,79,0.32),rgba(255,77,79,0.18));} + .marker-popup__dispatch svg{width:13px;height:13px;} + .marker-popup__dispatch:hover{background:linear-gradient(90deg,rgba(255,77,79,0.5),rgba(255,77,79,0.3)); + box-shadow:0 0 12px rgba(255,77,79,0.35);} + .marker-popup__dispatch--show{display:flex;} + + /* ========== 全局 Toast 提示 ========== */ + .toast{position:fixed;top:80px;left:50%;transform:translateX(-50%) translateY(-12px);z-index:9999; + display:flex;align-items:center;gap:8px;padding:10px 18px;border-radius:8px;font-size:13px;color:#fff; + background:rgba(10,25,55,0.95);border:1px solid var(--primary);box-shadow:0 6px 24px rgba(0,0,0,0.45),0 0 16px rgba(24,144,255,0.25); + opacity:0;pointer-events:none;transition:opacity .25s ease,transform .25s ease;backdrop-filter:blur(8px);} + .toast--show{opacity:1;transform:translateX(-50%) translateY(0);} + .toast__dot{width:8px;height:8px;border-radius:50%;background:var(--success);box-shadow:0 0 8px var(--success);} + .toast--danger{border-color:var(--danger);box-shadow:0 6px 24px rgba(0,0,0,0.45),0 0 16px rgba(255,77,79,0.28);} + .toast--danger .toast__dot{background:var(--danger);box-shadow:0 0 8px var(--danger);} /* ========== 地图右下角:接听状态控制面板 ========== */ .map-ctrl{position:absolute;bottom:12px;right:12px;z-index:12; @@ -595,14 +899,23 @@ box-shadow:0 0 12px rgba(24,144,255,0.2);} .map-ctrl__btn svg{width:16px;height:16px;flex-shrink:0;} - /* ========== 地图右下角:图层切换 ========== */ - .map-layer{position:absolute;bottom:12px;right:178px;z-index:12; + /* ========== 地图右上角:图层切换 ========== */ + .map-layer{position:absolute;top:12px;right:12px;z-index:12; + display:flex;flex-direction:column;align-items:flex-end;gap:8px;} + .map-layer__trigger{width:34px;height:34px;display:flex;align-items:center;justify-content:center; background:rgba(10,22,48,0.88);border:1px solid var(--panel-border);border-radius:8px; - padding:8px 10px;display:flex;flex-direction:column;gap:2px; - backdrop-filter:blur(6px);} - .map-layer::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; + color:var(--primary);cursor:pointer;transition:all .2s;backdrop-filter:blur(6px); + box-shadow:0 4px 14px rgba(0,0,0,0.35);} + .map-layer__trigger:hover,.map-layer--open .map-layer__trigger{background:rgba(24,144,255,0.16); + border-color:rgba(24,144,255,0.45);box-shadow:0 0 12px rgba(24,144,255,0.2);} + .map-layer__trigger svg{width:17px;height:17px;} + .map-layer__panel{position:relative;display:none;flex-direction:column;gap:2px;min-width:88px; + background:rgba(10,22,48,0.92);border:1px solid var(--panel-border);border-radius:8px; + padding:8px 10px;backdrop-filter:blur(6px);box-shadow:0 8px 22px rgba(0,0,0,0.45);} + .map-layer--open .map-layer__panel{display:flex;} + .map-layer__panel::before{content:'';position:absolute;top:0;left:0;width:10px;height:10px; border-top:1.5px solid rgba(24,144,255,0.35);border-left:1.5px solid rgba(24,144,255,0.35);border-radius:8px 0 0 0;pointer-events:none;} - .map-layer::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; + .map-layer__panel::after{content:'';position:absolute;bottom:0;right:0;width:10px;height:10px; border-bottom:1.5px solid rgba(24,144,255,0.35);border-right:1.5px solid rgba(24,144,255,0.35);border-radius:0 0 8px 0;pointer-events:none;} .map-layer__item{font-size:11px;color:var(--text-dim);padding:5px 10px;border-radius:4px; cursor:pointer;transition:all .2s;white-space:nowrap;text-align:center;} @@ -617,20 +930,20 @@
+
+
--
-
- -
西安应急中心大屏
- - - + 心血管副屏临时入口 + + +
系统累计运行 0 @@ -644,632 +957,37 @@
- - -
- - -
-
-
-
- 穿戴设备总数 -
-
156
- -
-
-
-
- 今日穿戴报警数 -
-
23
-
▲ 较昨日 +5
-
-
-
-
- 今日应急求助数 -
-
7
-
▼ 待处理 3 条
-
-
-
-
- 平均响应时长 -
-
2.4 分钟
- -
-
- - -
- - -
- -
-
-
-
-
-
- -
兴隆医院
-
高陵医院
-
宝石花医院
-
庆阳医院
-
采油一厂
-
采油二厂
-
采油三厂
- -
CQ大道
-
能源北路
-
兴隆路
- - -
-
- -
兴隆医院
-
-
-
- -
高陵医院
-
-
-
- -
宝石花医院
-
-
-
- -
庆阳医院
-
- -
-
- -
采油一厂医疗点
-
-
-
- -
采油二厂医疗点
-
-
-
- -
采油三厂医疗点
-
- -
-
- -
AED-001
-
-
-
- -
AED-002
-
- -
-
- -
陕A·120-03
-
-
-
- -
陕A·120-01
-
- - - -
-
油田医院(1)
-
合作医院(1)
-
地方医院(2)
-
医疗点(3)
-
救护车(2)
-
AED(2)
-
- - -
-
- - - - - -
-
告警详情
-
-
- 异常类型 - 摔倒 -
-
- 异常值 - -- -
-
- 告警时间 - 2026-06-23 14:32:15 -
-
- 员工姓名 - 张建国 -
-
- 单位部门 - 采油一厂生产区 -
-
- 详细地址 - 采油一厂生产基地B区3号井组作业平台 -
-
-
-
- - -
-
-
-
详细地址
-
-
- - - - - - - - - - - - - - - - - - -
-
距离最近资源
- -
-
-
-
兴隆医院 油田医院
-
2.4 km约8分钟
-
-
-
-
-
-
宝石花医院 合作医院
-
5.2 km约15分钟
-
-
-
-
-
-
庆阳医院 地方医院
-
3.6 km约11分钟
-
-
-
-
-
-
采油一厂医疗点 医疗点
-
0.3 km约1分钟
-
-
-
-
-
-
陕A·120-03 救护车
-
2.2 km约7分钟
-
-
-
-
-
-
AED-001 AED
-
0.5 km约2分钟
-
-
-
- - -
-
- 急救提示书 - × -
-
-
    -
  1. 心率与血氧异常,可能是心梗前期
  2. -
  3. 立即停止活动,平躺减少能量和氧气消耗
  4. -
  5. 如有症状发生请立即拨打120
  6. -
  7. 请准备硝酸甘油准备服用
  8. -
  9. 距离350米处有AED可用,电话15698987876
  10. -
  11. 距离580米处有急救包可用,电话12569869896
  12. -
  13. 距离8.5公里处有救护车,电话1365695668815分钟可赶来
  14. -
  15. 距离8.5公里处有医疗点,电话1569896365615分钟可赶来
  16. -
  17. 距离18公里处有庆城县医院,救护车来回约45分钟,该医院内科李晓涛医生、王开来医生较为专长
  18. -
  19. 距离52公里处有庆阳市医院,救护车来回约75分钟,该医院心梗急救能力强,教授胡忠、副教授李悦、教授徐立专长心梗,徐立是油田专家库签约教授
  20. -
  21. 距离339公里有西京医院、唐都医院、交大一附院、交大二附院等,急救能力强,有油田签约教授,在征得医生意见后,可谨慎考虑前往
  22. -
  23. 距离335公里有油田应急就医服务中心,可咨询就医,可帮助对以上应急医疗资源进行联系、协调,电话02986565199
  24. -
-
-
- - -
- 默认地图 - 卫星地图 - 标准地图 -
- - -
-
- 当前接收状态 - -
- - -
-
-
- - -