feat: 一线医疗员工/非员工就诊融合为日常诊疗管理及医疗PAD体检报告完善
This commit is contained in:
@@ -84,7 +84,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -91,7 +91,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -235,7 +235,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<tr>
|
||||
<td>日常业务</td>
|
||||
<td><span class="tag tag-red">关联缺失</span></td>
|
||||
<td>随访任务引用的员工工号在健康档案库中不存在</td>
|
||||
<td>随访任务引用的员工编号在健康档案库中不存在</td>
|
||||
<td>2026-09-05 10:00</td>
|
||||
<td>t_follow_task</td>
|
||||
<td>emp_no</td>
|
||||
|
||||
@@ -103,7 +103,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html" class="active">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -80,7 +80,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html" class="active">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -96,7 +96,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html" class="active">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -88,7 +88,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -112,7 +112,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -107,7 +107,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -116,7 +116,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -104,7 +104,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -107,7 +107,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -105,7 +105,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -93,7 +93,7 @@ tfoot td{padding:10px 7px;text-align:center;font-size:var(--font-sm);font-weight
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -103,7 +103,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -87,7 +87,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html" class="active">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>分配统计 | 一线医疗</title>
|
||||
<title>员工分配统计 | 一线医疗</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:var(--font-sm);background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
@@ -128,10 +128,10 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<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 6.5l7 3.5v4.5c0 4.2-2.9 6.8-7 7.5-4.1-.7-7-3.3-7-7.5V10l7-3.5z" stroke="#fff" stroke-width="1.8" fill="none"/><path d="M11 13.5h6M14 10.5v6" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/></svg> 一线医疗</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
<a href="alert-dirty.html">异常事件</a>
|
||||
</nav>
|
||||
@@ -142,33 +142,31 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边栏(当前一级分组「基础配置」的二级/三级菜单) -->
|
||||
<!-- 侧边栏(当前一级分组「数据统计」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-menu__title">数据统计</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
医疗点统计
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
<a href="stat-clinic-chart.html" class="sidebar-item">统计图表</a>
|
||||
<a href="stat-clinic-table.html" class="sidebar-item">统计报表</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
救护车统计
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item active">分配统计</a>
|
||||
<a href="stat-ambulance-chart.html" class="sidebar-item">统计图表</a>
|
||||
<a href="stat-ambulance-table.html" class="sidebar-item">统计报表</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item active">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -228,16 +226,16 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<div class="drawer" id="rosterDrawer">
|
||||
<div class="drawer__header"><span id="rosterTitle">已分配员工名册</span><button class="drawer__close" onclick="closeDrawer()">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<!-- [交互] 名册按姓名/工号即时过滤 -->
|
||||
<!-- [交互] 名册按姓名/员工编号即时过滤 -->
|
||||
<div class="drawer__toolbar">
|
||||
<div class="filter-item"><label>姓名</label>
|
||||
<input class="filter-input" id="rsName" placeholder="请输入姓名" style="min-width:100px;" oninput="renderRoster()"></div>
|
||||
<div class="filter-item"><label>工号</label>
|
||||
<input class="filter-input" id="rsCode" placeholder="请输入工号" style="min-width:100px;" oninput="renderRoster()"></div>
|
||||
<div class="filter-item"><label>员工编号</label>
|
||||
<input class="filter-input" id="rsCode" placeholder="请输入员工编号" style="min-width:100px;" oninput="renderRoster()"></div>
|
||||
<span class="grow" id="rosterHint"></span>
|
||||
</div>
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th>单位名称</th><th>部门名称</th><th>姓名</th><th>性别</th><th>年龄</th><th>员工工号</th></tr></thead>
|
||||
<thead><tr><th>单位名称</th><th>部门名称</th><th>姓名</th><th>性别</th><th>年龄</th><th>员工编号</th></tr></thead>
|
||||
<tbody id="rosterBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>分配管理 | 一线医疗</title>
|
||||
<title>员工分配管理 | 一线医疗</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:var(--font-sm);background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
@@ -142,7 +142,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -159,28 +159,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item active">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item active">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
@@ -193,7 +175,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="tab" id="tabUnalloc" onclick="switchTab(false)">未分配<span class="tab__count" id="cntUnalloc">0</span></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 筛选栏:单位部门级联 + 姓名/工号 + 医疗点(仅已分配) -->
|
||||
<!-- [交互] 筛选栏:单位部门级联 + 姓名/员工编号 + 医疗点(仅已分配) -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
@@ -220,8 +202,8 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工工号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入工号" style="min-width:100px;">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号" style="min-width:100px;">
|
||||
</div>
|
||||
<div class="filter-item" id="mfUnitWrap">
|
||||
<label>医疗点所属单位</label>
|
||||
@@ -297,7 +279,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<select class="form-control" id="iUnit" onchange="onImportUnit()"><option value="">请选择单位</option><option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 分配医疗点</span>
|
||||
<select class="form-control" id="iPoint"><option value="">请先选择单位</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 上传文件(员工工号清单)</span>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 上传文件(员工编号清单)</span>
|
||||
<div class="drop-zone" onclick="showToast('演示环境请选择本地文件(仅支持.xlsx)')">点击选择或拖拽文件到此处上传<br>员工分配导入模板.xlsx</div></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('importMask')">取消</button>
|
||||
@@ -427,7 +409,7 @@ function currentData(){
|
||||
return list;
|
||||
}
|
||||
function renderHead(){
|
||||
var h='<tr><th style="width:40px"><input type="checkbox" onchange="toggleAll(this)"></th><th>序号</th><th>员工所属单位</th><th>员工所属部门</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>员工工号</th><th>联系电话</th>';
|
||||
var h='<tr><th style="width:40px"><input type="checkbox" onchange="toggleAll(this)"></th><th>序号</th><th>员工所属单位</th><th>员工所属部门</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>员工编号</th><th>联系电话</th>';
|
||||
h+=curAllocTab?'<th>医疗点所属单位</th><th>分配医疗点</th><th>分配日期</th><th>操作</th></tr>':'<th>操作</th></tr>';
|
||||
document.getElementById('tableHead').innerHTML=h;
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -177,28 +177,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item active">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
|
||||
@@ -151,6 +151,14 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
.upload-box:hover{border-color:var(--primary);color:var(--primary);}
|
||||
.img-ph{width:80px;height:80px;border-radius:var(--radius-sm);background:linear-gradient(135deg,#E6F7FF,#BAE7FF);display:flex;align-items:center;justify-content:center;font-size:22px;}
|
||||
|
||||
/* 地图选点 */
|
||||
.map-picker{width:100%;height:200px;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);}
|
||||
.map-picker__bg{position:absolute;inset:0;opacity:.15;background:repeating-linear-gradient(0deg,transparent,transparent 19px,#91D5FF 19px,#91D5FF 20px),repeating-linear-gradient(90deg,transparent,transparent 19px,#91D5FF 19px,#91D5FF 20px);}
|
||||
.map-picker__pin{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%);z-index:2;display:none;}
|
||||
.map-picker__label{position:relative;z-index:2;display:flex;align-items:center;gap:6px;}
|
||||
.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);}
|
||||
|
||||
/* 只读详情 */
|
||||
.desc-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 24px;}
|
||||
.desc-item{display:flex;padding:10px 0;border-bottom:1px solid #F0F0F0;font-size:var(--font-sm);}
|
||||
@@ -188,7 +196,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -205,28 +213,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item active">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
@@ -260,8 +250,8 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<button class="btn btn-primary" onclick="openForm('新增医疗点')">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="showToast('请先勾选要删除的医疗点')">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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" onclick="showToast('请先勾选要删除的医疗点')">批量删除</button>
|
||||
<div class="view-switch">
|
||||
<button id="btnList" class="active" onclick="switchView('list')">资源列表</button>
|
||||
<button id="btnMap" onclick="switchView('map')">地图列表</button>
|
||||
@@ -275,7 +265,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th>
|
||||
<th>序号</th><th>医疗点名称</th><th>医疗点地址</th><th>所属医院</th><th>联系电话</th><th>所属单位</th><th>负责人</th><th>合同签订金额(万元)</th><th>设立时间</th><th>医生人数</th><th>护士人数</th><th>辐射人数</th><th>救护车数量</th><th>开启状态</th><th>操作</th>
|
||||
<th>序号</th><th>医疗点名称</th><th>所属单位</th><th>所属合作医院</th><th>详细地址</th><th>联系电话</th><th>医生人数</th><th>护士人数</th><th>救护车数量</th><th>负责人</th><th>设立时间</th><th>合同签订金额(元)</th><th>开启状态</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -335,8 +325,16 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="form-item"><span class="form-label">状态</span>
|
||||
<div class="radio-group"><label><input type="radio" name="fStatus" checked> 开启</label><label><input type="radio" name="fStatus"> 关闭</label></div></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 医疗点地址</span>
|
||||
<div class="upload-row"><input class="form-control" id="fAddr" readonly placeholder="点击右侧地图选点后自动回填"><button class="btn btn-default" onclick="showToast('演示:打开地图选点')"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1.5c2.5 0 4.5 2 4.5 4.4 0 3.2-4.5 7.1-4.5 7.1S2.5 9.1 2.5 5.9C2.5 3.5 4.5 1.5 7 1.5z" stroke="currentColor" stroke-width="1.2"/><circle cx="7" cy="5.9" r="1.6" stroke="currentColor" stroke-width="1.2"/></svg>地图选点</button></div>
|
||||
<span style="font-size:var(--font-xs);color:var(--text-placeholder);">经度 107.6379 / 纬度 36.9426(选点后回填)</span></div>
|
||||
<div class="map-picker" id="mapPicker" onclick="pickLocation(event)">
|
||||
<div class="map-picker__bg"></div>
|
||||
<svg class="map-picker__pin" id="mapPin" width="28" height="36" viewBox="0 0 28 36" fill="none"><path d="M14 0C6.27 0 0 6.27 0 14c0 10.5 14 22 14 22s14-11.5 14-22C28 6.27 21.73 0 14 0z" fill="#1890FF"/><circle cx="14" cy="14" r="6" fill="#fff"/></svg>
|
||||
<span class="map-picker__label" id="mapLabel"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1C4.24 1 2 3.24 2 6c0 3.75 5 7 5 7s5-3.25 5-7c0-2.76-2.24-5-5-5z" stroke="currentColor" stroke-width="1.2"/><circle cx="7" cy="6" r="1.5" stroke="currentColor" stroke-width="1"/></svg>在地图上点击选择坐标位置</span>
|
||||
<div class="map-picker__coord" id="mapCoord"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">详细地址</span>
|
||||
<input class="form-control" id="fAddr" type="text" placeholder="请补充详细地址,如:CQ油田采油一厂樊学作业区基地东侧">
|
||||
</div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 医疗点图片</span>
|
||||
<div class="upload-row"><div class="img-ph">🏥</div><div class="upload-box" onclick="showToast('演示环境暂不支持上传')"><svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M9 4v10M4 9h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>上传</div></div></div>
|
||||
</div>
|
||||
@@ -349,12 +347,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<svg class="multi-select__arrow" width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6" fill="#999"/></svg>
|
||||
</div>
|
||||
<div class="multi-select__dropdown">
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油一厂 · 樊学作业区" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油一厂 · 樊学作业区</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油一厂 · 麻子山作业区" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油一厂 · 麻子山作业区</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油二厂 · 姬圪台作业区" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油二厂 · 姬圪台作业区</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油二厂 · 桐园作业区" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油二厂 · 桐园作业区</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="第四采油厂 · 西谷峁作业区" onchange="updateMulti(document.getElementById('fRadiate'))"><span>第四采油厂 · 西谷峁作业区</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采气一厂 · 靖边气田" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采气一厂 · 靖边气田</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油一厂" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油一厂</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采油二厂" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采油二厂</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="第四采油厂" onchange="updateMulti(document.getElementById('fRadiate'))"><span>第四采油厂</span></label>
|
||||
<label class="multi-select__option"><input type="checkbox" value="采气一厂" onchange="updateMulti(document.getElementById('fRadiate'))"><span>采气一厂</span></label>
|
||||
</div>
|
||||
</div></div>
|
||||
<div class="form-section__title">医疗点简介</div>
|
||||
@@ -412,17 +408,23 @@ function renderTable(){
|
||||
document.getElementById('pageNum').textContent=currentPage+'/'+totalPages;
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
if(!filtered.length){tbody.innerHTML='<tr><td colspan="16" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
if(!filtered.length){tbody.innerHTML='<tr><td colspan="15" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(p,i){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+p.id+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="text-align:left;font-weight:600;">'+p.name+'</td>'
|
||||
+'<td>'+p.unit+'</td>'
|
||||
+'<td>'+p.hospital+'</td>'
|
||||
+'<td style="text-align:left;max-width:260px;overflow:hidden;text-overflow:ellipsis;">'+p.addr+'</td>'
|
||||
+'<td>'+p.hospital+'</td><td>'+p.phone+'</td><td>'+p.unit+'</td><td>'+p.leader+'</td>'
|
||||
+'<td>'+p.amount.toFixed(1)+'</td><td>'+p.found+'</td>'
|
||||
+'<td>'+p.doctors+'</td><td>'+p.nurses+'</td><td>'+p.radPeople.toLocaleString()+'</td><td>'+p.ambulance+'</td>'
|
||||
+'<td>'+p.phone+'</td>'
|
||||
+'<td>'+p.doctors+'</td>'
|
||||
+'<td>'+p.nurses+'</td>'
|
||||
+'<td>'+p.ambulance+'</td>'
|
||||
+'<td>'+p.leader+'</td>'
|
||||
+'<td>'+p.found+'</td>'
|
||||
+'<td>'+(p.amount*10000).toLocaleString()+'</td>'
|
||||
+'<td><label class="switch"><input type="checkbox" '+(p.status?'checked':'')+' onchange="toggleStatus('+p.id+',this.checked)"><span class="switch__track"></span></label></td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openEdit('+p.id+')">编辑</button>'
|
||||
@@ -484,6 +486,7 @@ function openForm(title){
|
||||
editId=null;
|
||||
['fName','fLeader','fPhone','fAmount','fFound','fAddr','fIntro'].forEach(function(id){document.getElementById(id).value='';});
|
||||
resetMultiDefault();
|
||||
resetMapPicker();
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
document.getElementById('formDrawer').classList.add('open');
|
||||
}
|
||||
@@ -507,6 +510,31 @@ function saveForm(){
|
||||
showToast(editId?('医疗点「'+name+'」已保存'):('医疗点「'+name+'」已创建'));
|
||||
closeDrawer('form');
|
||||
}
|
||||
/* ===== 地图选点(演示) ===== */
|
||||
function resetMapPicker(){
|
||||
document.getElementById('mapPin').style.display='none';
|
||||
document.getElementById('mapLabel').style.display='';
|
||||
var coord=document.getElementById('mapCoord');
|
||||
coord.style.display='none';
|
||||
coord.innerHTML='';
|
||||
}
|
||||
function pickLocation(e){
|
||||
var picker=document.getElementById('mapPicker');
|
||||
var rect=picker.getBoundingClientRect();
|
||||
var x=e.clientX-rect.left;
|
||||
var y=e.clientY-rect.top;
|
||||
var pin=document.getElementById('mapPin');
|
||||
pin.style.display='block';
|
||||
pin.style.left=x+'px';
|
||||
pin.style.top=y+'px';
|
||||
document.getElementById('mapLabel').style.display='none';
|
||||
var addresses=['CQ油田采油一厂樊学作业区基地东侧','采油二厂姬圪台联合站生活区1号','第四采油厂西峰基地综合服务区2层','采气一厂靖边净化厂生活小区旁','采油二厂桐园作业区营地西侧'];
|
||||
var idx=Math.floor(Math.random()*addresses.length);
|
||||
var coord=document.getElementById('mapCoord');
|
||||
coord.innerHTML='<svg width="12" height="12" viewBox="0 0 14 14" fill="none" style="vertical-align:-1px;margin-right:4px;"><path d="M7 1C4.24 1 2 3.24 2 6c0 3.75 5 7 5 7s5-3.25 5-7c0-2.76-2.24-5-5-5z" stroke="#1890FF" stroke-width="1.2"/><circle cx="7" cy="6" r="1.5" stroke="#1890FF" stroke-width="1"/></svg>'+addresses[idx];
|
||||
coord.style.display='block';
|
||||
document.getElementById('fAddr').value=addresses[idx];
|
||||
}
|
||||
/* ===== 多选下拉 ===== */
|
||||
function toggleMulti(control){control.parentElement.classList.toggle('open');}
|
||||
function updateMulti(wrap){
|
||||
@@ -522,16 +550,25 @@ function updateMulti(wrap){
|
||||
function resetMultiDefault(){
|
||||
var wrap=document.getElementById('fRadiate');
|
||||
wrap.querySelectorAll('.multi-select__option input').forEach(function(cb){
|
||||
var v=cb.value;
|
||||
cb.checked=(v==='采油一厂 · 樊学作业区'||v==='采油二厂 · 桐园作业区');
|
||||
cb.checked=(cb.value==='采油一厂'||cb.value==='采油二厂');
|
||||
});
|
||||
updateMulti(wrap);
|
||||
}
|
||||
var deptUnit={
|
||||
'樊学作业区':'采油一厂','麻子山作业区':'采油一厂','安塞基地':'采油一厂','姬塬试验区':'采油一厂','定边采油区':'采油一厂',
|
||||
'姬圪台作业区':'采油二厂','桐园作业区':'采油二厂',
|
||||
'西峰基地':'第四采油厂','西谷峁注水作业区':'第四采油厂','西谷峁作业区':'第四采油厂',
|
||||
'靖边气田':'采气一厂','乌审旗采气区':'采气一厂','苏里格南作业区':'采气一厂'
|
||||
};
|
||||
function setMultiFromText(text){
|
||||
var wrap=document.getElementById('fRadiate');
|
||||
var units={};
|
||||
text.split(/[、,,]/).forEach(function(d){
|
||||
var u=deptUnit[d.trim()];
|
||||
if(u)units[u]=true;
|
||||
});
|
||||
wrap.querySelectorAll('.multi-select__option input').forEach(function(cb){
|
||||
var name=(cb.value.split(' · ')[1]||cb.value);
|
||||
cb.checked=text.indexOf(name)!==-1;
|
||||
cb.checked=!!units[cb.value];
|
||||
});
|
||||
updateMulti(wrap);
|
||||
}
|
||||
|
||||
@@ -62,13 +62,24 @@ body{font-family:"Microsoft YaHei","PingFang SC",sans-serif;font-size:var(--font
|
||||
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:1680px;}
|
||||
thead th{position:sticky;top:0;background:#FAFAFA;font-weight:600;font-size:var(--font-sm);color:var(--text-primary);text-align:left;padding:10px 14px;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
thead th{position:sticky;top:0;background:#FAFAFA;font-weight:600;font-size:var(--font-sm);color:var(--text-primary);text-align:left;padding:10px 14px;border-bottom:1px solid var(--border);white-space:nowrap;z-index:6;}
|
||||
tbody td{padding:12px 14px;font-size:var(--font-sm);color:var(--text-secondary);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody tr:hover{background:#FAFCFF;}
|
||||
.td-actions{white-space:nowrap;}
|
||||
.avatar-cell{width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-base);flex-shrink:0;}
|
||||
.idcell{color:var(--text-secondary);}
|
||||
|
||||
/* 固定列:前三列(选择/序号/头像)左固定,末列(操作)右固定 */
|
||||
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;}
|
||||
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:48px;}
|
||||
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:100px;}
|
||||
thead th:nth-child(18),tbody td:nth-child(18){position:sticky;right:0;}
|
||||
thead th:nth-child(1),thead th:nth-child(2),thead th:nth-child(3),thead th:nth-child(18){z-index:7;}
|
||||
tbody td:nth-child(1),tbody td:nth-child(2),tbody td:nth-child(3),tbody td:nth-child(18){z-index:5;background:#fff;}
|
||||
tbody tr:hover td:nth-child(1),tbody tr:hover td:nth-child(2),tbody tr:hover td:nth-child(3),tbody tr:hover td:nth-child(18){background:#FAFCFF;}
|
||||
thead th:nth-child(3),tbody td:nth-child(3){box-shadow:2px 0 4px rgba(0,0,0,0.06);}
|
||||
thead th:nth-child(18),tbody td:nth-child(18){box-shadow:-2px 0 4px rgba(0,0,0,0.06);}
|
||||
|
||||
/* 状态开关 */
|
||||
.switch{position:relative;display:inline-block;width:40px;height:20px;cursor:pointer;}
|
||||
.switch input{opacity:0;width:0;height:0;}
|
||||
@@ -104,6 +115,10 @@ tbody tr:hover{background:#FAFCFF;}
|
||||
.form-control{height:32px;border:1px solid #D9D9D9;border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;width:100%;background:#fff;}
|
||||
.form-control:focus{border-color:var(--primary);}
|
||||
.form-control[disabled]{background:#F5F5F5;color:var(--text-secondary);cursor:not-allowed;}
|
||||
.form-hint{font-size:var(--font-xs);color:var(--text-secondary);line-height:1.5;}
|
||||
.avatar-upload{width:96px;height:96px;border:1px dashed #D9D9D9;border-radius:var(--radius-sm);background:#FAFAFA;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;cursor:pointer;color:var(--text-secondary);font-size:var(--font-sm);transition:all .15s;}
|
||||
.avatar-upload:hover{border-color:var(--primary);color:var(--primary);}
|
||||
.avatar-upload__tip{font-size:var(--font-xs);color:var(--text-placeholder);}
|
||||
textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
.form-item--full{grid-column:1 / -1;}
|
||||
.radio-group{display:flex;gap:18px;align-items:center;height:32px;}
|
||||
@@ -131,7 +146,7 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -148,42 +163,28 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item active">医护人员管理</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- [交互] 筛选栏:员工姓名 + 单位名称 + 所属医疗点(先选单位,医疗点随单位级联) -->
|
||||
<!-- [交互] 筛选栏:姓名 + 账号 + 所属单位 + 所属医疗点(先选单位,医疗点随单位级联) -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名关键字" style="min-width:130px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位名称</label>
|
||||
<label>账号</label>
|
||||
<input class="filter-input" id="filterAccount" placeholder="请输入账号关键字" style="min-width:130px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:130px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
@@ -206,11 +207,11 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
<button class="btn btn-primary" onclick="openForm()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增
|
||||
</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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>
|
||||
<span class="action-bar__sep"></span>
|
||||
<button class="btn btn-default" onclick="batchDelete()" style="color:var(--danger);border-color:#FFCCC7;">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 4h8M5.5 4V2.5h3V4M4 4l.5 8h5L10 4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>批量删除
|
||||
</button>
|
||||
<span class="action-bar__sep"></span>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
@@ -219,8 +220,8 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" onchange="toggleAll(this)"></th>
|
||||
<th style="width:52px;">序号</th><th style="width:56px;">图片</th><th>员工姓名</th><th style="min-width:100px;">单位名称</th><th style="min-width:150px;">所属医疗点</th><th style="width:56px;">性别</th><th style="width:56px;">年龄</th><th style="min-width:160px;">身份证</th><th style="min-width:110px;">联系电话</th><th style="min-width:90px;">职称</th><th style="width:80px;">岗位</th><th style="min-width:96px;">驻点时间</th><th style="min-width:120px;">毕业院校</th><th style="min-width:90px;">工作时间</th><th style="width:84px;">开启状态</th><th style="width:150px;">操作</th>
|
||||
<th style="width:48px"><input type="checkbox" onchange="toggleAll(this)"></th>
|
||||
<th style="width:52px;">序号</th><th style="width:72px;">头像</th><th>姓名</th><th style="min-width:120px;">账号</th><th style="min-width:100px;">所属单位</th><th style="min-width:150px;">所属医疗点</th><th style="width:56px;">性别</th><th style="width:56px;">年龄</th><th style="min-width:160px;">身份证</th><th style="min-width:110px;">联系电话</th><th style="min-width:90px;">职称</th><th style="width:80px;">岗位</th><th style="min-width:96px;">驻点时间</th><th style="min-width:120px;">毕业院校</th><th style="min-width:90px;">工作时间</th><th style="width:84px;">开启状态</th><th style="width:160px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -248,7 +249,8 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
<input class="form-control" id="fUsername" placeholder="字母/数字/下划线" oninput="this.value=this.value.replace(/[^a-zA-Z0-9_]/g,'')"></div>
|
||||
<div class="form-item"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 登录密码</span>
|
||||
<input class="form-control" type="password" id="fPwd" placeholder="至少8位,含字母和数字"></div>
|
||||
<input class="form-control" type="password" id="fPwd" placeholder="请输入登录密码">
|
||||
<span class="form-hint">密码不能少于12位,必须包含大小写字母、数字以及特殊符号</span></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 确认密码</span>
|
||||
<input class="form-control" type="password" id="fPwd2" placeholder="再次输入登录密码"></div>
|
||||
</div>
|
||||
@@ -264,9 +266,12 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 身份证</span><input class="form-control" id="fIdCard" placeholder="18位身份证号" maxlength="18"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 联系电话</span><input class="form-control" id="fTel" placeholder="11位手机号" maxlength="11"></div>
|
||||
<div class="form-item"><span class="form-label">生日</span><input class="form-control" type="date" id="fBirthday"></div>
|
||||
<div class="form-item"><span class="form-label">头像</span>
|
||||
<button class="btn btn-default" style="width:fit-content;" onclick="showToast('演示:上传图片(仅支持 jpg/png,≤2MB)')">上传头像</button></div>
|
||||
<div class="avatar-upload" onclick="showToast('演示:上传头像(仅支持 jpg/png,≤2MB)')">
|
||||
<svg width="26" height="26" viewBox="0 0 24 24" fill="none"><path d="M4 8h3l1.5-2h7L17 8h3a1 1 0 011 1v9a1 1 0 01-1 1H4a1 1 0 01-1-1V9a1 1 0 011-1z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><circle cx="12" cy="13" r="3" stroke="currentColor" stroke-width="1.5"/></svg>
|
||||
<span>上传头像</span>
|
||||
<span class="avatar-upload__tip">jpg/png,≤2MB</span>
|
||||
</div></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">归属信息</div>
|
||||
@@ -280,10 +285,10 @@ textarea.form-control{height:72px;padding:8px 10px;resize:vertical;}
|
||||
|
||||
<div class="form-section">专业信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 岗位</span>
|
||||
<select class="form-control" id="fPost" onchange="onFormPost()"><option value="">请选择岗位</option><option>医生</option><option>护士</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 职称</span>
|
||||
<select class="form-control" id="fJob"><option value="">请选择职称</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 岗位</span>
|
||||
<select class="form-control" id="fPost"><option value="">请选择岗位</option></select></div>
|
||||
<div class="form-item"><span class="form-label">学历</span>
|
||||
<select class="form-control" id="fEdu"><option value="">请选择学历</option><option>中专</option><option>大专</option><option>本科</option><option>硕士</option><option>博士</option></select></div>
|
||||
<div class="form-item"><span class="form-label">毕业院校</span><input class="form-control" id="fSchool" placeholder="请输入毕业院校"></div>
|
||||
@@ -342,23 +347,26 @@ var pointMap={
|
||||
'第四采油厂':['西峰基地医疗点'],
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
var jobOptions=['住院医师','主治医师','副主任医师','主任医师','护师','主管护师','副主任护师','技师'];
|
||||
var postOptions=['医生','护士','检验人员','放射人员','药师','公卫人员'];
|
||||
var postOptions=['医生','护士'];
|
||||
var jobOptionsMap={
|
||||
'医生':['住院医师','主治医师','副主任医师','主任医师'],
|
||||
'护士':['护士','护师','主管护师','副主任护师','主任护师']
|
||||
};
|
||||
|
||||
/* ===== 医护人员 mock 数据(演示数据已脱敏) ===== */
|
||||
/* ===== 医护人员 mock 数据(演示数据) ===== */
|
||||
var staff=[
|
||||
{id:1,username:'fanyx_doc01',name:'韩东学',sex:'男',unit:'采油一厂',point:'樊学作业区医疗点',idCard:'622101********1537',tel:'139****5218',job:'主治医师',post:'医生',joinTime:'2021-03-01',edu:'本科',school:'西安医学院',gradTime:'2012-06-30',workTime:'2012-07-01',birthday:'1988-04-12',desc:'从事油田一线全科医疗十年,擅长外伤处置与慢性病管理。',status:1},
|
||||
{id:2,username:'fanyx_nur02',name:'兰小娟',sex:'女',unit:'采油一厂',point:'樊学作业区医疗点',idCard:'610621********3246',tel:'135****6174',job:'主管护师',post:'护士',joinTime:'2021-03-01',edu:'大专',school:'延安大学医护学院',gradTime:'2014-06-30',workTime:'2014-07-01',birthday:'1991-09-23',desc:'负责医疗点护理与药品管理。',status:1},
|
||||
{id:3,username:'anse_doc03',name:'白宇峰',sex:'男',unit:'采油一厂',point:'安塞采油队长住点医疗室',idCard:'612524********0817',tel:'150****8357',job:'副主任医师',post:'医生',joinTime:'2020-06-15',edu:'硕士',school:'陕西中医药大学',gradTime:'2010-06-30',workTime:'2010-07-01',birthday:'1985-11-02',desc:'常驻点医疗室负责人,心血管方向。',status:1},
|
||||
{id:4,username:'jyuan_doc04',name:'温亚丽',sex:'女',unit:'采油一厂',point:'姬塬作业区医疗点',idCard:'640321********6624',tel:'133****9481',job:'主治医师',post:'医生',joinTime:'2022-08-01',edu:'本科',school:'宁夏医科大学',gradTime:'2015-06-30',workTime:'2015-07-01',birthday:'1992-02-17',desc:'擅长高原作业区多发病防治。',status:1},
|
||||
{id:5,username:'jgt_doc05',name:'窦志远',sex:'男',unit:'采油二厂',point:'姬圪台作业区医疗点',idCard:'612721********0933',tel:'155****6703',job:'主任医师',post:'医生',joinTime:'2019-04-01',edu:'硕士',school:'兰州大学医学院',gradTime:'2008-06-30',workTime:'2008-07-01',birthday:'1983-06-28',desc:'医疗点学科带头人。',status:1},
|
||||
{id:6,username:'jgt_nur06',name:'苗慧敏',sex:'女',unit:'采油二厂',point:'姬圪台作业区医疗点',idCard:'610421********4528',tel:'186****2940',job:'护师',post:'护士',joinTime:'2023-05-10',edu:'本科',school:'咸阳职业技术学院',gradTime:'2019-06-30',workTime:'2019-07-01',birthday:'1996-12-05',desc:'',status:1},
|
||||
{id:7,username:'tongyuan_doc07',name:'屈二娃',sex:'男',unit:'采油二厂',point:'桐园作业区医疗点',idCard:'612121********3612',tel:'137****8826',job:'住院医师',post:'医生',joinTime:'2024-07-01',edu:'本科',school:'西安医学院',gradTime:'2022-06-30',workTime:'2022-07-01',birthday:'1998-03-20',desc:'新入职,跟诊培养中。',status:1},
|
||||
{id:8,username:'xf_lab08',name:'霍静怡',sex:'女',unit:'第四采油厂',point:'西峰基地医疗点',idCard:'621021********7745',tel:'158****3319',job:'技师',post:'检验人员',joinTime:'2020-09-01',edu:'本科',school:'甘肃医学院',gradTime:'2016-06-30',workTime:'2016-07-01',birthday:'1993-08-14',desc:'负责血液、尿液常规检验。',status:1},
|
||||
{id:9,username:'jb_rad09',name:'康永强',sex:'男',unit:'采气一厂',point:'靖边气田医疗点',idCard:'612722********4218',tel:'131****7652',job:'主治医师',post:'放射人员',joinTime:'2021-11-15',edu:'本科',school:'榆林学院医学院',gradTime:'2013-06-30',workTime:'2013-07-01',birthday:'1990-05-30',desc:'兼任DR拍片与读片工作。',status:0},
|
||||
{id:10,username:'wsq_nur10',name:'花灵芝',sex:'女',unit:'采气一厂',point:'乌审旗采气区医疗点',idCard:'152722********2136',tel:'147****0285',job:'主管护师',post:'护士',joinTime:'2019-03-01',edu:'大专',school:'蒙东卫生学校',gradTime:'2011-06-30',workTime:'2011-07-01',birthday:'1989-10-09',desc:'蒙汉双语医护。',status:1},
|
||||
{id:11,username:'wsq_doc11',name:'荣大海',sex:'男',unit:'采气一厂',point:'乌审旗采气区医疗点',idCard:'150212********3351',tel:'133****5917',job:'副主任医师',post:'医生',joinTime:'2018-06-01',edu:'硕士',school:'内蒙古医科大学',gradTime:'2006-06-30',workTime:'2006-07-01',birthday:'1981-01-26',desc:'高寒沙尘环境急救经验丰富。',status:1},
|
||||
{id:12,username:'jyuan_doc12',name:'牛玉洁',sex:'女',unit:'采油一厂',point:'姬塬作业区医疗点',idCard:'610121********9064',tel:'159****4471',job:'护师',post:'药师',joinTime:'2022-08-01',edu:'本科',school:'陕西能源职业技术学院',gradTime:'2018-06-30',workTime:'2018-07-01',birthday:'1995-07-11',desc:'兼职医疗点药品与库存管理。',status:1}
|
||||
{id:1,username:'fanyx_doc01',name:'韩东学',sex:'男',unit:'采油一厂',point:'樊学作业区医疗点',idCard:'622101198804121537',tel:'13972355218',job:'主治医师',post:'医生',joinTime:'2021-03-01',edu:'本科',school:'西安医学院',gradTime:'2012-06-30',workTime:'2012-07-01',birthday:'1988-04-12',desc:'从事油田一线全科医疗十年,擅长外伤处置与慢性病管理。',status:1},
|
||||
{id:2,username:'fanyx_nur02',name:'兰小娟',sex:'女',unit:'采油一厂',point:'樊学作业区医疗点',idCard:'610621199109233246',tel:'13544266174',job:'主管护师',post:'护士',joinTime:'2021-03-01',edu:'大专',school:'延安大学医护学院',gradTime:'2014-06-30',workTime:'2014-07-01',birthday:'1991-09-23',desc:'负责医疗点护理与药品管理。',status:1},
|
||||
{id:3,username:'anse_doc03',name:'白宇峰',sex:'男',unit:'采油一厂',point:'安塞采油队长住点医疗室',idCard:'612524198511020817',tel:'15092148357',job:'副主任医师',post:'医生',joinTime:'2020-06-15',edu:'硕士',school:'陕西中医药大学',gradTime:'2010-06-30',workTime:'2010-07-01',birthday:'1985-11-02',desc:'常驻点医疗室负责人,心血管方向。',status:1},
|
||||
{id:4,username:'jyuan_doc04',name:'温亚丽',sex:'女',unit:'采油一厂',point:'姬塬作业区医疗点',idCard:'640321199202176624',tel:'13361589481',job:'主治医师',post:'医生',joinTime:'2022-08-01',edu:'本科',school:'宁夏医科大学',gradTime:'2015-06-30',workTime:'2015-07-01',birthday:'1992-02-17',desc:'擅长高原作业区多发病防治。',status:1},
|
||||
{id:5,username:'jgt_doc05',name:'窦志远',sex:'男',unit:'采油二厂',point:'姬圪台作业区医疗点',idCard:'612721198306280933',tel:'15534296703',job:'主任医师',post:'医生',joinTime:'2019-04-01',edu:'硕士',school:'兰州大学医学院',gradTime:'2008-06-30',workTime:'2008-07-01',birthday:'1983-06-28',desc:'医疗点学科带头人。',status:1},
|
||||
{id:6,username:'jgt_nur06',name:'苗慧敏',sex:'女',unit:'采油二厂',point:'姬圪台作业区医疗点',idCard:'610421199612054528',tel:'18655072940',job:'护师',post:'护士',joinTime:'2023-05-10',edu:'本科',school:'咸阳职业技术学院',gradTime:'2019-06-30',workTime:'2019-07-01',birthday:'1996-12-05',desc:'',status:1},
|
||||
{id:7,username:'tongyuan_doc07',name:'屈二娃',sex:'男',unit:'采油二厂',point:'桐园作业区医疗点',idCard:'612121199803203612',tel:'13726818826',job:'住院医师',post:'医生',joinTime:'2024-07-01',edu:'本科',school:'西安医学院',gradTime:'2022-06-30',workTime:'2022-07-01',birthday:'1998-03-20',desc:'新入职,跟诊培养中。',status:1},
|
||||
{id:8,username:'xf_lab08',name:'霍静怡',sex:'女',unit:'第四采油厂',point:'西峰基地医疗点',idCard:'621021199308147745',tel:'15877463319',job:'技师',post:'检验人员',joinTime:'2020-09-01',edu:'本科',school:'甘肃医学院',gradTime:'2016-06-30',workTime:'2016-07-01',birthday:'1993-08-14',desc:'负责血液、尿液常规检验。',status:1},
|
||||
{id:9,username:'jb_rad09',name:'康永强',sex:'男',unit:'采气一厂',point:'靖边气田医疗点',idCard:'612722199005304218',tel:'13120897652',job:'主治医师',post:'放射人员',joinTime:'2021-11-15',edu:'本科',school:'榆林学院医学院',gradTime:'2013-06-30',workTime:'2013-07-01',birthday:'1990-05-30',desc:'兼任DR拍片与读片工作。',status:0},
|
||||
{id:10,username:'wsq_nur10',name:'花灵芝',sex:'女',unit:'采气一厂',point:'乌审旗采气区医疗点',idCard:'152722198910092136',tel:'14766030285',job:'主管护师',post:'护士',joinTime:'2019-03-01',edu:'大专',school:'蒙东卫生学校',gradTime:'2011-06-30',workTime:'2011-07-01',birthday:'1989-10-09',desc:'蒙汉双语医护。',status:1},
|
||||
{id:11,username:'wsq_doc11',name:'荣大海',sex:'男',unit:'采气一厂',point:'乌审旗采气区医疗点',idCard:'150212198101263351',tel:'13381525917',job:'副主任医师',post:'医生',joinTime:'2018-06-01',edu:'硕士',school:'内蒙古医科大学',gradTime:'2006-06-30',workTime:'2006-07-01',birthday:'1981-01-26',desc:'高寒沙尘环境急救经验丰富。',status:1},
|
||||
{id:12,username:'jyuan_doc12',name:'牛玉洁',sex:'女',unit:'采油一厂',point:'姬塬作业区医疗点',idCard:'610121199507119064',tel:'15929064471',job:'护师',post:'药师',joinTime:'2022-08-01',edu:'本科',school:'陕西能源职业技术学院',gradTime:'2018-06-30',workTime:'2018-07-01',birthday:'1995-07-11',desc:'兼职医疗点药品与库存管理。',status:1}
|
||||
];
|
||||
var nextId=13,editingId=null,pendingDel=[];
|
||||
var pageSize=10,currentPage=1,checked={};
|
||||
@@ -385,10 +393,12 @@ function onPointFocus(){
|
||||
/* ===== 列表渲染 ===== */
|
||||
function currentData(){
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var account=document.getElementById('filterAccount').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
return staff.filter(function(s){
|
||||
if(name&&s.name.indexOf(name)<0)return false;
|
||||
if(account&&s.username.indexOf(account)<0)return false;
|
||||
if(unit&&s.unit!==unit)return false;
|
||||
if(point&&s.point!==point)return false;
|
||||
return true;
|
||||
@@ -406,6 +416,7 @@ function renderTable(){
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td><div class="avatar-cell" style="background:'+sexColor+';">'+s.name.charAt(0)+'</div></td>'
|
||||
+'<td style="color:var(--text-primary);font-weight:600;">'+s.name+'</td>'
|
||||
+'<td>'+s.username+'</td>'
|
||||
+'<td>'+s.unit+'</td><td>'+s.point+'</td>'
|
||||
+'<td>'+s.sex+'</td>'
|
||||
+'<td>'+(calcAge(s.birthday)||'--')+'</td>'
|
||||
@@ -419,7 +430,7 @@ function renderTable(){
|
||||
+'<button class="btn btn-link btn-link--danger" onclick="askDelete(['+s.id+'])">删除</button>'
|
||||
+'</td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('tableBody').innerHTML=html||'<tr><td colspan="17" style="text-align:center;padding:32px;color:var(--text-placeholder);">暂无符合条件的医护人员</td></tr>';
|
||||
document.getElementById('tableBody').innerHTML=html||'<tr><td colspan="18" style="text-align:center;padding:32px;color:var(--text-placeholder);">暂无符合条件的医护人员</td></tr>';
|
||||
document.getElementById('pageInfo').textContent='共 '+total+' 条';
|
||||
document.getElementById('pageNum').textContent=currentPage+' / '+pages;
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
@@ -430,6 +441,7 @@ function turnPage(d){currentPage+=d;renderTable();}
|
||||
function applyFilter(){currentPage=1;checked={};renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterAccount').value='';
|
||||
document.getElementById('filterUnit').value='';
|
||||
onFilterUnit();
|
||||
currentPage=1;checked={};renderTable();
|
||||
@@ -459,7 +471,6 @@ function openForm(id){
|
||||
document.querySelector('input[name=fSex][value="'+(s?s.sex:'男')+'"]').checked=true;
|
||||
document.getElementById('fIdCard').value=s?s.idCard:'';
|
||||
document.getElementById('fTel').value=s?s.tel:'';
|
||||
document.getElementById('fBirthday').value=s?s.birthday:'';
|
||||
document.getElementById('fJoinTime').value=s?s.joinTime:'';
|
||||
document.getElementById('fEdu').value=s?s.edu:'';
|
||||
document.getElementById('fSchool').value=s?s.school:'';
|
||||
@@ -472,12 +483,16 @@ function openForm(id){
|
||||
fu.value=s?s.unit:'';
|
||||
onFormUnit();
|
||||
if(s)fp.value=s.point;
|
||||
fillOptions(document.getElementById('fJob'),jobOptions,'请选择职称');
|
||||
fillOptions(document.getElementById('fPost'),postOptions,'请选择岗位');
|
||||
document.getElementById('fJob').value=s?s.job:'';
|
||||
document.getElementById('fPost').value=s?s.post:'';
|
||||
onFormPost();
|
||||
document.getElementById('fJob').value=s?s.job:'';
|
||||
openDrawer('form');
|
||||
}
|
||||
function onFormPost(){
|
||||
var post=document.getElementById('fPost').value;
|
||||
fillOptions(document.getElementById('fJob'),jobOptionsMap[post]||[],post?'请选择职称':'请先选择岗位');
|
||||
}
|
||||
function onFormUnit(){
|
||||
var u=document.getElementById('fUnit').value;
|
||||
fillOptions(document.getElementById('fPoint'),pointMap[u]||[],u?'请选择医疗点':'请先选择所属单位');
|
||||
@@ -496,7 +511,8 @@ function saveForm(){
|
||||
var un=document.getElementById('fUsername').value.trim();
|
||||
if(!un)return showToast('请输入用户账号');
|
||||
var p1=document.getElementById('fPwd').value,p2=document.getElementById('fPwd2').value;
|
||||
if(!(/[A-Za-z]/.test(p1)&&/\d/.test(p1)&&p1.length>=8))return showToast('密码至少8位且含字母和数字');
|
||||
if(p1.length<12)return showToast('密码不能少于12位');
|
||||
if(!/[A-Z]/.test(p1)||!/[a-z]/.test(p1)||!/\d/.test(p1)||!/[^A-Za-z0-9]/.test(p1))return showToast('密码必须包含大小写字母、数字以及特殊符号');
|
||||
if(p1!==p2)return showToast('两次输入的密码不一致');
|
||||
}else{
|
||||
var cur=staff.find(function(x){return x.id===editingId;});
|
||||
@@ -510,7 +526,7 @@ function saveForm(){
|
||||
if(!document.getElementById('fJoinTime').value)return showToast('请选择驻点时间');
|
||||
if(!job)return showToast('请选择职称');
|
||||
if(!post)return showToast('请选择岗位');
|
||||
var data={name:name,sex:getRadio('fSex'),idCard:idCard,mask:true,tel:tel,birthday:document.getElementById('fBirthday').value,
|
||||
var data={name:name,sex:getRadio('fSex'),idCard:idCard,tel:tel,
|
||||
unit:unit,point:point,joinTime:document.getElementById('fJoinTime').value,job:job,post:post,
|
||||
edu:document.getElementById('fEdu').value,school:document.getElementById('fSchool').value,
|
||||
gradTime:document.getElementById('fGradTime').value,workTime:document.getElementById('fWorkTime').value,
|
||||
@@ -521,9 +537,6 @@ function saveForm(){
|
||||
showToast('保存成功(演示)');
|
||||
}else{
|
||||
data.id=nextId++;data.username=un;
|
||||
/* 列表电话/身份证按脱敏格式展示 */
|
||||
data.tel=tel.slice(0,3)+'****'+tel.slice(7);
|
||||
data.idCard=idCard.slice(0,6)+'********'+idCard.slice(14);
|
||||
staff.push(data);showToast('新增成功(演示)');
|
||||
}
|
||||
closeDrawer('form');renderTable();
|
||||
|
||||
@@ -145,7 +145,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -162,28 +162,10 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item active">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -174,28 +174,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item active">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item active">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
@@ -280,11 +262,9 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品名称</span><input class="form-control" id="fName" placeholder="请输入药品名称"></div>
|
||||
<div class="form-item"><span class="form-label">别名</span><input class="form-control" id="fAlias" placeholder="请输入别名(选填)"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品单位</span>
|
||||
<select class="form-control" id="fMUnit"><option>盒</option><option>瓶</option><option>支</option><option>袋</option><option>片</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品单位</span><input class="form-control" id="fMUnit" placeholder="例如:盒"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品规格</span><input class="form-control" id="fSpec" placeholder="如 0.25g×24粒/盒"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品类别</span>
|
||||
<select class="form-control" id="fType"><option>处方药</option><option>OTC甲类</option><option>OTC乙类</option><option>中成药</option><option>医用耗材</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药品类别</span><input class="form-control" id="fType" placeholder="例如:处方药"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 入库日期</span><input class="form-control" id="fDate" type="date"></div>
|
||||
</div>
|
||||
<div class="form-section__title">库存与价格</div>
|
||||
@@ -292,8 +272,6 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 现存数量</span><input class="form-control" id="fStock" type="number" min="1" placeholder="请输入大于0的数字"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 进价(元)</span><input class="form-control" id="fBuy" type="number" min="0.01" step="0.01" placeholder="请输入大于0的数字"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 售价(元)</span><input class="form-control" id="fSell" type="number" min="0.01" step="0.01" placeholder="请输入大于0的数字"></div>
|
||||
<div class="form-item"><span class="form-label">售出数量</span><input class="form-control" id="fSold" type="number" min="0" placeholder="累计售出"></div>
|
||||
<div class="form-item"><span class="form-label">销售金额(元)</span><input class="form-control" id="fMoney" type="number" min="0" placeholder="自动=售价×售出数量,可改"></div>
|
||||
</div>
|
||||
<div class="form-section__title">说明书</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">药品说明书图片(支持批量上传,.png/.jpg,最多10张)</span>
|
||||
@@ -332,6 +310,9 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drop-zone" onclick="showToast('演示环境请选择本地文件(仅支持.xlsx)')">
|
||||
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" style="display:block;margin:0 auto 6px;"><path d="M13 17V5M8.5 9.5L13 5l4.5 4.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/><path d="M4 20h18" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
|
||||
点击选择或拖拽文件到此处上传<br>药品信息导入模板.xlsx
|
||||
</div>
|
||||
<div style="font-size:var(--font-xs);color:var(--text-placeholder);margin-top:6px;">
|
||||
<a href="javascript:void(0)" style="color:var(--primary);text-decoration:none;" onclick="showToast('模板下载中…')">下载导入模板</a> · 请按模板列整理后上传
|
||||
</div></div>
|
||||
<div class="modal__footer" style="margin-top:20px;">
|
||||
<button class="btn btn-default" onclick="closeModal('importMask')">取消</button>
|
||||
@@ -391,6 +372,8 @@ var meds=[
|
||||
{id:11,name:'碘伏棉签',alias:'',unit:'采气一厂',point:'靖边气田医疗点',mUnit:'袋',spec:'50支/袋',type:'医用耗材',date:'2026-07-22',stock:76,buy:4.50,sell:6.00,sold:64,money:384},
|
||||
{id:12,name:'医用弹性绷带',alias:'',unit:'采气一厂',point:'乌审旗采气区医疗点',mUnit:'卷',spec:'8cm×4.5m',type:'医用耗材',date:'2026-06-08',stock:29,buy:5.20,sell:7.50,sold:41,money:307.50}
|
||||
];
|
||||
/* 无说明书的药品(演示:列表隐藏「查看」按钮,显示「—」) */
|
||||
var noSpecIds=[7,10,11,12];
|
||||
var editId=null,delIds=[];
|
||||
|
||||
/* ===== 级联选项 ===== */
|
||||
@@ -441,7 +424,7 @@ function renderTable(){
|
||||
+'<td>'+(m.alias||'—')+'</td>'
|
||||
+'<td>'+m.unit+'</td><td>'+m.point+'</td><td>'+m.mUnit+'</td><td>'+m.spec+'</td>'
|
||||
+'<td><span class="badge badge--info">'+m.type+'</span></td>'
|
||||
+'<td><button class="btn btn-link" onclick="openSpec('+m.id+')">查看</button></td>'
|
||||
+'<td>'+(noSpecIds.indexOf(m.id)===-1?'<button class="btn btn-link" onclick="openSpec('+m.id+')">查看</button>':'—')+'</td>'
|
||||
+'<td>'+m.date+'</td>'
|
||||
+'<td>'+stockBadge+'</td>'
|
||||
+'<td class="td-num">'+m.buy.toFixed(2)+'</td>'
|
||||
@@ -486,7 +469,7 @@ function batchDelete(){
|
||||
function openForm(title){
|
||||
document.getElementById('formTitle').textContent=title;
|
||||
editId=null;
|
||||
['fName','fAlias','fSpec','fDate','fStock','fBuy','fSell','fSold','fMoney'].forEach(function(id){document.getElementById(id).value='';});
|
||||
['fName','fAlias','fSpec','fDate','fStock','fBuy','fSell','fMUnit','fType'].forEach(function(id){document.getElementById(id).value='';});
|
||||
document.getElementById('fUnit').value='';
|
||||
onFormUnit();
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
@@ -507,8 +490,6 @@ function openEdit(id){
|
||||
document.getElementById('fStock').value=m.stock;
|
||||
document.getElementById('fBuy').value=m.buy;
|
||||
document.getElementById('fSell').value=m.sell;
|
||||
document.getElementById('fSold').value=m.sold;
|
||||
document.getElementById('fMoney').value=m.money;
|
||||
}
|
||||
function saveForm(){
|
||||
var unit=document.getElementById('fUnit').value;
|
||||
|
||||
@@ -96,6 +96,13 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.drawer__body{flex:1;overflow-y:auto;padding:24px;}
|
||||
.drawer__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
|
||||
/* 抽屉内医院信息卡片(医院名称/等级) */
|
||||
.drawer-hosp-info{display:flex;gap:20px;font-weight:600;margin-bottom:14px;font-size:var(--font-base);}
|
||||
|
||||
/* 管辖范围抽屉:加宽,列表不换行 */
|
||||
.drawer--jur{width:900px;right:-900px;}
|
||||
#jurDrawer .mini-table td{white-space:nowrap;}
|
||||
|
||||
/* 表单 */
|
||||
.form-item{display:flex;flex-direction:column;gap:6px;margin-bottom:14px;}
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
@@ -111,6 +118,24 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
.drawer__toolbar{display:flex;align-items:center;gap:8px;margin-bottom:14px;}
|
||||
.drawer__toolbar .grow{margin-left:auto;font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
|
||||
/* 可搜索下拉(选择医院) */
|
||||
.search-select{position:relative;}
|
||||
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 32px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
|
||||
.search-select__input:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
|
||||
.search-select__dropdown{position:absolute;top:44px;left:0;right:0;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:0 4px 12px rgba(0,0,0,0.1);max-height:220px;overflow-y:auto;z-index:10;display:none;}
|
||||
.search-select__dropdown.show{display:block;}
|
||||
.search-select__option{padding:10px 12px;font-size:var(--font-sm);cursor:pointer;transition:background .15s;color:var(--text-primary);}
|
||||
.search-select__option:hover,.search-select__option.active{background:var(--primary-light);color:var(--primary);}
|
||||
.search-select__empty{padding:10px 12px;font-size:var(--font-sm);color:var(--text-placeholder);text-align:center;}
|
||||
.search-select__input[readonly]{background:#F5F7FA;color:var(--text-secondary);cursor:not-allowed;}
|
||||
/* 医院信息卡片 */
|
||||
.hospital-info{background:#F5F7FA;border-radius:var(--radius-sm);padding:12px;margin-bottom:16px;display:none;}
|
||||
.hospital-info.show{display:block;}
|
||||
.hospital-info__item{display:flex;justify-content:space-between;font-size:var(--font-sm);margin-bottom:8px;}
|
||||
.hospital-info__item:last-child{margin-bottom:0;}
|
||||
.hospital-info__label{color:var(--text-secondary);}
|
||||
.hospital-info__value{color:var(--text-primary);font-weight:500;}
|
||||
|
||||
/* 确认弹窗 */
|
||||
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:950;align-items:center;justify-content:center;}
|
||||
.modal-mask.open{display:flex;}
|
||||
@@ -133,7 +158,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html" class="active">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -150,28 +175,10 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">基础配置</div>
|
||||
<a href="config-medical-point.html" class="sidebar-item">医疗点配置</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item active">合作医院</a>
|
||||
<a href="config-partner-hospital.html" class="sidebar-item active">合作医院配置</a>
|
||||
<a href="config-medical-staff.html" class="sidebar-item">医护人员管理</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
医药配置
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-medicine.html" class="sidebar-item">药品信息</a>
|
||||
<a href="config-medicine-stock.html" class="sidebar-item">实时库存</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
|
||||
<svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>
|
||||
员工分配管理
|
||||
</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="config-allocate.html" class="sidebar-item">分配管理</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">分配统计</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="config-medicine.html" class="sidebar-item">医疗点医药管理</a>
|
||||
<a href="config-allocate.html" class="sidebar-item">员工分配管理</a>
|
||||
<a href="config-ambulance.html" class="sidebar-item">救护车配置</a>
|
||||
</aside>
|
||||
|
||||
@@ -224,21 +231,23 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
|
||||
<!-- [交互] 管辖范围抽屉(当前医院已管辖医疗点 + 添加) -->
|
||||
<div class="drawer-mask" id="jurMask" onclick="closeDrawer('jur')"></div>
|
||||
<div class="drawer" id="jurDrawer">
|
||||
<div class="drawer drawer--jur" id="jurDrawer">
|
||||
<div class="drawer__header"><span id="jurTitle">管辖范围</span><button class="drawer__close" onclick="closeDrawer('jur')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<!-- 医院信息 -->
|
||||
<div class="drawer-hosp-info">
|
||||
<span id="jurHospName"></span><span id="jurHospLevel"></span>
|
||||
</div>
|
||||
<div class="drawer__toolbar">
|
||||
<button class="btn btn-primary" onclick="openPick()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>添加医疗点
|
||||
</button>
|
||||
<span class="grow">医疗点归属唯一合作医院,添加后将从可选列表中移除</span>
|
||||
</div>
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th>医疗点名称</th><th>所属单位</th><th>医疗点地址</th><th>负责人</th><th>设立时间</th><th>操作</th></tr></thead>
|
||||
<tbody id="jurBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('jur')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 添加管辖医疗点选择弹窗 -->
|
||||
@@ -277,34 +286,20 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer__header"><span>医院管理员</span><button class="drawer__close" onclick="closeDrawer('admin')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<!-- 医院信息 -->
|
||||
<div style="display:flex;gap:20px;font-weight:600;margin-bottom:14px;font-size:var(--font-base);">
|
||||
<div class="drawer-hosp-info">
|
||||
<span id="adminHospName"></span><span id="adminHospLevel"></span>
|
||||
</div>
|
||||
<div class="drawer__toolbar">
|
||||
<button class="btn btn-primary" onclick="showAdminForm(null)">
|
||||
<button class="btn btn-primary" onclick="openAddAdmin()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增管理员
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="batchRemoveAdmin()">批量删除</button>
|
||||
</div>
|
||||
<!-- [交互] 新增/编辑管理员表单(页内展开) -->
|
||||
<div id="adminForm" style="display:none;border:1px solid var(--border);border-radius:var(--radius-sm);padding:16px;margin-bottom:14px;background:#FAFCFF;">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 账号(仅字母数字下划线)</span><input class="form-control" id="aUser" placeholder="如 hospital_admin01"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 姓名</span><input class="form-control" id="aName" placeholder="请输入姓名"></div>
|
||||
<div id="aPwdGroup">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 初始密码</span><input class="form-control" id="aPwd" type="password" placeholder="不少于8位,含大小写字母与数字"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 确认密码</span><input class="form-control" id="aPwd2" type="password" placeholder="请再次输入密码"></div>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:flex-end;gap:8px;">
|
||||
<button class="btn btn-default" onclick="hideAdminForm()">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveAdmin()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th style="width:36px"><input type="checkbox" onchange="adminPickAll(this)"></th><th>账号</th><th>姓名</th><th>创建时间</th><th>操作</th></tr></thead>
|
||||
<tbody id="adminBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('admin')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 新增/编辑合作医院抽屉 -->
|
||||
@@ -312,19 +307,26 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer" id="hpDrawer">
|
||||
<div class="drawer__header"><span id="hpTitle">新增合作医院</span><button class="drawer__close" onclick="closeDrawer('hp')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<!-- 医院下拉选择(新增可选,编辑锁定) -->
|
||||
<!-- 选择医院(可搜索下拉) -->
|
||||
<div class="form-item">
|
||||
<span class="form-label"><span class="req">*</span> 医院名称</span>
|
||||
<select class="form-control" id="hpSelect" onchange="onHpSelect()"></select>
|
||||
<span class="form-label"><span class="req">*</span> 选择医院</span>
|
||||
<div class="search-select" id="hpSearch">
|
||||
<input type="text" class="search-select__input" id="hpSearchInput" placeholder="请输入医院名称搜索" autocomplete="off">
|
||||
<input type="hidden" id="hpSelect">
|
||||
<div class="search-select__dropdown" id="hpSearchDropdown"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 回显基本信息(不含管理员) -->
|
||||
<div class="form-item"><span class="form-label">医院级别</span><input class="form-control" id="hpLevel" readonly></div>
|
||||
<div class="form-item">
|
||||
<span class="form-label">医院主图</span>
|
||||
<div style="display:flex;align-items:center;gap:12px;"><span class="img-ph">🏥</span><span style="font-size:var(--font-xs);color:var(--text-placeholder);">由系统管理模块维护</span></div>
|
||||
<!-- 医院信息卡片(级别/地址) -->
|
||||
<div class="hospital-info" id="hpInfo">
|
||||
<div class="hospital-info__item">
|
||||
<span class="hospital-info__label">医院级别:</span>
|
||||
<span class="hospital-info__value" id="hpLevel"></span>
|
||||
</div>
|
||||
<div class="hospital-info__item">
|
||||
<span class="hospital-info__label">详细地址:</span>
|
||||
<span class="hospital-info__value" id="hpAddr"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item"><span class="form-label">详细地址</span><input class="form-control" id="hpAddr" readonly></div>
|
||||
<div class="form-item"><span class="form-label">医院简介</span><textarea class="form-control" id="hpIntro" rows="3" readonly style="resize:none;height:auto;padding:8px 10px;"></textarea></div>
|
||||
</div>
|
||||
<div class="drawer__footer">
|
||||
<button class="btn btn-default" onclick="closeDrawer('hp')">取消</button>
|
||||
@@ -332,6 +334,34 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 新增管理员弹窗 -->
|
||||
<div class="modal-mask" id="addAdminMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title">新增管理员</div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 姓名</span><input class="form-control" id="naName" placeholder="请输入姓名"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 账号</span><input class="form-control" id="naUser" placeholder="如 hospital_admin01"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 密码</span><input class="form-control" id="naPwd" type="password" placeholder="密码不能少于12位,必须包含大小写字母、数字以及特殊符号"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 确认密码</span><input class="form-control" id="naPwd2" type="password" placeholder="请再次输入密码"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('addAdminMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveNewAdmin()">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 编辑管理员弹窗 -->
|
||||
<div class="modal-mask" id="editAdminMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title">编辑管理员</div>
|
||||
<div style="font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:14px;">账号:<span id="eaUser" style="font-weight:600;color:var(--text-primary);"></span></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 姓名</span><input class="form-control" id="eaName" placeholder="请输入姓名"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('editAdminMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveAdmin()">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 重置密码弹窗 -->
|
||||
<div class="modal-mask" id="resetPwdMask">
|
||||
<div class="modal">
|
||||
@@ -398,15 +428,14 @@ function renderTable(){
|
||||
var html='';
|
||||
list.forEach(function(h,i){
|
||||
var lvBadge=h.level==='三级甲等'?'<span class="badge badge--danger">三级甲等</span>':(h.level==='二级甲等'?'<span class="badge badge--info">二级甲等</span>':'<span class="badge badge--muted">'+h.level+'</span>');
|
||||
var adminNames=h.admins.length?h.admins.map(function(a){return a[1];}).join('、'):'<span style="color:var(--text-placeholder);">未设置</span>';
|
||||
html+='<tr>'
|
||||
+'<td>'+(i+1)+'</td>'
|
||||
+'<td style="text-align:left;font-weight:600;">'+h.name+'</td>'
|
||||
+'<td>'+lvBadge+'</td>'
|
||||
+'<td><span class="img-ph">🏥</span></td>'
|
||||
+'<td style="text-align:left;max-width:240px;overflow:hidden;text-overflow:ellipsis;">'+h.addr+'</td>'
|
||||
+'<td><button class="btn btn-link" onclick="openJur('+h.id+')">'+jurCount(h.name)+' 个医疗点</button></td>'
|
||||
+'<td style="text-align:left;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:normal;">'+adminNames+'</td>'
|
||||
+'<td><button class="btn btn-link" onclick="openJur('+h.id+')">'+jurCount(h.name)+'</button></td>'
|
||||
+'<td><button class="btn btn-link" onclick="openAdmin('+h.id+')">'+h.admins.length+'</button></td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openJur('+h.id+')">管辖范围</button>'
|
||||
+'<button class="btn btn-link" onclick="openAdmin('+h.id+')">管理员</button>'
|
||||
@@ -422,7 +451,8 @@ function resetFilter(){document.getElementById('filterName').value='';document.g
|
||||
function hospById(id){return sysHospitals.find(function(h){return h.id===id;});}
|
||||
function openJur(id){
|
||||
curHosp=hospById(id);
|
||||
document.getElementById('jurTitle').textContent='管辖范围 · '+curHosp.name;
|
||||
document.getElementById('jurHospName').textContent='医院名称:'+curHosp.name;
|
||||
document.getElementById('jurHospLevel').textContent='医院等级:'+curHosp.level;
|
||||
renderJur();
|
||||
document.getElementById('jurMask').classList.add('open');
|
||||
document.getElementById('jurDrawer').classList.add('open');
|
||||
@@ -495,33 +525,63 @@ function confirmRemove(){
|
||||
closeModal('delMask');
|
||||
}
|
||||
|
||||
/* ===== 新增/编辑合作医院抽屉 ===== */
|
||||
/* ===== 新增合作医院抽屉 ===== */
|
||||
var hpSelected=null;
|
||||
function openHospital(){
|
||||
document.getElementById('hpTitle').textContent='新增合作医院';
|
||||
var sel=document.getElementById('hpSelect');
|
||||
var opts=sysHospitals.filter(function(x){return !x.partner;});
|
||||
sel.innerHTML='<option value="">请选择医院</option>'+opts.map(function(x){return '<option value="'+x.id+'">'+x.name+'</option>';}).join('');
|
||||
sel.disabled=false;
|
||||
hpSelected=null;
|
||||
document.getElementById('hpSearchInput').value='';
|
||||
document.getElementById('hpSelect').value='';
|
||||
clearHpEcho();
|
||||
document.getElementById('hpMask').classList.add('open');
|
||||
document.getElementById('hpDrawer').classList.add('open');
|
||||
}
|
||||
/* 可选医院:系统主数据池中尚未标记为合作医院的 */
|
||||
function hpCandidates(){
|
||||
return sysHospitals.filter(function(x){return !x.partner;});
|
||||
}
|
||||
function renderHpOptions(keyword){
|
||||
var dd=document.getElementById('hpSearchDropdown');
|
||||
var hidden=document.getElementById('hpSelect');
|
||||
var kw=(keyword||'').trim().toLowerCase();
|
||||
dd.innerHTML='';
|
||||
var has=false;
|
||||
hpCandidates().forEach(function(x){
|
||||
if(kw&&x.name.toLowerCase().indexOf(kw)===-1)return;
|
||||
has=true;
|
||||
var opt=document.createElement('div');
|
||||
opt.className='search-select__option';
|
||||
if(hidden.value===String(x.id))opt.classList.add('active');
|
||||
opt.textContent=x.name;
|
||||
opt.onclick=function(){
|
||||
hidden.value=x.id;
|
||||
document.getElementById('hpSearchInput').value=x.name;
|
||||
dd.classList.remove('show');
|
||||
onHpSelect();
|
||||
};
|
||||
dd.appendChild(opt);
|
||||
});
|
||||
if(!has){
|
||||
var empty=document.createElement('div');
|
||||
empty.className='search-select__empty';
|
||||
empty.textContent='无匹配医院';
|
||||
dd.appendChild(empty);
|
||||
}
|
||||
}
|
||||
function onHpSelect(){
|
||||
var id=+document.getElementById('hpSelect').value;
|
||||
hpSelected=id?hospById(id):null;
|
||||
if(hpSelected){echoHp(hpSelected);}else{clearHpEcho();}
|
||||
}
|
||||
function echoHp(h){
|
||||
document.getElementById('hpLevel').value=h.level;
|
||||
document.getElementById('hpAddr').value=h.addr;
|
||||
document.getElementById('hpIntro').value=h.intro||'';
|
||||
document.getElementById('hpLevel').textContent=h.level;
|
||||
document.getElementById('hpAddr').textContent=h.addr;
|
||||
document.getElementById('hpInfo').classList.add('show');
|
||||
}
|
||||
function clearHpEcho(){
|
||||
document.getElementById('hpLevel').value='';
|
||||
document.getElementById('hpAddr').value='';
|
||||
document.getElementById('hpIntro').value='';
|
||||
document.getElementById('hpLevel').textContent='';
|
||||
document.getElementById('hpAddr').textContent='';
|
||||
document.getElementById('hpInfo').classList.remove('show');
|
||||
}
|
||||
function saveHospital(){
|
||||
if(!hpSelected){showToast('请先选择医院');return;}
|
||||
@@ -530,12 +590,32 @@ function saveHospital(){
|
||||
renderTable();
|
||||
showToast('已将「'+hpSelected.name+'」标记为合作医院');
|
||||
}
|
||||
/* 选择医院可搜索下拉交互 */
|
||||
(function(){
|
||||
var input=document.getElementById('hpSearchInput');
|
||||
var dd=document.getElementById('hpSearchDropdown');
|
||||
input.addEventListener('focus',function(){
|
||||
renderHpOptions(input.value);
|
||||
dd.classList.add('show');
|
||||
});
|
||||
input.addEventListener('input',function(){
|
||||
document.getElementById('hpSelect').value='';
|
||||
hpSelected=null;
|
||||
clearHpEcho();
|
||||
renderHpOptions(input.value);
|
||||
dd.classList.add('show');
|
||||
});
|
||||
document.addEventListener('click',function(e){
|
||||
if(!e.target.closest('#hpSearch')){
|
||||
dd.classList.remove('show');
|
||||
}
|
||||
});
|
||||
})();
|
||||
/* ===== 医院管理员抽屉 ===== */
|
||||
function openAdmin(id){
|
||||
curHosp=hospById(id);
|
||||
document.getElementById('adminHospName').textContent='医院名称:'+curHosp.name;
|
||||
document.getElementById('adminHospLevel').textContent='医院等级:'+curHosp.level;
|
||||
hideAdminForm();
|
||||
renderAdmin();
|
||||
document.getElementById('adminMask').classList.add('open');
|
||||
document.getElementById('adminDrawer').classList.add('open');
|
||||
@@ -549,49 +629,48 @@ function renderAdmin(){
|
||||
+'<td>'+a[0]+'</td><td>'+a[1]+'</td><td>'+t+'</td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openResetPwd(\''+a[0]+'\')">重置密码</button>'
|
||||
+'<button class="btn btn-link" onclick="showAdminForm(\''+a[0]+'\')">编辑</button>'
|
||||
+'<button class="btn btn-link" onclick="openEditAdmin(\''+a[0]+'\')">编辑</button>'
|
||||
+'<button class="btn btn-link btn-link--danger" onclick="askRemove(\'admin\',\''+a[0]+'\')">删除</button>'
|
||||
+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="5" class="td-empty">暂未设置管理员</td></tr>';
|
||||
}
|
||||
var adminEditUser=null;
|
||||
function showAdminForm(account){
|
||||
function openEditAdmin(account){
|
||||
adminEditUser=account;
|
||||
document.getElementById('adminForm').style.display='';
|
||||
var u=document.getElementById('aUser');
|
||||
if(account){
|
||||
var a=curHosp.admins.find(function(x){return x[0]===account;});
|
||||
u.value=a[0];u.disabled=true;
|
||||
document.getElementById('aName').value=a[1];
|
||||
document.getElementById('aPwdGroup').style.display='none';
|
||||
}else{
|
||||
u.value='';u.disabled=false;
|
||||
document.getElementById('aName').value='';
|
||||
document.getElementById('aPwd').value='';
|
||||
document.getElementById('aPwd2').value='';
|
||||
document.getElementById('aPwdGroup').style.display='';
|
||||
}
|
||||
}
|
||||
function hideAdminForm(){
|
||||
document.getElementById('adminForm').style.display='none';
|
||||
document.getElementById('aUser').disabled=false;
|
||||
var a=curHosp.admins.find(function(x){return x[0]===account;});
|
||||
document.getElementById('eaUser').textContent=account;
|
||||
document.getElementById('eaName').value=a[1];
|
||||
document.getElementById('editAdminMask').classList.add('open');
|
||||
}
|
||||
function saveAdmin(){
|
||||
var u=document.getElementById('aUser').value.trim(),n=document.getElementById('aName').value.trim();
|
||||
if(!u||!n){showToast('请填写账号与姓名');return;}
|
||||
if(adminEditUser){
|
||||
var a=curHosp.admins.find(function(x){return x[0]===adminEditUser;});
|
||||
a[1]=n;
|
||||
hideAdminForm();renderAdmin();renderTable();
|
||||
showToast('管理员「'+n+'」已更新');
|
||||
}else{
|
||||
var p1=document.getElementById('aPwd').value,p2=document.getElementById('aPwd2').value;
|
||||
if(p1.length<8){showToast('初始密码不少于8位');return;}
|
||||
if(p1!==p2){showToast('两次输入的密码不一致');return;}
|
||||
curHosp.admins.push([u,n]);
|
||||
hideAdminForm();renderAdmin();renderTable();
|
||||
showToast('管理员「'+n+'」已创建');
|
||||
}
|
||||
var n=document.getElementById('eaName').value.trim();
|
||||
if(!n){showToast('请填写姓名');return;}
|
||||
var a=curHosp.admins.find(function(x){return x[0]===adminEditUser;});
|
||||
a[1]=n;
|
||||
closeModal('editAdminMask');
|
||||
renderAdmin();renderTable();
|
||||
showToast('管理员「'+n+'」已更新');
|
||||
}
|
||||
function openAddAdmin(){
|
||||
document.getElementById('naName').value='';
|
||||
document.getElementById('naUser').value='';
|
||||
document.getElementById('naPwd').value='';
|
||||
document.getElementById('naPwd2').value='';
|
||||
document.getElementById('addAdminMask').classList.add('open');
|
||||
}
|
||||
function saveNewAdmin(){
|
||||
var n=document.getElementById('naName').value.trim();
|
||||
var u=document.getElementById('naUser').value.trim();
|
||||
var p1=document.getElementById('naPwd').value,p2=document.getElementById('naPwd2').value;
|
||||
if(!n){showToast('请填写姓名');return;}
|
||||
if(!u){showToast('请填写账号');return;}
|
||||
if(p1.length<12){showToast('密码不能少于12位');return;}
|
||||
if(!/[A-Z]/.test(p1)||!/[a-z]/.test(p1)||!/\d/.test(p1)||!/[^A-Za-z0-9]/.test(p1)){showToast('密码必须包含大小写字母、数字以及特殊符号');return;}
|
||||
if(p1!==p2){showToast('两次输入的密码不一致');return;}
|
||||
curHosp.admins.push([u,n]);
|
||||
closeModal('addAdminMask');
|
||||
renderAdmin();renderTable();
|
||||
showToast('管理员「'+n+'」已创建');
|
||||
}
|
||||
function adminPickAll(el){
|
||||
document.querySelectorAll('.admin-check').forEach(function(c){c.checked=el.checked;});
|
||||
|
||||
@@ -140,7 +140,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -156,13 +156,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item active">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
|
||||
@@ -41,8 +41,20 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.page-header{margin-bottom:16px;display:flex;align-items:center;gap:12px;}
|
||||
.page-header__back{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--primary);text-decoration:none;padding:4px 10px;border:1px solid var(--primary);border-radius:var(--radius-sm);background:#fff;}
|
||||
.page-header__back:hover{background:var(--primary-light);}
|
||||
.emp-card{display:grid;grid-template-columns:repeat(4,1fr);gap:6px 12px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);padding:14px 18px;margin-bottom:16px;font-size:var(--font-sm);color:var(--text-secondary);box-shadow:var(--shadow-sm);}
|
||||
.emp-card b{color:var(--text-primary);font-weight:600;}
|
||||
/* 员工信息卡(名片样式) */
|
||||
.emp-card{position:relative;display:flex;align-items:flex-start;gap:24px;background:#fff;border-radius:var(--radius-md);padding:24px 28px;margin-bottom:16px;box-shadow:var(--shadow-md);overflow:hidden;}
|
||||
.emp-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,#1890FF,#36CFC9);}
|
||||
.emp-card__main{flex:1;min-width:0;}
|
||||
.emp-card__head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
|
||||
.emp-card__name{font-size:22px;font-weight:700;color:var(--text-primary);letter-spacing:.5px;line-height:1.2;}
|
||||
.emp-card__no{font-size:var(--font-sm);color:var(--text-secondary);background:var(--background);border:1px solid var(--border);border-radius:20px;padding:3px 12px;white-space:nowrap;}
|
||||
.emp-card__sub{margin-top:12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:var(--font-sm);}
|
||||
.emp-card__sub .lbl{color:var(--text-placeholder);}
|
||||
.emp-card__divider{height:1px;background:#F0F0F0;margin:16px 0 14px;}
|
||||
.emp-card__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px 28px;}
|
||||
.emp-card__item{display:flex;align-items:baseline;gap:8px;min-width:0;}
|
||||
.emp-card__label{font-size:var(--font-sm);color:var(--text-placeholder);white-space:nowrap;flex-shrink:0;}
|
||||
.emp-card__value{font-size:var(--font-sm);color:var(--text-primary);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.tabs-bar{display:flex;gap:4px;background:#fff;padding:8px 12px 0;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.tab-btn{padding:9px 18px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent;transition:all .2s;}
|
||||
.tab-btn:hover{color:var(--primary);}
|
||||
@@ -59,7 +71,35 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.badge--success{background:#F6FFED;color:#389E0D;border:1px solid #B7EB8F;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
.chip{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;margin-right:6px;}
|
||||
/* 慢病干预疾病标签 */
|
||||
.dtag{display:inline-block;padding:1px 8px;border-radius:4px;font-size:var(--font-xs);margin-right:4px;}
|
||||
.dtag--ht{background:rgba(24,144,255,.15);color:#1890ff;}
|
||||
.dtag--chd{background:rgba(0,195,195,.15);color:#00c3c3;}
|
||||
.dtag--ob{background:rgba(252,163,24,.15);color:#fca318;}
|
||||
.dtag--dm{background:rgba(42,193,139,.15);color:#2ac18b;}
|
||||
.dtag--over{background:rgba(238,101,87,.15);color:#EE6557;}
|
||||
.dtag--other{background:rgba(0,0,0,.06);color:#666;}
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;margin-right:10px;}
|
||||
.link:hover{color:#40a9ff;}
|
||||
.link--danger{color:var(--danger);}
|
||||
.link--danger:hover{color:#ff7875;}
|
||||
.filter-bar{display:flex;align-items:center;gap:10px;padding:14px 20px;border-bottom:1px solid var(--border);}
|
||||
.filter-bar__label{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.filter-input{width:220px;height:30px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.btn{height:30px;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;white-space:nowrap;}
|
||||
.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);}
|
||||
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:950;align-items:center;justify-content:center;}
|
||||
.modal-mask.open{display:flex;}
|
||||
.modal{width:480px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:24px;}
|
||||
.modal__title{font-size:var(--font-base);font-weight:600;margin-bottom:18px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:20px;}
|
||||
.fld{display:flex;align-items:center;gap:8px;font-size:var(--font-sm);color:var(--text-primary);margin-bottom:14px;}
|
||||
.fld__label{width:92px;text-align:right;flex-shrink:0;color:var(--text-secondary);}
|
||||
.fld input{flex:1;height:34px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:0;}
|
||||
.fld input:focus{border-color:var(--primary);}
|
||||
.fld .req{color:var(--danger);}
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
</style>
|
||||
@@ -71,7 +111,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -87,13 +127,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item active">慢病管理</a>
|
||||
@@ -118,49 +152,83 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 员工信息卡(由列表页URL参数带入) -->
|
||||
<div class="emp-card" id="empCard"></div>
|
||||
|
||||
<!-- [交互] Tab 切换:就诊/随访/用药 -->
|
||||
<!-- [交互] Tab 切换:随访/用药方案/就诊 -->
|
||||
<div class="tabs-bar">
|
||||
<button class="tab-btn active" data-tab="visit" onclick="switchTab('visit')">就诊记录</button>
|
||||
<button class="tab-btn" data-tab="follow" onclick="switchTab('follow')">随访记录</button>
|
||||
<button class="tab-btn" data-tab="med" onclick="switchTab('med')">用药记录</button>
|
||||
<button class="tab-btn active" data-tab="follow" onclick="switchTab('follow')">随访记录</button>
|
||||
<button class="tab-btn" data-tab="med" onclick="switchTab('med')">用药方案</button>
|
||||
<button class="tab-btn" data-tab="visit" onclick="switchTab('visit')">就诊记录</button>
|
||||
</div>
|
||||
|
||||
<div class="table-card" id="paneVisit">
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:900px;">
|
||||
<thead><tr><th>序号</th><th>就诊日期</th><th>就诊医疗点</th><th>接诊医生</th><th>诊断</th><th>处置</th></tr></thead>
|
||||
<tbody id="visitBody"></tbody>
|
||||
</table>
|
||||
<div class="table-card" id="paneFollow">
|
||||
<div class="filter-bar">
|
||||
<span class="filter-bar__label">随访日期</span>
|
||||
<input class="filter-input" placeholder="开始日期 ~ 结束日期">
|
||||
<button class="btn btn-default" onclick="showToast('搜索为原型演示交互')">搜 索</button>
|
||||
<span style="flex:1"></span>
|
||||
<button class="btn btn-primary" onclick="showToast('新增随访为原型演示')">+ 新增随访</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-card" id="paneFollow" style="display:none;">
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:900px;">
|
||||
<thead><tr><th>序号</th><th>随访日期</th><th>随访医生</th><th>形式</th><th>症状摘要</th><th>血压</th><th>下次随访</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>随访日期</th><th>随访医生</th><th>症状</th><th>下次随访日期</th><th>操作</th></tr></thead>
|
||||
<tbody id="followBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-card" id="paneMed" style="display:none;">
|
||||
<div class="filter-bar">
|
||||
<input class="filter-input" placeholder="请输入药物名称搜索">
|
||||
<button class="btn btn-default" onclick="showToast('搜索为原型演示交互')">搜 索</button>
|
||||
<span style="flex:1"></span>
|
||||
<button class="btn btn-primary" onclick="openAddMed()">+ 新增用药</button>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:1000px;">
|
||||
<thead><tr><th>序号</th><th>药品名称</th><th>规格</th><th>单次剂量</th><th>频次</th><th>开始时间</th><th>结束时间</th><th>状态</th></tr></thead>
|
||||
<thead><tr><th>药物名称</th><th>规格</th><th>用法用量</th><th>服用开始日期</th><th>服用结束日期</th><th>操作</th></tr></thead>
|
||||
<tbody id="medBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-card" id="paneVisit" style="display:none;">
|
||||
<div class="filter-bar">
|
||||
<span class="filter-bar__label">就诊日期</span>
|
||||
<input class="filter-input" placeholder="开始日期 ~ 结束日期">
|
||||
<button class="btn btn-default" onclick="showToast('搜索为原型演示交互')">搜 索</button>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:900px;">
|
||||
<thead><tr><th>序号</th><th>就诊日期</th><th>就诊医疗点</th><th>就诊医生</th><th>就诊疾病</th><th>操作</th></tr></thead>
|
||||
<tbody id="visitBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- [交互] 新增用药弹窗 -->
|
||||
<div class="modal-mask" id="addMedMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title">新增用药</div>
|
||||
<div class="fld"><span class="fld__label"><span class="req">*</span>药物名称</span><input id="medDrugName" placeholder="请输入或搜索药物名称"></div>
|
||||
<div class="fld"><span class="fld__label">规格</span><input id="medSpec" placeholder="如 5mg×7片"></div>
|
||||
<div class="fld"><span class="fld__label"><span class="req">*</span>用法用量</span><input id="medUsage" placeholder="如 口服,一日1次,一次1片"></div>
|
||||
<div class="fld"><span class="fld__label">服用开始日期</span><input id="medStart" placeholder="YYYY-MM-DD"></div>
|
||||
<div class="fld"><span class="fld__label">服用结束日期</span><input id="medEnd" placeholder="长期可留空"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeAddMed()">取 消</button>
|
||||
<button class="btn btn-primary" onclick="saveMed()">确 认</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏):干预记录按员工编号组织,与慢病管理/随访/就诊台账勾稽 ===== */
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂'};
|
||||
var data={
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',type:['高血压'],
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'15089356127',point:'桐园作业区医疗点',type:['高血压'],
|
||||
visits:[
|
||||
{date:'2026-09-05',doctor:'曲志明',dx:'高血压2级(高危)',rx:'缬沙坦80mg qd;一周后复测'},
|
||||
{date:'2026-08-08',doctor:'曲志明',dx:'高血压2级(新诊断)',rx:'启动规范降压治疗,低盐饮食'}],
|
||||
@@ -177,7 +245,7 @@ var data={
|
||||
{w:'周四~周日',b:'低盐早餐轮换',l:'主食粗细搭配,限盐<5g/日',d:'晚餐少食,睡前不加餐'}],
|
||||
sports:[{n:'快走',t:30,f:'每周5次'},{n:'游泳',t:40,f:'每周1次'},{n:'工间拉伸',t:10,f:'每个工作日'}],
|
||||
advice:'减重目标:3个月减重3kg;戒烟限酒;家庭自测血压每周≥3次并记录。'},
|
||||
'CQ010564':{name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',type:['糖尿病','肥胖'],
|
||||
'CQ010564':{name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'13935720086',point:'西峰基地医疗点',type:['糖尿病','肥胖'],
|
||||
visits:[
|
||||
{date:'2026-09-03',doctor:'闫婷',dx:'2型糖尿病(血糖控制欠佳)',rx:'二甲双胍换缓释剂型;两周复查'},
|
||||
{date:'2026-07-15',doctor:'闫婷',dx:'2型糖尿病',rx:'调整用药方案,加用监测'}],
|
||||
@@ -193,7 +261,7 @@ var data={
|
||||
{w:'周三~周日',b:'少食多餐轮换',l:'主食定量(生重75g/餐)',d:'晚餐18点前,加餐可选黄瓜番茄'}],
|
||||
sports:[{n:'餐后快走',t:30,f:'每日1次'},{n:'抗阻训练(弹力带)',t:20,f:'每周2次'}],
|
||||
advice:'目标空腹血糖<7.0;餐后2小时血糖<10.0;季度复查糖化血红蛋白。'},
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',type:['肥胖','其他'],
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'13675232248',point:'姬圪台作业区医疗点',type:['肥胖','其他'],
|
||||
visits:[
|
||||
{date:'2026-07-10',doctor:'曲志明',dx:'超重;血脂偏高',rx:'生活方式干预,三个月复查血脂'}],
|
||||
follows:[
|
||||
@@ -206,7 +274,7 @@ var data={
|
||||
{w:'周二~周日',b:'低脂早餐轮换',l:'减少油炸,晚餐少食',d:'18:30前完成晚餐'}],
|
||||
sports:[{n:'游泳',t:40,f:'每周2次'},{n:'快走',t:35,f:'每周3次'}],
|
||||
advice:'减重目标:半年减重5%;关注腰椎保护,避免久坐超1小时。'},
|
||||
'CQ021578':{name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',type:['高血压'],
|
||||
'CQ021578':{name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'13945872051',point:'樊学作业区医疗点',type:['高血压'],
|
||||
visits:[
|
||||
{date:'2026-08-28',doctor:'李桂芳',dx:'血压正常高值',rx:'暂不用药,生活方式干预'}],
|
||||
follows:[
|
||||
@@ -216,7 +284,7 @@ var data={
|
||||
{w:'周一~周日',b:'低盐低脂早餐',l:'限盐<5g/日,限酒',d:'晚餐清淡,控制体重'}],
|
||||
sports:[{n:'快走/慢跑',t:35,f:'每周4次'},{n:'羽毛球',t:45,f:'每周1次'}],
|
||||
advice:'血压目标<130/80;每月自测血压记录,连续偏高时及时就诊。'},
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',type:['肥胖'],
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'13359464860',point:'乌审旗采气区医疗点',type:['肥胖'],
|
||||
visits:[
|
||||
{date:'2026-08-26',doctor:'刘玉梅',dx:'中暑恢复期;超重',rx:'补液休息,减重管理'}],
|
||||
follows:[
|
||||
@@ -226,7 +294,7 @@ var data={
|
||||
{w:'周一~周日',b:'清淡补钾早餐',l:'少食腌制,控制主食',d:'夏季作业注意补液'}],
|
||||
sports:[{n:'骑行',t:30,f:'每周3次(避开高温时段)'}],
|
||||
advice:'BMI目标<24;高温作业执行轮换防暑制度。'},
|
||||
'CQ019203':{name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',type:['冠心病'],
|
||||
'CQ019203':{name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'13764128890',point:'姬圪台作业区医疗点',type:['冠心病'],
|
||||
visits:[
|
||||
{date:'2026-06-20',doctor:'张秀兰',dx:'冠状动脉粥样硬化性心脏病(稳定期)',rx:'继续他汀+抗血小板治疗'}],
|
||||
follows:[
|
||||
@@ -238,7 +306,7 @@ var data={
|
||||
{w:'周一~周日',b:'低脂早餐',l:'低脂高纤维,控制体重',d:'晚餐少食多蔬菜'}],
|
||||
sports:[{n:'平地快走',t:25,f:'每周4次(中低强度)'},{n:'八段锦',t:15,f:'每日'}],
|
||||
advice:'随身携带硝酸甘油;避免剧烈与超强度作业;半年复查冠脉评估。'},
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',type:['高血压'],
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'13586247719',point:'靖边气田医疗点',type:['高血压'],
|
||||
visits:[
|
||||
{date:'2026-04-18',doctor:'呼建国',dx:'高血压1级',rx:'启动小剂量降压药'}],
|
||||
follows:[
|
||||
@@ -249,7 +317,7 @@ var data={
|
||||
{w:'周一~周日',b:'低盐早餐',l:'限盐<5g/日',d:'晚餐清淡'}],
|
||||
sports:[{n:'快走',t:30,f:'每周5次'}],
|
||||
advice:'血压目标<130/80;规律服药勿自行停药。'},
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',type:['其他'],
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'14725899003',point:'靖边气田医疗点',type:['其他'],
|
||||
visits:[
|
||||
{date:'2026-07-02',doctor:'刘玉梅',dx:'颈椎病(神经根型)',rx:'理疗+工间操干预'}],
|
||||
follows:[
|
||||
@@ -266,32 +334,61 @@ var data={
|
||||
var params=new URLSearchParams(location.search);
|
||||
var code=params.get('emp')||'CQ033096';
|
||||
var emp=data[code]||data['CQ033096'];
|
||||
var diseaseClass={'高血压':'dtag--ht','冠心病':'dtag--chd','糖尿病':'dtag--dm','肥胖':'dtag--ob','其他':'dtag--other'};
|
||||
function renderHead(){
|
||||
document.title='干预记录 · '+emp.name+' | 一线医疗';
|
||||
var diseasesHtml=(emp.type&&emp.type.length)
|
||||
?emp.type.map(function(d){return '<span class="dtag '+(diseaseClass[d]||'dtag--other')+'">'+d+'</span>';}).join('')
|
||||
:'<span style="color:var(--text-placeholder);">无</span>';
|
||||
function item(k,v){return '<div class="emp-card__item"><span class="emp-card__label">'+k+'</span><span class="emp-card__value">'+v+'</span></div>';}
|
||||
document.getElementById('empCard').innerHTML=
|
||||
'<div>姓名 <b>'+emp.name+'</b></div><div>工号 <b>'+code+'</b></div><div>性别/年龄 <b>'+emp.sex+' / '+emp.age+'岁</b></div><div>慢病类型 <b>'+emp.type.map(function(t){return '<span class="chip" style="margin:0 4px 0 0;">'+t+'</span>';}).join('')+'</b></div>'
|
||||
+'<div>所属单位 <b>'+emp.unit+'</b></div><div>所属部门 <b>'+emp.dept+'</b></div><div>分配医疗点 <b>'+emp.point+'('+pointUnit[emp.point]+')</b></div>';
|
||||
'<div class="emp-card__main">'
|
||||
+'<div class="emp-card__head">'
|
||||
+'<span class="emp-card__name">'+emp.name+'</span>'
|
||||
+'<span class="emp-card__no">员工编号 '+code+'</span>'
|
||||
+'</div>'
|
||||
+'<div class="emp-card__sub"><span class="lbl">慢病干预</span>'+diseasesHtml+'</div>'
|
||||
+'<div class="emp-card__divider"></div>'
|
||||
+'<div class="emp-card__grid">'
|
||||
+item('性别',emp.sex)+item('年龄',emp.age+'岁')+item('联系电话',emp.tel)
|
||||
+item('单位部门',emp.unit+'-'+emp.dept)+item('分配医疗点',emp.point)
|
||||
+item('医疗点所属单位',pointUnit[emp.point])
|
||||
+'</div>'
|
||||
+'</div>';
|
||||
}
|
||||
function switchTab(k){
|
||||
document.querySelectorAll('.tab-btn').forEach(function(b){b.classList.toggle('active',b.dataset.tab===k);});
|
||||
['Visit','Follow','Med'].forEach(function(p){document.getElementById('pane'+p).style.display=(p.toLowerCase()===k)?'':'none';});
|
||||
}
|
||||
function renderAll(){
|
||||
document.getElementById('visitBody').innerHTML=emp.visits.length?emp.visits.map(function(v,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+v.date+'</td><td>'+emp.point+'</td><td>'+v.doctor+'</td><td style="text-align:left;">'+v.dx+'</td><td style="text-align:left;">'+v.rx+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="6" class="td-empty">近12个月暂无就诊记录</td></tr>';
|
||||
document.getElementById('followBody').innerHTML=emp.follows.length?emp.follows.map(function(f,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+f.date+'</td><td>'+f.doctor+'</td><td><span class="badge badge--info">'+f.form+'</span></td><td style="text-align:left;">'+f.sym+'</td><td>'+f.bp+'</td><td>'+f.next+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="7" class="td-empty">暂无随访记录</td></tr>';
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+f.date+'</td><td>'+f.doctor+'</td><td style="text-align:left;">'+f.sym+'</td><td>'+f.next+'</td>'
|
||||
+'<td><a class="link" onclick="showToast(\'随访详情为原型演示\')">详情</a><a class="link" onclick="showToast(\'随访编辑为原型演示\')">编辑</a><a class="link link--danger" onclick="showToast(\'删除随访为原型演示\')">删除</a></td></tr>';
|
||||
}).join(''):'<tr><td colspan="6" class="td-empty">暂无随访记录</td></tr>';
|
||||
document.getElementById('medBody').innerHTML=emp.meds.length?emp.meds.map(function(m,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td style="text-align:left;">'+m.name+'</td><td>'+m.spec+'</td><td>'+m.dose+'</td><td>'+m.freq+'</td><td>'+m.start+'</td><td>'+m.end+'</td>'
|
||||
+'<td>'+(m.using?'<span class="badge badge--success">在用</span>':'<span class="badge badge--muted">已停</span>')+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="8" class="td-empty">该员工目前无需用药</td></tr>';
|
||||
return '<tr><td style="text-align:left;">'+m.name+'</td><td>'+m.spec+'</td><td style="text-align:left;">口服,'+m.freq+',一次'+m.dose+'</td><td>'+m.start+'</td><td>'+(m.end==='—'?'长期':m.end)+'</td>'
|
||||
+'<td><a class="link" onclick="showToast(\'用药方案编辑为原型演示\')">编辑</a><a class="link link--danger" onclick="showToast(\'删除用药为原型演示\')">删除</a></td></tr>';
|
||||
}).join(''):'<tr><td colspan="6" class="td-empty">该员工目前无需用药</td></tr>';
|
||||
document.getElementById('visitBody').innerHTML=emp.visits.length?emp.visits.map(function(v,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+v.date+'</td><td>'+emp.point+'</td><td>'+v.doctor+'</td><td style="text-align:left;">'+v.dx+'</td>'
|
||||
+'<td><a class="link" onclick="showToast(\'就诊详情为原型演示\')">详情</a><a class="link" onclick="showToast(\'就诊编辑为原型演示\')">编辑</a><a class="link link--danger" onclick="showToast(\'删除就诊为原型演示\')">删除</a></td></tr>';
|
||||
}).join(''):'<tr><td colspan="6" class="td-empty">近12个月暂无就诊记录</td></tr>';
|
||||
}
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2200);
|
||||
}
|
||||
/* ===== 新增用药弹窗 ===== */
|
||||
function openAddMed(){document.getElementById('addMedMask').classList.add('open');}
|
||||
function closeAddMed(){document.getElementById('addMedMask').classList.remove('open');}
|
||||
function saveMed(){
|
||||
var name=document.getElementById('medDrugName').value.trim();
|
||||
var usage=document.getElementById('medUsage').value.trim();
|
||||
if(!name){alert('请输入药物名称');return;}
|
||||
if(!usage){alert('请输入用法用量');return;}
|
||||
closeAddMed();
|
||||
showToast('新增用药已保存(演示)');
|
||||
}
|
||||
renderHead();renderAll();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
</script>
|
||||
|
||||
@@ -44,27 +44,16 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:120px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.org-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:36px;left:0;z-index:310;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:380px;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-col{flex:1;overflow-y:auto;max-height:200px;border-right:1px solid var(--border);}
|
||||
.org-col:last-child{border-right:none;}
|
||||
.org-col__title{padding:6px 12px;font-size:var(--font-sm);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.org-item{padding:8px 12px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.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;white-space:nowrap;}
|
||||
.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);}
|
||||
.btn-link{background:none;color:var(--primary);padding:0 4px;height:auto;}.btn-link:hover{color:#40a9ff;}
|
||||
.btn-link--danger{color:var(--danger);}
|
||||
.btn-link--danger{color:var(--danger);}.btn-link--danger:hover{color:#ff7875;}
|
||||
.btn-sm{height:26px;padding:0 10px;}
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;margin-top:16px;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:1500px;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:1480px;}
|
||||
thead th{background:#FAFAFA;padding:10px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:12px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
@@ -73,13 +62,34 @@ thead tr th:last-child,tbody td:last-child{position:sticky;right:0;z-index:5;bac
|
||||
thead tr th:last-child{z-index:8;background:#FAFAFA;}
|
||||
tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);}
|
||||
.td-actions{white-space:nowrap;}
|
||||
.td-actions .btn{margin:0 2px;}
|
||||
.badge{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.badge--success{background:#F6FFED;color:#389E0D;border:1px solid #B7EB8F;}
|
||||
.badge--warning{background:#FFFBE6;color:#D48806;border:1px solid #FFE58F;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
.chip{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;margin-right:6px;}
|
||||
/* 慢病干预疾病标签 */
|
||||
.dtag{display:inline-block;padding:1px 8px;border-radius:4px;font-size:var(--font-xs);margin-right:4px;}
|
||||
.dtag--ht,.dtag--chd,.dtag--ob,.dtag--dm,.dtag--other{background:rgba(24,144,255,.15);color:#1890ff;}
|
||||
/* 单位/部门双列联动面板 */
|
||||
.org-select-wrap{position:relative;}
|
||||
.org-trigger{min-width:200px;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);background:#fff;cursor:pointer;}
|
||||
.org-trigger .ph{color:var(--text-placeholder);}
|
||||
.org-trigger i{font-style:normal;color:var(--text-placeholder);font-size:10px;}
|
||||
.org-panel{position:absolute;top:42px;left:0;width:400px;height:268px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:25;display:none;flex-direction:column;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-body{flex:1;display:flex;min-height:0;}
|
||||
.org-col{flex:1;overflow-y:auto;padding:8px;scrollbar-width:none;}
|
||||
.org-col::-webkit-scrollbar{display:none;}
|
||||
.org-col:first-child{border-right:1px solid #F0F0F0;}
|
||||
.org-node{padding:7px 10px;font-size:var(--font-sm);border-radius:var(--radius-sm);cursor:pointer;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.org-node:hover{background:#F8FBFF;}
|
||||
.org-node.on{background:var(--primary-light);color:var(--primary);}
|
||||
.org-foot{border-top:1px solid #F0F0F0;padding:8px 12px;display:flex;justify-content:space-between;}
|
||||
.org-foot a{font-size:var(--font-sm);color:var(--primary);cursor:pointer;text-decoration:none;}
|
||||
.org-foot a.ok{background:var(--primary);color:#fff;border-radius:var(--radius-sm);padding:4px 14px;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{min-width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;padding:0 6px;transition:all .2s;}
|
||||
@@ -117,7 +127,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -133,13 +143,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item active">慢病管理</a>
|
||||
@@ -161,32 +165,39 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>姓名/工号</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名或工号">
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
<div class="org-col" id="unitCol">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" onclick="selectUnit(this,'')">全部单位/部门</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采油一厂')">采油一厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采油二厂')">采油二厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'第四采油厂')">第四采油厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采气一厂')">采气一厂</div>
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-select-wrap">
|
||||
<div class="org-trigger" onclick="event.stopPropagation();toggleOrgPanel()">
|
||||
<span class="ph" id="orgText">全部单位</span><i>▾</i>
|
||||
</div>
|
||||
<div class="org-panel" id="orgPanel" onclick="event.stopPropagation()">
|
||||
<div class="org-body">
|
||||
<div class="org-col" id="orgColUnit">
|
||||
<div class="org-node" onclick="pickUnit(this,'采油一厂')">采油一厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'采油二厂')">采油二厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'第四采油厂')">第四采油厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgColDept"></div>
|
||||
</div>
|
||||
<div class="org-col" id="deptCol">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" onclick="selectDept(this,'')">全部部门</div>
|
||||
<div class="org-foot">
|
||||
<a onclick="clearOrg()">清空</a>
|
||||
<a class="ok" onclick="applyOrg()">确 定</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:120px;">
|
||||
<select class="filter-select" id="filterPU" onchange="onFilterPU()" style="min-width:120px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
@@ -198,14 +209,18 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>慢病类型</label>
|
||||
<select class="filter-select" id="filterType" style="min-width:110px;">
|
||||
<option value="">全部类型</option>
|
||||
<option>高血压</option><option>冠心病</option><option>糖尿病</option><option>肥胖</option><option>其他</option>
|
||||
<label>慢病干预</label>
|
||||
<select class="filter-select" id="filterDisease" style="min-width:110px;">
|
||||
<option value="">全部</option>
|
||||
<option>高血压</option>
|
||||
<option>冠心病</option>
|
||||
<option>糖尿病</option>
|
||||
<option>肥胖</option>
|
||||
<option>其他</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>入组日期</label>
|
||||
<label>入组时间</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
@@ -218,7 +233,6 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
|
||||
<!-- [交互] 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-default btn-link--danger" onclick="askBatchDelete()">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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" onclick="openExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
</div>
|
||||
@@ -229,7 +243,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>慢病类型</th><th>入组日期</th><th>员工单位</th><th>部门</th><th>分配医疗点</th><th>体检报告</th><th>操作</th>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>慢病干预</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检报告</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -297,7 +311,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏):与员工分配名册一致的12人池 ===== */
|
||||
/* ===== 演示数据(脱敏):与「员工档案」页一致的12人池中的慢病入组8人 ===== */
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂'};
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
@@ -306,57 +320,57 @@ var pointMap={
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
var TYPES=['高血压','冠心病','糖尿病','肥胖','其他'];
|
||||
var typeBadge={'高血压':'badge--danger','冠心病':'badge--danger','糖尿病':'badge--warning','肥胖':'badge--info','其他':'badge--muted'};
|
||||
/* 慢病台账:type=慢病类型数组 note=入组依据 */
|
||||
var diseaseClass={'高血压':'dtag--ht','冠心病':'dtag--chd','糖尿病':'dtag--dm','肥胖':'dtag--ob','其他':'dtag--other'};
|
||||
/* 慢病台账:type=慢病干预类型数组 group=五类人群 join=入组日期 note=入组依据 */
|
||||
var chronics=[
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',type:['高血压'],join:'2026-08-08',doctor:'曲志明',note:'门诊确诊高血压2级(158/96mmHg)',advice:'规律服药,每周自测血压,月度随访'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',type:['糖尿病','肥胖'],join:'2026-06-12',doctor:'闫婷',note:'年度体检空腹血糖8.9mmol/L+BMI 27.6',advice:'控糖饮食+餐后运动,双周随访,季度复查糖化'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',type:['肥胖','其他'],join:'2026-07-10',doctor:'曲志明',note:'BMI 25.8 合并血脂偏高(总胆固醇 6.4)',advice:'减重为核心目标,低脂饮食,两月随访'},
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',type:['高血压'],join:'2026-08-28',doctor:'李桂芳',note:'血压正常高值(138/86mmHg),入组观察',advice:'暂不用药,生活方式干预,双月随访'},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',type:['肥胖'],join:'2026-08-26',doctor:'刘玉梅',note:'BMI 26.4 合并摄盐偏重',advice:'清淡饮食,夏季作业防暑,季度随访'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',type:['冠心病'],join:'2026-05-20',doctor:'张秀兰',note:'既往心绞痛病史,长期服用他汀',advice:'随身携带硝酸甘油,避免剧烈作业,月度随访'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',type:['高血压'],join:'2026-04-18',doctor:'呼建国',note:'体检血压 142/88mmHg,复测确认',advice:'限盐减重,规律服药,月度随访'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',type:['其他'],join:'2026-07-02',doctor:'刘玉梅',note:'颈椎病史,反复上肢麻木',advice:'工间操干预,避免久坐,季度随访'}
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'15089356127',point:'桐园作业区医疗点',group:'B',type:['高血压'],join:'2026-08-08',doctor:'曲志明',note:'门诊确诊高血压2级(158/96mmHg)',advice:'规律服药,每周自测血压,月度随访'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'13935720086',point:'西峰基地医疗点',group:'A',type:['糖尿病','肥胖'],join:'2026-06-12',doctor:'闫婷',note:'年度体检空腹血糖8.9mmol/L+BMI 27.6',advice:'控糖饮食+餐后运动,双周随访,季度复查糖化'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'13675232248',point:'姬圪台作业区医疗点',group:'C',type:['肥胖','其他'],join:'2026-07-10',doctor:'曲志明',note:'BMI 25.8 合并血脂偏高(总胆固醇 6.4)',advice:'减重为核心目标,低脂饮食,两月随访'},
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'13945872051',point:'樊学作业区医疗点',group:'C',type:['高血压'],join:'2026-08-28',doctor:'李桂芳',note:'血压正常高值(138/86mmHg),入组观察',advice:'暂不用药,生活方式干预,双月随访'},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'13359464860',point:'乌审旗采气区医疗点',group:'D',type:['肥胖'],join:'2026-08-26',doctor:'刘玉梅',note:'BMI 26.4 合并摄盐偏重',advice:'清淡饮食,夏季作业防暑,季度随访'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'13764128890',point:'姬圪台作业区医疗点',group:'E',type:['冠心病'],join:'2026-05-20',doctor:'张秀兰',note:'既往心绞痛病史,长期服用他汀',advice:'随身携带硝酸甘油,避免剧烈作业,月度随访'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'13586247719',point:'靖边气田医疗点',group:'E',type:['高血压'],join:'2026-04-18',doctor:'呼建国',note:'体检血压 142/88mmHg,复测确认',advice:'限盐减重,规律服药,月度随访'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'14725899003',point:'靖边气田医疗点',group:'E',type:['其他'],join:'2026-07-02',doctor:'刘玉梅',note:'颈椎病史,反复上肢麻木',advice:'工间操干预,避免久坐,季度随访'}
|
||||
];
|
||||
var editingCode=null;
|
||||
|
||||
/* ===== 单位部门双列筛选 ===== */
|
||||
var deptMap={
|
||||
'采油一厂':['樊学作业区','采油大队','安全环保科','生产技术部','工会办公室'],
|
||||
'采油二厂':['姬圪台联合站','桐园作业区','安全环保科','信息中心'],
|
||||
'第四采油厂':['基地管理处','健康管理部','生产技术部','财务部'],
|
||||
'采气一厂':['靖边净化厂','苏里格南作业区','生产技术部']
|
||||
var ORG_DEPTS={
|
||||
'采油一厂':['樊学作业区','安塞采油队','生产技术部'],
|
||||
'采油二厂':['姬圪台联合站','桐园作业区'],
|
||||
'第四采油厂':['基地管理处','健康管理部'],
|
||||
'采气一厂':['靖边净化厂','苏里格南作业区']
|
||||
};
|
||||
var selUnit='',selDept='';
|
||||
function toggleOrg(){
|
||||
document.getElementById('orgPanel').classList.toggle('open');
|
||||
document.getElementById('orgTrigger').classList.toggle('open');
|
||||
}
|
||||
function selectUnit(elem,unitName){
|
||||
document.querySelectorAll('#unitCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selUnit=unitName;
|
||||
var html='<div class="org-col__title">部门</div><div class="org-item active" onclick="selectDept(this,\'\')">全部部门</div>';
|
||||
(deptMap[unitName]||[]).forEach(function(d){
|
||||
html+='<div class="org-item" onclick="selectDept(this,\''+d+'\')">'+d+'</div>';
|
||||
function fillDeptCol(name){
|
||||
var col=document.getElementById('orgColDept');
|
||||
col.innerHTML='';
|
||||
(ORG_DEPTS[name]||[]).forEach(function(d){
|
||||
var node=document.createElement('div');
|
||||
node.className='org-node';
|
||||
node.textContent=d;
|
||||
node.onclick=function(){
|
||||
col.querySelectorAll('.org-node').forEach(function(n){n.classList.remove('on');});
|
||||
node.classList.add('on');
|
||||
selDept=d;
|
||||
};
|
||||
col.appendChild(node);
|
||||
});
|
||||
document.getElementById('deptCol').innerHTML=html;
|
||||
selDept='';
|
||||
}
|
||||
function selectDept(elem,deptName){
|
||||
document.querySelectorAll('#deptCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selDept=deptName;
|
||||
document.getElementById('orgTrigger').textContent=(selUnit||'全部单位')+' / '+(selDept||'全部部门');
|
||||
function pickUnit(el,name){
|
||||
selUnit=name;selDept='';
|
||||
document.querySelectorAll('#orgColUnit .org-node').forEach(function(n){n.classList.remove('on');});
|
||||
el.classList.add('on');
|
||||
fillDeptCol(name);
|
||||
}
|
||||
function resetOrg(){
|
||||
selUnit='';selDept='';
|
||||
document.getElementById('orgTrigger').textContent='全部单位/部门';
|
||||
function toggleOrgPanel(){document.getElementById('orgPanel').classList.toggle('open');}
|
||||
function applyOrg(){
|
||||
var t=document.getElementById('orgText');
|
||||
t.textContent=selUnit?(selDept?selUnit+' / '+selDept:selUnit):'全部单位';
|
||||
t.className=selUnit?'':'ph';
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
document.getElementById('orgTrigger').classList.remove('open');
|
||||
document.querySelectorAll('#unitCol .org-item').forEach(function(i,idx){i.classList.toggle('active',idx===0);});
|
||||
document.getElementById('deptCol').innerHTML='<div class="org-col__title">部门</div><div class="org-item active" onclick="selectDept(this,\'\')">全部部门</div>';
|
||||
}
|
||||
function clearOrg(){selUnit='';selDept='';applyOrg();}
|
||||
|
||||
/* ===== 异步导出与导出任务 ===== */
|
||||
var exportLogs=[
|
||||
@@ -410,28 +424,36 @@ function retryExport(file){
|
||||
|
||||
/* ===== 列表 ===== */
|
||||
var pageSize=10,currentPage=1;
|
||||
function onFilterUnit(){
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
function onFilterPU(){
|
||||
var unit=document.getElementById('filterPU').value;
|
||||
var sel=document.getElementById('filterPoint');
|
||||
sel.innerHTML='<option value="">全部医疗点</option>';
|
||||
if(unit){(pointMap[unit]||[]).forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});}
|
||||
}
|
||||
function currentData(){
|
||||
var q=document.getElementById('filterName').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var pu=document.getElementById('filterPU').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var type=document.getElementById('filterType').value;
|
||||
var dis=document.getElementById('filterDisease').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
return chronics.filter(function(c){
|
||||
return (!q||c.name.indexOf(q)!==-1||c.code.toLowerCase().indexOf(q.toLowerCase())!==-1)
|
||||
&&(!selUnit||c.unit===selUnit)&&(!selDept||c.dept===selDept)
|
||||
&&(!unit||pointUnit[c.point]===unit)&&(!point||c.point===point)
|
||||
&&(!type||c.type.indexOf(type)!==-1)
|
||||
&&(!from||c.join>=from)&&(!to||c.join<=to);
|
||||
return (!name||c.name.indexOf(name)!==-1)
|
||||
&&(!code||c.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||c.unit===selUnit)
|
||||
&&(!selDept||c.dept===selDept)
|
||||
&&(!pu||pointUnit[c.point]===pu)
|
||||
&&(!point||c.point===point)
|
||||
&&(!dis||(c.type||[]).indexOf(dis)!==-1)
|
||||
&&(!from||c.join>=from)
|
||||
&&(!to||c.join<=to);
|
||||
});
|
||||
}
|
||||
function typeChips(arr){return arr.map(function(t){return '<span class="chip">'+t+'</span>';}).join('');}
|
||||
function renderDiseases(list){
|
||||
if(!list||!list.length)return '<span style="color:var(--text-placeholder);">无</span>';
|
||||
return list.map(function(d){return '<span class="dtag '+(diseaseClass[d]||'dtag--other')+'">'+d+'</span>';}).join('');
|
||||
}
|
||||
function renderTable(){
|
||||
var list=currentData();
|
||||
var start=(currentPage-1)*pageSize,pageData=list.slice(start,start+pageSize);
|
||||
@@ -445,12 +467,11 @@ function renderTable(){
|
||||
var html='';
|
||||
pageData.forEach(function(c,i){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+c.code+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+c.name+'</td>'
|
||||
+'<td>'+c.code+'</td><td>'+c.sex+'</td><td>'+c.age+'</td>'
|
||||
+'<td style="white-space:normal;min-width:150px;">'+typeChips(c.type)+'</td>'
|
||||
+'<td>'+c.join+'</td><td>'+c.unit+'</td><td>'+c.dept+'</td><td>'+c.point+'</td>'
|
||||
+'<td style="font-weight:600;">'+c.name+'</td><td>'+c.code+'</td><td>'+c.sex+'</td><td>'+c.age+'</td><td>'+c.tel+'</td>'
|
||||
+'<td>'+renderDiseases(c.type)+'</td>'
|
||||
+'<td>'+c.unit+'</td><td>'+c.dept+'</td>'
|
||||
+'<td>'+c.point+'</td><td>'+pointUnit[c.point]+'</td>'
|
||||
+'<td><button class="btn btn-link" onclick="openReport(\''+c.code+'\')">查看</button></td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="goIntervention(\''+c.code+'\')">干预记录</button>'
|
||||
@@ -459,14 +480,14 @@ function renderTable(){
|
||||
+'</td></tr>';
|
||||
});
|
||||
tbody.innerHTML=html;
|
||||
var ca=document.getElementById('checkAll');if(ca)ca.checked=false;
|
||||
}
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
resetOrg();
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterType').value='';
|
||||
document.getElementById('filterCode').value='';
|
||||
clearOrg();
|
||||
document.getElementById('filterPU').value='';onFilterPU();
|
||||
document.getElementById('filterDisease').value='';
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
applyFilter();
|
||||
}
|
||||
@@ -528,16 +549,6 @@ function confirmClear(){
|
||||
}
|
||||
applyTypes([]);
|
||||
}
|
||||
|
||||
/* ===== 批量选择与删除 ===== */
|
||||
function toggleAll(el){document.querySelectorAll('.row-check').forEach(function(c){c.checked=el.checked;});}
|
||||
function askBatchDelete(){
|
||||
var codes=[].slice.call(document.querySelectorAll('.row-check:checked')).map(function(c){return c.value;});
|
||||
if(!codes.length){showToast('请先勾选要删除的记录');return;}
|
||||
window._batchCodes=codes;
|
||||
document.getElementById('clearText').textContent='确认删除勾选的 '+codes.length+' 条慢病台账记录?该员工将移出慢病管理台账,历史干预记录保留备查。';
|
||||
document.getElementById('clearMask').classList.add('open');
|
||||
}
|
||||
function applyTypes(picked){
|
||||
var c=chronics.find(function(x){return x.code===editingCode;});
|
||||
if(!picked.length){chronics=chronics.filter(function(x){return x.code!==editingCode;});}
|
||||
@@ -558,6 +569,7 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
renderTable();
|
||||
document.addEventListener('click',function(){document.getElementById('orgPanel').classList.remove('open');});
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -128,7 +128,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -144,13 +144,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
|
||||
@@ -41,15 +41,26 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.page-header{margin-bottom:16px;display:flex;align-items:center;gap:12px;}
|
||||
.page-header__back{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--primary);text-decoration:none;padding:4px 10px;border:1px solid var(--primary);border-radius:var(--radius-sm);background:#fff;}
|
||||
.page-header__back:hover{background:var(--primary-light);}
|
||||
.emp-card{display:grid;grid-template-columns:repeat(4,1fr);gap:6px 12px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);padding:14px 18px;margin-bottom:16px;font-size:var(--font-sm);color:var(--text-secondary);box-shadow:var(--shadow-sm);}
|
||||
.emp-card b{color:var(--text-primary);font-weight:600;}
|
||||
/* 员工信息卡(名片样式) */
|
||||
.emp-card{position:relative;display:flex;align-items:flex-start;gap:24px;background:#fff;border-radius:var(--radius-md);padding:24px 28px;margin-bottom:16px;box-shadow:var(--shadow-md);overflow:hidden;}
|
||||
.emp-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,#1890FF,#36CFC9);}
|
||||
.emp-card__main{flex:1;min-width:0;}
|
||||
.emp-card__head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
|
||||
.emp-card__name{font-size:22px;font-weight:700;color:var(--text-primary);letter-spacing:.5px;line-height:1.2;}
|
||||
.emp-card__no{font-size:var(--font-sm);color:var(--text-secondary);background:var(--background);border:1px solid var(--border);border-radius:20px;padding:3px 12px;white-space:nowrap;}
|
||||
.emp-card__tag-row{display:flex;align-items:center;margin-left:auto;}
|
||||
.emp-card__sub{margin-top:12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:var(--font-sm);}
|
||||
.emp-card__sub .lbl{color:var(--text-placeholder);}
|
||||
.emp-card__divider{height:1px;background:#F0F0F0;margin:16px 0 14px;}
|
||||
.emp-card__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px 28px;}
|
||||
.emp-card__item{display:flex;align-items:baseline;gap:8px;min-width:0;}
|
||||
.emp-card__label{font-size:var(--font-sm);color:var(--text-placeholder);white-space:nowrap;flex-shrink:0;}
|
||||
.emp-card__value{font-size:var(--font-sm);color:var(--text-primary);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
/* 主 Tab */
|
||||
.tabs-bar{display:flex;gap:4px;background:#fff;padding:8px 12px 0;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.tab-btn{padding:10px 18px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent;transition:all .2s;}
|
||||
.tab-btn:hover{color:var(--primary);}
|
||||
.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
|
||||
/* 面板通用 */
|
||||
.panel{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);padding:20px 24px;}
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:900px;}
|
||||
@@ -59,23 +70,35 @@ tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);}
|
||||
.td-left{text-align:left;}
|
||||
/* 记录筛选条 */
|
||||
.filter-bar{display:flex;align-items:center;gap:10px;padding:14px 20px;border-bottom:1px solid var(--border);}
|
||||
.filter-bar__label{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.filter-input{width:220px;height:30px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.badge{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.badge--success{background:#F6FFED;color:#389E0D;border:1px solid #B7EB8F;}
|
||||
.badge--warning{background:#FFFBE6;color:#D48806;border:1px solid #FFE58F;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
/* 慢病干预疾病标签 */
|
||||
.dtag{display:inline-block;padding:1px 8px;border-radius:4px;font-size:var(--font-xs);margin-right:4px;}
|
||||
.dtag--ht{background:rgba(24,144,255,.15);color:#1890ff;}
|
||||
.dtag--chd{background:rgba(0,195,195,.15);color:#00c3c3;}
|
||||
.dtag--ob{background:rgba(252,163,24,.15);color:#fca318;}
|
||||
.dtag--dm{background:rgba(42,193,139,.15);color:#2ac18b;}
|
||||
.dtag--over{background:rgba(238,101,87,.15);color:#EE6557;}
|
||||
/* 五类人群标签 */
|
||||
.ftag{display:inline-block;padding:2px 10px;border-radius:12px;font-size:var(--font-xs);}
|
||||
.ftag--a{background:rgba(245,34,45,.1);color:#f5222d;}
|
||||
.ftag--b{background:rgba(250,140,22,.12);color:#fa8c16;}
|
||||
.ftag--c{background:rgba(212,177,6,.14);color:#b8960a;}
|
||||
.ftag--d{background:rgba(104,98,214,.12);color:#6862D6;}
|
||||
.ftag--e{background:rgba(42,193,139,.12);color:#2ac18b;}
|
||||
.btn{height:30px;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;white-space:nowrap;}
|
||||
.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);}
|
||||
.btn-link{background:none;color:var(--primary);padding:0 4px;height:auto;}.btn-link:hover{color:#40a9ff;}
|
||||
/* Tab1 左侧子 Tab */
|
||||
.sub-tabs{display:flex;gap:16px;}
|
||||
.sub-tabs__nav{width:120px;flex-shrink:0;border-right:1px solid var(--border);padding-right:4px;}
|
||||
.sub-tab{display:block;width:100%;text-align:left;padding:10px 12px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border:none;background:none;border-radius:var(--radius-sm);transition:all .15s;margin-bottom:2px;}
|
||||
.sub-tab:hover{color:var(--primary);background:var(--background);}
|
||||
.sub-tab.active{color:var(--primary);background:var(--primary-light);font-weight:600;}
|
||||
.sub-tabs__content{flex:1;min-width:0;}
|
||||
.form-section{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:16px 0 12px;padding-left:8px;border-left:3px solid var(--primary);}
|
||||
.form-section:first-child{margin-top:0;}
|
||||
.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;}
|
||||
@@ -84,9 +107,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.detail-item--full{grid-column:1/-1;}
|
||||
.detail-item .dk{width:120px;flex-shrink:0;background:#FAFAFA;padding:9px 12px;font-size:var(--font-sm);color:var(--text-secondary);border-right:1px solid var(--border);}
|
||||
.detail-item .dv{flex:1;padding:9px 12px;font-size:var(--font-sm);color:var(--text-primary);white-space:normal;line-height:1.5;}
|
||||
/* 头像/证照占位 */
|
||||
.avatar-box{width:64px;height:64px;border-radius:50%;background:#E6F7FF;border:1px dashed #91D5FF;display:flex;align-items:center;justify-content:center;color:#1890FF;font-size:var(--font-sm);}
|
||||
.cert-box{width:120px;height:76px;border-radius:var(--radius-sm);background:#FAFAFA;border:1px dashed var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-placeholder);font-size:var(--font-xs);}
|
||||
/* 弹窗 */
|
||||
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:900;}
|
||||
.modal-mask.open{display:block;}
|
||||
@@ -97,13 +117,21 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.modal__close:hover{color:var(--text-primary);}
|
||||
.modal__body{flex:1;overflow-y:auto;padding:20px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
/* 问卷详情 */
|
||||
.q-item{padding:12px 0;border-bottom:1px solid #F0F0F0;}
|
||||
.q-item:last-child{border-bottom:none;}
|
||||
.q-title{font-size:var(--font-sm);color:var(--text-primary);font-weight:600;margin-bottom:8px;}
|
||||
.q-opts{display:flex;flex-wrap:wrap;gap:8px;}
|
||||
.q-opt{padding:4px 12px;border-radius:var(--radius-sm);font-size:var(--font-xs);background:var(--background);color:var(--text-secondary);border:1px solid var(--border);}
|
||||
.q-opt.answer{background:var(--primary-light);color:var(--primary);border-color:#91D5FF;}
|
||||
.modal--wide{width:900px;}
|
||||
/* 体检报告详情 */
|
||||
.report-section{margin-bottom:24px;}
|
||||
.report-section:last-child{margin-bottom:0;}
|
||||
.report-section__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);padding-left:10px;border-left:3px solid var(--primary);margin-bottom:12px;line-height:1.4;}
|
||||
.report-note{border-radius:var(--radius-sm);padding:12px 16px;font-size:var(--font-sm);line-height:1.9;margin-bottom:16px;}
|
||||
.report-note--conclusion{border:1px solid #FFD591;background:#FFF7E6;color:#873800;}
|
||||
.report-note--advice{border:1px solid #B7EB8F;background:#F6FFED;color:#389E0D;}
|
||||
.report-sub__title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:14px 0 8px;}
|
||||
.report-sub:first-of-type .report-sub__title{margin-top:0;}
|
||||
.report-table{width:100%;border-collapse:collapse;}
|
||||
.report-table th{background:#FAFAFA;padding:9px 12px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid #E8E8E8;white-space:nowrap;}
|
||||
.report-table td{padding:10px 12px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #E8E8E8;}
|
||||
.report-table tbody tr:last-child td{border-bottom:none;}
|
||||
.result-abnormal{color:var(--danger);font-weight:600;}
|
||||
/* 体检分析报告 */
|
||||
.analysis-wrap{display:flex;height:560px;background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.analysis-tree{width:220px;flex-shrink:0;border-right:1px solid var(--border);overflow-y:auto;padding:8px 0;}
|
||||
@@ -147,7 +175,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -163,13 +191,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -194,64 +216,31 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 员工信息卡(由列表页URL参数带入) -->
|
||||
<div class="emp-card" id="empCard"></div>
|
||||
|
||||
<!-- [交互] 主 Tab 切换:健康档案/体检报告/心理评估/健康评估/体检分析报告 -->
|
||||
<!-- [交互] 主 Tab 切换:体检历史/体检分析报告/就诊记录/随访记录 -->
|
||||
<div class="tabs-bar">
|
||||
<button class="tab-btn active" data-tab="basic" onclick="switchTab('basic')">健康档案</button>
|
||||
<button class="tab-btn" data-tab="exam" onclick="switchTab('exam')">体检报告</button>
|
||||
<button class="tab-btn" data-tab="psych" onclick="switchTab('psych')">心理评估</button>
|
||||
<button class="tab-btn" data-tab="health" onclick="switchTab('health')">健康评估</button>
|
||||
<button class="tab-btn active" data-tab="exam" onclick="switchTab('exam')">体检历史</button>
|
||||
<button class="tab-btn" data-tab="analysis" onclick="switchTab('analysis')">体检分析报告</button>
|
||||
<button class="tab-btn" data-tab="visit" onclick="switchTab('visit')">就诊记录</button>
|
||||
<button class="tab-btn" data-tab="follow" onclick="switchTab('follow')">随访记录</button>
|
||||
</div>
|
||||
|
||||
<!-- Tab1 健康档案 -->
|
||||
<div class="panel" id="pane-basic" style="border-radius:0 0 var(--radius-md) var(--radius-md);">
|
||||
<div class="sub-tabs">
|
||||
<div class="sub-tabs__nav" id="subNav">
|
||||
<button class="sub-tab active" data-sub="base" onclick="switchSub('base')">基本信息</button>
|
||||
<button class="sub-tab" data-sub="extend" onclick="switchSub('extend')">扩展信息</button>
|
||||
<button class="sub-tab" data-sub="contact" onclick="switchSub('contact')">紧急联系人</button>
|
||||
</div>
|
||||
<div class="sub-tabs__content">
|
||||
<div id="sub-base"></div>
|
||||
<div id="sub-extend" style="display:none;"></div>
|
||||
<div id="sub-contact" style="display:none;"></div>
|
||||
</div>
|
||||
<!-- 体检历史 -->
|
||||
<div class="table-card" id="pane-exam">
|
||||
<div class="filter-bar">
|
||||
<span class="filter-bar__label">体检年份</span>
|
||||
<select class="filter-input" id="examYearSel" style="width:150px;" onchange="renderExam()">
|
||||
<option value="">全部年份</option><option>2026</option><option>2025</option><option>2024</option><option>2023</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab2 体检报告 -->
|
||||
<div class="table-card" id="pane-exam" style="display:none;">
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:820px;">
|
||||
<thead><tr><th>序号</th><th>体检日期</th><th>体检年度</th><th>体检医院</th><th>审核时间</th><th>报告上传时间</th><th>操作</th></tr></thead>
|
||||
<table style="min-width:860px;">
|
||||
<thead><tr><th>序号</th><th>体检年度</th><th>体检日期</th><th>体检类型</th><th>体检医院</th><th>报告上传日期</th><th>操作</th></tr></thead>
|
||||
<tbody id="examBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab3 心理评估 -->
|
||||
<div class="table-card" id="pane-psych" style="display:none;">
|
||||
<div style="padding:12px 20px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);">累计评估:<b id="psychTotal"></b> 次</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:700px;">
|
||||
<thead><tr><th>序号</th><th>评估日期</th><th>健康评分</th><th>评分等级</th><th>操作</th></tr></thead>
|
||||
<tbody id="psychBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab4 健康评估 -->
|
||||
<div class="table-card" id="pane-health" style="display:none;">
|
||||
<div style="padding:12px 20px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);">累计评估:<b id="healthTotal"></b> 次</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:900px;">
|
||||
<thead><tr><th>序号</th><th>评估日期</th><th>体重指数</th><th>缺血性心血管病</th><th>糖尿病</th><th>肺癌</th><th>高血压</th><th>代谢综合征</th><th>操作</th></tr></thead>
|
||||
<tbody id="healthBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab5 体检分析报告 -->
|
||||
<!-- 体检分析报告 -->
|
||||
<div class="analysis-wrap" id="pane-analysis" style="display:none;">
|
||||
<div class="analysis-tree">
|
||||
<div class="analysis-tree__title">检查类别</div>
|
||||
@@ -265,6 +254,36 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<div class="analysis-body" id="analysisBody"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 就诊记录 -->
|
||||
<div class="table-card" id="pane-visit" style="display:none;">
|
||||
<div class="filter-bar">
|
||||
<span class="filter-bar__label">就诊日期</span>
|
||||
<input class="filter-input" placeholder="开始日期 ~ 结束日期">
|
||||
<button class="btn btn-default" onclick="showToast('搜索为原型演示交互')">搜 索</button>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:820px;">
|
||||
<thead><tr><th>序号</th><th>就诊日期</th><th>就诊医疗点</th><th>就诊医生</th><th>就诊疾病</th><th>操作</th></tr></thead>
|
||||
<tbody id="visitBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 随访记录 -->
|
||||
<div class="table-card" id="pane-follow" style="display:none;">
|
||||
<div class="filter-bar">
|
||||
<span class="filter-bar__label">随访日期</span>
|
||||
<input class="filter-input" placeholder="开始日期 ~ 结束日期">
|
||||
<button class="btn btn-default" onclick="showToast('搜索为原型演示交互')">搜 索</button>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:760px;">
|
||||
<thead><tr><th>序号</th><th>随访日期</th><th>随访医生</th><th>症状</th><th>下次随访日期</th><th>操作</th></tr></thead>
|
||||
<tbody id="followBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- 通用弹窗 -->
|
||||
@@ -283,79 +302,103 @@ var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医
|
||||
|
||||
/* ===== 员工身份基础映射(与「员工档案」列表页 12 人一致,身份字段随点击员工变化) ===== */
|
||||
var empBase={
|
||||
'CQ021578':{name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'139****2051',point:'樊学作业区医疗点'},
|
||||
'CQ032144':{name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'138****7742',point:'樊学作业区医疗点'},
|
||||
'CQ045130':{name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'188****7214',point:'樊学作业区医疗点'},
|
||||
'CQ019203':{name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'137****8890',point:'姬圪台作业区医疗点'},
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'136****2248',point:'姬圪台作业区医疗点'},
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'150****6127',point:'桐园作业区医疗点'},
|
||||
'CQ010564':{name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'139****0086',point:'西峰基地医疗点'},
|
||||
'CQ041822':{name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'186****5527',point:'西峰基地医疗点'},
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'135****7719',point:'靖边气田医疗点'},
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'147****9003',point:'靖边气田医疗点'},
|
||||
'CQ044871':{name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'155****3316',point:'安塞采油队长住点医疗室'},
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'133****4860',point:'乌审旗采气区医疗点'}
|
||||
'CQ021578':{name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'13945872051',point:'樊学作业区医疗点',group:'C',diseases:['高血压']},
|
||||
'CQ032144':{name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'13856247742',point:'樊学作业区医疗点',group:'E',diseases:[]},
|
||||
'CQ045130':{name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'18843727214',point:'樊学作业区医疗点',group:'E',diseases:[]},
|
||||
'CQ019203':{name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'13764128890',point:'姬圪台作业区医疗点',group:'E',diseases:[]},
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'13675232248',point:'姬圪台作业区医疗点',group:'C',diseases:['超重']},
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'15089356127',point:'桐园作业区医疗点',group:'B',diseases:['高血压']},
|
||||
'CQ010564':{name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'13935720086',point:'西峰基地医疗点',group:'A',diseases:['糖尿病','超重']},
|
||||
'CQ041822':{name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'18674935527',point:'西峰基地医疗点',group:'E',diseases:[]},
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'13586247719',point:'靖边气田医疗点',group:'E',diseases:[]},
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'14725899003',point:'靖边气田医疗点',group:'E',diseases:[]},
|
||||
'CQ044871':{name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'15572343316',point:'安塞采油队长住点医疗室',group:'E',diseases:[]},
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'13359464860',point:'乌审旗采气区医疗点',group:'D',diseases:['超重']}
|
||||
};
|
||||
|
||||
/* ===== 共享演示档案数据(所有员工共用一套,原型演示用) ===== */
|
||||
var SHARED={
|
||||
/* 基本信息(除身份字段外,共用) */
|
||||
basic:{
|
||||
username:'CQ021578', idCard:'6127011980********', email:'shiweiguo@cqoil.com', empNo:'CQ021578',
|
||||
job:'采油工', title:'工程师', position:'班组长', level:'科员', group:'采油一组', status:'在岗',
|
||||
workType:'井下作业', examForm:'在岗体检', hazardDate:'2020-03-01', hazard:'噪声、粉尘'
|
||||
},
|
||||
/* 扩展信息(共用) */
|
||||
extend:{
|
||||
height:'172', weight:'72', birthday:'1980-03-15', bloodType:'O型', nation:'汉族', marriage:'已婚',
|
||||
political:'中共党员', degree:'本科', nativeplace:'陕西延安', worktime:'2003-07-01', empType:'合同制',
|
||||
listed:'是', workSpace:'樊学作业区', liveSpace:'CQ油田生活基地', healthType:'一般', jkState:'健康'
|
||||
},
|
||||
/* 紧急联系人(共用) */
|
||||
contacts:[
|
||||
{name:'石丽华', relation:'配偶', phone:'139****1234', idCard:'6127011982********'},
|
||||
{name:'石建军', relation:'父子', phone:'138****5678', idCard:'6127012005********'}
|
||||
],
|
||||
/* 体检报告(共用) */
|
||||
/* 体检历史(共用) */
|
||||
examReports:[
|
||||
{date:'2026-04-18', year:'2026', hospital:'CQ油田总医院', auditDate:'2026-04-25', uploadDate:'2026-04-26'},
|
||||
{date:'2025-04-10', year:'2025', hospital:'CQ油田总医院', auditDate:'2025-04-17', uploadDate:'2025-04-18'},
|
||||
{date:'2024-04-06', year:'2024', hospital:'吴起油田医院', auditDate:'2024-04-12', uploadDate:'2024-04-13'}
|
||||
{date:'2026-04-18', year:'2026', hospital:'CQ油田总医院', type:'常规体检', uploadDate:'2026-04-26'},
|
||||
{date:'2025-04-10', year:'2025', hospital:'CQ油田总医院', type:'胃肠镜体检', uploadDate:'2025-04-18'},
|
||||
{date:'2024-04-06', year:'2024', hospital:'吴起油田医院', type:'冠脉CTA体检', uploadDate:'2024-04-13'},
|
||||
{date:'2023-04-08', year:'2023', hospital:'CQ油田总医院', type:'常规体检', uploadDate:'2023-04-14'}
|
||||
],
|
||||
/* 体检报告详情(查看报告弹窗,共用) */
|
||||
examDetail:{
|
||||
year:'2026', hospital:'CQ油田总医院', date:'2026-04-18',
|
||||
items:[
|
||||
{name:'血压(mmHg)', value:'138/86', ref:'<140 / <90', flag:'关注'},
|
||||
{name:'空腹血糖(mmol/L)', value:'5.8', ref:'3.9 - 6.1', flag:'正常'},
|
||||
{name:'BMI', value:'24.6', ref:'18.5 - 23.9', flag:'关注'},
|
||||
{name:'总胆固醇(mmol/L)', value:'5.9', ref:'<5.2', flag:'关注'}
|
||||
],
|
||||
conclusion:'总体良好,血压处于正常高值,建议低盐饮食并定期监测。',
|
||||
suggest:'每季度复测血压;控制体重。'
|
||||
conclusion:'1. 血压处于正常高值:收缩压 138mmHg、舒张压 86mmHg;<br>2. 体质指数(BMI)偏高:24.6 kg/m²;<br>3. 血清总胆固醇升高:5.9 mmol/L;<br>4. 甘油三酯升高:1.9 mmol/L;<br>5. 其余各项体检指标未见明显异常。',
|
||||
suggest:'1. 建议低盐低脂饮食,规律运动,控制体重;<br>2. 每季度复测血压并记录;<br>3. 3个月后复查血脂四项;<br>4. 每年进行一次健康体检,动态关注各项指标变化。',
|
||||
sections:[
|
||||
{name:'物理检查', subs:[
|
||||
{name:'一般检查', rows:[
|
||||
{name:'身高',result:'172',unit:'cm',ref:'-'},
|
||||
{name:'体重',result:'72',unit:'kg',ref:'-'},
|
||||
{name:'体质指数(BMI)',result:'24.6 ↑',unit:'kg/m²',ref:'18.5~24.9'},
|
||||
{name:'收缩压',result:'138 ↑',unit:'mmHg',ref:'90~139'},
|
||||
{name:'舒张压',result:'86',unit:'mmHg',ref:'60~89'}
|
||||
]},
|
||||
{name:'视力', rows:[
|
||||
{name:'裸眼视力(右)',result:'1.0',unit:'-',ref:'≥1.0'},
|
||||
{name:'裸眼视力(左)',result:'0.9',unit:'-',ref:'≥1.0'}
|
||||
]}
|
||||
]},
|
||||
{name:'内科', subs:[
|
||||
{name:'心肺听诊', rows:[
|
||||
{name:'心率',result:'78',unit:'次/分',ref:'60~100'},
|
||||
{name:'心律',result:'齐',unit:'-',ref:'节律整齐'},
|
||||
{name:'呼吸音',result:'清晰',unit:'-',ref:'呼吸音清晰'}
|
||||
]},
|
||||
{name:'腹部触诊', rows:[
|
||||
{name:'肝脏',result:'未触及',unit:'-',ref:'无肿大'},
|
||||
{name:'脾脏',result:'未触及',unit:'-',ref:'无肿大'}
|
||||
]}
|
||||
]},
|
||||
{name:'外科', subs:[
|
||||
{name:'皮肤与淋巴结', rows:[
|
||||
{name:'皮肤',result:'无异常',unit:'-',ref:'皮肤黏膜无异常'},
|
||||
{name:'浅表淋巴结',result:'未触及肿大',unit:'-',ref:'无肿大'}
|
||||
]},
|
||||
{name:'甲状腺与脊柱四肢', rows:[
|
||||
{name:'甲状腺',result:'无肿大',unit:'-',ref:'无肿大'},
|
||||
{name:'脊柱、四肢关节',result:'无异常',unit:'-',ref:'活动自如'}
|
||||
]}
|
||||
]},
|
||||
{name:'化学检查', subs:[
|
||||
{name:'血常规', rows:[
|
||||
{name:'白细胞计数',result:'6.5',unit:'×10⁹/L',ref:'3.5~9.5'},
|
||||
{name:'红细胞计数',result:'4.9',unit:'×10¹²/L',ref:'4.3~5.8'},
|
||||
{name:'血红蛋白',result:'145',unit:'g/L',ref:'130~175'},
|
||||
{name:'血小板计数',result:'210',unit:'×10⁹/L',ref:'125~350'}
|
||||
]},
|
||||
{name:'肝功能', rows:[
|
||||
{name:'丙氨酸氨基转移酶(ALT)',result:'32',unit:'U/L',ref:'9~50'},
|
||||
{name:'天门冬氨酸氨基转移酶(AST)',result:'26',unit:'U/L',ref:'15~40'}
|
||||
]},
|
||||
{name:'血脂四项', rows:[
|
||||
{name:'总胆固醇',result:'5.9 ↑',unit:'mmol/L',ref:'<5.2'},
|
||||
{name:'甘油三酯',result:'1.9 ↑',unit:'mmol/L',ref:'<1.7'},
|
||||
{name:'高密度脂蛋白胆固醇',result:'1.12',unit:'mmol/L',ref:'>1.04'},
|
||||
{name:'低密度脂蛋白胆固醇',result:'3.10',unit:'mmol/L',ref:'<3.4'}
|
||||
]},
|
||||
{name:'血糖', rows:[
|
||||
{name:'空腹血糖',result:'5.8',unit:'mmol/L',ref:'3.9~6.1'}
|
||||
]}
|
||||
]}
|
||||
]
|
||||
},
|
||||
/* 心理评估(共用) */
|
||||
psychAssessments:[
|
||||
{date:'2026-06-12', grade:'82', level:'良好'},
|
||||
{date:'2025-12-03', grade:'76', level:'一般'},
|
||||
{date:'2025-06-20', grade:'85', level:'良好'}
|
||||
/* 就诊记录(共用) */
|
||||
visitRecords:[
|
||||
{date:'2026-08-21', doctor:'王建军', disease:'原发性高血压2级(中危)', chief:'偶有头晕,无胸闷、心悸,近期自行停药。', advice:'恢复服用苯磺酸氨氯地平片 5mg 口服 每日1次;低盐饮食,2周后复测血压。'},
|
||||
{date:'2026-07-14', doctor:'韩丽平', disease:'血压偏高,建议复查', chief:'无明显不适,例行测量血压偏高。', advice:'继续当前用药;每日早晚监测血压并记录,1个月后复查。'},
|
||||
{date:'2026-05-09', doctor:'王建军', disease:'上呼吸道感染', chief:'咽痛、咳嗽3天,伴低热。', advice:'对症抗感冒治疗,多饮水、注意休息;如持续发热及时复诊。'}
|
||||
],
|
||||
psychQuestion:[
|
||||
{q:'1. 最近两周是否经常感到紧张、焦虑或烦躁?', opts:['从不','偶尔','经常','总是'], answer:'偶尔'},
|
||||
{q:'2. 入睡是否困难,整体睡眠质量如何?', opts:['很好','一般','较差','很差'], answer:'一般'},
|
||||
{q:'3. 是否容易因小事发脾气或情绪低落?', opts:['从不','偶尔','经常','总是'], answer:'偶尔'},
|
||||
{q:'4. 与同事、家人的沟通交流是否顺畅?', opts:['顺畅','一般','较少','几乎不'], answer:'顺畅'}
|
||||
],
|
||||
/* 健康评估(共用) */
|
||||
healthAssessments:[
|
||||
{date:'2026-05-20', bmi:'24.6(超重)', icvd:'低风险', diabetes:'低风险', lung:'低风险', hypertension:'中风险', metabolic:'低风险'},
|
||||
{date:'2025-11-08', bmi:'24.1(超重)', icvd:'低风险', diabetes:'低风险', lung:'低风险', hypertension:'低风险', metabolic:'低风险'}
|
||||
],
|
||||
healthQuestion:[
|
||||
{q:'1. 是否吸烟(含二手烟暴露)?', opts:['不吸烟','偶尔','经常','每天'], answer:'偶尔'},
|
||||
{q:'2. 每周进行中等强度运动(如快走)的天数?', opts:['0天','1-2天','3-4天','5天以上'], answer:'3-4天'},
|
||||
{q:'3. 日常食盐摄入量是否偏高?', opts:['清淡','适中','偏咸','很咸'], answer:'适中'},
|
||||
{q:'4. 是否有高血压、糖尿病等家族史?', opts:['无','有(一级亲属)','有(二级亲属)','不清楚'], answer:'有(一级亲属)'}
|
||||
/* 随访记录(共用) */
|
||||
followRecords:[
|
||||
{date:'2026-08-22', doctor:'王建军', way:'电话随访', symptom:'偶有头晕,血压波动,已恢复规律服药。', advice:'坚持服药并记录血压;低盐低脂饮食,适量运动。', next:'2026-09-22'},
|
||||
{date:'2026-05-18', doctor:'王建军', way:'门诊随访', symptom:'症状平稳,血压控制尚可。', advice:'维持现有治疗方案;1个月后门诊复测血压。', next:'2026-06-18'},
|
||||
{date:'2026-02-10', doctor:'韩丽平', way:'电话随访', symptom:'自述近期服药不规律,时有头胀。', advice:'强调规律服药重要性;每日监测血压,2周后电话复访。', next:'2026-03-12'}
|
||||
]
|
||||
};
|
||||
|
||||
@@ -398,95 +441,67 @@ var params=new URLSearchParams(location.search);
|
||||
var code=params.get('emp')||'CQ021578';
|
||||
var emp=empBase[code]||empBase['CQ021578'];
|
||||
|
||||
var diseaseClass={'高血压':'dtag--ht','冠心病':'dtag--chd','肥胖':'dtag--ob','糖尿病':'dtag--dm','超重':'dtag--over'};
|
||||
var groupClass={'A':'ftag--a','B':'ftag--b','C':'ftag--c','D':'ftag--d','E':'ftag--e'};
|
||||
var groupName={'A':'A-大病人群','B':'B-慢病人群','C':'C-异常人群','D':'D-风险人群','E':'E-健康人群'};
|
||||
|
||||
/* ===== 渲染员工信息卡 ===== */
|
||||
function renderHead(){
|
||||
document.title='健康档案 · '+emp.name+' | 一线医疗';
|
||||
var diseasesHtml=(emp.diseases&&emp.diseases.length)
|
||||
?emp.diseases.map(function(d){return '<span class="dtag '+diseaseClass[d]+'">'+d+'</span>';}).join('')
|
||||
:'<span style="color:var(--text-placeholder);">无</span>';
|
||||
var groupHtml='<span class="ftag '+(groupClass[emp.group]||'ftag--e')+'">'+(groupName[emp.group]||'')+'</span>';
|
||||
function item(k,v){return '<div class="emp-card__item"><span class="emp-card__label">'+k+'</span><span class="emp-card__value">'+v+'</span></div>';}
|
||||
document.getElementById('empCard').innerHTML=
|
||||
'<div>姓名 <b>'+emp.name+'</b></div><div>工号 <b>'+code+'</b></div><div>性别/年龄 <b>'+emp.sex+' / '+emp.age+'岁</b></div><div>联系电话 <b>'+emp.tel+'</b></div>'
|
||||
+'<div>所属单位 <b>'+emp.unit+'</b></div><div>所属部门 <b>'+emp.dept+'</b></div><div>分配医疗点 <b>'+emp.point+'('+pointUnit[emp.point]+')</b></div>';
|
||||
'<div class="emp-card__main">'
|
||||
+'<div class="emp-card__head">'
|
||||
+'<span class="emp-card__name">'+emp.name+'</span>'
|
||||
+'<span class="emp-card__no">员工编号 '+code+'</span>'
|
||||
+'<div class="emp-card__tag-row">'+groupHtml+'</div>'
|
||||
+'</div>'
|
||||
+'<div class="emp-card__sub"><span class="lbl">慢病干预</span>'+diseasesHtml+'</div>'
|
||||
+'<div class="emp-card__divider"></div>'
|
||||
+'<div class="emp-card__grid">'
|
||||
+item('性别',emp.sex)+item('年龄',emp.age+'岁')+item('联系电话',emp.tel)
|
||||
+item('单位部门',emp.unit+'-'+emp.dept)+item('分配医疗点',emp.point)
|
||||
+item('医疗点所属单位',pointUnit[emp.point])
|
||||
+'</div>'
|
||||
+'</div>';
|
||||
}
|
||||
|
||||
/* ===== 键值对渲染工具 ===== */
|
||||
function d(k,v,full){return '<div class="detail-item'+(full?' detail-item--full':'')+'"><div class="dk">'+k+'</div><div class="dv">'+(v||'—')+'</div></div>';}
|
||||
function grid(items){return '<div class="detail-grid">'+items+'</div>';}
|
||||
|
||||
/* ===== Tab1 健康档案:基本信息 ===== */
|
||||
function renderBasic(){
|
||||
var b=SHARED.basic;
|
||||
var html=
|
||||
grid(d('用户账号',b.username)+d('姓名',emp.name)+d('性别',emp.sex)+d('手机号码',emp.tel)
|
||||
+d('身份证号',b.idCard)+d('邮箱',b.email)+d('编号',b.empNo)+d('单位',emp.unit)
|
||||
+d('部门',emp.dept)+d('职务',b.job)+d('职称',b.title)+d('职位',b.position)
|
||||
+d('行政级别',b.level)+d('子组',b.group)+d('工作状态',b.status)+d('工种',b.workType)
|
||||
+d('体检形式',b.examForm)+d('接害时间',b.hazardDate)+d('危害因素',b.hazard));
|
||||
document.getElementById('sub-base').innerHTML=html;
|
||||
}
|
||||
|
||||
/* ===== Tab1 健康档案:扩展信息 ===== */
|
||||
function renderExtend(){
|
||||
var x=SHARED.extend;
|
||||
var html=
|
||||
'<div class="detail-grid">'
|
||||
+'<div class="detail-item"><div class="dk">头像</div><div class="dv"><div class="avatar-box">'+emp.name.charAt(0)+'</div></div></div>'
|
||||
+'<div class="detail-item"><div class="dk">身高</div><div class="dv">'+x.height+' cm</div></div>'
|
||||
+'<div class="detail-item"><div class="dk">身份证正面</div><div class="dv"><div class="cert-box">证件正面</div></div></div>'
|
||||
+'<div class="detail-item"><div class="dk">体重</div><div class="dv">'+x.weight+' kg</div></div>'
|
||||
+'<div class="detail-item"><div class="dk">身份证反面</div><div class="dv"><div class="cert-box">证件反面</div></div></div>'
|
||||
+'<div class="detail-item"><div class="dk">出生日期</div><div class="dv">'+x.birthday+'</div></div>'
|
||||
+d('年龄',emp.age+'岁')+d('血型',x.bloodType)+d('民族',x.nation)+d('婚姻状况',x.marriage)
|
||||
+d('政治面貌',x.political)+d('学历',x.degree)+d('籍贯',x.nativeplace)+d('入职时间',x.worktime)
|
||||
+d('用工形式',x.empType)+d('是否上市员工',x.listed)+d('工作地点',x.workSpace)+d('居住地点',x.liveSpace)
|
||||
+d('健康类型',x.healthType)+d('健康状态',x.jkState)
|
||||
+'</div>';
|
||||
document.getElementById('sub-extend').innerHTML=html;
|
||||
}
|
||||
|
||||
/* ===== Tab1 健康档案:紧急联系人 ===== */
|
||||
function renderContact(){
|
||||
var rows=SHARED.contacts.map(function(c,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+c.name+'</td><td>'+c.relation+'</td><td>'+c.phone+'</td><td>'+c.idCard+'</td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('sub-contact').innerHTML=
|
||||
'<table style="min-width:0;"><thead><tr><th>序号</th><th>姓名</th><th>与员工关系</th><th>联系电话</th><th>身份证号</th></tr></thead><tbody>'+rows+'</tbody></table>';
|
||||
}
|
||||
|
||||
/* ===== Tab2 体检报告 ===== */
|
||||
/* ===== 体检历史 ===== */
|
||||
function renderExam(){
|
||||
var rows=SHARED.examReports.map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.date+'</td><td>'+r.year+'</td><td>'+r.hospital+'</td><td>'+r.auditDate+'</td><td>'+r.uploadDate+'</td>'
|
||||
var y=document.getElementById('examYearSel').value;
|
||||
var rows=SHARED.examReports.filter(function(r){return !y||r.year===y;}).map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.year+'</td><td>'+r.date+'</td><td>'+r.type+'</td><td>'+r.hospital+'</td><td>'+r.uploadDate+'</td>'
|
||||
+'<td><button class="btn btn-link" onclick="openExamDetail()">查看报告</button></td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('examBody').innerHTML=rows;
|
||||
}
|
||||
|
||||
/* ===== Tab3 心理评估 ===== */
|
||||
function renderPsych(){
|
||||
var flag={'良好':'badge--success','一般':'badge--warning','较差':'badge--danger'};
|
||||
var rows=SHARED.psychAssessments.map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.date+'</td><td>'+r.grade+'</td><td><span class="badge '+(flag[r.level]||'badge--muted')+'">'+r.level+'</span></td>'
|
||||
+'<td><button class="btn btn-link" onclick="openPsychQuestion()">问卷详情</button><button class="btn btn-link" onclick="showToast(\'心理评估报告已导出(演示)\')">导出报告</button></td></tr>';
|
||||
/* ===== 就诊记录 ===== */
|
||||
function renderVisit(){
|
||||
var rows=SHARED.visitRecords.map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.date+'</td><td>'+emp.point+'</td><td>'+r.doctor+'</td><td>'+r.disease+'</td>'
|
||||
+'<td><button class="btn btn-link">详情</button></td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('psychTotal').textContent=SHARED.psychAssessments.length;
|
||||
document.getElementById('psychBody').innerHTML=rows;
|
||||
document.getElementById('visitBody').innerHTML=rows;
|
||||
}
|
||||
|
||||
/* ===== Tab4 健康评估 ===== */
|
||||
function renderHealth(){
|
||||
function riskBadge(v){return v.indexOf('高')!==-1?'badge--danger':(v.indexOf('中')!==-1?'badge--warning':'badge--success');}
|
||||
var rows=SHARED.healthAssessments.map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.date+'</td><td>'+r.bmi+'</td>'
|
||||
+'<td><span class="badge '+riskBadge(r.icvd)+'">'+r.icvd+'</span></td>'
|
||||
+'<td><span class="badge '+riskBadge(r.diabetes)+'">'+r.diabetes+'</span></td>'
|
||||
+'<td><span class="badge '+riskBadge(r.lung)+'">'+r.lung+'</span></td>'
|
||||
+'<td><span class="badge '+riskBadge(r.hypertension)+'">'+r.hypertension+'</span></td>'
|
||||
+'<td><span class="badge '+riskBadge(r.metabolic)+'">'+r.metabolic+'</span></td>'
|
||||
+'<td><button class="btn btn-link" onclick="openHealthQuestion()">问卷详情</button><button class="btn btn-link" onclick="showToast(\'健康评估报告已导出(演示)\')">导出报告</button></td></tr>';
|
||||
/* ===== 随访记录 ===== */
|
||||
function renderFollow(){
|
||||
var rows=SHARED.followRecords.map(function(r,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td>'+r.date+'</td><td>'+r.doctor+'</td><td>'+r.symptom+'</td><td>'+r.next+'</td>'
|
||||
+'<td><button class="btn btn-link">详情</button></td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('healthTotal').textContent=SHARED.healthAssessments.length;
|
||||
document.getElementById('healthBody').innerHTML=rows;
|
||||
document.getElementById('followBody').innerHTML=rows;
|
||||
}
|
||||
|
||||
/* ===== Tab5 体检分析报告 ===== */
|
||||
/* ===== 体检分析报告 ===== */
|
||||
function renderTree(){
|
||||
function nodeHtml(n, level){
|
||||
var hasChild=n.children&&n.children.length;
|
||||
@@ -574,9 +589,10 @@ function renderChart(list){
|
||||
}
|
||||
|
||||
/* ===== 弹窗 ===== */
|
||||
function openModal(title, bodyHtml){
|
||||
function openModal(title, bodyHtml, wide){
|
||||
document.getElementById('modalTitle').textContent=title;
|
||||
document.getElementById('modalBody').innerHTML=bodyHtml;
|
||||
document.getElementById('modal').classList.toggle('modal--wide',!!wide);
|
||||
document.getElementById('modalMask').classList.add('open');
|
||||
document.getElementById('modal').classList.add('open');
|
||||
}
|
||||
@@ -586,44 +602,30 @@ function closeModal(){
|
||||
}
|
||||
function openExamDetail(){
|
||||
var x=SHARED.examDetail;
|
||||
var flag={'正常':'badge--success','关注':'badge--warning','异常':'badge--danger'};
|
||||
var itemRows=x.items.map(function(it){
|
||||
return '<tr><td>'+it.name+'</td><td>'+it.value+'</td><td>'+it.ref+'</td><td><span class="badge '+(flag[it.flag]||'badge--muted')+'">'+it.flag+'</span></td></tr>';
|
||||
function subHtml(s){
|
||||
var rows=s.rows.map(function(r){
|
||||
var abnormal=r.result.indexOf('↑')!==-1;
|
||||
return '<tr><td>'+r.name+'</td><td'+(abnormal?' class="result-abnormal"':'')+'>'+r.result+'</td><td>'+r.unit+'</td><td>'+r.ref+'</td></tr>';
|
||||
}).join('');
|
||||
return '<div class="report-sub"><div class="report-sub__title">'+s.name+'</div>'
|
||||
+'<table class="report-table"><thead><tr><th>项目名称</th><th>结果</th><th>单位</th><th>参考值</th></tr></thead><tbody>'+rows+'</tbody></table></div>';
|
||||
}
|
||||
var sections=x.sections.map(function(sec){
|
||||
return '<div class="report-section"><div class="report-section__title">'+sec.name+'</div>'+sec.subs.map(subHtml).join('')+'</div>';
|
||||
}).join('');
|
||||
openModal('体检报告 · '+x.year+'年度',
|
||||
'<div class="detail-grid" style="margin-bottom:12px;">'+d('体检年度',x.year)+d('体检机构',x.hospital)+d('体检日期',x.date)+'</div>'
|
||||
+'<table style="min-width:0;margin-bottom:16px;"><thead><tr><th>指标</th><th>结果</th><th>参考范围</th><th>结论</th></tr></thead><tbody>'+itemRows+'</tbody></table>'
|
||||
+'<div class="form-section">总体结论</div><div style="font-size:var(--font-sm);color:var(--text-primary);line-height:1.7;">'+x.conclusion+'</div>'
|
||||
+'<div class="form-section">管理建议</div><div style="font-size:var(--font-sm);color:var(--text-primary);line-height:1.7;">'+x.suggest+'</div>');
|
||||
openModal(x.year+'年度健康体检报告 · '+emp.name,
|
||||
'<div class="report-section"><div class="report-section__title">体检结论</div><div class="report-note report-note--conclusion">'+x.conclusion+'</div></div>'
|
||||
+'<div class="report-section"><div class="report-section__title">体检建议</div><div class="report-note report-note--advice">'+x.suggest+'</div></div>'
|
||||
+sections, true);
|
||||
}
|
||||
function renderQuestion(questions){
|
||||
return questions.map(function(q){
|
||||
var opts=q.opts.map(function(o){return '<span class="q-opt'+(o===q.answer?' answer':'')+'">'+o+'</span>';}).join('');
|
||||
return '<div class="q-item"><div class="q-title">'+q.q+'</div><div class="q-opts">'+opts+'</div></div>';
|
||||
}).join('');
|
||||
}
|
||||
function openPsychQuestion(){
|
||||
openModal('心理评估 · 问卷详情', renderQuestion(SHARED.psychQuestion));
|
||||
}
|
||||
function openHealthQuestion(){
|
||||
openModal('健康评估 · 问卷详情', renderQuestion(SHARED.healthQuestion));
|
||||
}
|
||||
|
||||
/* ===== 主 Tab 切换 ===== */
|
||||
function switchTab(k){
|
||||
document.querySelectorAll('.tab-btn').forEach(function(b){b.classList.toggle('active',b.dataset.tab===k);});
|
||||
['basic','exam','psych','health','analysis'].forEach(function(p){
|
||||
['exam','analysis','visit','follow'].forEach(function(p){
|
||||
var el=document.getElementById('pane-'+p);
|
||||
if(el)el.style.display=(p===k)?'':'none';
|
||||
});
|
||||
}
|
||||
function switchSub(k){
|
||||
document.querySelectorAll('.sub-tab').forEach(function(b){b.classList.toggle('active',b.dataset.sub===k);});
|
||||
['base','extend','contact'].forEach(function(p){
|
||||
document.getElementById('sub-'+p).style.display=(p===k)?'':'none';
|
||||
});
|
||||
}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
@@ -633,12 +635,9 @@ function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
renderHead();
|
||||
renderBasic();
|
||||
renderExtend();
|
||||
renderContact();
|
||||
renderExam();
|
||||
renderPsych();
|
||||
renderHealth();
|
||||
renderVisit();
|
||||
renderFollow();
|
||||
renderTree();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -67,6 +67,33 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
/* 慢病干预疾病标签 */
|
||||
.dtag{display:inline-block;padding:1px 8px;border-radius:4px;font-size:var(--font-xs);margin-right:4px;}
|
||||
.dtag--ht,.dtag--chd,.dtag--ob,.dtag--dm,.dtag--over{background:rgba(24,144,255,.15);color:#1890ff;}
|
||||
/* 五类人群标签 */
|
||||
.ftag{display:inline-block;padding:2px 10px;border-radius:12px;font-size:var(--font-xs);}
|
||||
.ftag--a{background:rgba(245,34,45,.1);color:#f5222d;}
|
||||
.ftag--b{background:rgba(250,140,22,.12);color:#fa8c16;}
|
||||
.ftag--c{background:rgba(212,177,6,.14);color:#b8960a;}
|
||||
.ftag--d{background:rgba(104,98,214,.12);color:#6862D6;}
|
||||
.ftag--e{background:rgba(42,193,139,.12);color:#2ac18b;}
|
||||
/* 单位/部门双列联动面板 */
|
||||
.org-select-wrap{position:relative;}
|
||||
.org-trigger{min-width:200px;height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);background:#fff;cursor:pointer;}
|
||||
.org-trigger .ph{color:var(--text-placeholder);}
|
||||
.org-trigger i{font-style:normal;color:var(--text-placeholder);font-size:10px;}
|
||||
.org-panel{position:absolute;top:42px;left:0;width:400px;height:268px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:25;display:none;flex-direction:column;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-body{flex:1;display:flex;min-height:0;}
|
||||
.org-col{flex:1;overflow-y:auto;padding:8px;scrollbar-width:none;}
|
||||
.org-col::-webkit-scrollbar{display:none;}
|
||||
.org-col:first-child{border-right:1px solid #F0F0F0;}
|
||||
.org-node{padding:7px 10px;font-size:var(--font-sm);border-radius:var(--radius-sm);cursor:pointer;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.org-node:hover{background:#F8FBFF;}
|
||||
.org-node.on{background:var(--primary-light);color:var(--primary);}
|
||||
.org-foot{border-top:1px solid #F0F0F0;padding:8px 12px;display:flex;justify-content:space-between;}
|
||||
.org-foot a{font-size:var(--font-sm);color:var(--primary);cursor:pointer;text-decoration:none;}
|
||||
.org-foot a.ok{background:var(--primary);color:#fff;border-radius:var(--radius-sm);padding:4px 14px;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{min-width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;padding:0 6px;transition:all .2s;}
|
||||
@@ -83,7 +110,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -99,13 +126,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -127,15 +148,35 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>姓名/工号</label>
|
||||
<input class="filter-input" id="filterQ" placeholder="请输入姓名或工号">
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" style="min-width:120px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-select-wrap">
|
||||
<div class="org-trigger" onclick="event.stopPropagation();toggleOrgPanel()">
|
||||
<span class="ph" id="orgText">全部单位</span><i>▾</i>
|
||||
</div>
|
||||
<div class="org-panel" id="orgPanel" onclick="event.stopPropagation()">
|
||||
<div class="org-body">
|
||||
<div class="org-col" id="orgColUnit">
|
||||
<div class="org-node" onclick="pickUnit(this,'采油一厂')">采油一厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'采油二厂')">采油二厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'第四采油厂')">第四采油厂</div>
|
||||
<div class="org-node" onclick="pickUnit(this,'采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgColDept"></div>
|
||||
</div>
|
||||
<div class="org-foot">
|
||||
<a onclick="clearOrg()">清空</a>
|
||||
<a class="ok" onclick="applyOrg()">确 定</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
@@ -150,6 +191,28 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>五类人群</label>
|
||||
<select class="filter-select" id="filterGroup" style="min-width:130px;">
|
||||
<option value="">全部</option>
|
||||
<option value="A">A-大病人群</option>
|
||||
<option value="B">B-慢病人群</option>
|
||||
<option value="C">C-异常人群</option>
|
||||
<option value="D">D-风险人群</option>
|
||||
<option value="E">E-健康人群</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>慢病干预</label>
|
||||
<select class="filter-select" id="filterDisease" style="min-width:110px;">
|
||||
<option value="">全部</option>
|
||||
<option>高血压</option>
|
||||
<option>冠心病</option>
|
||||
<option>肥胖</option>
|
||||
<option>糖尿病</option>
|
||||
<option>超重</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
@@ -167,7 +230,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>员工姓名</th><th>员工工号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>员工所属部门</th><th>医疗点所属单位</th><th>分配医疗点</th><th>健康风险</th><th>操作</th>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>慢病干预</th><th>五类人群</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -196,48 +259,87 @@ var pointMap={
|
||||
};
|
||||
/* 体检指标与风险为虚构演示值;visits 与「员工就诊」页记录对应 */
|
||||
var emps=[
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'139****2051',point:'樊学作业区医疗点',since:'2025-03-12',
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'13945872051',point:'樊学作业区医疗点',since:'2025-03-12',group:'C',diseases:['高血压'],
|
||||
exam:{date:'2026-04-18',hospital:'CQ油田总医院',bp:'138/86',glu:5.8,bmi:24.6,tc:5.9,summary:'总体良好,血压处于正常高值,建议低盐饮食并定期监测。',risk:'中',chronic:['血压偏高'],advice:'每季度复测血压;控制体重。'},
|
||||
visits:[{time:'2026-08-21 18:20',disease:'电光性眼炎',doctor:'李桂芳'}]},
|
||||
{code:'CQ032144',name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'138****7742',point:'樊学作业区医疗点',since:'2025-03-12',
|
||||
{code:'CQ032144',name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'13856247742',point:'樊学作业区医疗点',since:'2025-03-12',group:'E',diseases:[],
|
||||
exam:{date:'2026-04-18',hospital:'CQ油田总医院',bp:'118/76',glu:5.1,bmi:22.3,tc:4.6,summary:'各项指标正常。',risk:'低',chronic:[],advice:'保持规律作息与运动。'},
|
||||
visits:[]},
|
||||
{code:'CQ045130',name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'188****7214',point:'樊学作业区医疗点',since:'2025-09-01',
|
||||
{code:'CQ045130',name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'18843727214',point:'樊学作业区医疗点',since:'2025-09-01',group:'E',diseases:[],
|
||||
exam:{date:'2026-04-18',hospital:'CQ油田总医院',bp:'112/70',glu:4.9,bmi:21.0,tc:4.2,summary:'各项指标正常。',risk:'低',chronic:[],advice:'注意作业防护,预防外伤。'},
|
||||
visits:[{time:'2026-09-04 11:00',disease:'踝关节扭伤',doctor:'石维国'}]},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'137****8890',point:'姬圪台作业区医疗点',since:'2025-03-12',
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'13764128890',point:'姬圪台作业区医疗点',since:'2025-03-12',group:'E',diseases:[],
|
||||
exam:{date:'2026-05-09',hospital:'环县油田医院',bp:'126/82',glu:5.6,bmi:23.8,tc:5.0,summary:'总体良好,轻度超重趋势。',risk:'低',chronic:[],advice:'控制饮食,增加有氧运动。'},
|
||||
visits:[]},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'136****2248',point:'姬圪台作业区医疗点',since:'2025-03-12',
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'13675232248',point:'姬圪台作业区医疗点',since:'2025-03-12',group:'C',diseases:['超重'],
|
||||
exam:{date:'2026-05-09',hospital:'环县油田医院',bp:'128/80',glu:5.4,bmi:25.9,tc:5.5,summary:'超重,血脂轻度升高。',risk:'中',chronic:['超重','血脂偏高'],advice:'减重3-5kg;三个月后复查血脂。'},
|
||||
visits:[{time:'2026-08-25 09:00',disease:'腰肌劳损',doctor:'曲志明'}]},
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'150****6127',point:'桐园作业区医疗点',since:'2025-06-20',
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'15089356127',point:'桐园作业区医疗点',since:'2025-06-20',group:'B',diseases:['高血压'],
|
||||
exam:{date:'2026-05-09',hospital:'环县油田医院',bp:'154/95',glu:6.0,bmi:26.8,tc:6.0,summary:'血压达高血压2级标准,建议心内科进一步评估。',risk:'高',chronic:['高血压(2级)'],advice:'规律服药,每日晨起测量血压;限盐限酒。'},
|
||||
visits:[{time:'2026-09-05 15:10',disease:'高血压病(2级)',doctor:'曲志明'}]},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'139****0086',point:'西峰基地医疗点',since:'2025-03-12',
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'13935720086',point:'西峰基地医疗点',since:'2025-03-12',group:'A',diseases:['糖尿病','超重'],
|
||||
exam:{date:'2026-04-26',hospital:'第四采油厂总医院',bp:'132/85',glu:8.9,bmi:27.4,tc:6.4,summary:'空腹血糖明显升高,糖尿病控制欠佳,需强化管理。',risk:'高',chronic:['2型糖尿病','超重'],advice:'监测空腹与餐后血糖;营养科膳食指导。'},
|
||||
visits:[{time:'2026-09-03 10:20',disease:'2型糖尿病复诊',doctor:'闫婷'}]},
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'186****5527',point:'西峰基地医疗点',since:'2025-03-12',
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'18674935527',point:'西峰基地医疗点',since:'2025-03-12',group:'E',diseases:[],
|
||||
exam:{date:'2026-04-26',hospital:'第四采油厂总医院',bp:'110/68',glu:5.0,bmi:21.8,tc:4.4,summary:'各项指标正常。',risk:'低',chronic:[],advice:'保持健康生活方式。'},
|
||||
visits:[]},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'135****7719',point:'靖边气田医疗点',since:'2025-03-12',
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'13586247719',point:'靖边气田医疗点',since:'2025-03-12',group:'E',diseases:[],
|
||||
exam:{date:'2026-05-16',hospital:'庆阳市人民医院',bp:'116/74',glu:5.2,bmi:22.9,tc:4.8,summary:'各项指标正常。',risk:'低',chronic:[],advice:'保持规律作息。'},
|
||||
visits:[]},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'147****9003',point:'靖边气田医疗点',since:'2025-07-01',
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'14725899003',point:'靖边气田医疗点',since:'2025-07-01',group:'E',diseases:[],
|
||||
exam:{date:'2026-05-16',hospital:'庆阳市人民医院',bp:'122/78',glu:5.3,bmi:23.6,tc:4.9,summary:'总体良好。',risk:'低',chronic:[],advice:'注意季节交替期防护,预防呼吸道感染。'},
|
||||
visits:[{time:'2026-09-06 09:30',disease:'上呼吸道感染',doctor:'刘玉梅'}]},
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'155****3316',point:'安塞采油队长住点医疗室',since:'2025-10-15',
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'15572343316',point:'安塞采油队长住点医疗室',since:'2025-10-15',group:'E',diseases:[],
|
||||
exam:{date:'2026-04-18',hospital:'吴起油田医院',bp:'118/75',glu:5.0,bmi:22.1,tc:4.3,summary:'各项指标正常。',risk:'低',chronic:[],advice:'保持锻炼。'},
|
||||
visits:[]},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'133****4860',point:'乌审旗采气区医疗点',since:'2025-03-12',
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'13359464860',point:'乌审旗采气区医疗点',since:'2025-03-12',group:'D',diseases:['超重'],
|
||||
exam:{date:'2026-05-16',hospital:'庆阳市人民医院',bp:'128/84',glu:5.7,bmi:26.4,tc:5.6,summary:'超重,夏季注意防暑。',risk:'中',chronic:['超重'],advice:'减重;高温作业做好轮换与补液。'},
|
||||
visits:[{time:'2026-08-28 13:30',disease:'中暑(先兆)',doctor:'刘玉梅'}]}
|
||||
];
|
||||
|
||||
var riskBadge={'低':'badge--success','中':'badge--warning','高':'badge--danger'};
|
||||
var diseaseClass={'高血压':'dtag--ht','冠心病':'dtag--chd','肥胖':'dtag--ob','糖尿病':'dtag--dm','超重':'dtag--over'};
|
||||
var groupClass={'A':'ftag--a','B':'ftag--b','C':'ftag--c','D':'ftag--d','E':'ftag--e'};
|
||||
var groupName={'A':'A-大病人群','B':'B-慢病人群','C':'C-异常人群','D':'D-风险人群','E':'E-健康人群'};
|
||||
|
||||
/* ===== 列表 ===== */
|
||||
var pageSize=10,currentPage=1;
|
||||
/* 单位 → 部门联动数据 */
|
||||
var ORG_DEPTS={
|
||||
'采油一厂':['樊学作业区','安塞采油队','生产技术部'],
|
||||
'采油二厂':['姬圪台联合站','桐园作业区'],
|
||||
'第四采油厂':['基地管理处','健康管理部'],
|
||||
'采气一厂':['靖边净化厂','苏里格南作业区']
|
||||
};
|
||||
var selUnit='',selDept='';
|
||||
function fillDeptCol(name){
|
||||
var col=document.getElementById('orgColDept');
|
||||
col.innerHTML='';
|
||||
(ORG_DEPTS[name]||[]).forEach(function(d){
|
||||
var node=document.createElement('div');
|
||||
node.className='org-node';
|
||||
node.textContent=d;
|
||||
node.onclick=function(){
|
||||
col.querySelectorAll('.org-node').forEach(function(n){n.classList.remove('on');});
|
||||
node.classList.add('on');
|
||||
selDept=d;
|
||||
};
|
||||
col.appendChild(node);
|
||||
});
|
||||
}
|
||||
function pickUnit(el,name){
|
||||
selUnit=name;selDept='';
|
||||
document.querySelectorAll('#orgColUnit .org-node').forEach(function(n){n.classList.remove('on');});
|
||||
el.classList.add('on');
|
||||
fillDeptCol(name);
|
||||
}
|
||||
function toggleOrgPanel(){document.getElementById('orgPanel').classList.toggle('open');}
|
||||
function applyOrg(){
|
||||
var t=document.getElementById('orgText');
|
||||
t.textContent=selUnit?(selDept?selUnit+' / '+selDept:selUnit):'全部单位';
|
||||
t.className=selUnit?'':'ph';
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
}
|
||||
function clearOrg(){selUnit='';selDept='';applyOrg();}
|
||||
function onFilterPU(){
|
||||
var unit=document.getElementById('filterPU').value;
|
||||
var sel=document.getElementById('filterPoint');
|
||||
@@ -245,16 +347,28 @@ function onFilterPU(){
|
||||
if(unit){(pointMap[unit]||[]).forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});}
|
||||
}
|
||||
function currentData(){
|
||||
var q=document.getElementById('filterQ').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var pu=document.getElementById('filterPU').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var grp=document.getElementById('filterGroup').value;
|
||||
var dis=document.getElementById('filterDisease').value;
|
||||
return emps.filter(function(e){
|
||||
return (!q||e.name.indexOf(q)!==-1||e.code.toLowerCase().indexOf(q.toLowerCase())!==-1)
|
||||
&&(!unit||e.unit===unit)
|
||||
&&(!pu||pointUnit[e.point]===pu)&&(!point||e.point===point);
|
||||
return (!name||e.name.indexOf(name)!==-1)
|
||||
&&(!code||e.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||e.unit===selUnit)
|
||||
&&(!selDept||e.dept===selDept)
|
||||
&&(!pu||pointUnit[e.point]===pu)
|
||||
&&(!point||e.point===point)
|
||||
&&(!grp||e.group===grp)
|
||||
&&(!dis||(e.diseases||[]).indexOf(dis)!==-1);
|
||||
});
|
||||
}
|
||||
function renderDiseases(list){
|
||||
if(!list||!list.length)return '<span style="color:var(--text-placeholder);">无</span>';
|
||||
return list.map(function(d){return '<span class="dtag '+diseaseClass[d]+'">'+d+'</span>';}).join('');
|
||||
}
|
||||
function renderGroup(g){return '<span class="ftag '+(groupClass[g]||'ftag--e')+'">'+(groupName[g]||'')+'</span>';}
|
||||
function renderTable(){
|
||||
var list=currentData();
|
||||
var start=(currentPage-1)*pageSize,pageData=list.slice(start,start+pageSize);
|
||||
@@ -264,24 +378,28 @@ function renderTable(){
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
var tbody=document.getElementById('tableBody');
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="12" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="13" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(e,i){
|
||||
html+='<tr>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+e.name+'</td><td>'+e.code+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.tel+'</td>'
|
||||
+'<td>'+renderDiseases(e.diseases)+'</td>'
|
||||
+'<td>'+renderGroup(e.group)+'</td>'
|
||||
+'<td>'+e.unit+'</td><td>'+e.dept+'</td>'
|
||||
+'<td>'+pointUnit[e.point]+'</td><td>'+e.point+'</td>'
|
||||
+'<td><span class="badge '+riskBadge[e.exam.risk]+'">'+e.exam.risk+'风险</span></td>'
|
||||
+'<td class="td-actions"><a class="btn btn-link" href="daily-employee-file.html?emp='+e.code+'" style="text-decoration:none;">健康档案</a></td></tr>';
|
||||
+'<td>'+e.point+'</td><td>'+pointUnit[e.point]+'</td>'
|
||||
+'<td class="td-actions"><a class="btn btn-link" href="daily-employee-file.html?emp='+e.code+'" style="text-decoration:none;">查看档案</a></td></tr>';
|
||||
});
|
||||
tbody.innerHTML=html;
|
||||
}
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterQ').value='';
|
||||
document.getElementById('filterUnit').value='';
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterCode').value='';
|
||||
clearOrg();
|
||||
document.getElementById('filterPU').value='';onFilterPU();
|
||||
document.getElementById('filterGroup').value='';
|
||||
document.getElementById('filterDisease').value='';
|
||||
applyFilter();
|
||||
}
|
||||
function turnPage(d){
|
||||
@@ -297,6 +415,7 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
renderTable();
|
||||
document.addEventListener('click',function(){document.getElementById('orgPanel').classList.remove('open');});
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -38,14 +38,16 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-bar{background:#fff;padding:16px 16px;display:flex;align-items:center;gap:12px;flex-wrap:nowrap;margin-top:16px;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow-x:auto;}
|
||||
.filter-bar::-webkit-scrollbar{height:6px;}
|
||||
.filter-bar::-webkit-scrollbar-thumb{background:#E0E0E0;border-radius:3px;}
|
||||
.filter-item{display:flex;align-items:center;gap:6px;flex-shrink:0;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:120px;}
|
||||
.filter-select{height:36px;min-width:110px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:100px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.org-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;flex-shrink:0;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:36px;left:0;z-index:310;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:380px;}
|
||||
.org-panel.open{display:flex;}
|
||||
@@ -74,13 +76,11 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.btn-link{background:none;color:var(--primary);padding:0 4px;height:auto;}.btn-link:hover{color:#40a9ff;}
|
||||
.btn-link--danger{color:var(--danger);}
|
||||
.btn-link--muted{color:var(--text-secondary);}
|
||||
.tabs-bar{display:flex;gap:4px;background:#fff;padding:8px 12px 0;margin-top:16px;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.tabs-bar{display:flex;gap:4px;background:#fff;padding:8px 12px 0;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.tab-btn{padding:9px 18px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.tab-btn:hover{color:var(--primary);}
|
||||
.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
|
||||
.tab-btn .cnt{display:inline-block;min-width:18px;height:18px;line-height:18px;text-align:center;border-radius:9px;background:#F0F0F0;color:var(--text-secondary);font-size:var(--font-xs);padding:0 5px;}
|
||||
.tab-btn.active .cnt{background:var(--primary-light);color:var(--primary);}
|
||||
.action-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 24px;background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.action-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 24px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.action-bar__left{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
|
||||
.seg{display:inline-flex;border:1px solid var(--primary);border-radius:var(--radius-sm);overflow:hidden;flex-shrink:0;}
|
||||
.seg button{height:32px;padding:0 16px;border:none;background:#fff;color:var(--primary);font-size:var(--font-sm);cursor:pointer;border-right:1px solid var(--primary);transition:all .15s;}
|
||||
@@ -104,6 +104,24 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.badge--info{background:#E6F7FF;color:#096DD9;border:1px solid #91D5FF;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
/* 五类人群标签(参考 daily-employee-search) */
|
||||
.ftag{display:inline-block;padding:2px 10px;border-radius:12px;font-size:var(--font-xs);}
|
||||
.ftag--a{background:rgba(245,34,45,.1);color:#f5222d;}
|
||||
.ftag--b{background:rgba(250,140,22,.12);color:#fa8c16;}
|
||||
.ftag--c{background:rgba(212,177,6,.14);color:#b8960a;}
|
||||
.ftag--d{background:rgba(104,98,214,.12);color:#6862D6;}
|
||||
.ftag--e{background:rgba(42,193,139,.12);color:#2ac18b;}
|
||||
/* 频次任务生成总开关与人群频次行 */
|
||||
.switch{position:relative;display:inline-block;width:40px;height:22px;flex:none;}
|
||||
.switch input{opacity:0;width:0;height:0;}
|
||||
.switch i{position:absolute;inset:0;background:#CCC;border-radius:11px;transition:.2s;cursor:pointer;}
|
||||
.switch i::before{content:'';position:absolute;width:18px;height:18px;left:2px;top:2px;background:#fff;border-radius:50%;transition:.2s;}
|
||||
.switch input:checked+i{background:var(--primary);}
|
||||
.switch input:checked+i::before{transform:translateX(18px);}
|
||||
.gf-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:1px dashed var(--border);}
|
||||
.gf-row:last-child{border-bottom:none;}
|
||||
.gf-row .gf-select{min-width:140px;height:32px;}
|
||||
.gf-row select:disabled{color:var(--text-placeholder);background-color:#FAFAFA;cursor:not-allowed;}
|
||||
.chip{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
@@ -129,8 +147,14 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
.radio-group{display:flex;gap:16px;min-height:32px;align-items:center;flex-wrap:wrap;}
|
||||
.radio{display:flex;align-items:center;gap:6px;font-size:var(--font-sm);cursor:pointer;}
|
||||
.radio input{accent-color:var(--primary);cursor:pointer;}
|
||||
.emp-pick{display:flex;gap:8px;align-items:center;}
|
||||
.emp-pick .form-control{flex:1;}
|
||||
/* 员工查询浮层(参考 daily-follow 新增随访) */
|
||||
.inquiry{display:flex;gap:10px;position:relative;flex-wrap:wrap;}
|
||||
.iq-result{display:none;position:absolute;top:40px;left:0;right:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);max-height:220px;overflow:auto;}
|
||||
.iq-result.open{display:block;}
|
||||
.iq-result table{width:100%;min-width:0;border-collapse:collapse;font-size:var(--font-sm);}
|
||||
.iq-result th{background:#F6F8FC;color:var(--text-secondary);font-weight:500;padding:8px 10px;text-align:center;white-space:nowrap;}
|
||||
.iq-result td{padding:8px 10px;text-align:center;border-bottom:1px solid #F0F2F5;color:var(--text-primary);white-space:nowrap;}
|
||||
.iq-result tr.row:hover{background:#F2F6FF;cursor:pointer;}
|
||||
.emp-card{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px 16px;background:#F7F9FC;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 16px;margin:8px 0 4px;}
|
||||
.emp-card div{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.emp-card b{color:var(--text-primary);font-weight:600;margin-left:4px;}
|
||||
@@ -150,7 +174,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -166,13 +190,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -191,14 +209,25 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- [交互] Tab:单次巡诊 / 频次巡诊 / 申请巡诊 -->
|
||||
<div class="tabs-bar">
|
||||
<button class="tab-btn active" id="tabOnce" onclick="switchTab('once')">单次巡诊</button>
|
||||
<button class="tab-btn" id="tabFreq" onclick="switchTab('freq')">频次巡诊</button>
|
||||
<button class="tab-btn" id="tabApply" onclick="switchTab('apply')">申请巡诊</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
@@ -219,22 +248,22 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:120px;">
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:110px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>分配医疗点</label>
|
||||
<select class="filter-select" id="filterPoint" style="min-width:160px;">
|
||||
<select class="filter-select" id="filterPoint" style="min-width:120px;">
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item" id="filterDateItem">
|
||||
<label>计划随访日期</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:110px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:110px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
@@ -242,13 +271,6 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] Tab:单次巡诊 / 频次巡诊 / 申请巡诊 -->
|
||||
<div class="tabs-bar">
|
||||
<button class="tab-btn active" id="tabOnce" onclick="switchTab('once')">单次巡诊 <span class="cnt" id="cntOnce"></span></button>
|
||||
<button class="tab-btn" id="tabFreq" onclick="switchTab('freq')">频次巡诊 <span class="cnt" id="cntFreq"></span></button>
|
||||
<button class="tab-btn" id="tabApply" onclick="switchTab('apply')">申请巡诊 <span class="cnt" id="cntApply"></span></button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作栏:按钮 + 状态分组 -->
|
||||
<div class="action-bar">
|
||||
<div class="action-bar__left">
|
||||
@@ -280,7 +302,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="table-card" id="paneOnce" style="margin-top:16px;">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead><tr><th>序号</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>计划随访日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>计划随访日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<tbody id="onceBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -290,7 +312,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="table-card" id="paneFreq" style="display:none;margin-top:16px;">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead><tr><th>序号</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>计划随访日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>计划随访日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<tbody id="freqBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -300,7 +322,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="table-card" id="paneApply" style="display:none;margin-top:16px;">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead><tr><th>序号</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>申请内容</th><th>申请日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>申请内容</th><th>提交日期</th><th>实际随访日期</th><th>状态</th><th>操作</th></tr></thead>
|
||||
<tbody id="applyBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -312,11 +334,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer" id="taskDrawer">
|
||||
<div class="drawer__header"><span id="taskTitle">新增</span><button class="drawer__close" onclick="closeDrawer('task')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<div class="form-item">
|
||||
<!-- [交互] 员工查询:切换姓名/员工编号搜索,点击结果行回填员工卡片;无结果提示「未查询到此员工信息」 -->
|
||||
<div class="form-item" id="inqRow">
|
||||
<span class="form-label"><span class="req">*</span> 员工</span>
|
||||
<div class="emp-pick">
|
||||
<input class="form-control" id="tEmp" readonly placeholder="请选择员工">
|
||||
<button class="btn btn-primary" id="tEmpBtn" onclick="openEmpPick()">选择</button>
|
||||
<div class="inquiry">
|
||||
<select class="filter-select" id="inqType" style="height:32px;min-width:92px;flex:none;">
|
||||
<option>姓名</option><option>员工编号</option>
|
||||
</select>
|
||||
<input class="form-control" id="inqKw" placeholder="请输入姓名后搜索" style="width:240px;flex:none;" onkeydown="if(event.key==='Enter'){event.preventDefault();searchEmp();}">
|
||||
<button class="btn btn-primary" style="height:32px;" onclick="searchEmp()">搜索</button>
|
||||
<button class="btn btn-default" style="height:32px;" onclick="resetInquiry()">重置</button>
|
||||
<div class="iq-result" id="iqResult"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="emp-card" id="tEmpCard" style="display:none;"></div>
|
||||
@@ -332,27 +360,6 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 选择员工弹窗 -->
|
||||
<div class="modal-mask" id="empPickMask">
|
||||
<div class="modal" style="width:760px;">
|
||||
<div class="modal__title">选择员工</div>
|
||||
<div style="display:flex;gap:8px;margin-bottom:12px;">
|
||||
<input class="form-control" id="empQ" placeholder="请输入姓名或工号" oninput="renderEmpPick()">
|
||||
<button class="btn btn-primary" onclick="renderEmpPick()">查询</button>
|
||||
</div>
|
||||
<div class="pick-table__wrap">
|
||||
<table class="pick-table">
|
||||
<thead><tr><th></th><th>姓名</th><th>工号</th><th>性别</th><th>年龄</th><th>员工所属单位</th><th>分配医疗点</th></tr></thead>
|
||||
<tbody id="empPickBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('empPickMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmEmpPick()">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 频次配置信息弹窗 -->
|
||||
<div class="modal-mask" id="freqCfgMask">
|
||||
<div class="modal--wide">
|
||||
@@ -360,9 +367,13 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="modal__body">
|
||||
<div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:16px;">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="fcName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="fcCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位</label>
|
||||
<select class="filter-select" id="fcUnit" onchange="onFcUnit()" style="min-width:120px;">
|
||||
@@ -379,9 +390,15 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<button class="btn btn-primary" onclick="renderFreqConfig()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetFreqConfig()">重置</button>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px;">
|
||||
<div id="genOffTip" style="display:none;padding:6px 12px;background:#FFFBE6;border:1px solid #FFE58F;border-radius:var(--radius-sm);font-size:var(--font-sm);color:#D48806;">频次任务生成已关闭,以下为当前配置</div>
|
||||
<button class="btn btn-primary" onclick="openAdjustConfig()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M9.5 1.5l3 3L5 12H2V9l7.5-7.5z" stroke="#fff" stroke-width="1.4" stroke-linejoin="round"/></svg>调整配置
|
||||
</button>
|
||||
</div>
|
||||
<div class="table-card__content" style="overflow-x:auto;">
|
||||
<table style="min-width:1100px;">
|
||||
<thead><tr><th>序号</th><th>员工姓名</th><th>工号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>所属单位</th><th>分配医疗点</th><th>人员类型</th><th>随访频次</th></tr></thead>
|
||||
<thead><tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>分配医疗点</th><th>五类人群</th><th>随访频次</th></tr></thead>
|
||||
<tbody id="fcBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -389,6 +406,26 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 调整配置弹窗(人群频次 + 频次任务生成总开关) -->
|
||||
<div class="modal-mask" id="adjustCfgMask">
|
||||
<div class="modal" style="width:480px;">
|
||||
<div class="modal__title">调整配置</div>
|
||||
<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;background:#F7F9FC;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 14px;margin-bottom:14px;">
|
||||
<span>
|
||||
<b style="color:var(--text-primary);">频次任务生成</b><br>
|
||||
<span id="genStateText" style="font-size:var(--font-xs);color:var(--text-secondary);">开启中:按各人群频次自动生成频次巡诊任务</span>
|
||||
</span>
|
||||
<label class="switch"><input type="checkbox" id="genSwitch" checked onchange="applyGenSwitchUi()"><i></i></label>
|
||||
</div>
|
||||
<div class="form-label" style="margin-bottom:4px;">各人群随访频次</div>
|
||||
<div id="groupFreqRows"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('adjustCfgMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveAdjustConfig()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 删除确认弹窗 -->
|
||||
<div class="modal-mask" id="delMask">
|
||||
<div class="modal" style="width:440px;">
|
||||
@@ -461,16 +498,18 @@ var applyTasks=[
|
||||
{id:3,code:'CQ041822',content:'家人血压问题想约门诊随访指导家庭监测',date:'2026-09-04',actual:'',status:2},
|
||||
{id:4,code:'CQ021578',content:'上次随访后血压仍偏高,申请复诊',date:'2026-08-20',actual:'2026-08-21',status:3}
|
||||
];
|
||||
/* 频次配置信息(人员类型=慢病类型,随访频次) */
|
||||
/* 频次配置信息(五类人群与员工档案页勾稽;不含D类人群。频次规则:E-健康人群每半年,C-异常人群每季度,B-慢病人群每月,A-大病人群每半个月) */
|
||||
var groupClass={'A':'ftag--a','B':'ftag--b','C':'ftag--c','D':'ftag--d','E':'ftag--e'};
|
||||
var groupName={'A':'A-大病人群','B':'B-慢病人群','C':'C-异常人群','D':'D-风险人群','E':'E-健康人群'};
|
||||
function renderGroup(g){return '<span class="ftag '+(groupClass[g]||'ftag--e')+'">'+(groupName[g]||'')+'</span>';}
|
||||
var freqConfig=[
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,tel:'150****6127',unit:'采油二厂',point:'桐园作业区医疗点',group:'高血压',freq:'每月'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,tel:'139****0086',unit:'第四采油厂',point:'西峰基地医疗点',group:'糖尿病',freq:'每月'},
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,tel:'139****2051',unit:'采油一厂',point:'樊学作业区医疗点',group:'高血压',freq:'每季度'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,tel:'137****8890',unit:'采油二厂',point:'姬圪台作业区医疗点',group:'冠心病',freq:'每季度'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,tel:'136****2248',unit:'采油二厂',point:'姬圪台作业区医疗点',group:'肥胖',freq:'每半年'},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,tel:'133****4860',unit:'采气一厂',point:'乌审旗采气区医疗点',group:'肥胖',freq:'每季度'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,tel:'135****7719',unit:'采气一厂',point:'靖边气田医疗点',group:'高血压',freq:'每月'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,tel:'147****9003',unit:'采气一厂',point:'靖边气田医疗点',group:'其他',freq:'每半年'}
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',point:'桐园作业区医疗点',group:'B',freq:'每月'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',point:'西峰基地医疗点',group:'A',freq:'每半个月'},
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',point:'樊学作业区医疗点',group:'C',freq:'每季度'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',point:'姬圪台作业区医疗点',group:'E',freq:'每半年'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',point:'姬圪台作业区医疗点',group:'C',freq:'每季度'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',point:'靖边气田医疗点',group:'E',freq:'每半年'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',point:'靖边气田医疗点',group:'E',freq:'每半年'}
|
||||
];
|
||||
var nextId=99,curTab='once',groupValue='0';
|
||||
var statusMap={1:'待随访',2:'已逾期',3:'已完成'};
|
||||
@@ -578,12 +617,14 @@ function onFilterUnit(){
|
||||
function matchTask(t){
|
||||
var e=E(t.code);
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
var plan=curTab==='apply'?t.date:t.plan;
|
||||
return (!name||e.name.indexOf(name)!==-1)
|
||||
&&(!code||e.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||e.unit===selUnit)&&(!selDept||e.dept===selDept)
|
||||
&&(!unit||pointUnit[e.point]===unit)&&(!point||e.point===point)
|
||||
&&(!from||plan>=from)&&(!to||plan<=to);
|
||||
@@ -619,15 +660,12 @@ function applyGroup(list){
|
||||
return list.filter(function(t){return String(t.status)===groupValue;});
|
||||
}
|
||||
function empCells(e){
|
||||
return '<td style="font-weight:600;">'+e.name+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.tel+'</td><td>'+e.unit+'</td><td>'+e.dept+'</td><td>'+e.point+'</td><td>'+pointUnit[e.point]+'</td>';
|
||||
return '<td style="font-weight:600;">'+e.name+'</td><td>'+e.code+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.unit+'</td><td>'+e.dept+'</td><td>'+e.point+'</td><td>'+pointUnit[e.point]+'</td>';
|
||||
}
|
||||
function statusCell(t){
|
||||
return '<td><span class="badge '+statusBadge[t.status]+'">'+statusMap[t.status]+'</span></td>';
|
||||
}
|
||||
function renderAll(){
|
||||
document.getElementById('cntOnce').textContent=currentOnce().length;
|
||||
document.getElementById('cntFreq').textContent=currentFreq().length;
|
||||
document.getElementById('cntApply').textContent=currentApply().length;
|
||||
var ol=applyGroup(currentOnce());
|
||||
document.getElementById('onceBody').innerHTML=ol.length?ol.map(function(t,i){
|
||||
var e=E(t.code);
|
||||
@@ -649,14 +687,14 @@ function renderAll(){
|
||||
+'<td>'+t.date+'</td><td>'+(t.actual||'—')+'</td>'+statusCell(t)+act+'</tr>';
|
||||
}).join(''):'<tr><td colspan="14" class="td-empty">暂无匹配任务</td></tr>';
|
||||
}
|
||||
/* 行操作:新增随访(待/逾期) / 编辑+删除(仅单次未完成) / 随访详情(已完成) */
|
||||
/* 行操作:新增随访(待/逾期,仅展示无点击交互) / 编辑+删除(仅单次未完成) / 随访详情(已完成,仅展示无点击交互) */
|
||||
function actionsHtml(t,tab,e){
|
||||
var done=t.status===3;
|
||||
var html='<td class="td-actions">';
|
||||
if(done){
|
||||
html+='<button class="btn btn-link" onclick="viewDetail('+t.id+')">随访详情</button>';
|
||||
html+='<button class="btn btn-link" style="cursor:default;" title="请在随访管理中查看随访详情">随访详情</button>';
|
||||
}else{
|
||||
html+='<button class="btn btn-link" onclick="addFollow()">新增随访</button>';
|
||||
html+='<button class="btn btn-link" style="cursor:default;" title="请在随访管理中录入随访结果">新增随访</button>';
|
||||
if(tab==='once'){
|
||||
html+='<button class="btn btn-link" onclick="editTask('+t.id+')">编辑</button>';
|
||||
html+='<button class="btn btn-link btn-link--danger" onclick="askDelete('+t.id+')">删除</button>';
|
||||
@@ -668,6 +706,7 @@ function actionsHtml(t,tab,e){
|
||||
function applyFilter(){renderAll();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterCode').value='';
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
resetOrg();
|
||||
@@ -675,24 +714,14 @@ function resetFilter(){
|
||||
}
|
||||
|
||||
/* ===== 任务操作 ===== */
|
||||
/* [交互] 新增随访:跳转随访管理录入本次随访记录 */
|
||||
function addFollow(){
|
||||
showToast('正在跳转「随访管理」录入本次随访结果…');
|
||||
setTimeout(function(){location.href='daily-follow.html?action=new';},500);
|
||||
}
|
||||
/* [交互] 随访详情:跳转随访管理查看随访台账 */
|
||||
function viewDetail(id){
|
||||
showToast('正在跳转「随访管理」查看随访详情…');
|
||||
setTimeout(function(){location.href='daily-follow.html';},500);
|
||||
}
|
||||
var editingId=null,pendingDelId=null;
|
||||
function editTask(id){
|
||||
var t=onceTasks.find(function(x){return x.id===id;});
|
||||
var e=E(t.code);
|
||||
editingId=id;
|
||||
document.getElementById('taskTitle').textContent='编辑';
|
||||
document.getElementById('tEmp').value=e.name;
|
||||
document.getElementById('tEmpBtn').disabled=true;
|
||||
document.getElementById('inqRow').style.display='none';
|
||||
resetInquiry();
|
||||
showEmpCard(e);
|
||||
document.getElementById('tDate').value=t.plan;
|
||||
document.getElementById('taskMask').classList.add('open');
|
||||
@@ -722,11 +751,9 @@ function showEmpCard(e){
|
||||
}
|
||||
function openCreate(){
|
||||
editingId=null;
|
||||
curPickEmp=null;
|
||||
document.getElementById('taskTitle').textContent='新增';
|
||||
document.getElementById('tEmp').value='';
|
||||
document.getElementById('tEmpBtn').disabled=false;
|
||||
showEmpCard(null);
|
||||
document.getElementById('inqRow').style.display='flex';
|
||||
resetInquiry();
|
||||
document.getElementById('tDate').value='2026-09-15';
|
||||
document.getElementById('taskMask').classList.add('open');
|
||||
document.getElementById('taskDrawer').classList.add('open');
|
||||
@@ -748,34 +775,48 @@ function saveTask(){
|
||||
renderAll();
|
||||
}
|
||||
|
||||
/* ===== 选择员工弹窗 ===== */
|
||||
function openEmpPick(){
|
||||
document.getElementById('empQ').value='';
|
||||
renderEmpPick();
|
||||
document.getElementById('empPickMask').classList.add('open');
|
||||
/* ===== 员工查询(参考 daily-follow 新增随访) ===== */
|
||||
function searchEmp(){
|
||||
var type=document.getElementById('inqType').value;
|
||||
var kw=document.getElementById('inqKw').value.trim();
|
||||
if(!kw){showToast('请输入姓名或员工编号');return;}
|
||||
var list=empPool.filter(function(e){
|
||||
return type==='员工编号' ? e.code.toLowerCase().indexOf(kw.toLowerCase())!==-1 : e.name.indexOf(kw)!==-1;
|
||||
});
|
||||
var box=document.getElementById('iqResult');
|
||||
if(!list.length){
|
||||
box.innerHTML='<div style="padding:14px;text-align:center;color:var(--text-placeholder);">未查询到此员工信息</div>';
|
||||
}else{
|
||||
box.innerHTML='<table><thead><tr><th>姓名</th><th>性别</th><th>年龄</th><th>员工编号</th><th>单位</th><th>部门</th></tr></thead><tbody>'
|
||||
+list.map(function(e){
|
||||
return '<tr class="row" onclick="pickEmp(\''+e.code+'\')"><td>'+e.name+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.code+'</td><td>'+e.unit+'</td><td>'+e.dept+'</td></tr>';
|
||||
}).join('')
|
||||
+'</tbody></table>';
|
||||
}
|
||||
box.classList.add('open');
|
||||
}
|
||||
function renderEmpPick(){
|
||||
var q=document.getElementById('empQ').value.trim();
|
||||
var list=empPool.filter(function(e){return !q||e.name.indexOf(q)!==-1||e.code.toLowerCase().indexOf(q.toLowerCase())!==-1;});
|
||||
document.getElementById('empPickBody').innerHTML=list.length?list.map(function(e){
|
||||
return '<tr><td><input type="radio" name="empSel" value="'+e.code+'"></td>'
|
||||
+'<td style="font-weight:600;">'+e.name+'</td><td>'+e.code+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.unit+'</td><td>'+e.point+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="7" class="td-empty">未找到匹配员工</td></tr>';
|
||||
function pickEmp(code){
|
||||
var e=empPool.find(function(x){return x.code===code;});
|
||||
if(!e)return;
|
||||
curPickEmp=e;
|
||||
showEmpCard(e);
|
||||
document.getElementById('iqResult').classList.remove('open');
|
||||
}
|
||||
function confirmEmpPick(){
|
||||
var r=document.querySelector('input[name="empSel"]:checked');
|
||||
if(!r){showToast('请选择一名员工');return;}
|
||||
curPickEmp=empPool.find(function(x){return x.code===r.value;});
|
||||
document.getElementById('tEmp').value=curPickEmp.name;
|
||||
showEmpCard(curPickEmp);
|
||||
closeModal('empPickMask');
|
||||
function resetInquiry(){
|
||||
curPickEmp=null;
|
||||
document.getElementById('inqKw').value='';
|
||||
document.getElementById('iqResult').innerHTML='';
|
||||
document.getElementById('iqResult').classList.remove('open');
|
||||
showEmpCard(null);
|
||||
}
|
||||
|
||||
/* ===== 频次配置信息弹窗 ===== */
|
||||
function openFreqConfig(){
|
||||
document.getElementById('fcName').value='';
|
||||
document.getElementById('fcCode').value='';
|
||||
document.getElementById('fcUnit').value='';
|
||||
document.getElementById('fcPoint').innerHTML='<option value="">全部医疗点</option>';
|
||||
document.getElementById('genOffTip').style.display=genEnabled?'none':'block';
|
||||
renderFreqConfig();
|
||||
document.getElementById('freqCfgMask').classList.add('open');
|
||||
}
|
||||
@@ -787,23 +828,61 @@ function onFcUnit(){
|
||||
}
|
||||
function renderFreqConfig(){
|
||||
var name=document.getElementById('fcName').value.trim();
|
||||
var code=document.getElementById('fcCode').value.trim();
|
||||
var unit=document.getElementById('fcUnit').value;
|
||||
var point=document.getElementById('fcPoint').value;
|
||||
var list=freqConfig.filter(function(c){
|
||||
return (!name||c.name.indexOf(name)!==-1)
|
||||
&&(!code||c.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!unit||c.unit===unit)&&(!point||c.point===point);
|
||||
});
|
||||
document.getElementById('fcBody').innerHTML=list.length?list.map(function(c,i){
|
||||
return '<tr><td>'+(i+1)+'</td><td style="font-weight:600;">'+c.name+'</td><td>'+c.code+'</td><td>'+c.sex+'</td><td>'+c.age+'</td><td>'+c.tel+'</td><td>'+c.unit+'</td><td>'+c.point+'</td><td><span class="badge badge--muted">'+c.group+'</span></td><td>'+c.freq+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="10" class="td-empty">暂无频次配置</td></tr>';
|
||||
return '<tr><td>'+(i+1)+'</td><td style="font-weight:600;">'+c.name+'</td><td>'+c.code+'</td><td>'+c.sex+'</td><td>'+c.age+'</td><td>'+c.unit+'</td><td>'+c.point+'</td><td>'+renderGroup(c.group)+'</td><td>'+c.freq+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="9" class="td-empty">暂无频次配置</td></tr>';
|
||||
}
|
||||
function resetFreqConfig(){
|
||||
document.getElementById('fcName').value='';
|
||||
document.getElementById('fcCode').value='';
|
||||
document.getElementById('fcUnit').value='';
|
||||
document.getElementById('fcPoint').innerHTML='<option value="">全部医疗点</option>';
|
||||
renderFreqConfig();
|
||||
}
|
||||
|
||||
/* ===== 调整配置(各人群频次 + 频次任务生成总开关) ===== */
|
||||
var genEnabled=true;
|
||||
var groupFreqOrder=['A','B','C','D','E'];
|
||||
var groupFreqRule={A:'每半个月',B:'每月',C:'每季度',D:'无',E:'每半年'};
|
||||
function openAdjustConfig(){
|
||||
document.getElementById('genSwitch').checked=genEnabled;
|
||||
renderGroupFreqRows();
|
||||
document.getElementById('adjustCfgMask').classList.add('open');
|
||||
}
|
||||
function renderGroupFreqRows(){
|
||||
var opts=['每半个月','每月','每季度','每半年','每年','无'];
|
||||
document.getElementById('groupFreqRows').innerHTML=groupFreqOrder.map(function(g){
|
||||
return '<div class="gf-row"><span class="ftag '+groupClass[g]+'">'+groupName[g]+'</span>'
|
||||
+'<select class="filter-select gf-select" id="gf_'+g+'">'
|
||||
+opts.map(function(o){return '<option'+(groupFreqRule[g]===o?' selected':'')+'>'+o+'</option>';}).join('')
|
||||
+'</select></div>';
|
||||
}).join('');
|
||||
applyGenSwitchUi();
|
||||
}
|
||||
function applyGenSwitchUi(){
|
||||
var on=document.getElementById('genSwitch').checked;
|
||||
document.getElementById('genStateText').textContent=on?'开启中:按各人群频次自动生成频次巡诊任务':'已关闭:不再自动生成频次巡诊任务';
|
||||
groupFreqOrder.forEach(function(g){document.getElementById('gf_'+g).disabled=!on;});
|
||||
}
|
||||
function saveAdjustConfig(){
|
||||
var on=document.getElementById('genSwitch').checked;
|
||||
genEnabled=on;
|
||||
groupFreqOrder.forEach(function(g){groupFreqRule[g]=document.getElementById('gf_'+g).value;});
|
||||
freqConfig.forEach(function(c){c.freq=groupFreqRule[c.group];});
|
||||
document.getElementById('genOffTip').style.display=on?'none':'block';
|
||||
closeModal('adjustCfgMask');
|
||||
renderFreqConfig();
|
||||
showToast(on?'频次配置已保存,将按各人群频次自动生成巡诊任务':'频次任务生成已关闭');
|
||||
}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
function closeModal(id){document.getElementById(id).classList.remove('open');}
|
||||
function showToast(msg){
|
||||
|
||||
@@ -38,11 +38,11 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:12px;flex-wrap:nowrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:120px;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:100px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.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;white-space:nowrap;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
@@ -82,7 +82,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.org-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger{height:36px;min-width:130px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:36px;left:0;z-index:310;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:380px;}
|
||||
.org-panel.open{display:flex;}
|
||||
@@ -131,6 +131,34 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
.mini-table{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;min-width:0;}
|
||||
.mini-table thead th{background:#FAFAFA;position:sticky;top:0;font-size:var(--font-sm);}
|
||||
.mini-table td{white-space:normal;font-size:var(--font-sm);}
|
||||
/* 员工查询浮层(参考 daily-treatment 新增就诊) */
|
||||
.inquiry{display:flex;gap:10px;position:relative;flex-wrap:wrap;}
|
||||
.iq-result{display:none;position:absolute;top:40px;left:0;right:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);max-height:220px;overflow:auto;}
|
||||
.iq-result.open{display:block;}
|
||||
.iq-result table{width:100%;min-width:0;border-collapse:collapse;font-size:var(--font-sm);}
|
||||
.iq-result th{background:#F6F8FC;color:var(--text-secondary);font-weight:500;padding:8px 10px;text-align:center;white-space:nowrap;}
|
||||
.iq-result td{padding:8px 10px;text-align:center;border-bottom:1px solid #F0F2F5;color:var(--text-primary);white-space:nowrap;}
|
||||
.iq-result tr.row:hover{background:#F2F6FF;cursor:pointer;}
|
||||
.chip{display:inline-flex;align-items:center;background:var(--primary-light);border:1px solid #91D5FF;color:#096DD9;padding:1px 10px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-row{display:flex;align-items:center;gap:6px;margin-top:10px;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
/* 用药卡片(参考 daily-treatment 新增用药) */
|
||||
.med-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
|
||||
.med-card{background:#F2F6FF;border-radius:var(--radius-sm);padding:10px 14px;font-size:var(--font-sm);color:var(--text-secondary);line-height:1.9;position:relative;}
|
||||
.med-card b{color:var(--text-primary);}
|
||||
.med-card__ops{position:absolute;top:10px;right:12px;}
|
||||
.op-del{color:var(--danger);cursor:pointer;}
|
||||
.add-med-btn{width:100%;height:44px;border:1px dashed var(--primary);border-radius:var(--radius-sm);background:#F2F6FF;color:var(--primary);font-size:var(--font-sm);cursor:pointer;margin-top:10px;}
|
||||
.add-med-btn:hover{background:var(--primary-light);}
|
||||
/* 关联随访任务(参考 PAD follow-drawer) */
|
||||
.task-opt{border:1px dashed var(--primary);border-radius:var(--radius-sm);background:#F7FBFF;padding:10px 14px;font-size:var(--font-sm);color:var(--text-secondary);line-height:1.9;display:flex;align-items:center;gap:10px;cursor:pointer;margin-bottom:10px;}
|
||||
.task-opt input{accent-color:var(--primary);width:15px;height:15px;flex:none;}
|
||||
.task-opt--on{background:#DAE3F3;}
|
||||
.pill{display:inline-block;padding:1px 10px;border-radius:12px;font-size:var(--font-xs);background:rgba(252,163,24,.12);color:#FCA318;flex:none;}
|
||||
.pill--over{background:rgba(253,33,33,.08);color:#FD2121;}
|
||||
.pill--success{background:rgba(82,196,26,.12);color:#389E0D;}
|
||||
/* 签字(参考 PAD follow-drawer) */
|
||||
.sign-box{flex:1;height:110px;border:1px dashed #B7C3D6;border-radius:var(--radius-sm);background:#F7F9FC;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#969EB0;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sign-box svg{width:22px;height:22px;stroke:#969EB0;fill:none;stroke-width:2;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -140,7 +168,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -156,13 +184,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item active">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -184,11 +206,15 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>随访员工</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
@@ -209,28 +235,22 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:120px;">
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:110px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>分配医疗点</label>
|
||||
<select class="filter-select" id="filterPoint" style="min-width:160px;">
|
||||
<select class="filter-select" id="filterPoint" style="min-width:140px;">
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工确认状态</label>
|
||||
<select class="filter-select" id="filterConfirm" style="min-width:100px;">
|
||||
<option value="">全部</option><option>已确认</option><option>待确认</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>随访日期</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:120px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:120px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
@@ -241,9 +261,8 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-primary" onclick="openForm()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增随访记录
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增随访
|
||||
</button>
|
||||
<button class="btn btn-default btn-link--danger" onclick="askBatchDelete()">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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" onclick="openExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
</div>
|
||||
@@ -254,7 +273,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th>随访员工</th><th>员工编号</th><th>性别</th><th>年龄</th><th>症状</th><th>随访形式</th><th>随访医生</th><th>分配医疗点</th><th>医疗点所属单位</th><th>随访日期</th><th>下次随访</th><th>员工确认</th><th>操作</th>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>单位</th><th>部门</th><th>症状</th><th>随访形式</th><th>随访日期</th><th>下次随访日期</th><th>随访医生</th><th>分配医疗点</th><th>医疗点所属单位</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -275,56 +294,78 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer" id="formDrawer">
|
||||
<div class="drawer__header"><span id="formTitle">新增随访记录</span><button class="drawer__close" onclick="closeDrawer('form')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<div class="form-section">随访员工</div>
|
||||
<div class="with-btn" style="margin-bottom:12px;">
|
||||
<input class="form-control" id="fUser" readonly placeholder="点击下方按钮选择随访员工" style="flex:1;">
|
||||
<button class="btn btn-default" onclick="openEmpPick()">选择员工</button>
|
||||
<div class="form-section">基本信息</div>
|
||||
<!-- [交互] 员工查询:切换姓名/员工编号搜索,点击结果行回填只读信息并回显慢病标签;无结果提示「未查询到此员工信息」 -->
|
||||
<div class="form-item form-item--full" id="inqRow">
|
||||
<span class="form-label"><span class="req">*</span> 随访员工</span>
|
||||
<div class="inquiry">
|
||||
<select class="filter-select" id="inqType" style="height:32px;min-width:92px;flex:none;">
|
||||
<option>姓名</option><option>员工编号</option>
|
||||
</select>
|
||||
<input class="form-control" id="inqKw" placeholder="请输入姓名后搜索" style="width:240px;flex:none;" onkeydown="if(event.key==='Enter'){event.preventDefault();searchEmp();}">
|
||||
<button class="btn btn-primary" style="height:32px;" onclick="searchEmp()">搜索</button>
|
||||
<button class="btn btn-default" style="height:32px;" onclick="resetInquiry()">重置</button>
|
||||
<div class="iq-result" id="iqResult"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="emp-card" id="empCard" style="display:none;"></div>
|
||||
<div class="form-grid" id="empFields" style="display:none;">
|
||||
<div class="form-item"><span class="form-label">姓名</span><input class="form-control" id="fUser" readonly></div>
|
||||
<div class="form-item"><span class="form-label">性别</span><input class="form-control" id="fSex" readonly></div>
|
||||
<div class="form-item"><span class="form-label">年龄</span><input class="form-control" id="fAge" readonly></div>
|
||||
<div class="form-item"><span class="form-label">员工编号</span><input class="form-control" id="fCode" readonly></div>
|
||||
<div class="form-item"><span class="form-label">联系电话</span><input class="form-control" id="fTel" readonly></div>
|
||||
<div class="form-item"><span class="form-label">所属单位</span><input class="form-control" id="fUUnit" readonly></div>
|
||||
<div class="form-item"><span class="form-label">所属部门</span><input class="form-control" id="fUDept" readonly></div>
|
||||
<div class="form-item"><span class="form-label">分配医疗点</span><input class="form-control" id="fUPoint" readonly></div>
|
||||
</div>
|
||||
<div class="tag-row" id="empTags" style="display:none;"><span>慢病干预:</span><span id="empTagList" style="display:flex;gap:6px;flex-wrap:wrap;"></span></div>
|
||||
|
||||
<div class="form-section">随访信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">症状</span><input class="form-control" id="fSymptom" placeholder="本次随访主要症状"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访形式</span>
|
||||
<div class="radio-group" id="rgForm">
|
||||
<label class="radio"><input type="radio" name="fForm" value="门诊">门诊</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="巡诊">巡诊</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="家庭">家庭</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="电话">电话</label>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访医生</span><input class="form-control" id="fDoctor" readonly></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访日期</span><input class="form-control" id="fDate" readonly></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 随访形式</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fForm" value="门诊随访">门诊随访</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="巡诊随访">巡诊随访</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="家庭随访">家庭随访</label>
|
||||
<label class="radio"><input type="radio" name="fForm" value="电话随访">电话随访</label>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访日期</span><input class="form-control" type="date" id="fDate"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访医生</span><select class="form-control" id="fDoctor"><option value="">请选择医生</option></select></div>
|
||||
<div class="form-item"><span class="form-label">下次随访日期</span><input class="form-control" type="date" id="fNext"></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 症状</span><textarea class="form-control" id="fSymptom" placeholder="请输入目前症状与主诉"></textarea></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">体征</div>
|
||||
<div class="form-grid form-grid--3">
|
||||
<div class="form-item"><span class="form-label">血压(mmHg)</span><input class="form-control" id="vBp" placeholder="如 130/85"></div>
|
||||
<div class="form-item"><span class="form-label">心率(次/分)</span><input class="form-control" id="vHr" placeholder="次/分钟"></div>
|
||||
<div class="form-item"><span class="form-label">血糖(mmol/L)</span><input class="form-control" id="vGlucose" placeholder="空腹"></div>
|
||||
<div class="form-item"><span class="form-label">身高(cm)</span><input class="form-control" id="vHeight" oninput="calcBmi()" placeholder="厘米"></div>
|
||||
<div class="form-item"><span class="form-label">体重(kg)</span><input class="form-control" id="vWeight" oninput="calcBmi()" placeholder="公斤"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 血压(mmHg)</span><input class="form-control" id="vBp" placeholder="收缩压/舒张压"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 心率(次/分)</span><input class="form-control" id="vHr" placeholder="次/分钟"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 血糖(mmol/L)</span><input class="form-control" id="vGlucose" placeholder="空腹"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 身高(cm)</span><input class="form-control" id="vHeight" oninput="calcBmi()" placeholder="厘米"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 体重(kg)</span><input class="form-control" id="vWeight" oninput="calcBmi()" placeholder="公斤"></div>
|
||||
<div class="form-item"><span class="form-label">体质指数BMI</span><input class="form-control" id="vBmi" readonly placeholder="自动计算"></div>
|
||||
<div class="form-item"><span class="form-label">腰围(cm)</span><input class="form-control" id="vWaist" placeholder="厘米"></div>
|
||||
<div class="form-item form-item--full"><span class="form-label">其他体征</span><input class="form-control" id="vOther" placeholder="补充体征"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 腰围(cm)</span><input class="form-control" id="vWaist" oninput="calcWhr()" placeholder="厘米"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 臀围(cm)</span><input class="form-control" id="vHip" oninput="calcWhr()" placeholder="厘米"></div>
|
||||
<div class="form-item"><span class="form-label">腰身比</span><input class="form-control" id="vWhr" readonly placeholder="自动计算"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">生活方式</div>
|
||||
<div class="form-grid form-grid--3">
|
||||
<div class="form-item"><span class="form-label">日吸烟量(支)</span><input class="form-control" id="lSmoke" placeholder="0"></div>
|
||||
<div class="form-item"><span class="form-label">日饮酒量(两)</span><input class="form-control" id="lDrink" placeholder="0"></div>
|
||||
<div class="form-item"><span class="form-label">吸烟量(支/日)</span><input class="form-control" id="lSmoke" placeholder="0"></div>
|
||||
<div class="form-item"><span class="form-label">饮酒量(两/日)</span><input class="form-control" id="lDrink" placeholder="0"></div>
|
||||
<div class="form-item"><span class="form-label">运动频率(次/周)</span><input class="form-control" id="lSport" placeholder="每周次数"></div>
|
||||
<div class="form-item"><span class="form-label">运动时长(分钟/次)</span><input class="form-control" id="lSportDur" placeholder="分钟"></div>
|
||||
<div class="form-item"><span class="form-label">摄盐情况</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="lSalt" value="轻">轻</label>
|
||||
<label class="radio"><input type="radio" name="lSalt" value="中">中</label>
|
||||
<label class="radio"><input type="radio" name="lSalt" value="重">重</label>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label">心理行为</span>
|
||||
<div class="form-item"><span class="form-label">心理调整</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="lMental" value="良好">良好</label>
|
||||
<label class="radio"><input type="radio" name="lMental" value="一般">一般</label>
|
||||
<label class="radio"><input type="radio" name="lMental" value="差">差</label>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label">遵医行为</span>
|
||||
<div class="form-item form-item--full"><span class="form-label">遵医行为</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="lWill" value="良好">良好</label>
|
||||
<label class="radio"><input type="radio" name="lWill" value="一般">一般</label>
|
||||
@@ -333,33 +374,63 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
|
||||
<div class="form-section">用药情况</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">服药依从性</span>
|
||||
<div class="med-grid" id="medCards"></div>
|
||||
<button class="add-med-btn" onclick="openMedPick()">+ 新增用药</button>
|
||||
<div class="form-grid" style="margin-top:14px;">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 用药依从性</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="mDepend" value="规律">规律</label>
|
||||
<label class="radio"><input type="radio" name="mDepend" value="间断">间断</label>
|
||||
<label class="radio"><input type="radio" name="mDepend" value="不服药">不服药</label>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label">药物不良反应</span>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药物不良反应</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="mReact" value="无">无</label>
|
||||
<label class="radio"><input type="radio" name="mReact" value="有">有</label>
|
||||
<label class="radio"><input type="radio" name="mReact" value="存在">存在</label>
|
||||
</div></div>
|
||||
<div class="form-item form-item--full"><span class="form-label">其他药物/备注</span><input class="form-control" id="mOther" placeholder="自服药物或其他说明"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">健康风险评估与处方</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">健康风险评估</span><textarea class="form-control" id="fRisk" placeholder="风险等级与主要风险因素"></textarea></div>
|
||||
<div class="form-section">风险评估</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">膳食处方</span><textarea class="form-control" id="fFood" placeholder="饮食建议"></textarea></div>
|
||||
<div class="form-item"><span class="form-label">运动处方</span><textarea class="form-control" id="fSportPlan" placeholder="运动建议"></textarea></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 原因</span><input class="form-control" id="fReason" placeholder="请输入导致指标异常或病情波动的原因"></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> 措施</span><input class="form-control" id="fMeasure" placeholder="请输入干预措施"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">生活建议</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">膳食处方</span><textarea class="form-control" id="fFood" placeholder="请输入膳食处方"></textarea></div>
|
||||
<div class="form-item"><span class="form-label">运动处方</span><textarea class="form-control" id="fSportPlan" placeholder="请输入运动处方"></textarea></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">关联任务</div>
|
||||
<div id="taskBox"></div>
|
||||
|
||||
<div class="form-section">员工签字</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 下次随访</span><input class="form-control" type="date" id="fNext"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 随访效果</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fEval" value="良好">良好</label>
|
||||
<label class="radio"><input type="radio" name="fEval" value="一般">一般</label>
|
||||
<label class="radio"><input type="radio" name="fEval" value="不良">不良</label>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="form-item form-item--full" style="margin-bottom:0;">
|
||||
<span class="form-label"><span class="req">*</span> 签字</span>
|
||||
<div class="radio-group" style="margin-bottom:10px;">
|
||||
<label class="radio"><input type="radio" name="signType" checked onclick="switchSignType('hand')">手写签名</label>
|
||||
<label class="radio"><input type="radio" name="signType" onclick="switchSignType('img')">签字图片</label>
|
||||
</div>
|
||||
<div class="sign-box" id="signHandBox" onclick="showToast('手写签名为原型演示')">
|
||||
<svg viewBox="0 0 24 24"><path d="M17 3a2.8 2.8 0 014 4L7.5 20.5 2 22l1.5-5.5z"/></svg>
|
||||
点击签名
|
||||
</div>
|
||||
<div class="sign-box" id="signImgBox" style="display:none" onclick="document.getElementById('signImgInput').click()">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 16V4M7 9l5-5 5 5"/><path d="M4 20h16"/></svg>
|
||||
上传签字图片
|
||||
</div>
|
||||
<input type="file" id="signImgInput" accept="image/*" style="display:none" onchange="onSignImg(this)">
|
||||
</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">随访效果评价</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fEval" value="良好">良好</label>
|
||||
<label class="radio"><input type="radio" name="fEval" value="一般">一般</label>
|
||||
<label class="radio"><input type="radio" name="fEval" value="差">差</label>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="drawer__footer">
|
||||
<button class="btn btn-default" onclick="closeDrawer('form')">取消</button>
|
||||
@@ -375,25 +446,15 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('view')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 随访员工选人弹窗(仅已分配员工) -->
|
||||
<div class="modal-mask" id="empMask">
|
||||
<div class="modal modal--wide">
|
||||
<div class="modal__title">选择随访员工</div>
|
||||
<div class="filter-bar" style="border-radius:var(--radius-sm);box-shadow:none;padding:0;margin-bottom:14px;">
|
||||
<div class="filter-item">
|
||||
<label>姓名/工号</label>
|
||||
<input class="filter-input" id="empQ" placeholder="输入姓名或工号过滤" style="min-width:150px;" oninput="renderEmpPick()">
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-holder">
|
||||
<table class="mini-table">
|
||||
<thead><tr><th style="width:40px"></th><th>姓名</th><th>工号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>慢病类型</th><th>分配医疗点</th></tr></thead>
|
||||
<tbody id="empBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- [交互] 新增用药弹窗 -->
|
||||
<div class="modal-mask" id="medMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title">新增用药</div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 药物名称</span><input class="form-control" id="medName" placeholder="请输入药物名称"></div>
|
||||
<div class="form-item" style="margin-bottom:14px;"><span class="form-label"><span class="req">*</span> 用法用量</span><input class="form-control" id="medUsage" placeholder="如:口服,一日1次,一次1片"></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('empMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmEmp()">确认选择</button>
|
||||
<button class="btn btn-default" onclick="closeModal('medMask')">取 消</button>
|
||||
<button class="btn btn-primary" onclick="addMed()">确 认</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -452,38 +513,38 @@ var empPool=[
|
||||
];
|
||||
/* 随访记录:s=症状 form=形式 confirm=员工确认 */
|
||||
var follows=[
|
||||
{id:1,user:'赵万福',code:'CQ033096',sex:'男',age:39,point:'桐园作业区医疗点',doctor:'曲志明',form:'门诊',date:'2026-09-05',next:'2026-10-05',confirm:'已确认',symptom:'头晕较前减轻,血压波动',
|
||||
{id:1,user:'赵万福',code:'CQ033096',sex:'男',age:39,point:'桐园作业区医疗点',doctor:'曲志明',form:'门诊随访',date:'2026-09-05',next:'2026-10-05',confirm:'已确认',symptom:'头晕较前减轻,血压波动',
|
||||
bp:'146/92',hr:76,glucose:5.6,height:172,weight:79,bmi:26.7,waist:92,other:'',
|
||||
smoke:10,drink:2,sport:2,salt:'中',mental:'良好',will:'一般',depend:'间断',react:'无',otherMed:'自购降压补剂已停用',
|
||||
risk:'高危:血压未达标+吸烟,建议加强用药依从性管理',food:'低盐低脂,每日食盐<5g',sportPlan:'每周5次快走,每次30分钟',evalv:'一般'},
|
||||
{id:2,user:'高建军',code:'CQ010564',sex:'男',age:50,point:'西峰基地医疗点',doctor:'闫婷',form:'门诊',date:'2026-09-03',next:'2026-09-17',confirm:'已确认',symptom:'口渴乏力减轻,血糖仍偏高',
|
||||
risk:'高危:血压未达标+吸烟,建议加强用药依从性管理',food:'低盐低脂,每日食盐<5g',sportPlan:'每周5次快走,每次30分钟',evalv:'一般',rx:[{name:'缬沙坦胶囊',usage:'口服,一日1次,一次1片'}]},
|
||||
{id:2,user:'高建军',code:'CQ010564',sex:'男',age:50,point:'西峰基地医疗点',doctor:'闫婷',form:'门诊随访',date:'2026-09-03',next:'2026-09-17',confirm:'已确认',symptom:'口渴乏力减轻,血糖仍偏高',
|
||||
bp:'132/84',hr:72,glucose:8.9,height:168,weight:77,bmi:27.3,waist:95,other:'足背动脉搏动正常',
|
||||
smoke:0,drink:1,sport:3,salt:'中',mental:'良好',will:'良好',depend:'规律',react:'无',otherMed:'',
|
||||
risk:'高危:血糖控制欠佳,需两周复查并强化饮食管理',food:'控制总热量,主食粗细搭配',sportPlan:'餐后1小时快走30分钟',evalv:'一般'},
|
||||
{id:3,user:'张秀兰',code:'CQ027710',sex:'女',age:45,point:'姬圪台作业区医疗点',doctor:'曲志明',form:'电话',date:'2026-09-01',next:'2026-11-01',confirm:'待确认',symptom:'腰痛缓解,久坐后复现',
|
||||
risk:'高危:血糖控制欠佳,需两周复查并强化饮食管理',food:'控制总热量,主食粗细搭配',sportPlan:'餐后1小时快走30分钟',evalv:'一般',rx:[{name:'二甲双胍缓释片',usage:'口服,一日2次,一次1片'}]},
|
||||
{id:3,user:'张秀兰',code:'CQ027710',sex:'女',age:45,point:'姬圪台作业区医疗点',doctor:'曲志明',form:'电话随访',date:'2026-09-01',next:'2026-11-01',confirm:'待确认',symptom:'腰痛缓解,久坐后复现',
|
||||
bp:'126/80',hr:70,glucose:5.2,height:160,weight:66,bmi:25.8,waist:84,other:'',
|
||||
smoke:0,drink:0,sport:2,salt:'轻',mental:'良好',will:'良好',depend:'规律',react:'无',otherMed:'',
|
||||
risk:'中危:超重合并血脂偏高,减重为核心干预目标',food:'低脂高纤维,晚餐少食',sportPlan:'游泳或快走,每周3次',evalv:'良好'},
|
||||
{id:4,user:'石维国',code:'CQ021578',sex:'男',age:46,point:'樊学作业区医疗点',doctor:'李桂芳',form:'门诊',date:'2026-08-28',next:'2026-10-28',confirm:'已确认',symptom:'无头晕头痛,血压临界',
|
||||
risk:'中危:超重合并血脂偏高,减重为核心干预目标',food:'低脂高纤维,晚餐少食',sportPlan:'游泳或快走,每周3次',evalv:'良好',rx:[{name:'阿托伐他汀钙片',usage:'口服,每晚1次,一次1片'}]},
|
||||
{id:4,user:'石维国',code:'CQ021578',sex:'男',age:46,point:'樊学作业区医疗点',doctor:'李桂芳',form:'门诊随访',date:'2026-08-28',next:'2026-10-28',confirm:'已确认',symptom:'无头晕头痛,血压临界',
|
||||
bp:'138/86',hr:74,glucose:5.8,height:175,weight:75,bmi:24.5,waist:88,other:'',
|
||||
smoke:5,drink:2,sport:2,salt:'中',mental:'良好',will:'良好',depend:'不服药',react:'无',otherMed:'',
|
||||
risk:'中危:正常高值血压,暂不用药,生活方式干预',food:'限盐限酒',sportPlan:'每周4次有氧运动',evalv:'良好'},
|
||||
{id:5,user:'徐立成',code:'CQ022317',sex:'男',age:44,point:'乌审旗采气区医疗点',doctor:'刘玉梅',form:'巡诊',date:'2026-08-26',next:'2026-10-26',confirm:'待确认',symptom:'中暑后恢复,乏力减轻',
|
||||
{id:5,user:'徐立成',code:'CQ022317',sex:'男',age:44,point:'乌审旗采气区医疗点',doctor:'刘玉梅',form:'巡诊随访',date:'2026-08-26',next:'2026-10-26',confirm:'待确认',symptom:'中暑后恢复,乏力减轻',
|
||||
bp:'128/84',hr:75,glucose:5.7,height:174,weight:80,bmi:26.4,waist:93,other:'',
|
||||
smoke:0,drink:1,sport:1,salt:'重',mental:'一般',will:'一般',depend:'不服药',react:'无',otherMed:'',
|
||||
risk:'中危:超重+摄盐偏重,夏季作业防暑管理',food:'清淡补钾,少食腌制',sportPlan:'避开高温时段锻炼',evalv:'一般'},
|
||||
{id:6,user:'赵万福',code:'CQ033096',sex:'男',age:39,point:'桐园作业区医疗点',doctor:'曲志明',form:'家庭',date:'2026-08-08',next:'2026-09-05',confirm:'已确认',symptom:'首次入组随访,偶有头晕',
|
||||
{id:6,user:'赵万福',code:'CQ033096',sex:'男',age:39,point:'桐园作业区医疗点',doctor:'曲志明',form:'家庭随访',date:'2026-08-08',next:'2026-09-05',confirm:'已确认',symptom:'首次入组随访,偶有头晕',
|
||||
bp:'158/96',hr:80,glucose:6.0,height:172,weight:80,bmi:27.1,waist:94,other:'',
|
||||
smoke:12,drink:3,sport:0,salt:'重',mental:'一般',will:'差',depend:'不服药',react:'无',otherMed:'曾自行服药后停药',
|
||||
risk:'高危:新诊断高血压2级,需尽快启动规范治疗',food:'严格限盐,戒酒',sportPlan:'循序渐进有氧,戒烟',evalv:'差'},
|
||||
{id:7,user:'高建军',code:'CQ010564',sex:'男',age:50,point:'西峰基地医疗点',doctor:'闫婷',form:'门诊',date:'2026-07-15',next:'2026-09-03',confirm:'已确认',symptom:'血糖波动,调整用药方案',
|
||||
risk:'高危:新诊断高血压2级,需尽快启动规范治疗',food:'严格限盐,戒酒',sportPlan:'循序渐进有氧,戒烟',evalv:'不良',rx:[{name:'苯磺酸氨氯地平片',usage:'口服,一日1次,一次1片'}]},
|
||||
{id:7,user:'高建军',code:'CQ010564',sex:'男',age:50,point:'西峰基地医疗点',doctor:'闫婷',form:'门诊随访',date:'2026-07-15',next:'2026-09-03',confirm:'已确认',symptom:'血糖波动,调整用药方案',
|
||||
bp:'130/82',hr:70,glucose:7.8,height:168,weight:78,bmi:27.6,waist:96,other:'',
|
||||
smoke:0,drink:1,sport:2,salt:'中',mental:'良好',will:'良好',depend:'规律',react:'有',otherMed:'二甲双胍餐后胃肠道反应',
|
||||
risk:'高危:血糖控制欠佳合并药物反应,考虑换缓释剂型',food:'少食多餐',sportPlan:'餐后活动30分钟',evalv:'一般'},
|
||||
{id:8,user:'张秀兰',code:'CQ027710',sex:'女',age:45,point:'姬圪台作业区医疗点',doctor:'曲志明',form:'电话',date:'2026-07-10',next:'2026-09-01',confirm:'已确认',symptom:'血脂复查提醒',
|
||||
smoke:0,drink:1,sport:2,salt:'中',mental:'良好',will:'良好',depend:'规律',react:'存在',otherMed:'二甲双胍餐后胃肠道反应',
|
||||
risk:'高危:血糖控制欠佳合并药物反应,考虑换缓释剂型',food:'少食多餐',sportPlan:'餐后活动30分钟',evalv:'一般',rx:[{name:'二甲双胍缓释片',usage:'口服,一日2次,一次1片'},{name:'格列美脲片',usage:'口服,一日1次,一次1片'}]},
|
||||
{id:8,user:'张秀兰',code:'CQ027710',sex:'女',age:45,point:'姬圪台作业区医疗点',doctor:'曲志明',form:'电话随访',date:'2026-07-10',next:'2026-09-01',confirm:'已确认',symptom:'血脂复查提醒',
|
||||
bp:'124/78',hr:68,glucose:5.1,height:160,weight:67,bmi:26.2,waist:85,other:'',
|
||||
smoke:0,drink:0,sport:2,salt:'轻',mental:'良好',will:'良好',depend:'规律',react:'无',otherMed:'',
|
||||
risk:'中危:血脂偏高,三个月复查',food:'减少油炸食品',sportPlan:'每周3-5次中等强度',evalv:'良好'}
|
||||
risk:'中危:血脂偏高,三个月复查',food:'减少油炸食品',sportPlan:'每周3-5次中等强度',evalv:'良好',rx:[{name:'阿托伐他汀钙片',usage:'口服,每晚1次,一次1片'}]}
|
||||
];
|
||||
var nextId=9,editingId=null,curEmp=null,pendingDelId=null;
|
||||
|
||||
@@ -596,17 +657,17 @@ function onFilterUnit(){
|
||||
}
|
||||
function currentData(){
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var confirm=document.getElementById('filterConfirm').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
return follows.filter(function(f){
|
||||
var emp=empPool.find(function(x){return x.code===f.code;})||{};
|
||||
return (!name||f.user.indexOf(name)!==-1)
|
||||
&&(!code||f.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||emp.unit===selUnit)&&(!selDept||emp.dept===selDept)
|
||||
&&(!unit||pointUnit[f.point]===unit)&&(!point||f.point===point)
|
||||
&&(!confirm||f.confirm===confirm)
|
||||
&&(!from||f.date>=from)&&(!to||f.date<=to);
|
||||
});
|
||||
}
|
||||
@@ -622,16 +683,16 @@ function renderTable(){
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="15" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(f,i){
|
||||
var emp=empPool.find(function(x){return x.code===f.code;})||{};
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+f.id+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+f.user+'</td>'
|
||||
+'<td>'+f.code+'</td><td>'+f.sex+'</td><td>'+f.age+'</td>'
|
||||
+'<td>'+emp.unit+'</td><td>'+emp.dept+'</td>'
|
||||
+'<td style="text-align:left;max-width:180px;overflow:hidden;text-overflow:ellipsis;" title="'+f.symptom+'">'+f.symptom+'</td>'
|
||||
+'<td><span class="badge badge--info">'+f.form+'</span></td>'
|
||||
+'<td>'+f.doctor+'</td><td>'+f.point+'</td><td>'+pointUnit[f.point]+'</td>'
|
||||
+'<td>'+f.date+'</td><td>'+f.next+'</td>'
|
||||
+'<td><span class="badge '+(f.confirm==='已确认'?'badge--success':'badge--warning')+'">'+f.confirm+'</span></td>'
|
||||
+'<td>'+f.doctor+'</td><td>'+f.point+'</td><td>'+pointUnit[f.point]+'</td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openView('+f.id+')">详情</button>'
|
||||
+'<button class="btn btn-link" onclick="openForm('+f.id+')">编辑</button>'
|
||||
@@ -639,13 +700,12 @@ function renderTable(){
|
||||
+'</td></tr>';
|
||||
});
|
||||
tbody.innerHTML=html;
|
||||
var ca=document.getElementById('checkAll');if(ca)ca.checked=false;
|
||||
}
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterCode').value='';
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterConfirm').value='';
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
resetOrg();
|
||||
applyFilter();
|
||||
@@ -657,15 +717,6 @@ function turnPage(d){
|
||||
}
|
||||
|
||||
/* ===== 新增/编辑 ===== */
|
||||
function fillDoctorSel(keep){
|
||||
var sel=document.getElementById('fDoctor');
|
||||
sel.innerHTML='<option value="">请选择医生</option>';
|
||||
doctorPool.forEach(function(n){
|
||||
var o=document.createElement('option');o.textContent=n;
|
||||
if(n===keep)o.selected=true;
|
||||
sel.appendChild(o);
|
||||
});
|
||||
}
|
||||
function setRadio(name,val){document.querySelectorAll('input[name="'+name+'"]').forEach(function(r){r.checked=(r.value===val);});}
|
||||
function getRadio(name){var r=document.querySelector('input[name="'+name+'"]:checked');return r?r.value:'';}
|
||||
function calcBmi(){
|
||||
@@ -673,13 +724,12 @@ function calcBmi(){
|
||||
var w=parseFloat(document.getElementById('vWeight').value);
|
||||
document.getElementById('vBmi').value=(h>0&&w>0)?(w/(h*h/10000)).toFixed(1):'';
|
||||
}
|
||||
function showEmpCard(e){
|
||||
var card=document.getElementById('empCard');
|
||||
if(!e){card.style.display='none';return;}
|
||||
card.style.display='grid';
|
||||
card.innerHTML='<div>工号 <b>'+e.code+'</b></div><div>性别/年龄 <b>'+e.sex+' / '+e.age+'岁</b></div><div>联系电话 <b>'+e.tel+'</b></div><div>慢病类型 <b>'+(e.chronic||'无')+'</b></div><div>所属单位 <b>'+e.unit+'</b></div><div>所属部门 <b>'+e.dept+'</b></div><div>分配医疗点 <b>'+e.point+'</b></div>';
|
||||
function calcWhr(){
|
||||
var w=parseFloat(document.getElementById('vWaist').value);
|
||||
var h=parseFloat(document.getElementById('vHip').value);
|
||||
document.getElementById('vWhr').value=(w>0&&h>0)?(w/h).toFixed(2):'';
|
||||
}
|
||||
var TEXT_IDS=['fSymptom','vBp','vHr','vGlucose','vHeight','vWeight','vBmi','vWaist','vOther','lSmoke','lDrink','lSport','mOther','fRisk','fFood','fSportPlan'];
|
||||
var TEXT_IDS=['fSymptom','vBp','vHr','vGlucose','vHeight','vWeight','vBmi','vWaist','vHip','vWhr','lSmoke','lDrink','lSport','lSportDur','fReason','fMeasure','fFood','fSportPlan'];
|
||||
var RADIO_NAMES=['lSalt','lMental','lWill','mDepend','mReact','fEval'];
|
||||
function openForm(id){
|
||||
editingId=id||null;
|
||||
@@ -688,24 +738,30 @@ function openForm(id){
|
||||
TEXT_IDS.forEach(function(k){document.getElementById(k).value='';});
|
||||
RADIO_NAMES.forEach(function(n){setRadio(n,'');});
|
||||
setRadio('fForm','');
|
||||
document.getElementById('fDate').value=f?f.date:'2026-09-07';
|
||||
document.getElementById('fDate').value=f?f.date:'2026-09-11';
|
||||
document.getElementById('fDoctor').value=f?f.doctor:'石维国';
|
||||
document.getElementById('fNext').value=f?f.next:'';
|
||||
resetInquiry();
|
||||
document.getElementById('inqRow').style.display=f?'none':'flex';
|
||||
curEmp=f?empPool.find(function(e){return e.code===f.code;}):null;
|
||||
document.getElementById('fUser').value=f?f.user:'';
|
||||
showEmpCard(curEmp);
|
||||
renderUserInfo(curEmp);
|
||||
curRx=f&&f.rx?f.rx.map(function(r){return {name:r.name,usage:r.usage};}):[];
|
||||
renderMedCards();
|
||||
renderTasks(!!f);
|
||||
if(f){
|
||||
document.getElementById('fSymptom').value=f.symptom;
|
||||
setRadio('fForm',f.form);
|
||||
document.getElementById('vBp').value=f.bp;document.getElementById('vHr').value=f.hr;document.getElementById('vGlucose').value=f.glucose;
|
||||
document.getElementById('vHeight').value=f.height;document.getElementById('vWeight').value=f.weight;document.getElementById('vBmi').value=f.bmi;
|
||||
document.getElementById('vWaist').value=f.waist;document.getElementById('vOther').value=f.other;
|
||||
document.getElementById('lSmoke').value=f.smoke;document.getElementById('lDrink').value=f.drink;document.getElementById('lSport').value=f.sport;
|
||||
document.getElementById('vWaist').value=f.waist;document.getElementById('vHip').value=f.hip||'';
|
||||
document.getElementById('lSmoke').value=f.smoke;document.getElementById('lDrink').value=f.drink;document.getElementById('lSport').value=f.sport;document.getElementById('lSportDur').value=f.sportDur||'';
|
||||
setRadio('lSalt',f.salt);setRadio('lMental',f.mental);setRadio('lWill',f.will);
|
||||
setRadio('mDepend',f.depend);setRadio('mReact',f.react);document.getElementById('mOther').value=f.otherMed;
|
||||
document.getElementById('fRisk').value=f.risk;document.getElementById('fFood').value=f.food;document.getElementById('fSportPlan').value=f.sportPlan;
|
||||
setRadio('mDepend',f.depend);setRadio('mReact',f.react);
|
||||
document.getElementById('fReason').value=f.reason||'';document.getElementById('fMeasure').value=f.measure||'';
|
||||
document.getElementById('fFood').value=f.food;document.getElementById('fSportPlan').value=f.sportPlan;
|
||||
setRadio('fEval',f.evalv);
|
||||
calcBmi();calcWhr();
|
||||
}
|
||||
fillDoctorSel(f?f.doctor:'');
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
document.getElementById('formDrawer').classList.add('open');
|
||||
}
|
||||
@@ -724,12 +780,13 @@ function saveForm(){
|
||||
symptom:document.getElementById('fSymptom').value||'无',
|
||||
bp:document.getElementById('vBp').value,hr:document.getElementById('vHr').value,glucose:document.getElementById('vGlucose').value,
|
||||
height:document.getElementById('vHeight').value,weight:document.getElementById('vWeight').value,bmi:document.getElementById('vBmi').value,
|
||||
waist:document.getElementById('vWaist').value,other:document.getElementById('vOther').value,
|
||||
smoke:document.getElementById('lSmoke').value,drink:document.getElementById('lDrink').value,sport:document.getElementById('lSport').value,
|
||||
waist:document.getElementById('vWaist').value,hip:document.getElementById('vHip').value,whr:document.getElementById('vWhr').value,
|
||||
smoke:document.getElementById('lSmoke').value,drink:document.getElementById('lDrink').value,sport:document.getElementById('lSport').value,sportDur:document.getElementById('lSportDur').value,
|
||||
salt:getRadio('lSalt'),mental:getRadio('lMental'),will:getRadio('lWill'),
|
||||
depend:getRadio('mDepend'),react:getRadio('mReact'),otherMed:document.getElementById('mOther').value,
|
||||
risk:document.getElementById('fRisk').value,food:document.getElementById('fFood').value,sportPlan:document.getElementById('fSportPlan').value,
|
||||
evalv:getRadio('fEval')
|
||||
depend:getRadio('mDepend'),react:getRadio('mReact'),
|
||||
reason:document.getElementById('fReason').value,measure:document.getElementById('fMeasure').value,
|
||||
food:document.getElementById('fFood').value,sportPlan:document.getElementById('fSportPlan').value,
|
||||
evalv:getRadio('fEval'),rx:curRx.map(function(r){return {name:r.name,usage:r.usage};})
|
||||
};
|
||||
if(editingId){follows.splice(follows.findIndex(function(x){return x.id===editingId;}),1,obj);}
|
||||
else{follows.push(obj);}
|
||||
@@ -743,46 +800,129 @@ function openView(id){
|
||||
document.getElementById('viewTitle').textContent='随访详情 · '+f.user;
|
||||
function d(k,v,full){return '<div class="detail-item'+(full?' detail-item--full':'')+'"><div class="dk">'+k+'</div><div class="dv">'+(v||'—')+'</div></div>';}
|
||||
var signHtml=f.confirm==='已确认'
|
||||
?'<div style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 16px;display:inline-block;"><svg width="150" height="44" viewBox="0 0 150 44"><path d="M8 32c10-20 16 14 26-6 8-16 12 18 22-2 7-14 10 12 18-2 6-10 10 8 18-2 8-8 14 6 24 2" stroke="#14213D" stroke-width="2" fill="none" stroke-linecap="round"/></svg><div style="font-size:var(--font-xs);color:var(--text-placeholder);margin-top:4px;">电子签名 · '+f.date+' 于 PAD 端确认</div></div>'
|
||||
?'<div style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 16px;display:inline-block;"><svg width="150" height="44" viewBox="0 0 150 44"><path d="M8 32c10-20 16 14 26-6 8-16 12 18 22-2 7-14 10 12 18-2 6-10 10 8 18-2 8-8 14 6 24 2" stroke="#14213D" stroke-width="2" fill="none" stroke-linecap="round"/></svg></div>'
|
||||
:'<span style="color:var(--text-placeholder);font-size:var(--font-sm);">员工尚未在 PAD 端确认签字</span>';
|
||||
document.getElementById('viewBody').innerHTML=
|
||||
'<div class="form-section" style="margin-top:0;">随访信息</div>'
|
||||
+'<div class="detail-grid">'+d('随访员工',f.user)+d('员工编号',f.code)+d('性别/年龄',f.sex+' / '+f.age+'岁')+d('分配医疗点',f.point+'('+pointUnit[f.point]+')')+d('随访形式',f.form)+d('随访日期',f.date)+d('随访医生',f.doctor)+d('下次随访',f.next)+d('症状',f.symptom,true)+'</div>'
|
||||
+'<div class="form-section">体征</div>'
|
||||
+'<div class="detail-grid">'+d('血压',f.bp? f.bp+' mmHg':'—')+d('心率',f.hr?f.hr+' 次/分':'—')+d('血糖',f.glucose?f.glucose+' mmol/L':'—')+d('身高/体重',(f.height||'—')+' / '+(f.weight||'—'))+d('BMI',f.bmi)+d('腰围',f.waist?f.waist+' cm':'—')+d('其他体征',f.other,true)+'</div>'
|
||||
+'<div class="detail-grid">'+d('血压',f.bp? f.bp+' mmHg':'—')+d('心率',f.hr?f.hr+' 次/分':'—')+d('血糖',f.glucose?f.glucose+' mmol/L':'—')+d('身高/体重',(f.height||'—')+' / '+(f.weight||'—'))+d('BMI',f.bmi)+d('腰围',f.waist?f.waist+' cm':'—')+d('臀围',f.hip?f.hip+' cm':'—')+d('腰身比',f.whr)+'</div>'
|
||||
+'<div class="form-section">生活方式</div>'
|
||||
+'<div class="detail-grid">'+d('日吸烟量',f.smoke+' 支')+d('日饮酒量',f.drink+' 两')+d('运动频率',f.sport+' 次/周')+d('摄盐情况',f.salt)+d('心理行为',f.mental)+d('遵医行为',f.will)+'</div>'
|
||||
+'<div class="detail-grid">'+d('吸烟量',f.smoke+' 支')+d('饮酒量',f.drink+' 两')+d('运动频率',f.sport+' 次/周')+d('运动时长',f.sportDur?f.sportDur+' 分钟/次':'—')+d('摄盐情况',f.salt)+d('心理调整',f.mental)+d('遵医行为',f.will)+'</div>'
|
||||
+'<div class="form-section">用药情况</div>'
|
||||
+'<div class="detail-grid">'+d('服药依从性',f.depend)+d('药物不良反应',f.react)+d('其他药物/备注',f.otherMed,true)+'</div>'
|
||||
+'<div class="detail-grid">'+d('用药依从性',f.depend)+d('药物不良反应',f.react)+d('药品',f.rx&&f.rx.length?f.rx.map(function(r){return r.name+'('+r.usage+')';}).join(';'):'—',true)+'</div>'
|
||||
+'<div class="form-section">风险评估与处方</div>'
|
||||
+'<div class="detail-grid">'+d('健康风险评估',f.risk,true)+d('膳食处方',f.food)+d('运动处方',f.sportPlan)+d('随访效果评价',f.evalv)+d('员工确认状态','<span class="badge '+(f.confirm==='已确认'?'badge--success':'badge--warning')+'">'+f.confirm+'</span>')+'</div>'
|
||||
+'<div class="detail-grid">'+d('原因',f.reason,true)+d('措施',f.measure,true)+d('膳食处方',f.food)+d('运动处方',f.sportPlan)+d('随访效果评价',f.evalv)+'</div>'
|
||||
+'<div class="form-section">员工确认签字</div>'+signHtml;
|
||||
document.getElementById('viewMask').classList.add('open');
|
||||
document.getElementById('viewDrawer').classList.add('open');
|
||||
}
|
||||
|
||||
/* ===== 选人弹窗 ===== */
|
||||
function openEmpPick(){
|
||||
document.getElementById('empQ').value='';
|
||||
renderEmpPick();
|
||||
document.getElementById('empMask').classList.add('open');
|
||||
/* ===== 员工查询(参考 daily-treatment 新增就诊) ===== */
|
||||
var curRx=[];
|
||||
function searchEmp(){
|
||||
var type=document.getElementById('inqType').value;
|
||||
var kw=document.getElementById('inqKw').value.trim();
|
||||
if(!kw){showToast('请输入姓名或员工编号');return;}
|
||||
var list=empPool.filter(function(e){
|
||||
return type==='员工编号' ? e.code.toLowerCase().indexOf(kw.toLowerCase())!==-1 : e.name.indexOf(kw)!==-1;
|
||||
});
|
||||
var box=document.getElementById('iqResult');
|
||||
if(!list.length){
|
||||
box.innerHTML='<div style="padding:14px;text-align:center;color:var(--text-placeholder);">未查询到此员工信息</div>';
|
||||
}else{
|
||||
box.innerHTML='<table><thead><tr><th>姓名</th><th>性别</th><th>年龄</th><th>员工编号</th><th>单位</th><th>部门</th></tr></thead><tbody>'
|
||||
+list.map(function(e){
|
||||
return '<tr class="row" onclick="pickEmp(\''+e.code+'\')"><td>'+e.name+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.code+'</td><td>'+e.unit+'</td><td>'+e.dept+'</td></tr>';
|
||||
}).join('')
|
||||
+'</tbody></table>';
|
||||
}
|
||||
box.classList.add('open');
|
||||
}
|
||||
function renderEmpPick(){
|
||||
var q=document.getElementById('empQ').value.trim();
|
||||
var list=empPool.filter(function(e){return !q||e.name.indexOf(q)!==-1||e.code.toLowerCase().indexOf(q.toLowerCase())!==-1;});
|
||||
document.getElementById('empBody').innerHTML=list.length?list.map(function(e){
|
||||
return '<tr><td><input type="radio" name="empSel" value="'+e.code+'"'+(curEmp&&curEmp.code===e.code?' checked':'')+'></td>'
|
||||
+'<td style="font-weight:600;">'+e.name+'</td><td>'+e.code+'</td><td>'+e.sex+'</td><td>'+e.age+'</td><td>'+e.unit+'</td>'
|
||||
+'<td>'+(e.chronic?'<span class="badge badge--muted">'+e.chronic+'</span>':'—')+'</td><td>'+e.point+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="8" class="td-empty">未找到匹配员工</td></tr>';
|
||||
function pickEmp(code){
|
||||
var e=empPool.find(function(x){return x.code===code;});
|
||||
if(!e)return;
|
||||
curEmp=e;
|
||||
renderUserInfo(e);
|
||||
document.getElementById('iqResult').classList.remove('open');
|
||||
}
|
||||
function confirmEmp(){
|
||||
var r=document.querySelector('input[name="empSel"]:checked');
|
||||
if(!r){showToast('请选择一名员工');return;}
|
||||
curEmp=empPool.find(function(x){return x.code===r.value;});
|
||||
document.getElementById('fUser').value=curEmp.name;
|
||||
showEmpCard(curEmp);
|
||||
closeModal('empMask');
|
||||
function resetInquiry(){
|
||||
document.getElementById('inqKw').value='';
|
||||
document.getElementById('iqResult').innerHTML='';
|
||||
document.getElementById('iqResult').classList.remove('open');
|
||||
}
|
||||
function renderUserInfo(e){
|
||||
document.getElementById('fUser').value=e?e.name:'';
|
||||
document.getElementById('fSex').value=e?e.sex:'';
|
||||
document.getElementById('fAge').value=e?e.age:'';
|
||||
document.getElementById('fCode').value=e?e.code:'';
|
||||
document.getElementById('fTel').value=e?e.tel:'';
|
||||
document.getElementById('fUUnit').value=e?e.unit:'';
|
||||
document.getElementById('fUDept').value=e?e.dept:'';
|
||||
document.getElementById('fUPoint').value=e?e.point:'';
|
||||
document.getElementById('empFields').style.display=e?'grid':'none';
|
||||
renderTagList(e);
|
||||
}
|
||||
function renderTagList(e){
|
||||
var tags=e&&e.chronic?e.chronic.split(/[\/,,]/).filter(Boolean):[];
|
||||
document.getElementById('empTags').style.display=tags.length?'flex':'none';
|
||||
document.getElementById('empTagList').innerHTML=tags.map(function(t){return '<span class="chip">'+t+'</span>';}).join('');
|
||||
}
|
||||
|
||||
/* ===== 用药卡片 ===== */
|
||||
function renderMedCards(){
|
||||
var box=document.getElementById('medCards');
|
||||
box.innerHTML=curRx.length?curRx.map(function(r,i){
|
||||
return '<div class="med-card"><b>'+r.name+'</b><br>用法用量:'+r.usage+'<div class="med-card__ops"><a class="op-del" onclick="delMed('+i+')">删除</a></div></div>';
|
||||
}).join(''):'<div style="grid-column:1/-1;color:var(--text-placeholder);font-size:var(--font-sm);padding:6px 0;">暂未添加药品</div>';
|
||||
}
|
||||
function delMed(i){curRx.splice(i,1);renderMedCards();}
|
||||
function openMedPick(){
|
||||
document.getElementById('medName').value='';
|
||||
document.getElementById('medUsage').value='';
|
||||
document.getElementById('medMask').classList.add('open');
|
||||
}
|
||||
function addMed(){
|
||||
var name=document.getElementById('medName').value.trim();
|
||||
var usage=document.getElementById('medUsage').value.trim();
|
||||
if(!name){showToast('请输入药物名称');return;}
|
||||
if(!usage){showToast('请输入用法用量');return;}
|
||||
curRx.push({name:name,usage:usage});
|
||||
closeModal('medMask');renderMedCards();
|
||||
}
|
||||
|
||||
/* ===== 关联任务 ===== */
|
||||
var followTasks=[
|
||||
{name:'频次巡诊',date:'2026-09-11',pill:'pill--over',label:'已逾期 · 逾期4天',linked:true},
|
||||
{name:'单次巡诊',date:'2026-09-12',pill:'',label:'待随访 · 还剩1天',linked:false}
|
||||
];
|
||||
function renderTasks(readonly){
|
||||
var box=document.getElementById('taskBox');
|
||||
var list=readonly?followTasks.filter(function(t){return t.linked;}):followTasks;
|
||||
box.innerHTML=list.map(function(t){
|
||||
var pill=readonly?'<span class="pill pill--success">已关联完成</span>':'<span class="pill '+t.pill+'">'+t.label+'</span>';
|
||||
var inner='<span style="flex:1"><b style="color:var(--text-primary)">'+t.name+'</b><br><span style="color:var(--text-placeholder)">计划随访日期:'+t.date+'</span></span>'+pill;
|
||||
if(readonly){
|
||||
return '<div class="task-opt" style="cursor:default;">'+inner+'</div>';
|
||||
}
|
||||
return '<label class="task-opt'+(t.linked?' task-opt--on':'')+'" onclick="this.classList.toggle(\'task-opt--on\')"><input type="checkbox"'+(t.linked?' checked':'')+'>'+inner+'</label>';
|
||||
}).join('');
|
||||
}
|
||||
|
||||
/* ===== 签字 ===== */
|
||||
function switchSignType(type){
|
||||
var isHand=type==='hand';
|
||||
document.getElementById('signHandBox').style.display=isHand?'flex':'none';
|
||||
document.getElementById('signImgBox').style.display=isHand?'none':'flex';
|
||||
}
|
||||
function onSignImg(input){
|
||||
var file=input.files&&input.files[0];
|
||||
if(!file)return;
|
||||
var reader=new FileReader();
|
||||
reader.onload=function(e){
|
||||
document.getElementById('signImgBox').innerHTML='<img src="'+e.target.result+'" style="max-width:100%;max-height:92px;object-fit:contain">'+'<span style="font-size:11px;color:var(--text-placeholder)">已上传 · 点击可重新上传</span>';
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
}
|
||||
|
||||
/* ===== 删除 ===== */
|
||||
|
||||
@@ -142,7 +142,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -158,13 +158,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -190,8 +184,8 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>工号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入工号" style="min-width:110px;">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号" style="min-width:110px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
@@ -260,7 +254,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>解读员工</th><th>工号</th><th>性别</th><th>年龄</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>解读医生</th><th>解读日期</th><th>操作</th>
|
||||
<th>序号</th><th>解读员工</th><th>员工编号</th><th>性别</th><th>年龄</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>解读医生</th><th>解读日期</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -549,7 +543,7 @@ function renderReportHtml(report){
|
||||
return html;
|
||||
}
|
||||
function empBasicHtml(r){
|
||||
return '<div class="w25">姓名<b> '+r.name+'</b></div><div class="w25">性别<b> '+r.sex+'</b></div><div class="w25">年龄<b> '+r.age+'</b></div><div class="w25">工号<b> '+r.code+'</b></div>'
|
||||
return '<div class="w25">姓名<b> '+r.name+'</b></div><div class="w25">性别<b> '+r.sex+'</b></div><div class="w25">年龄<b> '+r.age+'</b></div><div class="w25">员工编号<b> '+r.code+'</b></div>'
|
||||
+'<div class="w50">所属单位<b> '+r.unit+'</b></div><div class="w50">所属部门<b> '+r.dept+'</b></div>'
|
||||
+'<div class="w100">慢病类型<b> '+(CHRONIC[r.code]||'无')+'</b></div>';
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="daily-treatment.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -178,13 +178,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- 侧边栏(当前一级分组「日常业务」的二级菜单) -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-treatment.html" class="sidebar-item">日常诊疗</a>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
@@ -286,7 +280,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>姓名</th><th>工号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>截止日期</th><th>解读日期</th><th>状态</th><th>操作</th>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>员工所属单位</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>截止日期</th><th>解读日期</th><th>状态</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -668,7 +662,7 @@ function renderReportHtml(report){
|
||||
return html;
|
||||
}
|
||||
function empBasicHtml(t){
|
||||
return '<div class="w25">姓名<b> '+t.name+'</b></div><div class="w25">性别<b> '+t.sex+'</b></div><div class="w25">年龄<b> '+t.age+'</b></div><div class="w25">工号<b> '+t.code+'</b></div>'
|
||||
return '<div class="w25">姓名<b> '+t.name+'</b></div><div class="w25">性别<b> '+t.sex+'</b></div><div class="w25">年龄<b> '+t.age+'</b></div><div class="w25">员工编号<b> '+t.code+'</b></div>'
|
||||
+'<div class="w50">所属单位<b> '+t.unit+'</b></div><div class="w50">所属部门<b> '+t.dept+'</b></div>'
|
||||
+'<div class="w100">慢病类型<b> '+(CHRONIC[t.code]||'无')+'</b></div>';
|
||||
}
|
||||
|
||||
@@ -1,641 +0,0 @@
|
||||
<!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;font-size:var(--font-sm);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;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
.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;white-space:nowrap;width:200px;flex-shrink:0;}
|
||||
.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 14px;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);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;padding-bottom:24px;}
|
||||
.sidebar-menu__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:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:120px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.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;white-space:nowrap;}
|
||||
.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);}
|
||||
.btn-link{background:none;color:var(--primary);padding:0 4px;height:auto;}.btn-link:hover{color:#40a9ff;}
|
||||
.btn-link--danger{color:var(--danger);}
|
||||
.btn-sm{height:26px;padding:0 10px;}
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;margin-top:16px;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:1500px;}
|
||||
thead th{background:#FAFAFA;padding:10px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:12px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
thead tr th:last-child,tbody td:last-child{position:sticky;right:0;z-index:5;background:#fff;box-shadow:-4px 0 8px rgba(0,0,0,0.04);}
|
||||
thead tr th:last-child{z-index:8;background:#FAFAFA;}
|
||||
tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);}
|
||||
.badge{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.badge--warning{background:#FFFBE6;color:#D48806;border:1px solid #FFE58F;}
|
||||
.badge--success{background:#F6FFED;color:#389E0D;border:1px solid #B7EB8F;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{min-width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;padding:0 6px;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.page-btn:disabled{opacity:.4;cursor:not-allowed;background:#fff;color:var(--text-placeholder);border-color:var(--border);}
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
.drawer-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:900;}
|
||||
.drawer-mask.open{display:block;}
|
||||
.drawer{position:fixed;top:56px;right:-760px;bottom:0;width:720px;background:#fff;z-index:910;box-shadow:-8px 0 24px rgba(0,0,0,.12);transition:right .25s ease;display:flex;flex-direction:column;}
|
||||
.drawer.open{right:0;}
|
||||
.drawer--narrow{width:640px;right:-680px;}
|
||||
.drawer__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);font-size:var(--font-lg);font-weight:600;flex-shrink:0;}
|
||||
.drawer__close{cursor:pointer;color:var(--text-placeholder);font-size:20px;line-height:1;border:none;background:none;}
|
||||
.drawer__close:hover{color:var(--text-primary);}
|
||||
.drawer__body{flex:1;overflow-y:auto;padding:24px;}
|
||||
.drawer__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
.form-section{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:20px 0 12px;padding-left:8px;border-left:3px solid var(--primary);}
|
||||
.form-section:first-child{margin-top:0;}
|
||||
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 16px;}
|
||||
.form-item{display:flex;flex-direction:column;gap:6px;margin-bottom:14px;}
|
||||
.form-item--full{grid-column:1/-1;}
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.form-label .req{color:var(--danger);}
|
||||
.form-control{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;width:100%;}
|
||||
.form-control:focus{border-color:var(--primary);}
|
||||
.form-control[readonly]{background:#FAFAFA;color:var(--text-secondary);}
|
||||
textarea.form-control{height:56px;padding:8px 10px;resize:vertical;line-height:1.5;}
|
||||
select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;-webkit-appearance:none;padding-right:28px;cursor:pointer;}
|
||||
.radio-group{display:flex;gap:18px;min-height:32px;align-items:center;}
|
||||
.radio{display:flex;align-items:center;gap:6px;font-size:var(--font-sm);cursor:pointer;}
|
||||
.radio input{accent-color:var(--primary);cursor:pointer;}
|
||||
.mini-table{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;min-width:0;}
|
||||
.mini-table thead th{background:#FAFAFA;position:sticky;top:0;font-size:var(--font-sm);}
|
||||
.mini-table td{white-space:normal;font-size:var(--font-sm);}
|
||||
.rx-table select,.rx-table input{height:28px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 6px;font-size:var(--font-sm);width:100%;outline:none;}
|
||||
.rx-table th,.rx-table td{padding:6px 5px;font-size:var(--font-sm);}
|
||||
.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;}
|
||||
.detail-item{display:flex;border-bottom:1px solid var(--border);}
|
||||
.detail-item--full{grid-column:1/-1;}
|
||||
.detail-item .dk{width:110px;flex-shrink:0;background:#FAFAFA;padding:9px 12px;font-size:var(--font-sm);color:var(--text-secondary);border-right:1px solid var(--border);}
|
||||
.detail-item .dv{flex:1;padding:9px 12px;font-size:var(--font-sm);color:var(--text-primary);white-space:normal;line-height:1.5;}
|
||||
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:950;align-items:center;justify-content:center;}
|
||||
.modal-mask.open{display:flex;}
|
||||
.modal{width:440px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:24px;}
|
||||
.modal__title{font-size:var(--font-base);font-weight:600;margin-bottom:12px;display:flex;align-items:center;gap:8px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:8px;}
|
||||
</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 6.5l7 3.5v4.5c0 4.2-2.9 6.8-7 7.5-4.1-.7-7-3.3-7-7.5V10l7-3.5z" stroke="#fff" stroke-width="1.8" fill="none"/><path d="M11 13.5h6M14 10.5v6" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/></svg> 一线医疗</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
<a href="alert-dirty.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-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item active">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>就诊人</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:120px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>就诊医疗点</label>
|
||||
<select class="filter-select" id="filterPoint" style="min-width:160px;">
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>就诊时间</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-primary" onclick="openForm()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增就诊记录
|
||||
</button>
|
||||
<button class="btn btn-default btn-link--danger" onclick="askBatchDelete()">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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" onclick="openExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th>就诊人</th><th>性别</th><th>年龄</th><th>身份证号</th><th>就诊疾病</th><th>联系电话</th><th>医疗点所属单位</th><th>就诊医疗点</th><th>就诊医生</th><th>就诊时间</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination">
|
||||
<span id="pageInfo"></span>
|
||||
<button class="page-btn" id="prevBtn" onclick="turnPage(-1)">上一页</button>
|
||||
<span id="pageNum" style="min-width:64px;text-align:center;"></span>
|
||||
<button class="page-btn" id="nextBtn" onclick="turnPage(1)">下一页</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- [交互] 新增/编辑就诊抽屉 -->
|
||||
<div class="drawer-mask" id="formMask" onclick="closeDrawer('form')"></div>
|
||||
<div class="drawer" id="formDrawer">
|
||||
<div class="drawer__header"><span id="formTitle">新增就诊记录</span><button class="drawer__close" onclick="closeDrawer('form')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<div class="form-section">就诊人信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊人姓名</span><input class="form-control" id="fName" placeholder="请输入姓名"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 性别</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fSex" value="男">男</label>
|
||||
<label class="radio"><input type="radio" name="fSex" value="女">女</label>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 年龄</span><input class="form-control" type="number" min="0" max="120" id="fAge" placeholder="岁"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 身份证号</span><input class="form-control" id="fIdcard" maxlength="18" placeholder="18位身份证号码"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 联系电话</span><input class="form-control" id="fPhone" placeholder="手机号"></div>
|
||||
<div class="form-item"><span class="form-label">与员工关系</span><input class="form-control" id="fRel" placeholder="如:家属/协作单位人员"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊时间</span><input class="form-control" type="datetime-local" id="fTime"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊医疗点</span>
|
||||
<select class="form-control" id="fPoint"><option value="">请选择医疗点</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊医生</span>
|
||||
<select class="form-control" id="fDoctor"><option value="">请选择医生</option></select></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">诊断信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">主诉</span><input class="form-control" id="fMain" placeholder="患者主要症状与持续时间"></div>
|
||||
<div class="form-item"><span class="form-label">查体</span><input class="form-control" id="fInspect" placeholder="体温/血压/心率等体征"></div>
|
||||
<div class="form-item"><span class="form-label">既往史</span><input class="form-control" id="fPast" placeholder="既往疾病与手术史"></div>
|
||||
<div class="form-item"><span class="form-label">现病史</span><input class="form-control" id="fPresent" placeholder="本次发病情况"></div>
|
||||
<div class="form-item"><span class="form-label">过敏史</span><input class="form-control" id="fAllergy" placeholder="药物/食物过敏情况"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 诊断疾病</span><input class="form-control" id="fDisease" placeholder="如:上呼吸道感染"></div>
|
||||
</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">是否复诊</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fRevisit" value="是">是</label>
|
||||
<label class="radio"><input type="radio" name="fRevisit" value="否" checked>否</label>
|
||||
</div></div>
|
||||
|
||||
<div class="form-section">用药方案</div>
|
||||
<table class="mini-table rx-table">
|
||||
<thead><tr><th style="width:34%">药品名称</th><th>规格</th><th style="width:12%">库存</th><th style="width:12%">数量</th><th style="width:24%">用法用量</th><th style="width:44px">操作</th></tr></thead>
|
||||
<tbody id="rxBody"></tbody>
|
||||
</table>
|
||||
<div style="margin-top:8px;"><button class="btn btn-default btn-sm" onclick="addRx()">+ 添加药品</button></div>
|
||||
|
||||
<div class="form-section">医嘱与生活建议</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">医嘱</span><textarea class="form-control" id="fAdvice" placeholder="用药与注意事项"></textarea></div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">膳食处方</span><textarea class="form-control" id="fFood" placeholder="饮食建议"></textarea></div>
|
||||
<div class="form-item"><span class="form-label">运动处方</span><textarea class="form-control" id="fSport" placeholder="运动建议"></textarea></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="drawer__footer">
|
||||
<button class="btn btn-default" onclick="closeDrawer('form')">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveForm()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 查看详情抽屉 -->
|
||||
<div class="drawer-mask" id="viewMask" onclick="closeDrawer('view')"></div>
|
||||
<div class="drawer" id="viewDrawer">
|
||||
<div class="drawer__header"><span id="viewTitle">就诊详情</span><button class="drawer__close" onclick="closeDrawer('view')">×</button></div>
|
||||
<div class="drawer__body" id="viewBody"></div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('view')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 删除确认弹窗 -->
|
||||
<div class="modal-mask" id="delMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#FAAD14" stroke-width="1.6"/><path d="M10 5.5v6M10 13.5v1" stroke="#FAAD14" stroke-width="1.8" stroke-linecap="round"/></svg> 删除确认</div>
|
||||
<div class="modal__text" id="delText">确认删除该条就诊记录?</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('delMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmDelete()">确认删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 导出任务抽屉(异步导出任务列表) -->
|
||||
<div class="drawer-mask" id="exportMask" onclick="closeDrawer('export')"></div>
|
||||
<div class="drawer drawer--narrow" id="exportDrawer">
|
||||
<div class="drawer__header"><span>导出任务</span><button class="drawer__close" onclick="closeDrawer('export')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th>文件名</th><th>状态</th><th>生成时间</th><th>操作</th></tr></thead>
|
||||
<tbody id="exportBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('export')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏) ===== */
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
'采油二厂':['姬圪台作业区医疗点','桐园作业区医疗点'],
|
||||
'第四采油厂':['西峰基地医疗点'],
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
var doctorPool=['石维国','李桂芳','曲志明','张秀兰','高建军','闫婷','刘玉梅'];
|
||||
/* 药品池:与「药品信息」页一致的子集 */
|
||||
var medPool=[
|
||||
{name:'阿莫西林胶囊',spec:'0.25g*24粒',stock:96,price:18.5},
|
||||
{name:'布洛芬缓释胶囊',spec:'0.3g*20粒',stock:120,price:16.0},
|
||||
{name:'硝苯地平控释片',spec:'30mg*7片',stock:45,price:32.6},
|
||||
{name:'二甲双胍缓释片',spec:'0.5g*30片',stock:80,price:25.8},
|
||||
{name:'蒙脱石散',spec:'3g*10袋',stock:150,price:13.9},
|
||||
{name:'复方氯化钠注射液',spec:'500ml',stock:60,price:6.5},
|
||||
{name:'云南白药气雾剂',spec:'85g+30g',stock:28,price:38.0},
|
||||
{name:'藿香正气口服液',spec:'10ml*10支',stock:90,price:15.2}
|
||||
];
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂','姬塬作业区医疗点':'采油一厂'};
|
||||
/* 非员工就诊:家属/协作单位人员,身份证为虚构号码 */
|
||||
var nonstaffs=[
|
||||
{id:1,user:'马凤莲',sex:'女',age:58,idcard:'622822196803124523',phone:'151****3027',rel:'员工家属',point:'樊学作业区医疗点',disease:'高血压病(2级)',doctor:'李桂芳',time:'2026-09-05 10:10',main:'头晕耳鸣3天',inspect:'血压152/94mmHg',past:'高血压4年',present:'劳累后加重',allergy:'无',revisit:'否',rx:[{m:'硝苯地平控释片',spec:'30mg*7片',num:1,dosage:'一次1片 一日1次'}],advice:'每日监测血压',food:'低盐低脂',sport:'适度散步'},
|
||||
{id:2,user:'杨来贵',sex:'男',age:63,idcard:'620521196307083317',phone:'132****7108',rel:'员工家属',point:'姬圪台作业区医疗点',disease:'2型糖尿病复诊',doctor:'曲志明',time:'2026-09-04 15:40',main:'口渴乏力半月',inspect:'空腹血糖9.2mmol/L',past:'糖尿病8年',present:'血糖控制欠佳',allergy:'无',revisit:'是',rx:[{m:'二甲双胍缓释片',spec:'0.5g*30片',num:2,dosage:'一次1片 一日2次'}],advice:'两周后复查血糖',food:'控制总热量',sport:'餐后快走30分钟'},
|
||||
{id:3,user:'白莲香',sex:'女',age:41,idcard:'612731198502146625',phone:'158****4410',rel:'协作单位人员',point:'桐园作业区医疗点',disease:'急性胃肠炎',doctor:'张秀兰',time:'2026-09-02 11:20',main:'腹痛腹泻1天',inspect:'脐周压痛,肠鸣音活跃',past:'无',present:'进食不洁饭后腹泻',allergy:'无',revisit:'否',rx:[{m:'蒙脱石散',spec:'3g*10袋',num:1,dosage:'一次1袋 一日3次'},{m:'复方氯化钠注射液',spec:'500ml',num:1,dosage:'静脉滴注 1次'}],advice:'补液防脱水',food:'流质饮食',sport:'注意休息'},
|
||||
{id:4,user:'丁胜海',sex:'男',age:52,idcard:'620102197403059116',phone:'139****0213',rel:'员工家属',point:'西峰基地医疗点',disease:'腰肌劳损',doctor:'闫婷',time:'2026-08-30 09:15',main:'腰部酸痛2周',inspect:'腰两侧压痛',past:'久坐工作史',present:'渐进性酸痛',allergy:'磺胺类过敏',revisit:'否',rx:[{m:'布洛芬缓释胶囊',spec:'0.3g*20粒',num:1,dosage:'一次1粒 一日2次'}],advice:'避免久坐,配合理疗',food:'均衡营养',sport:'腰背肌锻炼'},
|
||||
{id:5,user:'周翠兰',sex:'女',age:36,idcard:'610628199001074412',phone:'177****5521',rel:'协作单位人员',point:'乌审旗采气区医疗点',disease:'中暑(先兆)',doctor:'刘玉梅',time:'2026-08-28 14:05',main:'高温作业后头晕出汗',inspect:'体温37.7℃,面色潮红',past:'无',present:'午间露天作业后不适',allergy:'无',revisit:'否',rx:[{m:'藿香正气口服液',spec:'10ml*10支',num:1,dosage:'一次1支 一日2次'}],advice:'阴凉处休息,少量多次饮水',food:'清淡,补充电解质',sport:'避开高温时段'},
|
||||
{id:6,user:'石长有',sex:'男',age:70,idcard:'622801195601021235',phone:'181****6640',rel:'员工家属',point:'安塞采油队长住点医疗室',disease:'冠心病复诊',doctor:'石维国',time:'2026-08-22 10:35',main:'活动后胸闷1月',inspect:'心率78次/分,律齐',past:'冠心病6年',present:'冬季症状加重',allergy:'无',revisit:'是',rx:[],advice:'随身携带急救药物,一月后心内科复诊',food:'低脂高纤维',sport:'避免剧烈运动'}
|
||||
];
|
||||
var nextId=7,editingId=null,curRx=[],pendingDelId=null;
|
||||
|
||||
/* ===== 列表 ===== */
|
||||
var pageSize=10,currentPage=1;
|
||||
function onFilterUnit(){
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var sel=document.getElementById('filterPoint');
|
||||
sel.innerHTML='<option value="">全部医疗点</option>';
|
||||
if(unit){(pointMap[unit]||[]).forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});}
|
||||
}
|
||||
function currentData(){
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
return nonstaffs.filter(function(t){
|
||||
var d=t.time.slice(0,10);
|
||||
return (!name||t.user.indexOf(name)!==-1)
|
||||
&&(!unit||pointUnit[t.point]===unit)&&(!point||t.point===point)
|
||||
&&(!from||d>=from)&&(!to||d<=to);
|
||||
});
|
||||
}
|
||||
function renderTable(){
|
||||
var list=currentData();
|
||||
var start=(currentPage-1)*pageSize,pageData=list.slice(start,start+pageSize);
|
||||
var totalPages=Math.ceil(list.length/pageSize)||1;
|
||||
document.getElementById('pageInfo').textContent='共 '+list.length+' 条记录';
|
||||
document.getElementById('pageNum').textContent=currentPage+'/'+totalPages;
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
var tbody=document.getElementById('tableBody');
|
||||
var ca=document.getElementById('checkAll');if(ca)ca.checked=false;
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="13" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(t,i){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+t.id+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+t.user+'</td>'
|
||||
+'<td>'+t.sex+'</td><td>'+t.age+'</td>'
|
||||
+'<td>'+t.idcard+'</td>'
|
||||
+'<td style="text-align:left;max-width:160px;overflow:hidden;text-overflow:ellipsis;" title="'+t.disease+'">'+t.disease+'</td>'
|
||||
+'<td>'+t.phone+'</td>'
|
||||
+'<td>'+pointUnit[t.point]+'</td><td>'+t.point+'</td>'
|
||||
+'<td>'+t.doctor+'</td><td>'+t.time+'</td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openView('+t.id+')">详情</button>'
|
||||
+'<button class="btn btn-link" onclick="openForm('+t.id+')">编辑</button>'
|
||||
+'<button class="btn btn-link btn-link--danger" onclick="askDelete('+t.id+')">删除</button>'
|
||||
+'</td></tr>';
|
||||
});
|
||||
tbody.innerHTML=html;
|
||||
}
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
applyFilter();
|
||||
}
|
||||
function turnPage(d){
|
||||
var totalPages=Math.ceil(currentData().length/pageSize)||1;
|
||||
currentPage=Math.min(Math.max(1,currentPage+d),totalPages);
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 用药方案行 ===== */
|
||||
function renderRx(){
|
||||
var html=curRx.map(function(r,i){
|
||||
var opts='<option value="">请选择药品</option>'+medPool.map(function(m){return '<option'+(m.name===r.m?' selected':'')+'>'+m.name+'</option>';}).join('');
|
||||
return '<tr>'
|
||||
+'<td><select onchange="pickMed('+i+',this.value)">'+opts+'</select></td>'
|
||||
+'<td><input value="'+r.spec+'" readonly placeholder="--"></td>'
|
||||
+'<td><input value="'+(r.stock||'')+'" readonly placeholder="--"></td>'
|
||||
+'<td><input type="number" min="1" value="'+r.num+'" oninput="curRx['+i+'].num=this.value" placeholder="盒"></td>'
|
||||
+'<td><input value="'+r.dosage+'" oninput="curRx['+i+'].dosage=this.value" placeholder="如:一次1粒 一日2次"></td>'
|
||||
+'<td><button class="btn btn-link btn-link--danger" onclick="curRx.splice('+i+',1);renderRx()">删除</button></td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('rxBody').innerHTML=html||'<tr><td colspan="6" style="color:var(--text-placeholder);padding:14px;">暂未添加药品,点击下方「+ 添加药品」</td></tr>';
|
||||
}
|
||||
function addRx(){curRx.push({m:'',spec:'',stock:0,num:1,dosage:''});renderRx();}
|
||||
function pickMed(i,name){
|
||||
var m=medPool.find(function(x){return x.name===name;});
|
||||
if(m){curRx[i].m=m.name;curRx[i].spec=m.spec;curRx[i].stock=m.stock;}
|
||||
renderRx();
|
||||
}
|
||||
|
||||
/* ===== 新增/编辑 ===== */
|
||||
function fillDoctorSel(keep){
|
||||
var sel=document.getElementById('fDoctor');
|
||||
sel.innerHTML='<option value="">请选择医生</option>';
|
||||
doctorPool.forEach(function(n){
|
||||
var o=document.createElement('option');o.textContent=n;
|
||||
if(n===keep)o.selected=true;
|
||||
sel.appendChild(o);
|
||||
});
|
||||
}
|
||||
function fillPointSel(keep){
|
||||
var sel=document.getElementById('fPoint');
|
||||
sel.innerHTML='<option value="">请选择医疗点</option>';
|
||||
Object.keys(pointMap).forEach(function(u){
|
||||
(pointMap[u]||[]).forEach(function(p){
|
||||
var o=document.createElement('option');o.textContent=p;
|
||||
if(p===keep)o.selected=true;
|
||||
sel.appendChild(o);
|
||||
});
|
||||
});
|
||||
}
|
||||
function setRadio(name,val){document.querySelectorAll('input[name="'+name+'"]').forEach(function(r){r.checked=(r.value===val);});}
|
||||
function getRadio(name){var r=document.querySelector('input[name="'+name+'"]:checked');return r?r.value:'';}
|
||||
function openForm(id){
|
||||
editingId=id||null;
|
||||
var t=id?nonstaffs.find(function(x){return x.id===id;}):null;
|
||||
document.getElementById('formTitle').textContent=id?('编辑就诊记录 · '+t.user):'新增就诊记录';
|
||||
['fName','fAge','fIdcard','fPhone','fRel','fMain','fInspect','fPast','fPresent','fAllergy','fDisease','fAdvice','fFood','fSport'].forEach(function(k){document.getElementById(k).value='';});
|
||||
document.getElementById('fTime').value=t?t.time.replace(' ','T'):'2026-09-07T09:00';
|
||||
fillPointSel(t?t.point:'');
|
||||
if(t){
|
||||
document.getElementById('fName').value=t.user;
|
||||
document.getElementById('fAge').value=t.age;
|
||||
document.getElementById('fIdcard').value=t.idcard;
|
||||
document.getElementById('fPhone').value=t.phone;
|
||||
document.getElementById('fRel').value=t.rel;
|
||||
document.getElementById('fMain').value=t.main;document.getElementById('fInspect').value=t.inspect;
|
||||
document.getElementById('fPast').value=t.past;document.getElementById('fPresent').value=t.present;
|
||||
document.getElementById('fAllergy').value=t.allergy;document.getElementById('fDisease').value=t.disease;
|
||||
document.getElementById('fAdvice').value=t.advice;document.getElementById('fFood').value=t.food;document.getElementById('fSport').value=t.sport;
|
||||
}
|
||||
setRadio('fSex',t?t.sex:'');
|
||||
setRadio('fRevisit',t?t.revisit:'否');
|
||||
fillDoctorSel(t?t.doctor:'');
|
||||
curRx=t?t.rx.map(function(r){return {m:r.m,spec:r.spec,stock:(medPool.find(function(m){return m.name===r.m;})||{}).stock||0,num:r.num,dosage:r.dosage};}):[];
|
||||
renderRx();
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
document.getElementById('formDrawer').classList.add('open');
|
||||
}
|
||||
function saveForm(){
|
||||
var user=document.getElementById('fName').value.trim();
|
||||
var sex=getRadio('fSex');
|
||||
var age=document.getElementById('fAge').value;
|
||||
var idcard=document.getElementById('fIdcard').value.trim();
|
||||
var phone=document.getElementById('fPhone').value.trim();
|
||||
var time=document.getElementById('fTime').value;
|
||||
var point=document.getElementById('fPoint').value;
|
||||
var doctor=document.getElementById('fDoctor').value;
|
||||
var disease=document.getElementById('fDisease').value.trim();
|
||||
if(!user){showToast('请填写就诊人姓名');return;}
|
||||
if(!sex){showToast('请选择性别');return;}
|
||||
if(!age||age<0||age>120){showToast('请填写有效年龄');return;}
|
||||
if(!/^[1-9]\d{16}[\dXx]$/.test(idcard)){showToast('身份证号需为18位有效号码');return;}
|
||||
if(!/^1[3-9]\d{9}$/.test(phone.replace(/\*/g,'0'))&&!/^1\d{2}\*{4}\d{4}$/.test(phone)){showToast('请填写有效联系电话');return;}
|
||||
if(!time){showToast('请选择就诊时间');return;}
|
||||
if(!point){showToast('请选择就诊医疗点');return;}
|
||||
if(!doctor){showToast('请选择就诊医生');return;}
|
||||
if(!disease){showToast('请填写诊断疾病');return;}
|
||||
var rx=curRx.filter(function(r){return r.m;});
|
||||
var bad=rx.find(function(r){return r.num>r.stock;});
|
||||
if(bad){showToast('「'+bad.m+'」库存仅 '+bad.stock+',开药数量超限');return;}
|
||||
var obj={
|
||||
id:editingId||nextId++,user:user,sex:sex,age:Number(age),idcard:idcard,phone:phone,
|
||||
rel:document.getElementById('fRel').value,point:point,disease:disease,doctor:doctor,time:time.replace('T',' '),
|
||||
main:document.getElementById('fMain').value,inspect:document.getElementById('fInspect').value,
|
||||
past:document.getElementById('fPast').value,present:document.getElementById('fPresent').value,
|
||||
allergy:document.getElementById('fAllergy').value,revisit:getRadio('fRevisit'),
|
||||
rx:rx,advice:document.getElementById('fAdvice').value,
|
||||
food:document.getElementById('fFood').value,sport:document.getElementById('fSport').value
|
||||
};
|
||||
if(editingId){nonstaffs.splice(nonstaffs.findIndex(function(x){return x.id===editingId;}),1,obj);}
|
||||
else{nonstaffs.push(obj);}
|
||||
closeDrawer('form');renderTable();
|
||||
showToast(editingId?'就诊记录已更新':'就诊记录已登记');
|
||||
}
|
||||
|
||||
/* ===== 详情抽屉 ===== */
|
||||
function openView(id){
|
||||
var t=nonstaffs.find(function(x){return x.id===id;});
|
||||
document.getElementById('viewTitle').textContent='就诊详情 · '+t.user;
|
||||
function d(k,v,full){return '<div class="detail-item'+(full?' detail-item--full':'')+'"><div class="dk">'+k+'</div><div class="dv">'+(v||'—')+'</div></div>';}
|
||||
var rxHtml=t.rx.length?'<table class="mini-table"><thead><tr><th>药品名称</th><th>规格</th><th>数量</th><th>用法用量</th></tr></thead><tbody>'+t.rx.map(function(r){return '<tr><td>'+r.m+'</td><td>'+r.spec+'</td><td>'+r.num+'</td><td>'+r.dosage+'</td></tr>';}).join('')+'</tbody></table>':'<span style="color:var(--text-placeholder);font-size:var(--font-sm);">本次就诊未开药</span>';
|
||||
document.getElementById('viewBody').innerHTML=
|
||||
'<div class="form-section" style="margin-top:0;">就诊人信息</div>'
|
||||
+'<div class="detail-grid">'+d('就诊人',t.user)+d('性别/年龄',t.sex+' / '+t.age+'岁')+d('身份证号',t.idcard)+d('联系电话',t.phone)+d('与员工关系',t.rel)+d('就诊医疗点',t.point)+d('就诊医生',t.doctor)+d('就诊时间',t.time)+d('是否复诊',t.revisit)+'</div>'
|
||||
+'<div class="form-section">诊断信息</div>'
|
||||
+'<div class="detail-grid">'+d('主诉',t.main,true)+d('查体',t.inspect,true)+d('既往史',t.past)+d('现病史',t.present)+d('过敏史',t.allergy)+d('诊断疾病',t.disease,true)+'</div>'
|
||||
+'<div class="form-section">用药方案</div>'+rxHtml
|
||||
+'<div class="form-section">医嘱与生活建议</div>'
|
||||
+'<div class="detail-grid">'+d('医嘱',t.advice,true)+d('膳食处方',t.food)+d('运动处方',t.sport)+'</div>';
|
||||
document.getElementById('viewMask').classList.add('open');
|
||||
document.getElementById('viewDrawer').classList.add('open');
|
||||
}
|
||||
|
||||
/* ===== 删除 ===== */
|
||||
function askDelete(id){
|
||||
pendingDelId=id;delMode='single';
|
||||
var t=nonstaffs.find(function(x){return x.id===id;});
|
||||
document.getElementById('delText').textContent='确认删除「'+t.user+'」于 '+t.time+' 的就诊记录?关联出库的药品不自动回补库存。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
}
|
||||
function confirmDelete(){
|
||||
if(delMode==='batch'){
|
||||
nonstaffs=nonstaffs.filter(function(t){return window._batchIds.indexOf(t.id)===-1;});
|
||||
showToast('已批量删除 '+window._batchIds.length+' 条记录');
|
||||
}else{
|
||||
nonstaffs=nonstaffs.filter(function(t){return t.id!==pendingDelId;});
|
||||
showToast('就诊记录已删除');
|
||||
}
|
||||
closeModal('delMask');renderTable();
|
||||
}
|
||||
|
||||
/* ===== 批量选择与删除 ===== */
|
||||
function toggleAll(el){document.querySelectorAll('.row-check').forEach(function(c){c.checked=el.checked;});}
|
||||
function askBatchDelete(){
|
||||
var ids=[].slice.call(document.querySelectorAll('.row-check:checked')).map(function(c){return parseInt(c.value);});
|
||||
if(!ids.length){showToast('请先勾选要删除的记录');return;}
|
||||
pendingDelId=null;delMode='batch';
|
||||
document.getElementById('delText').textContent='确认删除勾选的 '+ids.length+' 条就诊记录?关联出库的药品不自动回补库存。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
window._batchIds=ids;
|
||||
}
|
||||
|
||||
/* ===== 异步导出与导出任务 ===== */
|
||||
var delMode='single';
|
||||
var exportLogs=[
|
||||
{file:'非员工就诊记录导出_2026-09-01 09:36.xlsx',status:'done',time:'2026-09-01 09:36'},
|
||||
{file:'非员工就诊记录导出_2026-08-15 14:02.xlsx',status:'done',time:'2026-08-15 14:02'},
|
||||
{file:'非员工就诊记录导出_2026-07-30 16:45.xlsx',status:'fail',time:'2026-07-30 16:45'}
|
||||
];
|
||||
function exportStatusHtml(s){
|
||||
if(s==='done')return '<span class="badge badge--success">已生成</span>';
|
||||
if(s==='fail')return '<span class="badge badge--danger">生成失败</span>';
|
||||
return '<span class="badge badge--warning">生成中</span>';
|
||||
}
|
||||
function renderExportList(){
|
||||
var body=document.getElementById('exportBody');
|
||||
body.innerHTML=exportLogs.map(function(e){
|
||||
var act=e.status==='done'?'<button class="btn btn-link" onclick="showToast(\'演示环境不提供真实文件\')">下载</button>'
|
||||
:e.status==='fail'?'<button class="btn btn-link" onclick="retryExport(\''+e.file+'\')">重试</button>'
|
||||
:'<span style="color:var(--text-placeholder);">—</span>';
|
||||
return '<tr><td style="text-align:left;">'+e.file+'</td><td>'+exportStatusHtml(e.status)+'</td><td>'+e.time+'</td><td>'+act+'</td></tr>';
|
||||
}).join('')||'<tr><td colspan="4" class="td-empty">暂无导出任务</td></tr>';
|
||||
}
|
||||
function openExport(){
|
||||
renderExportList();
|
||||
document.getElementById('exportMask').classList.add('open');
|
||||
document.getElementById('exportDrawer').classList.add('open');
|
||||
}
|
||||
function nowHM(){
|
||||
var d=new Date(),p=function(n){return (n<10?'0':'')+n;};
|
||||
return '2026-09-07 '+p(d.getHours())+':'+p(d.getMinutes());
|
||||
}
|
||||
function doExport(){
|
||||
exportLogs.unshift({file:'非员工就诊记录导出_'+nowHM()+'.xlsx',status:'ing',time:'—'});
|
||||
showToast('导出任务已提交,完成后可在「查看导出任务」下载');
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
setTimeout(function(){
|
||||
var e=exportLogs[0];
|
||||
if(e&&e.status==='ing'){e.status='done';e.time=nowHM();}
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
},1800);
|
||||
}
|
||||
function retryExport(file){
|
||||
var e=exportLogs.find(function(x){return x.file===file;});
|
||||
if(!e)return;
|
||||
e.status='ing';e.time='—';renderExportList();
|
||||
showToast('已重新提交导出任务');
|
||||
setTimeout(function(){
|
||||
if(e.status==='ing'){e.status='done';e.time=nowHM();}
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
},1800);
|
||||
}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
function closeDrawer(k){
|
||||
document.getElementById(k+'Mask').classList.remove('open');
|
||||
document.getElementById(k+'Drawer').classList.remove('open');
|
||||
}
|
||||
function closeModal(id){document.getElementById(id).classList.remove('open');}
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2200);
|
||||
}
|
||||
|
||||
renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,775 +0,0 @@
|
||||
<!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;font-size:var(--font-sm);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;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
.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;white-space:nowrap;width:200px;flex-shrink:0;}
|
||||
.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 14px;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);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;padding-bottom:24px;}
|
||||
.sidebar-menu__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:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;min-width:120px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.org-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:36px;left:0;z-index:310;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:380px;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-col{flex:1;overflow-y:auto;max-height:200px;border-right:1px solid var(--border);}
|
||||
.org-col:last-child{border-right:none;}
|
||||
.org-col__title{padding:6px 12px;font-size:var(--font-sm);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.org-item{padding:8px 12px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
.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;white-space:nowrap;}
|
||||
.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);}
|
||||
.btn-link{background:none;color:var(--primary);padding:0 4px;height:auto;}.btn-link:hover{color:#40a9ff;}
|
||||
.btn-link--danger{color:var(--danger);}
|
||||
.btn-sm{height:26px;padding:0 10px;}
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;margin-top:16px;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:1700px;}
|
||||
thead th{background:#FAFAFA;padding:10px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:12px 14px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
thead tr th:last-child,tbody td:last-child{position:sticky;right:0;z-index:5;background:#fff;box-shadow:-4px 0 8px rgba(0,0,0,0.04);}
|
||||
thead tr th:last-child{z-index:8;background:#FAFAFA;}
|
||||
tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);}
|
||||
.badge{display:inline-block;padding:2px 10px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.badge--warning{background:#FFFBE6;color:#D48806;border:1px solid #FFE58F;}
|
||||
.badge--success{background:#F6FFED;color:#389E0D;border:1px solid #B7EB8F;}
|
||||
.badge--danger{background:#FFF1F0;color:#CF1322;border:1px solid #FFCCC7;}
|
||||
.badge--muted{background:#F5F5F5;color:var(--text-secondary);border:1px solid var(--border);}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{min-width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;padding:0 6px;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.page-btn:disabled{opacity:.4;cursor:not-allowed;background:#fff;color:var(--text-placeholder);border-color:var(--border);}
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
.drawer-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:900;}
|
||||
.drawer-mask.open{display:block;}
|
||||
.drawer{position:fixed;top:56px;right:-760px;bottom:0;width:720px;background:#fff;z-index:910;box-shadow:-8px 0 24px rgba(0,0,0,.12);transition:right .25s ease;display:flex;flex-direction:column;}
|
||||
.drawer.open{right:0;}
|
||||
.drawer--narrow{width:640px;right:-680px;}
|
||||
.drawer__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);font-size:var(--font-lg);font-weight:600;flex-shrink:0;}
|
||||
.drawer__close{cursor:pointer;color:var(--text-placeholder);font-size:20px;line-height:1;border:none;background:none;}
|
||||
.drawer__close:hover{color:var(--text-primary);}
|
||||
.drawer__body{flex:1;overflow-y:auto;padding:24px;}
|
||||
.drawer__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
.form-section{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:20px 0 12px;padding-left:8px;border-left:3px solid var(--primary);}
|
||||
.form-section:first-child{margin-top:0;}
|
||||
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 16px;}
|
||||
.form-item{display:flex;flex-direction:column;gap:6px;margin-bottom:14px;}
|
||||
.form-item--full{grid-column:1/-1;}
|
||||
.form-label{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.form-label .req{color:var(--danger);}
|
||||
.form-control{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-sm);color:var(--text-primary);outline:none;width:100%;}
|
||||
.form-control:focus{border-color:var(--primary);}
|
||||
.form-control[readonly]{background:#FAFAFA;color:var(--text-secondary);}
|
||||
textarea.form-control{height:56px;padding:8px 10px;resize:vertical;line-height:1.5;}
|
||||
select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;-webkit-appearance:none;padding-right:28px;cursor:pointer;}
|
||||
.radio-group{display:flex;gap:18px;min-height:32px;align-items:center;}
|
||||
.radio{display:flex;align-items:center;gap:6px;font-size:var(--font-sm);cursor:pointer;}
|
||||
.radio input{accent-color:var(--primary);cursor:pointer;}
|
||||
.with-btn{display:flex;gap:8px;}
|
||||
.mini-table{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;min-width:0;}
|
||||
.mini-table thead th{background:#FAFAFA;position:sticky;top:0;font-size:var(--font-sm);}
|
||||
.mini-table td{white-space:normal;font-size:var(--font-sm);}
|
||||
.rx-table select,.rx-table input{height:28px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 6px;font-size:var(--font-sm);width:100%;outline:none;}
|
||||
.rx-table th,.rx-table td{padding:6px 5px;font-size:var(--font-sm);}
|
||||
.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;}
|
||||
.detail-item{display:flex;border-bottom:1px solid var(--border);}
|
||||
.detail-item--full{grid-column:1/-1;}
|
||||
.detail-item .dk{width:110px;flex-shrink:0;background:#FAFAFA;padding:9px 12px;font-size:var(--font-sm);color:var(--text-secondary);border-right:1px solid var(--border);}
|
||||
.detail-item .dv{flex:1;padding:9px 12px;font-size:var(--font-sm);color:var(--text-primary);white-space:normal;line-height:1.5;}
|
||||
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:950;align-items:center;justify-content:center;}
|
||||
.modal-mask.open{display:flex;}
|
||||
.modal{width:440px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:24px;}
|
||||
.modal--wide{width:680px;max-height:80vh;display:flex;flex-direction:column;}
|
||||
.modal__title{font-size:var(--font-base);font-weight:600;margin-bottom:12px;display:flex;align-items:center;gap:8px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:8px;}
|
||||
.modal--wide .table-holder{flex:1;overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-sm);max-height:340px;}
|
||||
</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 6.5l7 3.5v4.5c0 4.2-2.9 6.8-7 7.5-4.1-.7-7-3.3-7-7.5V10l7-3.5z" stroke="#fff" stroke-width="1.8" fill="none"/><path d="M11 13.5h6M14 10.5v6" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/></svg> 一线医疗</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html" class="active">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
<a href="alert-dirty.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-menu__title">日常业务</div>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>日常诊疗</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-treatment-staff.html" class="sidebar-item active">员工就诊</a>
|
||||
<a href="daily-treatment-nonstaff.html" class="sidebar-item">非员工就诊</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-ambulance-attendance.html" class="sidebar-item">救护车出勤</a>
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>就诊人</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>就诊人所属单位</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
<div class="org-col" id="unitCol">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" onclick="selectUnit(this,'')">全部单位/部门</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采油一厂')">采油一厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采油二厂')">采油二厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'第四采油厂')">第四采油厂</div>
|
||||
<div class="org-item" onclick="selectUnit(this,'采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="deptCol">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" onclick="selectDept(this,'')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterUnit" onchange="onFilterUnit()" style="min-width:120px;">
|
||||
<option value="">全部单位</option>
|
||||
<option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>就诊医疗点</label>
|
||||
<select class="filter-select" id="filterPoint" style="min-width:160px;">
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>就诊时间</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-primary" onclick="openForm()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>新增就诊记录
|
||||
</button>
|
||||
<button class="btn btn-default btn-link--danger" onclick="askBatchDelete()">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><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" onclick="openExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th>就诊人</th><th>工号</th><th>性别</th><th>年龄</th><th>就诊人所属单位</th><th>就诊人所属部门</th><th>医疗点所属单位</th><th>就诊医疗点</th><th>就诊疾病</th><th>联系电话</th><th>就诊医生</th><th>就诊时间</th><th>体检报告</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination">
|
||||
<span id="pageInfo"></span>
|
||||
<button class="page-btn" id="prevBtn" onclick="turnPage(-1)">上一页</button>
|
||||
<span id="pageNum" style="min-width:64px;text-align:center;"></span>
|
||||
<button class="page-btn" id="nextBtn" onclick="turnPage(1)">下一页</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- [交互] 新增/编辑就诊抽屉 -->
|
||||
<div class="drawer-mask" id="formMask" onclick="closeDrawer('form')"></div>
|
||||
<div class="drawer" id="formDrawer">
|
||||
<div class="drawer__header"><span id="formTitle">新增就诊记录</span><button class="drawer__close" onclick="closeDrawer('form')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<div class="form-section">就诊信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊人</span>
|
||||
<div class="with-btn">
|
||||
<input class="form-control" id="fUser" readonly placeholder="点击下方按钮选人" style="flex:1;">
|
||||
<button class="btn btn-default" onclick="openUserPick()">选择员工</button>
|
||||
</div></div>
|
||||
<div class="form-item"><span class="form-label">工号</span><input class="form-control" id="fCode" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label">性别/年龄</span><input class="form-control" id="fSexAge" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label">身份证号</span><input class="form-control" id="fIdcard" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label">联系电话</span><input class="form-control" id="fTel" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label">所属单位</span><input class="form-control" id="fUUnit" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label">所属部门</span><input class="form-control" id="fUDept" readonly placeholder="选择员工后自动带出"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊时间</span>
|
||||
<input class="form-control" type="datetime-local" id="fTime"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊医疗点</span>
|
||||
<select class="form-control" id="fPoint"><option value="">请选择医疗点</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 就诊医生</span>
|
||||
<select class="form-control" id="fDoctor"><option value="">请选择医生</option></select></div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">诊断信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">主诉</span><input class="form-control" id="fMain" placeholder="患者主要症状与持续时间"></div>
|
||||
<div class="form-item"><span class="form-label">查体</span><input class="form-control" id="fInspect" placeholder="体温/血压/心率等体征"></div>
|
||||
<div class="form-item"><span class="form-label">既往史</span><input class="form-control" id="fPast" placeholder="既往疾病与手术史"></div>
|
||||
<div class="form-item"><span class="form-label">现病史</span><input class="form-control" id="fPresent" placeholder="本次发病情况"></div>
|
||||
<div class="form-item"><span class="form-label">过敏史</span><input class="form-control" id="fAllergy" placeholder="药物/食物过敏情况"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 诊断疾病</span><input class="form-control" id="fDisease" placeholder="如:上呼吸道感染"></div>
|
||||
</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">是否复诊</span>
|
||||
<div class="radio-group">
|
||||
<label class="radio"><input type="radio" name="fRevisit" value="是">是</label>
|
||||
<label class="radio"><input type="radio" name="fRevisit" value="否" checked>否</label>
|
||||
</div></div>
|
||||
|
||||
<div class="form-section">用药方案</div>
|
||||
<table class="mini-table rx-table">
|
||||
<thead><tr><th style="width:34%">药品名称</th><th>规格</th><th style="width:12%">库存</th><th style="width:12%">数量</th><th style="width:24%">用法用量</th><th style="width:44px">操作</th></tr></thead>
|
||||
<tbody id="rxBody"></tbody>
|
||||
</table>
|
||||
<div style="margin-top:8px;"><button class="btn btn-default btn-sm" onclick="addRx()">+ 添加药品</button></div>
|
||||
|
||||
<div class="form-section">医嘱与生活建议</div>
|
||||
<div class="form-item form-item--full"><span class="form-label">医嘱</span><textarea class="form-control" id="fAdvice" placeholder="用药与注意事项"></textarea></div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item"><span class="form-label">膳食处方</span><textarea class="form-control" id="fFood" placeholder="饮食建议"></textarea></div>
|
||||
<div class="form-item"><span class="form-label">运动处方</span><textarea class="form-control" id="fSport" placeholder="运动建议"></textarea></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="drawer__footer">
|
||||
<button class="btn btn-default" onclick="closeDrawer('form')">取消</button>
|
||||
<button class="btn btn-primary" onclick="saveForm()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 查看详情抽屉 -->
|
||||
<div class="drawer-mask" id="viewMask" onclick="closeDrawer('view')"></div>
|
||||
<div class="drawer" id="viewDrawer">
|
||||
<div class="drawer__header"><span id="viewTitle">就诊详情</span><button class="drawer__close" onclick="closeDrawer('view')">×</button></div>
|
||||
<div class="drawer__body" id="viewBody"></div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('view')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 就诊人选人弹窗 -->
|
||||
<div class="modal-mask" id="userMask">
|
||||
<div class="modal modal--wide">
|
||||
<div class="modal__title">选择就诊员工</div>
|
||||
<div class="filter-bar" style="border-radius:var(--radius-sm);box-shadow:none;padding:0;margin-bottom:14px;">
|
||||
<div class="filter-item">
|
||||
<label>姓名/工号</label>
|
||||
<input class="filter-input" id="userQ" placeholder="输入姓名或工号过滤" style="min-width:150px;" oninput="renderUserPick()">
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-holder">
|
||||
<table class="mini-table">
|
||||
<thead><tr><th style="width:40px"></th><th>姓名</th><th>员工工号</th><th>所属单位</th><th>所属部门</th></tr></thead>
|
||||
<tbody id="userBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('userMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmUser()">确认选择</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 删除确认弹窗 -->
|
||||
<div class="modal-mask" id="delMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#FAAD14" stroke-width="1.6"/><path d="M10 5.5v6M10 13.5v1" stroke="#FAAD14" stroke-width="1.8" stroke-linecap="round"/></svg> 删除确认</div>
|
||||
<div class="modal__text" id="delText">确认删除该条就诊记录?</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('delMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmDelete()">确认删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 导出任务抽屉(异步导出任务列表) -->
|
||||
<div class="drawer-mask" id="exportMask" onclick="closeDrawer('export')"></div>
|
||||
<div class="drawer drawer--narrow" id="exportDrawer">
|
||||
<div class="drawer__header"><span>导出任务</span><button class="drawer__close" onclick="closeDrawer('export')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th>文件名</th><th>状态</th><th>生成时间</th><th>操作</th></tr></thead>
|
||||
<tbody id="exportBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('export')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏) ===== */
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
'采油二厂':['姬圪台作业区医疗点','桐园作业区医疗点'],
|
||||
'第四采油厂':['西峰基地医疗点'],
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
/* 医生池:分配医疗点的驻点医护 */
|
||||
var doctorPool=['石维国','李桂芳','曲志明','张秀兰','高建军','闫婷','刘玉梅'];
|
||||
/* 药品池:与「药品信息」页一致的子集 */
|
||||
var medPool=[
|
||||
{name:'阿莫西林胶囊',spec:'0.25g*24粒',stock:96,price:18.5},
|
||||
{name:'布洛芬缓释胶囊',spec:'0.3g*20粒',stock:120,price:16.0},
|
||||
{name:'硝苯地平控释片',spec:'30mg*7片',stock:45,price:32.6},
|
||||
{name:'二甲双胍缓释片',spec:'0.5g*30片',stock:80,price:25.8},
|
||||
{name:'蒙脱石散',spec:'3g*10袋',stock:150,price:13.9},
|
||||
{name:'复方氯化钠注射液',spec:'500ml',stock:60,price:6.5},
|
||||
{name:'云南白药气雾剂',spec:'85g+30g',stock:28,price:38.0},
|
||||
{name:'藿香正气口服液',spec:'10ml*10支',stock:90,price:15.2}
|
||||
];
|
||||
/* 就诊员工池 */
|
||||
var userPool=[
|
||||
{name:'石维国',code:'CQ021578',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'139****2051',idcard:'610102197804154213'},
|
||||
{name:'李桂芳',code:'CQ032144',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'138****7742',idcard:'610102198603214826'},
|
||||
{name:'白瑞',code:'CQ044871',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'155****3316',idcard:'610102199307104517'},
|
||||
{name:'曲志明',code:'CQ019203',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'137****8890',idcard:'610102198209285310'},
|
||||
{name:'张秀兰',code:'CQ027710',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'136****2248',idcard:'610102197912064629'},
|
||||
{name:'赵万福',code:'CQ033096',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'150****6127',idcard:'610102198511224737'},
|
||||
{name:'高建军',code:'CQ010564',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'139****0086',idcard:'610102197406304419'},
|
||||
{name:'闫婷',code:'CQ041822',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'186****5527',idcard:'610102199001184928'},
|
||||
{name:'刘玉梅',code:'CQ036441',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'135****7719',idcard:'610102198408214523'},
|
||||
{name:'呼建国',code:'CQ029905',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'147****9003',idcard:'610102198805174635'}
|
||||
];
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂'};
|
||||
var treatments=[
|
||||
{id:1,user:'呼建国',code:'CQ029905',sex:'男',age:36,uUnit:'采气一厂',uDept:'靖边净化厂',point:'靖边气田医疗点',disease:'上呼吸道感染',tel:'147****9003',doctor:'刘玉梅',time:'2026-09-06 09:30',main:'发热咽痛2天',inspect:'体温38.2℃,咽部充血',past:'无',present:'受凉后发热',allergy:'无',revisit:'否',rx:[{m:'阿莫西林胶囊',spec:'0.25g*24粒',num:2,dosage:'一次2粒 一日3次'}],advice:'多饮水注意休息,三天后复诊',food:'清淡饮食,忌辛辣',sport:'暂缓运动'},
|
||||
{id:2,user:'赵万福',code:'CQ033096',sex:'男',age:39,uUnit:'采油二厂',uDept:'桐园作业区',point:'桐园作业区医疗点',disease:'高血压病(2级)',tel:'150****6127',doctor:'曲志明',time:'2026-09-05 15:10',main:'头晕1周,血压波动',inspect:'血压158/96mmHg',past:'高血压3年,规律服药',present:'劳累后头晕加重',allergy:'无',revisit:'是',rx:[{m:'硝苯地平控释片',spec:'30mg*7片',num:1,dosage:'一次1片 一日1次'}],advice:'每日晨起测量血压',food:'低盐低脂,每日食盐<5g',sport:'每周150分钟中等强度有氧'},
|
||||
{id:3,user:'杨慧敏',code:'CQ045130',sex:'女',age:33,uUnit:'采油一厂',uDept:'樊学作业区',point:'樊学作业区医疗点',disease:'踝关节扭伤',tel:'188****7214',doctor:'石维国',time:'2026-09-04 11:00',main:'跌倒后右踝肿痛3小时',inspect:'右踝外侧肿胀,活动受限',past:'无',present:'井场巡检时滑倒',allergy:'无',revisit:'否',rx:[{m:'云南白药气雾剂',spec:'85g+30g',num:1,dosage:'外用 一日3次'}],advice:'48小时内冰敷,抬高患肢',food:'均衡饮食',sport:'两周制动,后渐进负重训练'},
|
||||
{id:4,user:'高建军',code:'CQ010564',sex:'男',age:50,uUnit:'第四采油厂',uDept:'基地管理处',point:'西峰基地医疗点',disease:'2型糖尿病复诊',tel:'139****0086',doctor:'闫婷',time:'2026-09-03 10:20',main:'口渴乏力1月',inspect:'空腹血糖8.9mmol/L',past:'糖尿病5年',present:'近1月血糖控制欠佳',allergy:'磺胺类过敏',revisit:'是',rx:[{m:'二甲双胍缓释片',spec:'0.5g*30片',num:2,dosage:'一次1片 一日2次'}],advice:'监测空腹与餐后血糖,两周后复查',food:'控制总热量,主食粗细搭配',sport:'餐后1小时快走30分钟'},
|
||||
{id:5,user:'田震',code:'CQ037744',sex:'男',age:35,uUnit:'采油一厂',uDept:'樊学作业区',point:'樊学作业区医疗点',disease:'急性胃肠炎',tel:'139****5218',doctor:'李桂芳',time:'2026-09-02 16:45',main:'腹痛腹泻1天',inspect:'肠鸣音活跃,脐周压痛',past:'无',present:'进食隔夜饭后腹泻',allergy:'无',revisit:'否',rx:[{m:'蒙脱石散',spec:'3g*10袋',num:1,dosage:'一次1袋 一日3次'},{m:'复方氯化钠注射液',spec:'500ml',num:1,dosage:'静脉滴注 1次'}],advice:'补液防脱水,症状加重随时就诊',food:'流质饮食过渡,忌生冷油腻',sport:'注意休息'},
|
||||
{id:6,user:'徐立成',code:'CQ022317',sex:'男',age:44,uUnit:'采气一厂',uDept:'苏里格南作业区',point:'乌审旗采气区医疗点',disease:'中暑(先兆)',tel:'133****4860',doctor:'刘玉梅',time:'2026-08-28 13:30',main:'高温作业后头晕出汗',inspect:'体温37.8℃,面色潮红',past:'无',present:'午间巡检后不适',allergy:'无',revisit:'否',rx:[{m:'藿香正气口服液',spec:'10ml*10支',num:1,dosage:'一次1支 一日2次'}],advice:'阴凉处休息,少量多次饮水',food:'清淡,适当补充电解质',sport:'避开高温时段作业'},
|
||||
{id:7,user:'张秀兰',code:'CQ027710',sex:'女',age:45,uUnit:'采油二厂',uDept:'姬圪台联合站',point:'姬圪台作业区医疗点',disease:'腰肌劳损',tel:'136****2248',doctor:'曲志明',time:'2026-08-25 09:00',main:'腰部酸痛2周',inspect:'腰两侧压痛,活动受限',past:'久坐工作史',present:'渐进性酸痛',allergy:'无',revisit:'是',rx:[{m:'布洛芬缓释胶囊',spec:'0.3g*20粒',num:1,dosage:'一次1粒 一日2次'}],advice:'避免久坐,配合理疗',food:'均衡营养',sport:'小燕飞等腰背肌锻炼'},
|
||||
{id:8,user:'石维国',code:'CQ021578',sex:'男',age:46,uUnit:'采油一厂',uDept:'樊学作业区',point:'樊学作业区医疗点',disease:'电光性眼炎',tel:'139****2051',doctor:'李桂芳',time:'2026-08-21 18:20',main:'焊接后眼痛流泪6小时',inspect:'睑结膜充血',past:'无',present:'未戴护目镜作业',allergy:'无',revisit:'否',rx:[],advice:'冷敷,避免揉眼,24小时复查',food:'忌辛辣刺激',sport:'减少用眼'}
|
||||
];
|
||||
var nextId=9,editingId=null,curRx=[],curUser=null,pendingDelId=null,pendingUser=null;
|
||||
|
||||
/* ===== 单位部门级联筛选 ===== */
|
||||
var deptMap={
|
||||
'采油一厂':['樊学作业区','采油大队','安全环保科','生产技术部','工会办公室'],
|
||||
'采油二厂':['姬圪台联合站','桐园作业区','安全环保科','信息中心'],
|
||||
'第四采油厂':['基地管理处','健康管理部','生产技术部','财务部'],
|
||||
'采气一厂':['靖边净化厂','苏里格南作业区','生产技术部']
|
||||
};
|
||||
var selUnit='',selDept='';
|
||||
function toggleOrg(){
|
||||
document.getElementById('orgPanel').classList.toggle('open');
|
||||
document.getElementById('orgTrigger').classList.toggle('open');
|
||||
}
|
||||
function selectUnit(elem,unitName){
|
||||
document.querySelectorAll('#unitCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selUnit=unitName;
|
||||
var html='<div class="org-col__title">部门</div><div class="org-item active" onclick="selectDept(this,\'\')">全部部门</div>';
|
||||
(deptMap[unitName]||[]).forEach(function(d){
|
||||
html+='<div class="org-item" onclick="selectDept(this,\''+d+'\')">'+d+'</div>';
|
||||
});
|
||||
document.getElementById('deptCol').innerHTML=html;
|
||||
selDept='';
|
||||
}
|
||||
function selectDept(elem,deptName){
|
||||
document.querySelectorAll('#deptCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selDept=deptName;
|
||||
document.getElementById('orgTrigger').textContent=(selUnit||'全部单位')+' / '+(selDept||'全部部门');
|
||||
}
|
||||
function resetOrg(){
|
||||
selUnit='';selDept='';
|
||||
document.getElementById('orgTrigger').textContent='全部单位/部门';
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
document.getElementById('orgTrigger').classList.remove('open');
|
||||
document.querySelectorAll('#unitCol .org-item').forEach(function(i,idx){i.classList.toggle('active',idx===0);});
|
||||
document.getElementById('deptCol').innerHTML='<div class="org-col__title">部门</div><div class="org-item active" onclick="selectDept(this,\'\')">全部部门</div>';
|
||||
}
|
||||
|
||||
/* ===== 异步导出与导出任务 ===== */
|
||||
var exportLogs=[
|
||||
{file:'员工就诊记录导出_2026-09-01 09:36.xlsx',status:'done',time:'2026-09-01 09:36'},
|
||||
{file:'员工就诊记录导出_2026-08-15 14:02.xlsx',status:'done',time:'2026-08-15 14:02'},
|
||||
{file:'员工就诊记录导出_2026-07-30 16:45.xlsx',status:'fail',time:'2026-07-30 16:45'}
|
||||
];
|
||||
function exportStatusHtml(s){
|
||||
if(s==='done')return '<span class="badge badge--success">已生成</span>';
|
||||
if(s==='fail')return '<span class="badge badge--danger">生成失败</span>';
|
||||
return '<span class="badge badge--warning">生成中</span>';
|
||||
}
|
||||
function renderExportList(){
|
||||
var body=document.getElementById('exportBody');
|
||||
body.innerHTML=exportLogs.map(function(e){
|
||||
var act=e.status==='done'?'<button class="btn btn-link" onclick="showToast(\'演示环境不提供真实文件\')">下载</button>'
|
||||
:e.status==='fail'?'<button class="btn btn-link" onclick="retryExport(\''+e.file+'\')">重试</button>'
|
||||
:'<span style="color:var(--text-placeholder);">—</span>';
|
||||
return '<tr><td style="text-align:left;">'+e.file+'</td><td>'+exportStatusHtml(e.status)+'</td><td>'+e.time+'</td><td>'+act+'</td></tr>';
|
||||
}).join('')||'<tr><td colspan="4" class="td-empty">暂无导出任务</td></tr>';
|
||||
}
|
||||
function openExport(){
|
||||
renderExportList();
|
||||
document.getElementById('exportMask').classList.add('open');
|
||||
document.getElementById('exportDrawer').classList.add('open');
|
||||
}
|
||||
function nowHM(){
|
||||
var d=new Date(),p=function(n){return (n<10?'0':'')+n;};
|
||||
return '2026-09-07 '+p(d.getHours())+':'+p(d.getMinutes());
|
||||
}
|
||||
function doExport(){
|
||||
exportLogs.unshift({file:'员工就诊记录导出_'+nowHM()+'.xlsx',status:'ing',time:'—'});
|
||||
showToast('导出任务已提交,完成后可在「查看导出任务」下载');
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
setTimeout(function(){
|
||||
var e=exportLogs[0];
|
||||
if(e&&e.status==='ing'){e.status='done';e.time=nowHM();}
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
},1800);
|
||||
}
|
||||
function retryExport(file){
|
||||
var e=exportLogs.find(function(x){return x.file===file;});
|
||||
if(!e)return;
|
||||
e.status='ing';e.time='—';renderExportList();
|
||||
showToast('已重新提交导出任务');
|
||||
setTimeout(function(){
|
||||
if(e.status==='ing'){e.status='done';e.time=nowHM();}
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
},1800);
|
||||
}
|
||||
|
||||
/* ===== 批量选择与删除 ===== */
|
||||
function toggleAll(el){document.querySelectorAll('.row-check').forEach(function(c){c.checked=el.checked;});}
|
||||
function askBatchDelete(){
|
||||
var ids=[].slice.call(document.querySelectorAll('.row-check:checked')).map(function(c){return parseInt(c.value);});
|
||||
if(!ids.length){showToast('请先勾选要删除的记录');return;}
|
||||
pendingDelId=null;delMode='batch';
|
||||
document.getElementById('delText').textContent='确认删除勾选的 '+ids.length+' 条就诊记录?关联出库的药品不自动回补库存。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
window._batchIds=ids;
|
||||
}
|
||||
|
||||
/* ===== 列表 ===== */
|
||||
var pageSize=10,currentPage=1,delMode='single',pendingBatchIds=null;
|
||||
function onFilterUnit(){
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var sel=document.getElementById('filterPoint');
|
||||
sel.innerHTML='<option value="">全部医疗点</option>';
|
||||
if(unit){(pointMap[unit]||[]).forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});}
|
||||
}
|
||||
function currentData(){
|
||||
var name=document.getElementById('filterName').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
return treatments.filter(function(t){
|
||||
var d=t.time.slice(0,10);
|
||||
return (!name||t.user.indexOf(name)!==-1)
|
||||
&&(!selUnit||t.uUnit===selUnit)&&(!selDept||t.uDept===selDept)
|
||||
&&(!unit||pointUnit[t.point]===unit)&&(!point||t.point===point)
|
||||
&&(!from||d>=from)&&(!to||d<=to);
|
||||
});
|
||||
}
|
||||
function renderTable(){
|
||||
var list=currentData();
|
||||
var start=(currentPage-1)*pageSize,pageData=list.slice(start,start+pageSize);
|
||||
var totalPages=Math.ceil(list.length/pageSize)||1;
|
||||
document.getElementById('pageInfo').textContent='共 '+list.length+' 条记录';
|
||||
document.getElementById('pageNum').textContent=currentPage+'/'+totalPages;
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
var tbody=document.getElementById('tableBody');
|
||||
var ca=document.getElementById('checkAll');if(ca)ca.checked=false;
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="16" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(t,i){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+t.id+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+t.user+'</td>'
|
||||
+'<td>'+t.code+'</td><td>'+t.sex+'</td><td>'+t.age+'</td>'
|
||||
+'<td>'+t.uUnit+'</td><td>'+t.uDept+'</td>'
|
||||
+'<td>'+pointUnit[t.point]+'</td><td>'+t.point+'</td>'
|
||||
+'<td style="text-align:left;max-width:160px;overflow:hidden;text-overflow:ellipsis;" title="'+t.disease+'">'+t.disease+'</td>'
|
||||
+'<td>'+t.tel+'</td><td>'+t.doctor+'</td><td>'+t.time+'</td>'
|
||||
+'<td><button class="btn btn-link" onclick="showToast(\'体检报告在线预览(演示)\')">查看</button></td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openView('+t.id+')">详情</button>'
|
||||
+'<button class="btn btn-link" onclick="openForm('+t.id+')">编辑</button>'
|
||||
+'<button class="btn btn-link btn-link--danger" onclick="askDelete('+t.id+')">删除</button>'
|
||||
+'</td></tr>';
|
||||
});
|
||||
tbody.innerHTML=html;
|
||||
}
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
resetOrg();
|
||||
applyFilter();
|
||||
}
|
||||
function turnPage(d){
|
||||
var totalPages=Math.ceil(currentData().length/pageSize)||1;
|
||||
currentPage=Math.min(Math.max(1,currentPage+d),totalPages);
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 用药方案行 ===== */
|
||||
function renderRx(){
|
||||
var html=curRx.map(function(r,i){
|
||||
var opts='<option value="">请选择药品</option>'+medPool.map(function(m){return '<option'+(m.name===r.m?' selected':'')+'>'+m.name+'</option>';}).join('');
|
||||
return '<tr>'
|
||||
+'<td><select onchange="pickMed('+i+',this.value)">'+opts+'</select></td>'
|
||||
+'<td><input value="'+r.spec+'" readonly placeholder="--"></td>'
|
||||
+'<td><input value="'+(r.stock||'')+'" readonly placeholder="--"></td>'
|
||||
+'<td><input type="number" min="1" value="'+r.num+'" oninput="curRx['+i+'].num=this.value" placeholder="盒"></td>'
|
||||
+'<td><input value="'+r.dosage+'" oninput="curRx['+i+'].dosage=this.value" placeholder="如:一次1粒 一日2次"></td>'
|
||||
+'<td><button class="btn btn-link btn-link--danger" onclick="curRx.splice('+i+',1);renderRx()">删除</button></td></tr>';
|
||||
}).join('');
|
||||
document.getElementById('rxBody').innerHTML=html||'<tr><td colspan="6" style="color:var(--text-placeholder);padding:14px;">暂未添加药品,点击下方「+ 添加药品」</td></tr>';
|
||||
}
|
||||
function addRx(){curRx.push({m:'',spec:'',stock:0,num:1,dosage:''});renderRx();}
|
||||
function pickMed(i,name){
|
||||
var m=medPool.find(function(x){return x.name===name;});
|
||||
if(m){curRx[i].m=m.name;curRx[i].spec=m.spec;curRx[i].stock=m.stock;}
|
||||
renderRx();
|
||||
}
|
||||
|
||||
/* ===== 新增/编辑 ===== */
|
||||
function fillDoctorSel(keep){
|
||||
var sel=document.getElementById('fDoctor');
|
||||
sel.innerHTML='<option value="">请选择医生</option>';
|
||||
doctorPool.forEach(function(n){
|
||||
var o=document.createElement('option');o.textContent=n;
|
||||
if(n===keep)o.selected=true;
|
||||
sel.appendChild(o);
|
||||
});
|
||||
}
|
||||
function fillPointSel(keep){
|
||||
var sel=document.getElementById('fPoint');
|
||||
sel.innerHTML='<option value="">请选择医疗点</option>';
|
||||
Object.keys(pointMap).forEach(function(u){
|
||||
(pointMap[u]||[]).forEach(function(p){
|
||||
var o=document.createElement('option');o.textContent=p;
|
||||
if(p===keep)o.selected=true;
|
||||
sel.appendChild(o);
|
||||
});
|
||||
});
|
||||
}
|
||||
function setRadio(name,val){document.querySelectorAll('input[name="'+name+'"]').forEach(function(r){r.checked=(r.value===val);});}
|
||||
function getRadio(name){var r=document.querySelector('input[name="'+name+'"]:checked');return r?r.value:'';}
|
||||
function openForm(id){
|
||||
editingId=id||null;
|
||||
var t=id?treatments.find(function(x){return x.id===id;}):null;
|
||||
document.getElementById('formTitle').textContent=id?('编辑就诊记录 · '+t.user):'新增就诊记录';
|
||||
document.getElementById('fUser').value=t?t.user:'';
|
||||
document.getElementById('fTime').value=t?t.time.replace(' ','T'):'2026-09-07T09:00';
|
||||
fillPointSel(t?t.point:'');
|
||||
fillDoctorSel(t?t.doctor:'');
|
||||
setRadio('fRevisit',t?t.revisit:'否');
|
||||
['fMain','fInspect','fPast','fPresent','fAllergy','fDisease','fAdvice','fFood','fSport'].forEach(function(k){document.getElementById(k).value='';});
|
||||
if(t){
|
||||
document.getElementById('fMain').value=t.main;document.getElementById('fInspect').value=t.inspect;
|
||||
document.getElementById('fPast').value=t.past;document.getElementById('fPresent').value=t.present;
|
||||
document.getElementById('fAllergy').value=t.allergy;document.getElementById('fDisease').value=t.disease;
|
||||
document.getElementById('fAdvice').value=t.advice;document.getElementById('fFood').value=t.food;document.getElementById('fSport').value=t.sport;
|
||||
}
|
||||
curUser=t?userPool.find(function(u){return u.code===t.code;}):null;
|
||||
renderUserInfo(curUser);
|
||||
curRx=t?t.rx.map(function(r){return {m:r.m,spec:r.spec,stock:(medPool.find(function(m){return m.name===r.m;})||{}).stock||0,num:r.num,dosage:r.dosage};}):[];
|
||||
renderRx();
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
document.getElementById('formDrawer').classList.add('open');
|
||||
}
|
||||
function saveForm(){
|
||||
var user=document.getElementById('fUser').value;
|
||||
var time=document.getElementById('fTime').value;
|
||||
var point=document.getElementById('fPoint').value;
|
||||
var doctor=document.getElementById('fDoctor').value;
|
||||
var disease=document.getElementById('fDisease').value.trim();
|
||||
if(!user){showToast('请选择就诊人');return;}
|
||||
if(!time){showToast('请选择就诊时间');return;}
|
||||
if(!point){showToast('请选择就诊医疗点');return;}
|
||||
if(!doctor){showToast('请选择就诊医生');return;}
|
||||
if(!disease){showToast('请填写诊断疾病');return;}
|
||||
var rx=curRx.filter(function(r){return r.m;});
|
||||
var bad=rx.find(function(r){return r.num>r.stock;});
|
||||
if(bad){showToast('「'+bad.m+'」库存仅 '+bad.stock+',开药数量超限');return;}
|
||||
var obj={
|
||||
id:editingId||nextId++,user:user,code:curUser?curUser.code:'--',idcard:curUser?curUser.idcard:'--',sex:curUser?curUser.sex:'--',age:curUser?curUser.age:'--',
|
||||
uUnit:curUser?curUser.unit:'--',uDept:curUser?curUser.dept:'--',point:point,disease:disease,
|
||||
tel:curUser?curUser.tel:'--',doctor:doctor,time:time.replace('T',' '),
|
||||
main:document.getElementById('fMain').value,inspect:document.getElementById('fInspect').value,
|
||||
past:document.getElementById('fPast').value,present:document.getElementById('fPresent').value,
|
||||
allergy:document.getElementById('fAllergy').value,revisit:getRadio('fRevisit'),
|
||||
rx:rx,advice:document.getElementById('fAdvice').value,
|
||||
food:document.getElementById('fFood').value,sport:document.getElementById('fSport').value
|
||||
};
|
||||
if(editingId){treatments.splice(treatments.findIndex(function(x){return x.id===editingId;}),1,obj);}
|
||||
else{treatments.push(obj);}
|
||||
closeDrawer('form');renderTable();
|
||||
showToast(editingId?'就诊记录已更新':'就诊记录已登记');
|
||||
}
|
||||
|
||||
/* ===== 详情抽屉 ===== */
|
||||
function openView(id){
|
||||
var t=treatments.find(function(x){return x.id===id;});
|
||||
document.getElementById('viewTitle').textContent='就诊详情 · '+t.user;
|
||||
function d(k,v,full){return '<div class="detail-item'+(full?' detail-item--full':'')+'"><div class="dk">'+k+'</div><div class="dv">'+(v||'—')+'</div></div>';}
|
||||
var rxHtml=t.rx.length?'<table class="mini-table"><thead><tr><th>药品名称</th><th>规格</th><th>数量</th><th>用法用量</th></tr></thead><tbody>'+t.rx.map(function(r){return '<tr><td>'+r.m+'</td><td>'+r.spec+'</td><td>'+r.num+'</td><td>'+r.dosage+'</td></tr>';}).join('')+'</tbody></table>':'<span style="color:var(--text-placeholder);font-size:var(--font-sm);">本次就诊未开药</span>';
|
||||
document.getElementById('viewBody').innerHTML=
|
||||
'<div class="form-section" style="margin-top:0;">就诊信息</div>'
|
||||
+'<div class="detail-grid">'+d('就诊人',t.user)+d('工号',t.code)+d('性别/年龄',t.sex+' / '+t.age+'岁')+d('身份证号',t.idcard)+d('联系电话',t.tel)+d('所属单位',t.uUnit)+d('所属部门',t.uDept)+d('就诊医疗点',t.point)+d('就诊医生',t.doctor)+d('就诊时间',t.time)+d('是否复诊',t.revisit)+d('体检报告','<button class="btn btn-link" onclick="showToast(\'体检报告在线预览(演示)\')">查看</button>')+'</div>'
|
||||
+'<div class="form-section">诊断信息</div>'
|
||||
+'<div class="detail-grid">'+d('主诉',t.main,true)+d('查体',t.inspect,true)+d('既往史',t.past)+d('现病史',t.present)+d('过敏史',t.allergy)+d('诊断疾病',t.disease,true)+'</div>'
|
||||
+'<div class="form-section">用药方案</div>'+rxHtml
|
||||
+'<div class="form-section">医嘱与生活建议</div>'
|
||||
+'<div class="detail-grid">'+d('医嘱',t.advice,true)+d('膳食处方',t.food)+d('运动处方',t.sport)+'</div>';
|
||||
document.getElementById('viewMask').classList.add('open');
|
||||
document.getElementById('viewDrawer').classList.add('open');
|
||||
}
|
||||
|
||||
/* ===== 选人弹窗 ===== */
|
||||
function openUserPick(){
|
||||
document.getElementById('userQ').value='';
|
||||
renderUserPick();
|
||||
document.getElementById('userMask').classList.add('open');
|
||||
}
|
||||
function renderUserPick(){
|
||||
var q=document.getElementById('userQ').value.trim();
|
||||
var list=userPool.filter(function(e){return !q||e.name.indexOf(q)!==-1||e.code.toLowerCase().indexOf(q.toLowerCase())!==-1;});
|
||||
document.getElementById('userBody').innerHTML=list.length?list.map(function(e){
|
||||
return '<tr><td><input type="radio" name="userSel" value="'+e.code+'"'+(curUser&&curUser.code===e.code?' checked':'')+'></td>'
|
||||
+'<td style="font-weight:600;">'+e.name+'</td><td>'+e.code+'</td><td>'+e.unit+'</td><td>'+e.dept+'</td></tr>';
|
||||
}).join(''):'<tr><td colspan="5" class="td-empty">未找到匹配员工</td></tr>';
|
||||
}
|
||||
function renderUserInfo(u){
|
||||
document.getElementById('fCode').value=u?u.code:'';
|
||||
document.getElementById('fSexAge').value=u?(u.sex+' / '+u.age+'岁'):'';
|
||||
document.getElementById('fIdcard').value=u?u.idcard:'';
|
||||
document.getElementById('fTel').value=u?u.tel:'';
|
||||
document.getElementById('fUUnit').value=u?u.unit:'';
|
||||
document.getElementById('fUDept').value=u?u.dept:'';
|
||||
}
|
||||
function confirmUser(){
|
||||
var r=document.querySelector('input[name="userSel"]:checked');
|
||||
if(!r){showToast('请选择一名员工');return;}
|
||||
curUser=userPool.find(function(x){return x.code===r.value;});
|
||||
document.getElementById('fUser').value=curUser.name;
|
||||
renderUserInfo(curUser);
|
||||
closeModal('userMask');
|
||||
}
|
||||
|
||||
/* ===== 删除 ===== */
|
||||
function askDelete(id){
|
||||
pendingDelId=id;delMode='single';
|
||||
var t=treatments.find(function(x){return x.id===id;});
|
||||
document.getElementById('delText').textContent='确认删除「'+t.user+'」于 '+t.time+' 的就诊记录?关联出库的药品不自动回补库存。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
}
|
||||
function confirmDelete(){
|
||||
if(delMode==='batch'){
|
||||
treatments=treatments.filter(function(t){return window._batchIds.indexOf(t.id)===-1;});
|
||||
showToast('已批量删除 '+window._batchIds.length+' 条记录');
|
||||
}else{
|
||||
treatments=treatments.filter(function(t){return t.id!==pendingDelId;});
|
||||
showToast('就诊记录已删除');
|
||||
}
|
||||
closeModal('delMask');renderTable();
|
||||
}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
function closeDrawer(k){
|
||||
document.getElementById(k+'Mask').classList.remove('open');
|
||||
document.getElementById(k+'Drawer').classList.remove('open');
|
||||
}
|
||||
function closeModal(id){document.getElementById(id).classList.remove('open');}
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2200);
|
||||
}
|
||||
|
||||
renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,10 +18,10 @@
|
||||
**涉及文件:**
|
||||
|
||||
- `config-partner-hospital.html` — 合作医院(新增设计:按决策仅维护扩展信息,主信息只读引用系统管理资源库;管辖范围抽屉+添加医疗点宽弹窗(归属互斥)、医院管理员抽屉(页内新增表单、两次密码一致校验、移除确认))
|
||||
- `config-allocate.html` — 员工分配(迁移 allocationManagement:已分配/未分配双 Tab 与动态表头、单位部门级联+姓名工号+医疗点级联筛选、单条/批量分配弹窗(单位→医疗点级联)、取消分配回落未分配、批量导入)
|
||||
- `config-allocate-stat.html` — 分配统计(迁移 allocationStatistics:7 列汇总,新增概览四卡随筛选实时计算;「已分配员工数量」下钻名册抽屉(单位/部门/姓名/性别/年龄/工号六列),名册与员工分配页数据一致)
|
||||
- `config-allocate.html` — 员工分配(迁移 allocationManagement:已分配/未分配双 Tab 与动态表头、单位部门级联+姓名员工编号+医疗点级联筛选、单条/批量分配弹窗(单位→医疗点级联)、取消分配回落未分配、批量导入)
|
||||
- `config-allocate-stat.html` — 分配统计(迁移 allocationStatistics:7 列汇总,新增概览四卡随筛选实时计算;「已分配员工数量」下钻名册抽屉(单位/部门/姓名/性别/年龄/员工编号六列),名册与员工分配页数据一致)
|
||||
- `config-ambulance.html` — 救护车配置(迁移 ambulance:单位→医疗点级联+救护类型筛选、新增/编辑抽屉六节表单(归属/车辆/覆盖/急救能力/驾驶员/证照照片,含覆盖人数正整数、开始服务年份≤当年、电话格式校验)、详情抽屉、批量删除、批量导入/下载模板/导出)
|
||||
- `config-ambulance-duty.html` — 救护车值班(迁移 ambulanceDataSchemasNew 出勤域:出勤类型含「一键呼叫」禁用态与系统生成记录不可编辑标记、选救护车自动带出司机与电话(只读)、随车医护 chips 多选、救助员工选人弹窗(姓名/工号过滤)、出勤日期区间筛选、编辑/删除、批量导入;与 Step 5 救护车统计不重复——本页为登记口径)
|
||||
- `config-ambulance-duty.html` — 救护车值班(迁移 ambulanceDataSchemasNew 出勤域:出勤类型含「一键呼叫」禁用态与系统生成记录不可编辑标记、选救护车自动带出司机与电话(只读)、随车医护 chips 多选、救助员工选人弹窗(姓名/员工编号过滤)、出勤日期区间筛选、编辑/删除、批量导入;与 Step 5 救护车统计不重复——本页为登记口径)
|
||||
- `D:\Work\platform-prototype\index.html` — 站点地图一线医疗条目追加 Step 2 五页(共 8 页)
|
||||
- `config-medical-point.html` / `config-medicine.html` / `config-medicine-stock.html` / `config-partner-hospital.html` / `config-allocate.html` — 侧边栏基础配置组统一为 8 项真实链接(新增救护车值班、回填 Step 1 占位项)
|
||||
|
||||
@@ -182,3 +182,19 @@
|
||||
- `web-admin/frontline-medical/stat-ambulance-table.html` — 救护车统计报表重做
|
||||
- `web-admin/frontline-medical/stat-rescue-table.html` — 删除
|
||||
- `D:\Work\platform-prototype\index.html` — 站点地图同步
|
||||
|
||||
## [2026-09-10] refactor: 员工/非员工就诊融合为日常诊疗管理
|
||||
|
||||
「日常诊疗」子分组(员工就诊/非员工就诊两页)融合为单菜单「日常诊疗管理」,页内顶部 Tab 切换维护。
|
||||
|
||||
- **菜单调整**:日常业务侧边栏移除「日常诊疗」子分组(员工就诊/非员工就诊),新增顶层二级菜单「日常诊疗管理」(指向 daily-treatment.html),45 个页面侧边栏与顶栏「日常业务」链接同步
|
||||
- **新增页面** `daily-treatment.html` — 日常诊疗管理:顶部「员工就诊/非员工就诊」双 Tab;员工就诊 Tab 保留选人弹窗、单位/部门级联筛选、员工编号/所属单位部门/体检报告列;非员工就诊 Tab 保留手工录入就诊人信息(证件/电话校验、与员工关系);两 Tab 各自独立保留筛选、批量删除、用药方案开药、详情抽屉与异步导出任务,公共基础数据(医疗点/医生/药品池)与提示组件单份共享
|
||||
- **删除页面**:`daily-treatment-staff.html`(员工就诊)、`daily-treatment-nonstaff.html`(非员工就诊)
|
||||
- **`D:\Work\platform-prototype\index.html`** — 站点地图两行合并为「日常业务 · 日常诊疗管理」一条
|
||||
|
||||
**涉及文件:**
|
||||
|
||||
- `web-admin/frontline-medical/daily-treatment.html` — 新增
|
||||
- `web-admin/frontline-medical/daily-treatment-staff.html` / `daily-treatment-nonstaff.html` — 删除
|
||||
- `web-admin/frontline-medical/` 其余 45 页 — 侧边栏菜单与顶栏链接同步
|
||||
- `D:\Work\platform-prototype\index.html` — 站点地图同步
|
||||
|
||||
@@ -100,7 +100,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -108,7 +108,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -82,7 +82,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -100,7 +100,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -138,7 +138,7 @@ tbody td:last-child:has(.more-wrap:hover){z-index:30;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -94,7 +94,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -71,7 +71,7 @@ td.ro{color:var(--text-placeholder);font-weight:400;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html">数据统计</a>
|
||||
<a href="hut-banner.html" class="active">健康小屋</a>
|
||||
|
||||
@@ -81,7 +81,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -118,6 +118,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
</div>
|
||||
</div>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
|
||||
@@ -88,7 +88,7 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -125,6 +125,7 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
|
||||
@@ -91,7 +91,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -128,6 +128,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
</div>
|
||||
</div>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
|
||||
@@ -40,6 +40,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
/* 工具栏:时间切换 + 导出操作 */
|
||||
.toolbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;}
|
||||
.action-bar{display:flex;justify-content:flex-end;margin-top:16px;}
|
||||
.date-switch{display:inline-flex;height:32px;line-height:32px;border:1px solid var(--primary);border-radius:var(--radius-sm);overflow:hidden;font-size:var(--font-sm);}
|
||||
.date-switch span{padding:0 16px;cursor:pointer;color:var(--primary);background:#fff;border-right:1px solid var(--primary);white-space:nowrap;}
|
||||
.date-switch span:last-child{border-right:none;}
|
||||
@@ -50,6 +51,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.filter-select{height:36px;min-width:140px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
.filter-date{height:36px;min-width:150px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;}
|
||||
.filter-date:focus{border-color:var(--primary);}
|
||||
.period-value{display:inline-block;height:36px;line-height:34px;padding:0 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--text-primary);background:#fff;white-space:nowrap;}
|
||||
.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;white-space:nowrap;}
|
||||
.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);}
|
||||
@@ -63,8 +65,12 @@ thead tr.grp th{background:#F0F5FF;color:var(--text-primary);border-right:1px so
|
||||
tbody td{padding:12px 14px;border-bottom:1px solid #F0F0F0;text-align:center;white-space:nowrap;font-size:var(--font-sm);}
|
||||
tbody tr:hover td{background:#F8FBFF;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);}
|
||||
.num-cur{color:var(--primary);font-weight:600;}
|
||||
.num-cur{color:var(--text-primary);}
|
||||
.num-total{color:var(--text-secondary);}
|
||||
th.sortable{cursor:pointer;user-select:none;}
|
||||
th.sortable:hover{color:var(--primary);}
|
||||
.sort-arrow{display:inline-block;margin-left:4px;font-size:10px;color:var(--primary);}
|
||||
.sort-arrow:empty{display:none;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
/* 导出记录弹窗 */
|
||||
@@ -87,7 +93,7 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -124,6 +130,7 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -150,19 +157,26 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
<option value="">全部单位</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item" id="dateSingle">
|
||||
<div class="filter-item" id="dateSingle" style="display:none;">
|
||||
<label>时间</label>
|
||||
<input type="date" class="filter-date" id="dateSingleInput" value="2026-09-07">
|
||||
<span class="period-value" id="periodSingle"></span>
|
||||
</div>
|
||||
<div class="filter-item" id="dateRange" style="display:none;">
|
||||
<div class="filter-item" id="dateRange">
|
||||
<label>时间</label>
|
||||
<input type="date" class="filter-date" id="dateStart" value="2026-09-01">
|
||||
<span class="period-value" id="periodRange"></span>
|
||||
</div>
|
||||
<div class="filter-item" id="datePicker" style="display:none;">
|
||||
<label>时间</label>
|
||||
<input type="date" class="filter-date" id="dateStart">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input type="date" class="filter-date" id="dateEnd" value="2026-09-07">
|
||||
<input type="date" class="filter-date" id="dateEnd">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 分组大表:就诊人次 / 慢病管理 / 培训宣教 / 体检报告解读 多级表头 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-primary" onclick="doExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 9V2M4.5 4.5L7 2l2.5 2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
</div>
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
@@ -172,35 +186,35 @@ tbody tr:hover td{background:#F8FBFF;}
|
||||
<th rowspan="3" style="min-width:180px;">医疗点名称</th>
|
||||
<th rowspan="3" style="min-width:100px;">建立时间</th>
|
||||
<th rowspan="3" style="min-width:150px;">合作医院</th>
|
||||
<th rowspan="3" style="min-width:80px;">医生人数</th>
|
||||
<th rowspan="3" style="min-width:80px;">护士人数</th>
|
||||
<th rowspan="3" style="min-width:130px;">已分配员工数量</th>
|
||||
<th rowspan="3" class="sortable" data-sort="doc" onclick="sortBy('doc')" style="min-width:80px;">医生人数<span class="sort-arrow"></span></th>
|
||||
<th rowspan="3" class="sortable" data-sort="nurse" onclick="sortBy('nurse')" style="min-width:80px;">护士人数<span class="sort-arrow"></span></th>
|
||||
<th rowspan="3" class="sortable" data-sort="rad" onclick="sortBy('rad')" style="min-width:130px;">已分配员工数量<span class="sort-arrow"></span></th>
|
||||
<th colspan="2">就诊人次</th>
|
||||
<th colspan="4">慢病管理</th>
|
||||
<th colspan="8">培训宣教</th>
|
||||
<th colspan="2">体检报告解读</th>
|
||||
</tr>
|
||||
<tr class="grp">
|
||||
<th rowspan="2"><span class="period-text">本周</span>就诊人次</th>
|
||||
<th rowspan="2">累计就诊人次</th>
|
||||
<th rowspan="2">慢病人数</th>
|
||||
<th rowspan="2">当前应服务人数</th>
|
||||
<th rowspan="2">当前已服务人数</th>
|
||||
<th rowspan="2">累计服务人数</th>
|
||||
<th rowspan="2" class="sortable" data-sort="visitW" onclick="sortBy('visitW')"><span class="period-text">本周</span>就诊人次<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="visitT" onclick="sortBy('visitT')">累计就诊人次<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="chrNum" onclick="sortBy('chrNum')">慢病人数<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="chrShould" onclick="sortBy('chrShould')">当前应服务人数<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="chrDone" onclick="sortBy('chrDone')">当前已服务人数<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="chrTotal" onclick="sortBy('chrTotal')">累计服务人数<span class="sort-arrow"></span></th>
|
||||
<th colspan="4">急救培训</th>
|
||||
<th colspan="4">健康宣教</th>
|
||||
<th rowspan="2">一对一</th>
|
||||
<th rowspan="2">群体</th>
|
||||
<th rowspan="2" class="sortable" data-sort="one" onclick="sortBy('one')">一对一<span class="sort-arrow"></span></th>
|
||||
<th rowspan="2" class="sortable" data-sort="group" onclick="sortBy('group')">群体<span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><span class="period-text">本周</span>场次</th>
|
||||
<th>累计场次</th>
|
||||
<th><span class="period-text">本周</span>人次</th>
|
||||
<th>累计人次</th>
|
||||
<th><span class="period-text">本周</span>场次</th>
|
||||
<th>累计场次</th>
|
||||
<th><span class="period-text">本周</span>人次</th>
|
||||
<th>累计人次</th>
|
||||
<th class="sortable" data-sort="trainSW" onclick="sortBy('trainSW')"><span class="period-text">本周</span>场次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="trainST" onclick="sortBy('trainST')">累计场次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="trainPW" onclick="sortBy('trainPW')"><span class="period-text">本周</span>人次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="trainPT" onclick="sortBy('trainPT')">累计人次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="eduSW" onclick="sortBy('eduSW')"><span class="period-text">本周</span>场次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="eduST" onclick="sortBy('eduST')">累计场次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="eduPW" onclick="sortBy('eduPW')"><span class="period-text">本周</span>人次<span class="sort-arrow"></span></th>
|
||||
<th class="sortable" data-sort="eduPT" onclick="sortBy('eduPT')">累计人次<span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tbody"></tbody>
|
||||
@@ -263,16 +277,50 @@ function scope(){
|
||||
var u=document.getElementById('selUnit').value;
|
||||
return u?points.filter(function(p){return p.unit===u;}):points;
|
||||
}
|
||||
/* 时间切换:更新分组表头前缀 + 时间控件形态 */
|
||||
/* 时间切换:更新分组表头前缀 + 时间显示 */
|
||||
function pad2(n){return ('0'+n).slice(-2);}
|
||||
function fmtDate(d){return d.getFullYear()+'-'+pad2(d.getMonth()+1)+'-'+pad2(d.getDate());}
|
||||
function weekRange(){
|
||||
var now=new Date();
|
||||
var off=now.getDay()===0?-6:1-now.getDay();
|
||||
var monday=new Date(now.getFullYear(),now.getMonth(),now.getDate()+off);
|
||||
var sunday=new Date(monday.getFullYear(),monday.getMonth(),monday.getDate()+6);
|
||||
return {start:fmtDate(monday),end:fmtDate(sunday)};
|
||||
}
|
||||
function switchDateType(type){
|
||||
dateType=type;
|
||||
document.querySelectorAll('#dateSwitch span').forEach(function(s){s.classList.toggle('on',s.dataset.type===type);});
|
||||
document.querySelectorAll('.period-text').forEach(function(e){e.textContent=PERIOD_TEXT[type];});
|
||||
document.getElementById('dateSingle').style.display=(type==='picker')?'none':'';
|
||||
document.getElementById('dateRange').style.display=(type==='picker')?'':'none';
|
||||
var now=new Date();
|
||||
var yr=now.getFullYear(),mon=pad2(now.getMonth()+1);
|
||||
if(type==='week'){
|
||||
var r=weekRange();
|
||||
document.getElementById('periodRange').textContent=r.start+' 至 '+r.end;
|
||||
}else if(type==='month'){
|
||||
document.getElementById('periodSingle').textContent=yr+'-'+mon;
|
||||
}else if(type==='year'){
|
||||
document.getElementById('periodSingle').textContent=String(yr);
|
||||
}else{
|
||||
var r2=weekRange();
|
||||
document.getElementById('dateStart').value=r2.start;
|
||||
document.getElementById('dateEnd').value=r2.end;
|
||||
}
|
||||
document.getElementById('dateSingle').style.display=(type==='month'||type==='year')?'':'none';
|
||||
document.getElementById('dateRange').style.display=(type==='week')?'':'none';
|
||||
document.getElementById('datePicker').style.display=(type==='picker')?'':'none';
|
||||
}
|
||||
var sortKey=null,sortDir=1;
|
||||
function sortBy(key){
|
||||
if(sortKey===key){sortDir=-sortDir;}else{sortKey=key;sortDir=1;}
|
||||
renderTable();
|
||||
document.querySelectorAll('th.sortable').forEach(function(th){
|
||||
var a=th.querySelector('.sort-arrow');
|
||||
if(a)a.textContent=(th.dataset.sort===sortKey)?(sortDir===1?'▲':'▼'):'';
|
||||
});
|
||||
}
|
||||
function renderTable(){
|
||||
var list=scope();
|
||||
if(sortKey){list=list.slice().sort(function(a,b){return (a[sortKey]-b[sortKey])*sortDir;});}
|
||||
document.getElementById('tbody').innerHTML=list.map(function(p){
|
||||
return '<tr>'
|
||||
+'<td>'+esc(p.unit)+'</td>'
|
||||
@@ -305,6 +353,7 @@ function showToast(msg){
|
||||
document.getElementById('selUnit').innerHTML='<option value="">全部单位</option>'+us.map(function(u){return '<option>'+esc(u)+'</option>';}).join('');
|
||||
})();
|
||||
document.getElementById('exportMask').addEventListener('click',function(e){if(e.target===this)closeExportLog();});
|
||||
switchDateType('week');
|
||||
renderTable();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -85,7 +85,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-visit-data.html">档案</a>
|
||||
<a href="config-medical-point.html">基础配置</a>
|
||||
<a href="daily-treatment-staff.html">日常业务</a>
|
||||
<a href="daily-treatment.html">日常业务</a>
|
||||
<a href="bed-device.html">床头呼叫</a>
|
||||
<a href="stat-clinic-chart.html" class="active">数据统计</a>
|
||||
<a href="hut-banner.html">健康小屋</a>
|
||||
@@ -122,6 +122,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
</div>
|
||||
</div>
|
||||
<a href="stat-rescue-chart.html" class="sidebar-item active">救助物品统计</a>
|
||||
<a href="config-allocate-stat.html" class="sidebar-item">员工分配统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
|
||||
Reference in New Issue
Block a user