feat: 一线医疗身份证与联系电话去除脱敏 · 员工分配统计概览卡改员工口径
- 全站演示数据身份证号与联系电话由脱敏改为完整展示 - config-allocate-stat 概览卡改为员工总数量/已分配/未分配三卡,名册统计文案上移 - 同步更新 CHANGELOG
This commit is contained in:
@@ -359,20 +359,20 @@ var dormMeta=[
|
||||
{name:'401室',building:'靖边气田倒班宿舍楼',beds:4},
|
||||
{name:'402室',building:'靖边气田倒班宿舍楼',beds:2}
|
||||
];
|
||||
/* empPool:与全站演示数据共享的员工池(已脱敏) */
|
||||
/* empPool:与全站演示数据共享的员工池 */
|
||||
var empPool=[
|
||||
{no:'CQ021578',name:'石维国',org:'采油一厂',depart:'樊学作业区',phone:'139****3456'},
|
||||
{no:'CQ032144',name:'李桂芳',org:'采油一厂',depart:'樊学作业区',phone:'139****7788'},
|
||||
{no:'CQ045130',name:'杨慧敏',org:'采油一厂',depart:'麻子山作业区',phone:'139****5012'},
|
||||
{no:'CQ019203',name:'曲志明',org:'采油一厂',depart:'樊学作业区',phone:'139****7208'},
|
||||
{no:'CQ033096',name:'赵万福',org:'采油二厂',depart:'桐园作业区',phone:'139****6630'},
|
||||
{no:'CQ027710',name:'张秀兰',org:'采油二厂',depart:'姬圪台作业区',phone:'139****4415'},
|
||||
{no:'CQ010564',name:'高建军',org:'第四采油厂',depart:'西峰作业区',phone:'139****4320'},
|
||||
{no:'CQ041822',name:'闫婷',org:'第四采油厂',depart:'西峰作业区',phone:'139****4531'},
|
||||
{no:'CQ036441',name:'刘玉梅',org:'采气一厂',depart:'靖边气田',phone:'139****3745'},
|
||||
{no:'CQ029905',name:'呼建国',org:'采气一厂',depart:'靖边气田',phone:'139****3870'},
|
||||
{no:'CQ044871',name:'白瑞',org:'采气一厂',depart:'靖边气田(轮训)',phone:'139****2317'},
|
||||
{no:'CQ022317',name:'徐立成',org:'第四采油厂',depart:'西峰作业区(轮训)',phone:'139****4906'}
|
||||
{no:'CQ021578',name:'石维国',org:'采油一厂',depart:'樊学作业区',phone:'13961153456'},
|
||||
{no:'CQ032144',name:'李桂芳',org:'采油一厂',depart:'樊学作业区',phone:'13927127788'},
|
||||
{no:'CQ045130',name:'杨慧敏',org:'采油一厂',depart:'麻子山作业区',phone:'13941215012'},
|
||||
{no:'CQ019203',name:'曲志明',org:'采油一厂',depart:'樊学作业区',phone:'13989577208'},
|
||||
{no:'CQ033096',name:'赵万福',org:'采油二厂',depart:'桐园作业区',phone:'13969296630'},
|
||||
{no:'CQ027710',name:'张秀兰',org:'采油二厂',depart:'姬圪台作业区',phone:'13943704415'},
|
||||
{no:'CQ010564',name:'高建军',org:'第四采油厂',depart:'西峰作业区',phone:'13941064320'},
|
||||
{no:'CQ041822',name:'闫婷',org:'第四采油厂',depart:'西峰作业区',phone:'13900024531'},
|
||||
{no:'CQ036441',name:'刘玉梅',org:'采气一厂',depart:'靖边气田',phone:'13986823745'},
|
||||
{no:'CQ029905',name:'呼建国',org:'采气一厂',depart:'靖边气田',phone:'13920263870'},
|
||||
{no:'CQ044871',name:'白瑞',org:'采气一厂',depart:'靖边气田(轮训)',phone:'13928272317'},
|
||||
{no:'CQ022317',name:'徐立成',org:'第四采油厂',depart:'西峰作业区(轮训)',phone:'13937154906'}
|
||||
];
|
||||
/* 床位→员工分配(key=楼栋|床位编号) */
|
||||
var assigns={
|
||||
|
||||
@@ -253,15 +253,15 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
var curTab='in';
|
||||
/* 员工档案简版:供工单详情「员工信息」区块取数 */
|
||||
var empProfiles={
|
||||
'CQ021578':{name:'石维国',sex:'男',age:52,unit:'采油一厂',dept:'樊学作业区',phone:'182****3367',chronic:'高血压(2级)'},
|
||||
'CQ032144':{name:'李桂芳',sex:'女',age:47,unit:'采油一厂',dept:'樊学作业区',phone:'137****2208',chronic:'无明确慢性病史'},
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:58,unit:'采油二厂',dept:'桐园作业区',phone:'158****6620',chronic:'高血压(3级)、2型糖尿病'},
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:44,unit:'采气一厂',dept:'靖边气田',phone:'188****9032',chronic:'无明确慢性病史'},
|
||||
'CQ010564':{name:'高建军',sex:'男',age:55,unit:'第四采油厂',dept:'西峰作业区',phone:'135****4471',chronic:'颈椎病史、高脂血症'},
|
||||
'CQ045130':{name:'杨慧敏',sex:'女',age:38,unit:'采油一厂',dept:'麻子山作业区',phone:'176****5583',chronic:'无明确慢性病史'},
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:50,unit:'第四采油厂',dept:'西峰作业区',phone:'139****2760',chronic:'冠心病'},
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:49,unit:'采油二厂',dept:'桐园作业区',phone:'150****8819',chronic:'慢性支气管炎'},
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:53,unit:'采气一厂',dept:'靖边气田',phone:'187****3345',chronic:'支气管哮喘'}
|
||||
'CQ021578':{name:'石维国',sex:'男',age:52,unit:'采油一厂',dept:'樊学作业区',phone:'18238083367',chronic:'高血压(2级)'},
|
||||
'CQ032144':{name:'李桂芳',sex:'女',age:47,unit:'采油一厂',dept:'樊学作业区',phone:'13798352208',chronic:'无明确慢性病史'},
|
||||
'CQ033096':{name:'赵万福',sex:'男',age:58,unit:'采油二厂',dept:'桐园作业区',phone:'15869506620',chronic:'高血压(3级)、2型糖尿病'},
|
||||
'CQ036441':{name:'刘玉梅',sex:'女',age:44,unit:'采气一厂',dept:'靖边气田',phone:'18814269032',chronic:'无明确慢性病史'},
|
||||
'CQ010564':{name:'高建军',sex:'男',age:55,unit:'第四采油厂',dept:'西峰作业区',phone:'13515064471',chronic:'颈椎病史、高脂血症'},
|
||||
'CQ045130':{name:'杨慧敏',sex:'女',age:38,unit:'采油一厂',dept:'麻子山作业区',phone:'17646095583',chronic:'无明确慢性病史'},
|
||||
'CQ027710':{name:'张秀兰',sex:'女',age:50,unit:'第四采油厂',dept:'西峰作业区',phone:'13968902760',chronic:'冠心病'},
|
||||
'CQ022317':{name:'徐立成',sex:'男',age:49,unit:'采油二厂',dept:'桐园作业区',phone:'15089628819',chronic:'慢性支气管炎'},
|
||||
'CQ029905':{name:'呼建国',sex:'男',age:53,unit:'采气一厂',dept:'靖边气田',phone:'18730413345',chronic:'支气管哮喘'}
|
||||
};
|
||||
/* 员工呼入:主呼设备=床头/面板(HC-*),被呼设备=值班室终端(HD-*);赵万福(182/110)与结果异常 YC-20260905-05 同源事件 */
|
||||
var incoming=[
|
||||
|
||||
@@ -321,18 +321,18 @@ var dorms=[
|
||||
];
|
||||
/* [交互] 床位下钻演示数据:员工池与「床位信息」页一致(key=楼栋|床位编号) */
|
||||
var empLite={
|
||||
'CQ021578':{name:'石维国',unit:'采油一厂',depart:'樊学作业区',phone:'139****3456'},
|
||||
'CQ032144':{name:'李桂芳',unit:'采油一厂',depart:'樊学作业区',phone:'139****7788'},
|
||||
'CQ019203':{name:'曲志明',unit:'采油一厂',depart:'樊学作业区',phone:'139****7208'},
|
||||
'CQ045130':{name:'杨慧敏',unit:'采油一厂',depart:'麻子山作业区',phone:'139****5012'},
|
||||
'CQ033096':{name:'赵万福',unit:'采油二厂',depart:'桐园作业区',phone:'139****6630'},
|
||||
'CQ022317':{name:'徐立成',unit:'第四采油厂',depart:'西峰作业区(轮训)',phone:'139****4906'},
|
||||
'CQ010564':{name:'高建军',unit:'第四采油厂',depart:'西峰作业区',phone:'139****4320'},
|
||||
'CQ041822':{name:'闫婷',unit:'第四采油厂',depart:'西峰作业区',phone:'139****4531'},
|
||||
'CQ044871':{name:'白瑞',unit:'采气一厂',depart:'靖边气田(轮训)',phone:'139****2317'},
|
||||
'CQ027710':{name:'张秀兰',unit:'采油二厂',depart:'姬圪台作业区',phone:'139****4415'},
|
||||
'CQ036441':{name:'刘玉梅',unit:'采气一厂',depart:'靖边气田',phone:'139****3745'},
|
||||
'CQ029905':{name:'呼建国',unit:'采气一厂',depart:'靖边气田',phone:'139****3870'}
|
||||
'CQ021578':{name:'石维国',unit:'采油一厂',depart:'樊学作业区',phone:'13961153456'},
|
||||
'CQ032144':{name:'李桂芳',unit:'采油一厂',depart:'樊学作业区',phone:'13927127788'},
|
||||
'CQ019203':{name:'曲志明',unit:'采油一厂',depart:'樊学作业区',phone:'13989577208'},
|
||||
'CQ045130':{name:'杨慧敏',unit:'采油一厂',depart:'麻子山作业区',phone:'13941215012'},
|
||||
'CQ033096':{name:'赵万福',unit:'采油二厂',depart:'桐园作业区',phone:'13969296630'},
|
||||
'CQ022317':{name:'徐立成',unit:'第四采油厂',depart:'西峰作业区(轮训)',phone:'13937154906'},
|
||||
'CQ010564':{name:'高建军',unit:'第四采油厂',depart:'西峰作业区',phone:'13941064320'},
|
||||
'CQ041822':{name:'闫婷',unit:'第四采油厂',depart:'西峰作业区',phone:'13900024531'},
|
||||
'CQ044871':{name:'白瑞',unit:'采气一厂',depart:'靖边气田(轮训)',phone:'13928272317'},
|
||||
'CQ027710':{name:'张秀兰',unit:'采油二厂',depart:'姬圪台作业区',phone:'13943704415'},
|
||||
'CQ036441':{name:'刘玉梅',unit:'采气一厂',depart:'靖边气田',phone:'13986823745'},
|
||||
'CQ029905':{name:'呼建国',unit:'采气一厂',depart:'靖边气田',phone:'13920263870'}
|
||||
};
|
||||
var bedAssigns={
|
||||
'樊学倒班宿舍1号楼|101-1':'CQ021578','樊学倒班宿舍1号楼|101-2':'CQ032144','樊学倒班宿舍1号楼|102-1':'CQ019203',
|
||||
|
||||
@@ -46,7 +46,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 概览卡 */
|
||||
.stat-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:16px;}
|
||||
.stat-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:16px;}
|
||||
.stat-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:18px 20px;display:flex;align-items:center;gap:14px;}
|
||||
.stat-card__icon{width:44px;height:44px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0;}
|
||||
.stat-card__icon--blue{background:var(--primary-light);}
|
||||
@@ -113,8 +113,8 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.drawer__close:hover{color:var(--text-primary);}
|
||||
.drawer__body{flex:1;overflow-y:auto;padding:24px;}
|
||||
.drawer__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
.drawer__hint{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:14px;}
|
||||
.drawer__toolbar{display:flex;align-items:center;gap:8px;margin-bottom:14px;}
|
||||
.drawer__toolbar .grow{margin-left:auto;font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
|
||||
/* 内嵌小表格 */
|
||||
.mini-table{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;min-width:0;}
|
||||
@@ -227,12 +227,12 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<div class="drawer__header"><span id="rosterTitle">已分配员工名册</span><button class="drawer__close" onclick="closeDrawer()">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<!-- [交互] 名册按姓名/员工编号即时过滤 -->
|
||||
<div class="drawer__hint" id="rosterHint"></div>
|
||||
<div class="drawer__toolbar">
|
||||
<div class="filter-item"><label>姓名</label>
|
||||
<input class="filter-input" id="rsName" placeholder="请输入姓名" style="min-width:100px;" oninput="renderRoster()"></div>
|
||||
<div class="filter-item"><label>员工编号</label>
|
||||
<input class="filter-input" id="rsCode" placeholder="请输入员工编号" style="min-width:100px;" oninput="renderRoster()"></div>
|
||||
<span class="grow" id="rosterHint"></span>
|
||||
</div>
|
||||
<table class="mini-table" style="border-collapse:separate;">
|
||||
<thead><tr><th>单位名称</th><th>部门名称</th><th>姓名</th><th>性别</th><th>年龄</th><th>员工编号</th></tr></thead>
|
||||
@@ -269,6 +269,9 @@ var statPoints=[
|
||||
roster:[{unit:'采气一厂',dept:'苏里格南作业区',name:'徐立成',sex:'男',age:44,code:'CQ022317'}]}
|
||||
];
|
||||
|
||||
/* 未分配员工按单位汇总(与「员工分配」页未分配 Tab 演示数据一致,共 9 人) */
|
||||
var unallocByUnit={'采油一厂':3,'采油二厂':2,'第四采油厂':2,'采气一厂':2};
|
||||
|
||||
/* ===== 单位→医疗点级联(由统计数据生成,保证单一数据源) ===== */
|
||||
function initUnitSel(){
|
||||
var sel=document.getElementById('filterUnit');
|
||||
@@ -291,14 +294,15 @@ function currentData(){
|
||||
return statPoints.filter(function(p){return (!unit||p.unit===unit)&&(!point||p.name===point);});
|
||||
}
|
||||
function renderStats(list){
|
||||
var staff=0,alloc=0;
|
||||
list.forEach(function(p){staff+=p.staff;alloc+=p.roster.length;});
|
||||
var avg=list.length?(alloc/list.length).toFixed(1):'0.0';
|
||||
var alloc=0;
|
||||
list.forEach(function(p){alloc+=p.roster.length;});
|
||||
var unit=document.getElementById('filterUnit').value,un=0;
|
||||
for(var k in unallocByUnit){if(!unit||k===unit)un+=unallocByUnit[k];}
|
||||
var total=alloc+un;
|
||||
document.getElementById('statCards').innerHTML=
|
||||
'<div class="stat-card"><div class="stat-card__icon stat-card__icon--blue">🏥</div><div><div class="stat-card__label">医疗点数量</div><div class="stat-card__value">'+list.length+'</div><div class="stat-card__extra">当前筛选范围内</div></div></div>'
|
||||
+'<div class="stat-card"><div class="stat-card__icon stat-card__icon--green">👩⚕️</div><div><div class="stat-card__label">医护人员总数</div><div class="stat-card__value">'+staff+'</div><div class="stat-card__extra">来自系统管理医护角色统计</div></div></div>'
|
||||
+'<div class="stat-card"><div class="stat-card__icon stat-card__icon--orange">👥</div><div><div class="stat-card__label">已分配员工总数</div><div class="stat-card__value">'+alloc+'</div><div class="stat-card__extra">在「员工分配」页维护</div></div></div>'
|
||||
+'<div class="stat-card"><div class="stat-card__icon stat-card__icon--purple">📊</div><div><div class="stat-card__label">平均每点分配人数</div><div class="stat-card__value">'+avg+'</div><div class="stat-card__extra">已分配员工总数 ÷ 医疗点数</div></div></div>';
|
||||
'<div class="stat-card"><div class="stat-card__icon stat-card__icon--blue">👥</div><div><div class="stat-card__label">员工总数量</div><div class="stat-card__value">'+total+'</div><div class="stat-card__extra">已分配 + 未分配</div></div></div>'
|
||||
+'<div class="stat-card"><div class="stat-card__icon stat-card__icon--green">✅</div><div><div class="stat-card__label">已分配员工数量</div><div class="stat-card__value">'+alloc+'</div><div class="stat-card__extra">在「员工分配」页维护</div></div></div>'
|
||||
+'<div class="stat-card"><div class="stat-card__icon stat-card__icon--orange">📋</div><div><div class="stat-card__label">未分配员工数量</div><div class="stat-card__value">'+un+'</div><div class="stat-card__extra">可在「员工分配」页进行分配</div></div></div>';
|
||||
}
|
||||
function renderTable(){
|
||||
var list=currentData();
|
||||
|
||||
@@ -133,6 +133,35 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;-webkit-appearance:none;padding-right:28px;cursor:pointer;}
|
||||
.drop-zone{border:1px dashed var(--border);border-radius:var(--radius-sm);padding:16px;text-align:center;color:var(--text-placeholder);font-size:var(--font-sm);cursor:pointer;line-height:1.8;}
|
||||
.drop-zone:hover{border-color:var(--primary);color:var(--primary);background:#F8FBFF;}
|
||||
|
||||
/* 分配员工弹窗(左右双栏) */
|
||||
.modal--xl{width:1080px;}
|
||||
.alloc-emp{display:flex;gap:16px;}
|
||||
.alloc-emp__left,.alloc-emp__right{flex:1;min-width:0;}
|
||||
.alloc-emp__panel-title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin-bottom:10px;display:flex;align-items:center;gap:6px;}
|
||||
.alloc-emp__filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px;}
|
||||
.alloc-emp__filter .filter-input{flex:1;min-width:90px;height:32px;}
|
||||
.alloc-emp__filter .org-trigger{height:32px;min-width:150px;}
|
||||
.alloc-emp__filter .org-panel{top:32px;}
|
||||
.alloc-emp__list{border:1px solid var(--border);border-radius:var(--radius-sm);height:300px;overflow-y:auto;overflow-x:hidden;}
|
||||
.ae-table{width:100%;min-width:0;border-collapse:separate;border-spacing:0;font-size:var(--font-sm);}
|
||||
.ae-table th:last-child,.ae-table td:last-child{position:static;box-shadow:none;}
|
||||
.ae-table th,.ae-table td{padding:8px 10px;text-align:left;vertical-align:middle;border-bottom:1px solid #F0F0F0;}
|
||||
.ae-table th{background:#FAFAFA;font-weight:500;color:var(--text-secondary);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:1;}
|
||||
.ae-table td{color:var(--text-primary);}
|
||||
.ae-table th:first-child,.ae-table td:first-child{width:44px;text-align:center;padding-left:4px;padding-right:4px;}
|
||||
.ae-table tbody tr:hover{background:#F8FBFF;}
|
||||
.ae-table tbody tr:last-child td{border-bottom:none;}
|
||||
.alloc-emp__item{display:flex;align-items:center;gap:8px;padding:7px 12px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;cursor:pointer;}
|
||||
.alloc-emp__item:hover{background:#F8FBFF;}
|
||||
.alloc-emp__item:last-child{border-bottom:none;}
|
||||
.alloc-emp__item input[type=checkbox]{cursor:pointer;flex-shrink:0;}
|
||||
.alloc-emp__item .ae-meta{flex:1;min-width:0;color:var(--text-secondary);font-size:var(--font-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
||||
.alloc-emp__remove{color:var(--danger);cursor:pointer;margin-left:auto;font-size:var(--font-xs);flex-shrink:0;}
|
||||
.alloc-emp__empty{text-align:center;padding:40px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
.alloc-emp__alloc{background:#FAFAFA;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px;margin-bottom:10px;display:flex;gap:12px;}
|
||||
.alloc-emp__alloc .form-item{flex:1;margin-bottom:0;}
|
||||
.ae-cnt{display:inline-block;min-width:18px;padding:0 5px;height:18px;line-height:18px;border-radius:9px;background:var(--primary-light);color:var(--primary);font-size:var(--font-xs);text-align:center;font-weight:600;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -171,14 +200,22 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
|
||||
<!-- [交互] 状态Tab:已分配/未分配 -->
|
||||
<div class="tabs">
|
||||
<div class="tab active" id="tabAlloc" onclick="switchTab(true)">已分配<span class="tab__count" id="cntAlloc">0</span></div>
|
||||
<div class="tab" id="tabUnalloc" onclick="switchTab(false)">未分配<span class="tab__count" id="cntUnalloc">0</span></div>
|
||||
<div class="tab active" id="tabAlloc" onclick="switchTab(true)">已分配</div>
|
||||
<div class="tab" id="tabUnalloc" onclick="switchTab(false)">未分配</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 筛选栏:单位部门级联 + 姓名/员工编号 + 医疗点(仅已分配) -->
|
||||
<!-- [交互] 筛选栏:姓名/员工编号/单位部门 + 医疗点/分配日期(仅已分配) -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号" style="min-width:100px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
@@ -197,14 +234,6 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号" style="min-width:100px;">
|
||||
</div>
|
||||
<div class="filter-item" id="mfUnitWrap">
|
||||
<label>医疗点所属单位</label>
|
||||
<select class="filter-select" id="filterMedUnit" onchange="onMedUnit()" style="min-width:110px;">
|
||||
@@ -218,6 +247,12 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<option value="">全部医疗点</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item" id="mfDateWrap">
|
||||
<label>分配日期</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
@@ -227,13 +262,13 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 操作栏:按钮随Tab切换 -->
|
||||
<div class="action-bar">
|
||||
<span id="allocBtns">
|
||||
<button class="btn btn-primary" onclick="openImport()"><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" onclick="openImportTasks()"><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" onclick="doExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
</span>
|
||||
<span id="unallocBtns" style="display:none;">
|
||||
<button class="btn btn-primary" onclick="batchAllocate()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7h10M7 2v10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg>分配医疗点</button>
|
||||
<button class="btn btn-primary" onclick="openImport()"><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-primary" onclick="openAllocEmp()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="4" r="2.5" stroke="#fff" stroke-width="1.3"/><path d="M2.5 12c.5-2.5 2.3-4 4.5-4s4 1.5 4.5 4" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>分配员工</button>
|
||||
<button class="btn btn-primary" onclick="openImport()"><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" onclick="openImportTasks()"><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" onclick="doExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -271,6 +306,71 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 分配员工弹窗(左右双栏:选择员工 + 已选择员工) -->
|
||||
<div class="modal-mask" id="allocEmpMask">
|
||||
<div class="modal modal--xl">
|
||||
<div class="modal__title">分配员工</div>
|
||||
<div class="alloc-emp">
|
||||
<div class="alloc-emp__left">
|
||||
<div class="alloc-emp__panel-title">选择员工</div>
|
||||
<div class="alloc-emp__filter">
|
||||
<input class="filter-input" id="aeName" placeholder="姓名" oninput="renderAeList()">
|
||||
<input class="filter-input" id="aeCode" placeholder="员工编号" oninput="renderAeList()">
|
||||
<div class="org-wrap" id="aeOrgWrap">
|
||||
<div class="org-trigger" id="aeOrgTrigger" onclick="toggleAeOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="aeOrgPanel">
|
||||
<div class="org-col" id="aeUnitCol">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" data-unit="" onclick="aeSelectUnit(this,'全部单位/部门','')">全部单位/部门</div>
|
||||
<div class="org-item" data-unit="采油一厂" onclick="aeSelectUnit(this,'采油一厂','采油一厂')">采油一厂</div>
|
||||
<div class="org-item" data-unit="采油二厂" onclick="aeSelectUnit(this,'采油二厂','采油二厂')">采油二厂</div>
|
||||
<div class="org-item" data-unit="第四采油厂" onclick="aeSelectUnit(this,'第四采油厂','第四采油厂')">第四采油厂</div>
|
||||
<div class="org-item" data-unit="采气一厂" onclick="aeSelectUnit(this,'采气一厂','采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="aeDeptCol">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" data-dept="" onclick="aeSelectDept(this,'全部部门','')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alloc-emp__list">
|
||||
<table class="ae-table">
|
||||
<thead><tr><th><input type="checkbox" id="aeCheckAll" onchange="aeToggleAll(this)"></th><th>姓名</th><th>员工编号</th><th>所属单位</th><th>所属部门</th></tr></thead>
|
||||
<tbody id="aeTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alloc-emp__right">
|
||||
<div class="alloc-emp__panel-title">已选择员工 <span class="ae-cnt" id="aeCnt">0</span></div>
|
||||
<div class="alloc-emp__alloc">
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 医疗点所属单位</span>
|
||||
<select class="form-control" id="aeUnit" onchange="onAeUnit()"><option value="">请选择单位</option><option>采油一厂</option><option>采油二厂</option><option>第四采油厂</option><option>采气一厂</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 分配医疗点</span>
|
||||
<select class="form-control" id="aePoint"><option value="">请先选择医疗点所属单位</option></select></div>
|
||||
</div>
|
||||
<div class="alloc-emp__list" id="aeSelected"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('allocEmpMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmAllocEmp()">确认分配</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 移除分配确认弹窗 -->
|
||||
<div class="modal-mask" id="removeMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#FAAD14" stroke-width="1.6"/><path d="M10 5.5v6M10 13.5v1" stroke="#FAAD14" stroke-width="1.8" stroke-linecap="round"/></svg> 移除分配</div>
|
||||
<div class="modal__text" id="removeText">确认移除该员工的分配?</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('removeMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmRemoveAllocate()">确认移除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 批量导入弹窗 -->
|
||||
<div class="modal-mask" id="importMask">
|
||||
<div class="modal">
|
||||
@@ -280,7 +380,8 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 分配医疗点</span>
|
||||
<select class="form-control" id="iPoint"><option value="">请先选择单位</option></select></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 上传文件(员工编号清单)</span>
|
||||
<div class="drop-zone" onclick="showToast('演示环境请选择本地文件(仅支持.xlsx)')">点击选择或拖拽文件到此处上传<br>员工分配导入模板.xlsx</div></div>
|
||||
<div class="drop-zone" onclick="showToast('演示环境请选择本地文件(仅支持.xlsx)')">点击选择或拖拽文件到此处上传<br>员工分配导入模板.xlsx</div>
|
||||
<button class="btn btn-default" onclick="showToast('员工分配导入模板下载中…')" style="align-self:flex-start;margin-top:8px;"><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>下载Excel模板</button></div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('importMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="doImport()">开始导入</button>
|
||||
@@ -306,7 +407,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏) ===== */
|
||||
/* ===== 演示数据 ===== */
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
'采油二厂':['姬圪台作业区医疗点','桐园作业区医疗点'],
|
||||
@@ -321,30 +422,30 @@ var deptMap={
|
||||
};
|
||||
/* 已分配:unit/dept=员工所属,mUnit/mPoint=分配去向 */
|
||||
var alloc=[
|
||||
{id:1,name:'石维国',sex:'男',age:46,code:'CQ021578',tel:'139****2051',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'樊学作业区医疗点',date:'2026-03-02'},
|
||||
{id:2,name:'李桂芳',sex:'女',age:38,code:'CQ032144',tel:'138****7742',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'樊学作业区医疗点',date:'2026-03-02'},
|
||||
{id:3,name:'白瑞',sex:'男',age:31,code:'CQ044871',tel:'155****3316',unit:'采油一厂',dept:'生产技术部',mUnit:'采油一厂',mPoint:'安塞采油队长住点医疗室',date:'2026-04-15'},
|
||||
{id:4,name:'曲志明',sex:'男',age:42,code:'CQ019203',tel:'137****8890',unit:'采油二厂',dept:'姬圪台联合站',mUnit:'采油二厂',mPoint:'姬圪台作业区医疗点',date:'2026-01-08'},
|
||||
{id:5,name:'张秀兰',sex:'女',age:45,code:'CQ027710',tel:'136****2248',unit:'采油二厂',dept:'姬圪台联合站',mUnit:'采油二厂',mPoint:'姬圪台作业区医疗点',date:'2026-01-08'},
|
||||
{id:6,name:'赵万福',sex:'男',age:39,code:'CQ033096',tel:'150****6127',unit:'采油二厂',dept:'桐园作业区',mUnit:'采油二厂',mPoint:'桐园作业区医疗点',date:'2026-02-20'},
|
||||
{id:7,name:'高建军',sex:'男',age:50,code:'CQ010564',tel:'139****0086',unit:'第四采油厂',dept:'基地管理处',mUnit:'第四采油厂',mPoint:'西峰基地医疗点',date:'2025-12-01'},
|
||||
{id:8,name:'闫婷',sex:'女',age:34,code:'CQ041822',tel:'186****5527',unit:'第四采油厂',dept:'健康管理部',mUnit:'第四采油厂',mPoint:'西峰基地医疗点',date:'2026-01-12'},
|
||||
{id:9,name:'刘玉梅',sex:'女',age:40,code:'CQ036441',tel:'135****7719',unit:'采气一厂',dept:'靖边净化厂',mUnit:'采气一厂',mPoint:'靖边气田医疗点',date:'2026-03-25'},
|
||||
{id:10,name:'呼建国',sex:'男',age:36,code:'CQ029905',tel:'147****9003',unit:'采气一厂',dept:'靖边净化厂',mUnit:'采气一厂',mPoint:'靖边气田医疗点',date:'2026-03-25'},
|
||||
{id:11,name:'徐立成',sex:'男',age:44,code:'CQ022317',tel:'133****4860',unit:'采气一厂',dept:'苏里格南作业区',mUnit:'采气一厂',mPoint:'乌审旗采气区医疗点',date:'2026-05-10'},
|
||||
{id:12,name:'杨慧敏',sex:'女',age:33,code:'CQ045130',tel:'188****7214',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'姬塬作业区医疗点',date:'2026-06-18'}
|
||||
{id:1,name:'石维国',sex:'男',age:46,code:'CQ021578',tel:'13928562051',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'樊学作业区医疗点',date:'2026-03-02'},
|
||||
{id:2,name:'李桂芳',sex:'女',age:38,code:'CQ032144',tel:'13836547742',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'樊学作业区医疗点',date:'2026-03-02'},
|
||||
{id:3,name:'白瑞',sex:'男',age:31,code:'CQ044871',tel:'15529403316',unit:'采油一厂',dept:'生产技术部',mUnit:'采油一厂',mPoint:'安塞采油队长住点医疗室',date:'2026-04-15'},
|
||||
{id:4,name:'曲志明',sex:'男',age:42,code:'CQ019203',tel:'13720568890',unit:'采油二厂',dept:'姬圪台联合站',mUnit:'采油二厂',mPoint:'姬圪台作业区医疗点',date:'2026-01-08'},
|
||||
{id:5,name:'张秀兰',sex:'女',age:45,code:'CQ027710',tel:'13649162248',unit:'采油二厂',dept:'姬圪台联合站',mUnit:'采油二厂',mPoint:'姬圪台作业区医疗点',date:'2026-01-08'},
|
||||
{id:6,name:'赵万福',sex:'男',age:39,code:'CQ033096',tel:'15029836127',unit:'采油二厂',dept:'桐园作业区',mUnit:'采油二厂',mPoint:'桐园作业区医疗点',date:'2026-02-20'},
|
||||
{id:7,name:'高建军',sex:'男',age:50,code:'CQ010564',tel:'13956200086',unit:'第四采油厂',dept:'基地管理处',mUnit:'第四采油厂',mPoint:'西峰基地医疗点',date:'2025-12-01'},
|
||||
{id:8,name:'闫婷',sex:'女',age:34,code:'CQ041822',tel:'18629135527',unit:'第四采油厂',dept:'健康管理部',mUnit:'第四采油厂',mPoint:'西峰基地医疗点',date:'2026-01-12'},
|
||||
{id:9,name:'刘玉梅',sex:'女',age:40,code:'CQ036441',tel:'13572867719',unit:'采气一厂',dept:'靖边净化厂',mUnit:'采气一厂',mPoint:'靖边气田医疗点',date:'2026-03-25'},
|
||||
{id:10,name:'呼建国',sex:'男',age:36,code:'CQ029905',tel:'14729539003',unit:'采气一厂',dept:'靖边净化厂',mUnit:'采气一厂',mPoint:'靖边气田医疗点',date:'2026-03-25'},
|
||||
{id:11,name:'徐立成',sex:'男',age:44,code:'CQ022317',tel:'13319284860',unit:'采气一厂',dept:'苏里格南作业区',mUnit:'采气一厂',mPoint:'乌审旗采气区医疗点',date:'2026-05-10'},
|
||||
{id:12,name:'杨慧敏',sex:'女',age:33,code:'CQ045130',tel:'18829587214',unit:'采油一厂',dept:'樊学作业区',mUnit:'采油一厂',mPoint:'姬塬作业区医疗点',date:'2026-06-18'}
|
||||
];
|
||||
/* 未分配:可被分配的驻点后备医护与协管人员 */
|
||||
var unalloc=[
|
||||
{id:101,name:'周瑞琪',sex:'女',age:29,code:'CQ049218',tel:'151****3072',unit:'采油一厂',dept:'生产技术部'},
|
||||
{id:102,name:'田震',sex:'男',age:35,code:'CQ037744',tel:'139****5218',unit:'采油一厂',dept:'樊学作业区'},
|
||||
{id:103,name:'韩梅',sex:'女',age:41,code:'CQ026109',tel:'137****0833',unit:'采油二厂',dept:'安全环保科'},
|
||||
{id:104,name:'冯保山',sex:'男',age:48,code:'CQ015523',tel:'135****6174',unit:'采油二厂',dept:'桐园作业区'},
|
||||
{id:105,name:'曹雪芹',sex:'女',age:30,code:'CQ047831',tel:'186****2940',unit:'第四采油厂',dept:'健康管理部'},
|
||||
{id:106,name:'罗建平',sex:'男',age:37,code:'CQ033485',tel:'150****8357',unit:'第四采油厂',dept:'基地管理处'},
|
||||
{id:107,name:'梁小燕',sex:'女',age:32,code:'CQ042296',tel:'188****1029',unit:'采气一厂',dept:'生产技术部'},
|
||||
{id:108,name:'邓成',sex:'男',age:43,code:'CQ024778',tel:'133****9481',unit:'采气一厂',dept:'苏里格南作业区'},
|
||||
{id:109,name:'苏文斌',sex:'男',age:27,code:'CQ051027',tel:'155****6703',unit:'采油一厂',dept:'工会办公室'}
|
||||
{id:101,name:'周瑞琪',sex:'女',age:29,code:'CQ049218',tel:'15148943072',unit:'采油一厂',dept:'生产技术部'},
|
||||
{id:102,name:'田震',sex:'男',age:35,code:'CQ037744',tel:'13936485218',unit:'采油一厂',dept:'樊学作业区'},
|
||||
{id:103,name:'韩梅',sex:'女',age:41,code:'CQ026109',tel:'13761800833',unit:'采油二厂',dept:'安全环保科'},
|
||||
{id:104,name:'冯保山',sex:'男',age:48,code:'CQ015523',tel:'13581136174',unit:'采油二厂',dept:'桐园作业区'},
|
||||
{id:105,name:'曹雪芹',sex:'女',age:30,code:'CQ047831',tel:'18642802940',unit:'第四采油厂',dept:'健康管理部'},
|
||||
{id:106,name:'罗建平',sex:'男',age:37,code:'CQ033485',tel:'15077088357',unit:'第四采油厂',dept:'基地管理处'},
|
||||
{id:107,name:'梁小燕',sex:'女',age:32,code:'CQ042296',tel:'18894041029',unit:'采气一厂',dept:'生产技术部'},
|
||||
{id:108,name:'邓成',sex:'男',age:43,code:'CQ024778',tel:'13392699481',unit:'采气一厂',dept:'苏里格南作业区'},
|
||||
{id:109,name:'苏文斌',sex:'男',age:27,code:'CQ051027',tel:'15598486703',unit:'采油一厂',dept:'工会办公室'}
|
||||
];
|
||||
var nextId=200,curAllocTab=true,allocTargets=[],allocRealloc=false;
|
||||
|
||||
@@ -355,6 +456,7 @@ function switchTab(toAlloc){
|
||||
document.getElementById('tabUnalloc').classList.toggle('active',!toAlloc);
|
||||
document.getElementById('mfUnitWrap').style.display=toAlloc?'':'none';
|
||||
document.getElementById('mfPointWrap').style.display=toAlloc?'':'none';
|
||||
document.getElementById('mfDateWrap').style.display=toAlloc?'':'none';
|
||||
document.getElementById('allocBtns').style.display=toAlloc?'':'none';
|
||||
document.getElementById('unallocBtns').style.display=toAlloc?'none':'';
|
||||
currentPage=1;renderTable();
|
||||
@@ -400,17 +502,23 @@ function currentData(){
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var mUnit=document.getElementById('filterMedUnit').value;
|
||||
var mPoint=document.getElementById('filterMedPoint').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
var list=(curAllocTab?alloc:unalloc).filter(function(p){
|
||||
return (!name||p.name.indexOf(name)!==-1)
|
||||
&&(!code||p.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||p.unit===selUnit)&&(!selDept||p.dept===selDept)
|
||||
&&(!curAllocTab||((!mUnit||p.mUnit===mUnit)&&(!mPoint||p.mPoint===mPoint)));
|
||||
&&(!curAllocTab||((!mUnit||p.mUnit===mUnit)&&(!mPoint||p.mPoint===mPoint)&&(!from||p.date>=from)&&(!to||p.date<=to)));
|
||||
});
|
||||
return list;
|
||||
}
|
||||
function renderHead(){
|
||||
var h='<tr><th style="width:40px"><input type="checkbox" onchange="toggleAll(this)"></th><th>序号</th><th>员工所属单位</th><th>员工所属部门</th><th>员工姓名</th><th>性别</th><th>年龄</th><th>员工编号</th><th>联系电话</th>';
|
||||
h+=curAllocTab?'<th>医疗点所属单位</th><th>分配医疗点</th><th>分配日期</th><th>操作</th></tr>':'<th>操作</th></tr>';
|
||||
var h;
|
||||
if(curAllocTab){
|
||||
h='<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>';
|
||||
}else{
|
||||
h='<tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>联系电话</th><th>所属单位</th><th>所属部门</th><th>操作</th></tr>';
|
||||
}
|
||||
document.getElementById('tableHead').innerHTML=h;
|
||||
}
|
||||
function renderTable(){
|
||||
@@ -422,26 +530,26 @@ function renderTable(){
|
||||
document.getElementById('pageNum').textContent=currentPage+'/'+totalPages;
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
document.getElementById('cntAlloc').textContent=alloc.length;
|
||||
document.getElementById('cntUnalloc').textContent=unalloc.length;
|
||||
var colspan=curAllocTab?13:10;
|
||||
var colspan=curAllocTab?12:9;
|
||||
if(!pageData.length){document.getElementById('tableBody').innerHTML='<tr><td colspan="'+colspan+'" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(p,i){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" class="row-check" value="'+p.id+'"></td>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td>'+p.unit+'</td><td>'+p.dept+'</td>'
|
||||
+'<td style="font-weight:600;">'+p.name+'</td>'
|
||||
+'<td><span class="badge '+(p.sex==='男'?'badge--muted':'badge--muted')+'">'+p.sex+'</span></td>'
|
||||
+'<td>'+p.age+'</td><td>'+p.code+'</td><td>'+p.tel+'</td>';
|
||||
if(curAllocTab){
|
||||
html+='<td>'+p.mUnit+'</td><td>'+p.mPoint+'</td><td>'+p.date+'</td>'
|
||||
+'<td class="td-actions"><button class="btn btn-link" onclick="openAllocate(['+p.id+'],true)">重新分配</button></td>';
|
||||
html+='<tr>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+p.name+'</td>'
|
||||
+'<td>'+p.code+'</td><td>'+p.sex+'</td><td>'+p.age+'</td><td>'+p.tel+'</td>'
|
||||
+'<td>'+p.unit+'</td><td>'+p.dept+'</td>'
|
||||
+'<td>'+p.mUnit+'</td><td>'+p.mPoint+'</td><td>'+p.date+'</td>'
|
||||
+'<td class="td-actions"><button class="btn btn-link" onclick="openAllocate(['+p.id+'],true)">重新分配</button><button class="btn btn-link btn-link--danger" onclick="askRemoveAllocate('+p.id+')">移除分配</button></td></tr>';
|
||||
}else{
|
||||
html+='<td class="td-actions"><button class="btn btn-link" onclick="openAllocate(['+p.id+'])">分配医疗点</button></td>';
|
||||
html+='<tr>'
|
||||
+'<td>'+(start+i+1)+'</td>'
|
||||
+'<td style="font-weight:600;">'+p.name+'</td>'
|
||||
+'<td>'+p.code+'</td><td>'+p.sex+'</td><td>'+p.age+'</td><td>'+p.tel+'</td>'
|
||||
+'<td>'+p.unit+'</td><td>'+p.dept+'</td>'
|
||||
+'<td class="td-actions"><button class="btn btn-link" onclick="openAllocate(['+p.id+'])">分配医疗点</button></td></tr>';
|
||||
}
|
||||
html+='</tr>';
|
||||
});
|
||||
document.getElementById('tableBody').innerHTML=html;
|
||||
}
|
||||
@@ -455,6 +563,8 @@ function resetFilter(){
|
||||
document.getElementById('deptCol').innerHTML='<div class="org-col__title">部门</div><div class="org-item active" onclick="selectDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
document.getElementById('filterMedUnit').value='';
|
||||
onMedUnit();
|
||||
document.getElementById('filterFrom').value='';
|
||||
document.getElementById('filterTo').value='';
|
||||
applyFilter();
|
||||
}
|
||||
function turnPage(d){
|
||||
@@ -463,15 +573,7 @@ function turnPage(d){
|
||||
currentPage=Math.min(Math.max(1,currentPage+d),totalPages);
|
||||
renderTable();
|
||||
}
|
||||
function toggleAll(el){document.querySelectorAll('.row-check').forEach(function(c){c.checked=el.checked;});}
|
||||
|
||||
/* ===== 分配 ===== */
|
||||
function checkedIds(){return [].slice.call(document.querySelectorAll('.row-check:checked')).map(function(c){return +c.value;});}
|
||||
function batchAllocate(){
|
||||
var ids=checkedIds();
|
||||
if(!ids.length){showToast('请先勾选未分配员工');return;}
|
||||
openAllocate(ids);
|
||||
}
|
||||
function openAllocate(ids,realloc){
|
||||
allocTargets=ids;allocRealloc=!!realloc;
|
||||
var src=realloc?alloc:unalloc;
|
||||
@@ -509,6 +611,155 @@ function confirmAllocate(){
|
||||
closeModal('allocMask');renderTable();
|
||||
showToast('已为 '+allocTargets.length+' 人'+(allocRealloc?'重新':'')+'分配「'+point+'」');
|
||||
}
|
||||
/* [交互] 移除分配(二次确认):已分配员工退回未分配 */
|
||||
var pendingRemove=null;
|
||||
function askRemoveAllocate(id){
|
||||
var p=alloc.find(function(x){return x.id===id;});
|
||||
if(!p)return;
|
||||
pendingRemove=id;
|
||||
document.getElementById('removeText').textContent='确认移除「'+p.name+'」的分配?移除后该员工将回到未分配列表。';
|
||||
document.getElementById('removeMask').classList.add('open');
|
||||
}
|
||||
function confirmRemoveAllocate(){
|
||||
if(pendingRemove===null)return;
|
||||
var id=pendingRemove;
|
||||
pendingRemove=null;
|
||||
closeModal('removeMask');
|
||||
removeAllocate(id);
|
||||
}
|
||||
function removeAllocate(id){
|
||||
var idx=alloc.findIndex(function(x){return x.id===id;});
|
||||
if(idx<0)return;
|
||||
var p=alloc.splice(idx,1)[0];
|
||||
delete p.mUnit;delete p.mPoint;delete p.date;
|
||||
unalloc.push(p);
|
||||
renderTable();
|
||||
showToast('已移除「'+p.name+'」的分配');
|
||||
}
|
||||
/* ===== 分配员工弹窗(左右双栏) ===== */
|
||||
var aeSelUnit='',aeSelDept='',aeSelectedIds=[];
|
||||
function openAllocEmp(){
|
||||
aeSelectedIds=[];aeSelUnit='';aeSelDept='';
|
||||
document.getElementById('aeName').value='';
|
||||
document.getElementById('aeCode').value='';
|
||||
document.getElementById('aeOrgTrigger').textContent='全部单位/部门';
|
||||
document.getElementById('aeOrgPanel').classList.remove('open');
|
||||
document.getElementById('aeOrgTrigger').classList.remove('open');
|
||||
document.querySelectorAll('#aeUnitCol .org-item').forEach(function(i,x){i.classList.toggle('active',x===0);});
|
||||
document.getElementById('aeDeptCol').innerHTML='<div class="org-col__title">部门</div><div class="org-item active" onclick="aeSelectDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
document.getElementById('aeUnit').value='';
|
||||
document.getElementById('aePoint').innerHTML='<option value="">请先选择医疗点所属单位</option>';
|
||||
document.getElementById('allocEmpMask').classList.add('open');
|
||||
renderAeList();renderAeSelected();
|
||||
}
|
||||
function toggleAeOrg(){
|
||||
document.getElementById('aeOrgPanel').classList.toggle('open');
|
||||
document.getElementById('aeOrgTrigger').classList.toggle('open');
|
||||
}
|
||||
function aeSelectUnit(elem,unitName,unitCode){
|
||||
document.querySelectorAll('#aeUnitCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
aeSelUnit=unitCode;
|
||||
var html='<div class="org-col__title">部门</div><div class="org-item active" onclick="aeSelectDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
(deptMap[unitCode]||[]).forEach(function(d){
|
||||
html+='<div class="org-item" data-dept="'+d+'" onclick="aeSelectDept(this,\''+d+'\',\''+d+'\')">'+d+'</div>';
|
||||
});
|
||||
document.getElementById('aeDeptCol').innerHTML=html;
|
||||
aeSelDept='';renderAeList();
|
||||
}
|
||||
function aeSelectDept(elem,deptName,deptCode){
|
||||
document.querySelectorAll('#aeDeptCol .org-item').forEach(function(i){i.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
aeSelDept=deptCode;
|
||||
var label=(aeSelUnit||'全部单位')+(aeSelDept?' / '+aeSelDept:' / 全部部门');
|
||||
document.getElementById('aeOrgTrigger').textContent=label;
|
||||
renderAeList();
|
||||
}
|
||||
function aeFiltered(){
|
||||
var name=document.getElementById('aeName').value.trim();
|
||||
var code=document.getElementById('aeCode').value.trim();
|
||||
return unalloc.filter(function(p){
|
||||
return (!name||p.name.indexOf(name)!==-1)
|
||||
&&(!code||p.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!aeSelUnit||p.unit===aeSelUnit)&&(!aeSelDept||p.dept===aeSelDept);
|
||||
});
|
||||
}
|
||||
function renderAeList(){
|
||||
var list=aeFiltered();
|
||||
var checkAll=document.getElementById('aeCheckAll');
|
||||
var html='';
|
||||
if(!list.length){
|
||||
checkAll.checked=false;
|
||||
html='<tr><td colspan="5" style="text-align:center;padding:48px 0;color:var(--text-placeholder);">暂无匹配员工</td></tr>';
|
||||
}else{
|
||||
var allChecked=list.every(function(p){return aeSelectedIds.indexOf(p.id)>-1;});
|
||||
checkAll.checked=allChecked;
|
||||
list.forEach(function(p){
|
||||
html+='<tr>'
|
||||
+'<td><input type="checkbox" data-id="'+p.id+'" '+(aeSelectedIds.indexOf(p.id)>-1?'checked':'')+' onchange="aeToggle(this)"></td>'
|
||||
+'<td style="font-weight:600;">'+p.name+'</td>'
|
||||
+'<td>'+p.code+'</td>'
|
||||
+'<td>'+p.unit+'</td><td>'+p.dept+'</td>'
|
||||
+'</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('aeTbody').innerHTML=html;
|
||||
}
|
||||
function aeToggleAll(el){
|
||||
aeFiltered().forEach(function(p){
|
||||
var idx=aeSelectedIds.indexOf(p.id);
|
||||
if(el.checked&&idx<0)aeSelectedIds.push(p.id);
|
||||
else if(!el.checked&&idx>-1)aeSelectedIds.splice(idx,1);
|
||||
});
|
||||
renderAeList();renderAeSelected();
|
||||
}
|
||||
function aeToggle(el){
|
||||
var id=+el.getAttribute('data-id');
|
||||
var idx=aeSelectedIds.indexOf(id);
|
||||
if(el.checked&&idx<0)aeSelectedIds.push(id);
|
||||
else if(!el.checked&&idx>-1)aeSelectedIds.splice(idx,1);
|
||||
renderAeSelected();renderAeList();
|
||||
}
|
||||
function aeRemove(id){
|
||||
var idx=aeSelectedIds.indexOf(id);
|
||||
if(idx>-1)aeSelectedIds.splice(idx,1);
|
||||
renderAeSelected();renderAeList();
|
||||
}
|
||||
function renderAeSelected(){
|
||||
var sel=aeSelectedIds.map(function(id){return unalloc.find(function(x){return x.id===id;});}).filter(Boolean);
|
||||
document.getElementById('aeCnt').textContent=sel.length;
|
||||
var html='';
|
||||
if(!sel.length){html='<div class="alloc-emp__empty">尚未选择员工</div>';}
|
||||
else{
|
||||
sel.forEach(function(p){
|
||||
html+='<div class="alloc-emp__item"><span style="font-weight:600;">'+p.name+'</span><span class="ae-meta">'+p.code+' · '+p.unit+' · '+p.dept+'</span><span class="alloc-emp__remove" onclick="aeRemove('+p.id+')">移除</span></div>';
|
||||
});
|
||||
}
|
||||
document.getElementById('aeSelected').innerHTML=html;
|
||||
}
|
||||
function onAeUnit(){
|
||||
var unit=document.getElementById('aeUnit').value;
|
||||
var sel=document.getElementById('aePoint');
|
||||
sel.innerHTML='<option value="">请选择医疗点</option>';
|
||||
if(unit){(pointMap[unit]||[]).forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});}
|
||||
}
|
||||
function confirmAllocEmp(){
|
||||
if(!aeSelectedIds.length){showToast('请先选择要分配的员工');return;}
|
||||
var unit=document.getElementById('aeUnit').value;
|
||||
var point=document.getElementById('aePoint').value;
|
||||
if(!unit){showToast('请选择医疗点所属单位');return;}
|
||||
if(!point){showToast('请选择分配医疗点');return;}
|
||||
var n=aeSelectedIds.length;
|
||||
aeSelectedIds.forEach(function(id){
|
||||
var idx=unalloc.findIndex(function(x){return x.id===id;});
|
||||
if(idx<0)return;
|
||||
var p=unalloc.splice(idx,1)[0];
|
||||
p.mUnit=unit;p.mPoint=point;p.date='2026-09-07';
|
||||
alloc.push(p);
|
||||
});
|
||||
closeModal('allocEmpMask');renderTable();
|
||||
showToast('已为 '+n+' 名员工分配「'+point+'」');
|
||||
}
|
||||
/* ===== 批量导入 ===== */
|
||||
function openImport(){
|
||||
document.getElementById('iUnit').value='';
|
||||
@@ -530,6 +781,9 @@ function doImport(){
|
||||
/* [交互] 查看导入任务(异步任务演示) */
|
||||
function openImportTasks(){document.getElementById('taskMask').classList.add('open');}
|
||||
|
||||
/* [交互] 导出列表数据 */
|
||||
function doExport(){showToast(curAllocTab?'已分配员工列表已导出(演示)':'未分配员工列表已导出(演示)');}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
function closeModal(id){document.getElementById(id).classList.remove('open');}
|
||||
function showToast(msg){
|
||||
|
||||
@@ -376,7 +376,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏) ===== */
|
||||
/* ===== 演示数据 ===== */
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
'采油二厂':['姬圪台作业区医疗点','桐园作业区医疗点'],
|
||||
@@ -384,12 +384,12 @@ var pointMap={
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
var ambulances=[
|
||||
{id:1,unit:'采油一厂',point:'樊学作业区医疗点',type:'急救型',model:'江铃轻型监护型救护车',plate:'CQ·0712A',area:'樊学作业区及沿线井站',people:860,driver:'田震',tel:'139****5218',gps:'是',fee:8.5,org:'CQ油田总医院',year:2021,link:'是',equip:'除颤仪、心电监护仪、氧气袋、创伤固定包',ability:'可承担院内心跳呼吸骤停复苏与创伤伤员的第一时间转运'},
|
||||
{id:2,unit:'采油二厂',point:'姬圪台作业区医疗点',type:'急救型',model:'福田图雅诺监护型救护车',plate:'CQ·1366B',area:'姬圪台联合站及管线区',people:1240,driver:'冯保山',tel:'135****6174',gps:'是',fee:9.2,org:'CQ油田总医院',year:2020,link:'是',equip:'除颤仪、便携式彩超、呼吸机',ability:'具备危重伤员途中生命支持与心梗卒中协同转运能力'},
|
||||
{id:3,unit:'第四采油厂',point:'西峰基地医疗点',type:'转运型',model:'福特全顺转运型救护车',plate:'CQ·0208C',area:'西峰基地至第四采油厂机关沿线',people:2100,driver:'罗建平',tel:'150****8357',gps:'是',fee:12,org:'第四采油厂总医院',year:2019,link:'是',equip:'担架系统、输液泵、供氧系统',ability:'承担慢性病患者往返医院透析、复查等非急救转运'},
|
||||
{id:4,unit:'采气一厂',point:'靖边气田医疗点',type:'急救型',model:'东风轻型救护车',plate:'CQ·1533D',area:'靖边净化厂及井场',people:760,driver:'邓成',tel:'133****9481',gps:'否',fee:7.8,org:'CQ油田总医院',year:2022,link:'否',equip:'除颤监护仪、氧气瓶、急救药箱',ability:'满足井场外伤、中暑、心源性猝倒的现场急救与送医'},
|
||||
{id:5,unit:'采油一厂',point:'安塞采油队长住点医疗室',type:'转运型',model:'江淮瑞风转运型救护车',plate:'CQ·0917E',area:'安塞基地及队部常驻区',people:540,driver:'苏文斌',tel:'155****6703',gps:'是',fee:6.5,org:'吴起油田医院',year:2023,link:'是',equip:'自动上车担架、颈胸腰固定支具',ability:'常驻点员工常规转运与陪同就医'},
|
||||
{id:6,unit:'采气一厂',point:'乌审旗采气区医疗点',type:'急救型',model:'红旗轻型监护型救护车',plate:'CQ·2201F',area:'苏里格南作业区营地',people:680,driver:'曹雪芹',tel:'186****2940',gps:'是',fee:8,org:'庆阳市人民医院',year:2024,link:'否',equip:'除颤仪、心电监护仪、简易呼吸器',ability:'高寒沙尘环境下的急救响应与危重员转运'}
|
||||
{id:1,unit:'采油一厂',point:'樊学作业区医疗点',type:'急救型',model:'江铃轻型监护型救护车',plate:'CQ·0712A',area:'樊学作业区及沿线井站',people:860,driver:'田震',tel:'13936485218',gps:'是',fee:8.5,org:'CQ油田总医院',year:2021,link:'是',equip:'除颤仪、心电监护仪、氧气袋、创伤固定包',ability:'可承担院内心跳呼吸骤停复苏与创伤伤员的第一时间转运'},
|
||||
{id:2,unit:'采油二厂',point:'姬圪台作业区医疗点',type:'急救型',model:'福田图雅诺监护型救护车',plate:'CQ·1366B',area:'姬圪台联合站及管线区',people:1240,driver:'冯保山',tel:'13581136174',gps:'是',fee:9.2,org:'CQ油田总医院',year:2020,link:'是',equip:'除颤仪、便携式彩超、呼吸机',ability:'具备危重伤员途中生命支持与心梗卒中协同转运能力'},
|
||||
{id:3,unit:'第四采油厂',point:'西峰基地医疗点',type:'转运型',model:'福特全顺转运型救护车',plate:'CQ·0208C',area:'西峰基地至第四采油厂机关沿线',people:2100,driver:'罗建平',tel:'15077088357',gps:'是',fee:12,org:'第四采油厂总医院',year:2019,link:'是',equip:'担架系统、输液泵、供氧系统',ability:'承担慢性病患者往返医院透析、复查等非急救转运'},
|
||||
{id:4,unit:'采气一厂',point:'靖边气田医疗点',type:'急救型',model:'东风轻型救护车',plate:'CQ·1533D',area:'靖边净化厂及井场',people:760,driver:'邓成',tel:'13392699481',gps:'否',fee:7.8,org:'CQ油田总医院',year:2022,link:'否',equip:'除颤监护仪、氧气瓶、急救药箱',ability:'满足井场外伤、中暑、心源性猝倒的现场急救与送医'},
|
||||
{id:5,unit:'采油一厂',point:'安塞采油队长住点医疗室',type:'转运型',model:'江淮瑞风转运型救护车',plate:'CQ·0917E',area:'安塞基地及队部常驻区',people:540,driver:'苏文斌',tel:'15598486703',gps:'是',fee:6.5,org:'吴起油田医院',year:2023,link:'是',equip:'自动上车担架、颈胸腰固定支具',ability:'常驻点员工常规转运与陪同就医'},
|
||||
{id:6,unit:'采气一厂',point:'乌审旗采气区医疗点',type:'急救型',model:'红旗轻型监护型救护车',plate:'CQ·2201F',area:'苏里格南作业区营地',people:680,driver:'曹雪芹',tel:'18642802940',gps:'是',fee:8,org:'庆阳市人民医院',year:2024,link:'否',equip:'除颤仪、心电监护仪、简易呼吸器',ability:'高寒沙尘环境下的急救响应与危重员转运'}
|
||||
];
|
||||
var nextId=7,editingId=null,pendingDel=[];
|
||||
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
/* 统计卡片 */
|
||||
.stat-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:16px;}
|
||||
@@ -161,15 +162,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -356,16 +359,16 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 基础数据(脱敏) ===== */
|
||||
/* ===== 基础数据 ===== */
|
||||
var points=['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点','姬圪台作业区医疗点','桐园作业区医疗点','西峰基地医疗点','靖边气田医疗点','乌审旗采气区医疗点'];
|
||||
/* 救护车台账:与「基础配置·救护车配置」一致 */
|
||||
var ambulances=[
|
||||
{plate:'CQ·0712A',point:'樊学作业区医疗点',type:'急救型',model:'江铃轻型监护型救护车',driver:'田震',tel:'139****5218'},
|
||||
{plate:'CQ·1366B',point:'姬圪台作业区医疗点',type:'急救型',model:'福田图雅诺监护型救护车',driver:'冯保山',tel:'135****6174'},
|
||||
{plate:'CQ·0208C',point:'西峰基地医疗点',type:'转运型',model:'福特全顺转运型救护车',driver:'罗建平',tel:'150****8357'},
|
||||
{plate:'CQ·1533D',point:'靖边气田医疗点',type:'急救型',model:'东风轻型救护车',driver:'邓成',tel:'133****9481'},
|
||||
{plate:'CQ·0917E',point:'安塞采油队长住点医疗室',type:'转运型',model:'江淮瑞风转运型救护车',driver:'苏文斌',tel:'155****6703'},
|
||||
{plate:'CQ·2201F',point:'乌审旗采气区医疗点',type:'急救型',model:'红旗轻型监护型救护车',driver:'曹雪芹',tel:'186****2940'}
|
||||
{plate:'CQ·0712A',point:'樊学作业区医疗点',type:'急救型',model:'江铃轻型监护型救护车',driver:'田震',tel:'13936485218'},
|
||||
{plate:'CQ·1366B',point:'姬圪台作业区医疗点',type:'急救型',model:'福田图雅诺监护型救护车',driver:'冯保山',tel:'13581136174'},
|
||||
{plate:'CQ·0208C',point:'西峰基地医疗点',type:'转运型',model:'福特全顺转运型救护车',driver:'罗建平',tel:'15077088357'},
|
||||
{plate:'CQ·1533D',point:'靖边气田医疗点',type:'急救型',model:'东风轻型救护车',driver:'邓成',tel:'13392699481'},
|
||||
{plate:'CQ·0917E',point:'安塞采油队长住点医疗室',type:'转运型',model:'江淮瑞风转运型救护车',driver:'苏文斌',tel:'15598486703'},
|
||||
{plate:'CQ·2201F',point:'乌审旗采气区医疗点',type:'急救型',model:'红旗轻型监护型救护车',driver:'曹雪芹',tel:'18642802940'}
|
||||
];
|
||||
/* 救护车司机列表:从救护车台账驾驶员去重提取 */
|
||||
var drivers=[];
|
||||
@@ -392,18 +395,18 @@ var medStaff=[
|
||||
];
|
||||
/* 救护车出勤记录:多救护车混合,覆盖四类出勤类型 */
|
||||
var attendances=[
|
||||
{id:1,date:'2026-09-08',point:'樊学作业区医疗点',plate:'CQ·0712A',type:'急救型',dispatch:'病情急救',driver:'田震',tel:'139****5218',staff:['韩东学','兰小娟'],out:'樊学作业区 7#井站',to:'CQ油田总医院'},
|
||||
{id:2,date:'2026-09-08',point:'姬圪台作业区医疗点',plate:'CQ·1366B',type:'急救型',dispatch:'伤情急救',driver:'冯保山',tel:'135****6174',staff:['窦志远','苗慧敏'],out:'姬圪台联合站',to:'庆阳市人民医院'},
|
||||
{id:3,date:'2026-09-07',point:'西峰基地医疗点',plate:'CQ·0208C',type:'转运型',dispatch:'日常巡诊',driver:'罗建平',tel:'150****8357',staff:['霍静怡'],out:'西峰基地机关',to:'西峰基地卫生室'},
|
||||
{id:4,date:'2026-09-07',point:'靖边气田医疗点',plate:'CQ·1533D',type:'急救型',dispatch:'应急戒备',driver:'邓成',tel:'133****9481',staff:['康永强','花灵芝'],out:'靖边净化厂',to:'现场应急指挥部'},
|
||||
{id:5,date:'2026-09-06',point:'安塞采油队长住点医疗室',plate:'CQ·0917E',type:'转运型',dispatch:'日常巡诊',driver:'苏文斌',tel:'155****6703',staff:['白宇峰'],out:'安塞基地队部',to:'吴起油田医院'},
|
||||
{id:6,date:'2026-09-06',point:'乌审旗采气区医疗点',plate:'CQ·2201F',type:'急救型',dispatch:'伤情急救',driver:'曹雪芹',tel:'186****2940',staff:['荣大海','花灵芝'],out:'苏里格南作业区营地',to:'乌审旗人民医院'},
|
||||
{id:7,date:'2026-09-05',point:'樊学作业区医疗点',plate:'CQ·0712A',type:'急救型',dispatch:'应急戒备',driver:'田震',tel:'139****5218',staff:['韩东学'],out:'樊学作业区应急演练现场',to:'演练指挥部'},
|
||||
{id:8,date:'2026-09-05',point:'姬圪台作业区医疗点',plate:'CQ·1366B',type:'急救型',dispatch:'病情急救',driver:'冯保山',tel:'135****6174',staff:['窦志远','屈二娃'],out:'姬圪台作业区 3#站',to:'庆阳市人民医院'},
|
||||
{id:9,date:'2026-09-04',point:'西峰基地医疗点',plate:'CQ·0208C',type:'转运型',dispatch:'病情急救',driver:'罗建平',tel:'150****8357',staff:['霍静怡'],out:'西峰基地生活区',to:'第四采油厂总医院'},
|
||||
{id:10,date:'2026-09-04',point:'靖边气田医疗点',plate:'CQ·1533D',type:'急救型',dispatch:'日常巡诊',driver:'邓成',tel:'133****9481',staff:['康永强'],out:'靖边气田井场巡诊',to:'靖边气田医疗点'},
|
||||
{id:11,date:'2026-09-03',point:'安塞采油队长住点医疗室',plate:'CQ·0917E',type:'转运型',dispatch:'日常巡诊',driver:'苏文斌',tel:'155****6703',staff:['白宇峰','牛玉洁'],out:'安塞基地各井站',to:'安塞采油队长住点医疗室'},
|
||||
{id:12,date:'2026-09-03',point:'乌审旗采气区医疗点',plate:'CQ·2201F',type:'急救型',dispatch:'病情急救',driver:'曹雪芹',tel:'186****2940',staff:['荣大海'],out:'乌审旗采气区集气站',to:'乌审旗人民医院'}
|
||||
{id:1,date:'2026-09-08',point:'樊学作业区医疗点',plate:'CQ·0712A',type:'急救型',dispatch:'病情急救',driver:'田震',tel:'13936485218',staff:['韩东学','兰小娟'],out:'樊学作业区 7#井站',to:'CQ油田总医院'},
|
||||
{id:2,date:'2026-09-08',point:'姬圪台作业区医疗点',plate:'CQ·1366B',type:'急救型',dispatch:'伤情急救',driver:'冯保山',tel:'13581136174',staff:['窦志远','苗慧敏'],out:'姬圪台联合站',to:'庆阳市人民医院'},
|
||||
{id:3,date:'2026-09-07',point:'西峰基地医疗点',plate:'CQ·0208C',type:'转运型',dispatch:'日常巡诊',driver:'罗建平',tel:'15077088357',staff:['霍静怡'],out:'西峰基地机关',to:'西峰基地卫生室'},
|
||||
{id:4,date:'2026-09-07',point:'靖边气田医疗点',plate:'CQ·1533D',type:'急救型',dispatch:'应急戒备',driver:'邓成',tel:'13392699481',staff:['康永强','花灵芝'],out:'靖边净化厂',to:'现场应急指挥部'},
|
||||
{id:5,date:'2026-09-06',point:'安塞采油队长住点医疗室',plate:'CQ·0917E',type:'转运型',dispatch:'日常巡诊',driver:'苏文斌',tel:'15598486703',staff:['白宇峰'],out:'安塞基地队部',to:'吴起油田医院'},
|
||||
{id:6,date:'2026-09-06',point:'乌审旗采气区医疗点',plate:'CQ·2201F',type:'急救型',dispatch:'伤情急救',driver:'曹雪芹',tel:'18642802940',staff:['荣大海','花灵芝'],out:'苏里格南作业区营地',to:'乌审旗人民医院'},
|
||||
{id:7,date:'2026-09-05',point:'樊学作业区医疗点',plate:'CQ·0712A',type:'急救型',dispatch:'应急戒备',driver:'田震',tel:'13936485218',staff:['韩东学'],out:'樊学作业区应急演练现场',to:'演练指挥部'},
|
||||
{id:8,date:'2026-09-05',point:'姬圪台作业区医疗点',plate:'CQ·1366B',type:'急救型',dispatch:'病情急救',driver:'冯保山',tel:'13581136174',staff:['窦志远','屈二娃'],out:'姬圪台作业区 3#站',to:'庆阳市人民医院'},
|
||||
{id:9,date:'2026-09-04',point:'西峰基地医疗点',plate:'CQ·0208C',type:'转运型',dispatch:'病情急救',driver:'罗建平',tel:'15077088357',staff:['霍静怡'],out:'西峰基地生活区',to:'第四采油厂总医院'},
|
||||
{id:10,date:'2026-09-04',point:'靖边气田医疗点',plate:'CQ·1533D',type:'急救型',dispatch:'日常巡诊',driver:'邓成',tel:'13392699481',staff:['康永强'],out:'靖边气田井场巡诊',to:'靖边气田医疗点'},
|
||||
{id:11,date:'2026-09-03',point:'安塞采油队长住点医疗室',plate:'CQ·0917E',type:'转运型',dispatch:'日常巡诊',driver:'苏文斌',tel:'15598486703',staff:['白宇峰','牛玉洁'],out:'安塞基地各井站',to:'安塞采油队长住点医疗室'},
|
||||
{id:12,date:'2026-09-03',point:'乌审旗采气区医疗点',plate:'CQ·2201F',type:'急救型',dispatch:'病情急救',driver:'曹雪芹',tel:'18642802940',staff:['荣大海'],out:'乌审旗采气区集气站',to:'乌审旗人民医院'}
|
||||
];
|
||||
var nextId=13,editingId=null,pendingDelId=null;
|
||||
var dispatchBadge={'病情急救':'badge--danger','伤情急救':'badge--warning','日常巡诊':'badge--info','应急戒备':'badge--success'};
|
||||
@@ -678,7 +681,7 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
onFilterPoint();renderStats();renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.page-header{margin-bottom:16px;display:flex;align-items:center;gap:12px;}
|
||||
.page-header__back{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--primary);text-decoration:none;padding:4px 10px;border:1px solid var(--primary);border-radius:var(--radius-sm);background:#fff;}
|
||||
@@ -132,15 +133,17 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item active">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -390,7 +393,7 @@ function saveMed(){
|
||||
showToast('新增用药已保存(演示)');
|
||||
}
|
||||
renderHead();renderAll();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -148,15 +149,17 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item active">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -570,7 +573,7 @@ function showToast(msg){
|
||||
|
||||
renderTable();
|
||||
document.addEventListener('click',function(){document.getElementById('orgPanel').classList.remove('open');});
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>健康宣教管理 | 一线医疗</title>
|
||||
<title>健康宣教 | 一线医疗</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:var(--font-sm);background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -119,6 +120,27 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
.modal{width:440px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:24px;}
|
||||
.modal__title{font-size:var(--font-base);font-weight:600;margin-bottom:12px;display:flex;align-items:center;gap:8px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:8px;}
|
||||
/* 负责人签字 */
|
||||
.sign-box{border:1px dashed #B7C3D6;border-radius:8px;background:#F7F9FC;height:110px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#969EB0;font-size:13px;cursor:pointer;}
|
||||
.sign-box svg{width:22px;height:22px;stroke:#969EB0;fill:none;stroke-width:2;}
|
||||
.radio{display:flex;gap:18px;align-items:center;font-size:13px;color:#333;}
|
||||
.radio input{accent-color:#1890FF;width:14px;height:14px;}
|
||||
.sign-note{display:flex;align-items:center;gap:6px;font-size:12px;color:#4A5A7F;margin-top:10px;}
|
||||
.sign-view{display:flex;flex-direction:column;align-items:flex-start;gap:6px;}
|
||||
.sign-view__name{font-family:KaiTi,serif;font-size:26px;color:#333;}
|
||||
.sign-view__note{font-size:11px;color:#969EB0;}
|
||||
.sign-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:970;align-items:center;justify-content:center;}
|
||||
.sign-mask.open{display:flex;}
|
||||
.sign-modal{background:#fff;border-radius:12px;width:720px;display:flex;flex-direction:column;box-shadow:0 12px 40px rgba(0,0,0,.25);}
|
||||
.sign-modal__head{padding:15px 20px;border-bottom:1px solid #F0F2F5;display:flex;align-items:center;}
|
||||
.sign-modal__title{font-size:15px;font-weight:600;color:#333;flex:1;}
|
||||
.sign-modal__close{cursor:pointer;color:#999;font-size:18px;border:none;background:none;}
|
||||
.sign-modal__foot{padding:13px 20px;border-top:1px solid #F0F2F5;display:flex;justify-content:flex-end;gap:10px;}
|
||||
.canvas-wrap{position:relative;margin:20px;border:1px solid #DDD;background:#EEE;border-radius:6px;overflow:hidden;}
|
||||
.canvas-wrap canvas{display:block;width:100%;height:260px;cursor:crosshair;}
|
||||
.canvas-hint{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#BBB;font-size:14px;pointer-events:none;}
|
||||
.eraser{position:absolute;right:12px;bottom:12px;width:40px;height:40px;border-radius:8px;border:1px solid #D9DEE8;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;}
|
||||
.eraser svg{width:20px;height:20px;stroke:#4A5A7F;fill:none;stroke-width:2;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -149,15 +171,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item active">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item active">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -166,8 +190,8 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label id="lblFilterTheme">宣教主题</label>
|
||||
<input class="filter-input" id="filterTheme" placeholder="请输入主题关键字">
|
||||
<label id="lblFilterTheme">活动标题</label>
|
||||
<input class="filter-input" id="filterTheme" placeholder="请输入活动标题">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>医疗点所属单位</label>
|
||||
@@ -183,7 +207,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>宣教日期</label>
|
||||
<label>开展日期</label>
|
||||
<input class="filter-input" type="date" id="filterFrom" style="min-width:130px;">
|
||||
<span style="color:var(--text-placeholder);">至</span>
|
||||
<input class="filter-input" type="date" id="filterTo" style="min-width:130px;">
|
||||
@@ -194,7 +218,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] Tab切换:健康宣教/急救培训(老系统为同一数据模型,publicityType=1/0 区分,仅文案与列名切换) -->
|
||||
<!-- [交互] Tab切换:健康宣教/急救培训(仅筛选类型,字段文案统一) -->
|
||||
<div class="tabs-bar" style="margin-top:16px;">
|
||||
<button class="tab-btn active" id="tabEdu" onclick="switchTab(1)">健康宣教 <span class="cnt" id="cntEdu"></span></button>
|
||||
<button class="tab-btn" id="tabTr" onclick="switchTab(0)">急救培训 <span class="cnt" id="cntTr"></span></button>
|
||||
@@ -203,11 +227,9 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-primary" id="btnAdd" onclick="openForm()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg><span id="addBtnText">新增宣教记录</span>
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="#fff" stroke-width="1.6" stroke-linecap="round"/></svg><span id="addBtnText">新增活动</span>
|
||||
</button>
|
||||
<button class="btn btn-default btn-link--danger" onclick="askBatchDelete()">批量删除</button>
|
||||
<button class="btn btn-primary" onclick="doExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
<button class="btn btn-default" onclick="openExport()"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
@@ -216,7 +238,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th id="thTheme">宣教主题</th><th id="thDate">宣教日期</th><th>开展医疗点</th><th>所属单位</th><th>覆盖区域</th><th>参加人数</th><th>主讲人</th><th id="thContent">宣教内容</th><th>操作</th>
|
||||
<th style="width:40px"><input type="checkbox" id="checkAll" onchange="toggleAll(this)"></th><th>序号</th><th>活动标题</th><th>开展日期</th><th>开展医疗点</th><th>所属单位</th><th>覆盖区域</th><th>参加人数</th><th>活动内容</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -235,18 +257,19 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 新增/编辑宣教抽屉 -->
|
||||
<div class="drawer-mask" id="formMask" onclick="closeDrawer('form')"></div>
|
||||
<div class="drawer" id="formDrawer">
|
||||
<div class="drawer__header"><span id="formTitle">新增宣教记录</span><button class="drawer__close" onclick="closeDrawer('form')">×</button></div>
|
||||
<div class="drawer__header"><span id="formTitle">新增活动</span><button class="drawer__close" onclick="closeDrawer('form')">×</button></div>
|
||||
<div class="drawer__body">
|
||||
<div class="form-section" style="margin-top:0;" id="formSecTitle">宣教活动信息</div>
|
||||
<div class="form-section" style="margin-top:0;" id="formSecTitle">活动信息</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> <span id="lblTheme">宣教主题</span></span><input class="form-control" id="eTheme" placeholder="如:全国高血压日专题宣教"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> <span id="lblDate">宣教日期</span></span><input class="form-control" type="date" id="eDate"></div>
|
||||
<div class="form-item"><span class="form-label">主讲人</span><input class="form-control" id="eLecturer" placeholder="医护人员姓名"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 活动类型</span>
|
||||
<span class="radio"><label><input type="radio" name="eType" value="1" checked>健康宣教</label><label><input type="radio" name="eType" value="0">急救培训</label></span></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> <span id="lblDate">开展日期</span></span><input class="form-control" type="date" id="eDate"></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> <span id="lblTheme">活动标题</span></span><input class="form-control" id="eTheme" placeholder="如:全国高血压日专题宣教"></div>
|
||||
<div class="form-item"><span class="form-label"><span class="req">*</span> 开展医疗点</span>
|
||||
<select class="form-control" id="ePoint"><option value="">请选择医疗点</option></select></div>
|
||||
<div class="form-item"><span class="form-label">覆盖区域</span><input class="form-control" id="eArea" placeholder="如:桐园作业区各井站"></div>
|
||||
<div class="form-item"><span class="form-label">参加人数</span><input class="form-control" type="number" id="eNum" placeholder="现场签到人数"></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> <span id="lblContent">宣教内容</span></span><textarea class="form-control" id="eContent" placeholder="活动内容与要点摘要"></textarea></div>
|
||||
<div class="form-item form-item--full"><span class="form-label"><span class="req">*</span> <span id="lblContent">活动内容</span></span><textarea class="form-control" id="eContent" placeholder="活动内容与要点摘要"></textarea></div>
|
||||
</div>
|
||||
<div class="form-section" id="secPhoto">现场照片</div>
|
||||
<div class="photo-row">
|
||||
@@ -254,21 +277,28 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="photo-ph"><svg width="18" height="18" viewBox="0 0 18 18" fill="none"><rect x="1" y="4" width="16" height="12" rx="2" stroke="#bbb" stroke-width="1.3"/><circle cx="9" cy="10" r="3.2" stroke="#bbb" stroke-width="1.3"/><path d="M6 4l1.2-2h3.6L12 4" stroke="#bbb" stroke-width="1.3"/></svg>照片 2</div>
|
||||
<div class="photo-ph" onclick="showToast('照片上传功能演示')"><svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M9 4v10M4 9h10" stroke="#bbb" stroke-width="1.5" stroke-linecap="round"/></svg>继续添加</div>
|
||||
</div>
|
||||
<div class="form-section" id="secMaterial">宣教资料</div>
|
||||
<div class="form-section" id="secMaterial">活动资料</div>
|
||||
<div class="upload-box" id="materialBox" onclick="showToast('资料上传功能演示')">
|
||||
<svg width="18" height="18" viewBox="0 0 20 20" fill="none"><path d="M10 13V4m0 0L6.5 7.5M10 4l3.5 3.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M3 14v2a2 2 0 002 2h10a2 2 0 002-2v-2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
<span id="materialText">点击上传宣教手册 / PPT / 折页等电子资料(支持 PDF、PPT,单个不超过 20MB)</span>
|
||||
<span id="materialText">点击上传活动手册 / PPT / 折页等电子资料(支持 PDF、Word、Excel、PPT,单个不超过 20MB)</span>
|
||||
</div>
|
||||
<div class="form-section">员工确认签字</div>
|
||||
<div class="upload-box">
|
||||
<svg width="18" height="18" viewBox="0 0 20 20" fill="none"><path d="M3 17c2-4 4 3 6-2s3 4 8-1" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round"/></svg>
|
||||
参加人员在 PAD 端签到屏完成电子确认签字,签到记录自动回传关联本宣教活动
|
||||
</div>
|
||||
<div class="form-section">签字图片</div>
|
||||
<div class="photo-row" id="signImgRow">
|
||||
<div class="photo-ph" id="signImgPh" onclick="showToast('签字图片上传功能演示')">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M9 4v10M4 9h10" stroke="#bbb" stroke-width="1.5" stroke-linecap="round"/></svg>上传签字图片
|
||||
<div class="form-section">负责人签字</div>
|
||||
<div class="form-item" style="margin-bottom:0;">
|
||||
<span class="form-label"><span class="req">*</span> 签字</span>
|
||||
<div class="radio">
|
||||
<label><input type="radio" name="signType" value="hand" checked onclick="switchSignType('hand')">手写签名</label>
|
||||
<label><input type="radio" name="signType" value="img" onclick="switchSignType('img')">签字图片</label>
|
||||
</div>
|
||||
<div class="sign-box" id="signHandBox" onclick="openSign()">
|
||||
<svg viewBox="0 0 24 24"><path d="M17 3a2.8 2.8 0 014 4L7.5 20.5 2 22l1.5-5.5z"/></svg>
|
||||
点击签名
|
||||
</div>
|
||||
<div class="sign-box" id="signImgBox" style="display:none;" onclick="document.getElementById('signImgInput').click()">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 16V4M7 9l5-5 5 5"/><path d="M4 20h16"/></svg>
|
||||
上传签字图片
|
||||
</div>
|
||||
<input type="file" id="signImgInput" accept="image/*" style="display:none;" onchange="onSignImg(this)">
|
||||
<div class="sign-note" style="margin-top:0;">签字确认该活动记录真实有效</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="drawer__footer">
|
||||
@@ -280,7 +310,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<!-- [交互] 查看详情抽屉 -->
|
||||
<div class="drawer-mask" id="viewMask" onclick="closeDrawer('view')"></div>
|
||||
<div class="drawer" id="viewDrawer">
|
||||
<div class="drawer__header"><span id="viewTitle">宣教详情</span><button class="drawer__close" onclick="closeDrawer('view')">×</button></div>
|
||||
<div class="drawer__header"><span id="viewTitle">活动详情</span><button class="drawer__close" onclick="closeDrawer('view')">×</button></div>
|
||||
<div class="drawer__body" id="viewBody"></div>
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('view')">关闭</button></div>
|
||||
</div>
|
||||
@@ -289,7 +319,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="modal-mask" id="delMask">
|
||||
<div class="modal">
|
||||
<div class="modal__title"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#FAAD14" stroke-width="1.6"/><path d="M10 5.5v6M10 13.5v1" stroke="#FAAD14" stroke-width="1.8" stroke-linecap="round"/></svg> 删除确认</div>
|
||||
<div id="delText">确认删除该条宣教记录?</div>
|
||||
<div id="delText">确认删除该条活动记录?</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('delMask')">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmDelete()">确认删除</button>
|
||||
@@ -310,6 +340,22 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="drawer__footer"><button class="btn btn-default" onclick="closeDrawer('export')">关闭</button></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 手写签名弹窗 -->
|
||||
<div class="sign-mask" id="signMask">
|
||||
<div class="sign-modal">
|
||||
<div class="sign-modal__head"><span class="sign-modal__title">负责人签字</span><button class="sign-modal__close" onclick="closeSign()">✕</button></div>
|
||||
<div class="canvas-wrap">
|
||||
<canvas id="signCanvas" width="780" height="260"></canvas>
|
||||
<div class="canvas-hint" id="signHint">请在区域内签名<div style="font-size:12px;">保证字迹清晰可辨</div></div>
|
||||
<button class="eraser" onclick="clearCanvas()" title="清空"><svg viewBox="0 0 24 24"><path d="M20 20H8.5l-4-4a2 2 0 010-2.8l8.2-8.2a2 2 0 012.8 0l5 5a2 2 0 010 2.8L13 20M8 11l6 6"/></svg></button>
|
||||
</div>
|
||||
<div class="sign-modal__foot">
|
||||
<button class="btn btn-default" onclick="closeSign()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmSign()">确认</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
@@ -324,43 +370,21 @@ var pointMap={
|
||||
/* 全量医疗点(新增/编辑直接选择,不依赖单位联动) */
|
||||
var allPoints=[];
|
||||
Object.keys(pointMap).forEach(function(u){pointMap[u].forEach(function(p){allPoints.push(p);});});
|
||||
/* 签字图片回显与占位(纯静态原型,用内联 SVG 模拟签字图片) */
|
||||
var SIGN_IMG_THUMB='<svg width="34" height="20" viewBox="0 0 40 22" fill="none"><path d="M4 17c4-6 8 4 11-3s6 5 12-1 5 2 9-2" stroke="#1890FF" stroke-width="1.6" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg><span>签字图片</span>';
|
||||
var SIGN_IMG_PLACEHOLDER='<svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M9 4v10M4 9h10" stroke="#bbb" stroke-width="1.5" stroke-linecap="round"/></svg>上传签字图片';
|
||||
/* type:1=健康宣教 0=急救培训(与老系统 publicityType 口径一致) */
|
||||
/* type:1=健康宣教 0=急救培训 */
|
||||
var typeMap={1:'健康宣教',0:'急救培训'};
|
||||
var edus=[
|
||||
{id:1,type:1,theme:'全国高血压日:减盐降血压专题宣教',date:'2026-09-02',point:'桐园作业区医疗点',area:'桐园作业区各井站、联合站',num:86,lecturer:'曲志明',content:'讲解高血压危害与低盐饮食要点,现场免费测血压42人次,发放限盐勺与宣教折页。'},
|
||||
{id:2,type:1,theme:'联合国糖尿病日:吃动平衡控血糖',date:'2026-08-24',point:'西峰基地医疗点',area:'基地管理处及后勤单元',num:64,lecturer:'闫婷',content:'糖尿病饮食换算实操演示,餐后运动处方宣讲,血糖义务检测31人次。'},
|
||||
{id:3,type:0,theme:'现场急救技能培训(心肺复苏+AED)',date:'2026-08-15',point:'樊学作业区医疗点',area:'樊学作业区倒班点',num:52,lecturer:'李桂芳',content:'CPR操作要领与AED使用流程分组的演练,逐人考核通过47人,发放急救明白卡。'},
|
||||
{id:4,type:0,theme:'夏季高温防暑与中暑急救培训',date:'2026-07-18',point:'乌审旗采气区医疗点',area:'苏里格南作业区井场',num:73,lecturer:'刘玉梅',content:'先兆中暑识别与处置流程实操,防暑药品配备讲解,现场发放藿香正气类物资。'},
|
||||
{id:5,type:1,theme:'职业人群颈椎健康与工间操推广',date:'2026-07-05',point:'姬圪台作业区医疗点',area:'姬圪台联合站中控、化验室',num:45,lecturer:'张秀兰',content:'久坐危害讲解,颈椎工间操带练教学,建立各班组工间操提醒机制。'},
|
||||
{id:6,type:1,theme:'低盐低脂饮食与血脂管理讲座',date:'2026-06-20',point:'姬圪台作业区医疗点',area:'姬圪台作业区食堂',num:58,lecturer:'曲志明',content:'血脂异常人群配餐原则,食堂减油减盐行动倡议,现场答疑并发放食谱卡。'},
|
||||
{id:7,type:0,theme:'创伤救护四项技术(止血包扎固定搬运)培训',date:'2026-06-06',point:'姬圪台作业区医疗点',area:'姬圪台联合站各班组',num:48,lecturer:'张秀兰',content:'绷带三角巾包扎、夹板固定与脊柱板搬运分项实操,逐组过关考核通过44人。'},
|
||||
{id:8,type:1,theme:'无烟单位健康宣教周活动',date:'2026-05-30',point:'安塞采油队长住点医疗室',area:'安塞长住点全区域',num:91,lecturer:'白瑞',content:'世界无烟日主题宣讲,戒烟门诊转介渠道说明,签名承诺活动参与76人。'},
|
||||
{id:9,type:1,theme:'女性健康两癌筛查知识讲座',date:'2026-05-14',point:'靖边气田医疗点',area:'靖边净化厂女工集中单元',num:39,lecturer:'刘玉梅',content:'乳腺癌宫颈癌筛查指征与周期讲解,预约转诊通道介绍,现场咨询12人次。'},
|
||||
{id:10,type:0,theme:'受限空间窒息事故急救演练',date:'2026-04-22',point:'靖边气田医疗点',area:'靖边净化厂检修现场',num:35,lecturer:'李桂芳',content:'受限空间窒息事故情景模拟,救援佩戴与心肺复苏衔接流程演练,复盘讲评。'}
|
||||
{id:1,type:1,theme:'全国高血压日:减盐降血压专题宣教',date:'2026-09-02',point:'桐园作业区医疗点',area:'桐园作业区各井站、联合站',num:86,content:'讲解高血压危害与低盐饮食要点,现场免费测血压42人次,发放限盐勺与宣教折页。'},
|
||||
{id:2,type:1,theme:'联合国糖尿病日:吃动平衡控血糖',date:'2026-08-24',point:'西峰基地医疗点',area:'基地管理处及后勤单元',num:64,content:'糖尿病饮食换算实操演示,餐后运动处方宣讲,血糖义务检测31人次。'},
|
||||
{id:3,type:0,theme:'现场急救技能培训(心肺复苏+AED)',date:'2026-08-15',point:'樊学作业区医疗点',area:'樊学作业区倒班点',num:52,content:'CPR操作要领与AED使用流程分组的演练,逐人考核通过47人,发放急救明白卡。'},
|
||||
{id:4,type:0,theme:'夏季高温防暑与中暑急救培训',date:'2026-07-18',point:'乌审旗采气区医疗点',area:'苏里格南作业区井场',num:73,content:'先兆中暑识别与处置流程实操,防暑药品配备讲解,现场发放藿香正气类物资。'},
|
||||
{id:5,type:1,theme:'职业人群颈椎健康与工间操推广',date:'2026-07-05',point:'姬圪台作业区医疗点',area:'姬圪台联合站中控、化验室',num:45,content:'久坐危害讲解,颈椎工间操带练教学,建立各班组工间操提醒机制。'},
|
||||
{id:6,type:1,theme:'低盐低脂饮食与血脂管理讲座',date:'2026-06-20',point:'姬圪台作业区医疗点',area:'姬圪台作业区食堂',num:58,content:'血脂异常人群配餐原则,食堂减油减盐行动倡议,现场答疑并发放食谱卡。'},
|
||||
{id:7,type:0,theme:'创伤救护四项技术(止血包扎固定搬运)培训',date:'2026-06-06',point:'姬圪台作业区医疗点',area:'姬圪台联合站各班组',num:48,content:'绷带三角巾包扎、夹板固定与脊柱板搬运分项实操,逐组过关考核通过44人。'},
|
||||
{id:8,type:1,theme:'无烟单位健康宣教周活动',date:'2026-05-30',point:'安塞采油队长住点医疗室',area:'安塞长住点全区域',num:91,content:'世界无烟日主题宣讲,戒烟门诊转介渠道说明,签名承诺活动参与76人。'},
|
||||
{id:9,type:1,theme:'女性健康两癌筛查知识讲座',date:'2026-05-14',point:'靖边气田医疗点',area:'靖边净化厂女工集中单元',num:39,content:'乳腺癌宫颈癌筛查指征与周期讲解,预约转诊通道介绍,现场咨询12人次。'},
|
||||
{id:10,type:0,theme:'受限空间窒息事故急救演练',date:'2026-04-22',point:'靖边气田医疗点',area:'靖边净化厂检修现场',num:35,content:'受限空间窒息事故情景模拟,救援佩戴与心肺复苏衔接流程演练,复盘讲评。'}
|
||||
];
|
||||
var nextId=11,editingId=null,pendingDelId=null,curTab=1;
|
||||
/* 当前Tab文案映射:宣教↔培训 */
|
||||
function T(a,b){return curTab===1?a:b;}
|
||||
function switchTab(t){
|
||||
curTab=t;currentPage=1;
|
||||
document.getElementById('tabEdu').classList.toggle('active',t===1);
|
||||
document.getElementById('tabTr').classList.toggle('active',t===0);
|
||||
document.getElementById('thTheme').textContent=T('宣教主题','培训标题');
|
||||
document.getElementById('thDate').textContent=T('宣教日期','培训日期');
|
||||
document.getElementById('thContent').textContent=T('宣教内容','培训内容');
|
||||
document.getElementById('addBtnText').textContent=T('新增宣教记录','新增急救培训');
|
||||
document.getElementById('lblFilterTheme').textContent=T('宣教主题','培训标题');
|
||||
document.getElementById('formSecTitle').textContent=T('宣教活动信息','培训活动信息');
|
||||
document.getElementById('lblTheme').textContent=T('宣教主题','培训标题');
|
||||
document.getElementById('lblDate').textContent=T('宣教日期','培训日期');
|
||||
document.getElementById('lblContent').textContent=T('宣教内容','培训内容');
|
||||
document.getElementById('secPhoto').textContent=T('现场照片','现场培训照片');
|
||||
document.getElementById('secMaterial').textContent=T('宣教资料','培训资料');
|
||||
document.getElementById('materialText').textContent=T('点击上传宣教手册 / PPT / 折页等电子资料(支持 PDF、PPT,单个不超过 20MB)','点击上传培训课件 / 操作手册 / 明白卡等电子资料(支持 PDF、PPT,单个不超过 20MB)');
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 异步导出与导出任务 ===== */
|
||||
var exportLogs=[
|
||||
@@ -392,7 +416,7 @@ function nowHM(){
|
||||
return '2026-09-07 '+p(d.getHours())+':'+p(d.getMinutes());
|
||||
}
|
||||
function doExport(){
|
||||
exportLogs.unshift({file:T('健康教育台账导出_','急救培训台账导出_')+nowHM()+'.xlsx',status:'ing',time:'—'});
|
||||
exportLogs.unshift({file:'活动台账导出_'+nowHM()+'.xlsx',status:'ing',time:'—'});
|
||||
showToast('导出任务已提交,完成后可在「查看导出任务」下载');
|
||||
if(document.getElementById('exportDrawer').classList.contains('open'))renderExportList();
|
||||
setTimeout(function(){
|
||||
@@ -418,7 +442,7 @@ function askBatchDelete(){
|
||||
var ids=[].slice.call(document.querySelectorAll('.row-check:checked')).map(function(c){return parseInt(c.value);});
|
||||
if(!ids.length){showToast('请先勾选要删除的记录');return;}
|
||||
pendingDelId=null;delMode='batch';
|
||||
document.getElementById('delText').textContent='确认删除勾选的 '+ids.length+' 条'+T('宣教记录','急救培训')+'?删除后关联的签到记录一并解除关联。';
|
||||
document.getElementById('delText').textContent='确认删除勾选的 '+ids.length+' 条活动记录?删除后关联的签到记录一并解除关联。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
window._batchIds=ids;
|
||||
}
|
||||
@@ -444,6 +468,12 @@ function currentData(){
|
||||
&&(!from||e.date>=from)&&(!to||e.date<=to);
|
||||
});
|
||||
}
|
||||
function switchTab(t){
|
||||
curTab=t;currentPage=1;
|
||||
document.getElementById('tabEdu').classList.toggle('active',t===1);
|
||||
document.getElementById('tabTr').classList.toggle('active',t===0);
|
||||
renderTable();
|
||||
}
|
||||
function renderTabCounts(){
|
||||
document.getElementById('cntEdu').textContent=edus.filter(function(e){return e.type===1;}).length;
|
||||
document.getElementById('cntTr').textContent=edus.filter(function(e){return e.type===0;}).length;
|
||||
@@ -458,7 +488,7 @@ function renderTable(){
|
||||
document.getElementById('prevBtn').disabled=currentPage<=1;
|
||||
document.getElementById('nextBtn').disabled=currentPage>=totalPages;
|
||||
var tbody=document.getElementById('tableBody');
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="11" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
if(!pageData.length){tbody.innerHTML='<tr><td colspan="10" class="td-empty">暂无匹配数据</td></tr>';return;}
|
||||
var html='';
|
||||
pageData.forEach(function(e,i){
|
||||
html+='<tr>'
|
||||
@@ -467,7 +497,7 @@ function renderTable(){
|
||||
+'<td style="font-weight:600;text-align:left;max-width:230px;overflow:hidden;text-overflow:ellipsis;" title="'+e.theme+'">'+e.theme+'</td>'
|
||||
+'<td>'+e.date+'</td><td>'+e.point+'</td><td>'+pointUnit[e.point]+'</td>'
|
||||
+'<td style="max-width:170px;overflow:hidden;text-overflow:ellipsis;" title="'+e.area+'">'+e.area+'</td>'
|
||||
+'<td><span class="badge badge--info">'+e.num+' 人</span></td><td>'+e.lecturer+'</td>'
|
||||
+'<td><span class="badge badge--info">'+e.num+' 人</span></td>'
|
||||
+'<td style="text-align:left;max-width:220px;overflow:hidden;text-overflow:ellipsis;" title="'+e.content+'">'+e.content+'</td>'
|
||||
+'<td class="td-actions">'
|
||||
+'<button class="btn btn-link" onclick="openView('+e.id+')">详情</button>'
|
||||
@@ -497,27 +527,19 @@ function initPointOptions(){
|
||||
sel.innerHTML='<option value="">请选择医疗点</option>';
|
||||
allPoints.forEach(function(p){var o=document.createElement('option');o.textContent=p;sel.appendChild(o);});
|
||||
}
|
||||
function renderSignImg(hasImg){
|
||||
var row=document.getElementById('signImgRow');
|
||||
if(hasImg){
|
||||
row.innerHTML='<div class="photo-ph" style="border-color:#1890FF;background:#fff;cursor:pointer;" onclick="showToast(\'签字图片查看演示\')">'+SIGN_IMG_THUMB+'</div>';
|
||||
}else{
|
||||
row.innerHTML='<div class="photo-ph" id="signImgPh" onclick="showToast(\'签字图片上传功能演示\')">'+SIGN_IMG_PLACEHOLDER+'</div>';
|
||||
}
|
||||
}
|
||||
function openForm(id){
|
||||
editingId=id||null;
|
||||
var e=id?edus.find(function(x){return x.id===id;}):null;
|
||||
document.getElementById('formTitle').textContent=id?((curTab===1?'编辑宣教记录 · ':'编辑急救培训 · ')+e.theme):T('新增宣教记录','新增急救培训');
|
||||
document.getElementById('formTitle').textContent=id?'编辑活动':'新增活动';
|
||||
document.querySelector('input[name="eType"][value="'+(e?String(e.type):String(curTab))+'"]').checked=true;
|
||||
document.getElementById('eTheme').value=e?e.theme:'';
|
||||
document.getElementById('eDate').value=e?e.date:'2026-09-07';
|
||||
document.getElementById('eLecturer').value=e?e.lecturer:'';
|
||||
initPointOptions();
|
||||
document.getElementById('ePoint').value=e?e.point:'';
|
||||
document.getElementById('eArea').value=e?e.area:'';
|
||||
document.getElementById('eNum').value=e?e.num:'';
|
||||
document.getElementById('eContent').value=e?e.content:'';
|
||||
renderSignImg(!!e);
|
||||
resetSign();
|
||||
document.getElementById('formMask').classList.add('open');
|
||||
document.getElementById('formDrawer').classList.add('open');
|
||||
}
|
||||
@@ -526,39 +548,36 @@ function saveForm(){
|
||||
var date=document.getElementById('eDate').value;
|
||||
var point=document.getElementById('ePoint').value;
|
||||
var content=document.getElementById('eContent').value.trim();
|
||||
if(!theme){showToast('请填写'+T('宣教主题','培训标题'));return;}
|
||||
if(!date){showToast('请选择'+T('宣教日期','培训日期'));return;}
|
||||
if(!theme){showToast('请填写活动标题');return;}
|
||||
if(!date){showToast('请选择开展日期');return;}
|
||||
if(!point){showToast('请选择开展医疗点');return;}
|
||||
if(!content){showToast('请填写'+T('宣教内容','培训内容'));return;}
|
||||
if(!content){showToast('请填写活动内容');return;}
|
||||
var obj={
|
||||
id:editingId||nextId++,type:curTab,theme:theme,date:date,point:point,
|
||||
id:editingId||nextId++,type:parseInt(document.querySelector('input[name="eType"]:checked').value,10),theme:theme,date:date,point:point,
|
||||
area:document.getElementById('eArea').value||'—',
|
||||
num:parseInt(document.getElementById('eNum').value)||0,
|
||||
lecturer:document.getElementById('eLecturer').value||'—',
|
||||
content:content
|
||||
};
|
||||
if(editingId){edus.splice(edus.findIndex(function(x){return x.id===editingId;}),1,obj);}
|
||||
else{edus.unshift(obj);}
|
||||
closeDrawer('form');renderTable();
|
||||
showToast(editingId?T('宣教记录已更新','急救培训已更新'):T('宣教记录已保存,PAD 端签到数据将自动关联','急救培训已保存,PAD 端签到数据将自动关联'));
|
||||
showToast(editingId?'活动记录已更新':'活动记录已保存,PAD 端签到数据将自动关联');
|
||||
}
|
||||
|
||||
/* ===== 详情 ===== */
|
||||
function openView(id){
|
||||
var e=edus.find(function(x){return x.id===id;});
|
||||
document.getElementById('viewTitle').textContent=T('宣教详情','急救培训详情');
|
||||
document.getElementById('viewTitle').textContent='活动详情';
|
||||
function d(k,v,full){return '<div class="detail-item'+(full?' detail-item--full':'')+'"><div class="dk">'+k+'</div><div class="dv">'+(v||'—')+'</div></div>';}
|
||||
document.getElementById('viewBody').innerHTML=
|
||||
'<div class="form-section" style="margin-top:0;">活动信息</div>'
|
||||
+'<div class="detail-grid">'+d(T('宣教主题','培训标题'),e.theme,true)+d(T('宣教日期','培训日期'),e.date)+d('主讲人',e.lecturer)+d('开展医疗点',e.point)+d('所属单位',pointUnit[e.point])+d('覆盖区域',e.area,true)+d('参加人数',e.num+' 人(PAD 端签到回传)')+d(T('宣教内容','培训内容'),e.content,true)+'</div>'
|
||||
+'<div class="form-section">'+T('现场照片','现场培训照片')+'</div>'
|
||||
+'<div class="detail-grid">'+d('活动类型',typeMap[e.type],true)+d('活动标题',e.theme,true)+d('开展日期',e.date)+d('开展医疗点',e.point)+d('所属单位',pointUnit[e.point])+d('覆盖区域',e.area,true)+d('参加人数',e.num+' 人(PAD 端签到回传)')+d('活动内容',e.content,true)+'</div>'
|
||||
+'<div class="form-section">现场照片</div>'
|
||||
+'<div class="photo-row"><div class="photo-ph">照片 1</div><div class="photo-ph">照片 2</div></div>'
|
||||
+'<div class="form-section">'+T('宣教资料','培训资料')+'</div>'
|
||||
+'<div class="upload-box"><svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 2h8l4 4v12H4z" stroke="#999" stroke-width="1.4" fill="none"/><path d="M12 2v4h4" stroke="#999" stroke-width="1.4"/></svg>《'+e.theme+'》'+T('宣教手册','培训资料')+'.pdf(演示附件)</div>'
|
||||
+'<div class="form-section">员工确认签字</div>'
|
||||
+'<div class="upload-box"><svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M3 17c2-4 4 3 6-2s3 4 8-1" stroke="#999" stroke-width="1.5" fill="none" stroke-linecap="round"/></svg>参加人员在 PAD 端签到屏完成电子确认签字,签到记录自动回传关联本'+T('宣教活动','培训活动')+'</div>'
|
||||
+'<div class="form-section">签字图片</div>'
|
||||
+'<div class="photo-row"><div class="photo-ph" style="border-color:#1890FF;background:#fff;cursor:pointer;" onclick="showToast(\'签字图片查看演示\')">'+SIGN_IMG_THUMB+'</div></div>';
|
||||
+'<div class="form-section">活动资料</div>'
|
||||
+'<div class="upload-box"><svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 2h8l4 4v12H4z" stroke="#999" stroke-width="1.4" fill="none"/><path d="M12 2v4h4" stroke="#999" stroke-width="1.4"/></svg>《'+e.theme+'》活动资料.pdf(演示附件)</div>'
|
||||
+'<div class="form-section">负责人签字</div>'
|
||||
+'<div class="sign-view"><span class="sign-view__name">负责人</span><span class="sign-view__note">已签名</span></div>';
|
||||
document.getElementById('viewMask').classList.add('open');
|
||||
document.getElementById('viewDrawer').classList.add('open');
|
||||
}
|
||||
@@ -567,19 +586,68 @@ function openView(id){
|
||||
function askDelete(id){
|
||||
pendingDelId=id;delMode='single';
|
||||
var e=edus.find(function(x){return x.id===id;});
|
||||
document.getElementById('delText').textContent='确认删除'+T('宣教记录','急救培训')+'「'+e.theme+'」?删除后关联的签到记录一并解除关联。';
|
||||
document.getElementById('delText').textContent='确认删除活动记录「'+e.theme+'」?删除后关联的签到记录一并解除关联。';
|
||||
document.getElementById('delMask').classList.add('open');
|
||||
}
|
||||
function confirmDelete(){
|
||||
if(delMode==='batch'){
|
||||
edus=edus.filter(function(e){return window._batchIds.indexOf(e.id)===-1;});
|
||||
closeModal('delMask');renderTable();
|
||||
showToast('已批量删除 '+window._batchIds.length+' 条'+T('宣教记录','急救培训'));
|
||||
showToast('已批量删除 '+window._batchIds.length+' 条活动记录');
|
||||
return;
|
||||
}
|
||||
edus=edus.filter(function(e){return e.id!==pendingDelId;});
|
||||
closeModal('delMask');renderTable();
|
||||
showToast(T('宣教记录已删除','急救培训已删除'));
|
||||
showToast('活动记录已删除');
|
||||
}
|
||||
|
||||
/* ===== 负责人签字(手写/图片,参考 medical-pad/health-education-drawer) ===== */
|
||||
var signType='hand',signDone=false;
|
||||
function switchSignType(type){
|
||||
signType=type;
|
||||
document.getElementById('signHandBox').style.display=type==='hand'?'flex':'none';
|
||||
document.getElementById('signImgBox').style.display=type==='hand'?'none':'flex';
|
||||
}
|
||||
function resetSign(){
|
||||
signType='hand';signDone=false;
|
||||
document.querySelector('input[name="signType"][value="hand"]').checked=true;
|
||||
document.getElementById('signHandBox').style.display='flex';
|
||||
document.getElementById('signImgBox').style.display='none';
|
||||
document.getElementById('signHandBox').innerHTML='<svg viewBox="0 0 24 24"><path d="M17 3a2.8 2.8 0 014 4L7.5 20.5 2 22l1.5-5.5z"/></svg>点击签名';
|
||||
document.getElementById('signImgBox').innerHTML='<svg viewBox="0 0 24 24"><path d="M12 16V4M7 9l5-5 5 5"/><path d="M4 20h16"/></svg>上传签字图片';
|
||||
}
|
||||
function openSign(){clearCanvas();document.getElementById('signMask').classList.add('open');}
|
||||
function closeSign(){document.getElementById('signMask').classList.remove('open');}
|
||||
function onSignImg(input){
|
||||
var f=input.files&&input.files[0];
|
||||
if(!f)return;
|
||||
var r=new FileReader();
|
||||
r.onload=function(e){
|
||||
document.getElementById('signImgBox').innerHTML='<img src="'+e.target.result+'" style="max-width:100%;max-height:80px;object-fit:contain;"><span style="font-size:11px;color:#969EB0;">已上传 · 点击可重新上传</span>';
|
||||
signDone=true;
|
||||
};
|
||||
r.readAsDataURL(f);
|
||||
}
|
||||
var signCanvas=null,signCtx=null,drawing=false,hasInk=false;
|
||||
function initSignCanvas(){
|
||||
signCanvas=document.getElementById('signCanvas');
|
||||
signCtx=signCanvas.getContext('2d');
|
||||
signCtx.lineWidth=3;signCtx.lineCap='round';signCtx.strokeStyle='#333';
|
||||
signCanvas.onmousedown=function(e){drawing=true;var p=canvasPos(e);signCtx.beginPath();signCtx.moveTo(p.x,p.y);};
|
||||
signCanvas.onmousemove=function(e){if(!drawing)return;var p=canvasPos(e);signCtx.lineTo(p.x,p.y);signCtx.stroke();hasInk=true;document.getElementById('signHint').style.display='none';};
|
||||
window.addEventListener('mouseup',function(){drawing=false;});
|
||||
}
|
||||
function canvasPos(e){
|
||||
var r=signCanvas.getBoundingClientRect();
|
||||
return {x:(e.clientX-r.left)*(signCanvas.width/r.width),y:(e.clientY-r.top)*(signCanvas.height/r.height)};
|
||||
}
|
||||
function clearCanvas(){signCtx.clearRect(0,0,signCanvas.width,signCanvas.height);hasInk=false;document.getElementById('signHint').style.display='flex';}
|
||||
function confirmSign(){
|
||||
if(!hasInk){showToast('您还没有进行签字');return;}
|
||||
var name='负责人';
|
||||
document.getElementById('signHandBox').innerHTML='<span style="font-size:26px;font-family:KaiTi,serif;color:#333;">'+name+'</span><span style="font-size:11px;color:#969EB0;">已签名 · 点击可重签</span>';
|
||||
signDone=true;
|
||||
closeSign();
|
||||
}
|
||||
|
||||
/* ===== 通用 ===== */
|
||||
@@ -594,7 +662,8 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
initSignCanvas();
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.page-header{margin-bottom:16px;display:flex;align-items:center;gap:12px;}
|
||||
.page-header__back{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--primary);text-decoration:none;padding:4px 10px;border:1px solid var(--primary);border-radius:var(--radius-sm);background:#fff;}
|
||||
@@ -196,15 +197,17 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item active">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -631,7 +634,7 @@ function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2200);
|
||||
}
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
renderHead();
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -131,15 +132,17 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item active">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -416,7 +419,7 @@ function showToast(msg){
|
||||
|
||||
renderTable();
|
||||
document.addEventListener('click',function(){document.getElementById('orgPanel').classList.remove('open');});
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,17 +30,16 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 16px;display:flex;align-items:center;gap:12px;flex-wrap:nowrap;margin-top:16px;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow-x:auto;}
|
||||
.filter-bar::-webkit-scrollbar{height:6px;}
|
||||
.filter-bar::-webkit-scrollbar-thumb{background:#E0E0E0;border-radius:3px;}
|
||||
.filter-bar{background:#fff;padding:16px 16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:16px;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:6px;flex-shrink:0;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;min-width:110px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
@@ -195,15 +194,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item active">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group open" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub active">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -454,7 +455,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏):与员工分配名册/慢病台账/随访管理勾稽 ===== */
|
||||
/* ===== 演示数据:与员工分配名册/慢病台账/随访管理勾稽 ===== */
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂','姬塬作业区医疗点':'采油一厂'};
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
@@ -463,16 +464,16 @@ var pointMap={
|
||||
'采气一厂':['靖边气田医疗点','乌审旗采气区医疗点']
|
||||
};
|
||||
var empPool=[
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,tel:'139****2051',idcard:'6101**********0011',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',group:'高血压'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,tel:'136****2248',idcard:'6101**********0022',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',group:'肥胖'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,tel:'137****8890',idcard:'6101**********0033',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',group:'冠心病'},
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,tel:'150****6127',idcard:'6101**********0044',unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',group:'高血压'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,tel:'139****0086',idcard:'6101**********0055',unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',group:'糖尿病'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,tel:'135****7719',idcard:'6101**********0066',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',group:'高血压'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,tel:'147****9003',idcard:'6101**********0077',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',group:'其他'},
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,tel:'155****3316',idcard:'6101**********0088',unit:'采油一厂',dept:'生产技术部',point:'安塞采油队长住点医疗室',group:'其他'},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,tel:'133****4860',idcard:'6101**********0099',unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',group:'肥胖'},
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,tel:'186****5527',idcard:'6101**********0100',unit:'第四采油厂',dept:'健康管理部',point:'西峰基地医疗点',group:'其他'}
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,tel:'13928562051',idcard:'610102197804154213',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',group:'高血压'},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,tel:'13649162248',idcard:'610102197912064629',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',group:'肥胖'},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,tel:'13720568890',idcard:'610102198209285310',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',group:'冠心病'},
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,tel:'15029836127',idcard:'610102198511224737',unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',group:'高血压'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,tel:'13956200086',idcard:'610102197406304419',unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',group:'糖尿病'},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,tel:'13572867719',idcard:'610102198408214523',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',group:'高血压'},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,tel:'14729539003',idcard:'610102198805174635',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',group:'其他'},
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,tel:'15529403316',idcard:'610102199307104517',unit:'采油一厂',dept:'生产技术部',point:'安塞采油队长住点医疗室',group:'其他'},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,tel:'13319284860',idcard:'610102198207153412',unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',group:'肥胖'},
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,tel:'18629135527',idcard:'610102199001184928',unit:'第四采油厂',dept:'健康管理部',point:'西峰基地医疗点',group:'其他'}
|
||||
];
|
||||
function E(code){return empPool.find(function(e){return e.code===code;});}
|
||||
/* 单次巡诊任务:status 1待随访 2已逾期 3已完成 */
|
||||
@@ -891,7 +892,7 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
switchTab('once');
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:12px;flex-wrap:nowrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -189,15 +190,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item active">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -487,7 +490,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏):随访对象为已分配员工 ===== */
|
||||
/* ===== 演示数据:随访对象为已分配员工 ===== */
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂'};
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
@@ -498,18 +501,18 @@ var pointMap={
|
||||
var doctorPool=['石维国','李桂芳','曲志明','张秀兰','高建军','闫婷','刘玉梅'];
|
||||
/* 可选随访员工池(与员工查询/员工分配一致的12人已分配名册) */
|
||||
var empPool=[
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'139****2051',point:'樊学作业区医疗点',chronic:'血压偏高'},
|
||||
{code:'CQ032144',name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'138****7742',point:'樊学作业区医疗点',chronic:''},
|
||||
{code:'CQ045130',name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'188****7214',point:'樊学作业区医疗点',chronic:''},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'137****8890',point:'姬圪台作业区医疗点',chronic:''},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'136****2248',point:'姬圪台作业区医疗点',chronic:'超重/血脂偏高'},
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'150****6127',point:'桐园作业区医疗点',chronic:'高血压2级'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'139****0086',point:'西峰基地医疗点',chronic:'2型糖尿病/超重'},
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'186****5527',point:'西峰基地医疗点',chronic:''},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'135****7719',point:'靖边气田医疗点',chronic:''},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'147****9003',point:'靖边气田医疗点',chronic:''},
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'155****3316',point:'安塞采油队长住点医疗室',chronic:''},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'133****4860',point:'乌审旗采气区医疗点',chronic:'超重'}
|
||||
{code:'CQ021578',name:'石维国',sex:'男',age:46,unit:'采油一厂',dept:'樊学作业区',tel:'13928562051',point:'樊学作业区医疗点',chronic:'血压偏高'},
|
||||
{code:'CQ032144',name:'李桂芳',sex:'女',age:38,unit:'采油一厂',dept:'樊学作业区',tel:'13836547742',point:'樊学作业区医疗点',chronic:''},
|
||||
{code:'CQ045130',name:'杨慧敏',sex:'女',age:33,unit:'采油一厂',dept:'樊学作业区',tel:'18829587214',point:'樊学作业区医疗点',chronic:''},
|
||||
{code:'CQ019203',name:'曲志明',sex:'男',age:42,unit:'采油二厂',dept:'姬圪台联合站',tel:'13720568890',point:'姬圪台作业区医疗点',chronic:''},
|
||||
{code:'CQ027710',name:'张秀兰',sex:'女',age:45,unit:'采油二厂',dept:'姬圪台联合站',tel:'13649162248',point:'姬圪台作业区医疗点',chronic:'超重/血脂偏高'},
|
||||
{code:'CQ033096',name:'赵万福',sex:'男',age:39,unit:'采油二厂',dept:'桐园作业区',tel:'15029836127',point:'桐园作业区医疗点',chronic:'高血压2级'},
|
||||
{code:'CQ010564',name:'高建军',sex:'男',age:50,unit:'第四采油厂',dept:'基地管理处',tel:'13956200086',point:'西峰基地医疗点',chronic:'2型糖尿病/超重'},
|
||||
{code:'CQ041822',name:'闫婷',sex:'女',age:34,unit:'第四采油厂',dept:'健康管理部',tel:'18629135527',point:'西峰基地医疗点',chronic:''},
|
||||
{code:'CQ036441',name:'刘玉梅',sex:'女',age:40,unit:'采气一厂',dept:'靖边净化厂',tel:'13572867719',point:'靖边气田医疗点',chronic:''},
|
||||
{code:'CQ029905',name:'呼建国',sex:'男',age:36,unit:'采气一厂',dept:'靖边净化厂',tel:'14729539003',point:'靖边气田医疗点',chronic:''},
|
||||
{code:'CQ044871',name:'白瑞',sex:'男',age:31,unit:'采油一厂',dept:'生产技术部',tel:'15529403316',point:'安塞采油队长住点医疗室',chronic:''},
|
||||
{code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',tel:'13319284860',point:'乌审旗采气区医疗点',chronic:'超重'}
|
||||
];
|
||||
/* 随访记录:s=症状 form=形式 confirm=员工确认 */
|
||||
var follows=[
|
||||
@@ -961,7 +964,7 @@ renderTable();
|
||||
var q=new URLSearchParams(location.search);
|
||||
if(q.get('action')==='new'){ setTimeout(function(){ openForm(); },100); }
|
||||
})();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>报告解读管理 | 一线医疗</title>
|
||||
<title>报告解读记录 | 一线医疗</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:var(--font-sm);background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -105,33 +106,27 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
.modal__close:hover{color:var(--text-primary);}
|
||||
.modal__body{flex:1;overflow-y:auto;padding:20px 24px;}
|
||||
.modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;}
|
||||
/* 详情弹窗左右两栏 */
|
||||
/* 解读详情弹窗左右两栏(参考 daily-interpret) */
|
||||
.report-cols{display:flex;gap:0;height:calc(90vh - 130px);}
|
||||
.report-cols__left{width:50%;overflow-y:auto;padding-right:20px;border-right:1px dashed var(--border);}
|
||||
.report-cols__right{width:50%;overflow-y:auto;padding-left:20px;}
|
||||
.report-title{font-size:var(--font-base);font-weight:700;padding:10px 0 10px 12px;position:relative;margin-top:4px;}
|
||||
.report-title::before{content:'';position:absolute;left:0;top:13px;width:6px;height:18px;background:#E3CB2C;border-radius:2px;}
|
||||
.report-sub{font-size:var(--font-sm);color:var(--text-secondary);line-height:1.7;padding:0 12px 8px;}
|
||||
.report-group{margin-top:16px;}
|
||||
.report-group__name{font-weight:700;font-size:var(--font-base);padding:10px 12px;background:#F6F6F6;border-radius:var(--radius-sm) var(--radius-sm) 0 0;}
|
||||
.report-cat{padding-left:20px;}
|
||||
.report-cat__name{font-size:var(--font-sm);font-weight:700;padding:10px 0 8px 12px;position:relative;}
|
||||
.report-cat__name::before{content:'';position:absolute;left:0;top:12px;width:6px;height:16px;background:#02C2A6;border-radius:2px;}
|
||||
.report-ul{padding:0;margin:0;width:100%;display:flex;}
|
||||
.report-ul li{flex:1;text-align:center;padding:6px 0;font-size:var(--font-sm);border:1px solid #E6E6E6;border-left:none;border-top:none;}
|
||||
.report-ul li:first-child{border-left:1px solid #E6E6E6;}
|
||||
.report-ul.report-ul--head{font-weight:700;}
|
||||
.report-ul.report-ul--head li{background:#F0F2FF;}
|
||||
.report-ul.report-ul--head li:first-child{background:#F0F2FF;}
|
||||
.report-ul:not(.report-ul--head) li:first-child{background:#F6F6F6;}
|
||||
.emp-basic{display:flex;flex-wrap:wrap;gap:4px 0;}
|
||||
.emp-basic div{font-size:var(--font-sm);color:var(--text-secondary);padding:4px 0;}
|
||||
.emp-basic b{color:var(--text-primary);font-weight:600;}
|
||||
.emp-basic .w25{width:25%;}
|
||||
.emp-basic .w50{width:50%;}
|
||||
.emp-basic .w100{width:100%;}
|
||||
.advise-box{background:#F4F4F4;border-radius:var(--radius-sm);padding:10px;font-size:var(--font-sm);line-height:1.7;color:var(--text-primary);min-height:88px;}
|
||||
.sign-box{border:1px dashed var(--border);border-radius:var(--radius-sm);padding:16px;text-align:center;min-height:100px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;}
|
||||
.report-cols__left{width:50%;overflow-y:auto;padding:16px 18px;border-right:1px dashed var(--border);}
|
||||
.report-cols__right{width:50%;overflow-y:auto;padding:16px 18px;background:#FAFBFD;}
|
||||
.rpt-title{font-size:15px;font-weight:600;color:#333;margin:14px 0 8px;padding-left:8px;border-left:4px solid #E3CB2C;}
|
||||
.rpt-title--sub{border-left-color:#02C2A6;}
|
||||
.rpt-text{font-size:12px;color:#4A5A7F;line-height:1.9;}
|
||||
.rpt-major{background:#F6F6F6;border-radius:8px;padding:8px 12px;font-size:13px;font-weight:600;color:#333;margin:12px 0 8px;}
|
||||
.rpt-table{width:100%;min-width:0;border-collapse:collapse;font-size:12px;margin-bottom:6px;}
|
||||
.rpt-table th{background:#F0F2FF;color:#4A5A7F;font-weight:500;padding:7px 10px;text-align:left;white-space:nowrap;}
|
||||
.rpt-table td{padding:7px 10px;border-bottom:1px solid #F0F2F5;color:#333;white-space:normal;word-break:break-word;}
|
||||
.rpt-table td.abnormal{color:#F5222D;font-weight:600;}
|
||||
.rpt-table thead th:last-child{position:static;right:auto;z-index:auto;background:#F0F2FF;box-shadow:none;}
|
||||
.rpt-table tbody td:last-child{position:static;right:auto;z-index:auto;background:transparent;box-shadow:none;}
|
||||
.form-card{background:#fff;border-radius:10px;padding:14px 16px;margin-bottom:12px;box-shadow:0 2px 8px rgba(74,90,127,.05);}
|
||||
.form-card__title{font-size:14px;font-weight:600;color:#333;margin-bottom:10px;padding-left:8px;border-left:3px solid #1890FF;}
|
||||
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 18px;font-size:12px;color:#4A5A7F;line-height:2.1;}
|
||||
.form-grid b{color:#333;font-weight:500;}
|
||||
.sign-view{display:flex;flex-direction:column;align-items:flex-start;gap:6px;}
|
||||
.sign-view__name{font-family:KaiTi,serif;font-size:26px;color:#333;}
|
||||
.sign-view__note{font-size:11px;color:#969EB0;}
|
||||
.group-badge{display:inline-block;padding:2px 12px;border-radius:10px;font-size:var(--font-sm);font-weight:600;}
|
||||
</style>
|
||||
</head>
|
||||
@@ -163,15 +158,17 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item active">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item active">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -180,7 +177,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<!-- [交互] 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
@@ -188,7 +185,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号" style="min-width:110px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<label>单位部门</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
@@ -254,7 +251,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th><th>解读员工</th><th>员工编号</th><th>性别</th><th>年龄</th><th>员工所属单位</th><th>员工所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>解读医生</th><th>解读日期</th><th>操作</th>
|
||||
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>分配医疗点</th><th>医疗点所属单位</th><th>体检年份</th><th>解读医生</th><th>解读日期</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -270,41 +267,42 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- [交互] 解读详情弹窗(左右两栏) -->
|
||||
<!-- [交互] 解读详情弹窗(只读,参考 daily-interpret) -->
|
||||
<div class="modal-mask" id="detailMask">
|
||||
<div class="modal--wide">
|
||||
<div class="modal__header"><span id="detailTitle">解读详情</span><button class="modal__close" onclick="closeModal('detailMask')">×</button></div>
|
||||
<div class="modal__body" style="padding:0;">
|
||||
<div class="report-cols">
|
||||
<div class="report-cols__left">
|
||||
<div class="report-title">体检结论</div>
|
||||
<div class="report-sub" id="dConclusion"></div>
|
||||
<div class="report-title">体检建议</div>
|
||||
<div class="report-sub" id="dSuggest"></div>
|
||||
<div class="rpt-title">体检结论</div>
|
||||
<div class="rpt-text" id="dConclusion"></div>
|
||||
<div class="rpt-title">体检建议</div>
|
||||
<div class="rpt-text" id="dSuggest"></div>
|
||||
<div id="dReport"></div>
|
||||
</div>
|
||||
<div class="report-cols__right">
|
||||
<div class="report-title">员工基本信息</div>
|
||||
<div class="emp-basic" id="dEmp"></div>
|
||||
<div class="report-title">综合解读建议</div>
|
||||
<div class="advise-box" id="dAdvise"></div>
|
||||
<div class="report-title">五类人群重新分布</div>
|
||||
<div style="display:flex;padding:6px 0 10px;gap:16px;">
|
||||
<span id="dGroupBefore" style="font-size:var(--font-sm);color:var(--text-secondary);"></span>
|
||||
<span id="dGroupAfter" style="font-size:var(--font-sm);color:var(--text-secondary);"></span>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工基本信息</div>
|
||||
<div class="form-grid" id="dEmp"></div>
|
||||
</div>
|
||||
<div class="report-title">员工确认签字</div>
|
||||
<div id="dSign"></div>
|
||||
<div style="display:flex;width:100%;margin-top:16px;">
|
||||
<div style="width:50%;">
|
||||
<div class="report-title" style="margin-top:0;">解读医生</div>
|
||||
<div style="padding-left:12px;" id="dDoctor"></div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">解读信息</div>
|
||||
<div class="form-grid">
|
||||
<div>解读医生:<b id="dDoctor"></b></div><div>解读日期:<b id="dDate"></b></div>
|
||||
</div>
|
||||
<div style="width:50%;">
|
||||
<div class="report-title" style="margin-top:0;">解读日期</div>
|
||||
<div style="padding-left:12px;" id="dDate"></div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">解读意见</div>
|
||||
<div style="font-size:13px;color:#333;line-height:1.9;" id="dAdvise"></div>
|
||||
<div style="display:flex;gap:16px;margin-top:10px;">
|
||||
<span id="dGroupBefore" style="font-size:12px;color:#4A5A7F;"></span>
|
||||
<span id="dGroupAfter" style="font-size:12px;color:#4A5A7F;"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工确认签字</div>
|
||||
<div id="dSign"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -351,19 +349,30 @@ var records=[
|
||||
{id:7,code:'CQ022317',name:'徐立成',sex:'男',age:44,unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',year:'2025',doctor:'刘玉梅',date:'2025-10-28',summary:'BMI 26.8;尿酸 438μmol/L;血压正常高值',advise:'体重与尿酸共管,清淡饮食,多饮水。',group:'d',beforeGroup:'d'}
|
||||
];
|
||||
|
||||
/* 体检报告明细模板 */
|
||||
/* 体检报告明细模板(参考 daily-interpret) */
|
||||
function buildReport(r){
|
||||
return {
|
||||
conclusion: r.summary,
|
||||
suggest: '结合既往史与生活方式,建议定期复查并保持健康管理。',
|
||||
groups: [
|
||||
{analysisName:'一般检查', cats:[
|
||||
{cls:'体格检查', rows:[{name:'血压',result:'128/82',unit:'mmHg',ref:'<140/90'},{name:'心率',result:'74',unit:'次/分',ref:'60-100'}]},
|
||||
{cls:'人体测量', rows:[{name:'身高',result:'172',unit:'cm',ref:''},{name:'体重',result:'78',unit:'kg',ref:''},{name:'BMI',result:'26.4',unit:'',ref:'18.5-23.9'},{name:'腰围',result:'88',unit:'cm',ref:'<85'}]}
|
||||
conclusion: r.summary || '各项指标未见明显异常',
|
||||
suggest: '低盐低脂饮食,规律监测血压并记录;3个月内复查血脂、血糖、糖化血红蛋白;每周中等强度运动不少于150分钟;如出现头晕、心悸等症状及时就诊。',
|
||||
majors: [
|
||||
{name:'实验室检查', cats:[
|
||||
{cls:'生化全套', rows:[
|
||||
{name:'空腹血糖',result:'7.8 ↑',unit:'mmol/L',ref:'3.9~6.1',abnormal:true},
|
||||
{name:'血清总胆固醇',result:'6.12',unit:'mmol/L',ref:'0~5.2',abnormal:true},
|
||||
{name:'血清甘油三酯',result:'2.35',unit:'mmol/L',ref:'0~1.7',abnormal:true},
|
||||
{name:'糖化血红蛋白',result:'6.9',unit:'%',ref:'4~6.5',abnormal:true}
|
||||
]},
|
||||
{cls:'血常规', rows:[
|
||||
{name:'白细胞计数',result:'6.8',unit:'10^9/L',ref:'3.5~9.5'},
|
||||
{name:'血红蛋白',result:'145',unit:'g/L',ref:'130~175'},
|
||||
{name:'血小板计数',result:'210',unit:'10^9/L',ref:'125~350'}
|
||||
]}
|
||||
]},
|
||||
{analysisName:'实验室检查', cats:[
|
||||
{cls:'血常规', rows:[{name:'白细胞',result:'6.1',unit:'×10⁹/L',ref:'3.5-9.5'},{name:'血红蛋白',result:'142',unit:'g/L',ref:'130-175'},{name:'血小板',result:'235',unit:'×10⁹/L',ref:'125-350'}]},
|
||||
{cls:'生化检验', rows:[{name:'空腹血糖',result:'5.8',unit:'mmol/L',ref:'3.9-6.1'},{name:'总胆固醇',result:'5.6',unit:'mmol/L',ref:'<5.2'},{name:'甘油三酯',result:'1.7',unit:'mmol/L',ref:'<1.7'},{name:'尿酸',result:'398',unit:'μmol/L',ref:'208-428'}]}
|
||||
{name:'辅助检查', cats:[
|
||||
{cls:'心电图', rows:[
|
||||
{name:'窦性心律',result:'未见异常',unit:'—',ref:'—'},
|
||||
{name:'ST-T 改变',result:'轻度异常',unit:'—',ref:'—',abnormal:true}
|
||||
]}
|
||||
]}
|
||||
]
|
||||
};
|
||||
@@ -526,26 +535,26 @@ function turnPage(d){
|
||||
|
||||
/* ===== 详情弹窗 ===== */
|
||||
function renderReportHtml(report){
|
||||
if(!report.groups||!report.groups.length)return '<div class="td-empty">暂无体检数据</div>';
|
||||
if(!report.majors||!report.majors.length)return '<div class="td-empty">暂无体检数据</div>';
|
||||
var html='';
|
||||
report.groups.forEach(function(g){
|
||||
html+='<div class="report-group"><div class="report-group__name">'+g.analysisName+'</div>';
|
||||
g.cats.forEach(function(c){
|
||||
html+='<div class="report-cat"><div class="report-cat__name">'+c.cls+'</div>';
|
||||
html+='<ul class="report-ul report-ul--head"><li>名称</li><li>结果</li><li>单位</li><li>参考值</li></ul>';
|
||||
report.majors.forEach(function(m){
|
||||
html+='<div class="rpt-major">'+m.name+'</div>';
|
||||
m.cats.forEach(function(c){
|
||||
html+='<div class="rpt-title rpt-title--sub">'+c.cls+'</div>';
|
||||
html+='<table class="rpt-table"><tr><th>名称</th><th>结果</th><th>单位</th><th>参考值</th></tr>';
|
||||
c.rows.forEach(function(row){
|
||||
html+='<ul class="report-ul"><li>'+row.name+'</li><li>'+row.result+'</li><li>'+row.unit+'</li><li>'+row.ref+'</li></ul>';
|
||||
html+='<tr><td>'+row.name+'</td><td class="'+(row.abnormal?'abnormal':'')+'">'+row.result+'</td><td>'+row.unit+'</td><td>'+row.ref+'</td></tr>';
|
||||
});
|
||||
html+='</div>';
|
||||
html+='</table>';
|
||||
});
|
||||
html+='</div>';
|
||||
});
|
||||
return html;
|
||||
}
|
||||
function empBasicHtml(r){
|
||||
return '<div class="w25">姓名<b> '+r.name+'</b></div><div class="w25">性别<b> '+r.sex+'</b></div><div class="w25">年龄<b> '+r.age+'</b></div><div class="w25">员工编号<b> '+r.code+'</b></div>'
|
||||
+'<div class="w50">所属单位<b> '+r.unit+'</b></div><div class="w50">所属部门<b> '+r.dept+'</b></div>'
|
||||
+'<div class="w100">慢病类型<b> '+(CHRONIC[r.code]||'无')+'</b></div>';
|
||||
return '<div>姓名:<b>'+r.name+'</b></div><div>性别:<b>'+r.sex+'</b></div>'
|
||||
+'<div>年龄:<b>'+r.age+' 岁</b></div><div>员工编号:<b>'+r.code+'</b></div>'
|
||||
+'<div style="grid-column:1/-1;">所属单位:<b>'+r.unit+'</b> 所属部门:<b>'+r.dept+'</b></div>'
|
||||
+'<div style="grid-column:1/-1;">体检年份:<b>'+r.year+'年</b> 报告:'+r.year+'年体检报告</div>';
|
||||
}
|
||||
function groupBadgeHtml(v){
|
||||
var color=GROUP_BADGE[v]||'#999';
|
||||
@@ -562,7 +571,7 @@ function openDetail(id){
|
||||
document.getElementById('dAdvise').textContent=r.advise||'—';
|
||||
document.getElementById('dGroupBefore').innerHTML='解读前:'+groupBadgeHtml(r.beforeGroup);
|
||||
document.getElementById('dGroupAfter').innerHTML='解读后:'+groupBadgeHtml(r.group);
|
||||
document.getElementById('dSign').innerHTML='<div class="sign-box" style="min-height:80px;"><svg width="180" height="52" viewBox="0 0 180 52"><path d="M10 38c14-20 20 12 32-6 9-14 14 16 26-2 8-12 12 10 22-2 8-12 14 8 26 2" stroke="#14213D" stroke-width="2.4" fill="none" stroke-linecap="round"/></svg><div style="font-size:var(--font-xs);color:var(--text-placeholder);">'+r.name+' · '+r.date+' 于 PAD 端确认</div></div>';
|
||||
document.getElementById('dSign').innerHTML='<div class="sign-view"><span class="sign-view__name">'+r.name+'</span></div>';
|
||||
document.getElementById('dDoctor').textContent=r.doctor||'—';
|
||||
document.getElementById('dDate').textContent=r.date||'—';
|
||||
document.getElementById('detailMask').classList.add('open');
|
||||
@@ -576,7 +585,7 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
@@ -125,34 +126,51 @@ textarea.form-control{height:88px;padding:8px 10px;resize:vertical;line-height:1
|
||||
select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;-webkit-appearance:none;padding-right:28px;cursor:pointer;}
|
||||
.section-title{display:flex;align-items:center;gap:8px;font-size:var(--font-base);font-weight:600;color:var(--text-primary);margin:16px 0 10px;}
|
||||
.section-title::before{content:'';width:4px;height:16px;background:var(--primary);border-radius:2px;}
|
||||
/* 解读弹窗左右两栏 */
|
||||
/* 解读弹窗左右两栏(报告与表单样式参考 medical-pad/interpret-drawer) */
|
||||
.report-cols{display:flex;gap:0;height:calc(90vh - 130px);}
|
||||
.report-cols__left{width:50%;overflow-y:auto;padding-right:20px;border-right:1px dashed var(--border);}
|
||||
.report-cols__right{width:50%;overflow-y:auto;padding-left:20px;}
|
||||
.report-title{font-size:var(--font-base);font-weight:700;padding:10px 0 10px 12px;position:relative;margin-top:4px;}
|
||||
.report-title::before{content:'';position:absolute;left:0;top:13px;width:6px;height:18px;background:#E3CB2C;border-radius:2px;}
|
||||
.report-sub{font-size:var(--font-sm);color:var(--text-secondary);line-height:1.7;padding:0 12px 8px;}
|
||||
.report-group{margin-top:16px;}
|
||||
.report-group__name{font-weight:700;font-size:var(--font-base);padding:10px 12px;background:#F6F6F6;border-radius:var(--radius-sm) var(--radius-sm) 0 0;}
|
||||
.report-cat{padding-left:20px;}
|
||||
.report-cat__name{font-size:var(--font-sm);font-weight:700;padding:10px 0 8px 12px;position:relative;}
|
||||
.report-cat__name::before{content:'';position:absolute;left:0;top:12px;width:6px;height:16px;background:#02C2A6;border-radius:2px;}
|
||||
.report-ul{padding:0;margin:0;width:100%;display:flex;}
|
||||
.report-ul li{flex:1;text-align:center;padding:6px 0;font-size:var(--font-sm);border:1px solid #E6E6E6;border-left:none;border-top:none;}
|
||||
.report-ul li:first-child{border-left:1px solid #E6E6E6;}
|
||||
.report-ul.report-ul--head{font-weight:700;}
|
||||
.report-ul.report-ul--head li{background:#F0F2FF;}
|
||||
.report-ul.report-ul--head li:first-child{background:#F0F2FF;}
|
||||
.report-ul:not(.report-ul--head) li:first-child{background:#F6F6F6;}
|
||||
.emp-basic{display:flex;flex-wrap:wrap;gap:4px 0;}
|
||||
.emp-basic div{font-size:var(--font-sm);color:var(--text-secondary);padding:4px 0;}
|
||||
.emp-basic b{color:var(--text-primary);font-weight:600;}
|
||||
.emp-basic .w25{width:25%;}
|
||||
.emp-basic .w50{width:50%;}
|
||||
.emp-basic .w100{width:100%;}
|
||||
.advise-box{background:#F4F4F4;border-radius:var(--radius-sm);padding:10px;font-size:var(--font-sm);line-height:1.7;color:var(--text-primary);min-height:88px;}
|
||||
.sign-box{border:1px dashed var(--border);border-radius:var(--radius-sm);padding:16px;text-align:center;min-height:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;}
|
||||
.report-cols__left{width:50%;overflow-y:auto;padding:16px 18px;border-right:1px dashed var(--border);}
|
||||
.report-cols__right{width:50%;overflow-y:auto;padding:16px 18px;background:#FAFBFD;}
|
||||
.rpt-title{font-size:15px;font-weight:600;color:#333;margin:14px 0 8px;padding-left:8px;border-left:4px solid #E3CB2C;}
|
||||
.rpt-title--sub{border-left-color:#02C2A6;}
|
||||
.rpt-text{font-size:12px;color:#4A5A7F;line-height:1.9;}
|
||||
.rpt-major{background:#F6F6F6;border-radius:8px;padding:8px 12px;font-size:13px;font-weight:600;color:#333;margin:12px 0 8px;}
|
||||
.rpt-table{width:100%;min-width:0;border-collapse:collapse;font-size:12px;margin-bottom:6px;}
|
||||
.rpt-table th{background:#F0F2FF;color:#4A5A7F;font-weight:500;padding:7px 10px;text-align:left;white-space:nowrap;}
|
||||
.rpt-table td{padding:7px 10px;border-bottom:1px solid #F0F2F5;color:#333;white-space:normal;word-break:break-word;}
|
||||
.rpt-table td.abnormal{color:#F5222D;font-weight:600;}
|
||||
.rpt-table thead th:last-child{position:static;right:auto;z-index:auto;background:#F0F2FF;box-shadow:none;}
|
||||
.rpt-table tbody td:last-child{position:static;right:auto;z-index:auto;background:transparent;box-shadow:none;}
|
||||
.form-card{background:#fff;border-radius:10px;padding:14px 16px;margin-bottom:12px;box-shadow:0 2px 8px rgba(74,90,127,.05);}
|
||||
.form-card__title{font-size:14px;font-weight:600;color:#333;margin-bottom:10px;padding-left:8px;border-left:3px solid #1890FF;}
|
||||
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 18px;font-size:12px;color:#4A5A7F;line-height:2.1;}
|
||||
.form-grid b{color:#333;font-weight:500;}
|
||||
.fld{display:flex;align-items:flex-start;gap:8px;font-size:13px;color:#4A5A7F;margin-bottom:12px;}
|
||||
.fld__label{width:96px;text-align:right;flex-shrink:0;padding-top:6px;}
|
||||
.fld__req{color:#FD2121;}
|
||||
.fld textarea,.fld select{flex:1;border:1px solid #D9DEE8;border-radius:6px;padding:7px 10px;font-size:13px;color:#333;outline:none;font-family:inherit;min-width:0;}
|
||||
.fld textarea{resize:none;height:76px;}
|
||||
.fld textarea:focus,.fld select:focus{border-color:#1890FF;}
|
||||
.radio{display:flex;gap:16px;align-items:center;font-size:13px;color:#333;}
|
||||
.radio input{accent-color:#1890FF;width:14px;height:14px;}
|
||||
.sign-box{border:1px dashed #B7C3D6;border-radius:8px;background:#F7F9FC;height:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#969EB0;font-size:13px;cursor:pointer;}
|
||||
.sign-box svg{width:22px;height:22px;stroke:#969EB0;fill:none;stroke-width:2;}
|
||||
.sign-view{display:flex;flex-direction:column;align-items:flex-start;gap:6px;}
|
||||
.sign-view__name{font-family:KaiTi,serif;font-size:26px;color:#333;}
|
||||
.sign-view__note{font-size:11px;color:#969EB0;}
|
||||
.group-badge{display:inline-block;padding:2px 12px;border-radius:10px;font-size:var(--font-sm);font-weight:600;}
|
||||
/* 手写签名弹窗 */
|
||||
.sign-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:970;align-items:center;justify-content:center;}
|
||||
.sign-mask.open{display:flex;}
|
||||
.sign-modal{background:#fff;border-radius:12px;width:720px;display:flex;flex-direction:column;box-shadow:0 12px 40px rgba(0,0,0,.25);}
|
||||
.sign-modal__head{padding:15px 20px;border-bottom:1px solid #F0F2F5;display:flex;align-items:center;}
|
||||
.sign-modal__title{font-size:15px;font-weight:600;color:#333;flex:1;}
|
||||
.sign-modal__close{cursor:pointer;color:#999;font-size:18px;border:none;background:none;}
|
||||
.sign-modal__foot{padding:13px 20px;border-top:1px solid #F0F2F5;display:flex;justify-content:flex-end;gap:10px;}
|
||||
.canvas-wrap{position:relative;margin:20px;border:1px solid #DDD;background:#EEE;border-radius:6px;overflow:hidden;}
|
||||
.canvas-wrap canvas{display:block;width:100%;height:260px;cursor:crosshair;}
|
||||
.canvas-hint{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#BBB;font-size:14px;pointer-events:none;}
|
||||
.eraser{position:absolute;right:12px;bottom:12px;width:40px;height:40px;border-radius:8px;border:1px solid #D9DEE8;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;}
|
||||
.eraser svg{width:20px;height:20px;stroke:#4A5A7F;fill:none;stroke-width:2;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -183,15 +201,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup open">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item active">解读任务</a>
|
||||
<div class="sidebar-group open" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub active">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -204,7 +224,11 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工所属单位</label>
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterCode" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-wrap" id="orgWrap">
|
||||
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel">
|
||||
@@ -263,8 +287,6 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<button class="btn btn-default" onclick="openExport()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出记录
|
||||
</button>
|
||||
<button class="btn btn-primary" onclick="openGenRecord()">生成记录</button>
|
||||
<button class="btn btn-primary" id="btnResetTask" onclick="resetTask()">重新生成解读任务</button>
|
||||
</div>
|
||||
<div class="seg">
|
||||
<button class="active" data-v="0" onclick="setStatusGroup(this,'0')">全部</button>
|
||||
@@ -296,30 +318,50 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- [交互] 体检报告解读弹窗(可编辑) -->
|
||||
<!-- [交互] 体检报告解读弹窗(可编辑,内容参考 medical-pad/interpret-drawer) -->
|
||||
<div class="modal-mask" id="intMask">
|
||||
<div class="modal--wide">
|
||||
<div class="modal__header"><span id="intTitle">体检报告解读</span><button class="modal__close" onclick="closeModal('intMask')">×</button></div>
|
||||
<div class="modal__body" style="padding:0;">
|
||||
<div class="report-cols">
|
||||
<div class="report-cols__left">
|
||||
<div class="report-title">体检结论</div>
|
||||
<div class="report-sub" id="intConclusion"></div>
|
||||
<div class="report-title">体检建议</div>
|
||||
<div class="report-sub" id="intSuggest"></div>
|
||||
<div class="rpt-title">体检结论</div>
|
||||
<div class="rpt-text" id="intConclusion"></div>
|
||||
<div class="rpt-title">体检建议</div>
|
||||
<div class="rpt-text" id="intSuggest"></div>
|
||||
<div id="intReport"></div>
|
||||
</div>
|
||||
<div class="report-cols__right">
|
||||
<div class="report-title">员工基本信息</div>
|
||||
<div class="emp-basic" id="intEmp"></div>
|
||||
<div class="report-title">综合解读建议</div>
|
||||
<textarea class="form-control" id="intAdvise" placeholder="结合体检指标、既往史与生活方式,给出个体化综合解读与建议"></textarea>
|
||||
<div class="report-title">五类人群重新分类</div>
|
||||
<select class="form-control" id="intGroup" style="max-width:280px;"></select>
|
||||
<div class="report-title">员工确认签字</div>
|
||||
<div class="sign-box" id="signBox">
|
||||
<div id="signHolder" style="color:var(--text-placeholder);">本人已确认健康随访</div>
|
||||
<button class="btn btn-default" id="signBtn" onclick="doSign()">员工签名</button>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工基本信息</div>
|
||||
<div class="form-grid" id="intEmp"></div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">解读意见</div>
|
||||
<div class="fld"><span class="fld__label"><span class="fld__req">*</span>综合解读建议</span><textarea id="intAdvise" placeholder="请输入综合解读建议"></textarea></div>
|
||||
<div class="fld"><span class="fld__label">五类人群分类</span><select id="intGroup"></select></div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工确认签字</div>
|
||||
<div style="font-size:12px;color:#969EB0;margin-bottom:8px;">本人已确认健康随访</div>
|
||||
<div class="fld"><span class="fld__label"><span class="fld__req">*</span>签字</span>
|
||||
<div id="signField" style="flex:1;">
|
||||
<div class="radio" style="margin-bottom:10px;">
|
||||
<label><input type="radio" name="signType" value="hand" checked onclick="switchSignType('hand')">手写签名</label>
|
||||
<label><input type="radio" name="signType" value="img" onclick="switchSignType('img')">签字图片</label>
|
||||
</div>
|
||||
<div class="sign-box" id="signHandBox" onclick="openSignModal()">
|
||||
<svg viewBox="0 0 24 24"><path d="M17 3a2.8 2.8 0 014 4L7.5 20.5 2 22l1.5-5.5z"/></svg>
|
||||
点击签名
|
||||
</div>
|
||||
<div class="sign-box" id="signImgBox" style="display:none;" onclick="document.getElementById('signImgInput').click()">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 16V4M7 9l5-5 5 5"/><path d="M4 20h16"/></svg>
|
||||
上传签字图片
|
||||
</div>
|
||||
<input type="file" id="signImgInput" accept="image/*" style="display:none;" onchange="onSignImg(this)">
|
||||
</div>
|
||||
<div id="signLockView" style="flex:1;display:none;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -331,6 +373,22 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 手写签名弹窗 -->
|
||||
<div class="sign-mask" id="signMask">
|
||||
<div class="sign-modal">
|
||||
<div class="sign-modal__head"><span class="sign-modal__title">签名</span><button class="sign-modal__close" onclick="closeSignModal()">✕</button></div>
|
||||
<div class="canvas-wrap">
|
||||
<canvas id="signCanvas" width="780" height="260"></canvas>
|
||||
<div class="canvas-hint" id="signHint">请在区域内签名<div style="font-size:12px;">保证字迹清晰可辨</div></div>
|
||||
<button class="eraser" onclick="clearCanvas()" title="清空"><svg viewBox="0 0 24 24"><path d="M20 20H8.5l-4-4a2 2 0 010-2.8l8.2-8.2a2 2 0 012.8 0l5 5a2 2 0 010 2.8L13 20M8 11l6 6"/></svg></button>
|
||||
</div>
|
||||
<div class="sign-modal__foot">
|
||||
<button class="btn btn-default" onclick="closeSignModal()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmSign()">确认</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 解读详情弹窗(只读) -->
|
||||
<div class="modal-mask" id="detailMask">
|
||||
<div class="modal--wide">
|
||||
@@ -338,34 +396,35 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="modal__body" style="padding:0;">
|
||||
<div class="report-cols">
|
||||
<div class="report-cols__left">
|
||||
<div class="report-title">体检结论</div>
|
||||
<div class="report-sub" id="dConclusion"></div>
|
||||
<div class="report-title">体检建议</div>
|
||||
<div class="report-sub" id="dSuggest"></div>
|
||||
<div class="rpt-title">体检结论</div>
|
||||
<div class="rpt-text" id="dConclusion"></div>
|
||||
<div class="rpt-title">体检建议</div>
|
||||
<div class="rpt-text" id="dSuggest"></div>
|
||||
<div id="dReport"></div>
|
||||
</div>
|
||||
<div class="report-cols__right">
|
||||
<div class="report-title">员工基本信息</div>
|
||||
<div class="emp-basic" id="dEmp"></div>
|
||||
<div class="report-title">综合解读建议</div>
|
||||
<div class="advise-box" id="dAdvise"></div>
|
||||
<div class="report-title">五类人群重新分布</div>
|
||||
<div style="display:flex;padding:6px 0 10px;gap:16px;">
|
||||
<span id="dGroupBefore" style="font-size:var(--font-sm);color:var(--text-secondary);"></span>
|
||||
<span id="dGroupAfter" style="font-size:var(--font-sm);color:var(--text-secondary);"></span>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工基本信息</div>
|
||||
<div class="form-grid" id="dEmp"></div>
|
||||
</div>
|
||||
<div class="report-title">员工确认签字</div>
|
||||
<div id="dSign"></div>
|
||||
<div style="display:flex;width:100%;margin-top:16px;">
|
||||
<div style="width:50%;">
|
||||
<div class="report-title" style="margin-top:0;">解读医生</div>
|
||||
<div style="padding-left:12px;" id="dDoctor"></div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">解读信息</div>
|
||||
<div class="form-grid">
|
||||
<div>解读医生:<b id="dDoctor"></b></div><div>解读日期:<b id="dDate"></b></div>
|
||||
</div>
|
||||
<div style="width:50%;">
|
||||
<div class="report-title" style="margin-top:0;">解读日期</div>
|
||||
<div style="padding-left:12px;" id="dDate"></div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">解读意见</div>
|
||||
<div style="font-size:13px;color:#333;line-height:1.9;" id="dAdvise"></div>
|
||||
<div style="display:flex;gap:16px;margin-top:10px;">
|
||||
<span id="dGroupBefore" style="font-size:12px;color:#4A5A7F;"></span>
|
||||
<span id="dGroupAfter" style="font-size:12px;color:#4A5A7F;"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<div class="form-card__title">员工确认签字</div>
|
||||
<div id="dSign"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -419,7 +478,7 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 演示数据(脱敏):解读任务由年度体检报告回传生成 ===== */
|
||||
/* ===== 演示数据:解读任务由年度体检报告回传生成 ===== */
|
||||
var pointUnit={'樊学作业区医疗点':'采油一厂','姬圪台作业区医疗点':'采油二厂','西峰基地医疗点':'第四采油厂','靖边气田医疗点':'采气一厂','桐园作业区医疗点':'采油二厂','安塞采油队长住点医疗室':'采油一厂','乌审旗采气区医疗点':'采气一厂','姬塬作业区医疗点':'采油一厂'};
|
||||
var pointMap={
|
||||
'采油一厂':['樊学作业区医疗点','安塞采油队长住点医疗室','姬塬作业区医疗点'],
|
||||
@@ -433,17 +492,17 @@ var GROUP_BADGE={a:'#CF1322',b:'#FA8C16',c:'#D48806',d:'#096DD9',e:'#389E0D'};
|
||||
var CHRONIC={'CQ033096':'高血压','CQ010564':'糖尿病','CQ019203':'冠心病','CQ021578':'高血压','CQ027710':'肥胖','CQ036441':'高血压','CQ022317':'肥胖','CQ029905':'无','CQ044871':'无','CQ041822':'无','CQ032144':'无','CQ045130':'无'};
|
||||
/* status: 1待解读 2已逾期 3已完成 ; interpretDate 为解读完成日期 */
|
||||
var tasks=[
|
||||
{id:1,code:'CQ033096',name:'赵万福',sex:'男',age:39,tel:'150****6127',unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-07',doctor:'曲志明',status:3,advise:'高血压2级合并超重,已纳入慢病管理;建议低盐减重、规律服药并每月随访。',group:'b',beforeGroup:'d'},
|
||||
{id:2,code:'CQ010564',name:'高建军',sex:'男',age:50,tel:'139****0086',unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-08-30',doctor:'闫婷',status:3,advise:'2型糖尿病诊断明确,转内分泌专科复核用药方案;双周随访控制血糖。',group:'b',beforeGroup:'c'},
|
||||
{id:3,code:'CQ027710',name:'张秀兰',sex:'女',age:45,tel:'136****2248',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:4,code:'CQ021578',name:'石维国',sex:'男',age:46,tel:'139****2051',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:5,code:'CQ022317',name:'徐立成',sex:'男',age:44,tel:'133****4860',unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:6,code:'CQ036441',name:'刘玉梅',sex:'女',age:40,tel:'135****7719',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:2,advise:'',group:'',beforeGroup:''},
|
||||
{id:7,code:'CQ019203',name:'曲志明',sex:'男',age:42,tel:'137****8890',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:2,advise:'',group:'',beforeGroup:''},
|
||||
{id:8,code:'CQ044871',name:'白瑞',sex:'男',age:31,tel:'155****3316',unit:'采油一厂',dept:'生产技术部',point:'安塞采油队长住点医疗室',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:9,code:'CQ032144',name:'李桂芳',sex:'女',age:38,tel:'138****7742',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-02',doctor:'李桂芳',status:3,advise:'健康状况良好,补充维生素D并保持运动习惯。',group:'e',beforeGroup:'e'},
|
||||
{id:10,code:'CQ041822',name:'闫婷',sex:'女',age:34,tel:'186****5527',unit:'第四采油厂',dept:'健康管理部',point:'西峰基地医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:11,code:'CQ045130',name:'杨慧敏',sex:'女',age:33,tel:'188****7214',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-04',doctor:'石维国',status:3,advise:'轻度缺铁性贫血,加强营养,三个月复查血常规。',group:'c',beforeGroup:'e'}
|
||||
{id:1,code:'CQ033096',name:'赵万福',sex:'男',age:39,tel:'15029836127',unit:'采油二厂',dept:'桐园作业区',point:'桐园作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-07',doctor:'曲志明',status:3,advise:'高血压2级合并超重,已纳入慢病管理;建议低盐减重、规律服药并每月随访。',group:'b',beforeGroup:'d'},
|
||||
{id:2,code:'CQ010564',name:'高建军',sex:'男',age:50,tel:'13956200086',unit:'第四采油厂',dept:'基地管理处',point:'西峰基地医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-08-30',doctor:'闫婷',status:3,advise:'2型糖尿病诊断明确,转内分泌专科复核用药方案;双周随访控制血糖。',group:'b',beforeGroup:'c'},
|
||||
{id:3,code:'CQ027710',name:'张秀兰',sex:'女',age:45,tel:'13649162248',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:4,code:'CQ021578',name:'石维国',sex:'男',age:46,tel:'13928562051',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:5,code:'CQ022317',name:'徐立成',sex:'男',age:44,tel:'13319284860',unit:'采气一厂',dept:'苏里格南作业区',point:'乌审旗采气区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:6,code:'CQ036441',name:'刘玉梅',sex:'女',age:40,tel:'13572867719',unit:'采气一厂',dept:'靖边净化厂',point:'靖边气田医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:2,advise:'',group:'',beforeGroup:''},
|
||||
{id:7,code:'CQ019203',name:'曲志明',sex:'男',age:42,tel:'13720568890',unit:'采油二厂',dept:'姬圪台联合站',point:'姬圪台作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:2,advise:'',group:'',beforeGroup:''},
|
||||
{id:8,code:'CQ044871',name:'白瑞',sex:'男',age:31,tel:'15529403316',unit:'采油一厂',dept:'生产技术部',point:'安塞采油队长住点医疗室',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:9,code:'CQ032144',name:'李桂芳',sex:'女',age:38,tel:'13836547742',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-02',doctor:'李桂芳',status:3,advise:'健康状况良好,补充维生素D并保持运动习惯。',group:'e',beforeGroup:'e'},
|
||||
{id:10,code:'CQ041822',name:'闫婷',sex:'女',age:34,tel:'18629135527',unit:'第四采油厂',dept:'健康管理部',point:'西峰基地医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'',doctor:'',status:1,advise:'',group:'',beforeGroup:''},
|
||||
{id:11,code:'CQ045130',name:'杨慧敏',sex:'女',age:33,tel:'18829587214',unit:'采油一厂',dept:'樊学作业区',point:'樊学作业区医疗点',year:'2026',deadline:'2026-10-31',interpretDate:'2026-09-04',doctor:'石维国',status:3,advise:'轻度缺铁性贫血,加强营养,三个月复查血常规。',group:'c',beforeGroup:'e'}
|
||||
];
|
||||
var nextId=12,curInterpId=null,statusGroup='0',today='2026-09-07';
|
||||
var statusMap={1:'待解读',2:'已逾期',3:'已完成'};
|
||||
@@ -453,15 +512,26 @@ var statusBadge={1:'badge--warning',2:'badge--danger',3:'badge--success'};
|
||||
function buildReport(t){
|
||||
return {
|
||||
conclusion: t.summary || '各项指标未见明显异常',
|
||||
suggest: '结合既往史与生活方式,建议定期复查并保持健康管理。',
|
||||
groups: [
|
||||
{analysisName:'一般检查', cats:[
|
||||
{cls:'体格检查', rows:[{name:'血压',result:'128/82',unit:'mmHg',ref:'<140/90'},{name:'心率',result:'74',unit:'次/分',ref:'60-100'}]},
|
||||
{cls:'人体测量', rows:[{name:'身高',result:'172',unit:'cm',ref:''},{name:'体重',result:'78',unit:'kg',ref:''},{name:'BMI',result:'26.4',unit:'',ref:'18.5-23.9'},{name:'腰围',result:'88',unit:'cm',ref:'<85'}]}
|
||||
suggest: '低盐低脂饮食,规律监测血压并记录;3个月内复查血脂、血糖、糖化血红蛋白;每周中等强度运动不少于150分钟;如出现头晕、心悸等症状及时就诊。',
|
||||
majors: [
|
||||
{name:'实验室检查', cats:[
|
||||
{cls:'生化全套', rows:[
|
||||
{name:'空腹血糖',result:'7.8 ↑',unit:'mmol/L',ref:'3.9~6.1',abnormal:true},
|
||||
{name:'血清总胆固醇',result:'6.12',unit:'mmol/L',ref:'0~5.2',abnormal:true},
|
||||
{name:'血清甘油三酯',result:'2.35',unit:'mmol/L',ref:'0~1.7',abnormal:true},
|
||||
{name:'糖化血红蛋白',result:'6.9',unit:'%',ref:'4~6.5',abnormal:true}
|
||||
]},
|
||||
{cls:'血常规', rows:[
|
||||
{name:'白细胞计数',result:'6.8',unit:'10^9/L',ref:'3.5~9.5'},
|
||||
{name:'血红蛋白',result:'145',unit:'g/L',ref:'130~175'},
|
||||
{name:'血小板计数',result:'210',unit:'10^9/L',ref:'125~350'}
|
||||
]}
|
||||
]},
|
||||
{analysisName:'实验室检查', cats:[
|
||||
{cls:'血常规', rows:[{name:'白细胞',result:'6.1',unit:'×10⁹/L',ref:'3.5-9.5'},{name:'血红蛋白',result:'142',unit:'g/L',ref:'130-175'},{name:'血小板',result:'235',unit:'×10⁹/L',ref:'125-350'}]},
|
||||
{cls:'生化检验', rows:[{name:'空腹血糖',result:'5.8',unit:'mmol/L',ref:'3.9-6.1'},{name:'总胆固醇',result:'5.6',unit:'mmol/L',ref:'<5.2'},{name:'甘油三酯',result:'1.7',unit:'mmol/L',ref:'<1.7'},{name:'尿酸',result:'398',unit:'μmol/L',ref:'208-428'}]}
|
||||
{name:'辅助检查', cats:[
|
||||
{cls:'心电图', rows:[
|
||||
{name:'窦性心律',result:'未见异常',unit:'—',ref:'—'},
|
||||
{name:'ST-T 改变',result:'轻度异常',unit:'—',ref:'—',abnormal:true}
|
||||
]}
|
||||
]}
|
||||
]
|
||||
};
|
||||
@@ -574,13 +644,15 @@ function onFilterUnit(){
|
||||
}
|
||||
function currentData(){
|
||||
var q=document.getElementById('filterName').value.trim();
|
||||
var code=document.getElementById('filterCode').value.trim();
|
||||
var unit=document.getElementById('filterUnit').value;
|
||||
var point=document.getElementById('filterPoint').value;
|
||||
var year=document.getElementById('filterYear').value;
|
||||
var from=document.getElementById('filterFrom').value;
|
||||
var to=document.getElementById('filterTo').value;
|
||||
return tasks.filter(function(t){
|
||||
return (!q||t.name.indexOf(q)!==-1||t.code.toLowerCase().indexOf(q.toLowerCase())!==-1)
|
||||
return (!q||t.name.indexOf(q)!==-1)
|
||||
&&(!code||t.code.toLowerCase().indexOf(code.toLowerCase())!==-1)
|
||||
&&(!selUnit||t.unit===selUnit)&&(!selDept||t.dept===selDept)
|
||||
&&(!unit||pointUnit[t.point]===unit)&&(!point||t.point===point)
|
||||
&&(!year||t.year===year)
|
||||
@@ -611,14 +683,13 @@ function renderTable(){
|
||||
tbody.innerHTML=html;
|
||||
}
|
||||
/* 行操作:体检报告解读/重新解读/编辑/解读详情 */
|
||||
function canRedo(t){ return t.status===3 && t.interpretDate>=today; }
|
||||
function actionHtml(t){
|
||||
var h='';
|
||||
if(t.status!==3){
|
||||
h+='<button class="btn btn-link" onclick="openInterpret('+t.id+')">体检报告解读</button>';
|
||||
h+='<button class="btn btn-link" onclick="openEdit('+t.id+')">编辑</button>';
|
||||
}else{
|
||||
if(canRedo(t))h+='<button class="btn btn-link" onclick="openInterpret('+t.id+',true)">重新解读</button>';
|
||||
h+='<button class="btn btn-link" onclick="openInterpret('+t.id+',true)">重新解读</button>';
|
||||
h+='<button class="btn btn-link" onclick="openDetail('+t.id+')">解读详情</button>';
|
||||
}
|
||||
return h;
|
||||
@@ -631,6 +702,7 @@ function setStatusGroup(btn,v){
|
||||
function applyFilter(){currentPage=1;renderTable();}
|
||||
function resetFilter(){
|
||||
document.getElementById('filterName').value='';
|
||||
document.getElementById('filterCode').value='';
|
||||
document.getElementById('filterUnit').value='';onFilterUnit();
|
||||
document.getElementById('filterYear').value='';
|
||||
document.getElementById('filterFrom').value='';document.getElementById('filterTo').value='';
|
||||
@@ -645,30 +717,30 @@ function turnPage(d){
|
||||
|
||||
/* ===== 体检报告渲染 ===== */
|
||||
function renderReportHtml(report){
|
||||
if(!report.groups||!report.groups.length)return '<div class="td-empty">暂无体检数据</div>';
|
||||
if(!report.majors||!report.majors.length)return '<div class="td-empty">暂无体检数据</div>';
|
||||
var html='';
|
||||
report.groups.forEach(function(g){
|
||||
html+='<div class="report-group"><div class="report-group__name">'+g.analysisName+'</div>';
|
||||
g.cats.forEach(function(c){
|
||||
html+='<div class="report-cat"><div class="report-cat__name">'+c.cls+'</div>';
|
||||
html+='<ul class="report-ul report-ul--head"><li>名称</li><li>结果</li><li>单位</li><li>参考值</li></ul>';
|
||||
report.majors.forEach(function(m){
|
||||
html+='<div class="rpt-major">'+m.name+'</div>';
|
||||
m.cats.forEach(function(c){
|
||||
html+='<div class="rpt-title rpt-title--sub">'+c.cls+'</div>';
|
||||
html+='<table class="rpt-table"><tr><th>名称</th><th>结果</th><th>单位</th><th>参考值</th></tr>';
|
||||
c.rows.forEach(function(r){
|
||||
html+='<ul class="report-ul"><li>'+r.name+'</li><li>'+r.result+'</li><li>'+r.unit+'</li><li>'+r.ref+'</li></ul>';
|
||||
html+='<tr><td>'+r.name+'</td><td class="'+(r.abnormal?'abnormal':'')+'">'+r.result+'</td><td>'+r.unit+'</td><td>'+r.ref+'</td></tr>';
|
||||
});
|
||||
html+='</div>';
|
||||
html+='</table>';
|
||||
});
|
||||
html+='</div>';
|
||||
});
|
||||
return html;
|
||||
}
|
||||
function empBasicHtml(t){
|
||||
return '<div class="w25">姓名<b> '+t.name+'</b></div><div class="w25">性别<b> '+t.sex+'</b></div><div class="w25">年龄<b> '+t.age+'</b></div><div class="w25">员工编号<b> '+t.code+'</b></div>'
|
||||
+'<div class="w50">所属单位<b> '+t.unit+'</b></div><div class="w50">所属部门<b> '+t.dept+'</b></div>'
|
||||
+'<div class="w100">慢病类型<b> '+(CHRONIC[t.code]||'无')+'</b></div>';
|
||||
return '<div>姓名:<b>'+t.name+'</b></div><div>性别:<b>'+t.sex+'</b></div>'
|
||||
+'<div>年龄:<b>'+t.age+' 岁</b></div><div>员工编号:<b>'+t.code+'</b></div>'
|
||||
+'<div style="grid-column:1/-1;">所属单位:<b>'+t.unit+'</b></div>'
|
||||
+'<div style="grid-column:1/-1;">体检日期:<b>'+t.year+'-08-15</b> 报告:'+t.year+'年体检报告</div>';
|
||||
}
|
||||
function fillGroupSel(val){
|
||||
var sel=document.getElementById('intGroup');
|
||||
sel.innerHTML='<option value="">请选择分类</option>'+Object.keys(GROUP_MAP).map(function(k){
|
||||
sel.innerHTML='<option value="">请选择五类人群分类</option>'+Object.keys(GROUP_MAP).map(function(k){
|
||||
return '<option value="'+k+'"'+(k===val?' selected':'')+'>'+GROUP_MAP[k]+'</option>';
|
||||
}).join('');
|
||||
}
|
||||
@@ -685,26 +757,76 @@ function openInterpret(id,redo){
|
||||
document.getElementById('intEmp').innerHTML=empBasicHtml(t);
|
||||
document.getElementById('intAdvise').value=redo?t.advise:'';
|
||||
fillGroupSel(redo?t.group:'');
|
||||
document.getElementById('signHolder').innerHTML='本人已确认健康随访';
|
||||
if(redo){lockSign(t.name);}else{resetSign();}
|
||||
document.getElementById('intMask').classList.add('open');
|
||||
}
|
||||
function doSign(){
|
||||
/* ===== 员工签字(手写/图片,参考 medical-pad/interpret-drawer) ===== */
|
||||
var signType='hand',signDone=false;
|
||||
function switchSignType(type){
|
||||
signType=type;
|
||||
document.getElementById('signHandBox').style.display=type==='hand'?'flex':'none';
|
||||
document.getElementById('signImgBox').style.display=type==='hand'?'none':'flex';
|
||||
}
|
||||
function resetSign(){
|
||||
signType='hand';signDone=false;
|
||||
document.getElementById('signField').style.display='block';
|
||||
document.getElementById('signLockView').style.display='none';
|
||||
document.querySelector('input[name="signType"][value="hand"]').checked=true;
|
||||
document.getElementById('signHandBox').style.display='flex';
|
||||
document.getElementById('signImgBox').style.display='none';
|
||||
document.getElementById('signHandBox').innerHTML='<svg viewBox="0 0 24 24"><path d="M17 3a2.8 2.8 0 014 4L7.5 20.5 2 22l1.5-5.5z"/></svg>点击签名';
|
||||
document.getElementById('signImgBox').innerHTML='<svg viewBox="0 0 24 24"><path d="M12 16V4M7 9l5-5 5 5"/><path d="M4 20h16"/></svg>上传签字图片';
|
||||
}
|
||||
function lockSign(name){
|
||||
signType='hand';signDone=true;
|
||||
document.getElementById('signField').style.display='none';
|
||||
document.getElementById('signLockView').style.display='block';
|
||||
document.getElementById('signLockView').innerHTML='<div class="sign-view"><span class="sign-view__name">'+name+'</span><span class="sign-view__note">已签名</span></div>';
|
||||
}
|
||||
function openSignModal(){clearCanvas();document.getElementById('signMask').classList.add('open');}
|
||||
function closeSignModal(){document.getElementById('signMask').classList.remove('open');}
|
||||
function onSignImg(input){
|
||||
var f=input.files&&input.files[0];
|
||||
if(!f)return;
|
||||
var r=new FileReader();
|
||||
r.onload=function(e){
|
||||
document.getElementById('signImgBox').innerHTML='<img src="'+e.target.result+'" style="max-width:100%;max-height:80px;object-fit:contain;"><span style="font-size:11px;color:#969EB0;">已上传 · 点击可重新上传</span>';
|
||||
signDone=true;
|
||||
};
|
||||
r.readAsDataURL(f);
|
||||
}
|
||||
var signCanvas=null,signCtx=null,drawing=false,hasInk=false;
|
||||
function initSignCanvas(){
|
||||
signCanvas=document.getElementById('signCanvas');
|
||||
signCtx=signCanvas.getContext('2d');
|
||||
signCtx.lineWidth=3;signCtx.lineCap='round';signCtx.strokeStyle='#333';
|
||||
signCanvas.onmousedown=function(e){drawing=true;var p=canvasPos(e);signCtx.beginPath();signCtx.moveTo(p.x,p.y);};
|
||||
signCanvas.onmousemove=function(e){if(!drawing)return;var p=canvasPos(e);signCtx.lineTo(p.x,p.y);signCtx.stroke();hasInk=true;document.getElementById('signHint').style.display='none';};
|
||||
window.addEventListener('mouseup',function(){drawing=false;});
|
||||
}
|
||||
function canvasPos(e){
|
||||
var r=signCanvas.getBoundingClientRect();
|
||||
return {x:(e.clientX-r.left)*(signCanvas.width/r.width),y:(e.clientY-r.top)*(signCanvas.height/r.height)};
|
||||
}
|
||||
function clearCanvas(){signCtx.clearRect(0,0,signCanvas.width,signCanvas.height);hasInk=false;document.getElementById('signHint').style.display='flex';}
|
||||
function confirmSign(){
|
||||
if(!hasInk){showToast('您还没有进行签字');return;}
|
||||
var t=tasks.find(function(x){return x.id===curInterpId;});
|
||||
document.getElementById('signHolder').innerHTML='<svg width="200" height="60" viewBox="0 0 200 60"><path d="M14 42c16-24 22 14 36-8 10-18 16 20 30-2 9-16 14 12 24-2 8-14 14 10 26 4 12-6 24 8 38 2" stroke="#14213D" stroke-width="2.4" fill="none" stroke-linecap="round"/></svg>'
|
||||
+'<div style="font-size:var(--font-xs);color:var(--text-placeholder);margin-top:6px;">'+t.name+' · '+today+' 电子签名存证</div>';
|
||||
document.getElementById('signHandBox').innerHTML='<span style="font-size:26px;font-family:KaiTi,serif;color:#333;">'+t.name+'</span><span style="font-size:11px;color:#969EB0;">已签名 · 点击可重签</span>';
|
||||
signDone=true;
|
||||
closeSignModal();
|
||||
}
|
||||
function saveInterpret(){
|
||||
var t=tasks.find(function(x){return x.id===curInterpId;});
|
||||
var advise=document.getElementById('intAdvise').value.trim();
|
||||
var group=document.getElementById('intGroup').value;
|
||||
if(!advise){showToast('请填写综合解读建议');return;}
|
||||
if(!group){showToast('请选择五类人群重新分类');return;}
|
||||
var signed=document.getElementById('signHolder').textContent.indexOf('电子签名')!==-1;
|
||||
if(!group){showToast('请选择五类人群分类');return;}
|
||||
t.advise=advise;t.group=group;t.status=3;t.interpretDate=today;
|
||||
t.beforeGroup=t.beforeGroup||'e';
|
||||
t.doctor=t.doctor||'张秀兰';
|
||||
closeModal('intMask');renderTable();
|
||||
showToast(signed?'「'+t.name+'」报告解读已完成,结果同步至健康档案':'「'+t.name+'」报告解读已完成,员工签字将在 PAD 端确认');
|
||||
showToast(signDone?'「'+t.name+'」报告解读已完成,结果同步至健康档案':'「'+t.name+'」报告解读已完成,员工签字将在 PAD 端确认');
|
||||
}
|
||||
|
||||
/* ===== 解读详情弹窗 ===== */
|
||||
@@ -719,7 +841,7 @@ function openDetail(id){
|
||||
document.getElementById('dAdvise').textContent=t.advise||'—';
|
||||
document.getElementById('dGroupBefore').innerHTML='解读前:<span class="group-badge" style="color:'+(GROUP_BADGE[t.beforeGroup]||'#999')+';background:'+(GROUP_BADGE[t.beforeGroup]||'#999')+'1a;">'+(GROUP_MAP[t.beforeGroup]||'健康-E类')+'</span>';
|
||||
document.getElementById('dGroupAfter').innerHTML='解读后:<span class="group-badge" style="color:'+(GROUP_BADGE[t.group]||'#999')+';background:'+(GROUP_BADGE[t.group]||'#999')+'1a;">'+(GROUP_MAP[t.group]||'健康-E类')+'</span>';
|
||||
document.getElementById('dSign').innerHTML='<div class="sign-box" style="min-height:80px;"><svg width="180" height="52" viewBox="0 0 180 52"><path d="M10 38c14-20 20 12 32-6 9-14 14 16 26-2 8-12 12 10 22-2 8-12 14 8 26 2" stroke="#14213D" stroke-width="2.4" fill="none" stroke-linecap="round"/></svg><div style="font-size:var(--font-xs);color:var(--text-placeholder);">'+t.name+' · '+t.interpretDate+' 于 PAD 端确认</div></div>';
|
||||
document.getElementById('dSign').innerHTML='<div class="sign-view"><span class="sign-view__name">'+t.name+'</span></div>';
|
||||
document.getElementById('dDoctor').textContent=t.doctor||'—';
|
||||
document.getElementById('dDate').textContent=t.interpretDate||'—';
|
||||
document.getElementById('detailMask').classList.add('open');
|
||||
@@ -780,7 +902,8 @@ function showToast(msg){
|
||||
}
|
||||
|
||||
renderTable();
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
initSignCanvas();
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,13 +30,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.sidebar-subgroup__header{display:flex;align-items:center;gap:6px;padding:9px 24px;font-size:var(--font-sm);color:rgba(255,255,255,0.45);cursor:pointer;user-select:none;}
|
||||
.sidebar-subgroup__header:hover{color:rgba(255,255,255,0.85);}
|
||||
.sidebar-subgroup__header .arrow{width:10px;height:10px;stroke:currentColor;transition:transform .2s;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__header .arrow{transform:rotate(90deg);}
|
||||
.sidebar-subgroup__body{display:none;}
|
||||
.sidebar-subgroup.open .sidebar-subgroup__body{display:block;}
|
||||
.sidebar-subgroup__body .sidebar-item{padding-left:40px;}
|
||||
/* [交互] 二级分组菜单展开/收起(参考床头呼叫) */
|
||||
.sidebar-group__label{display:flex;align-items:center;justify-content:space-between;padding:9px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;}
|
||||
.sidebar-group__label:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-group__label svg{transition:transform .2s;flex-shrink:0;}
|
||||
.sidebar-group.open .sidebar-group__label svg{transform:rotate(180deg);}
|
||||
.sidebar-group__items{display:none;}
|
||||
.sidebar-group.open .sidebar-group__items{display:block;}
|
||||
.sidebar-item--sub{padding-left:44px;}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
/* 顶部Tab:员工就诊 / 非员工就诊 */
|
||||
.page-tabs{display:flex;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);margin-bottom:16px;overflow:hidden;}
|
||||
@@ -191,15 +192,17 @@ select.form-control{background:#fff url("data:image/svg+xml,%3Csvg xmlns='http:/
|
||||
<a href="daily-follow.html" class="sidebar-item">随访管理</a>
|
||||
<a href="daily-chronic.html" class="sidebar-item">慢病管理</a>
|
||||
<a href="daily-employee-search.html" class="sidebar-item">员工档案</a>
|
||||
<div class="sidebar-subgroup">
|
||||
<div class="sidebar-subgroup__header" onclick="toggleSubgroup(this)"><svg class="arrow" viewBox="0 0 10 10" fill="none"><path d="M3 1l4 4-4 4" stroke-width="1.5"/></svg>任务管理</div>
|
||||
<div class="sidebar-subgroup__body">
|
||||
<a href="daily-follow-task.html" class="sidebar-item">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item">解读任务</a>
|
||||
<div class="sidebar-group" id="grpTask">
|
||||
<div class="sidebar-group__label" onclick="toggleGroup('grpTask')">任务管理
|
||||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 3.5L5 6.5l3-3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="sidebar-group__items">
|
||||
<a href="daily-follow-task.html" class="sidebar-item sidebar-item--sub">随访任务</a>
|
||||
<a href="daily-interpret.html" class="sidebar-item sidebar-item--sub">解读任务</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教管理</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读管理</a>
|
||||
<a href="daily-education.html" class="sidebar-item">健康宣教</a>
|
||||
<a href="daily-interpret-manage.html" class="sidebar-item">报告解读记录</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
@@ -633,7 +636,7 @@ function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2200);
|
||||
}
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
function toggleGroup(id){document.getElementById(id).classList.toggle('open');}
|
||||
function switchTab(tab){
|
||||
document.querySelectorAll('.page-tab').forEach(function(t){t.classList.toggle('active',t.getAttribute('data-tab')===tab);});
|
||||
document.getElementById('panelStaff').classList.toggle('active',tab==='staff');
|
||||
|
||||
@@ -198,3 +198,23 @@
|
||||
- `web-admin/frontline-medical/daily-treatment-staff.html` / `daily-treatment-nonstaff.html` — 删除
|
||||
- `web-admin/frontline-medical/` 其余 45 页 — 侧边栏菜单与顶栏链接同步
|
||||
- `D:\Work\platform-prototype\index.html` — 站点地图同步
|
||||
|
||||
## [2026-09-15] feat: 身份证与联系电话全站去除脱敏
|
||||
|
||||
按需求将一线医疗模块所有页面演示数据中的身份证号与联系电话由脱敏展示改为完整展示,员工数据与「日常诊疗管理」就诊员工池保持一致。
|
||||
|
||||
**涉及文件:**
|
||||
|
||||
- `bed-bed.html` / `bed-dormitory.html` / `bed-call-record.html` — 床位/宿舍/呼叫记录员工电话
|
||||
- `config-allocate.html` / `config-ambulance.html` — 员工分配/救护车配置电话
|
||||
- `daily-follow.html` / `daily-follow-task.html` / `daily-interpret.html` — 随访/解读任务电话,随访任务页身份证
|
||||
- `daily-ambulance-attendance.html` — 救护车出勤电话
|
||||
- `hut-appointment.html` / `hut-cabin.html` — 健康小屋预约/台账电话
|
||||
|
||||
## [2026-09-15] feat: 员工分配统计概览卡改为员工口径 · 名册统计文案上移
|
||||
|
||||
按需求调整员工分配统计页。
|
||||
|
||||
**涉及文件:**
|
||||
|
||||
- `config-allocate-stat.html` — 概览卡由四卡(医疗点数量/医护人员总数/已分配员工总数/平均每点分配人数)改为三卡:员工总数量、已分配员工数量、未分配员工数量(未分配按单位汇总,与「员工分配」页未分配 Tab 演示数据一致共 9 人,仍随筛选实时计算);已分配员工名册抽屉中「共 N 人 · 分配至『单位/医疗点』」统计文案由筛选框右侧移至筛选框上方
|
||||
|
||||
@@ -241,18 +241,18 @@ var unitDeparts={'采油一厂':['樊学作业区','麻子山作业区'],'采油
|
||||
var stBadge={'待使用':'badge--info','使用中':'badge--warning','已完成':'badge--success','已取消':'badge--muted','爽约':'badge--danger'};
|
||||
/* 预约记录:健康室与设备与 hut-room 勾稽;监测设备不产生预约 */
|
||||
var appts=[
|
||||
{code:'YY-20260901-001',name:'石维国',sex:'男',unit:'采油一厂',depar:'樊学作业区',phone:'138****2211',status:'已完成',room:'樊学站点健康小屋',dev:'血压检测仪',date:'2026-09-01',start:'2026-09-01 09:00',end:'2026-09-01 09:32',created:'2026-08-30 16:22',useTime:'2026-09-01 09:02',backTime:'2026-09-01 09:32'},
|
||||
{code:'YY-20260901-002',name:'李桂芳',sex:'女',unit:'采油一厂',depar:'樊学作业区',phone:'139****0834',status:'已完成',room:'樊学站点健康小屋',dev:'血糖分析仪',date:'2026-09-01',start:'2026-09-01 10:00',end:'2026-09-01 10:18',created:'2026-08-31 08:40',useTime:'2026-09-01 10:01',backTime:'2026-09-01 10:18'},
|
||||
{code:'YY-20260902-003',name:'曲志明',sex:'男',unit:'采油一厂',depar:'樊学作业区',phone:'137****5520',status:'已取消',room:'樊学站点健康小屋',dev:'心理测评系统',date:'2026-09-02',start:'2026-09-02 14:00',end:'—',created:'2026-09-01 11:05',cancelTime:'2026-09-02 08:12'},
|
||||
{code:'YY-20260903-004',name:'刘玉梅',sex:'女',unit:'采气一厂',depar:'靖边气田',phone:'136****7712',status:'已完成',room:'靖边气田健康小屋',dev:'体成分分析仪',date:'2026-09-03',start:'2026-09-03 15:00',end:'2026-09-03 15:21',created:'2026-09-02 17:33',useTime:'2026-09-03 15:00',backTime:'2026-09-03 15:21'},
|
||||
{code:'YY-20260904-005',name:'高建军',sex:'男',unit:'第四采油厂',depar:'西峰作业区',phone:'135****9086',status:'爽约',room:'西峰基地健康小屋',dev:'激光治疗仪',date:'2026-09-04',start:'2026-09-04 14:30',end:'—',created:'2026-09-03 09:12',cancelTime:'2026-09-04 15:10'},
|
||||
{code:'YY-20260905-006',name:'徐立成',sex:'男',unit:'采油二厂',depar:'桐园作业区',phone:'138****4417',status:'已完成',room:'桐园站点健康小屋',dev:'血压检测仪',date:'2026-09-05',start:'2026-09-05 09:30',end:'2026-09-05 10:02',created:'2026-09-04 15:48',useTime:'2026-09-05 09:31',backTime:'2026-09-05 10:02'},
|
||||
{code:'YY-20260905-007',name:'呼建国',sex:'男',unit:'采气一厂',depar:'靖边气田',phone:'139****2680',status:'已取消',room:'靖边气田健康小屋',dev:'血压检测仪',date:'2026-09-05',start:'2026-09-05 09:00',end:'—',created:'2026-09-04 18:02',cancelTime:'2026-09-04 20:15'},
|
||||
{code:'YY-20260906-008',name:'白瑞',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'137****3341',status:'已取消',room:'西峰基地健康小屋',dev:'血糖分析仪',date:'2026-09-06',start:'2026-09-06 16:00',end:'—',created:'2026-09-05 10:26',cancelTime:'2026-09-06 07:50'},
|
||||
{code:'YY-20260907-009',name:'赵万福',sex:'男',unit:'采油二厂',depar:'桐园作业区',phone:'136****8123',status:'使用中',room:'桐园站点健康小屋',dev:'音乐放松舱',date:'2026-09-07',start:'2026-09-07 10:00',end:'—',created:'2026-09-06 14:19',useTime:'2026-09-07 10:03',backTime:'—'},
|
||||
{code:'YY-20260907-010',name:'闫婷',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'135****6208',status:'使用中',room:'西峰基地健康小屋',dev:'血糖分析仪',date:'2026-09-07',start:'2026-09-07 11:00',end:'—',created:'2026-09-06 16:55',useTime:'2026-09-07 11:01',backTime:'—'},
|
||||
{code:'YY-20260908-011',name:'杨慧敏',sex:'女',unit:'采油一厂',depar:'麻子山作业区',phone:'138****9975',status:'待使用',room:'麻子山站点健康小屋',dev:'体成分分析仪',date:'2026-09-08',start:'2026-09-08 15:00',end:'—',created:'2026-09-07 08:31'},
|
||||
{code:'YY-20260908-012',name:'张秀兰',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'139****5402',status:'待使用',room:'西峰基地健康小屋',dev:'血压检测仪',date:'2026-09-08',start:'2026-09-08 10:00',end:'—',created:'2026-09-07 09:04'}
|
||||
{code:'YY-20260901-001',name:'石维国',sex:'男',unit:'采油一厂',depar:'樊学作业区',phone:'13821622211',status:'已完成',room:'樊学站点健康小屋',dev:'血压检测仪',date:'2026-09-01',start:'2026-09-01 09:00',end:'2026-09-01 09:32',created:'2026-08-30 16:22',useTime:'2026-09-01 09:02',backTime:'2026-09-01 09:32'},
|
||||
{code:'YY-20260901-002',name:'李桂芳',sex:'女',unit:'采油一厂',depar:'樊学作业区',phone:'13937440834',status:'已完成',room:'樊学站点健康小屋',dev:'血糖分析仪',date:'2026-09-01',start:'2026-09-01 10:00',end:'2026-09-01 10:18',created:'2026-08-31 08:40',useTime:'2026-09-01 10:01',backTime:'2026-09-01 10:18'},
|
||||
{code:'YY-20260902-003',name:'曲志明',sex:'男',unit:'采油一厂',depar:'樊学作业区',phone:'13708495520',status:'已取消',room:'樊学站点健康小屋',dev:'心理测评系统',date:'2026-09-02',start:'2026-09-02 14:00',end:'—',created:'2026-09-01 11:05',cancelTime:'2026-09-02 08:12'},
|
||||
{code:'YY-20260903-004',name:'刘玉梅',sex:'女',unit:'采气一厂',depar:'靖边气田',phone:'13607587712',status:'已完成',room:'靖边气田健康小屋',dev:'体成分分析仪',date:'2026-09-03',start:'2026-09-03 15:00',end:'2026-09-03 15:21',created:'2026-09-02 17:33',useTime:'2026-09-03 15:00',backTime:'2026-09-03 15:21'},
|
||||
{code:'YY-20260904-005',name:'高建军',sex:'男',unit:'第四采油厂',depar:'西峰作业区',phone:'13589259086',status:'爽约',room:'西峰基地健康小屋',dev:'激光治疗仪',date:'2026-09-04',start:'2026-09-04 14:30',end:'—',created:'2026-09-03 09:12',cancelTime:'2026-09-04 15:10'},
|
||||
{code:'YY-20260905-006',name:'徐立成',sex:'男',unit:'采油二厂',depar:'桐园作业区',phone:'13848934417',status:'已完成',room:'桐园站点健康小屋',dev:'血压检测仪',date:'2026-09-05',start:'2026-09-05 09:30',end:'2026-09-05 10:02',created:'2026-09-04 15:48',useTime:'2026-09-05 09:31',backTime:'2026-09-05 10:02'},
|
||||
{code:'YY-20260905-007',name:'呼建国',sex:'男',unit:'采气一厂',depar:'靖边气田',phone:'13976362680',status:'已取消',room:'靖边气田健康小屋',dev:'血压检测仪',date:'2026-09-05',start:'2026-09-05 09:00',end:'—',created:'2026-09-04 18:02',cancelTime:'2026-09-04 20:15'},
|
||||
{code:'YY-20260906-008',name:'白瑞',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'13720283341',status:'已取消',room:'西峰基地健康小屋',dev:'血糖分析仪',date:'2026-09-06',start:'2026-09-06 16:00',end:'—',created:'2026-09-05 10:26',cancelTime:'2026-09-06 07:50'},
|
||||
{code:'YY-20260907-009',name:'赵万福',sex:'男',unit:'采油二厂',depar:'桐园作业区',phone:'13661218123',status:'使用中',room:'桐园站点健康小屋',dev:'音乐放松舱',date:'2026-09-07',start:'2026-09-07 10:00',end:'—',created:'2026-09-06 14:19',useTime:'2026-09-07 10:03',backTime:'—'},
|
||||
{code:'YY-20260907-010',name:'闫婷',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'13547386208',status:'使用中',room:'西峰基地健康小屋',dev:'血糖分析仪',date:'2026-09-07',start:'2026-09-07 11:00',end:'—',created:'2026-09-06 16:55',useTime:'2026-09-07 11:01',backTime:'—'},
|
||||
{code:'YY-20260908-011',name:'杨慧敏',sex:'女',unit:'采油一厂',depar:'麻子山作业区',phone:'13856939975',status:'待使用',room:'麻子山站点健康小屋',dev:'体成分分析仪',date:'2026-09-08',start:'2026-09-08 15:00',end:'—',created:'2026-09-07 08:31'},
|
||||
{code:'YY-20260908-012',name:'张秀兰',sex:'女',unit:'第四采油厂',depar:'西峰作业区',phone:'13916355402',status:'待使用',room:'西峰基地健康小屋',dev:'血压检测仪',date:'2026-09-08',start:'2026-09-08 10:00',end:'—',created:'2026-09-07 09:04'}
|
||||
];
|
||||
var delCodes=[];/* 当前待删除单号集合 */
|
||||
|
||||
|
||||
@@ -296,14 +296,14 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
var unitDeparts={'采油一厂':['樊学作业区','麻子山作业区'],'采油二厂':['桐园作业区','姬圪台作业区'],'第四采油厂':['西峰作业区'],'采气一厂':['靖边气田']};
|
||||
/* 小屋台账:负责人沿用站点负责人池;records 为每日测量人次(血压/血糖) */
|
||||
var cabins=[
|
||||
{name:'樊学基地健康小屋',unit:'采油一厂',depar:'樊学作业区',mgr:'王守正',office:'0963-88201',mobile:'138****2211',date:'2024-05-18',money:86000,devNum:6},
|
||||
{name:'麻子山站点健康小屋',unit:'采油一厂',depar:'麻子山作业区',mgr:'安伟',office:'0963-88302',mobile:'139****0834',date:'2024-06-02',money:75000,devNum:5},
|
||||
{name:'桐园基地健康小屋',unit:'采油二厂',depar:'桐园作业区',mgr:'陈国栋',office:'0963-88401',mobile:'137****5520',date:'2024-07-11',money:86000,devNum:6},
|
||||
{name:'姬圪台站点健康小屋',unit:'采油二厂',depar:'姬圪台作业区',mgr:'刘志强',office:'0963-88402',mobile:'136****7712',date:'2024-09-20',money:68000,devNum:4},
|
||||
{name:'西峰基地健康小屋',unit:'第四采油厂',depar:'西峰作业区',mgr:'马文秀',office:'0963-88501',mobile:'135****9086',date:'2024-08-15',money:92000,devNum:7},
|
||||
{name:'靖边气田健康小屋',unit:'采气一厂',depar:'靖边气田',mgr:'周铁祥',office:'0963-88601',mobile:'138****4417',date:'2025-03-06',money:86000,devNum:6},
|
||||
{name:'樊学作业区第二健康小屋',unit:'采油一厂',depar:'樊学作业区',mgr:'张国亮',office:'0963-88203',mobile:'139****2680',date:'2025-04-22',money:75000,devNum:5},
|
||||
{name:'西峰前线健康小屋',unit:'第四采油厂',depar:'西峰作业区',mgr:'冯建军',office:'0963-88502',mobile:'137****3341',date:'2025-06-10',money:68000,devNum:4}
|
||||
{name:'樊学基地健康小屋',unit:'采油一厂',depar:'樊学作业区',mgr:'王守正',office:'0963-88201',mobile:'13821622211',date:'2024-05-18',money:86000,devNum:6},
|
||||
{name:'麻子山站点健康小屋',unit:'采油一厂',depar:'麻子山作业区',mgr:'安伟',office:'0963-88302',mobile:'13937440834',date:'2024-06-02',money:75000,devNum:5},
|
||||
{name:'桐园基地健康小屋',unit:'采油二厂',depar:'桐园作业区',mgr:'陈国栋',office:'0963-88401',mobile:'13708495520',date:'2024-07-11',money:86000,devNum:6},
|
||||
{name:'姬圪台站点健康小屋',unit:'采油二厂',depar:'姬圪台作业区',mgr:'刘志强',office:'0963-88402',mobile:'13607587712',date:'2024-09-20',money:68000,devNum:4},
|
||||
{name:'西峰基地健康小屋',unit:'第四采油厂',depar:'西峰作业区',mgr:'马文秀',office:'0963-88501',mobile:'13589259086',date:'2024-08-15',money:92000,devNum:7},
|
||||
{name:'靖边气田健康小屋',unit:'采气一厂',depar:'靖边气田',mgr:'周铁祥',office:'0963-88601',mobile:'13848934417',date:'2025-03-06',money:86000,devNum:6},
|
||||
{name:'樊学作业区第二健康小屋',unit:'采油一厂',depar:'樊学作业区',mgr:'张国亮',office:'0963-88203',mobile:'13976362680',date:'2025-04-22',money:75000,devNum:5},
|
||||
{name:'西峰前线健康小屋',unit:'第四采油厂',depar:'西峰作业区',mgr:'冯建军',office:'0963-88502',mobile:'13720283341',date:'2025-06-10',money:68000,devNum:4}
|
||||
];
|
||||
/* 每座小屋生成 09-01~09-07 七日测量记录(血压人次=基准±波动,血糖≈血压×0.8) */
|
||||
(function(){
|
||||
|
||||
Reference in New Issue
Block a user