feat: 健康体检原型完善(新增大病人员信息/指标异常通知/已选项目员工信息页面,员工病种信息勾选病种数弹窗查看并精简操作栏,单位预约人数统计弹窗按年龄段性别重做,员工预约跟踪/已参检员工信息操作栏精简并新增勾选列,病种信息管理菜单更名,医院基础信息与必检项目配置页多处调整,首页站点地图与侧边栏同步)

This commit is contained in:
liuyunqin
2026-09-02 17:42:32 +08:00
parent 3ae6cd855a
commit 0d1c770ee9
52 changed files with 2022 additions and 463 deletions
+7 -4
View File
@@ -208,7 +208,7 @@ const SITE_MAP = [
{ file:'pre-item-unit-fee.html', label:'单位体检项目费用' },
{ file:'pre-item-combo-template.html', label:'体检项目组合模板' },
{ file:'pre-item-exception.html', label:'组合模板例外配置' },
{ file:'pre-item-required.html', label:'必检/选检项目配置' },
{ file:'pre-item-required.html', label:'单位体检项目审核' },
{ file:'pre-special-cancer.html', label:'防癌筛查人员' },
{ file:'pre-special-occupation.html', label:'职业体检人员' },
{ file:'pre-special-gastro.html', label:'胃肠镜人员配置' },
@@ -217,8 +217,9 @@ const SITE_MAP = [
{ file:'pre-special-cta.html', label:'冠脉CTA体检人员' },
{ file:'pre-special-hospital.html', label:'指定员工体检医院' },
{ file:'mid-appointment-track.html', label:'员工预约跟踪' },
{ file:'mid-unit-appointment.html', label:'单位预约统计' },
{ file:'mid-selected-items.html', label:'已选项目员工信息' },
{ file:'mid-participation.html', label:'员工参检情况' },
{ file:'mid-unit-appointment.html', label:'单位预约人数统计' },
{ file:'mid-hospital-realtime.html', label:'医院实时预约人数' },
{ file:'mid-doctor-realtime.html', label:'医生实时检查情况' },
{ file:'mid-hospital-appointment.html', label:'医院预约人数统计' },
@@ -236,11 +237,13 @@ const SITE_MAP = [
{ file:'post-key-indicator-stat.html', label:'重点指标异常统计' },
{ file:'post-gastro-stat.html', label:'胃肠镜体检统计' },
{ file:'post-report-employee.html', label:'常规体检报告' },
{ file:'post-illness-personnel.html', label:'大病人员信息' },
{ file:'post-indicator-notify.html', label:'指标异常通知' },
{ file:'post-report-gastro.html', label:'胃肠镜体检报告' },
{ file:'post-report-unmatched.html', label:'体检报告未匹配项目' },
{ file:'post-disease-info.html', label:'病种信息' },
{ file:'post-disease-info.html', label:'病种信息配置' },
{ file:'post-conclusion-disease.html', label:'体检结论关联病种' },
{ file:'post-auto-select-disease.html', label:'自动勾选病种' },
{ file:'post-auto-select-disease.html', label:'员工病种信息' },
{ file:'exception-dirty.html', label:'系统脏数据' },
{ file:'exception-result.html', label:'结果异常' }
]},
@@ -41,6 +41,13 @@
.sidebar-subgroup.open>.sidebar-subgroup__body{display:block;}
.sidebar-subgroup__body .sidebar-item{padding-left:36px;font-size:12px;}
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
/* 顶部体检类型 TAB */
.type-tabs{display:flex;gap:0;margin-bottom:20px;border-bottom:2px solid var(--border);background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
.type-tab{padding:14px 32px;font-size:var(--font-base);color:var(--text-secondary);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-2px;transition:all .2s;font-weight:500;}
.type-tab:hover{color:var(--primary);}
.type-tab.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
.tab-pane{display:none;}
.tab-pane.active{display:block;}
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
.filter-item{display:flex;align-items:center;gap:8px;}
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
@@ -90,10 +97,14 @@
.form-label .required{color:var(--danger);}
.form-input{width:100%;height:40px;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;}
.form-input:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
/* 体检类型复选 */
.check-group{display:flex;gap:24px;flex-wrap:wrap;}
.check-item{display:flex;align-items:center;gap:8px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;user-select:none;}
.check-item input[type="checkbox"]{width:16px;height:16px;cursor:pointer;accent-color:var(--primary);}
.form-textarea{width:100%;min-height:84px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;resize:vertical;font-family:inherit;line-height:1.6;}
.form-textarea:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
.form-select{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 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;appearance:none;cursor:pointer;}
.form-select:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.2);}
/* 单选按钮 */
.radio-group{display:flex;gap:24px;flex-wrap:wrap;}
.radio-item{display:flex;align-items:center;gap:8px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;user-select:none;}
.radio-item input[type="radio"]{width:16px;height:16px;cursor:pointer;accent-color:var(--primary);}
/* 开关 */
.switch-row{display:flex;align-items:center;gap:12px;}
.switch{width:40px;height:22px;border-radius:11px;background:#E8E8E8;cursor:pointer;position:relative;transition:.2s;flex-shrink:0;}
@@ -184,54 +195,88 @@
<!-- 主内容 -->
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>医院名称</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:180px;">
</div>
<div class="filter-item">
<label>体检类型</label>
<select class="filter-select" style="min-width:140px;">
<option value="">全部</option>
<option>常规体检</option>
<option>胃肠镜体检</option>
</select>
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
<!-- 顶部体检类型 TAB -->
<div class="type-tabs">
<div class="type-tab active" onclick="switchType('normal')">常规体检</div>
<div class="type-tab" onclick="switchType('gastro')">胃肠镜体检</div>
</div>
<!-- 操作按钮 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openDrawer()">+ 新增</button>
<button class="btn btn-default">导出列表数据</button>
<!-- 常规体检 -->
<div class="tab-pane active" id="pane-normal">
<div class="filter-bar">
<div class="filter-item">
<label>医院名称</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:180px;">
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
</div>
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openDrawer()">+ 新增</button>
<button class="btn btn-default">导出列表数据</button>
</div>
<div class="table-card">
<div class="table-card__header">
<div class="table-card__title">常规体检医院信息</div>
</div>
<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>
</tr>
</thead>
<tbody id="normal-tbody">
<tr><td>1</td><td>泾河医院</td><td>普通医院</td><td>西安市高陵区西安泾河开发区CQ西路20号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>西安宝石花CQ医院(高陵)</td><td></td><td>1</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
<tr><td>2</td><td>庆阳医院</td><td>指定医院</td><td>甘肃省庆阳市西峰区岐黄大道18号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>庆阳市人民医院体检中心</td><td></td><td>2</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
<span>显示 10 条,共 240 条</span>
<button class="page-btn active">1</button>
<span>每页</span>
<select class="filter-select" style="min-width:70px;height:32px;"><option>10条</option><option>20条</option><option>50条</option></select>
</div>
</div>
</div>
<!-- 数据表格 -->
<div class="table-card">
<div class="table-card__header">
<div class="table-card__title">医院信息配置</div>
<!-- 胃肠镜体检 -->
<div class="tab-pane" id="pane-gastro">
<div class="filter-bar">
<div class="filter-item">
<label>医院名称</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:180px;">
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
</div>
<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>
</tr>
</thead>
<tbody id="hospital-tbody">
<tr><td>1</td><td>泾河医院</td><td><span class="tag tag-blue" style="margin-right:6px;">常规体检</span><span class="tag tag-green">胃肠镜体检</span></td><td>西安市高陵区西安泾河开发区CQ西路20号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>西安宝石花CQ医院(高陵)</td><td></td><td>1</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
<tr><td>2</td><td>庆阳医院</td><td><span class="tag tag-blue">常规体检</span></td><td>甘肃省庆阳市西峰区岐黄大道18号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>庆阳市人民医院体检中心</td><td></td><td>2</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
<tr><td>3</td><td>长安胃肠镜医院</td><td><span class="tag tag-green">胃肠镜体检</span></td><td>西安市雁塔区科技路66号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>西安长安胃肠镜专科医院</td><td></td><td>3</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
</tbody>
</table>
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openDrawer()">+ 新增</button>
<button class="btn btn-default">导出列表数据</button>
</div>
<div class="pagination">
<span>显示 10 条,共 243 条</span>
<button class="page-btn active">1</button>
<span>每页</span>
<select class="filter-select" style="min-width:70px;height:32px;"><option>10条</option><option>20条</option><option>50条</option></select>
<div class="table-card">
<div class="table-card__header">
<div class="table-card__title">胃肠镜体检医院信息</div>
</div>
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th><th>医院名称</th><th>医院地址</th><th>医院图片</th><th>医院简介</th><th>是否需要就诊卡号</th><th>排序序号</th><th>操作</th>
</tr>
</thead>
<tbody id="gastro-tbody">
<tr><td>1</td><td>长安胃肠镜医院</td><td>西安市雁塔区科技路66号</td><td><img class="hospital-img" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='48' viewBox='0 0 72 48'%3E%3Crect width='72' height='48' fill='%231890ff'/%3E%3Crect x='18' y='14' width='36' height='26' rx='2' fill='%23ffffff'/%3E%3Cpath d='M32 20h8v6h6v8h-6v6h-8v-6h-6v-8h6z' fill='%231890ff'/%3E%3C/svg%3E" alt="医院图片"></td><td>西安长安胃肠镜专科医院</td><td></td><td>1</td><td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
<span>显示 10 条,共 3 条</span>
<button class="page-btn active">1</button>
<span>每页</span>
<select class="filter-select" style="min-width:70px;height:32px;"><option>10条</option><option>20条</option><option>50条</option></select>
</div>
</div>
</div>
</main>
@@ -240,7 +285,7 @@
<div class="drawer-overlay" id="drawer-overlay" onclick="closeDrawer()"></div>
<div class="drawer" id="hospital-drawer">
<div class="drawer__header">
<div class="drawer__title">新增医院</div>
<div class="drawer__title" id="drawer-title">新增医院</div>
<button class="drawer__close" onclick="closeDrawer()"></button>
</div>
<div class="drawer__body">
@@ -258,22 +303,49 @@
<span class="hospital-info__value" id="hospital-address"></span>
</div>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检类型</div>
<div class="check-group">
<label class="check-item"><input type="checkbox" name="checkup-type" value="normal"> 常规体检</label>
<label class="check-item"><input type="checkbox" name="checkup-type" value="gastro"> 胃肠镜体检</label>
<!-- 常规体检字段 -->
<div id="normal-fields">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 医院类型</div>
<div class="radio-group">
<label class="radio-item"><input type="radio" name="hos-type" value="普通医院"> 普通医院</label>
<label class="radio-item"><input type="radio" name="hos-type" value="指定医院"> 指定医院</label>
</div>
</div>
<div class="form-item">
<div class="form-label">开启职业体检</div>
<div class="switch-row">
<div class="switch" id="switch-oc" onclick="this.classList.toggle('on')"></div>
<span class="switch-label">是否开启职业体检</span>
</div>
</div>
<div class="form-item">
<div class="form-label">排序序号</div>
<input class="form-input" id="form-sort-normal" type="number" placeholder="数字越小越靠前">
</div>
</div>
<div class="form-item">
<div class="form-label">排序序号</div>
<input class="form-input" id="form-sort" type="number" placeholder="数字越小越靠前">
</div>
<div class="form-item">
<div class="form-label">开启职业体检</div>
<div class="switch-row">
<div class="switch" id="switch-oc" onclick="this.classList.toggle('on')"></div>
<span class="switch-label">是否开启职业体检</span>
<!-- 胃肠镜体检字段 -->
<div id="gastro-fields" style="display:none;">
<div class="form-item">
<div class="form-label">胃肠镜注意事项</div>
<textarea class="form-textarea" id="form-gastro-notice" placeholder="请输入胃肠镜体检注意事项"></textarea>
</div>
<div class="form-item">
<div class="form-label">是否需要就诊卡号</div>
<div class="switch-row">
<div class="switch" id="switch-card" onclick="toggleCardSwitch(this)"></div>
<span class="switch-label">是否需要就诊卡号</span>
</div>
</div>
<div class="form-item" id="card-reg-item" style="display:none;">
<div class="form-label">就诊卡号注册说明</div>
<textarea class="form-textarea" id="form-card-reg" placeholder="请输入就诊卡号注册说明"></textarea>
</div>
<div class="form-item">
<div class="form-label">排序序号</div>
<input class="form-input" id="form-sort-gastro" type="number" placeholder="数字越小越靠前">
</div>
</div>
</div>
@@ -296,6 +368,16 @@ function toggleSubgroup(header){
if(sub)sub.classList.add('open');
})();
/* ===== 顶部体检类型 TAB ===== */
var currentType = 'normal';
function switchType(type){
currentType = type;
document.querySelectorAll('.type-tab').forEach(function(t){ t.classList.remove('active'); });
document.querySelectorAll('.tab-pane').forEach(function(p){ p.classList.remove('active'); });
document.querySelector('.type-tab[onclick="switchType(\'' + type + '\')"]').classList.add('active');
document.getElementById('pane-' + type).classList.add('active');
}
/* ===== 新增医院抽屉 ===== */
var hospitalData = {
'h1': { name: '西安市中心医院', address: '西安市新城区西五路161号', intro: '西安市中心医院体检中心' },
@@ -306,14 +388,23 @@ var hospitalData = {
};
function openDrawer(){
var isNormal = currentType === 'normal';
document.getElementById('drawer-title').textContent = isNormal ? '新增常规体检医院' : '新增胃肠镜体检医院';
document.getElementById('normal-fields').style.display = isNormal ? '' : 'none';
document.getElementById('gastro-fields').style.display = isNormal ? 'none' : '';
document.getElementById('hospital-drawer').classList.add('open');
document.getElementById('drawer-overlay').classList.add('open');
document.getElementById('search-input').value = '';
document.getElementById('search-value').value = '';
document.getElementById('hospital-info').classList.remove('show');
document.getElementById('form-sort').value = '';
document.querySelectorAll('#hospital-drawer input[name="checkup-type"]').forEach(function(cb){ cb.checked = false; });
document.getElementById('form-sort-normal').value = '';
document.getElementById('form-sort-gastro').value = '';
document.querySelectorAll('input[name="hos-type"]').forEach(function(r){ r.checked = false; });
document.getElementById('switch-oc').classList.remove('on');
document.getElementById('switch-card').classList.remove('on');
document.getElementById('card-reg-item').style.display = 'none';
document.getElementById('form-gastro-notice').value = '';
document.getElementById('form-card-reg').value = '';
}
function closeDrawer(){
@@ -321,6 +412,12 @@ function closeDrawer(){
document.getElementById('drawer-overlay').classList.remove('open');
}
function toggleCardSwitch(el){
el.classList.toggle('on');
var on = el.classList.contains('on');
document.getElementById('card-reg-item').style.display = on ? '' : 'none';
}
function onHospitalChange(){
var value = document.getElementById('search-value').value;
var info = document.getElementById('hospital-info');
@@ -389,36 +486,43 @@ function onHospitalChange(){
function saveHospital(){
var value = document.getElementById('search-value').value;
if(!value || !hospitalData[value]){ alert('请选择医院'); return; }
var types = [];
document.querySelectorAll('#hospital-drawer input[name="checkup-type"]:checked').forEach(function(cb){ types.push(cb.value); });
if(types.length === 0){ alert('请选择体检类型'); return; }
var sort = document.getElementById('form-sort').value.trim();
if(!sort){ sort = String(document.querySelectorAll('#hospital-tbody tr').length + 1); }
var oc = document.getElementById('switch-oc').classList.contains('on');
var data = hospitalData[value];
var typeHtml = types.map(function(t, i){
var label = t === 'gastro' ? '胃肠镜体检' : '常规体检';
var cls = t === 'gastro' ? 'tag-green' : 'tag-blue';
return '<span class="tag ' + cls + '"' + (i < types.length - 1 ? ' style="margin-right:6px;"' : '') + '>' + label + '</span>';
}).join('');
var tbody = document.getElementById('hospital-tbody');
var img = tbody.querySelector('.hospital-img');
var imgSrc = img ? img.getAttribute('src') : '';
var isNormal = currentType === 'normal';
var tbody = document.getElementById(isNormal ? 'normal-tbody' : 'gastro-tbody');
var seq = tbody.querySelectorAll('tr').length + 1;
var imgSrc = (document.querySelector('.hospital-img') || {}).getAttribute ? document.querySelector('.hospital-img').getAttribute('src') : '';
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + seq + '</td>'
+ '<td>' + data.name + '</td>'
+ '<td>' + typeHtml + '</td>'
+ '<td>' + data.address + '</td>'
+ '<td><img class="hospital-img" src="' + imgSrc + '" alt="医院图片"></td>'
+ '<td>' + data.intro + '</td>'
+ '<td>' + (oc ? '是' : '否') + '</td>'
+ '<td>' + sort + '</td>'
+ '<td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td>';
tbody.appendChild(tr);
if(isNormal){
var hosTypeEl = document.querySelector('input[name="hos-type"]:checked');
if(!hosTypeEl){ alert('请选择医院类型'); return; }
var hosType = hosTypeEl.value;
var sort = document.getElementById('form-sort-normal').value.trim() || String(seq);
var oc = document.getElementById('switch-oc').classList.contains('on');
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + seq + '</td>'
+ '<td>' + data.name + '</td>'
+ '<td>' + hosType + '</td>'
+ '<td>' + data.address + '</td>'
+ '<td><img class="hospital-img" src="' + imgSrc + '" alt="医院图片"></td>'
+ '<td>' + data.intro + '</td>'
+ '<td>' + (oc ? '是' : '否') + '</td>'
+ '<td>' + sort + '</td>'
+ '<td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td>';
tbody.appendChild(tr);
} else {
var needCard = document.getElementById('switch-card').classList.contains('on');
var sortG = document.getElementById('form-sort-gastro').value.trim() || String(seq);
var tr2 = document.createElement('tr');
tr2.innerHTML = '<td>' + seq + '</td>'
+ '<td>' + data.name + '</td>'
+ '<td>' + data.address + '</td>'
+ '<td><img class="hospital-img" src="' + imgSrc + '" alt="医院图片"></td>'
+ '<td>' + data.intro + '</td>'
+ '<td>' + (needCard ? '是' : '否') + '</td>'
+ '<td>' + sortG + '</td>'
+ '<td><span class="link">编辑</span> <span class="link" style="margin-left:8px;">删除</span></td>';
tbody.appendChild(tr2);
}
closeDrawer();
}
</script>
@@ -263,12 +263,12 @@
<tr class="tree-child" data-parent="1">
<td style="padding-left:48px;">身高</td>
<td>YB001-01</td>
<td><span class="link" onclick="openCategoryModal(this,'child')">添加下级</span> <span class="link" style="margin-left:8px;" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
<td><span class="link" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
</tr>
<tr class="tree-child" data-parent="1">
<td style="padding-left:48px;">体重</td>
<td>YB001-02</td>
<td><span class="link" onclick="openCategoryModal(this,'child')">添加下级</span> <span class="link" style="margin-left:8px;" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
<td><span class="link" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
</tr>
<tr data-id="2">
<td><span class="tree-toggle" onclick="toggleTree(this,'2')">+</span>实验室检查</td>
@@ -278,7 +278,7 @@
<tr class="tree-child" data-parent="2">
<td style="padding-left:48px;">血常规</td>
<td>SYS002-01</td>
<td><span class="link" onclick="openCategoryModal(this,'child')">添加下级</span> <span class="link" style="margin-left:8px;" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
<td><span class="link" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
</tr>
<tr data-id="3">
<td><span class="tree-toggle" onclick="toggleTree(this,'3')">+</span>影像检查</td>
@@ -288,7 +288,7 @@
<tr class="tree-child" data-parent="3">
<td style="padding-left:48px;">胸部X光</td>
<td>YX003-01</td>
<td><span class="link" onclick="openCategoryModal(this,'child')">添加下级</span> <span class="link" style="margin-left:8px;" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
<td><span class="link" onclick="openDeptModal(this)">关联科室</span> <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">关联疾病</span> <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,'edit')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div></td>
</tr>
</tbody>
</table>
@@ -464,7 +464,11 @@ function actionCellHTML(tr){
var diseases = (tr.dataset.diseases || '').split('|').filter(Boolean);
var deptLabel = '关联科室' + (depts.length ? '(' + depts.length + ')' : '');
var diseaseLabel = '关联疾病' + (diseases.length ? '(' + diseases.length + ')' : '');
return '<span class="link" onclick="openCategoryModal(this,\'child\')">添加下级</span>'
/* 分类最多二级:二级分类不显示“添加下级” */
var childBtn = tr.dataset.id
? '<span class="link" onclick="openCategoryModal(this,\'child\')">添加下级</span>'
: '';
return childBtn
+ ' <span class="link" style="margin-left:8px;" onclick="openDeptModal(this)">' + deptLabel + '</span>'
+ ' <span class="link" style="margin-left:8px;" onclick="openDiseaseModal(this)">' + diseaseLabel + '</span>'
+ ' <div class="dropdown" style="display:inline-block;margin-left:8px;"><button class="dropdown__trigger" onclick="toggleDropdown(this)">更多 <svg width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="currentColor"/></svg></button><div class="dropdown__menu"><button class="dropdown__item" onclick="openCategoryModal(this,\'edit\')">编辑</button><button class="dropdown__item" onclick="deleteCategory(this)">删除</button></div></div>';
@@ -82,6 +82,7 @@
.modal__close:hover{background:#F5F5F5;}
.modal__body{flex:1;overflow-y:auto;padding:24px;}
.modal__footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid var(--border);flex-shrink:0;}
.modal--wide{width:720px;}
/* 表单 */
.form-item{margin-bottom:16px;}
.form-item:last-child{margin-bottom:0;}
@@ -183,8 +184,9 @@
<!-- 操作按钮 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openHospitalItemModal()">+ 新增</button>
<button class="btn btn-default">同步医院体检项目</button>
<button class="btn btn-danger">批量删除</button>
<button class="btn btn-default" onclick="syncHospitalItems()">同步医院体检项目</button>
<button class="btn btn-default" onclick="openSyncTaskModal()">查看同步任务</button>
</div>
<!-- 数据表格 -->
@@ -247,6 +249,29 @@
</div>
</div>
<!-- 同步任务记录弹窗 -->
<div class="modal-overlay" id="sync-task-modal" onclick="if(event.target===this)closeSyncTaskModal()">
<div class="modal modal--wide">
<div class="modal__header">
<div class="modal__title">同步任务记录</div>
<button class="modal__close" onclick="closeSyncTaskModal()"></button>
</div>
<div class="modal__body">
<table>
<thead>
<tr>
<th>触发时间</th><th>同步人</th><th>状态</th>
</tr>
</thead>
<tbody id="sync-task-tbody"></tbody>
</table>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeSyncTaskModal()">关闭</button>
</div>
</div>
</div>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
@@ -297,6 +322,57 @@ function todayStr(){
var d = new Date();
return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');
}
/* ===== 同步医院体检项目 & 同步任务记录 ===== */
var syncTasks = [
{ time: '2026-08-28 09:12:30', user: '系统管理员', status: 'success' },
{ time: '2026-08-20 14:05:12', user: '系统管理员', status: 'success' }
];
function nowTimeStr(){
var d = new Date();
var p = function(n){ return String(n).padStart(2, '0'); };
return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate())
+ ' ' + p(d.getHours()) + ':' + p(d.getMinutes()) + ':' + p(d.getSeconds());
}
function syncStatusTag(status){
if(status === 'running') return '<span class="tag tag-blue">同步中</span>';
if(status === 'failed') return '<span class="tag tag-red">失败</span>';
return '<span class="tag tag-green">成功</span>';
}
function renderSyncTasks(){
var tbody = document.getElementById('sync-task-tbody');
if(!tbody) return;
if(!syncTasks.length){
tbody.innerHTML = '<tr><td colspan="3" style="text-align:center;color:var(--text-placeholder);">暂无同步任务</td></tr>';
return;
}
tbody.innerHTML = syncTasks.map(function(t){
return '<tr><td>' + t.time + '</td><td>' + t.user + '</td><td>' + syncStatusTag(t.status) + '</td></tr>';
}).join('');
}
function syncHospitalItems(){
if(!confirm('是否从医院同步增量体检项目?')) return;
var task = { time: nowTimeStr(), user: '系统管理员', status: 'running' };
syncTasks.unshift(task);
renderSyncTasks();
/* 模拟异步同步:2 秒后完成 */
setTimeout(function(){
task.status = 'success';
renderSyncTasks();
}, 2000);
}
function openSyncTaskModal(){
renderSyncTasks();
document.getElementById('sync-task-modal').classList.add('open');
}
function closeSyncTaskModal(){
document.getElementById('sync-task-modal').classList.remove('open');
}
</script>
</body>
</html>
+19
View File
@@ -1,5 +1,17 @@
# 健康体检模块 CHANGELOG
## [Unreleased] 2026-09-02
### Changed
- 检后"病种信息管理"分组菜单更名:`post-disease-info.html`"病种信息"改为"病种信息配置"`post-auto-select-disease.html`"自动勾选病种"改为"员工病种信息"(文件名不变),17 个检后页面侧边栏、两页浏览器标题及首页站点地图同步更新;页面内操作按钮与文案(如"自动勾选病种"按钮、病种详情弹窗)不受影响
- `post-auto-select-disease.html`(员工病种信息):列表"勾选病种数"改为蓝色链接,点击弹窗查看该员工勾选的具体病种(序号/病种名称/病种类别,复用记录弹窗样式,病种名取自与"病种信息配置"一致的词库、按行确定性生成且与勾选项数一致)
- `post-auto-select-disease.html`(员工病种信息):操作栏移除"自动筛选异常项""查看自动筛选记录"两个按钮,并清理关联 JSrunAutoFilter、filterRecords 数据、记录弹窗 filter 分支与标题项),操作栏仅保留自动勾选病种/查看自动勾选记录/导出员工病种/查看病种导出记录
- `post-unit-count.html`:体检医院 Tab"查看分类统计"弹窗按参考图重做——表头改为"序号/分类/体检额度/人数"(原"年龄分类/体检额度/人数",额度不再带"元"后缀),分类改为三个年龄段×性别共 6 类:35岁以下(女/男)额度1000、35岁至44岁(女/男)额度1500、45岁及以上(女/男)额度2500,合计行仅人数列有值;"已选项目人数"列数据与参考图一致(合计 1396),其余各人数列沿用同一分类与额度、人数按列合计取整分布;弹窗标题由"年龄分类统计"改为"分类统计"
### Added
- `post-illness-personnel.html`:新增"大病人员信息"页面(检后/常规体检分组,位于常规体检报告之下、体检报告未匹配项目之上)。参考线上 `/medical/physicalExamination/illness` 页面:筛选条件含姓名、身份证号、体检日期、单位、部门、医院选择;操作栏含导出列表数据、查看导出任务,表格右上角列设置图标;列表列为勾选、姓名、单位、部门、医院名称、身份证号、手机号(明文不脱敏)、体检日期、大病分类、是否开启消息通知、是否已发送短信、操作(编辑/删除/发送短信),其中"是否开启消息通知"为行内 switch 开关(逐行开启/关闭,替代原先的批量开启/关闭消息通知按钮),发送短信改为行内操作,"是否已发送短信"以是/否标签展示,共 5 条模拟数据与分页。检后各页面侧边栏"常规体检"分组及首页站点地图同步新增入口
- `post-indicator-notify.html`:新增"指标异常通知"页面(检后/常规体检分组,位于大病人员信息之下)。筛选条件:姓名、身份证号、手机号(文本输入),APP已通知、APP通知已读、短信已通知(是/否/全部下拉);操作栏:导出列表数据、查看导出任务、批量导入员工、查看导入任务,表格右上角列设置图标;列表列:序号、姓名、身份证号、手机号、重大异常描述、APP已通知、APP通知时间、APP通知已读、APP通知已读时间、短信已通知、短信通知时间、操作(删除),通知/已读状态以是/否标签展示、未通知时间以"—"占位,共 5 条模拟数据与分页。检后各页面侧边栏"常规体检"分组及首页站点地图同步新增入口
## [Unreleased] 2026-09-01
### Changed
@@ -7,7 +19,14 @@
- 检后侧边栏改为二级目录:新增"常规体检"分组(下辖常规体检报告、体检报告未匹配项目、"体检统计汇总"分组(原"常规体检统计"分组更名并移至体检报告未匹配项目之下)、"病种信息管理"分组)与"胃肠镜体检"分组(胃肠镜体检报告、胃肠镜体检统计);原"体检报告信息"分组取消,其中常规体检报告与体检报告未匹配项目并入"常规体检"、胃肠镜体检报告并入"胃肠镜体检",胃肠镜体检统计由平铺入口并入"胃肠镜体检"分组,15 个检后页面同步调整,页面加载时自动展开当前页所在各级分组
- `mid-gastro-appointment-track.html`:新增"员工预约跟踪(胃肠镜)"页面(检中/胃肠镜体检分组,位于胃肠镜问卷信息之上)。由原"员工预约跟踪"页面的胃肠镜 Tab 形态拆分而来:列不含婚姻状况/体检类型/防癌项/预约信息/体检实际费用(含费用子表头),操作栏无"同步医院体检预约信息",支持批量置为已体检/未体检与行内编辑体检状态(弹窗仅可选已体检/未体检),详情弹窗同步精简;检中各页面侧边栏"胃肠镜体检"分组及首页站点地图同步新增入口
- `mid-appointment-track.html`:移除顶部"常规体检/胃肠镜体检"Tab 栏及胃肠镜形态相关交互(列隐藏切换、批量置为按钮、编辑链接与编辑弹窗),页面仅保留常规体检内容
- `mid-appointment-track.html`:操作栏精简为仅"导出列表数据""查看导出任务""同步医院体检预约信息"三个按钮(曾新增的置为已体检/置为未体检/取消预约/导出项目数据/导出预约数据已移除,"导出列表数据"由主按钮改为默认样式),表格勾选列保留
- `mid-appointment-track.html`:按线上"体检预约信息"页(userFormList)对齐——列表新增年龄区间/体检编码/用工形式/是否上市员工四列,"婚姻状况"改"婚姻状态"、"预约信息"改"体检预约信息",去掉"序号"列,列顺序重排为姓名→性别→年龄→年龄区间→身份证号→单位→部门→机构分类→员工编号→体检编码→用工形式→婚姻状态→体检类型→防癌项→是否上市员工→体检医院→体检预约信息→体检总费用→体检实际费用(四子列)→预约状态→预约日期→体检状态→体检日期→体检年度→体检计划→操作;筛选栏拆分为单位部门(合并线上的单位/部门两项)/机构分类并新增是否上市员工/性别/年龄区间/防癌项,"体检医院"改"医院选择",未采用线上的部门/预约日期/是否为未选项目三项;年龄区间选项定为"35岁以下/35至44岁/45岁及以上",列表年龄区间列与详情弹窗示例值同步;体检状态去掉"已出报告"选项;机构分类选项改为"子公司/三产公司"(表格与详情示例值同步);详情弹窗同步新增四字段并更新取数列索引
- `mid-unit-appointment.html`:移除顶部"常规体检/胃肠镜体检"Tab 栏(panel-normal/panel-gastro 双面板结构、切换 JS 及相关样式),页面仅保留常规体检内容
- `mid-unit-appointment.html`:菜单"单位预约统计"更名为"单位预约人数统计",并在检中侧边栏"常规体检"分组中移至"已参检员工信息"之下(10 个检中页面侧边栏同步),页面标题与首页站点地图同步更新;胃肠镜分组"单位预约统计"不受影响
- `mid-participation.html`:操作栏移除"增加防癌项目S9""增加防癌项目724""清除手动添加的防癌项目""增加已婚体检项""清除已婚体检项""同步手动增加项目"六个按钮,仅保留录入大病信息/导出项目状态/导出体检指引单/查看导出任务;列表首列新增勾选框(表头全选联动各行)
### Added
- `mid-selected-items.html`:新增"已选项目员工信息"页面(检中/常规体检分组,位于员工预约跟踪与已参检员工信息之间,10 个检中页面侧边栏与首页站点地图同步新增入口)。筛选栏与列表对齐线上"已选项目人员"页(selectedProject):筛选含姓名/员工编号/身份证号/预约状态/预约日期/系统体检状态/体检日期/单位/部门/医院选择/体检年份/体检编码/前置机构体检状态;列表 16 列(勾选、姓名、单位、部门、体检编码、手机号码、医院名称、员工编号、身份证号、体检预约信息、预约状态、预约日期、系统体检状态、前置机预约状态、体检日期、操作〔详情/删除〕);操作栏复制自员工预约跟踪页(置为已体检/置为未体检作用于勾选行的系统体检状态列,取消预约更新预约状态列,另含导出列表数据/导出项目数据/导出预约数据/查看导出任务/同步医院体检预约信息);详情弹窗交互复制自已参检员工信息页(员工体检表信息/已体检项目/未体检项目三 Tab,行内置为已检/未检/弃检,Tab 内批量置为与表头全选);基本信息卡片与列表字段一致(姓名/单位/部门/体检编码/手机号码/医院名称/员工编号/身份证号/体检预约信息/预约状态/预约日期/系统体检状态/前置机预约状态/体检日期,示例值取自列表首行)
- `mid-gastro-unit-appointment.html`:新增"单位预约统计(胃肠镜)"页面(检中/胃肠镜体检分组,位于员工预约跟踪(胃肠镜)之后)。由原"单位预约统计"页面的胃肠镜 Tab 面板拆分而来:表头"已选项目人数"改为"填写问卷人数"(数据 5000→3600),其余筛选栏、二级单位/三级单位子 Tab、操作栏与分页一致;检中各页面侧边栏"胃肠镜体检"分组及首页站点地图同步新增入口
- `mid-participation.html`:移除顶部"常规体检/胃肠镜体检"Tab 栏(双面板结构、切换 JS 及相关样式)与胃肠镜详情弹窗,页面仅保留常规体检内容
- `mid-gastro-participation.html`:新增"已参检员工信息(胃肠镜)"页面(检中/胃肠镜体检分组,位于单位预约统计(胃肠镜)之后)。由原"已参检员工信息"页面的胃肠镜 Tab 面板拆分而来:筛选栏无"医院体检状态"、体检医院选项含长安胃肠镜医院;操作栏仅保留录入大病信息/导出项目状态/导出体检指引单/查看导出任务/同步手动增加项目(无防癌项目与已婚体检项按钮);列表 14 列(无体检编号/医院体检状态列,共 86 条分页);详情为胃肠镜专属弹窗(基本信息含检查类型"无痛胃肠镜",单页签胃镜/肠镜两项目)。检中各页面侧边栏"胃肠镜体检"分组及首页站点地图同步新增入口
@@ -149,8 +149,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item active">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -174,46 +175,76 @@
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>体检年度:</label>
<select class="filter-select">
<option>请选择</option><option selected>2026</option><option>2025</option><option>2024</option>
</select>
</div>
<div class="filter-item">
<label>单位部门:</label>
<select class="filter-select">
<option>请选择</option><option>公司机关</option><option>第一采油厂</option><option>第二采油厂</option><option>第三采油厂</option>
</select>
</div>
<div class="filter-item">
<label>姓名:</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:130px;min-width:unset;">
<input class="filter-input" type="text" placeholder="请输入姓名" style="width:130px;min-width:unset;">
</div>
<div class="filter-item">
<label>身份证号:</label>
<input class="filter-input" type="text" placeholder="请输入身份证号" style="width:180px;min-width:unset;">
</div>
<div class="filter-item">
<label>员工编号:</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:140px;min-width:unset;">
</div>
<div class="filter-item">
<label>身份证号</label>
<input class="filter-input" type="text" placeholder="请输入" style="width:180px;min-width:unset;">
<label>单位部门</label>
<select class="filter-select">
<option>请选择单位部门</option><option>公司机关</option><option>第一采油厂</option><option>第二采油厂</option><option>第三采油厂</option>
</select>
</div>
<div class="filter-item">
<label>机构分类:</label>
<select class="filter-select">
<option>请选择机构分类</option><option>子公司</option><option>三产公司</option>
</select>
</div>
<div class="filter-item">
<label>是否上市员工:</label>
<select class="filter-select">
<option>请选择</option><option></option><option></option>
</select>
</div>
<div class="filter-item">
<label>性别:</label>
<select class="filter-select">
<option>请选择性别</option><option></option><option></option>
</select>
</div>
<div class="filter-item">
<label>年龄区间:</label>
<select class="filter-select">
<option>请选择年龄区间</option><option>35岁以下</option><option>35至44岁</option><option>45岁及以上</option>
</select>
</div>
<div class="filter-item">
<label>防癌项:</label>
<select class="filter-select">
<option>请选择防癌项</option><option>Septin9</option><option>CA724</option><option>两项都有</option>
</select>
</div>
<div class="filter-item">
<label>预约状态:</label>
<select class="filter-select">
<option>请选择</option><option>未预约</option><option>已预约</option><option>已取消预约</option>
<option>请选择预约状态</option><option>未预约</option><option>已预约</option><option>已取消预约</option>
</select>
</div>
<div class="filter-item">
<label>体检状态:</label>
<select class="filter-select">
<option>请选择</option><option>未体检</option><option>体检中</option><option>已体检</option><option>已出报告</option>
<option>请选择体检状态</option><option>未体检</option><option>体检中</option><option>已体检</option>
</select>
</div>
<div class="filter-item">
<label>体检医院:</label>
<label>医院选择</label>
<select class="filter-select">
<option>请选择</option><option>延安医院</option><option>泾河医院</option><option>市中心医院</option>
<option>请选择医院</option><option>延安医院</option><option>泾河医院</option><option>市中心医院</option>
</select>
</div>
<div class="filter-item">
<label>体检年度:</label>
<select class="filter-select">
<option>请选择</option><option selected>2026</option><option>2025</option><option>2024</option>
</select>
</div>
<button class="btn btn-primary">
@@ -225,8 +256,8 @@
<!-- 操作栏 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary">
<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="#fff" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出列表数据
</button>
<button class="btn btn-default">
@@ -248,7 +279,7 @@
<table>
<thead>
<tr>
<th rowspan="2" style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></th><th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">身份证号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">机构分类</th><th rowspan="2">婚姻状况</th><th rowspan="2">体检类型</th><th rowspan="2">防癌项</th><th rowspan="2">预约状态</th><th rowspan="2">预约信息</th><th rowspan="2">预约日期</th><th rowspan="2">体检状态</th><th rowspan="2">体检医院</th><th rowspan="2">体检日期</th><th rowspan="2">体检总费用</th><th colspan="4" style="text-align:center;">体检实际费用</th><th rowspan="2">体检年度</th><th rowspan="2">体检计划</th><th rowspan="2">操作</th>
<th rowspan="2" style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></th><th rowspan="2">姓名</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">年龄区间</th><th rowspan="2">身份证号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">机构分类</th><th rowspan="2">员工编号</th><th rowspan="2">体检编码</th><th rowspan="2">用工形式</th><th rowspan="2">婚姻状态</th><th rowspan="2">体检类型</th><th rowspan="2">防癌项</th><th rowspan="2">是否上市员工</th><th rowspan="2">体检医院</th><th rowspan="2">体检预约信息</th><th rowspan="2">体检总费用</th><th colspan="4" style="text-align:center;">体检实际费用</th><th rowspan="2">预约状态</th><th rowspan="2">预约日期</th><th rowspan="2">体检状态</th><th rowspan="2">体检日期</th><th rowspan="2">体检年度</th><th rowspan="2">体检计划</th><th rowspan="2">操作</th>
</tr>
<tr>
<th>必检费用</th><th>选检费用</th><th>妇科费用</th><th>防癌筛查费用</th>
@@ -256,29 +287,29 @@
</thead>
<tbody>
<tr>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>1</td><td>王旭</td><td>342423</td><td></td><td>41</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>一类机构</td><td>已婚</td><td>已婚体检</td><td>-</td><td><span class="tag tag-green">已预约</span></td><td>成功预约并更新项目</td><td>2026-03-10</td><td><span class="tag tag-green">已出报告</span></td><td>延安医院</td><td>2026-03-12</td><td class="fee-total">¥2,380.00</td>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>王旭</td><td></td><td>41</td><td>35至44岁</td><td>430626198502560029</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>342423</td><td>80038237</td><td>正式合同工</td><td>已婚</td><td>婚体检</td><td>-</td><td></td><td>延安医院</td><td>已成功预约并更新项目</td><td class="fee-total">¥2,380.00</td>
<td class="fee-sub">¥1,200.00</td><td class="fee-sub">¥680.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
<td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
<td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-12</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
</tr>
<tr>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>2</td><td>张武</td><td>324321</td><td></td><td>38</td><td>430626198806120037</td><td>公司机关</td><td>办公室</td><td>一类机构</td><td>已婚</td><td>已婚体检</td><td>Septin9</td><td><span class="tag tag-green">已预约</span></td><td>体检预约成功</td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>延安医院</td><td>2026-03-11</td><td class="fee-total">¥1,860.00</td>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>张武</td><td></td><td>38</td><td>35至44岁</td><td>430626198806120037</td><td>公司机关</td><td>办公室</td><td>子公司</td><td>324321</td><td>80037100</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>Septin9</td><td></td><td>延安医院</td><td>体检预约成功</td><td class="fee-total">¥1,860.00</td>
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥260.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
<td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
<td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-blue">已体检</span></td><td>2026-03-11</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
</tr>
<tr>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>3</td><td>李明</td><td>456789</td><td></td><td>36</td><td>610402199003150045</td><td>第一采油厂</td><td>生产一队</td><td>二类机构</td><td>未婚</td><td>未婚体检</td><td>-</td><td><span class="tag tag-green">已预约</span></td><td>体检预约成功</td><td>2026-03-15</td><td><span class="tag tag-blue">体检中</span></td><td>泾河医院</td><td>2026-03-16</td><td class="fee-total">¥1,560.00</td>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>李明</td><td></td><td>36</td><td>35至44岁</td><td>610402199003150045</td><td>第一采油厂</td><td>生产一队</td><td>三产公司</td><td>456789</td><td>80036211</td><td>劳务派遣</td><td>未婚</td><td>未婚体检</td><td>-</td><td></td><td>泾河医院</td><td>体检预约成功</td><td class="fee-total">¥1,560.00</td>
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥460.00</td><td class="fee-sub">-</td><td class="fee-sub">-</td>
<td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
<td><span class="tag tag-green">已预约</span></td><td>2026-03-15</td><td><span class="tag tag-blue">体检中</span></td><td>2026-03-16</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
</tr>
<tr>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>4</td><td>赵芳</td><td>512336</td><td></td><td>45</td><td>610402198109230028</td><td>第二采油厂</td><td>地质研究所</td><td>一类机构</td><td>已婚</td><td>已婚体检</td><td>两项都有</td><td><span class="tag tag-orange">未预约</span></td><td>-</td><td>-</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>-</td><td class="fee-total">¥1,920.00</td>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>赵芳</td><td></td><td>45</td><td>45岁及以上</td><td>610402198109230028</td><td>第二采油厂</td><td>地质研究所</td><td>子公司</td><td>512336</td><td>80035102</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>两项都有</td><td></td><td>-</td><td>-</td><td class="fee-total">¥1,920.00</td>
<td class="fee-sub">¥1,100.00</td><td class="fee-sub">¥320.00</td><td class="fee-sub">¥350.00</td><td class="fee-sub">¥150.00</td>
<td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
<td><span class="tag tag-orange">未预约</span></td><td>-</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度职工常规体检</td><td><span class="link">详情</span></td>
</tr>
<tr>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>5</td><td>陈强</td><td>601178</td><td></td><td>52</td><td>610402197407080011</td><td>第三采油厂</td><td>集输大队</td><td>类机构</td><td>已婚</td><td>已婚体检</td><td>CA724</td><td><span class="tag tag-red">已取消预约</span></td><td>-</td><td>2026-03-08</td><td><span class="tag tag-orange">未体检</span></td><td>市中心医院</td><td>-</td><td class="fee-total">¥2,380.00</td>
<td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>陈强</td><td></td><td>52</td><td>45岁及以上</td><td>610402197407080011</td><td>第三采油厂</td><td>集输大队</td><td>产公司</td><td>601178</td><td>80034065</td><td>正式合同工</td><td>已婚</td><td>已婚体检</td><td>CA724</td><td></td><td>市中心医院</td><td>已取消预约</td><td class="fee-total">¥2,380.00</td>
<td class="fee-sub">¥1,200.00</td><td class="fee-sub">¥680.00</td><td class="fee-sub">-</td><td class="fee-sub">¥500.00</td>
<td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
<td><span class="tag tag-red">已取消预约</span></td><td>2026-03-08</td><td><span class="tag tag-orange">未体检</span></td><td>-</td><td>2026</td><td>2026年度胃肠镜专项体检</td><td><span class="link">详情</span></td>
</tr>
</tbody>
</table>
@@ -312,22 +343,26 @@
<div class="detail-item"><label>员工编号:</label><span data-f="empNo">342423</span></div>
<div class="detail-item"><label>性别:</label><span data-f="gender"></span></div>
<div class="detail-item"><label>年龄:</label><span data-f="age">41</span></div>
<div class="detail-item"><label>年龄区间:</label><span data-f="ageRange">35至44岁</span></div>
<div class="detail-item detail-item--full"><label>身份证号:</label><span data-f="idNo">430626198502560029</span></div>
<div class="detail-item"><label>单位:</label><span data-f="unit">公司机关</span></div>
<div class="detail-item"><label>部门:</label><span data-f="dept">办公室</span></div>
<div class="detail-item"><label>机构分类:</label><span data-f="orgType">一类机构</span></div>
<div class="detail-item"><label>婚姻状况</label><span data-f="marriage">已婚</span></div>
<div class="detail-item"><label>机构分类:</label><span data-f="orgType">子公司</span></div>
<div class="detail-item"><label>体检编码</label><span data-f="examCode">80038237</span></div>
<div class="detail-item"><label>用工形式:</label><span data-f="empType">正式合同工</span></div>
<div class="detail-item"><label>婚姻状态:</label><span data-f="marriage">已婚</span></div>
<div class="detail-item"><label>体检类型:</label><span data-f="examType">已婚体检</span></div>
<div class="detail-item"><label>防癌项:</label><span data-f="cancer">-</span></div>
<div class="detail-item"><label>是否上市员工:</label><span data-f="listed"></span></div>
</div>
</div>
<div class="detail-section">
<div class="detail-section__title">预约与体检信息</div>
<div class="detail-grid">
<div class="detail-item"><label>预约状态:</label><span><span class="tag tag-green" data-f="bookTag">已预约</span></span></div>
<div class="detail-item"><label>预约信息:</label><span data-f="bookInfo">已成功预约并更新项目</span></div>
<div class="detail-item"><label>体检预约信息:</label><span data-f="bookInfo">已成功预约并更新项目</span></div>
<div class="detail-item"><label>预约日期:</label><span data-f="bookDate">2026-03-10</span></div>
<div class="detail-item"><label>体检状态:</label><span><span class="tag tag-green" data-f="examTag">出报告</span></span></div>
<div class="detail-item"><label>体检状态:</label><span><span class="tag tag-blue" data-f="examTag">体检</span></span></div>
<div class="detail-item"><label>体检医院:</label><span data-f="hospital">延安医院</span></div>
<div class="detail-item"><label>体检日期:</label><span data-f="examDate">2026-03-12</span></div>
<div class="detail-item"><label>体检年度:</label><span data-f="year">2026</span></div>
@@ -379,7 +414,7 @@
}
})();
/* 详情弹窗:点击"详情"用该行数据填充并打开 */
var TAG_CLASS={'未预约':'tag-orange','已预约':'tag-green','已取消预约':'tag-red','未体检':'tag-orange','体检中':'tag-blue','已体检':'tag-blue','已出报告':'tag-green'};
var TAG_CLASS={'未预约':'tag-orange','已预约':'tag-green','已取消预约':'tag-red','未体检':'tag-orange','体检中':'tag-blue','已体检':'tag-blue'};
function openModal(id){document.getElementById(id).classList.add('open');}
function closeModal(id){document.getElementById(id).classList.remove('open');}
document.querySelectorAll('[data-close]').forEach(function(btn){
@@ -397,13 +432,15 @@ document.querySelectorAll('tbody .link:not(.edit-link)').forEach(function(link){
var txt=function(i){var td=tds[i];if(!td)return '-';var s=td.querySelector('.tag');return s?s.textContent.trim():(td.textContent.trim()||'-');};
var tag=function(el,cls,text){el.className='tag '+cls;el.textContent=text;};
var set=function(f,v){var el=document.querySelector('[data-f="'+f+'"]');if(el)el.textContent=v;};
set('name',txt(2));set('empNo',txt(3));set('gender',txt(4));set('age',txt(5));set('idNo',txt(6));
set('unit',txt(7));set('dept',txt(8));set('orgType',txt(9));set('marriage',txt(10));
set('examType',txt(11));set('cancer',txt(12));
var bookStatus=txt(13);set('bookInfo',txt(14));set('bookDate',txt(15));
var examStatus=txt(16);set('hospital',txt(17));set('examDate',txt(18));set('feeTotal',txt(19));
set('fee1',txt(20));set('fee2',txt(21));set('fee3',txt(22));set('fee4',txt(23));
set('year',txt(24));set('plan',txt(25));
set('name',txt(1));set('empNo',txt(9));set('gender',txt(2));set('age',txt(3));set('ageRange',txt(4));set('idNo',txt(5));
set('unit',txt(6));set('dept',txt(7));set('orgType',txt(8));set('examCode',txt(10));
set('empType',txt(11));set('marriage',txt(12));
set('examType',txt(13));set('cancer',txt(14));set('listed',txt(15));
set('hospital',txt(16));set('bookInfo',txt(17));set('feeTotal',txt(18));
set('fee1',txt(19));set('fee2',txt(20));set('fee3',txt(21));set('fee4',txt(22));
var bookStatus=txt(23);set('bookDate',txt(24));
var examStatus=txt(25);set('examDate',txt(26));
set('year',txt(27));set('plan',txt(28));
var bt=document.querySelector('[data-f="bookTag"]');
if(bt)tag(bt,TAG_CLASS[bookStatus]||'tag-blue',bookStatus);
var et=document.querySelector('[data-f="examTag"]');
@@ -116,8 +116,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item active">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -147,8 +147,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -121,8 +121,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -116,8 +116,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -116,8 +116,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item active">医院预约人数统计</a>
@@ -120,8 +120,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item active">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
+11 -11
View File
@@ -139,8 +139,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item active">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -197,7 +198,7 @@
<div class="filter-item">
<label>医院体检状态:</label>
<select class="filter-select">
<option>请选择</option><option>未预约</option><option>已预约</option><option>已报到</option><option>体检中</option><option>已初审</option><option>已终审</option>
<option>请选择</option><option>未预约</option><option>已预约</option><option>体检中</option><option>已终审</option>
</select>
</div>
<div class="filter-item">
@@ -231,12 +232,6 @@
<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>
<button class="btn btn-success">增加防癌项目S9</button>
<button class="btn btn-success">增加防癌项目724</button>
<button class="btn btn-danger">清除手动添加的防癌项目</button>
<button class="btn btn-primary">增加已婚体检项</button>
<button class="btn btn-danger">清除已婚体检项</button>
<button class="btn btn-default">同步手动增加项目</button>
</div>
<!-- 数据表格 -->
@@ -248,12 +243,12 @@
<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 style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></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>
<tr><td>1</td><td>公司机关</td><td>办公室</td><td>王旭</td><td>342423</td><td>430626198502560029</td><td>80038237</td><td>已体检</td><td>已终审</td><td>延安医院</td><td>2025</td><td>2025年度常规体检</td><td>2025-07-10</td><td>2025-07-22</td><td>12/20</td><td><span class="link" onclick="openDetailModal()">详情</span></td></tr>
<tr><td>2</td><td>公司机关</td><td>办公室</td><td>张武</td><td>324321</td><td>430626198502560029</td><td>80037100</td><td>已体检</td><td>已终审</td><td>延安医院</td><td>2025</td><td>2025年度常规体检</td><td>2025-07-10</td><td>2025-07-22</td><td>12/20</td><td><span class="link" onclick="openDetailModal()">详情</span></td></tr>
<tr><td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>1</td><td>公司机关</td><td>办公室</td><td>王旭</td><td>342423</td><td>430626198502560029</td><td>80038237</td><td>已体检</td><td>已终审</td><td>延安医院</td><td>2025</td><td>2025年度常规体检</td><td>2025-07-10</td><td>2025-07-22</td><td>12/20</td><td><span class="link" onclick="openDetailModal()">详情</span></td></tr>
<tr><td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>2</td><td>公司机关</td><td>办公室</td><td>张武</td><td>324321</td><td>430626198502560029</td><td>80037100</td><td>已体检</td><td>已终审</td><td>延安医院</td><td>2025</td><td>2025年度常规体检</td><td>2025-07-10</td><td>2025-07-22</td><td>12/20</td><td><span class="link" onclick="openDetailModal()">详情</span></td></tr>
</tbody>
</table>
</div>
@@ -388,6 +383,11 @@ document.getElementById('detailModal').addEventListener('click',function(e){
function toggleAllCheck(cb){
cb.closest('table').querySelectorAll('tbody input[type=checkbox]').forEach(function(c){c.checked=cb.checked;});
}
/* 列表全选/取消全选 */
document.getElementById('checkAll').addEventListener('change',function(){
var checked=this.checked;
document.querySelectorAll('.row-checkbox').forEach(function(cb){cb.checked=checked;});
});
</script>
</body>
</html>
@@ -0,0 +1,465 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 已选项目员工信息 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
:root{
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;--font-xl:20px;--font-xxl:24px;
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.12);
}
/* 顶部导航 */
.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:240px;flex-shrink:0;}
.top-bar__logo svg{width:28px;height:28px;}
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
.top-bar__right .btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
.top-bar__right .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;}
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
.top-bar__nav a.active{color:#fff;background:var(--primary);}
/* 侧边栏 */
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;text-transform:uppercase;letter-spacing:.5px;}
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 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:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;user-select:none;}
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);background:rgba(255,255,255,0.04);}
.sidebar-subgroup__header .arrow{width:10px;height:10px;transition:transform .2s;flex-shrink:0;}
.sidebar-subgroup__header .arrow path{stroke:rgba(255,255,255,0.45);}
.sidebar-subgroup.open>.sidebar-subgroup__header{color:rgba(255,255,255,0.85);}
.sidebar-subgroup.open>.sidebar-subgroup__header .arrow{transform:rotate(90deg);}
.sidebar-subgroup__body{display:none;padding-left:16px;}
.sidebar-subgroup.open>.sidebar-subgroup__body{display:block;}
.sidebar-subgroup__body .sidebar-item{padding-left:36px;font-size:12px;}
/* 主内容 */
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
/* 筛选栏 */
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
.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-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;background:#fff;min-width:200px;}
.filter-input:focus{border-color:var(--primary);}
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 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 10px center;appearance:none;cursor:pointer;min-width:120px;}
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
.btn-danger{background:#fff;color:var(--danger);border:1px solid var(--danger);}.btn-danger:hover{background:#fff1f0;}
/* 表格 */
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
.table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
.table-card__title{font-size:var(--font-base);font-weight:600;}
.table-card__actions{display:flex;gap:8px;align-items:center;}
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
.table-card__content table{min-width:100%;white-space:nowrap;}
table{width:100%;border-collapse:collapse;}
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
.tag-blue{background:var(--primary-light);color:var(--primary);}
.tag-green{background:#F6FFED;color:var(--success);}
.tag-orange{background:#FFF7E6;color:var(--warning);}
.tag-red{background:#FFF1F0;color:var(--danger);}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);}.link:hover{color:#40a9ff;}
/* 分页 */
.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{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;transition:all .2s;}
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
/* 详情弹窗 */
.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:200;align-items:flex-start;justify-content:center;overflow-y:auto;padding:40px 0;}
.modal-mask.open{display:flex;}
.modal{background:#fff;border-radius:var(--radius-lg);width:1080px;max-width:calc(100vw - 48px);box-shadow:var(--shadow-md);display:flex;flex-direction:column;max-height:calc(100vh - 80px);}
.modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
.modal__title{font-size:var(--font-lg);font-weight:600;}
.modal__close{width:32px;height:32px;border:none;background:transparent;cursor:pointer;color:var(--text-secondary);font-size:18px;border-radius:var(--radius-sm);}
.modal__close:hover{background:#F5F5F5;color:var(--text-primary);}
.modal__body{padding:24px;overflow-y:auto;}
/* 基本信息卡片 */
.info-card{background:#FAFCFF;border:1px solid var(--border);border-radius:var(--radius-md);padding:20px 24px;display:grid;grid-template-columns:repeat(4,1fr);gap:16px 24px;margin-bottom:20px;}
.info-item{display:flex;flex-direction:column;gap:4px;}
.info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.info-item__value{font-size:var(--font-sm);color:var(--text-primary);font-weight:500;}
/* 弹窗内 Tab */
.modal-tabs{display:flex;gap:24px;border-bottom:1px solid var(--border);margin-bottom:16px;}
.modal-tab{padding:10px 4px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border-bottom:2px solid transparent;user-select:none;transition:all .2s;}
.modal-tab:hover{color:var(--primary);}
.modal-tab.active{color:var(--primary);font-weight:600;border-bottom-color:var(--primary);}
.modal-panel{display:none;}
.modal-panel.active{display:block;}
.modal-panel__actions{display:flex;gap:12px;margin-bottom:16px;}
.btn-success{background:var(--success);color:#fff;}.btn-success:hover{background:#73d13d;}
</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="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg>
健康体检
</div>
<nav class="top-bar__nav">
<a href="archive-personal.html">档案</a>
<a href="config-material-notice.html">基础配置</a>
<a href="pre-hospital-scope.html">检前</a>
<a href="mid-appointment-track.html" class="active">检中</a>
<a href="post-unit-count.html">检后</a>
<a href="exception-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">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
常规体检
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-selected-items.html" class="sidebar-item active">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
<a href="mid-unit-expected.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 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
胃肠镜体检
</div>
<div class="sidebar-subgroup__body">
<a href="mid-gastro-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-gastro-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-gastro-questionnaire.html" class="sidebar-item">胃肠镜问卷信息</a>
</div>
</div>
</aside>
<!-- 主内容 -->
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>姓名:</label>
<input class="filter-input" type="text" placeholder="请输入姓名" style="width:130px;min-width:unset;">
</div>
<div class="filter-item">
<label>员工编号:</label>
<input class="filter-input" type="text" placeholder="请输入员工编号" style="width:140px;min-width:unset;">
</div>
<div class="filter-item">
<label>身份证号:</label>
<input class="filter-input" type="text" placeholder="请输入身份证号" style="width:180px;min-width:unset;">
</div>
<div class="filter-item">
<label>预约状态:</label>
<select class="filter-select">
<option>请选择预约状态</option><option>未预约</option><option>已预约</option><option>已取消预约</option>
</select>
</div>
<div class="filter-item">
<label>预约日期:</label>
<input class="filter-input" type="date" style="width:150px;min-width:unset;">
</div>
<div class="filter-item">
<label>系统体检状态:</label>
<select class="filter-select">
<option>请选择系统体检状态</option><option>未体检</option><option>体检中</option><option>已体检</option>
</select>
</div>
<div class="filter-item">
<label>体检日期:</label>
<input class="filter-input" type="date" style="width:150px;min-width:unset;">
</div>
<div class="filter-item">
<label>单位:</label>
<select class="filter-select">
<option>请选择单位</option><option>公司机关</option><option>第一采油厂</option><option>第二采油厂</option><option>第三采油厂</option>
</select>
</div>
<div class="filter-item">
<label>部门:</label>
<select class="filter-select">
<option>请选择部门</option><option>办公室</option><option>发展计划部</option><option>企管法规部</option><option>地质研究所</option>
</select>
</div>
<div class="filter-item">
<label>医院选择:</label>
<select class="filter-select">
<option>请选择医院</option><option>延安医院</option><option>泾河医院</option><option>兴隆园医院</option><option>市中心医院</option>
</select>
</div>
<div class="filter-item">
<label>体检年份:</label>
<select class="filter-select" style="min-width:100px;">
<option>2026</option><option>2025</option><option>2024</option><option>2023</option>
</select>
</div>
<div class="filter-item">
<label>体检编码:</label>
<input class="filter-input" type="text" placeholder="请输入体检编码" style="width:150px;min-width:unset;">
</div>
<div class="filter-item">
<label>前置机构体检状态:</label>
<select class="filter-select">
<option>请选择前置机构体检状态</option><option>未体检</option><option>体检中</option><option>已体检</option>
</select>
</div>
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4" stroke="currentColor" stroke-width="1.4"/><path d="M10 10l2.5 2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
查询
</button>
<button class="btn btn-default">重置</button>
</div>
<!-- 操作栏 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" id="btnBatchDone">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7.5L5.5 11L12 3.5" stroke="#fff" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
置为已体检
</button>
<button class="btn btn-default" id="btnBatchUndone">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="5.5" stroke="currentColor" stroke-width="1.4"/></svg>
置为未体检
</button>
<button class="btn btn-default" id="btnBatchCancel">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="5.5" stroke="currentColor" stroke-width="1.4"/><path d="M4.8 4.8l4.4 4.4M9.2 4.8l-4.4 4.4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
取消预约
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出列表数据
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出项目数据
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出预约数据
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><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>
<button class="btn btn-default" id="btnSync">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1v8M4 6l3 3 3-3" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M2 11v2h10v-2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
同步医院体检预约信息
</button>
</div>
<!-- 数据表格 -->
<div class="table-card">
<div class="table-card__header">
<div class="table-card__title">已选项目员工信息列表</div>
</div>
<div class="table-card__content">
<table>
<thead>
<tr>
<th style="min-width:36px;"><input type="checkbox" id="checkAll" title="全选"></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>
<tr><td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>王旭</td><td>公司机关</td><td>办公室</td><td>TJ00687345</td><td>18811391195</td><td>兴隆园医院</td><td>342423</td><td>430626198502560029</td><td>预约成功</td><td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-orange">未体检</span></td><td><span class="tag tag-green">已预约</span></td><td>2026-03-12</td><td><span class="link" onclick="openDetailModal()">详情</span> <span class="link" style="color:var(--danger);">删除</span></td></tr>
<tr><td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>张武</td><td>公司机关</td><td>政策研究室</td><td>TJ00687264</td><td>15121908360</td><td>兴隆园医院</td><td>324321</td><td>430626198806120037</td><td>预约成功</td><td><span class="tag tag-green">已预约</span></td><td>2026-03-10</td><td><span class="tag tag-orange">未体检</span></td><td><span class="tag tag-green">已预约</span></td><td>2026-03-11</td><td><span class="link" onclick="openDetailModal()">详情</span> <span class="link" style="color:var(--danger);">删除</span></td></tr>
<tr><td class="row-check"><input type="checkbox" class="row-checkbox"></td><td>赵芳</td><td>第二采油厂</td><td>地质研究所</td><td>TJ00687302</td><td>13744705644</td><td>泾河医院</td><td>512336</td><td>610402198109230028</td><td>-</td><td><span class="tag tag-orange">未预约</span></td><td>-</td><td><span class="tag tag-orange">未体检</span></td><td><span class="tag tag-orange">未预约</span></td><td>-</td><td><span class="link" onclick="openDetailModal()">详情</span> <span class="link" style="color:var(--danger);">删除</span></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
<span>共 186 条</span>
<span>显示 10 条</span>
<button class="page-btn"></button>
<button class="page-btn active">1</button>
<button class="page-btn">2</button>
<button class="page-btn">3</button>
<span>...</span>
<button class="page-btn">37</button>
<button class="page-btn"></button>
</div>
</div>
</main>
<!-- 详情弹窗 -->
<div class="modal-mask" id="detailModal">
<div class="modal">
<div class="modal__header">
<div class="modal__title">已选项目员工详情</div>
<button class="modal__close" onclick="closeDetailModal()"></button>
</div>
<div class="modal__body">
<!-- 基本信息:与列表字段保持一致 -->
<div class="info-card">
<div class="info-item"><div class="info-item__label">姓名</div><div class="info-item__value">王旭</div></div>
<div class="info-item"><div class="info-item__label">单位</div><div class="info-item__value">公司机关</div></div>
<div class="info-item"><div class="info-item__label">部门</div><div class="info-item__value">办公室</div></div>
<div class="info-item"><div class="info-item__label">体检编码</div><div class="info-item__value">TJ00687345</div></div>
<div class="info-item"><div class="info-item__label">手机号码</div><div class="info-item__value">18811391195</div></div>
<div class="info-item"><div class="info-item__label">医院名称</div><div class="info-item__value">兴隆园医院</div></div>
<div class="info-item"><div class="info-item__label">员工编号</div><div class="info-item__value">342423</div></div>
<div class="info-item"><div class="info-item__label">身份证号</div><div class="info-item__value">430626198502560029</div></div>
<div class="info-item"><div class="info-item__label">体检预约信息</div><div class="info-item__value">预约成功</div></div>
<div class="info-item"><div class="info-item__label">预约状态</div><div class="info-item__value">已预约</div></div>
<div class="info-item"><div class="info-item__label">预约日期</div><div class="info-item__value">2026-03-10</div></div>
<div class="info-item"><div class="info-item__label">系统体检状态</div><div class="info-item__value">未体检</div></div>
<div class="info-item"><div class="info-item__label">前置机预约状态</div><div class="info-item__value">已预约</div></div>
<div class="info-item"><div class="info-item__label">体检日期</div><div class="info-item__value">2026-03-12</div></div>
</div>
<!-- 弹窗内 Tab -->
<div class="modal-tabs">
<!-- [交互] Tab切换:员工体检表信息 / 已体检项目 / 未体检项目 -->
<div class="modal-tab active" onclick="switchModalTab(this,'mpanel-form')">员工体检表信息</div>
<div class="modal-tab" onclick="switchModalTab(this,'mpanel-done')">已体检项目</div>
<div class="modal-tab" onclick="switchModalTab(this,'mpanel-todo')">未体检项目</div>
</div>
<!-- 员工体检表信息 -->
<div id="mpanel-form" class="modal-panel active">
<table>
<thead>
<tr>
<th>体检项编号</th><th>项目名称</th><th>项目费用(元)</th><th>检查状态</th><th>检查时间</th><th>检查医生</th><th>操作</th>
</tr>
</thead>
<tbody>
<tr><td>10023</td><td>血常规</td><td>25.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 08:35</td><td>李医生</td><td><span class="link">置为未检</span></td></tr>
<tr><td>10024</td><td>尿常规</td><td>20.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 09:10</td><td>李医生</td><td><span class="link">置为未检</span></td></tr>
<tr><td>10031</td><td>胸部正位DR</td><td>120.00</td><td><span class="tag tag-orange">未检</span></td><td>-</td><td>-</td><td><span class="link">置为已检</span> <span class="link" style="color:var(--danger);">置为弃检</span></td></tr>
<tr><td>10045</td><td>腹部彩超</td><td>180.00</td><td><span class="tag tag-orange">未检</span></td><td>-</td><td>-</td><td><span class="link">置为已检</span> <span class="link" style="color:var(--danger);">置为弃检</span></td></tr>
<tr><td>10052</td><td>幽门螺旋杆菌呼气试验</td><td>95.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 10:02</td><td>赵医生</td><td><span class="link">置为未检</span></td></tr>
</tbody>
</table>
</div>
<!-- 已体检项目 -->
<div id="mpanel-done" class="modal-panel">
<div class="modal-panel__actions">
<button class="btn btn-primary">批量置为未检</button>
</div>
<table>
<thead>
<tr>
<th style="width:36px;"><input type="checkbox" onclick="toggleAllCheck(this)"></th>
<th>体检项编号</th><th>项目名称</th><th>项目费用(元)</th><th>检查状态</th><th>检查时间</th><th>检查医生</th>
</tr>
</thead>
<tbody>
<tr><td><input type="checkbox"></td><td>10023</td><td>血常规</td><td>25.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 08:35</td><td>李医生</td></tr>
<tr><td><input type="checkbox"></td><td>10024</td><td>尿常规</td><td>20.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 09:10</td><td>李医生</td></tr>
<tr><td><input type="checkbox"></td><td>10052</td><td>幽门螺旋杆菌呼气试验</td><td>95.00</td><td><span class="tag tag-green">已检</span></td><td>2025-07-22 10:02</td><td>赵医生</td></tr>
</tbody>
</table>
</div>
<!-- 未体检项目 -->
<div id="mpanel-todo" class="modal-panel">
<div class="modal-panel__actions">
<button class="btn btn-primary">批量置为已检</button>
<button class="btn btn-danger">批量置为弃检</button>
</div>
<table>
<thead>
<tr>
<th style="width:36px;"><input type="checkbox" onclick="toggleAllCheck(this)"></th>
<th>体检项编号</th><th>项目名称</th><th>项目费用(元)</th><th>检查状态</th><th>检查时间</th><th>检查医生</th>
</tr>
</thead>
<tbody>
<tr><td><input type="checkbox"></td><td>10031</td><td>胸部正位DR</td><td>120.00</td><td><span class="tag tag-orange">未检</span></td><td>-</td><td>-</td></tr>
<tr><td><input type="checkbox"></td><td>10045</td><td>腹部彩超</td><td>180.00</td><td><span class="tag tag-orange">未检</span></td><td>-</td><td>-</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');
}
/* 页面加载时自动展开当前页面所在的子分组 */
(function(){
var active=document.querySelector('.sidebar-item.active');
if(!active)return;
var sub=active.closest('.sidebar-subgroup');
if(sub)sub.classList.add('open');
})();
/* 详情弹窗:打开/关闭与 Tab 切换 */
function openDetailModal(){document.getElementById('detailModal').classList.add('open');}
function closeDetailModal(){document.getElementById('detailModal').classList.remove('open');}
function switchModalTab(el,panelId){
document.querySelectorAll('.modal-tab').forEach(function(t){t.classList.remove('active');});
el.classList.add('active');
document.querySelectorAll('.modal-panel').forEach(function(p){p.classList.remove('active');});
document.getElementById(panelId).classList.add('active');
}
/* 弹窗表头复选框全选/取消全选 */
function toggleAllCheck(cb){
cb.closest('table').querySelectorAll('tbody input[type=checkbox]').forEach(function(c){c.checked=cb.checked;});
}
document.getElementById('detailModal').addEventListener('click',function(e){
if(e.target===this)closeDetailModal();
});
/* 全选/取消全选 */
document.getElementById('checkAll').addEventListener('change',function(){
var checked=this.checked;
document.querySelectorAll('.row-checkbox').forEach(function(cb){cb.checked=checked;});
});
var TAG_CLASS={'未预约':'tag-orange','已预约':'tag-green','已取消预约':'tag-red','未体检':'tag-orange','体检中':'tag-blue','已体检':'tag-blue','已出报告':'tag-green'};
/* 将指定行某列的状态标签更新为目标状态 */
function setRowStatus(tr,cellIndex,text){
var td=tr.cells[cellIndex];
if(!td)return;
var span=td.querySelector('.tag');
if(!span){span=document.createElement('span');td.textContent='';td.appendChild(span);}
span.className='tag '+(TAG_CLASS[text]||'tag-blue');
span.textContent=text;
}
/* 批量操作:作用于勾选行 */
function batchSetRows(handler,emptyMsg){
var checked=document.querySelectorAll('.row-checkbox:checked');
if(!checked.length){alert(emptyMsg);return;}
checked.forEach(function(cb){handler(cb.closest('tr'));});
}
document.getElementById('btnBatchDone').addEventListener('click',function(){
batchSetRows(function(tr){setRowStatus(tr,12,'已体检');},'请先勾选需要操作的员工');
});
document.getElementById('btnBatchUndone').addEventListener('click',function(){
batchSetRows(function(tr){setRowStatus(tr,12,'未体检');},'请先勾选需要操作的员工');
});
document.getElementById('btnBatchCancel').addEventListener('click',function(){
batchSetRows(function(tr){setRowStatus(tr,10,'已取消预约');},'请先勾选需要操作的员工');
});
</script>
</body>
</html>
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 单位预约统计 | 健康CQ原型</title>
<title>健康体检 - 单位预约人数统计 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
@@ -116,8 +116,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item active">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item active">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -105,8 +105,9 @@
</div>
<div class="sidebar-subgroup__body">
<a href="mid-appointment-track.html" class="sidebar-item">员工预约跟踪</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约统计</a>
<a href="mid-selected-items.html" class="sidebar-item">已选项目员工信息</a>
<a href="mid-participation.html" class="sidebar-item">已参检员工信息</a>
<a href="mid-unit-appointment.html" class="sidebar-item">单位预约人数统计</a>
<a href="mid-hospital-realtime.html" class="sidebar-item">医院实时预约人数</a>
<a href="mid-doctor-realtime.html" class="sidebar-item">医生实时检查情况</a>
<a href="mid-hospital-appointment.html" class="sidebar-item">医院预约人数统计</a>
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 自动勾选病种 | 健康CQ原型</title>
<title>健康体检 - 员工病种信息 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
@@ -144,6 +144,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -167,9 +169,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item active">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item active">员工病种信息</a>
</div>
</div>
</div>
@@ -253,14 +255,6 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v7M4 6l3 3 3-3M2 11.5h10" stroke="#fff" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
查看自动勾选记录
</button>
<button class="btn btn-primary" onclick="runAutoFilter()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M9.3 2.2l2.5 2.5M2 12l.9-3.4 7-7a1.3 1.3 0 0 1 1.9 0l.6.6a1.3 1.3 0 0 1 0 1.9l-7 7L2 12z" stroke="#fff" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
自动筛选异常项
</button>
<button class="btn btn-primary" onclick="openRecord('filter')">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v7M4 6l3 3 3-3M2 11.5h10" stroke="#fff" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
查看自动筛选记录
</button>
<button class="btn btn-primary" onclick="exportDisease()">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M8.5 2H11a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h2.5M7 1.5v6M4.8 5.3L7 7.5l2.2-2.2" stroke="#fff" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出员工病种
@@ -337,11 +331,6 @@ var selectRecords=[
['2025-10-28 14:03:17','2025','152',603,'李红','部分失败'],
['2025-10-20 10:45:02','2025','143',571,'系统管理员','成功']
];
var filterRecords=[
['2025-11-08 15:26:02','2025','128',64,'系统管理员','成功'],
['2025-11-05 09:18:55','2025','96',41,'系统管理员','成功'],
['2025-10-28 14:11:38','2025','152',77,'李红','成功']
];
var exportRecords=[
['员工病种导出_2025.xlsx','2025-11-08 15:31:12','系统管理员','成功'],
['员工病种导出_2025-11-05.xlsx','2025-11-05 09:22:40','系统管理员','成功'],
@@ -420,7 +409,7 @@ function renderTable(){
+'<td>'+r[4]+'</td>'
+'<td>'+r[5]+'</td>'
+'<td>'+statusTag(r[6])+'</td>'
+'<td>'+r[7]+'</td>'
+'<td><span class="link" onclick="showDiseaseList('+i+')">'+r[7]+'</span></td>'
+'<td><span class="link-danger" onclick="deleteRow('+i+')">删除</span></td>'
+'</tr>';
}).join(''):'<tr><td colspan="9"><div class="empty-tip">暂无数据</div></td></tr>';
@@ -470,17 +459,12 @@ function deleteRow(idx){
renderTable();
}
/* ============ 自动勾选 / 筛选 / 导出 ============ */
/* ============ 自动勾选 / 导出 ============ */
function runAutoSelect(){
var year=document.getElementById('f-year').value.trim()||'2025';
if(!confirm('确认对 '+year+' 年度已完成体检的员工执行自动勾选病种?'))return;
alert('任务已提交,稍后可通过「查看自动勾选记录」了解执行结果。');
}
function runAutoFilter(){
var year=document.getElementById('f-year').value.trim()||'2025';
if(!confirm('确认对 '+year+' 年度已完成体检的员工执行自动筛选异常项?'))return;
alert('任务已提交,稍后可通过「查看自动筛选记录」了解执行结果。');
}
function exportDisease(){
if(!confirm('确认按当前查询条件导出员工病种?'))return;
alert('导出任务已提交,可通过「查看病种导出记录」下载文件。');
@@ -500,16 +484,33 @@ function recordTable(headers,data){
}).join(''):'<tr><td colspan="'+headers.length+'"><div class="empty-tip">暂无数据</div></td></tr>')
+'</tbody></table>';
}
var RECORD_TITLES={select:'自动勾选记录',filter:'自动筛选记录',export:'病种导出记录'};
var RECORD_TITLES={select:'自动勾选记录',export:'病种导出记录'};
function openRecord(type){
document.getElementById('recordTitle').textContent=RECORD_TITLES[type];
var body=document.getElementById('recordBody');
if(type==='select')body.innerHTML=recordTable(['执行时间','体检年份','执行人数','勾选病种数','操作人','结果'],selectRecords);
else if(type==='filter')body.innerHTML=recordTable(['执行时间','体检年份','执行人数','异常项人数','操作人','结果'],filterRecords);
else body.innerHTML=recordTable(['文件名称','导出时间','操作人','结果'],exportRecords);
document.getElementById('recordMask').classList.add('open');
}
function closeRecord(){document.getElementById('recordMask').classList.remove('open');}
/* ============ 勾选病种明细 ============ */
var DISEASE_POOL=[
['高血压','血液及动脉病种'],['高血糖','内分泌及代谢病种'],['高脂血','血液及动脉病种'],['脂肪肝','消化系统病种'],
['甲状腺结节','内分泌及代谢病种'],['肺部结节','呼吸系统病种'],['心律失常','心血管病种'],['心电图异常','心血管病种'],
['颈动脉粥样硬化','血液及动脉病种'],['肝囊肿','消化系统病种'],['肾囊肿','泌尿系统病种'],['子宫肌瘤','妇科病种'],
['痛风(高尿酸)','血液及动脉病种'],['超重','内分泌及代谢病种'],['胆囊息肉','消化系统病种'],['动脉斑块','血液及动脉病种']
];
function showDiseaseList(i){
var r=rows[i],html='';
for(var k=0;k<r[7];k++){
var d=DISEASE_POOL[(i*5+k*3)%DISEASE_POOL.length];
html+='<tr><td>'+(k+1)+'</td><td>'+d[0]+'</td><td>'+d[1]+'</td></tr>';
}
document.getElementById('recordTitle').textContent='「'+r[0]+'」勾选病种';
document.getElementById('recordBody').innerHTML='<table><thead><tr><th>序号</th><th>病种名称</th><th>病种类别</th></tr></thead><tbody>'+html+'</tbody></table>';
document.getElementById('recordMask').classList.add('open');
}
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeRecord();});
/* ============ 通用 ============ */
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -154,6 +154,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -177,9 +179,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item active">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 病种信息 | 健康CQ原型</title>
<title>健康体检 - 病种信息配置 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
@@ -152,6 +152,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -175,9 +177,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item active">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item active">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -125,6 +125,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -148,9 +150,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -0,0 +1,274 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 大病人员信息 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
:root{
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;--font-xl:20px;--font-xxl:24px;
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.12);
}
/* 顶部导航 */
.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:240px;flex-shrink:0;}
.top-bar__logo svg{width:28px;height:28px;}
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
.top-bar__right .btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
.top-bar__right .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;}
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
.top-bar__nav a.active{color:#fff;background:var(--primary);}
/* 侧边栏 */
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;text-transform:uppercase;letter-spacing:.5px;}
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 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:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;user-select:none;}
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);background:rgba(255,255,255,0.04);}
.sidebar-subgroup__header .arrow{width:10px;height:10px;transition:transform .2s;flex-shrink:0;}
.sidebar-subgroup__header .arrow path{stroke:rgba(255,255,255,0.45);}
.sidebar-subgroup.open>.sidebar-subgroup__header{color:rgba(255,255,255,0.85);}
.sidebar-subgroup.open>.sidebar-subgroup__header .arrow{transform:rotate(90deg);}
.sidebar-subgroup__body{display:none;padding-left:16px;}
.sidebar-subgroup.open>.sidebar-subgroup__body{display:block;}
.sidebar-subgroup__body .sidebar-item{padding-left:36px;font-size:12px;}
.sidebar-subgroup .sidebar-subgroup{padding-left:12px;}
.sidebar-subgroup .sidebar-subgroup .sidebar-item{padding-left:40px;}
.sidebar-subgroup .sidebar-subgroup>.sidebar-subgroup__header{font-size:12px;}
/* 主内容 */
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
/* 筛选栏 */
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px 24px;flex-wrap:wrap;}
.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-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;background:#fff;min-width:200px;}
.filter-input:focus{border-color:var(--primary);}
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 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 10px center;appearance:none;cursor:pointer;min-width:160px;}
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
.btn-danger{background:#fff;color:var(--danger);border:1px solid var(--danger);}.btn-danger:hover{background:#fff1f0;}
/* 表格 */
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
.table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
.table-card__title{font-size:var(--font-base);font-weight:600;}
.table-card__actions{display:flex;gap:8px;align-items:center;}
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
.table-card__content table{min-width:100%;white-space:nowrap;}
table{width:100%;border-collapse:collapse;}
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
.tag-blue{background:var(--primary-light);color:var(--primary);}
.tag-green{background:#F6FFED;color:var(--success);}
.tag-orange{background:#FFF7E6;color:var(--warning);}
.tag-red{background:#FFF1F0;color:var(--danger);}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);}.link:hover{color:#40a9ff;}
/* 开关 */
.switch{position:relative;display:inline-block;width:44px;height:22px;vertical-align:middle;}
.switch input{opacity:0;width:0;height:0;}
.switch__slider{position:absolute;inset:0;background:#BFBFBF;border-radius:22px;cursor:pointer;transition:background .2s;}
.switch__slider::before{content:"";position:absolute;left:2px;top:2px;width:18px;height:18px;background:#fff;border-radius:50%;transition:transform .2s;box-shadow:0 1px 2px rgba(0,0,0,0.2);}
.switch input:checked + .switch__slider{background:var(--primary);}
.switch input:checked + .switch__slider::before{transform:translateX(22px);}
/* 分页 */
.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{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;transition:all .2s;}
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
</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="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg>
健康体检
</div>
<nav class="top-bar__nav">
<a href="archive-personal.html">档案</a>
<a href="config-material-notice.html">基础配置</a>
<a href="pre-hospital-scope.html">检前</a>
<a href="mid-appointment-track.html">检中</a>
<a href="post-unit-count.html" class="active">检后</a>
<a href="exception-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">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
常规体检
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item active">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
体检统计汇总
</div>
<div class="sidebar-subgroup__body">
<a href="post-unit-count.html" class="sidebar-item">单位体检人数统计</a>
<a href="post-hospital-count.html" class="sidebar-item">医院体检人数统计</a>
<a href="post-doctor-count.html" class="sidebar-item">医生检查人数统计</a>
<a href="post-item-stat.html" class="sidebar-item">医院体检项目统计</a>
<a href="post-cancer-screening.html" class="sidebar-item">防癌筛查人数统计</a>
<a href="post-standard-stat.html" class="sidebar-item">系统标准化项目统计</a>
<a href="post-contracted-hospital.html" class="sidebar-item">签约医院人数统计</a>
<a href="post-key-indicator-stat.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 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
</div>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
胃肠镜体检
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-gastro.html" class="sidebar-item">胃肠镜体检报告</a>
<a href="post-gastro-stat.html" class="sidebar-item">胃肠镜体检统计</a>
</div>
</div>
</aside>
<!-- 主内容 -->
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>姓名:</label>
<input class="filter-input" type="text" placeholder="请输入姓名" style="width:200px;min-width:unset;">
</div>
<div class="filter-item">
<label>身份证号:</label>
<input class="filter-input" type="text" placeholder="请输入身份证号" style="width:200px;min-width:unset;">
</div>
<div class="filter-item">
<label>单位部门:</label>
<select class="filter-select"><option>请选择单位部门</option></select>
</div>
<div class="filter-item">
<label>医院选择:</label>
<select class="filter-select"><option>请选择医院</option></select>
</div>
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="currentColor" stroke-width="1.4"/><path d="M9.5 9.5L12 12" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
查询
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M11.5 4A4.5 4.5 0 0 0 3.2 2.8M2.5 10a4.5 4.5 0 0 0 8.3 1.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M11.5 1.5v2.5H9M2.5 12.5V10h2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
重置
</button>
</div>
<!-- 操作栏 -->
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出列表数据
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><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__header">
<div class="table-card__title">大病人员信息</div>
<div class="table-card__actions">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="cursor:pointer;color:var(--text-secondary);"><path d="M9 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z" stroke="currentColor" stroke-width="1.3"/><path d="M14.5 9a5.5 5.5 0 0 0-.1-1l1.3-1-1.3-2.3-1.6.6a5.5 5.5 0 0 0-1.7-1L10.8 2h-2.6l-.4 1.8a5.5 5.5 0 0 0-1.7 1l-1.6-.6-1.3 2.3 1.3 1a5.5 5.5 0 0 0 0 2l-1.3 1 1.3 2.3 1.6-.6a5.5 5.5 0 0 0 1.7 1l.4 1.8h2.6l.4-1.8a5.5 5.5 0 0 0 1.7-1l1.6.6 1.3-2.3-1.3-1c.06-.32.1-.66.1-1z" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round"/></svg>
</div>
</div>
<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>
</tr>
</thead>
<tbody>
<tr>
<td>1</td><td>王旭</td><td>公司机关</td><td>办公室</td><td>延安医院</td><td>430626198502560029</td><td>13812346621</td><td>2026-03-10</td><td>恶性肿瘤</td><td><span class="switch"><input type="checkbox" checked><span class="switch__slider"></span></span></td><td><span class="tag tag-green"></span></td>
<td><span class="link">编辑</span><span class="link" style="margin-left:12px;">删除</span><span class="link" style="margin-left:12px;">发送短信</span></td>
</tr>
<tr>
<td>2</td><td>张丽娟</td><td>公司机关</td><td>财务部</td><td>长安医院</td><td>430626198805120046</td><td>13912343078</td><td>2026-03-11</td><td>心脑血管疾病</td><td><span class="switch"><input type="checkbox" checked><span class="switch__slider"></span></span></td><td><span class="tag tag-red"></span></td>
<td><span class="link">编辑</span><span class="link" style="margin-left:12px;">删除</span><span class="link" style="margin-left:12px;">发送短信</span></td>
</tr>
<tr>
<td>3</td><td>李国强</td><td>生产一部</td><td>运行车间</td><td>延安医院</td><td>430626197911200017</td><td>13712345540</td><td>2026-03-12</td><td>糖尿病及并发症</td><td><span class="switch"><input type="checkbox"><span class="switch__slider"></span></span></td><td><span class="tag tag-red"></span></td>
<td><span class="link">编辑</span><span class="link" style="margin-left:12px;">删除</span><span class="link" style="margin-left:12px;">发送短信</span></td>
</tr>
<tr>
<td>4</td><td>陈慧敏</td><td>生产二部</td><td>检修班</td><td>西南医院</td><td>430626198302140028</td><td>13512348802</td><td>2026-03-12</td><td>慢性肾病</td><td><span class="switch"><input type="checkbox" checked><span class="switch__slider"></span></span></td><td><span class="tag tag-green"></span></td>
<td><span class="link">编辑</span><span class="link" style="margin-left:12px;">删除</span><span class="link" style="margin-left:12px;">发送短信</span></td>
</tr>
<tr>
<td>5</td><td>赵明辉</td><td>公司机关</td><td>安全环保部</td><td>大坪医院</td><td>430626197509030035</td><td>13612341194</td><td>2026-03-13</td><td>肝硬化</td><td><span class="switch"><input type="checkbox" checked><span class="switch__slider"></span></span></td><td><span class="tag tag-red"></span></td>
<td><span class="link">编辑</span><span class="link" style="margin-left:12px;">删除</span><span class="link" style="margin-left:12px;">发送短信</span></td>
</tr>
</tbody>
</table>
</div>
<div class="pagination">
<span>共 5 条</span>
<button class="page-btn active">1</button>
</div>
</div>
</main>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');
}
/* 页面加载时自动展开当前页面所在的子分组 */
(function(){
var active=document.querySelector('.sidebar-item.active');
if(!active)return;
var sub=active.closest('.sidebar-subgroup');
while(sub){ sub.classList.add('open'); sub=sub.parentElement.closest('.sidebar-subgroup'); }
})();
</script>
</body>
</html>
@@ -0,0 +1,283 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 指标异常通知 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
:root{
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;--font-xl:20px;--font-xxl:24px;
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.12);
}
/* 顶部导航 */
.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:240px;flex-shrink:0;}
.top-bar__logo svg{width:28px;height:28px;}
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
.top-bar__right .btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
.top-bar__right .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;}
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
.top-bar__nav a.active{color:#fff;background:var(--primary);}
/* 侧边栏 */
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;text-transform:uppercase;letter-spacing:.5px;}
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 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:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;user-select:none;}
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);background:rgba(255,255,255,0.04);}
.sidebar-subgroup__header .arrow{width:10px;height:10px;transition:transform .2s;flex-shrink:0;}
.sidebar-subgroup__header .arrow path{stroke:rgba(255,255,255,0.45);}
.sidebar-subgroup.open>.sidebar-subgroup__header{color:rgba(255,255,255,0.85);}
.sidebar-subgroup.open>.sidebar-subgroup__header .arrow{transform:rotate(90deg);}
.sidebar-subgroup__body{display:none;padding-left:16px;}
.sidebar-subgroup.open>.sidebar-subgroup__body{display:block;}
.sidebar-subgroup__body .sidebar-item{padding-left:36px;font-size:12px;}
.sidebar-subgroup .sidebar-subgroup{padding-left:12px;}
.sidebar-subgroup .sidebar-subgroup .sidebar-item{padding-left:40px;}
.sidebar-subgroup .sidebar-subgroup>.sidebar-subgroup__header{font-size:12px;}
/* 主内容 */
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
/* 筛选栏 */
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px 24px;flex-wrap:wrap;}
.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-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;background:#fff;min-width:200px;}
.filter-input:focus{border-color:var(--primary);}
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 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 10px center;appearance:none;cursor:pointer;min-width:160px;}
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
.btn-danger{background:#fff;color:var(--danger);border:1px solid var(--danger);}.btn-danger:hover{background:#fff1f0;}
/* 表格 */
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
.table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
.table-card__title{font-size:var(--font-base);font-weight:600;}
.table-card__actions{display:flex;gap:8px;align-items:center;}
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
.table-card__content table{min-width:100%;white-space:nowrap;}
table{width:100%;border-collapse:collapse;}
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
.tag-blue{background:var(--primary-light);color:var(--primary);}
.tag-green{background:#F6FFED;color:var(--success);}
.tag-orange{background:#FFF7E6;color:var(--warning);}
.tag-red{background:#FFF1F0;color:var(--danger);}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);}.link:hover{color:#40a9ff;}
/* 分页 */
.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{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;transition:all .2s;}
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
</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="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg>
健康体检
</div>
<nav class="top-bar__nav">
<a href="archive-personal.html">档案</a>
<a href="config-material-notice.html">基础配置</a>
<a href="pre-hospital-scope.html">检前</a>
<a href="mid-appointment-track.html">检中</a>
<a href="post-unit-count.html" class="active">检后</a>
<a href="exception-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">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
常规体检
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item active">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
体检统计汇总
</div>
<div class="sidebar-subgroup__body">
<a href="post-unit-count.html" class="sidebar-item">单位体检人数统计</a>
<a href="post-hospital-count.html" class="sidebar-item">医院体检人数统计</a>
<a href="post-doctor-count.html" class="sidebar-item">医生检查人数统计</a>
<a href="post-item-stat.html" class="sidebar-item">医院体检项目统计</a>
<a href="post-cancer-screening.html" class="sidebar-item">防癌筛查人数统计</a>
<a href="post-standard-stat.html" class="sidebar-item">系统标准化项目统计</a>
<a href="post-contracted-hospital.html" class="sidebar-item">签约医院人数统计</a>
<a href="post-key-indicator-stat.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 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
</div>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
<svg class="arrow" viewBox="0 0 12 12"><path d="M4 2l4 4-4 4" fill="none" stroke-width="1.5" stroke-linecap="round"/></svg>
胃肠镜体检
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-gastro.html" class="sidebar-item">胃肠镜体检报告</a>
<a href="post-gastro-stat.html" class="sidebar-item">胃肠镜体检统计</a>
</div>
</div>
</aside>
<!-- 主内容 -->
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>姓名:</label>
<input class="filter-input" type="text" placeholder="请输入姓名" style="width:200px;min-width:unset;">
</div>
<div class="filter-item">
<label>身份证号:</label>
<input class="filter-input" type="text" placeholder="请输入身份证号" style="width:200px;min-width:unset;">
</div>
<div class="filter-item">
<label>手机号:</label>
<input class="filter-input" type="text" placeholder="请输入手机号" style="width:200px;min-width:unset;">
</div>
<div class="filter-item">
<label>APP已通知:</label>
<select class="filter-select" style="min-width:120px;"><option>全部</option><option></option><option></option></select>
</div>
<div class="filter-item">
<label>APP通知已读:</label>
<select class="filter-select" style="min-width:120px;"><option>全部</option><option></option><option></option></select>
</div>
<div class="filter-item">
<label>短信已通知:</label>
<select class="filter-select" style="min-width:120px;"><option>全部</option><option></option><option></option></select>
</div>
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="currentColor" stroke-width="1.4"/><path d="M9.5 9.5L12 12" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
查询
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M11.5 4A4.5 4.5 0 0 0 3.2 2.8M2.5 10a4.5 4.5 0 0 0 8.3 1.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M11.5 1.5v2.5H9M2.5 12.5V10h2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
重置
</button>
</div>
<!-- 操作栏 -->
<div style="display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
导出列表数据
</button>
<button class="btn btn-default">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><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>
<button class="btn btn-primary">
<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>
<button class="btn btn-default">
<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__header">
<div class="table-card__title">指标异常通知</div>
<div class="table-card__actions">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="cursor:pointer;color:var(--text-secondary);"><path d="M9 11.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z" stroke="currentColor" stroke-width="1.3"/><path d="M14.5 9a5.5 5.5 0 0 0-.1-1l1.3-1-1.3-2.3-1.6.6a5.5 5.5 0 0 0-1.7-1L10.8 2h-2.6l-.4 1.8a5.5 5.5 0 0 0-1.7 1l-1.6-.6-1.3 2.3 1.3 1a5.5 5.5 0 0 0 0 2l-1.3 1 1.3 2.3 1.6-.6a5.5 5.5 0 0 0 1.7 1l.4 1.8h2.6l.4-1.8a5.5 5.5 0 0 0 1.7-1l1.6.6 1.3-2.3-1.3-1c.06-.32.1-.66.1-1z" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round"/></svg>
</div>
</div>
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th><th>姓名</th><th>身份证号</th><th>手机号</th><th>重大异常描述</th><th>APP已通知</th><th>APP通知时间</th><th>APP通知已读</th><th>APP通知已读时间</th><th>短信已通知</th><th>短信通知时间</th><th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td><td>王旭</td><td>430626198502560029</td><td>13812346621</td><td>空腹血糖 14.2 mmol/L↑,糖化血红蛋白 9.8%↑,提示糖尿病可能</td><td><span class="tag tag-green"></span></td><td>2026-03-15 09:20:36</td><td><span class="tag tag-green"></span></td><td>2026-03-15 10:05:12</td><td><span class="tag tag-green"></span></td><td>2026-03-15 09:21:02</td>
<td><span class="link">删除</span></td>
</tr>
<tr>
<td>2</td><td>张丽娟</td><td>430626198805120046</td><td>13912343078</td><td>胸部CT示右肺上叶结节 12mm,建议进一步检查</td><td><span class="tag tag-green"></span></td><td>2026-03-15 09:22:18</td><td><span class="tag tag-red"></span></td><td></td><td><span class="tag tag-red"></span></td><td></td>
<td><span class="link">删除</span></td>
</tr>
<tr>
<td>3</td><td>李国强</td><td>430626197911200017</td><td>13712345540</td><td>血压 178/112 mmHg↑,心电图示左心室高电压</td><td><span class="tag tag-red"></span></td><td></td><td><span class="tag tag-red"></span></td><td></td><td><span class="tag tag-red"></span></td><td></td>
<td><span class="link">删除</span></td>
</tr>
<tr>
<td>4</td><td>陈慧敏</td><td>430626198302140028</td><td>13512348802</td><td>甲胎蛋白 458 ng/mL↑,肝脏超声示占位性病变</td><td><span class="tag tag-green"></span></td><td>2026-03-16 14:02:45</td><td><span class="tag tag-green"></span></td><td>2026-03-16 15:30:08</td><td><span class="tag tag-green"></span></td><td>2026-03-16 14:03:20</td>
<td><span class="link">删除</span></td>
</tr>
<tr>
<td>5</td><td>赵明辉</td><td>430626197509030035</td><td>13612341194</td><td>总胆红素 68 μmol/L↑,转氨酶升高 3 倍,提示肝功能异常</td><td><span class="tag tag-red"></span></td><td></td><td><span class="tag tag-red"></span></td><td></td><td><span class="tag tag-green"></span></td><td>2026-03-16 16:40:55</td>
<td><span class="link">删除</span></td>
</tr>
</tbody>
</table>
</div>
<div class="pagination">
<span>共 5 条</span>
<button class="page-btn active">1</button>
</div>
</div>
</main>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');
}
/* 页面加载时自动展开当前页面所在的子分组 */
(function(){
var active=document.querySelector('.sidebar-item.active');
if(!active)return;
var sub=active.closest('.sidebar-subgroup');
while(sub){ sub.classList.add('open'); sub=sub.parentElement.closest('.sidebar-subgroup'); }
})();
</script>
</body>
</html>
+4 -2
View File
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -151,6 +151,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -174,9 +176,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -139,6 +139,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item active">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -162,9 +164,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -223,10 +225,6 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="5.5" stroke="currentColor" stroke-width="1.4"/><path d="M7 4.5v5M4.5 7h5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
体检报告补录
</button>
<button class="btn btn-primary">
<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.5 5h5M4.5 7.5h3M4.5 10h2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><path d="M9.5 9.5l2 2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>
提取防癌项结果
</button>
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="2.5" width="11" height="9" rx="1.5" stroke="currentColor" stroke-width="1.4"/><circle cx="5" cy="5.5" r="1" fill="currentColor"/><path d="M1.5 9.5l3-2.5 2.5 2L9.5 6l3 3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
获取影像报告
@@ -209,6 +209,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -232,9 +234,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -137,6 +137,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item active">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -160,9 +162,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -183,12 +185,6 @@
<main class="main">
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>年份选择:</label>
<select class="filter-select" style="min-width:90px;">
<option>2026</option><option>2025</option><option>2024</option>
</select>
</div>
<div class="filter-item">
<label>医院:</label>
<select class="filter-select">
@@ -209,7 +205,6 @@
<!-- 操作栏 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openAddModal()">新增</button>
<button class="btn btn-default">批量删除</button>
</div>
@@ -237,47 +232,6 @@
</div>
</div>
<!-- 新增未匹配项目弹窗 -->
<div class="modal-overlay" id="add-modal" onclick="if(event.target===this)closeAddModal()">
<div class="modal">
<div class="modal__header">
<div class="modal__title">新增未匹配项目</div>
<button class="modal__close" onclick="closeAddModal()"></button>
</div>
<div class="modal__body">
<div class="form-grid">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检年份</div>
<select class="form-select" id="f-year"><option>2026</option><option>2025</option><option>2024</option></select>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 医院名称</div>
<select class="form-select" id="f-hospital"><option>请选择</option><option>庆阳医院</option><option>泾河医院</option><option>CQ总医院</option></select>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检项目编码</div>
<input class="form-input" id="f-item-code" type="text" placeholder="请输入">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检项目名称</div>
<input class="form-input" id="f-item-name" type="text" placeholder="请输入">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检组合编码</div>
<input class="form-input" id="f-combo-code" type="text" placeholder="请输入">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检组合名称</div>
<input class="form-input" id="f-combo-name" type="text" placeholder="请输入">
</div>
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeAddModal()">取消</button>
<button class="btn btn-primary" onclick="saveAdd()">确定</button>
</div>
</div>
</div>
</main>
@@ -286,40 +240,6 @@
function toggleAll(el){
document.querySelectorAll('.row-check').forEach(function(c){c.checked=el.checked;});
}
/* 新增未匹配项目弹窗 */
function openAddModal(){
document.getElementById('add-modal').classList.add('open');
}
function closeAddModal(){
document.getElementById('add-modal').classList.remove('open');
}
/* 确定新增:必填校验,通过后插入新行并刷新总条数 */
function saveAdd(){
var year=document.getElementById('f-year');
var hospital=document.getElementById('f-hospital');
var codes=['f-item-code','f-item-name','f-combo-code','f-combo-name'].map(function(id){return document.getElementById(id);});
var invalid=false;
var pass;
pass=hospital.value!=='请选择';
hospital.style.borderColor=pass?'':'var(--danger)';
if(!pass)invalid=true;
codes.forEach(function(e){
pass=e.value.trim()!=='';
e.style.borderColor=pass?'':'var(--danger)';
if(!pass)invalid=true;
});
if(invalid)return;
var t=document.getElementById('unmatched-tbody');
var seq=t.rows.length+1;
var d=new Date();
function pad(n){return String(n).padStart(2,'0');}
var ts=d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate())+' '+pad(d.getHours())+':'+pad(d.getMinutes())+':'+pad(d.getSeconds());
var tr=document.createElement('tr');
tr.innerHTML='<td><input type="checkbox" class="table-check row-check"></td><td>'+seq+'</td><td>'+hospital.value+'</td><td>'+codes[0].value.trim()+'</td><td>'+codes[1].value.trim()+'</td><td>'+codes[2].value.trim()+'</td><td>'+codes[3].value.trim()+'</td><td>'+ts+'</td><td>'+year.value+'</td><td><span class="link">更新体检报告</span></td>';
t.appendChild(tr);
document.getElementById('page-total').textContent='共 '+t.rows.length+' 条';
closeAddModal();
}
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
header.parentElement.classList.toggle('open');
@@ -118,6 +118,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -141,9 +143,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
+15 -13
View File
@@ -140,6 +140,8 @@
</div>
<div class="sidebar-subgroup__body">
<a href="post-report-employee.html" class="sidebar-item">常规体检报告</a>
<a href="post-illness-personnel.html" class="sidebar-item">大病人员信息</a>
<a href="post-indicator-notify.html" class="sidebar-item">指标异常通知</a>
<a href="post-report-unmatched.html" class="sidebar-item">体检报告未匹配项目</a>
<div class="sidebar-subgroup">
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)">
@@ -163,9 +165,9 @@
病种信息管理
</div>
<div class="sidebar-subgroup__body">
<a href="post-disease-info.html" class="sidebar-item">病种信息</a>
<a href="post-disease-info.html" class="sidebar-item">病种信息配置</a>
<a href="post-conclusion-disease.html" class="sidebar-item">体检结论关联病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">自动勾选病种</a>
<a href="post-auto-select-disease.html" class="sidebar-item">员工病种信息</a>
</div>
</div>
</div>
@@ -298,7 +300,7 @@
<div class="modal__body">
<table>
<thead>
<tr><th>年龄分类</th><th>体检额度</th><th>人数</th></tr>
<tr><th>序号</th><th>分类</th><th>体检额度</th><th>人数</th></tr>
</thead>
<tbody id="age-stat-body"></tbody>
</table>
@@ -323,24 +325,24 @@ function switchUnitLevel(el){
document.getElementById('table-unit').style.display = (tab==='体检医院') ? 'none' : '';
document.getElementById('table-hospital').style.display = (tab==='体检医院') ? '' : 'none';
}
/* 分类统计弹窗:各人数列年龄分类示例数据(体检额度单位:元 */
/* 分类统计弹窗:各人数列年龄段×性别分类示例数据(35岁以下/35岁至44岁/45岁及以上,额度按分类固定 */
var AGE_STAT_DATA={
'已选项目人数':[['35岁以下',600,1200],['36-45岁',800,1500],['46-55岁',1000,1300],['56岁及以上',1200,1000]],
'已预约人数':[['35岁以下',600,900],['36-45岁',800,1300],['46-55岁',1000,1100],['56岁及以上',1200,700]],
'已参检人数':[['35岁以下',600,700],['36-45岁',800,950],['46-55岁',1000,850],['56岁及以上',1200,500]],
'未检人数':[['35岁以下',600,200],['36-45岁',800,350],['46-55岁',1000,250],['56岁及以上',1200,200]],
'未预约人数':[['35岁以下',600,300],['36-45岁',800,300],['46-55岁',1000,200],['56岁及以上',1200,200]]
'已选项目人数':[['35岁以下(女)',1000,74],['35岁以下(男)',1000,144],['35岁至44岁(女)',1500,195],['35岁至44岁(男)',1500,291],['45岁及以上(女)',2500,196],['45岁及以上(男)',2500,496]],
'已预约人数':[['35岁以下(女)',1000,200],['35岁以下(男)',1000,400],['35岁至44岁(女)',1500,560],['35岁至44岁(男)',1500,840],['45岁及以上(女)',2500,560],['45岁及以上(男)',2500,1440]],
'已参检人数':[['35岁以下(女)',1000,150],['35岁以下(男)',1000,300],['35岁至44岁(女)',1500,420],['35岁至44岁(男)',1500,630],['45岁及以上(女)',2500,420],['45岁及以上(男)',2500,1080]],
'未检人数':[['35岁以下(女)',1000,50],['35岁以下(男)',1000,100],['35岁至44岁(女)',1500,140],['35岁至44岁(男)',1500,210],['45岁及以上(女)',2500,140],['45岁及以上(男)',2500,360]],
'未预约人数':[['35岁以下(女)',1000,60],['35岁以下(男)',1000,110],['35岁至44岁(女)',1500,130],['35岁至44岁(男)',1500,220],['45岁及以上(女)',2500,150],['45岁及以上(男)',2500,330]]
};
function showAgeStat(colName){
var rows=AGE_STAT_DATA[colName]||[];
var total=0;
var html='';
rows.forEach(function(r){
rows.forEach(function(r,i){
total+=r[2];
html+='<tr><td>'+r[0]+'</td><td>'+r[1]+'</td><td>'+r[2]+'</td></tr>';
html+='<tr><td>'+(i+1)+'</td><td>'+r[0]+'</td><td>'+r[1]+'</td><td>'+r[2]+'</td></tr>';
});
html+='<tr style="font-weight:600;"><td colspan="2">合计</td><td>'+total+'</td></tr>';
document.getElementById('age-stat-title').textContent='「'+colName+'」年龄分类统计';
html+='<tr style="font-weight:600;"><td></td><td>合计</td><td></td><td>'+total+'</td></tr>';
document.getElementById('age-stat-title').textContent='「'+colName+'」分类统计';
document.getElementById('age-stat-body').innerHTML=html;
document.getElementById('age-stat-modal').style.display='flex';
}
@@ -144,7 +144,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -215,7 +215,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -139,7 +139,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -144,7 +144,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -151,7 +151,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -215,7 +215,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -198,7 +198,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item active">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -348,6 +348,14 @@
</select>
</div>
</div>
<div id="female-fee-box" style="display:none;">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 女性专项费用(元)</div>
<input class="form-input" id="female-fee-input" type="number" min="0" step="0.01" placeholder="请输入女性专项费用">
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 折扣类型</div>
@@ -601,15 +609,17 @@ function resetAddDrawer(){
document.getElementById('tpl-discount-type').value = '';
document.getElementById('tpl-discount-amount').value = '';
document.getElementById('cancer-fee-input').value = '';
document.getElementById('female-fee-input').value = '';
projectTabKeys.forEach(function(k){ document.getElementById('tbody-' + k).innerHTML = ''; });
switchProjectTab(document.querySelector('#tpl-tab-nav .tab-nav__item[data-tab="required"]'));
onGenderChange();
}
/* 性别切换:男隐藏妇科 tab */
/* 性别切换:男隐藏妇科 tab;女显示女性专项费用 */
function onGenderChange(){
var gender = document.getElementById('tpl-gender').value;
var showGyn = gender !== '男';
document.getElementById('female-fee-box').style.display = gender === '女' ? 'block' : 'none';
document.querySelectorAll('#tpl-tab-nav .tab-nav__item[data-tab="gyn-unmarried"], #tpl-tab-nav .tab-nav__item[data-tab="gyn-married"]').forEach(function(t){
t.style.display = showGyn ? '' : 'none';
});
@@ -685,6 +695,7 @@ function saveComboTemplate(){
if(!document.getElementById('tpl-age').value){ alert('请选择年龄范围'); return; }
if(!document.getElementById('tpl-discount-type').value){ alert('请选择折扣类型'); return; }
if(!document.getElementById('tpl-discount-amount').value){ alert('请输入折扣金额'); return; }
if(document.getElementById('tpl-gender').value === '女' && !document.getElementById('female-fee-input').value){ alert('请输入女性专项费用'); return; }
alert('已保存(原型演示)');
closeAddDrawer();
}
@@ -189,7 +189,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item active">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -736,16 +736,12 @@ function resetAddDrawer(){
initYearSelect();
}
/* 选择项目组合模板后,自动回填性别/年龄范围及项目(不可修改 */
/* 选择项目组合模板后,自动回填性别/年龄范围(不回填项目表格 */
function fillTemplateInfo(){
var info = templateInfo[selectedTemplateName];
document.getElementById('ex-gender').value = info ? info.gender : '';
document.getElementById('ex-age').value = info ? info.age : '';
projectTabKeys.forEach(function(k){ document.getElementById('tbody-' + k).innerHTML = ''; });
var proj = templateProjects[selectedTemplateName] || {};
projectTabKeys.forEach(function(k){
(proj[k] || []).forEach(function(name){ addProjectRow(k, name); });
});
onGenderChange();
}
@@ -207,7 +207,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
+342 -76
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>健康体检 - 必检/选检项目配置 | 健康CQ原型</title>
<title>健康体检 - 单位体检项目审核 | 健康CQ原型</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
@@ -131,6 +131,12 @@
.tab-nav__item.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;background:#fff;}
.tab-panel{display:none;padding:16px;height:300px;overflow-y:auto;}
.tab-panel.active{display:block;}
/* 拒绝原因提示条 */
.rejected-tip{display:flex;gap:8px;align-items:flex-start;background:#FFF1F0;border:1px solid #FFCCC7;color:var(--danger);border-radius:var(--radius-sm);padding:10px 14px;margin-bottom:16px;font-size:var(--font-sm);line-height:1.6;}
/* 差额徽章 */
.diff-badge{margin-left:10px;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
.diff-up{background:#FFF7E6;color:var(--warning);}
.diff-down{background:#F6FFED;color:var(--success);}
</style>
</head>
<body>
@@ -190,7 +196,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item active">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item active">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -282,26 +288,26 @@
<!-- 操作按钮 -->
<div style="display:flex;gap:12px;margin-bottom:16px;">
<button class="btn btn-primary" onclick="openGenerateModal()">+ 生成单位本年度项目组合</button>
<button class="btn btn-default">医院审核</button>
<button class="btn btn-default" onclick="openAuditModal()">医院审核</button>
</div>
<!-- 数据表格 -->
<div class="table-card">
<div class="table-card__header">
<div class="table-card__title">必检/选检项目配置</div>
<div class="table-card__title">单位体检项目审核</div>
</div>
<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><input type="checkbox" id="check-all" style="cursor:pointer;width:14px;height:14px;accent-color:var(--primary);vertical-align:middle;"></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>
<tr><td>1</td><td>45岁以上男性标准套餐</td><td>泾河医院</td><td>第一采油厂</td><td>2025</td><td></td><td>45岁及以上</td><td>2350.00</td><td><span class="tag tag-green">审核通过</span></td><td><span class="tag tag-green">已生成</span></td><td>2025-03-15 10:30</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" onclick="openEditDrawer(this)">编辑</span></td></tr>
<tr><td>2</td><td>35岁以下女性标准套餐</td><td>庆阳医院</td><td>第二采油厂</td><td>2025</td><td></td><td>35岁以下</td><td>2100.00</td><td><span class="tag tag-orange">待审核</span></td><td><span class="tag tag-green">已生成</span></td><td>2025-03-18 14:20</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" onclick="openEditDrawer(this)">编辑</span></td></tr>
<tr><td>3</td><td>35-45岁通用套餐</td><td>延安医院</td><td>第三采油厂</td><td>2025</td><td>通用</td><td>35-45岁</td><td>1800.00</td><td><span class="tag tag-red">已拒绝</span></td><td><span class="tag tag-orange">生成中</span></td><td></td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" onclick="openEditDrawer(this)">编辑</span></td></tr>
<tr><td>4</td><td>45岁及以上女性标准套餐</td><td>兴隆园医院</td><td>采油一厂</td><td>2025</td><td></td><td>45岁及以上</td><td>2280.00</td><td><span class="tag tag-gray">未提交</span></td><td><span class="tag tag-green">已生成</span></td><td>2025-03-20 09:15</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" onclick="openEditDrawer(this)">编辑</span></td></tr>
<tr data-reject-reason=""><td><input type="checkbox" class="row-check" style="cursor:pointer;width:14px;height:14px;accent-color:var(--primary);vertical-align:middle;"></td><td>1</td><td>45岁以上男性标准套餐</td><td>泾河医院</td><td>第一采油厂</td><td>2025</td><td></td><td>45岁及以上</td><td class="declared-fee">2200.00</td><td class="audit-status-cell"><span class="tag tag-green">审核通过</span></td><td class="effective-fee">2200.00</td><td><span class="tag tag-green">已生成</span></td><td>2025-03-15 10:30</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" data-action-link onclick="openSubmitDrawer(this)">修改并提交</span></td></tr>
<tr data-reject-reason=""><td><input type="checkbox" class="row-check" style="cursor:pointer;width:14px;height:14px;accent-color:var(--primary);vertical-align:middle;"></td><td>2</td><td>35岁以下女性标准套餐</td><td>庆阳医院</td><td>第二采油厂</td><td>2025</td><td></td><td>35岁以下</td><td class="declared-fee">2100.00</td><td class="audit-status-cell"><span class="tag tag-orange">待审核</span></td><td class="effective-fee"></td><td><span class="tag tag-green">已生成</span></td><td>2025-03-18 14:20</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" data-action-link onclick="openSubmitDrawer(this)">修改并重新提交</span></td></tr>
<tr data-reject-reason="部分项目费用超出医院承检范围,请核对后重新提交"><td><input type="checkbox" class="row-check" style="cursor:pointer;width:14px;height:14px;accent-color:var(--primary);vertical-align:middle;"></td><td>3</td><td>35-45岁通用套餐</td><td>延安医院</td><td>第三采油厂</td><td>2025</td><td>通用</td><td>35-45岁</td><td class="declared-fee">1800.00</td><td class="audit-status-cell"><span class="tag tag-red">已拒绝</span></td><td class="effective-fee"></td><td><span class="tag tag-orange">生成中</span></td><td></td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" data-action-link onclick="openSubmitDrawer(this)">修改并重新提交</span></td></tr>
<tr data-reject-reason=""><td><input type="checkbox" class="row-check" style="cursor:pointer;width:14px;height:14px;accent-color:var(--primary);vertical-align:middle;"></td><td>4</td><td>45岁及以上女性标准套餐</td><td>兴隆园医院</td><td>采油一厂</td><td>2025</td><td></td><td>45岁及以上</td><td class="declared-fee"></td><td class="audit-status-cell"><span class="tag tag-gray">未提交</span></td><td class="effective-fee"></td><td><span class="tag tag-green">已生成</span></td><td>2025-03-20 09:15</td><td><span class="link" onclick="openDetailDrawer(this)">详情</span> <span class="link" style="margin-left:8px;" data-action-link onclick="openSubmitDrawer(this)">提交审核</span></td></tr>
</tbody>
</table>
</div>
@@ -394,6 +400,8 @@
</div>
</div>
<div class="rejected-tip" id="rejected-tip" style="display:none;"></div>
<div class="tab-box">
<div class="tab-nav" id="detail-tab-nav">
<div class="tab-nav__item active" data-tab="required" onclick="switchDetailTab(this)">必检项目</div>
@@ -404,58 +412,57 @@
<div class="tab-nav__item" data-tab="cancer-ca724" onclick="switchDetailTab(this)">防癌筛查项目(CA724</div>
</div>
<div style="display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:12px 16px 0;">
<span class="form-label" id="detail-fee-label" style="margin-bottom:0;white-space:nowrap;">必选项目费用合计(元)</span>
<input class="form-input" id="detail-fee" disabled style="height:28px;width:120px;padding:0 8px;text-align:right;">
</div>
<div class="tab-panel active" id="dpanel-required">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-required"></tbody>
</table>
</div>
<div class="tab-panel" id="dpanel-optional">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-optional"></tbody>
</table>
</div>
<div class="tab-panel" id="dpanel-gyn-unmarried">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-gyn-unmarried"></tbody>
</table>
</div>
<div class="tab-panel" id="dpanel-gyn-married">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-gyn-married"></tbody>
</table>
</div>
<div class="tab-panel" id="dpanel-cancer-septin9">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-cancer-septin9"></tbody>
</table>
</div>
<div class="tab-panel" id="dpanel-cancer-ca724">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th></tr></thead>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="dtbody-cancer-ca724"></tbody>
</table>
</div>
</div>
<div class="form-row">
<div class="form-row" style="margin-top:16px;">
<div class="form-item">
<div class="form-label" id="detail-fee-label">项目费用合计(元</div>
<input class="form-input" id="detail-fee" disabled>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label">必检费用(元)</div>
<input class="form-input" id="detail-required-fee" disabled>
<div class="form-label">项目费用(已生效</div>
<div class="form-display" id="detail-effective-fee"></div>
</div>
<div class="form-item">
<div class="form-label">修改费用(元)</div>
<input class="form-input" id="detail-modify-fee" disabled>
<div class="form-label">本次提交费用(元)<span class="diff-badge" id="fee-diff" style="display:none;font-weight:400;"></span></div>
<input class="form-input" id="detail-submit-fee" disabled>
</div>
</div>
</div>
@@ -465,6 +472,120 @@
</div>
</div>
<!-- 医院费用审核弹窗 -->
<div class="modal-overlay" id="audit-modal-overlay" onclick="if(event.target===this)closeAuditModal()">
<div class="modal" style="width:820px;max-height:92vh;display:flex;flex-direction:column;">
<div class="modal__header">
<div class="modal__title">费用审核</div>
<button class="modal__close" onclick="closeAuditModal()"></button>
</div>
<div class="modal__body" style="overflow-y:auto;flex:1;">
<div class="form-row">
<div class="form-item">
<div class="form-label">项目组合名称</div>
<input class="form-input" id="audit-name" disabled>
</div>
<div class="form-item">
<div class="form-label">承检医院</div>
<input class="form-input" id="audit-hospital" disabled>
</div>
<div class="form-item">
<div class="form-label">单位</div>
<input class="form-input" id="audit-unit" disabled>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label">体检年份</div>
<input class="form-input" id="audit-year" disabled>
</div>
<div class="form-item">
<div class="form-label">性别</div>
<input class="form-input" id="audit-gender" disabled>
</div>
<div class="form-item">
<div class="form-label">年龄范围</div>
<input class="form-input" id="audit-age" disabled>
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label">本次提交费用(元)</div>
<input class="form-input" id="audit-declared" disabled>
</div>
<div class="form-item">
<div class="form-label">必检项目费用(已生效)</div>
<input class="form-input" id="audit-effective" disabled>
</div>
<div class="form-item" id="audit-diff-row">
<div class="form-label">与必检项目费用(已生效)差额(元)</div>
<div class="form-display" id="audit-diff"></div>
</div>
</div>
<div class="tab-box">
<div class="tab-nav" id="audit-tab-nav">
<div class="tab-nav__item active" data-tab="required" onclick="switchAuditTab(this)">必检项目</div>
<div class="tab-nav__item" data-tab="optional" onclick="switchAuditTab(this)">自选项目</div>
<div class="tab-nav__item" data-tab="gyn-unmarried" onclick="switchAuditTab(this)">妇科未婚项目</div>
<div class="tab-nav__item" data-tab="gyn-married" onclick="switchAuditTab(this)">妇科已婚项目</div>
<div class="tab-nav__item" data-tab="cancer-septin9" onclick="switchAuditTab(this)">防癌筛查项目(Septin9</div>
<div class="tab-nav__item" data-tab="cancer-ca724" onclick="switchAuditTab(this)">防癌筛查项目(CA724</div>
</div>
<div style="display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:12px 16px 0;">
<span class="form-label" id="audit-fee-label" style="margin-bottom:0;white-space:nowrap;">必选项目费用合计(元)</span>
<input class="form-input" id="audit-fee-total" disabled style="height:28px;width:120px;padding:0 8px;text-align:right;">
</div>
<div class="tab-panel active" id="apanel-required">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-required"></tbody>
</table>
</div>
<div class="tab-panel" id="apanel-optional">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-optional"></tbody>
</table>
</div>
<div class="tab-panel" id="apanel-gyn-unmarried">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-gyn-unmarried"></tbody>
</table>
</div>
<div class="tab-panel" id="apanel-gyn-married">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-gyn-married"></tbody>
</table>
</div>
<div class="tab-panel" id="apanel-cancer-septin9">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-cancer-septin9"></tbody>
</table>
</div>
<div class="tab-panel" id="apanel-cancer-ca724">
<table>
<thead><tr><th>体检项目</th><th>项目编码</th><th>项目标记</th><th>体检项目费用(元)</th></tr></thead>
<tbody id="atbody-cancer-ca724"></tbody>
</table>
</div>
</div>
<div class="form-item" style="margin-top:16px;margin-bottom:0;">
<div class="form-label"><span class="required">*</span> 拒绝原因(拒绝时必填)</div>
<input class="form-input" id="audit-reason" placeholder="请输入拒绝原因">
</div>
</div>
<div class="modal__footer">
<button class="btn btn-danger" id="audit-reject-btn" onclick="doAudit(false)">拒绝</button>
<button class="btn btn-primary" id="audit-pass-btn" onclick="doAudit(true)">审核通过</button>
</div>
</div>
</div>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
@@ -573,43 +694,45 @@ function saveGenerate(){
/* ===== 项目组合详情抽屉 ===== */
var detailProjects = {
'required': [
{name:'血常规', code:'BLD-003', mark:'重点项目'},
{name:'尿常规', code:'URI-010', mark:'一般项目'},
{name:'心电图', code:'ECG-004', mark:'重点项目'},
{name:'胸部X光', code:'XRY-005', mark:'重点项目'},
{name:'腹部彩超', code:'BUS-002', mark:'重点项目'},
{name:'空腹血糖', code:'GLU-008', mark:'一般项目'}
{name:'血常规', code:'BLD-003', mark:'重点项目', fee:'30.00'},
{name:'尿常规', code:'URI-010', mark:'一般项目', fee:'25.00'},
{name:'心电图', code:'ECG-004', mark:'重点项目', fee:'60.00'},
{name:'胸部X光', code:'XRY-005', mark:'重点项目', fee:'80.00'},
{name:'腹部彩超', code:'BUS-002', mark:'重点项目', fee:'120.00'},
{name:'空腹血糖', code:'GLU-008', mark:'一般项目', fee:'20.00'}
],
'optional': [
{name:'经颅多普勒', code:'TCD-001', mark:'一般项目'},
{name:'骨密度检测', code:'BMD-012', mark:'一般项目'},
{name:'幽门螺杆菌检测', code:'HP-013', mark:'一般项目'}
{name:'经颅多普勒', code:'TCD-001', mark:'一般项目', fee:'150.00'},
{name:'骨密度检测', code:'BMD-012', mark:'一般项目', fee:'180.00'},
{name:'幽门螺杆菌检测', code:'HP-013', mark:'一般项目', fee:'100.00'}
],
'gyn-unmarried': [
{name:'乳腺彩超', code:'MAM-014', mark:'重点项目'},
{name:'盆腔彩超(未婚)', code:'PEL-015', mark:'重点项目'}
{name:'乳腺彩超', code:'MAM-014', mark:'重点项目', fee:'120.00'},
{name:'盆腔彩超(未婚)', code:'PEL-015', mark:'重点项目', fee:'110.00'}
],
'gyn-married': [
{name:'乳腺彩超', code:'MAM-014', mark:'重点项目'},
{name:'宫颈TCT', code:'TCT-016', mark:'重点项目'},
{name:'HPV检测', code:'HPV-017', mark:'重点项目'}
{name:'乳腺彩超', code:'MAM-014', mark:'重点项目', fee:'120.00'},
{name:'宫颈TCT', code:'TCT-016', mark:'重点项目', fee:'160.00'},
{name:'HPV检测', code:'HPV-017', mark:'重点项目', fee:'220.00'}
],
'cancer-septin9': [
{name:'结直肠癌Septin9基因甲基化检测', code:'SEP-018', mark:'重点项目'}
{name:'结直肠癌Septin9基因甲基化检测', code:'SEP-018', mark:'重点项目', fee:'680.00'}
],
'cancer-ca724': [
{name:'胃癌CA724标志物检测', code:'CA7-019', mark:'重点项目'}
{name:'胃癌CA724标志物检测', code:'CA7-019', mark:'重点项目', fee:'260.00'}
]
};
function renderDetailTabs(){
Object.keys(detailProjects).forEach(function(key){
var tbody = document.getElementById('dtbody-' + key);
tbody.innerHTML = '';
detailProjects[key].forEach(function(p){
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + p.name + '</td><td>' + p.code + '</td><td>' + p.mark + '</td>';
tbody.appendChild(tr);
['dtbody-', 'atbody-'].forEach(function(prefix){
var tbody = document.getElementById(prefix + key);
tbody.innerHTML = '';
detailProjects[key].forEach(function(p){
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + p.name + '</td><td>' + p.code + '</td><td>' + p.mark + '</td><td>' + p.fee + '</td>';
tbody.appendChild(tr);
});
});
});
}
@@ -627,9 +750,28 @@ function switchDetailTab(el){
}else{
feeLabel.textContent = '必选项目费用合计(元)';
}
var sum = detailProjects[key].reduce(function(s, p){ return s + Number(p.fee); }, 0);
document.getElementById('detail-fee').value = sum.toFixed(2);
}
/* 审核弹窗 Tab:数据与详情抽屉一致 */
function switchAuditTab(el){
document.querySelectorAll('#audit-tab-nav .tab-nav__item').forEach(function(t){ t.classList.remove('active'); });
el.classList.add('active');
var key = el.dataset.tab;
document.querySelectorAll('#audit-modal-overlay .tab-panel').forEach(function(p){ p.classList.remove('active'); });
document.getElementById('apanel-' + key).classList.add('active');
var feeLabel = document.getElementById('audit-fee-label');
if(key === 'cancer-septin9' || key === 'cancer-ca724'){
feeLabel.textContent = '防癌筛查项目费用合计(元)';
}else{
feeLabel.textContent = '必选项目费用合计(元)';
}
var sum = detailProjects[key].reduce(function(s, p){ return s + Number(p.fee); }, 0);
document.getElementById('audit-fee-total').value = sum.toFixed(2);
}
var editRow = null;
var drawerEditMode = false;
function renderStatusTag(status){
var map = {
@@ -639,28 +781,37 @@ function renderStatusTag(status){
return '<span class="tag ' + (map[status] || 'tag-gray') + '">' + status + '</span>';
}
/* 操作按钮文案随费用审核状态联动 */
function actionText(status){
return { '审核通过':'修改并提交', '待审核':'修改并重新提交', '已拒绝':'修改并重新提交', '未提交':'提交审核' }[status] || '提交审核';
}
function refreshRowLinks(tr, status){
var link = tr.querySelector('[data-action-link]');
if(link) link.textContent = actionText(status);
}
function openDetailDrawer(btn){
populateDrawer(btn.closest('tr'), false);
}
function openEditDrawer(btn){
function openSubmitDrawer(btn){
populateDrawer(btn.closest('tr'), true);
}
function populateDrawer(tr, editMode){
editRow = tr;
drawerEditMode = editMode;
var cells = tr.cells;
var gender = cells[5].textContent.trim();
var auditStatus = cells[8].textContent.trim();
document.getElementById('detail-name').value = cells[1].textContent.trim();
document.getElementById('detail-hospital').value = cells[2].textContent.trim();
document.getElementById('detail-unit').value = cells[3].textContent.trim();
document.getElementById('detail-year').value = cells[4].textContent.trim();
var gender = cells[6].textContent.trim();
var auditStatus = cells[9].textContent.trim();
var effectiveText = cells[10].textContent.trim();
var declaredText = cells[8].textContent.trim();
document.getElementById('detail-name').value = cells[2].textContent.trim();
document.getElementById('detail-hospital').value = cells[3].textContent.trim();
document.getElementById('detail-unit').value = cells[4].textContent.trim();
document.getElementById('detail-year').value = cells[5].textContent.trim();
document.getElementById('detail-gender').value = gender;
document.getElementById('detail-age').value = cells[6].textContent.trim();
document.getElementById('detail-fee').value = cells[7].textContent.trim() + ' 元';
document.getElementById('detail-required-fee').value = '2200.00 元';
document.getElementById('detail-modify-fee').value = '150.00 元';
document.getElementById('detail-age').value = cells[7].textContent.trim();
document.getElementById('detail-audit-status').innerHTML = renderStatusTag(auditStatus);
document.getElementById('detail-gen-status').innerHTML = renderStatusTag(cells[9].textContent.trim());
document.getElementById('detail-gen-status').innerHTML = renderStatusTag(cells[11].textContent.trim());
var femaleFeeRow = document.getElementById('female-fee-row');
if(gender === '女'){
femaleFeeRow.style.display = '';
@@ -668,36 +819,151 @@ function populateDrawer(tr, editMode){
}else{
femaleFeeRow.style.display = 'none';
}
var modifyInput = document.getElementById('detail-modify-fee');
var submitBtn = document.getElementById('submit-audit-btn');
if(editMode && auditStatus === '未提交'){
modifyInput.disabled = false;
modifyInput.value = '150.00';
submitBtn.style.display = '';
var effectiveNum = effectiveText === '—' ? null : Number(effectiveText);
document.getElementById('detail-effective-fee').textContent = effectiveNum === null ? '—' : effectiveText + ' 元';
var rejectedTip = document.getElementById('rejected-tip');
if(auditStatus === '已拒绝'){
rejectedTip.style.display = 'flex';
rejectedTip.innerHTML = '<span></span><span>费用审核未通过:' + (tr.dataset.rejectReason || '请核对费用后重新提交') + ',请修改费用后重新提交审核。</span>';
}else{
modifyInput.disabled = true;
modifyInput.value = '150.00 元';
rejectedTip.style.display = 'none';
}
var submitInput = document.getElementById('detail-submit-fee');
var submitBtn = document.getElementById('submit-audit-btn');
if(editMode){
submitInput.disabled = false;
submitBtn.style.display = '';
if(auditStatus === '未提交'){
submitInput.value = '';
submitInput.placeholder = '请录入必检项目费用';
}else if(auditStatus === '审核通过'){
submitInput.value = effectiveNum.toFixed(2);
submitInput.placeholder = '修改后需重新提交审核';
}else{
submitInput.value = declaredText === '—' ? '' : declaredText;
submitInput.placeholder = '';
}
}else{
submitInput.disabled = true;
submitInput.placeholder = '';
submitInput.value = declaredText === '—' ? '—' : declaredText + ' 元';
submitBtn.style.display = 'none';
}
renderFeeDiff();
switchDetailTab(document.querySelector('#detail-tab-nav .tab-nav__item[data-tab="required"]'));
document.getElementById('detail-drawer').classList.add('open');
document.getElementById('detail-overlay').classList.add('open');
}
/* 必检项目费用(已生效) vs 本次提交费用 差额徽章 */
function renderFeeDiff(){
var badge = document.getElementById('fee-diff');
var input = document.getElementById('detail-submit-fee');
var effTd = editRow ? editRow.querySelector('.effective-fee') : null;
var effText = effTd ? effTd.textContent.trim() : '—';
var eff = effText === '—' ? NaN : Number(effText);
var val = parseFloat(input.value);
if(!drawerEditMode || isNaN(eff) || isNaN(val)){
badge.style.display = 'none';
badge.className = 'diff-badge';
return;
}
var diff = val - eff;
if(diff > 0.005){
badge.style.display = '';
badge.textContent = '较已生效 +' + diff.toFixed(2);
badge.className = 'diff-badge diff-up';
}else if(diff < -0.005){
badge.style.display = '';
badge.textContent = '较已生效 ' + diff.toFixed(2);
badge.className = 'diff-badge diff-down';
}else{
badge.style.display = 'none';
badge.className = 'diff-badge';
}
}
function closeDetailDrawer(){
document.getElementById('detail-drawer').classList.remove('open');
document.getElementById('detail-overlay').classList.remove('open');
}
document.getElementById('detail-submit-fee').addEventListener('input', renderFeeDiff);
/* ===== 提交审核 ===== */
function submitAudit(){
var modifyInput = document.getElementById('detail-modify-fee');
var val = modifyInput.value.trim();
if(!val || isNaN(Number(val)) || Number(val) < 0){ alert('请输入正确的修改费用'); return; }
modifyInput.value = Number(val).toFixed(2) + ' 元';
if(editRow){
editRow.cells[8].innerHTML = '<span class="tag tag-orange">待审核</span>';
}
alert('已提交审核(原型演示)');
var input = document.getElementById('detail-submit-fee');
var val = input.value.trim();
if(!val || isNaN(Number(val)) || Number(val) < 0){ alert('请输入正确的费用金额'); return; }
editRow.querySelector('.declared-fee').textContent = Number(val).toFixed(2);
editRow.cells[9].innerHTML = renderStatusTag('待审核');
refreshRowLinks(editRow, '待审核');
alert('已提交审核,等待医院勾选后点击「医院审核」进行处理(原型演示)');
closeDetailDrawer();
}
/* ===== 医院费用审核:勾选条目后点顶部「医院审核」 ===== */
var auditRow = null;
var checkAll = document.getElementById('check-all');
checkAll.addEventListener('click', function(){
document.querySelectorAll('.row-check').forEach(function(c){ c.checked = checkAll.checked; });
});
document.querySelectorAll('.row-check').forEach(function(c){
c.addEventListener('change', function(){
var all = document.querySelectorAll('.row-check');
var checked = document.querySelectorAll('.row-check:checked');
checkAll.checked = all.length > 0 && checked.length === all.length;
checkAll.indeterminate = checked.length > 0 && checked.length < all.length;
});
});
function openAuditModal(){
var checked = Array.prototype.slice.call(document.querySelectorAll('.row-check:checked'));
if(checked.length !== 1){ alert('请在表格中勾选一条待审核的记录'); return; }
var tr = checked[0].closest('tr');
if(tr.querySelector('.audit-status-cell').textContent.trim() !== '待审核'){ alert('仅「待审核」状态的费用可进行审核'); return; }
auditRow = tr;
var effText = tr.querySelector('.effective-fee').textContent.trim();
var declared = tr.querySelector('.declared-fee').textContent.trim();
document.getElementById('audit-name').value = tr.cells[2].textContent.trim();
document.getElementById('audit-hospital').value = tr.cells[3].textContent.trim();
document.getElementById('audit-unit').value = tr.cells[4].textContent.trim();
document.getElementById('audit-year').value = tr.cells[5].textContent.trim();
document.getElementById('audit-gender').value = tr.cells[6].textContent.trim();
document.getElementById('audit-age').value = tr.cells[7].textContent.trim();
document.getElementById('audit-declared').value = declared + ' 元';
document.getElementById('audit-effective').value = effText === '—' ? '—(首次申报)' : effText + ' 元';
var diffRow = document.getElementById('audit-diff-row');
if(effText === '—'){
diffRow.style.display = 'none';
}else{
diffRow.style.display = '';
var d = Number(declared) - Number(effText);
var el = document.getElementById('audit-diff');
if(d > 0.005) el.innerHTML = '<span style="color:var(--warning);font-weight:600;">+' + d.toFixed(2) + ' 元</span>';
else if(d < -0.005) el.innerHTML = '<span style="color:var(--success);font-weight:600;">' + d.toFixed(2) + ' </span>';
else el.innerHTML = '<span style="color:var(--text-placeholder);">0.00 元(无变化)</span>';
}
document.getElementById('audit-reason').value = '';
switchAuditTab(document.querySelector('#audit-tab-nav .tab-nav__item[data-tab="required"]'));
document.getElementById('audit-modal-overlay').classList.add('open');
}
function closeAuditModal(){
document.getElementById('audit-modal-overlay').classList.remove('open');
}
function doAudit(pass){
var reason = document.getElementById('audit-reason').value.trim();
if(!pass){
if(!reason){ alert('请填写拒绝原因'); return; }
auditRow.cells[9].innerHTML = renderStatusTag('已拒绝');
auditRow.dataset.rejectReason = reason;
}else{
auditRow.cells[9].innerHTML = renderStatusTag('审核通过');
auditRow.querySelector('.effective-fee').textContent = auditRow.querySelector('.declared-fee').textContent.trim();
auditRow.dataset.rejectReason = '';
}
refreshRowLinks(auditRow, pass ? '审核通过' : '已拒绝');
auditRow.querySelector('.row-check').checked = false;
checkAll.checked = false;
checkAll.indeterminate = false;
closeAuditModal();
}
</script>
</body>
</html>
@@ -161,7 +161,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item active">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
+1 -1
View File
@@ -263,7 +263,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
+5 -18
View File
@@ -136,7 +136,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -182,8 +182,10 @@
<!-- 筛选栏 -->
<div class="filter-bar">
<div class="filter-item">
<label>体检年度</label>
<select class="filter-select quota-year"></select>
<label>性别</label>
<select class="filter-select" style="min-width:90px;">
<option>请选择</option><option></option><option></option>
</select>
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
@@ -232,21 +234,6 @@ function toggleSubgroup(header){
var sub=active.closest('.sidebar-subgroup');
while(sub){ sub.classList.add('open'); sub=sub.parentElement.closest('.sidebar-subgroup'); }
})();
/* 体检年度默认当年 */
(function(){
var year = new Date().getFullYear();
document.querySelectorAll('.quota-year').forEach(function(sel){
sel.innerHTML = '';
for(var y = year - 3; y <= year + 1; y++){
var opt = document.createElement('option');
opt.value = y;
opt.textContent = y + '年';
if(y === year) opt.selected = true;
sel.appendChild(opt);
}
});
})();
</script>
</body>
</html>
@@ -165,7 +165,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -295,13 +295,6 @@
<div class="form-label"><span class="required">*</span> 体检额度(元)</div>
<input class="form-input" id="quota-amount" type="number" min="0" step="0.01" placeholder="请输入体检额度">
</div>
<div class="form-item">
<div class="form-label">是否手动输入</div>
<div class="switch-row">
<div class="switch" id="quota-manual" onclick="toggleQuotaSwitch(this)"></div>
<span class="switch-label" id="quota-manual-label"></span>
</div>
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeQuotaModal()">取消</button>
@@ -333,10 +326,6 @@ function openQuotaModal(btn){
document.getElementById('quota-code').textContent = cells[2].textContent.trim();
document.getElementById('quota-unit').textContent = cells[6].textContent.trim() + ' / ' + cells[7].textContent.trim();
document.getElementById('quota-amount').value = cells[8].textContent.trim();
var manual = cells[9].textContent.trim() === '是';
var sw = document.getElementById('quota-manual');
sw.classList.toggle('on', manual);
document.getElementById('quota-manual-label').textContent = manual ? '是' : '否';
document.getElementById('quota-modal-overlay').classList.add('open');
}
@@ -344,20 +333,11 @@ function closeQuotaModal(){
document.getElementById('quota-modal-overlay').classList.remove('open');
}
function toggleQuotaSwitch(el){
el.classList.toggle('on');
document.getElementById('quota-manual-label').textContent = el.classList.contains('on') ? '是' : '否';
}
function saveQuota(){
if(!quotaTr) return;
var amount = document.getElementById('quota-amount').value.trim();
if(!amount || Number(amount) < 0){ alert('请输入正确的体检额度'); return; }
var formatted = Number(amount).toFixed(2);
var manual = document.getElementById('quota-manual').classList.contains('on');
var cells = quotaTr.cells;
cells[8].textContent = formatted;
cells[9].textContent = manual ? '是' : '否';
quotaTr.cells[8].textContent = Number(amount).toFixed(2);
closeQuotaModal();
}
</script>
@@ -203,7 +203,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -319,7 +319,6 @@
<button class="btn btn-default">查看导出任务</button>
<button class="btn btn-default">批量导入人员</button>
<button class="btn btn-default">查看导入任务</button>
<button class="btn btn-default">自动添加本单位防癌筛查人员</button>
<button class="btn btn-danger">批量删除</button>
</div>
@@ -332,7 +331,7 @@
<table>
<thead>
<tr>
<th rowspan="2">序号</th><th rowspan="2" class="col-1">姓名</th><th rowspan="2" class="col-2">员工编号</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">身份证号</th><th rowspan="2">手机号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">体检年度</th><th rowspan="2">体检计划</th><th rowspan="2">体检计划单位</th><th rowspan="2">防癌筛查类型</th><th colspan="7">上一检查情况</th><th rowspan="2" class="op-col">操作</th>
<th rowspan="2">序号</th><th rowspan="2" class="col-1">姓名</th><th rowspan="2" class="col-2">员工编号</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">身份证号</th><th rowspan="2">手机号</th><th rowspan="2">单位</th><th rowspan="2">部门</th><th rowspan="2">体检年度</th><th rowspan="2">体检计划</th><th rowspan="2">体检计划单位</th><th rowspan="2">防癌筛查类型</th><th colspan="7">上一检查情况</th><th rowspan="2" class="op-col">操作</th>
</tr>
<tr>
<th>防癌检查年份</th><th>Septin9是否已检</th><th>Septin9检查异常</th><th>Septin9项目值</th><th>CA724是否已检</th><th>CA724检查异常</th><th>CA724项目值</th>
@@ -190,7 +190,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -206,7 +206,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -190,7 +190,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -110,6 +110,11 @@
.form-row{display:flex;gap:16px;}
.form-row .form-item{flex:1;}
.form-section-title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin:4px 0 16px;padding-left:8px;border-left:3px solid var(--primary);}
/* 员工基本信息卡片 */
.person-info{background:#F5F7FA;border-radius:var(--radius-sm);padding:12px 14px;margin-bottom:20px;display:flex;flex-wrap:wrap;gap:8px 28px;}
.person-info__item{font-size:var(--font-sm);}
.person-info__item label{color:var(--text-secondary);}
.person-info__item span{color:var(--text-primary);font-weight:500;}
/* 人员选择弹窗 */
.pick-modal{width:1120px;max-width:96vw;}
.pick-filter{display:grid;grid-template-columns:repeat(4,1fr);gap:12px 16px;margin-bottom:16px;}
@@ -201,7 +206,7 @@
<a href="pre-item-unit-fee.html" class="sidebar-item">单位体检项目费用</a>
<a href="pre-item-combo-template.html" class="sidebar-item">体检项目组合模板</a>
<a href="pre-item-exception.html" class="sidebar-item">组合模板例外配置</a>
<a href="pre-item-required.html" class="sidebar-item">必检/选检项目配置</a>
<a href="pre-item-required.html" class="sidebar-item">单位体检项目审核</a>
</div>
</div>
<div class="sidebar-subgroup">
@@ -324,7 +329,6 @@
<button class="btn btn-default">查看导出任务</button>
<button class="btn btn-default">批量导入人员</button>
<button class="btn btn-default">查看导入任务</button>
<button class="btn btn-default">自动添加本单位职业检查人员</button>
<button class="btn btn-danger">批量删除</button>
</div>
@@ -334,11 +338,11 @@
<table>
<thead>
<tr>
<th class="col-1">序号</th><th class="col-2">姓名</th><th class="col-3">员工编号</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 class="op-col">操作</th>
<th class="col-1">序号</th><th class="col-2">姓名</th><th class="col-3">员工编号</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 class="op-col">操作</th>
</tr>
</thead>
<tbody>
<tr><td class="col-1">1</td><td class="col-2">贾彬</td><td class="col-3">50500790</td><td></td><td>36</td><td>411330199001260043</td><td>13912345678</td><td>CQ工程设计有限公司</td><td>建筑设计部</td><td>2026</td><td>第二采气厂2026年员...</td><td>热力司炉工</td><td>合同制B</td><td>1994-09-01</td><td>2000-05-01</td><td>在岗期间</td><td>未体检</td><td>宁夏宝石花医院</td><td>噪声,一氧化碳</td><td class="op-col"><span class="link" style="color:var(--danger);">删除</span></td></tr>
<tr><td class="col-1">1</td><td class="col-2">贾彬</td><td class="col-3">50500790</td><td></td><td>36</td><td>411330199001260043</td><td>13912345678</td><td>CQ工程设计有限公司</td><td>建筑设计部</td><td>热力司炉工</td><td>合同制B</td><td>1994-09-01</td><td>2000-05-01</td><td>在岗期间</td><td>噪声,一氧化碳</td><td>未体检</td><td>宁夏宝石花医院</td><td>2026</td><td>第二采气厂2026年员...</td><td class="op-col"><span class="link" onclick="openEditModal(this)">编辑</span> <span class="link" style="color:var(--danger);margin-left:8px;" onclick="deleteRow(this)">删除</span></td></tr>
</tbody>
</table>
</div>
@@ -429,6 +433,51 @@
</div>
</div>
<!-- 编辑职业检查人员信息弹窗 -->
<div class="modal-overlay" id="edit-modal" onclick="if(event.target===this)closeEditModal()">
<div class="modal">
<div class="modal__header">
<div class="modal__title">编辑职业检查人员信息</div>
<button class="modal__close" onclick="closeEditModal()"></button>
</div>
<div class="modal__body">
<div class="person-info">
<div class="person-info__item"><label>姓名:</label><span id="edit-name"></span></div>
<div class="person-info__item"><label>身份证号:</label><span id="edit-idcard"></span></div>
<div class="person-info__item"><label>单位部门:</label><span id="edit-unit"></span></div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 入职时间</div>
<input class="form-input" id="edit-entry-date" type="date">
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 接害日期</div>
<input class="form-input" id="edit-hazard-date" type="date">
</div>
</div>
<div class="form-row">
<div class="form-item">
<div class="form-label"><span class="required">*</span> 体检形式</div>
<select class="form-select" id="edit-exam-form"></select>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 工种</div>
<select class="form-select" id="edit-job-type"></select>
</div>
</div>
<div class="form-item">
<div class="form-label"><span class="required">*</span> 危害因素</div>
<select class="form-select" id="edit-hazard-factor"></select>
</div>
</div>
<div class="modal__footer">
<button class="btn btn-default" onclick="closeEditModal()">取消</button>
<button class="btn btn-primary" onclick="saveEdit()">确认保存</button>
</div>
</div>
</div>
<script>
/* 侧边栏展开/折叠交互 */
function toggleSubgroup(header){
@@ -459,6 +508,61 @@ function deleteRow(el){
renumberRows();
}
/* ===== 编辑职业检查人员信息弹窗 ===== */
var examFormOptions = ['在岗期间','上岗前','离岗后','离岗时','应急健康检查'];
var jobTypeOptions = ['热力司炉工','采气工','化验工','行政专员','机修工','结构工程师'];
var hazardFactorOptions = ['噪声','一氧化碳','硫化氢','苯','电焊烟尘','粉尘','高温'];
/* 列表列索引 */
var COL = { name:1, idcard:5, unit:7, dept:8, jobType:9, entryDate:11, hazardDate:12, examForm:13, hazardFactor:14 };
var editTr = null;
function fillSelect(sel, options, current){
var html = '';
var merged = options.slice();
if(current && merged.indexOf(current) === -1) merged.unshift(current);
merged.forEach(function(v){
html += '<option value="' + v + '"' + (v === current ? ' selected' : '') + '>' + v + '</option>';
});
sel.innerHTML = html;
}
function openEditModal(el){
editTr = el.closest('tr');
var cells = editTr.cells;
document.getElementById('edit-name').textContent = cells[COL.name].textContent.trim();
document.getElementById('edit-idcard').textContent = cells[COL.idcard].textContent.trim();
document.getElementById('edit-unit').textContent = cells[COL.unit].textContent.trim() + ' / ' + cells[COL.dept].textContent.trim();
document.getElementById('edit-entry-date').value = cells[COL.entryDate].textContent.trim();
document.getElementById('edit-hazard-date').value = cells[COL.hazardDate].textContent.trim();
fillSelect(document.getElementById('edit-exam-form'), examFormOptions, cells[COL.examForm].textContent.trim());
fillSelect(document.getElementById('edit-job-type'), jobTypeOptions, cells[COL.jobType].textContent.trim());
fillSelect(document.getElementById('edit-hazard-factor'), hazardFactorOptions, cells[COL.hazardFactor].textContent.trim());
document.getElementById('edit-modal').classList.add('open');
}
function closeEditModal(){
document.getElementById('edit-modal').classList.remove('open');
}
function saveEdit(){
if(!editTr) return;
var entry = document.getElementById('edit-entry-date').value;
var hazard = document.getElementById('edit-hazard-date').value;
var examForm = document.getElementById('edit-exam-form').value;
var jobType = document.getElementById('edit-job-type').value;
var hazardFactor = document.getElementById('edit-hazard-factor').value;
if(!entry){ alert('请选择入职时间'); return; }
if(!hazard){ alert('请选择接害日期'); return; }
if(!examForm){ alert('请选择体检形式'); return; }
if(!jobType){ alert('请选择工种'); return; }
if(!hazardFactor){ alert('请选择危害因素'); return; }
var cells = editTr.cells;
cells[COL.entryDate].textContent = entry;
cells[COL.hazardDate].textContent = hazard;
cells[COL.examForm].textContent = examForm;
cells[COL.jobType].textContent = jobType;
cells[COL.hazardFactor].textContent = hazardFactor;
closeEditModal();
}
/* ===== 添加本次职业检查人员弹窗 ===== */
var candidateData = [
{code:'50501234', name:'陈晨', idcard:'411330198802150025', phone:'13891234567', gender:'女', age:'41', ageRange:'40-50', unit:'CQ工程设计有限公司', dept:'建筑设计部', jobType:'热力司炉工', empForm:'合同制B', entryDate:'1994-09-01', hazardDate:'2000-05-01', examForm:'在岗期间', sysStatus:'未体检', hospital:'宁夏宝石花医院', hazardFactor:'噪声,一氧化碳'},
@@ -623,17 +727,17 @@ function saveAddModal(){
'<td>' + c.phone + '</td>' +
'<td>' + c.unit + '</td>' +
'<td>' + c.dept + '</td>' +
'<td>2026</td>' +
'<td>2026年度职业体检</td>' +
'<td>' + c.jobType + '</td>' +
'<td>' + c.empForm + '</td>' +
'<td>' + c.entryDate + '</td>' +
'<td>' + c.hazardDate + '</td>' +
'<td>' + c.examForm + '</td>' +
'<td>' + c.hazardFactor + '</td>' +
'<td>' + c.sysStatus + '</td>' +
'<td>' + c.hospital + '</td>' +
'<td>' + c.hazardFactor + '</td>' +
'<td class="op-col"><span class="link" style="color:var(--danger);" onclick="deleteRow(this)">删除</span></td>';
'<td>2026</td>' +
'<td>2026年度职业体检</td>' +
'<td class="op-col"><span class="link" onclick="openEditModal(this)">编辑</span> <span class="link" style="color:var(--danger);margin-left:8px;" onclick="deleteRow(this)">删除</span></td>';
tbody.insertBefore(tr, tbody.firstChild);
});
renumberRows();