feat: 应急就医多端原型优化、大屏管理模块新增及PRD文档截图更新

- 操作人员端:救护车支援toast+800ms跳转、工作台Tab红点徽标
- 员工端:资源地图拖动搜索、单位联系人移除删除按钮、聊天页参与人员移除
- 管理端应急资源:AED地图重构(搜索/缩放/定位/拖动搜索)、布点/急救包新增布放图片、
  培演记录附件改为网格上传、取证人员表单简化、布点列表移除批量导入
- 管理端应急管理:应急中心表单字段调整(上班时间必填/短信发送电话)、
  工单新增from=call模式、大病就医详情已确认状态支持取消预约、
  新增大屏管理二级菜单(大屏数据配置+大屏通话记录)、侧边栏全量同步
- 其他:异常结果定义文案更新、专家推荐文案调整、聊天工具栏移除语音通话按钮
- PRD文档同步更新、全部修改页面截图重新截取

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-09 18:12:16 +08:00
co-authored by Claude Opus 4.6
parent 80ead4d72b
commit fb6821b279
55 changed files with 979 additions and 248 deletions
@@ -187,8 +187,8 @@
</thead>
<tbody>
<tr class="stat-row">
<td>合计</td>
<td>6个单位</td>
<td>统计行</td>
<td>6</td>
<td>10,300</td>
<td>850</td><td>685</td>
<td>355</td><td>315</td>
@@ -129,10 +129,17 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -204,23 +211,10 @@
</div>
<div class="form-row">
<div class="form-label">云坐席电话</div>
<input class="form-input" type="tel" placeholder="029888888881">
<input class="form-input" type="tel" placeholder="例如02988888888"><div style="font-size:var(--font-s);color:var(--text-placeholder);margin-top:8px;"></div><input class="form-input" placeholder="例如1">
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>值班电话</div>
<div class="dynamic-group" id="dutyPhoneGroup">
<div class="dynamic-row">
<input class="form-input" type="tel" placeholder="请输入值班电话" style="min-width:320px;">
<span class="link-danger" onclick="removeDynamicRow(this,'dutyPhoneGroup')" style="cursor:pointer;font-size:var(--font-xs);">删除</span>
</div>
</div>
<button class="btn btn-default btn-sm" onclick="addDutyPhone()" style="margin-left:0;align-self:flex-end;">
<svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
添加值班电话
</button>
</div>
<div class="form-row">
<div class="form-label">上班时间</div>
<div class="form-label"><span class="required">*</span>上班时间</div>
<div class="dynamic-group" id="workTimeGroup">
<div class="dynamic-row">
@@ -237,6 +231,22 @@
添加时段
</button>
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>短信发送电话</div>
<div>
<div class="dynamic-group" id="dutyPhoneGroup">
<div class="dynamic-row">
<input class="form-input" type="tel" placeholder="请输入电话" style="min-width:320px;">
<span class="link-danger" onclick="removeDynamicRow(this,'dutyPhoneGroup')" style="cursor:pointer;font-size:var(--font-xs);">删除</span>
</div>
</div>
<button class="btn btn-default btn-sm" onclick="addDutyPhone()" style="margin-top:8px;">
<svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
添加电话
</button>
<div style="font-size:var(--font-xs);color:var(--text-placeholder);margin-top:8px;">作用于上班时间以外有员工发起应急求助后,发送短信进行提醒</div>
</div>
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>服务范围</div>
<div class="tag-select" id="serviceSelect">
@@ -308,7 +318,7 @@ function addDutyPhone(){
var g=document.getElementById('dutyPhoneGroup');
var row=document.createElement('div');
row.className='dynamic-row';
row.innerHTML='<input class="form-input" type="tel" placeholder="请输入值班电话" style="min-width:320px;"><span class="link-danger" onclick="removeDynamicRow(this,\'dutyPhoneGroup\')" style="cursor:pointer;font-size:var(--font-xs);">删除</span>';
row.innerHTML='<input class="form-input" type="tel" placeholder="请输入短信发送电话" style="min-width:320px;"><span class="link-danger" onclick="removeDynamicRow(this,\'dutyPhoneGroup\')" style="cursor:pointer;font-size:var(--font-xs);">删除</span>';
g.appendChild(row);
}
function addWorkTime(){
@@ -194,10 +194,17 @@ thead th.group-header{background:#F0F5FF;color:var(--primary);text-align:center;
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -126,10 +126,17 @@ tbody tr:hover{background:#F8FBFF;}
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -131,10 +131,17 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item active">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent open" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:block">
<a href="center-data-screen.html" class="sidebar-item active">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -141,10 +141,17 @@ tbody tr:hover{background:#F8FBFF;}
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -137,10 +137,17 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item active">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>应急就医 - 大屏通话记录 | 健康长庆原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
:root{--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;--font-xl:20px;--font-xxl:24px;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--shadow-sm:0 1px 4px rgba(0,0,0,0.08);}
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;width:240px;flex-shrink:0;white-space:nowrap;}
.top-bar__logo svg{width:28px;height:28px;}
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
.top-bar__nav a.active{color:#fff;background:var(--primary);}
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
.btn-back:hover{color:#fff;}
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);}
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;}
.sidebar-group-title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
.sidebar-item{display:flex;align-items:center;gap:10px;padding:12px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .2s;text-decoration:none;}
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
.sidebar-item.active{color:#fff;background:var(--primary);}
.sidebar-item svg{width:16px;height:16px;flex-shrink:0;}
.sidebar-item--parent{justify-content:space-between;}
.sidebar-item--parent .arrow{width:12px;height:12px;transition:transform .2s;}
.sidebar-item--parent.open .arrow{transform:rotate(90deg);}
.sidebar-sub .sidebar-item{padding-left:50px;font-size:var(--font-xs);}
.main{margin-left:240px;margin-top:56px;padding:24px;}
.page-header{margin-bottom:20px;}
.page-header h2{font-size:var(--font-xl);font-weight:600;}
</style>
<style>
.filter-bar{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 20px;margin-bottom:16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
.filter-bar label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
.filter-select{height:34px;padding:0 30px 0 10px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;min-width:160px;}
.filter-select:focus{outline:none;border-color:var(--primary);}
.filter-input{height:34px;padding:0 10px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-sm);width:130px;}
.filter-input:focus{outline:none;border-color:var(--primary);}
.filter-sep{color:var(--text-placeholder);font-size:var(--font-sm);}
.btn{height:34px;padding:0 14px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
.btn-primary{background:var(--primary);color:#fff;}
.btn-primary:hover{background:#40a9ff;}
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}
.btn-default:hover{color:var(--primary);border-color:var(--primary);}
.action-bar{display:flex;align-items:center;gap:10px;margin-bottom:16px;}
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
table{width:100%;border-collapse:collapse;}
th{background:#FAFAFA;font-weight:500;font-size:var(--font-sm);color:var(--text-secondary);text-align:left;padding:12px 16px;border-bottom:1px solid var(--border);}
td{font-size:var(--font-sm);color:var(--text-primary);padding:12px 16px;border-bottom:1px solid var(--border);}
tr:hover td{background:#FAFAFA;}
.pagination{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;}
.pagination__info{font-size:var(--font-sm);color:var(--text-secondary);}
.pagination__right{display:flex;align-items:center;gap:8px;}
.pagination__pages{display:flex;align-items:center;gap:4px;}
.page-btn{min-width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;font-size:var(--font-sm);cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-primary);transition:all .15s;}
.page-btn:hover{color:var(--primary);border-color:var(--primary);}
.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
.page-btn.disabled{color:var(--text-placeholder);cursor:not-allowed;}
.page-size-select{height:32px;padding:0 24px 0 8px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-sm);background:#fff url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 6px center;appearance:none;}
.page-jump{display:flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--text-secondary);}
.page-jump input{width:44px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);text-align:center;font-size:var(--font-sm);}
</style>
</head>
<body>
<!-- 顶部导航栏 -->
<div class="top-bar">
<div class="top-bar__logo">
<svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M14 6v7l5 3" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><circle cx="14" cy="14" r="8" stroke="#fff" stroke-width="2" fill="none"/></svg>
应急就医–管理员
</div>
<nav class="top-bar__nav">
<a href="archive-personal.html">档案</a>
<a href="resource-hospital.html">应急资源</a>
<a href="center-basic-info.html" class="active">应急管理</a>
<a href="exception-result.html">异常事件</a>
</nav>
<div class="top-bar__right">
<a class="btn-back" href="../../../index.html">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 3L5 8l5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
返回首页
</a>
<div class="avatar"></div>
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
</div>
</div>
<!-- 侧边栏 -->
<aside class="sidebar">
<div class="sidebar-group-title">应急管理</div>
<a href="center-basic-info.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="2" width="12" height="12" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h6M5 8h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>
应急中心
</a>
<a href="center-work-order.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="2" width="12" height="12" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 6h6M5 9h4M5 12h2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>
应急工单
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><path d="M4 10V6a4 4 0 018 0v4" stroke="currentColor" stroke-width="1.4"/><rect x="2" y="10" width="12" height="3" rx="1.5" stroke="currentColor" stroke-width="1.4"/></svg>
坐席管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-group.html" class="sidebar-item">分组管理</a>
<a href="center-call-record.html" class="sidebar-item">通话记录</a>
</div>
<a href="center-serious-illness.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<div class="sidebar-item sidebar-item--parent open" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:block">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item active">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
</a>
<a href="center-simulation.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><path d="M8 2L1 14h14L8 2z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M8 7v3M8 12v.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
模拟急救联动
</a>
</aside>
<!-- 主内容区 -->
<div class="main">
<div class="page-header"><h2>大屏通话记录</h2></div>
<!-- 筛选栏 -->
<div class="filter-bar">
<label>发起者</label>
<select class="filter-select">
<option value="">请选择发起者</option>
<option>西安应急中心</option>
<option>庆阳应急就医服务中心</option>
</select>
<label>发起日期</label>
<input type="text" class="filter-input" placeholder="开始日期">
<span class="filter-sep"></span>
<input type="text" class="filter-input" placeholder="结束日期">
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
</div>
<!-- 操作栏 -->
<div class="action-bar">
<button class="btn btn-default">导出列表数据</button>
<button class="btn btn-default">查看导出任务</button>
</div>
<!-- 表格 -->
<div class="table-card">
<table>
<thead>
<tr>
<th style="width:60px;">序号</th>
<th>发起者</th>
<th>发起时间</th>
<th>结束时间</th>
<th style="width:130px;">通话时长(分钟)</th>
<th>已参与</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>西安应急中心</td><td>2026-05-09 09:15:32</td><td>2026-05-09 09:28:47</td><td>13</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
<tr><td>2</td><td>庆阳应急就医服务中心</td><td>2026-05-09 08:42:10</td><td>2026-05-09 08:55:03</td><td>13</td><td>参与(2): 庆阳应急就医服务中心,西安应急中心</td></tr>
<tr><td>3</td><td>西安应急中心</td><td>2026-05-08 16:30:22</td><td>2026-05-08 16:45:18</td><td>15</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
<tr><td>4</td><td>庆阳应急就医服务中心</td><td>2026-05-08 14:12:05</td><td>2026-05-08 14:20:33</td><td>8</td><td>参与(2): 庆阳应急就医服务中心,西安应急中心</td></tr>
<tr><td>5</td><td>西安应急中心</td><td>2026-05-08 10:05:41</td><td>2026-05-08 10:18:29</td><td>13</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
<tr><td>6</td><td>庆阳应急就医服务中心</td><td>2026-05-07 15:48:19</td><td>2026-05-07 16:02:07</td><td>14</td><td>参与(2): 庆阳应急就医服务中心,西安应急中心</td></tr>
<tr><td>7</td><td>西安应急中心</td><td>2026-05-07 11:22:55</td><td>2026-05-07 11:35:40</td><td>13</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
<tr><td>8</td><td>西安应急中心</td><td>2026-05-07 09:08:12</td><td>2026-05-07 09:19:45</td><td>11</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
<tr><td>9</td><td>庆阳应急就医服务中心</td><td>2026-05-06 16:55:30</td><td>2026-05-06 17:10:22</td><td>15</td><td>参与(2): 庆阳应急就医服务中心,西安应急中心</td></tr>
<tr><td>10</td><td>西安应急中心</td><td>2026-05-06 13:40:08</td><td>2026-05-06 13:52:16</td><td>12</td><td>参与(2): 西安应急中心,庆阳应急就医服务中心</td></tr>
</tbody>
</table>
<!-- 分页 -->
<div class="pagination">
<div class="pagination__info">共 36 条数据</div>
<div class="pagination__right">
<div class="pagination__pages">
<button class="page-btn disabled">&lt;</button>
<button class="page-btn active">1</button>
<button class="page-btn">2</button>
<button class="page-btn">3</button>
<button class="page-btn">4</button>
<button class="page-btn">&gt;</button>
</div>
<select class="page-size-select"><option>10条/页</option><option>20条/页</option><option>50条/页</option></select>
<div class="page-jump">跳至 <input type="text" value="1"></div>
</div>
</div>
</div>
</div>
</body>
</html>
@@ -150,10 +150,17 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -239,6 +246,10 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<button class="btn btn--danger" onclick="openRejectModal()">取消预约</button>
<button class="btn btn--primary" onclick="openDispatchModal()">立即派单</button>
</div>
<!-- 已确认-操作人员取消按钮 -->
<div class="action-bar" id="confirmedCancelAction" style="display:none;">
<button class="btn btn--danger" onclick="openCancelConfirmedModal()">取消预约</button>
</div>
</div>
</div>
@@ -284,6 +295,72 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
</div>
</div>
<!-- 已确认状态-取消预约弹窗 -->
<div class="modal-mask" id="cancelConfirmedModal" onclick="if(event.target===this)closeCancelConfirmedModal()">
<div class="modal-box" style="width:480px;">
<div class="modal-header"><span class="modal-title">取消预约</span><button class="modal-close" onclick="closeCancelConfirmedModal()"></button></div>
<div class="modal-body">
<div class="field">
<div class="field__label">取消原因<span class="req">*</span></div>
<textarea class="field__textarea" id="cancelConfirmedReason" placeholder="请输入取消原因..."></textarea>
</div>
</div>
<div class="modal-footer">
<button class="btn" onclick="closeCancelConfirmedModal()">返回</button>
<button class="btn btn--primary" onclick="submitCancelConfirmed()">确认取消</button>
</div>
</div>
</div>
<script>
(function(){
var params=new URLSearchParams(window.location.search);
var role=params.get('role');
var status=params.get('status')||'completed';
/* 已确认+操作人员:显示取消预约按钮 */
if(status==='confirmed'&&role==='operator'){
document.getElementById('confirmedCancelAction').style.display='';
}
})();
function openCancelConfirmedModal(){
document.getElementById('cancelConfirmedModal').classList.add('open');
document.body.style.overflow='hidden';
document.getElementById('cancelConfirmedReason').value='';
}
function closeCancelConfirmedModal(){
document.getElementById('cancelConfirmedModal').classList.remove('open');
document.body.style.overflow='';
}
function submitCancelConfirmed(){
var reason=document.getElementById('cancelConfirmedReason').value.trim();
if(!reason){
var ta=document.getElementById('cancelConfirmedReason');
ta.style.borderColor='var(--danger)';ta.focus();return;
}
/* 切换为已取消状态 */
var st=document.getElementById('statusText');
st.textContent='已取消';
st.className='info-cell__value status status--cancelled';
/* 隐藏已确认内容 */
var groups=document.querySelectorAll('[data-group]');
for(var i=0;i<groups.length;i++){
var g=groups[i].getAttribute('data-group');
if(g==='all') continue;
groups[i].style.display=g.split(' ').indexOf('cancelled')>=0?'':'none';
}
/* 更新取消信息 */
var cancelledRows=document.querySelectorAll('[data-group="cancelled"]');
if(cancelledRows.length){
var cells=cancelledRows[0].querySelectorAll('.info-cell__value');
if(cells[0]) cells[0].textContent='操作人员取消';
if(cells[1]) cells[1].textContent=reason;
}
/* 隐藏取消按钮 */
document.getElementById('confirmedCancelAction').style.display='none';
closeCancelConfirmedModal();
}
</script>
<script>
(function(){
var params=new URLSearchParams(window.location.search);
@@ -180,10 +180,17 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -185,10 +185,17 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -149,8 +149,16 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<div class="form-group">
<label class="form-label"><span class="required">*</span>求助时间:</label>
<div class="form-control-wrap" style="display:flex;gap:8px;">
<input class="form-input" type="date" style="flex:1;">
<input class="form-input" type="time" style="flex:1;">
<input class="form-input" type="date" id="helpDate" style="flex:1;">
<input class="form-input" type="time" id="helpTime" style="flex:1;">
</div>
</div>
</div>
<div class="form-row" id="row-center-select" style="display:none;">
<div class="form-group">
<label class="form-label"><span class="required">*</span>应急中心:</label>
<div class="form-control-wrap">
<select class="form-select" id="centerSelect"><option value="">请选择应急中心</option><option>西安应急中心</option><option>庆阳应急中心</option><option>银川应急中心</option><option>延安应急中心</option></select>
</div>
</div>
</div>
@@ -164,7 +172,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
<div class="form-row">
<div class="form-group">
<label class="form-label">专业人员:</label>
<label class="form-label" id="labelExpert">专业人员:</label>
<div class="form-control-wrap">
<select class="form-select"><option value="">请选择</option><option>李医生</option><option>陈医生</option><option>赵医生</option></select>
</div>
@@ -204,7 +212,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<div class="photo-item"><svg viewBox="0 0 24 24" fill="none"><rect x="3" y="3" width="18" height="18" rx="2" stroke="currentColor" stroke-width="1.5"/><circle cx="8.5" cy="8.5" r="2" stroke="currentColor" stroke-width="1.2"/><path d="M3 16l5-4 3 3 4-5 6 7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg><div class="photo-label">图片</div></div>
<div class="photo-item"><svg viewBox="0 0 24 24" fill="none"><rect x="3" y="3" width="18" height="18" rx="2" stroke="currentColor" stroke-width="1.5"/><circle cx="8.5" cy="8.5" r="2" stroke="currentColor" stroke-width="1.2"/><path d="M3 16l5-4 3 3 4-5 6 7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg><div class="photo-label">图片</div></div>
</div>
<div class="photo-count">2/6</div>
<div class="photo-count">2/9</div>
</div>
</div>
</div>
@@ -228,7 +236,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<!-- 派单信息 -->
<div class="form-section">
<div class="form-section__title">派单信息</div>
<div class="form-row">
<div class="form-row" id="row-dispatch-time">
<div class="form-group">
<label class="form-label">派单时间:</label>
<div class="form-control-wrap" style="display:flex;gap:8px;">
@@ -458,13 +466,27 @@ document.addEventListener('click',function(e){
if(from==='call'){
/* 通话记录入口:应急电话工单 */
var readonlyItems=document.querySelectorAll('.form-readonly__item');
if(readonlyItems.length){readonlyItems[0].querySelector('.form-readonly__value').textContent='应急电话工单';}
if(readonlyItems.length){
readonlyItems[0].querySelector('.form-readonly__value').textContent='应急电话工单';
/* 去掉应急中心只读文字 */
if(readonlyItems[1]) readonlyItems[1].style.display='none';
}
document.getElementById('helpTypeText').textContent='应急电话';
/* 显示应急中心选择框 */
document.getElementById('row-center-select').style.display='';
/* 专业人员改为必填 */
document.getElementById('labelExpert').innerHTML='<span class="required">*</span>专业人员:';
/* 求助时间赋值为通话记录的拨打时间 */
var callDate=params.get('date')||'2026-04-24';
var callTime=params.get('time')||'14:30';
document.getElementById('helpDate').value=callDate;
document.getElementById('helpTime').value=callTime;
/* 隐藏不需要的字段 */
document.getElementById('row-advice').style.display='none';
document.getElementById('row-finish-time').style.display='none';
document.getElementById('row-end-time').style.display='none';
document.getElementById('row-station-note').style.display='none';
document.getElementById('row-dispatch-time').style.display='none';
/* 回填员工信息 */
var name=params.get('name')||'';
var code=params.get('code')||'';
@@ -210,10 +210,17 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
@@ -118,10 +118,17 @@ tbody tr:hover{background:#F8FBFF;}
<svg viewBox="0 0 16 16" fill="none"><path d="M8 1v14M1 8h14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.4"/></svg>
大病就医
</a>
<a href="center-data-screen.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏数据配置
</a>
<div class="sidebar-item sidebar-item--parent" onclick="this.classList.toggle('open');this.nextElementSibling.style.display=this.classList.contains('open')?'block':'none'">
<span style="display:flex;align-items:center;gap:10px;">
<svg viewBox="0 0 16 16" fill="none" style="width:16px;height:16px;flex-shrink:0;"><rect x="1" y="2" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M5 14h6M8 12v2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
大屏管理
</span>
<svg class="arrow" viewBox="0 0 12 12" fill="none"><path d="M4.5 2l4 4-4 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="sidebar-sub" style="display:none">
<a href="center-data-screen.html" class="sidebar-item">大屏数据配置</a>
<a href="center-screen-call-record.html" class="sidebar-item">大屏通话记录</a>
</div>
<a href="center-schedule.html" class="sidebar-item">
<svg viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.4"/><path d="M2 7h12M5 1v4M11 1v4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
排班配置
+60 -31
View File
@@ -35,7 +35,9 @@
│ ├── 坐席管理 ⇄ 新增/编辑坐席弹窗
│ ├── 通话记录
│ ├── 大病就医 → 新增大病就医 / 大病就医详情
│ ├── 数据大屏
│ ├── 大屏管理
│ │ ├── 大屏数据配置
│ │ └── 大屏通话记录
│ ├── 排班管理
│ └── 模拟急救
└── 异常事件
@@ -50,7 +52,7 @@ stateDiagram-v2
[*] --> 待处理 : 员工发起求助
待处理 --> 进行中 : 操作人员接单
进行中 --> 已完成 : 工单结束
进行中 --> 已取消 : 取消工单
```
### 大病就医状态流转
@@ -58,9 +60,9 @@ stateDiagram-v2
stateDiagram-v2
[*] --> 待确认 : 员工发起预约
待确认 --> 已确认 : 操作人员审核通过并派单
待确认 --> 已取消 : 操作人员取消
待确认 --> 已取消 : 操作人员/员工取消
已确认 --> 已完成 : 驻场人员完成就医挂号
已确认 --> 已取消 : 取消预约
已确认 --> 已取消 : 操作人员/员工取消预约
```
## 页面清单
@@ -120,16 +122,17 @@ stateDiagram-v2
| 39 | 大病就医 | 大病就医列表 | center-serious-illness.html | 页面 |
| 40 | | 新增大病就医 | center-serious-illness-add.html | 页面 |
| 41 | | 大病就医详情 | center-serious-illness-detail.html | 页面 |
| 42 | 数据大屏 | 数据大屏配置 | center-data-screen.html | 页面 |
| 43 | 排班管理 | 排班管理 | center-schedule.html | 页面 |
| 44 | 模拟急救 | 模拟急救 | center-simulation.html | 页面 |
| 42 | 大屏管理 > 大屏数据配置 | 数据大屏配置 | center-data-screen.html | 页面 |
| 43 | 大屏管理 > 大屏通话记录 | 大屏通话记录列表 | center-screen-call-record.html | 页面 |
| 44 | 排班管理 | 排班管理 | center-schedule.html | 页面 |
| 45 | 模拟急救 | 模拟急救 | center-simulation.html | 页面 |
### 异常事件
| 序号 | 二级菜单 | 页面/弹窗 | 文件 | 类型 |
|------|----------|-----------|------|------|
| 45 | 异常结果 | 异常结果列表 | exception-result.html | 页面 |
| 46 | 异常数据 | 异常数据列表 | exception-dirty.html | 页面 |
| 46 | 异常结果 | 异常结果列表 | exception-result.html | 页面 |
| 47 | 异常数据 | 异常数据列表 | exception-dirty.html | 页面 |
---
@@ -306,7 +309,7 @@ stateDiagram-v2
**交互说明:**
- 点击"新增医院"打开右侧抽屉表单
- 抽屉表单:选择医院(搜索下拉,选择后自动回填等级和地址信息卡片)、医院类型(单选,油田医院/合作医院)、应急专长(文本域)、状态/移动端是否显示(开关)
- 抽屉表单:选择医院(搜索下拉,选择后自动回填等级和地址信息卡片)、医院类型(单选,油田医院/合作医院)、应急专长(文本域)
- 点击"编辑"打开编辑抽屉
- 点击"删除"弹出确认弹窗
- 支持导出列表数据
@@ -318,7 +321,6 @@ stateDiagram-v2
| 选择医院 | 搜索下拉 | 是 | 选取系统管理医院管理下配置的医院 |
| 医院类型 | 单选 | 是 | 油田医院/合作医院 |
| 应急专长 | 多行文本 | 是 | — |
| 状态 | 开关 | 否 | 默认开启,控制移动端是否显示 |
---
### 9. 医疗点信息(resource-medical-point.html
@@ -419,7 +421,7 @@ stateDiagram-v2
**交互说明:**
- 点击"新增布点"跳转新增页面
- 布点位置支持手动在地图上选点,选点完成后可手动补全具体位置信息
- 支持批量导入、导出列表数据、查看导出任务
- 支持导出列表数据、查看导出任务
---
@@ -438,7 +440,7 @@ stateDiagram-v2
| 详细地址 | 文本输入 | 是 | 先回显地图选点的位置信息再补全具体的位置 |
| 责任人 | 文本输入 | 是 | — |
| 责任人电话 | 文本输入 | 是 | 电话格式校验 |
| 布放图片 | 图片上传 | 否 | |
| 布放图片 | 图片上传 | 否 | 最多9张,网格样式展示 |
---
@@ -446,11 +448,15 @@ stateDiagram-v2
![页面截图](screenshots/resource-aed-map.jpg)
**功能说明:** 以地图方式展示所有AED设备的空间分布,支持查看设备状态和位置信息
**功能说明:** 以地图方式展示所有AED设备的空间分布,支持搜索、缩放、定位和拖动搜索
**交互说明:**
- 地图上以标记点展示设备位置
- 上方区域展示设备状态的统计数字
- 默认显示当前位置(未获取到位置以长庆油田公司机关大楼为中心点)附近50公里内的AED资源,如果50公里内没有数据,则查最近距离前10的资源
- 左上角搜索框支持输入地址信息搜索附近AED
- 地图支持加减缩放按钮
- 地图拖动后,顶部显示”在该区域内搜索”按钮,点击后查询该区域内(以地图中心点)50公里内的AED资源
- 地图上显示”我的位置”标记,缩放按钮下方有定位按钮,点击回到我的位置
- 点击具体标点信息卡片展示AED概要信息
---
@@ -482,11 +488,11 @@ stateDiagram-v2
|------|------|------|---------------------------|
| 选择员工 | 搜索框 | 是 | 查询员工信息,回显选中的查询结果 |
| 证书编号 | 文本输入 | 是 | — |
| 证书类型 | 下拉 | 是 | 红十字救护员/AHA急救证书/EFR急救证书/其他 |
| 发证机构 | 下拉 | 是 | 中国红十字会/美国心脏协会(AHA)/其他 |
| 证书名称 | 文本输入 | 是 | 手动输入证书名称 |
| 发证机构 | 文本输入 | 是 | 手动输入发证机构 |
| 取证日期 | 日期选择 | 是 | — |
| 有效期至 | 日期选择 | 是 | 必须晚于取证日期 |
| 证书照片 | 文件上传 | 是 | 证件照 |
| 证书照片 | 图片上传 | 是 | 最多9张,单张不超过5MB |
---
@@ -556,10 +562,10 @@ stateDiagram-v2
| 负责人 | 文本输入 | 是 | — |
| 参加人数 | 数字输入 | 是 | — |
| 活动效果 | 下拉 | 否 | 优/良/中/差 |
| 签到表 | 文件上传 | 否 | |
| 现场照片 | 图片上传 | 否 | |
| 现场视频 | 视频上传 | 否 | |
| 活动资料 | 文件上传 | 否 | |
| 签到表 | 图片上传 | 否 | 网格样式,最多9张 |
| 现场照片 | 图片上传 | 否 | 网格样式,最多9张 |
| 现场视频 | 视频上传 | 否 | 查看模式下未上传显示"未上传" |
| 活动资料 | 文件上传 | 否 | 支持多文件,最多5个 |
---
@@ -660,6 +666,7 @@ stateDiagram-v2
| 急救包编号 | 文本输入 | 是 | — |
| 所属单位 | 下拉 | 是 | 长庆油田总部/第一采油厂/第二采油厂/第三采油厂 |
| 布放地址 | 地图选点 | 是 | — |
| 布放图片 | 图片上传 | 否 | 最多9张,网格样式展示 |
| 布放日期 | 日期选择 | 是 | — |
| 管理部门 | 文本输入 | 是 | — |
| 管理人 | 文本输入 | 是 | — |
@@ -776,9 +783,9 @@ stateDiagram-v2
| 大屏路由 | 基本信息 | 文本输入 | 否 | 应急大屏访问地址 |
| 详细地址 | 基本信息 | 地图选点+文本 | 是 | 含地图选点和文本输入 |
| 中心电话 | 服务信息 | 文本输入 | 是 | 值班室电话 |
| 云坐席电话 | 服务信息 | 文本输入 | 否 | 应急中心转接的云坐席呼入 |
| 值班电话 | 服务信息 | 动态行文本 | 是 | 至少配置一个,支持增删 |
| 上班时间 | 服务信息 | 动态时段 | 否 | 起止时间格式校验 |
| 云坐席电话 | 服务信息 | 文本输入 | 否 | 两个输入框中间用"转"分隔,应急中心转接的云坐席呼入 |
| 上班时间 | 服务信息 | 动态时段 | 是 | 起止时间格式校验 |
| 短信发送电话 | 服务信息 | 文本输入 | 否 | 位于上班时间下方,提示:作用于上班时间以外有员工发起应急求助后,发送短信进行提醒 |
| 服务范围 | 服务信息 | 穿梭框多选 | 是 | 从可选单位列表中选择,各中心覆盖的服务范围不能出现重复 |
| 负责人 | 服务信息 | 文本输入 | 否 | — |
| 负责电话 | 服务信息 | 文本输入 | 否 | 电话格式校验 |
@@ -869,7 +876,7 @@ stateDiagram-v2
**交互说明:**
- 点击"查看应急工单"跳转工单详情
- 点击"新建应急工单"跳转新增工单页面(`center-work-order-add.html?from=call`),自动回填员工信息和求助方式(应急电话),同时隐藏"完成时间"、"救助意见"、"结束时间"、"驻场说明"四个表单字段
- 点击"新建应急工单"跳转新增工单页面(`center-work-order-add.html?from=call`),自动回填员工信息和求助方式(应急电话),同时隐藏"完成时间"、"救助意见"、"结束时间"、"驻场说明"四个表单字段。from=call 模式下额外变化:隐藏顶部应急中心只读文字,新增应急中心选择框(位于操作人员上方),求助时间自动填充通话记录的拨打时间,专业人员改为必填,隐藏派单时间
- 未知员工行(员工姓名/编号/单位部门显示为占位符"未知"/"—"):操作列仅显示"补充信息"链接,点击后弹出补充员工信息弹窗;确认选择后该行员工信息回填,"补充信息"链接隐藏,显示"新建应急工单"链接
- 支持导出列表数据、查看导出任务
@@ -930,6 +937,7 @@ stateDiagram-v2
**业务规则:**
- 操作人员视角下待确认状态下显示"驳回"和"立即派单"按钮,管理员无此权限
- 操作人员视角下已确认状态下显示"取消预约"按钮
- 已确认状态下显示驻场人员信息
- 已完成状态下显示完整流程记录
- 已取消显示取消原因和取消操作人信息
@@ -938,6 +946,7 @@ stateDiagram-v2
**交互说明:**
- 点击"驳回"弹出驳回弹窗,需填写驳回原因(必填)
- 点击"立即派单"弹出派单弹窗,选择驻场人员并填写派单说明
- 点击"取消预约"弹出取消预约弹窗,需填写取消原因(必填),确认后页面切换为已取消状态
- 操作完成后页面刷新为对应结果态
- 面包屑返回大病就医列表
@@ -963,7 +972,27 @@ stateDiagram-v2
---
### 42. 排班管理center-schedule.html
### 42. 大屏通话记录center-screen-call-record.html
![页面截图](screenshots/center-screen-call-record.jpg)
**功能说明:** 查看应急大屏视频通话的历史记录,包括发起者、通话时长和参与方信息。
**筛选条件:** 发起者(下拉,请选择发起者/西安应急中心/庆阳应急就医服务中心)、发起日期(日期范围选择器,开始日期→结束日期)
**表格列:** 序号、发起者、发起时间、结束时间、通话时长(分钟)、已参与
**业务规则:**
- "已参与"列格式为"参与(N): 中心A,中心B",展示本次通话的所有参与方
- 数据按发起时间倒序排列
**交互说明:**
- 支持导出列表数据、查看导出记录
- 分页支持 10/20/50 条每页切换
---
### 43. 排班管理(center-schedule.html
![页面截图](screenshots/center-schedule.jpg)
@@ -984,7 +1013,7 @@ stateDiagram-v2
---
### 43. 模拟急救(center-simulation.html
### 44. 模拟急救(center-simulation.html
![页面截图](screenshots/center-simulation.jpg)
![页面截图](screenshots/center-simulation-deploy.jpg)
@@ -1007,11 +1036,11 @@ stateDiagram-v2
## 四、异常事件
### 44. 异常结果(exception-result.html
### 45. 异常结果(exception-result.html
![页面截图](screenshots/exception-result.jpg)
**功能说明:** 监控应急工单和通话的结果异常数据,如工单超时、通话异常等。
**功能说明:** 监控应急工单和通话的结果异常数据,如工单超时、通话异常等。页面顶部说明框定义:工单超时(应急工单状态>1个月未完成)、通话异常(云坐席通话产生7天后未查询到员工信息)。
**筛选条件:** 年份选择(下拉,2026/2025/2024)、异常类型(下拉,全部/工单超时/通话异常)、应急中心(下拉,全部应急中心/西安应急中心/庆阳应急中心/延安应急中心)、时间范围(日期范围选择器)
@@ -1023,7 +1052,7 @@ stateDiagram-v2
---
### 45. 系统脏数据(exception-dirty.html
### 46. 系统脏数据(exception-dirty.html
![页面截图](screenshots/exception-dirty.jpg)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 92 KiB

@@ -140,7 +140,7 @@
<!-- 说明框 -->
<div class="desc-box">
<strong>异常数据定义:</strong>工单超时(应急工单状态>1个月未完成)、通话异常(云坐席通话未查询到员工信息)等情形。
<strong>异常数据定义:</strong>工单超时(应急工单状态>1个月未完成)、通话异常(云坐席通话产生7天后未查询到员工信息)等情形。
</div>
<!-- 筛选栏 -->
@@ -164,23 +164,13 @@
<input class="form-input" type="text" placeholder="请输入证书编号">
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>证书类型</div>
<select class="form-select">
<option value="">请选择证书类型</option>
<option>红十字救护员</option>
<option>AHA急救证书</option>
<option>EFR急救证书</option>
<option>其他</option>
</select>
<div class="form-label"><span class="required">*</span>证书名称</div>
<input class="form-input" type="text" placeholder="请输入证书名称">
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>发证机构</div>
<select class="form-select">
<option value="">请选择发证机构</option>
<option>中国红十字会</option>
<option>美国心脏协会(AHA)</option>
<option>其他</option>
</select>
<input class="form-input" type="text" placeholder="请输入发证机构">
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>取证日期</div>
@@ -199,7 +189,7 @@
上传照片
</div>
</div>
<div class="form-hint">支持 JPG/PNG 格式,单张不超过 5MB</div>
<div class="form-hint">支持 JPG/PNG 格式,最多9张,单张不超过 5MB</div>
</div>
</div>
</div>
@@ -222,7 +222,7 @@
<td>EMP-10021</td>
<td>长庆油田总部</td>
<td>安全环保部</td>
<td>138****1001</td>
<td>13822231001</td>
<td>AHA-2024-0156</td>
<td>红十字救护员</td>
<td>中国红十字会</td>
@@ -237,7 +237,7 @@
<td>EMP-10035</td>
<td>长庆油田总部</td>
<td>综合管理部</td>
<td>139****2002</td>
<td>13922232002</td>
<td>RC-2023-0892</td>
<td>红十字救护员</td>
<td>中国红十字会</td>
@@ -252,7 +252,7 @@
<td>EMP-20018</td>
<td>第一采油厂</td>
<td>生产运行部</td>
<td>137****3003</td>
<td>13722233003</td>
<td>AHA-2023-0421</td>
<td>红十字救护员</td>
<td>中国红十字会</td>
@@ -267,7 +267,7 @@
<td>EMP-30042</td>
<td>第二采油厂</td>
<td>安全环保部</td>
<td>136****4004</td>
<td>13622234004</td>
<td>RC-2024-1105</td>
<td>红十字救护员</td>
<td>中国红十字会</td>
@@ -282,7 +282,7 @@
<td>EMP-40056</td>
<td>第三采油厂</td>
<td>综合管理部</td>
<td>135****5005</td>
<td>13522235005</td>
<td>AHA-2025-0078</td>
<td>红十字救护员</td>
<td>中国红十字会</td>
@@ -118,6 +118,13 @@
.map-picker__label{position:relative;z-index:2;display:flex;align-items:center;gap:6px;}
.map-picker--selected .map-picker__label{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);background:rgba(255,255,255,0.9);padding:4px 12px;border-radius:12px;font-size:var(--font-xs);box-shadow:0 1px 4px rgba(0,0,0,0.1);}
.map-picker__coord{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);background:rgba(255,255,255,0.92);padding:4px 14px;border-radius:12px;font-size:var(--font-xs);box-shadow:0 1px 4px rgba(0,0,0,0.1);z-index:3;display:none;white-space:nowrap;color:var(--text-primary);}
.upload-area{display:flex;flex-wrap:wrap;gap:8px;}
.upload-item{width:80px;height:80px;border-radius:var(--radius-sm);overflow:hidden;position:relative;border:1px solid var(--border);background:#fafafa;}
.upload-item img{width:100%;height:100%;object-fit:cover;}
.upload-item__del{position:absolute;top:-1px;right:-1px;width:20px;height:20px;background:rgba(0,0,0,0.55);color:#fff;font-size:14px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:0 0 0 4px;line-height:1;}
.upload-add{width:80px;height:80px;border:1px dashed var(--border);border-radius:var(--radius-sm);display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;color:var(--text-placeholder);font-size:var(--font-xs);gap:4px;transition:border-color .2s;background:#fafafa;}
.upload-add:hover{border-color:var(--primary);color:var(--primary);}
.upload-hint{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:6px;}
.divider{height:1px;background:var(--border);margin:4px 0 20px;}
</style>
</head>
@@ -259,6 +266,18 @@
<div class="form-label">详细地址</div>
<div class="form-control"><input class="form-input" id="addressInput" type="text" placeholder="请补充详细地址,如:总部办公楼1层大厅东侧"></div>
</div>
<div class="form-row">
<div class="form-label">布放图片</div>
<div class="form-control">
<div class="upload-area" id="uploadArea">
<div class="upload-add" id="uploadAdd" onclick="addPhoto()">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
上传图片
</div>
</div>
<div class="upload-hint">支持 JPG、PNG 格式,最多上传 9 张</div>
</div>
</div>
<div class="divider"></div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>责任人</div>
@@ -309,6 +328,27 @@ function selectDevice(no,vendor,model,unit){
document.getElementById('cardUnit').textContent=unit;
}
document.addEventListener('click',function(e){if(!document.getElementById('deviceSearch').contains(e.target))document.getElementById('deviceDropdown').style.display='none';});
var photoCount=0;
var photoColors=['#ffe8e8','#e6f7ff','#f6ffed','#fff7e6','#f9f0ff','#e6fffb','#fff0f6','#fcffe6','#f0f5ff'];
function addPhoto(){
if(photoCount>=9)return;
var area=document.getElementById('uploadArea');
var addBtn=document.getElementById('uploadAdd');
var item=document.createElement('div');
item.className='upload-item';
item.style.background=photoColors[photoCount%photoColors.length];
item.innerHTML='<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#999;">图片'+(photoCount+1)+'</div><button class="upload-item__del" onclick="removePhoto(this)">×</button>';
area.insertBefore(item,addBtn);
photoCount++;
if(photoCount>=9)addBtn.style.display='none';
}
function removePhoto(btn){
var item=btn.parentElement;
item.remove();
photoCount--;
document.getElementById('uploadAdd').style.display='';
}
</script>
</body>
</html>
@@ -210,14 +210,7 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
新增布点
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
批量导入
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 4v-2h10v2M7 12V5M4.5 7.5L7 5l2.5 2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
查看导入任务
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 4v-2h10v2M7 12V5M4.5 7.5L7 5l2.5 2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出列表数据
@@ -268,7 +261,7 @@
<td><span class="tag tag-green">正常</span></td>
<td>95%</td>
<td>2026-04-18</td>
<td><span class="tag tag-green">已接入</span></td>
<td><span class="tag tag-green">查看</span></td>
<td>张明</td>
<td>138****1001</td>
<td><div class="action-btns"><a class="link" href="resource-aed-deploy-add.html?mode=view">详情</a><a class="link" href="resource-aed-deploy-add.html?mode=edit">编辑</a><span class="link-danger" onclick="openConfirm(this,'确认删除该布点记录?')">删除</span></div></td>
@@ -285,7 +278,7 @@
<td><span class="tag tag-green">正常</span></td>
<td>88%</td>
<td>2026-04-17</td>
<td><span class="tag tag-green">已接入</span></td>
<td><span class="tag tag-green">查看</span></td>
<td>李华</td>
<td>139****2002</td>
<td><div class="action-btns"><a class="link" href="resource-aed-deploy-add.html?mode=view">详情</a><a class="link" href="resource-aed-deploy-add.html?mode=edit">编辑</a><span class="link-danger" onclick="openConfirm(this,'确认删除该布点记录?')">删除</span></div></td>
@@ -319,7 +312,7 @@
<td><span class="tag tag-orange">维修中</span></td>
<td>0%</td>
<td>2026-04-10</td>
<td><span class="tag tag-green">已接入</span></td>
<td><span class="tag tag-green">查看</span></td>
<td>赵丽</td>
<td>136****4004</td>
<td><div class="action-btns"><a class="link" href="resource-aed-deploy-add.html?mode=view">详情</a><a class="link" href="resource-aed-deploy-add.html?mode=edit">编辑</a><span class="link-danger" onclick="openConfirm(this,'确认删除该布点记录?')">删除</span></div></td>
@@ -336,7 +329,7 @@
<td><span class="tag tag-green">正常</span></td>
<td>76%</td>
<td>2026-04-19</td>
<td><span class="tag tag-green">已接入</span></td>
<td><span class="tag tag-green">查看</span></td>
<td>陈伟</td>
<td>135****5005</td>
<td><div class="action-btns"><a class="link" href="resource-aed-deploy-add.html?mode=view">详情</a><a class="link" href="resource-aed-deploy-add.html?mode=edit">编辑</a><span class="link-danger" onclick="openConfirm(this,'确认删除该布点记录?')">删除</span></div></td>
@@ -75,17 +75,33 @@
.map-road-v{position:absolute;width:2px;background:rgba(0,0,0,0.08);}
.map-label{position:absolute;font-size:11px;color:rgba(0,0,0,0.25);font-weight:500;}
/* 统计栏 */
.map-stats{display:flex;gap:16px;margin-bottom:16px;}
.stat-card{background:#fff;border-radius:var(--radius-md);padding:16px 24px;box-shadow:var(--shadow-sm);flex:1;display:flex;align-items:center;gap:12px;}
.stat-card__icon{width:40px;height:40px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;}
.stat-card__icon--blue{background:var(--primary-light);color:var(--primary);}
.stat-card__icon--green{background:#F6FFED;color:var(--success);}
.stat-card__icon--red{background:#FFF1F0;color:var(--danger);}
.stat-card__icon--orange{background:#FFF7E6;color:#FA8C16;}
.stat-card__info{display:flex;flex-direction:column;}
.stat-card__num{font-size:var(--font-xl);font-weight:700;line-height:1.2;}
.stat-card__label{font-size:var(--font-xs);color:var(--text-secondary);}
/* 统计栏 - 已移除 */
/* 地图搜索框 */
.map-search{position:absolute;top:16px;left:16px;z-index:20;display:flex;gap:8px;}
.map-search__input{width:280px;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px 0 34px;font-size:var(--font-sm);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none'%3E%3Cpath d='M10 10l3 3M6.5 2a4.5 4.5 0 110 9 4.5 4.5 0 010-9z' stroke='%23999' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat 12px center;box-shadow:0 2px 8px rgba(0,0,0,0.1);}
.map-search__input:focus{border-color:var(--primary);}
.map-search__btn{height:36px;padding:0 14px;border:none;border-radius:var(--radius-sm);background:var(--primary);color:#fff;font-size:var(--font-sm);cursor:pointer;white-space:nowrap;}
.map-search__btn:hover{background:#40a9ff;}
/* 地图缩放按钮 */
.map-zoom{position:absolute;top:16px;right:16px;z-index:20;display:flex;flex-direction:column;background:#fff;border-radius:var(--radius-sm);box-shadow:0 2px 8px rgba(0,0,0,0.12);overflow:hidden;}
.map-zoom__btn{width:36px;height:36px;border:none;background:#fff;cursor:pointer;font-size:18px;color:var(--text-primary);display:flex;align-items:center;justify-content:center;transition:background .15s;}
.map-zoom__btn:hover{background:#f5f5f5;}
.map-zoom__btn+.map-zoom__btn{border-top:1px solid var(--border);}
/* 定位按钮 */
.map-locate{position:absolute;top:96px;right:16px;z-index:20;width:36px;height:36px;background:#fff;border-radius:var(--radius-sm);box-shadow:0 2px 8px rgba(0,0,0,0.12);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s;}
.map-locate:hover{background:#f5f5f5;}
/* 我的位置标记 */
.map-me{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;transition:all .3s ease;}
.map-me__dot{width:14px;height:14px;background:var(--primary);border:3px solid #fff;border-radius:50%;box-shadow:0 0 0 6px rgba(24,144,255,0.2);}
/* 拖动搜索按钮 */
.map-drag-search{position:absolute;top:16px;left:50%;transform:translateX(-50%);z-index:25;background:#fff;border:none;border-radius:20px;padding:8px 20px;font-size:var(--font-sm);color:var(--primary);font-weight:600;box-shadow:0 2px 12px rgba(0,0,0,0.15);cursor:pointer;display:none;align-items:center;gap:6px;white-space:nowrap;}
.map-drag-search:hover{background:var(--primary-light);}
.map-drag-search--visible{display:flex;}
</style>
</head>
<body>
@@ -158,37 +174,28 @@
<!-- 主内容区域 -->
<main class="main">
<!-- 统计栏 -->
<div class="map-stats">
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--blue">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="2" y="2" width="16" height="16" rx="3" stroke="currentColor" stroke-width="1.6"/><path d="M7 10l2 2 4-5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="stat-card__info"><span class="stat-card__num">32</span><span class="stat-card__label">设备总数</span></div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--green">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="currentColor" stroke-width="1.6"/><path d="M7 10l2 2 4-4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div class="stat-card__info"><span class="stat-card__num">26</span><span class="stat-card__label">正常运行</span></div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--red">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="currentColor" stroke-width="1.6"/><path d="M10 7v4M10 13v.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
</div>
<div class="stat-card__info"><span class="stat-card__num">4</span><span class="stat-card__label">异常设备</span></div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--orange">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3a7 7 0 110 14 7 7 0 010-14z" stroke="currentColor" stroke-width="1.6"/><path d="M10 6v5l3 2" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
</div>
<div class="stat-card__info"><span class="stat-card__num">2</span><span class="stat-card__label">维修中</span></div>
</div>
</div>
<!-- 地图区域 -->
<div class="map-container">
<div class="map-bg">
<div class="map-container" id="mapContainer">
<!-- 搜索框 -->
<div class="map-search">
<input class="map-search__input" id="mapSearchInput" type="text" placeholder="输入地址搜索附近AED设备">
<button class="map-search__btn" onclick="searchAED()">搜索</button>
</div>
<!-- 缩放按钮 -->
<div class="map-zoom">
<button class="map-zoom__btn" onclick="zoomMap('in')">+</button>
<button class="map-zoom__btn" onclick="zoomMap('out')"></button>
</div>
<!-- 定位按钮 -->
<button class="map-locate" onclick="locateMe()" title="回到我的位置">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#1890FF" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v4M12 18v4M2 12h4M18 12h4"/></svg>
</button>
<!-- 拖动后搜索按钮 -->
<button class="map-drag-search" id="dragSearchBtn" onclick="dragSearch()">在该区域内搜索🔍</button>
<div class="map-bg" id="mapBg">
<!-- 我的位置 -->
<div class="map-me" id="mapMe"><div class="map-me__dot"></div></div>
<!-- 模拟道路 -->
<div class="map-road-h" style="top:30%;left:5%;width:90%;"></div>
<div class="map-road-h" style="top:60%;left:10%;width:80%;"></div>
@@ -232,14 +239,97 @@
<!-- 弹窗示例 -->
<div class="map-popup show" id="popup1" style="top:8%;left:22%;">
<div class="map-popup__title">AED-2025-001 <span class="map-popup__close" onclick="this.closest('.map-popup').classList.remove('show')">&times;</span></div>
<div class="map-popup__row"><span class="map-popup__label">厂家型号</span><span class="map-popup__value">迈瑞 BeneHeart C1A</span></div>
<div class="map-popup__row"><span class="map-popup__label">布放地址</span><span class="map-popup__value">总部办公楼1层大厅</span></div>
<div class="map-popup__row"><span class="map-popup__label">所属单位</span><span class="map-popup__value">公司机关·健康科</span></div>
<div class="map-popup__row"><span class="map-popup__label">设备状态</span><span class="map-popup__value"><span class="tag tag-green">正常</span></span></div>
<div class="map-popup__row"><span class="map-popup__label">责任人</span><span class="map-popup__value">张明 138****1001</span></div>
<div class="map-popup__row"><span class="map-popup__label">厂家</span><span class="map-popup__value">迈瑞</span></div>
<div class="map-popup__row"><span class="map-popup__label">型号</span><span class="map-popup__value">BeneHeart C1A</span></div>
<div class="map-popup__row"><span class="map-popup__label">单位</span><span class="map-popup__value">公司机关</span></div>
<div class="map-popup__row"><span class="map-popup__label">部门</span><span class="map-popup__value">健康科</span></div>
<div class="map-popup__row"><span class="map-popup__label">责任人</span><span class="map-popup__value">张明 138558991001</span></div>
<div class="map-popup__row"><span class="map-popup__label">布放地址</span><span class="map-popup__value">总部办公楼1层大厅</span></div>
</div>
</div>
</div>
</main>
<script>
(function(){
var mapContainer = document.getElementById('mapContainer');
var dragBtn = document.getElementById('dragSearchBtn');
var isDragging = false, startX, startY, hasMoved = false;
mapContainer.addEventListener('mousedown', function(e){ startX=e.clientX; startY=e.clientY; isDragging=true; hasMoved=false; });
document.addEventListener('mousemove', function(e){ if(!isDragging)return; if(Math.abs(e.clientX-startX)>10||Math.abs(e.clientY-startY)>10)hasMoved=true; });
document.addEventListener('mouseup', function(){ if(isDragging&&hasMoved){ dragBtn.classList.add('map-drag-search--visible'); } isDragging=false; });
window.dragSearch = function(){
dragBtn.classList.remove('map-drag-search--visible');
// 移除旧的搜索结果
document.querySelectorAll('.aed-marker--new').forEach(function(el){ el.remove(); });
// 模拟新搜索结果
var results=[
{top:'35%',left:'48%',label:'生活区A栋'},
{top:'58%',left:'68%',label:'仓储中心'},
{top:'45%',left:'18%',label:'培训楼'}
];
var mapBg=document.getElementById('mapBg');
results.forEach(function(r){
var marker=document.createElement('div');
marker.className='aed-marker aed-marker--new';
marker.style.top=r.top;
marker.style.left=r.left;
marker.style.animation='markerDrop .3s ease';
marker.innerHTML='<div class="aed-marker__icon"><span>AED</span></div><div class="aed-marker__label">'+r.label+'</div>';
mapBg.appendChild(marker);
});
};
window.searchAED = function(){
var val=document.getElementById('mapSearchInput').value.trim();
if(!val){alert('请输入地址信息');return;}
// 移除旧的搜索结果
document.querySelectorAll('.aed-marker--new').forEach(function(el){ el.remove(); });
// 模拟搜索结果
var results=[
{top:'30%',left:'55%',label:'搜索结果1'},
{top:'62%',left:'40%',label:'搜索结果2'}
];
var mapBg=document.getElementById('mapBg');
results.forEach(function(r){
var marker=document.createElement('div');
marker.className='aed-marker aed-marker--new';
marker.style.top=r.top;
marker.style.left=r.left;
marker.style.animation='markerDrop .3s ease';
marker.innerHTML='<div class="aed-marker__icon"><span>AED</span></div><div class="aed-marker__label">'+r.label+'</div>';
mapBg.appendChild(marker);
});
};
window.zoomMap = function(dir){
var bg=document.getElementById('mapBg');
var current=parseFloat(bg.style.transform?bg.style.transform.replace(/[^0-9.]/g,''):1)||1;
var next=dir==='in'?Math.min(current+0.15,2):Math.max(current-0.15,0.7);
bg.style.transition='transform .2s ease';
bg.style.transform='scale('+next+')';
bg.style.transformOrigin='center center';
};
window.locateMe = function(){
var bg=document.getElementById('mapBg');
bg.style.transition='transform .3s ease';
bg.style.transform='scale(1)';
bg.style.transformOrigin='center center';
// 闪烁我的位置标记
var me=document.getElementById('mapMe');
me.style.animation='none';
void me.offsetWidth;
me.style.animation='locatePulse .6s ease';
};
})();
</script>
<style>
@keyframes markerDrop{from{opacity:0;transform:translateY(-20px) scale(0.7);}to{opacity:1;transform:translateY(0) scale(1);}}
@keyframes locatePulse{0%{transform:translate(-50%,-50%) scale(1);}50%{transform:translate(-50%,-50%) scale(1.6);}100%{transform:translate(-50%,-50%) scale(1);}}
</style>
</body>
</html>
@@ -62,6 +62,22 @@
.upload-area:hover{border-color:var(--primary);color:var(--primary);}
.upload-area svg{width:28px;height:28px;}
.upload-hint{font-size:var(--font-xs);color:var(--text-placeholder);}
.upload-grid{display:flex;flex-wrap:wrap;gap:8px;min-width:320px;width:480px;}
.upload-item{width:80px;height:80px;border-radius:var(--radius-sm);overflow:hidden;position:relative;border:1px solid var(--border);background:#fafafa;}
.upload-item img{width:100%;height:100%;object-fit:cover;}
.upload-item__del{position:absolute;top:-1px;right:-1px;width:20px;height:20px;background:rgba(0,0,0,0.55);color:#fff;font-size:14px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:0 0 0 4px;line-height:1;}
.upload-add{width:80px;height:80px;border:1px dashed var(--border);border-radius:var(--radius-sm);display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;color:var(--text-placeholder);font-size:var(--font-xs);gap:4px;transition:border-color .2s;background:#fafafa;}
.upload-add:hover{border-color:var(--primary);color:var(--primary);}
.file-list{min-width:320px;width:480px;}
.file-item{display:flex;align-items:center;gap:10px;padding:8px 12px;background:#fafafa;border:1px solid var(--border);border-radius:var(--radius-sm);margin-bottom:8px;}
.file-item__icon{width:28px;height:28px;background:var(--primary-light);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.file-item__name{flex:1;font-size:var(--font-sm);color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.file-item__size{font-size:var(--font-xs);color:var(--text-placeholder);flex-shrink:0;}
.file-item__del{width:20px;height:20px;border:none;background:none;cursor:pointer;color:var(--text-placeholder);font-size:16px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s;flex-shrink:0;}
.file-item__del:hover{background:#fff1f0;color:var(--danger);}
.file-add-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border:1px dashed var(--border);border-radius:var(--radius-sm);cursor:pointer;color:var(--text-placeholder);font-size:var(--font-sm);transition:all .2s;background:#fafafa;}
.file-add-btn:hover{border-color:var(--primary);color:var(--primary);}
.file-hint{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:6px;}
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
@@ -178,18 +194,26 @@
<div class="form-card__title">附件信息</div>
<div class="form-row">
<div class="form-label">签到表</div>
<div class="upload-area">
<svg viewBox="0 0 32 32" fill="none"><path d="M16 6v14M10 14l6-6 6 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 22v2a2 2 0 002 2h16a2 2 0 002-2v-2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
点击或拖拽上传签到表图片
<span class="upload-hint">支持 JPG / PNG,不超过 5MB</span>
<div>
<div class="upload-grid" id="uploadSignin">
<div class="upload-add" onclick="addUploadPhoto('uploadSignin')">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
上传图片
</div>
</div>
<div class="file-hint">支持 JPG、PNG 格式,最多上传 9 张</div>
</div>
</div>
<div class="form-row">
<div class="form-label">现场照片</div>
<div class="upload-area">
<svg viewBox="0 0 32 32" fill="none"><path d="M16 6v14M10 14l6-6 6 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 22v2a2 2 0 002 2h16a2 2 0 002-2v-2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
点击或拖拽上传现场照片
<span class="upload-hint">支持 JPG / PNG,可上传多张,单张不超过 5MB</span>
<div>
<div class="upload-grid" id="uploadPhoto">
<div class="upload-add" onclick="addUploadPhoto('uploadPhoto')">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
上传图片
</div>
</div>
<div class="file-hint">支持 JPG、PNG 格式,最多上传 9 张</div>
</div>
</div>
<div class="form-row">
@@ -202,10 +226,13 @@
</div>
<div class="form-row">
<div class="form-label">活动资料</div>
<div class="upload-area">
<svg viewBox="0 0 32 32" fill="none"><path d="M16 6v14M10 14l6-6 6 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 22v2a2 2 0 002 2h16a2 2 0 002-2v-2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
点击或拖拽上传活动资料
<span class="upload-hint">支持 PDF / Word / PPT,不超过 20MB</span>
<div>
<div class="file-list" id="fileList"></div>
<div class="file-add-btn" id="fileAddBtn" onclick="addFile()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
上传文件
</div>
<div class="file-hint">支持 PDF / Word / PPT,单个不超过 20MB,最多 5 个</div>
</div>
</div>
</div>
@@ -241,6 +268,45 @@ document.addEventListener('click',function(e){
if(!document.getElementById('deviceSearch').contains(e.target))
document.getElementById('deviceDropdown').style.display='none';
});
var uploadCounts={uploadSignin:0,uploadPhoto:0};
var photoColors=['#ffe8e8','#e6f7ff','#f6ffed','#fff7e6','#f9f0ff','#e6fffb','#fff0f6','#fcffe6','#f0f5ff'];
function addUploadPhoto(areaId){
if(uploadCounts[areaId]>=9)return;
var area=document.getElementById(areaId);
var addBtn=area.querySelector('.upload-add');
var item=document.createElement('div');
item.className='upload-item';
item.style.background=photoColors[uploadCounts[areaId]%photoColors.length];
uploadCounts[areaId]++;
item.innerHTML='<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#999;">图片'+uploadCounts[areaId]+'</div><button class="upload-item__del" onclick="removeUploadPhoto(this,\''+areaId+'\')">×</button>';
area.insertBefore(item,addBtn);
if(uploadCounts[areaId]>=9)addBtn.style.display='none';
}
function removeUploadPhoto(btn,areaId){
btn.parentElement.remove();
uploadCounts[areaId]--;
document.getElementById(areaId).querySelector('.upload-add').style.display='';
}
var fileCount=0;
var fileNames=['AED操作培训手册.pdf','急救知识PPT.pptx','签到名单.docx','培训考核表.pdf','活动总结报告.docx'];
var fileSizes=['2.3MB','5.1MB','1.2MB','3.8MB','0.9MB'];
function addFile(){
if(fileCount>=5)return;
var list=document.getElementById('fileList');
var item=document.createElement('div');
item.className='file-item';
item.innerHTML='<div class="file-item__icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 1h5l3 3v9H3V1z" stroke="#1890FF" stroke-width="1.2"/><path d="M8 1v3h3" stroke="#1890FF" stroke-width="1.2"/></svg></div><span class="file-item__name">'+fileNames[fileCount]+'</span><span class="file-item__size">'+fileSizes[fileCount]+'</span><button class="file-item__del" onclick="removeFile(this)">×</button>';
list.appendChild(item);
fileCount++;
if(fileCount>=5)document.getElementById('fileAddBtn').style.display='none';
}
function removeFile(btn){
btn.parentElement.remove();
fileCount--;
document.getElementById('fileAddBtn').style.display='';
}
</script>
<script>
(function(){
@@ -302,9 +368,69 @@ document.addEventListener('click',function(e){
var ds = document.getElementById('deviceSearch');
if (ds) ds.style.pointerEvents = 'none';
// 隐藏上传区域
// 隐藏旧的upload-area(现场视频)
document.querySelectorAll('.upload-area').forEach(function(el){ el.style.display = 'none'; });
// 附件信息:模拟已上传数据,未上传的隐藏整行
// 签到表:模拟有3张图片
var signinArea = document.getElementById('uploadSignin');
if (signinArea) {
signinArea.querySelector('.upload-add').style.display = 'none';
for (var i = 0; i < 3; i++) {
var item = document.createElement('div');
item.className = 'upload-item';
item.style.background = ['#ffe8e8','#e6f7ff','#f6ffed'][i];
item.innerHTML = '<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#999;">签到表' + (i+1) + '</div>';
signinArea.insertBefore(item, signinArea.querySelector('.upload-add'));
}
}
// 现场照片:模拟有5张图片
var photoArea = document.getElementById('uploadPhoto');
if (photoArea) {
photoArea.querySelector('.upload-add').style.display = 'none';
for (var j = 0; j < 5; j++) {
var pItem = document.createElement('div');
pItem.className = 'upload-item';
pItem.style.background = ['#ffe8e8','#e6f7ff','#f6ffed','#fff7e6','#f9f0ff'][j];
pItem.innerHTML = '<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#999;">照片' + (j+1) + '</div>';
photoArea.insertBefore(pItem, photoArea.querySelector('.upload-add'));
}
}
// 现场视频:无上传,显示"未上传"
var videoRow = findRow('现场视频');
if (videoRow) {
var uploadArea = videoRow.querySelector('.upload-area');
if (uploadArea) {
uploadArea.style.display = 'none';
var emptyTip = document.createElement('div');
emptyTip.style.cssText = 'font-size:13px;color:#999;line-height:36px;';
emptyTip.textContent = '未上传';
uploadArea.parentElement.insertBefore(emptyTip, uploadArea);
}
}
// 活动资料:模拟有2个文件
var fileListEl = document.getElementById('fileList');
var fileAddBtnEl = document.getElementById('fileAddBtn');
if (fileAddBtnEl) fileAddBtnEl.style.display = 'none';
if (fileListEl) {
var viewFiles = [
{ name: 'AED操作培训手册.pdf', size: '2.3MB' },
{ name: '培训考核表.pdf', size: '3.8MB' }
];
viewFiles.forEach(function(f) {
var fi = document.createElement('div');
fi.className = 'file-item';
fi.innerHTML = '<div class="file-item__icon"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 1h5l3 3v9H3V1z" stroke="#1890FF" stroke-width="1.2"/><path d="M8 1v3h3" stroke="#1890FF" stroke-width="1.2"/></svg></div><span class="file-item__name">' + f.name + '</span><span class="file-item__size">' + f.size + '</span>';
fileListEl.appendChild(fi);
});
}
// 隐藏所有hint文字
document.querySelectorAll('.file-hint').forEach(function(el){ el.style.display = 'none'; });
// 隐藏主按钮,次按钮改为"返 回"
var btns = document.querySelectorAll('.bottom-bar .btn');
btns.forEach(function(b){
@@ -52,6 +52,14 @@
.btn-sm{height:30px;padding:0 10px;font-size:var(--font-xs);}
.bottom-bar{position:fixed;bottom:0;left:240px;right:0;height:60px;background:#fff;box-shadow:0 -2px 8px rgba(0,0,0,0.06);display:flex;align-items:center;justify-content:center;gap:16px;z-index:50;}
/* 图片上传网格 */
.upload-grid{display:flex;flex-wrap:wrap;gap:8px;min-width:320px;width:480px;}
.upload-item{width:80px;height:80px;border-radius:var(--radius-sm);overflow:hidden;position:relative;border:1px solid var(--border);background:#fafafa;}
.upload-item__del{position:absolute;top:-1px;right:-1px;width:20px;height:20px;background:rgba(0,0,0,0.55);color:#fff;font-size:14px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:0 0 0 4px;line-height:1;}
.upload-add{width:80px;height:80px;border:1px dashed var(--border);border-radius:var(--radius-sm);display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;color:var(--text-placeholder);font-size:var(--font-xs);gap:4px;transition:border-color .2s;background:#fafafa;}
.upload-add:hover{border-color:var(--primary);color:var(--primary);}
.upload-grid-hint{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:6px;}
/* 地图选点 */
.map-picker{width:480px;height:220px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#e6f7ff;display:flex;align-items:center;justify-content:center;color:var(--primary);font-size:var(--font-sm);gap:6px;cursor:pointer;position:relative;overflow:hidden;transition:border-color .2s;}
.map-picker:hover{border-color:var(--primary);}
@@ -150,6 +158,18 @@
</div>
<input class="form-input" type="text" placeholder="请补充详细地址,如:总部办公楼1层前台" style="min-width:480px;margin-top:10px;"></div>
</div>
<div class="form-row">
<div class="form-label">布放图片</div>
<div>
<div class="upload-grid" id="uploadDeployImg">
<div class="upload-add" onclick="addDeployImg()">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
上传图片
</div>
</div>
<div class="upload-grid-hint">支持 JPG、PNG 格式,最多上传 9 张</div>
</div>
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>布放日期</div>
<input class="form-input" type="date">
@@ -161,7 +181,13 @@
<div class="form-card__title">管理信息</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>管理部门</div>
<input class="form-input" type="text" placeholder="请输入管理部门">
<select class="form-select">
<option value="">请选择管理部门</option>
<option>健康科</option>
<option>XXX</option>
<option>XXX</option>
<option>XXX</option>
</select>
</div>
<div class="form-row">
<div class="form-label"><span class="required">*</span>管理人</div>
@@ -233,6 +259,26 @@
</div>
<script>
var deployImgCount=0;
var imgColors=['#ffe8e8','#e6f7ff','#f6ffed','#fff7e6','#f9f0ff','#e6fffb','#fff0f6','#fcffe6','#f0f5ff'];
function addDeployImg(){
if(deployImgCount>=9)return;
var area=document.getElementById('uploadDeployImg');
var addBtn=area.querySelector('.upload-add');
var item=document.createElement('div');
item.className='upload-item';
item.style.background=imgColors[deployImgCount%imgColors.length];
deployImgCount++;
item.innerHTML='<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#999;">图片'+deployImgCount+'</div><button class="upload-item__del" onclick="removeDeployImg(this)">×</button>';
area.insertBefore(item,addBtn);
if(deployImgCount>=9)addBtn.style.display='none';
}
function removeDeployImg(btn){
btn.parentElement.remove();
deployImgCount--;
document.getElementById('uploadDeployImg').querySelector('.upload-add').style.display='';
}
function pickLocation(e){
var picker=document.getElementById('mapPicker');
var rect=picker.getBoundingClientRect();
@@ -367,14 +367,7 @@
<div class="form-label"><span class="required">*</span> 应急专长</div>
<textarea class="form-textarea" placeholder="请输入应急专长,如:心脑血管急救、创伤外科"></textarea>
</div>
<!-- 状态 -->
<div class="form-group">
<div class="form-label">状态</div>
<div class="switch-row">
<div class="switch on" onclick="this.classList.toggle('on')"></div>
<span>移动端是否显示</span>
</div>
</div>
</div>
<div class="drawer__footer">
<button class="btn btn-default" onclick="closeDrawer()">取消</button>
@@ -37,12 +37,8 @@
```mermaid
stateDiagram-v2
[*] --> 待受理 : 员工端发起求助
待受理 --> 进行中 : 操作人员进入"正在应急"
进行中 --> 资源调度中 : 触发驻场派单 / 救护车支援
资源调度中 --> 进行中 : 派单成功,持续沟通
进行中 --> 已结束 : 点击"结束应急"并二次确认
已结束 --> [*]
[*] --> 进行中 : 员工端发起求助
进行中 --> 已结束 : 员工/操作人员/专业人员"结束应急"并二次确认
```
---
@@ -455,10 +455,6 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M9 2H4.5A1.5 1.5 0 0 0 3 3.5v9A1.5 1.5 0 0 0 4.5 14h7a1.5 1.5 0 0 0 1.5-1.5V6L9 2z" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/><path d="M9 2v4h4" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>
文件
</button>
<button class="toolbar-btn toolbar-btn--call">
<svg viewBox="0 0 16 16" fill="none"><path d="M6.2 7.4a6.5 6.5 0 0 0 2.4 2.4l.8-.8a.7.7 0 0 1 .7-.2c.8.3 1.6.4 2.4.4a.7.7 0 0 1 .7.7v2.4a.7.7 0 0 1-.7.7A11.4 11.4 0 0 1 1 1.7.7.7 0 0 1 1.7 1H4a.7.7 0 0 1 .7.7c0 .8.2 1.6.4 2.4a.7.7 0 0 1-.2.7l-.7.6z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
语音通话
</button>
<button class="toolbar-btn toolbar-btn--video">
<svg viewBox="0 0 16 16" fill="none"><rect x="1.5" y="3.5" width="9" height="9" rx="1.5" stroke="currentColor" stroke-width="1.2"/><path d="M10.5 6.5l4-2v7l-4-2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
视频通话
@@ -763,7 +759,7 @@
</div>
</div>
<div class="dispatch-field">
<div class="dispatch-field__label">目的地</div>
<div class="dispatch-field__label">目的地<span class="required">*</span></div>
<input class="dispatch-field__input" id="ambDest" placeholder="请输入目的地">
</div>
<div class="dispatch-field" style="margin-bottom:20px;">
@@ -398,10 +398,6 @@
<svg viewBox="0 0 16 16" fill="none"><path d="M9 2H4.5A1.5 1.5 0 0 0 3 3.5v9A1.5 1.5 0 0 0 4.5 14h7a1.5 1.5 0 0 0 1.5-1.5V6L9 2z" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/><path d="M9 2v4h4" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>
文件
</button>
<button class="toolbar-btn toolbar-btn--call">
<svg viewBox="0 0 16 16" fill="none"><path d="M6.2 7.4a6.5 6.5 0 0 0 2.4 2.4l.8-.8a.7.7 0 0 1 .7-.2c.8.3 1.6.4 2.4.4a.7.7 0 0 1 .7.7v2.4a.7.7 0 0 1-.7.7A11.4 11.4 0 0 1 1 1.7.7.7 0 0 1 1.7 1H4a.7.7 0 0 1 .7.7c0 .8.2 1.6.4 2.4a.7.7 0 0 1-.2.7l-.7.6z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
语音通话
</button>
<button class="toolbar-btn toolbar-btn--video">
<svg viewBox="0 0 16 16" fill="none"><rect x="1.5" y="3.5" width="9" height="9" rx="1.5" stroke="currentColor" stroke-width="1.2"/><path d="M10.5 6.5l4-2v7l-4-2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
视频通话