feat: 更新健康排查模块列表列+重写单位详情+去除侧边栏图标
- archive-personal.html: 健康排查列改为应参加/已参加/未参加活动,大于0红色显示 - archive-personal-detail.html: 健康排查tab改为活动列表筛选+详情弹窗 - archive-unit.html: 健康排查列改为活动次数,去掉未参加人数列 - archive-unit-health-checkup-detail.html: 重写为活动列表+未参加员工双Tab - crowd-status-employee.html, crowd-status-unit.html, exception-dirty.html, exception-result.html: 去除侧边栏菜单图标 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
b9ff7b1be5
commit
d91448de85
@@ -68,6 +68,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.tag-green{background:#F6FFED;color:var(--success);}
|
||||
.tag-orange{background:#FFF7E6;color:var(--warning);}
|
||||
.tag-red{background:#FFF1F0;color:var(--danger);}
|
||||
.tag-blue{background:var(--primary-light);color:var(--primary);}
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
@@ -133,6 +134,23 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.hs-table{width:100%;border-collapse:collapse;border:1px solid var(--border);}
|
||||
.hs-table th{background:#FAFAFA;padding:14px 20px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border:1px solid var(--border);}
|
||||
.hs-table td{padding:14px 20px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border:1px solid var(--border);}
|
||||
/* 问卷预览 */
|
||||
.preview-survey{margin-bottom:20px;}
|
||||
.preview-survey__name{font-size:var(--font-base);font-weight:600;padding:10px 16px;background:#F5F7FA;border-radius:var(--radius-sm);margin-bottom:8px;display:flex;align-items:center;gap:8px;}
|
||||
.preview-survey__name svg{width:16px;height:16px;color:var(--primary);}
|
||||
.preview-q{padding:12px 16px;background:#FAFAFA;border-radius:var(--radius-sm);margin-bottom:8px;}
|
||||
.preview-q__title{font-size:var(--font-sm);font-weight:500;margin-bottom:8px;}
|
||||
.preview-q__opts{display:flex;flex-direction:column;gap:6px;padding-left:4px;}
|
||||
.preview-q__opt{font-size:var(--font-sm);color:var(--text-secondary);display:flex;align-items:center;gap:8px;padding:2px 0;}
|
||||
.preview-q__opt.selected{color:var(--primary);font-weight:500;}
|
||||
.preview-q__opt .q-radio{width:14px;height:14px;border-radius:50%;border:1.5px solid var(--border);flex-shrink:0;transition:border-color .15s;}
|
||||
.preview-q__opt.selected .q-radio{border-color:var(--primary);}
|
||||
.preview-q__opt.selected .q-radio::after{content:'';width:8px;height:8px;border-radius:50%;background:var(--primary);}
|
||||
.preview-q__opt .q-check{width:14px;height:14px;border-radius:3px;border:1.5px solid var(--border);flex-shrink:0;transition:all .15s;}
|
||||
.preview-q__opt.selected .q-check{background:var(--primary);border-color:var(--primary);}
|
||||
.preview-q__opt.selected .q-check::after{content:'';width:4px;height:8px;border:solid #fff;border-width:0 1.5px 1.5px 0;transform:rotate(45deg);margin-top:-2px;}
|
||||
.preview-q__answer{font-size:var(--font-sm);color:var(--primary);padding-left:4px;}
|
||||
.txt-red{color:var(--danger);font-weight:600;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -159,9 +177,9 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">档案</div>
|
||||
<a class="sidebar-item active" href="archive-personal.html"><span class="mi">👤</span>个人监测数据</a>
|
||||
<a class="sidebar-item" href="archive-unit.html"><span class="mi">🏢</span>单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html"><span class="mi">🤖</span>算法模型</a>
|
||||
<a class="sidebar-item active" href="archive-personal.html">个人监测数据</a>
|
||||
<a class="sidebar-item" href="archive-unit.html">单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html">算法模型</a>
|
||||
</aside>
|
||||
<!-- 主内容区 -->
|
||||
<div class="main">
|
||||
@@ -237,31 +255,39 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- Tab2: 健康排查 -->
|
||||
<div class="tab-panel" id="panel-health-checkup">
|
||||
<div style="display:flex;gap:16px;margin-bottom:16px;align-items:center;">
|
||||
<div class="filter-item"><label>筛选日期</label><input class="filter-input" type="date" value="2026-05-01" style="min-width:140px;"><span style="margin:0 6px;color:var(--text-placeholder);">~</span><input class="filter-input" type="date" value="2026-05-13" style="min-width:140px;"></div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
<div class="filter-item"><label>是否参加活动</label>
|
||||
<select class="filter-select" id="hcAttendFilter">
|
||||
<option value="all">全部</option>
|
||||
<option value="done">已参加</option>
|
||||
<option value="pending">未参加</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="filterHcTable()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetHcFilter()">重置</button>
|
||||
</div>
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead><tr><th>记录时间</th><th>增加积分</th><th>操作</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>2026-05-13 08:30</td><td>+5</td><td><span class="link" onclick="openSurveyModal('2026-05-13 08:30')">查看问卷</span></td></tr>
|
||||
<tr><td>2026-05-12 08:15</td><td>+5</td><td><span class="link" onclick="openSurveyModal('2026-05-12 08:15')">查看问卷</span></td></tr>
|
||||
<tr><td>2026-05-11 07:50</td><td>+5</td><td><span class="link" onclick="openSurveyModal('2026-05-11 07:50')">查看问卷</span></td></tr>
|
||||
<tr><td>2026-05-10 08:05</td><td>+3</td><td><span class="link" onclick="openSurveyModal('2026-05-10 08:05')">查看问卷</span></td></tr>
|
||||
<tr><td>2026-05-09 09:00</td><td>+5</td><td><span class="link" onclick="openSurveyModal('2026-05-09 09:00')">查看问卷</span></td></tr>
|
||||
</tbody>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>活动名称</th>
|
||||
<th>组织单位</th>
|
||||
<th>组织部门</th>
|
||||
<th>起止日期</th>
|
||||
<th>问卷</th>
|
||||
<th>是否参加活动</th>
|
||||
<th>参加时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="hcTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>共 128 条</span>
|
||||
<span id="hcPageInfo"></span>
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<button class="page-btn">...</button>
|
||||
<button class="page-btn">26</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -324,24 +350,16 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 查看问卷弹窗 -->
|
||||
<!-- 问卷详情弹窗 -->
|
||||
<div class="modal-mask" id="surveyModal">
|
||||
<div class="modal" style="width:780px;">
|
||||
<div class="modal" style="width:720px;">
|
||||
<div class="modal__header">
|
||||
<h3>问卷详情</h3>
|
||||
<button class="modal__close" onclick="document.getElementById('surveyModal').classList.remove('show')">×</button>
|
||||
<h3 id="surveyModalTitle">问卷填写详情</h3>
|
||||
<button class="modal__close" onclick="closeModal('surveyModal')">×</button>
|
||||
</div>
|
||||
<div class="modal__body" style="padding:0;">
|
||||
<div style="padding:16px 24px 0;font-size:var(--font-sm);color:var(--text-secondary);">记录时间:<span id="surveyTime" style="color:var(--text-primary);font-weight:500;">—</span></div>
|
||||
<div style="padding:16px 24px;">
|
||||
<table>
|
||||
<thead><tr><th>问题分类</th><th>问题描述</th><th>员工选项</th></tr></thead>
|
||||
<tbody id="surveyTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:16px 24px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;">
|
||||
<button class="btn btn-default" onclick="document.getElementById('surveyModal').classList.remove('show')">关闭</button>
|
||||
<div class="modal__body" id="surveyModalBody" style="padding:24px;"></div>
|
||||
<div class="modal__footer" style="padding:16px 24px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;">
|
||||
<button class="btn btn-default" onclick="closeModal('surveyModal')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -404,22 +422,145 @@ function renderEcgChart(){
|
||||
c.innerHTML='<svg width="'+W+'" height="'+H+'" viewBox="0 0 '+W+' '+H+'">'+gridH+xLabels+'<polyline points="'+points.join(' ')+'" fill="none" stroke="#FF4D4F" stroke-width="1.5" stroke-linejoin="round"/></svg>';
|
||||
}
|
||||
document.getElementById('ecgDetailModal').addEventListener('click',function(e){if(e.target===this)this.classList.remove('show');});
|
||||
// 查看问卷弹窗
|
||||
var surveyAnswers=[
|
||||
{cat:'饮食习惯',desc:'今天是否按时吃早餐?',answer:'是'},
|
||||
{cat:'饮食习惯',desc:'今天饮水量是否达到1500ml?',answer:'是'},
|
||||
{cat:'运动锻炼',desc:'今天是否进行了30分钟以上运动?',answer:'否'},
|
||||
{cat:'睡眠质量',desc:'昨晚睡眠时间是否达到7小时?',answer:'是'},
|
||||
{cat:'心理状态',desc:'今天是否感到焦虑或压力过大?',answer:'否'}
|
||||
|
||||
/* ===== 健康排查 ===== */
|
||||
/* 活动数据 */
|
||||
var hcActivities = [
|
||||
{id:1, name:'2026年上半年员工健康排查', org:'能源集团', dept:'人力资源部', dateFrom:'2026-01-01', dateTo:'2026-03-31', surveys:['健康记录问卷','职业健康排查问卷'], attended:true, attendTime:'2026-03-05 09:32'},
|
||||
{id:2, name:'2026年Q2心理健康专项排查', org:'能源集团', dept:'安全环保部', dateFrom:'2026-04-01', dateTo:'2026-06-30', surveys:['心理健康评估问卷'], attended:true, attendTime:'2026-04-10 14:20'},
|
||||
{id:3, name:'2026年Q3职业健康排查', org:'能源集团', dept:'安全环保部', dateFrom:'2026-07-01', dateTo:'2026-09-30', surveys:['职业健康排查问卷','健康记录问卷'], attended:false, attendTime:''},
|
||||
{id:4, name:'新员工入职健康基线调查', org:'能源集团', dept:'人力资源部', dateFrom:'2026-06-01', dateTo:'2026-12-31', surveys:['新员工健康基线问卷'], attended:true, attendTime:'2026-06-05 08:50'},
|
||||
{id:5, name:'慢病患者季度随访', org:'能源集团', dept:'工会', dateFrom:'2026-04-01', dateTo:'2026-06-30', surveys:['慢病管理随访问卷'], attended:false, attendTime:''}
|
||||
];
|
||||
function openSurveyModal(time){
|
||||
document.getElementById('surveyTime').textContent=time;
|
||||
var html='';
|
||||
surveyAnswers.forEach(function(s){html+='<tr><td>'+s.cat+'</td><td>'+s.desc+'</td><td>'+s.answer+'</td></tr>';});
|
||||
document.getElementById('surveyTbody').innerHTML=html;
|
||||
|
||||
/* 问卷填写模拟数据 */
|
||||
var hcSurveyAnswers = {
|
||||
1: [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]},
|
||||
{surveyName:'职业健康排查问卷', questions:[
|
||||
{q:'今天工作中是否接触有害物质?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否佩戴了防护用品?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'本周是否参加了安全培训?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
2: [
|
||||
{surveyName:'心理健康评估问卷', questions:[
|
||||
{q:'最近两周是否经常感到情绪低落?', type:'radio', opts:['经常','偶尔','很少','从不'], answer:'偶尔'},
|
||||
{q:'最近是否对以前感兴趣的事情失去兴趣?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'最近是否感到睡眠不足?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'请描述您最近的心理状态', type:'text', opts:[], answer:'工作压力较大,但整体可控'}
|
||||
]}
|
||||
],
|
||||
4: [
|
||||
{surveyName:'新员工健康基线问卷', questions:[
|
||||
{q:'您是否有既往病史?', type:'radio', opts:['有','无'], answer:'无'},
|
||||
{q:'您是否有药物过敏史?', type:'radio', opts:['有','无'], answer:'无'},
|
||||
{q:'您最近一次体检是什么时候?', type:'radio', opts:['3个月内','半年内','一年内','一年以上'], answer:'半年内'},
|
||||
{q:'您的BMI指数是否正常?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
]
|
||||
};
|
||||
|
||||
function renderHcTable(filter){
|
||||
var data = hcActivities;
|
||||
if(filter === 'done') data = hcActivities.filter(function(a){return a.attended;});
|
||||
else if(filter === 'pending') data = hcActivities.filter(function(a){return !a.attended;});
|
||||
|
||||
var html = '';
|
||||
if(data.length === 0){
|
||||
html = '<tr><td colspan="8" style="text-align:center;color:var(--text-placeholder);padding:40px;">暂无数据</td></tr>';
|
||||
} else {
|
||||
data.forEach(function(a){
|
||||
var surveys = a.surveys.map(function(s){return '<span class="tag tag-blue">'+esc(s)+'</span>';}).join(' ');
|
||||
var attendedTag = a.attended
|
||||
? '<span class="tag tag-green">已参加</span>'
|
||||
: '<span class="tag tag-red">未参加</span>';
|
||||
var attendTime = a.attended ? a.attendTime : '<span class="txt-red">—</span>';
|
||||
var actionBtn = a.attended
|
||||
? '<button class="link" onclick="openSurveyDetail('+a.id+')">问卷详情</button>'
|
||||
: '—';
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(a.name)+'</td>';
|
||||
html += '<td>'+esc(a.org)+'</td>';
|
||||
html += '<td>'+esc(a.dept)+'</td>';
|
||||
html += '<td>'+a.dateFrom+' ~ '+a.dateTo+'</td>';
|
||||
html += '<td>'+surveys+'</td>';
|
||||
html += '<td>'+attendedTag+'</td>';
|
||||
html += '<td>'+attendTime+'</td>';
|
||||
html += '<td>'+actionBtn+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('hcTbody').innerHTML = html;
|
||||
document.getElementById('hcPageInfo').textContent = '共 '+data.length+' 条数据';
|
||||
}
|
||||
|
||||
function filterHcTable(){
|
||||
var v = document.getElementById('hcAttendFilter').value;
|
||||
renderHcTable(v);
|
||||
}
|
||||
|
||||
function resetHcFilter(){
|
||||
document.getElementById('hcAttendFilter').value = 'all';
|
||||
renderHcTable('all');
|
||||
}
|
||||
|
||||
function openSurveyDetail(actId){
|
||||
var act = hcActivities.find(function(a){return a.id === actId;});
|
||||
if(!act) return;
|
||||
var empName = document.getElementById('empName').textContent;
|
||||
document.getElementById('surveyModalTitle').textContent = empName+' — 问卷填写详情';
|
||||
var answers = hcSurveyAnswers[actId];
|
||||
var html = '';
|
||||
if(!answers || answers.length === 0){
|
||||
html = '<div style="text-align:center;color:var(--text-placeholder);padding:40px;">暂无问卷填写记录</div>';
|
||||
} else {
|
||||
answers.forEach(function(sv){
|
||||
html += '<div class="preview-survey">';
|
||||
html += '<div class="preview-survey__name"><svg viewBox="0 0 16 16" fill="none"><path d="M3 1h7l4 4v10H3V1z" stroke="currentColor" stroke-width="1.3"/><path d="M10 1v4h4" stroke="currentColor" stroke-width="1.3"/></svg>'+esc(sv.surveyName)+'</div>';
|
||||
sv.questions.forEach(function(q,i){
|
||||
html += '<div class="preview-q">';
|
||||
html += '<div class="preview-q__title">'+(i+1)+'. '+esc(q.q)+'</div>';
|
||||
if(q.type==='text'){
|
||||
html += '<div class="preview-q__answer">'+esc(q.answer)+'</div>';
|
||||
} else if(q.type==='checkbox'){
|
||||
html += '<div class="preview-q__opts">';
|
||||
q.opts.forEach(function(opt){
|
||||
var isSel = q.answer && q.answer.indexOf(opt) > -1;
|
||||
html += '<div class="preview-q__opt'+(isSel?' selected':'')+'"><span class="q-check'+(isSel?' checked':'')+'"></span>'+esc(opt)+'</div>';
|
||||
});
|
||||
html += '</div>';
|
||||
} else {
|
||||
html += '<div class="preview-q__opts">';
|
||||
q.opts.forEach(function(opt){
|
||||
var isSel = (q.answer === opt);
|
||||
html += '<div class="preview-q__opt'+(isSel?' selected':'')+'"><span class="q-radio'+(isSel?' filled':'')+'"></span>'+esc(opt)+'</div>';
|
||||
});
|
||||
html += '</div>';
|
||||
}
|
||||
html += '</div>';
|
||||
});
|
||||
html += '</div>';
|
||||
});
|
||||
}
|
||||
document.getElementById('surveyModalBody').innerHTML = html;
|
||||
document.getElementById('surveyModal').classList.add('show');
|
||||
}
|
||||
document.getElementById('surveyModal').addEventListener('click',function(e){if(e.target===this)this.classList.remove('show');});
|
||||
|
||||
function closeModal(id){document.getElementById(id).classList.remove('show');}
|
||||
function esc(s){return (s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
|
||||
/* 点击遮罩关闭弹窗 */
|
||||
document.querySelectorAll('.modal-mask').forEach(function(m){
|
||||
m.addEventListener('click',function(e){if(e.target===m) closeModal(m.id);});
|
||||
});
|
||||
|
||||
// URL参数回显
|
||||
(function(){
|
||||
var params=new URLSearchParams(location.search);
|
||||
@@ -431,6 +572,7 @@ document.getElementById('surveyModal').addEventListener('click',function(e){if(e
|
||||
document.getElementById('empCode').textContent='员工编号:'+(id||'EMP001');
|
||||
document.getElementById('empUnit').textContent=emp.unit;
|
||||
document.getElementById('empDept').textContent=emp.dept;
|
||||
renderHcTable('all');
|
||||
})();
|
||||
// 穿戴监测默认渲染心率图表(切到该tab时触发)
|
||||
var origSwitch=switchMainPanel;
|
||||
|
||||
@@ -78,6 +78,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.tag-red{background:#FFF1F0;color:var(--danger);}
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
|
||||
.tag-A{background:#FFF1F0;color:#FF4D4F;}.tag-B{background:#FFF7E6;color:#FA8C16;}.tag-C{background:#FFFBE6;color:#FAAD14;}.tag-D{background:#E6F7FF;color:#1890FF;}.tag-E{background:#F6FFED;color:#52C41A;}
|
||||
.txt-red{color:var(--danger);font-weight:600;}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
@@ -112,9 +113,9 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">档案</div>
|
||||
<a class="sidebar-item active" href="archive-personal.html"><span class="mi">👤</span>个人监测数据</a>
|
||||
<a class="sidebar-item" href="archive-unit.html"><span class="mi">🏢</span>单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html"><span class="mi">🤖</span>算法模型</a>
|
||||
<a class="sidebar-item active" href="archive-personal.html">个人监测数据</a>
|
||||
<a class="sidebar-item" href="archive-unit.html">单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html">算法模型</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
@@ -168,12 +169,13 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<th rowspan="2">所属单位</th>
|
||||
<th rowspan="2">所属部门</th>
|
||||
<th rowspan="2">健康现状</th>
|
||||
<th colspan="2">健康排查</th>
|
||||
<th colspan="3">健康排查</th>
|
||||
<th colspan="2">穿戴监测</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>积分 ↕</th>
|
||||
<th>连续签到天数 ↕</th>
|
||||
<th>应参加活动 ↕</th>
|
||||
<th>已参加活动 ↕</th>
|
||||
<th>未参加活动 ↕</th>
|
||||
<th>绑定设备 ↕</th>
|
||||
<th>异常次数 ↕</th>
|
||||
<th>操作</th>
|
||||
@@ -183,35 +185,35 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<tr>
|
||||
<td>张伟</td><td>EMP001</td><td>CQ能源总部</td><td>研发部</td>
|
||||
<td><span class="tag tag-E">E类</span></td>
|
||||
<td>92</td><td>128</td>
|
||||
<td><span class="tag tag-green">是</span></td><td>2</td>
|
||||
<td>5</td><td>5</td><td>0</td>
|
||||
<td><span class="tag tag-green">是</span></td><td class="txt-red">2</td>
|
||||
<td><a class="link" href="archive-personal-detail.html?id=EMP001">详细信息</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>李娜</td><td>EMP002</td><td>CQ能源总部</td><td>市场部</td>
|
||||
<td><span class="tag tag-D">D类</span></td>
|
||||
<td>88</td><td>125</td>
|
||||
<td><span class="tag tag-green">是</span></td><td>1</td>
|
||||
<td>5</td><td>4</td><td class="txt-red">1</td>
|
||||
<td><span class="tag tag-green">是</span></td><td class="txt-red">1</td>
|
||||
<td><a class="link" href="archive-personal-detail.html?id=EMP002">详细信息</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>陈刚</td><td>EMP005</td><td>CQ能源总部</td><td>人事部</td>
|
||||
<td><span class="tag tag-B">B类</span></td>
|
||||
<td>78</td><td>120</td>
|
||||
<td><span class="tag tag-green">是</span></td><td>3</td>
|
||||
<td>5</td><td>3</td><td class="txt-red">2</td>
|
||||
<td><span class="tag tag-green">是</span></td><td class="txt-red">3</td>
|
||||
<td><a class="link" href="archive-personal-detail.html?id=EMP005">详细信息</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>王磊</td><td>EMP003</td><td>采油一厂</td><td>运营部</td>
|
||||
<td><span class="tag tag-C">C类</span></td>
|
||||
<td>76</td><td>98</td>
|
||||
<td>4</td><td>2</td><td class="txt-red">2</td>
|
||||
<td><span class="tag tag-orange">否</span></td><td>0</td>
|
||||
<td><a class="link" href="archive-personal-detail.html?id=EMP003">详细信息</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>赵敏</td><td>EMP004</td><td>采油二厂</td><td>财务部</td>
|
||||
<td><span class="tag tag-A">A类</span></td>
|
||||
<td>95</td><td>131</td>
|
||||
<td>5</td><td>5</td><td>0</td>
|
||||
<td><span class="tag tag-green">是</span></td><td>0</td>
|
||||
<td><a class="link" href="archive-personal-detail.html?id=EMP004">详细信息</a></td>
|
||||
</tr>
|
||||
|
||||
@@ -40,31 +40,48 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);outline:none;background:#fff;min-width:180px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;min-width:120px;}
|
||||
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}
|
||||
.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}
|
||||
.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;min-width:120px;cursor:pointer;}
|
||||
.filter-select:focus{border-color:var(--primary);}
|
||||
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:1px solid var(--border);background:#fff;color:var(--text-primary);transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.btn:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.btn-primary{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.btn-primary:hover{background:#40a9ff;border-color:#40a9ff;color:#fff;}
|
||||
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
|
||||
.table-card__title{font-size:var(--font-base);font-weight:600;}
|
||||
.table-card__content{overflow-x:auto;overflow-y:hidden;}
|
||||
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
|
||||
.table-card__content table{min-width:100%;white-space:nowrap;}
|
||||
table{width:100%;border-collapse:collapse;}
|
||||
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:14px 16px;font-size:var(--font-sm);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-blue{background:var(--primary-light);color:var(--primary);}
|
||||
.tag-green{background:#F6FFED;color:var(--success);}
|
||||
.tag-orange{background:#FFF7E6;color:var(--warning);}
|
||||
.tag-red{background:#FFF1F0;color:var(--danger);}
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;background:none;border:none;}
|
||||
.link:hover{color:#40a9ff;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.detail-title{font-size:var(--font-lg);font-weight:600;margin-bottom:4px;}
|
||||
.detail-meta{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:16px;}
|
||||
.empty-state{text-align:center;padding:40px 20px;color:var(--text-placeholder);}
|
||||
.empty-state svg{width:64px;height:64px;margin-bottom:12px;opacity:0.3;}
|
||||
.empty-state__title{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
/* 弹窗 */
|
||||
.modal-mask{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.45);z-index:500;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .15s;}
|
||||
.modal-mask.show{opacity:1;pointer-events:auto;}
|
||||
.modal{background:#fff;border-radius:var(--radius-lg);width:85%;max-width:960px;max-height:85vh;overflow-y:auto;box-shadow:0 8px 40px rgba(0,0,0,0.18);}
|
||||
.modal__header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--border);}
|
||||
.modal__header h3{font-size:var(--font-lg);font-weight:600;}
|
||||
.modal__close{width:32px;height:32px;border:none;background:none;cursor:pointer;font-size:20px;color:var(--text-secondary);border-radius:var(--radius-sm);}
|
||||
.modal__close:hover{background:#f5f5f5;}
|
||||
.modal__body{padding:0;}
|
||||
.modal__footer{padding:16px 24px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;}
|
||||
/* 弹窗内筛选 */
|
||||
.modal-filter{padding:16px 24px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -75,7 +92,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
健康监测
|
||||
</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-personal.html" class="active">档案</a>
|
||||
<a href="archive-personal.html">档案</a>
|
||||
<a href="crowd-status-employee.html">健康现状</a>
|
||||
<a href="health-checkup/survey-category.html">健康排查</a>
|
||||
<a href="wearable/tool-manage.html">穿戴监测</a>
|
||||
@@ -113,152 +130,101 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<div class="breadcrumb">
|
||||
<a href="archive-unit.html">单位报表数据</a>
|
||||
<span class="sep">/</span>
|
||||
<span id="unitDept"></span>
|
||||
<span id="bcUnit">—</span>
|
||||
<span class="sep">/</span>
|
||||
<span>健康排查</span>
|
||||
<span>健康排查详情</span>
|
||||
</div>
|
||||
<div class="detail-title" id="detailTitle"></div>
|
||||
<div class="detail-meta" id="detailMeta"></div>
|
||||
|
||||
<!-- [交互] Tab 切换 -->
|
||||
<!-- Tab 切换 -->
|
||||
<div class="tab-bar">
|
||||
<div class="tab-item active" onclick="switchTab('signed',this)">已签到</div>
|
||||
<div class="tab-item" onclick="switchTab('unsigned',this)">未签到</div>
|
||||
<div class="tab-item active" onclick="switchTab('activity-list',this)">活动列表</div>
|
||||
<div class="tab-item" onclick="switchTab('pending-emp',this)">未参加员工</div>
|
||||
</div>
|
||||
|
||||
<!-- 已签到面板 -->
|
||||
<div class="tab-panel active" id="panel-signed">
|
||||
<!-- Tab1: 活动列表 -->
|
||||
<div class="tab-panel active" id="panel-activity-list">
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工姓名">
|
||||
<label>活动名称</label>
|
||||
<input class="filter-input" type="text" id="actNameFilter" placeholder="请输入活动名称" style="min-width:220px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工编号">
|
||||
</div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:12px;margin-bottom:16px;">
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-primary" onclick="filterActivityList()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetActivityFilter()">重置</button>
|
||||
</div>
|
||||
<div class="table-card">
|
||||
<div class="table-card__header">
|
||||
<span class="table-card__title">已签到员工列表</span>
|
||||
<span style="font-size:var(--font-sm);color:var(--text-secondary);">共 98 条</span>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>员工姓名</th>
|
||||
<th>员工编号</th>
|
||||
<th>部门名称</th>
|
||||
<th>积分</th>
|
||||
<th>总签到天数</th>
|
||||
<th>连续签到天数</th>
|
||||
<th>最新签到时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>张伟</td>
|
||||
<td>EMP001</td>
|
||||
<td>研发部</td>
|
||||
<td>92</td>
|
||||
<td>156</td>
|
||||
<td>128</td>
|
||||
<td>2026-05-13 08:30</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>李娜</td>
|
||||
<td>EMP002</td>
|
||||
<td>市场部</td>
|
||||
<td>88</td>
|
||||
<td>142</td>
|
||||
<td>125</td>
|
||||
<td>2026-05-13 09:15</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>王强</td>
|
||||
<td>EMP003</td>
|
||||
<td>运营部</td>
|
||||
<td>76</td>
|
||||
<td>113</td>
|
||||
<td>98</td>
|
||||
<td>2026-05-13 07:45</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<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>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="actListTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>显示 3 条,共 98 条</span>
|
||||
<span id="actListPageInfo"></span>
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 未签到面板 -->
|
||||
<div class="tab-panel" id="panel-unsigned">
|
||||
<!-- Tab2: 未参加员工 -->
|
||||
<div class="tab-panel" id="panel-pending-emp">
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工姓名</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工姓名">
|
||||
<label>所属部门</label>
|
||||
<select class="filter-select" id="pendingDeptFilter">
|
||||
<option value="">全部</option>
|
||||
<option>研发部</option>
|
||||
<option>运营部</option>
|
||||
<option>市场部</option>
|
||||
<option>财务部</option>
|
||||
<option>人事部</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" type="text" id="pendingNameFilter" placeholder="请输入姓名" style="min-width:140px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工编号">
|
||||
<input class="filter-input" type="text" id="pendingEmpIdFilter" placeholder="请输入编号" style="min-width:140px;">
|
||||
</div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:12px;margin-bottom:16px;">
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-primary" onclick="filterPendingEmp()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetPendingEmpFilter()">重置</button>
|
||||
</div>
|
||||
<div class="table-card">
|
||||
<div class="table-card__header">
|
||||
<span class="table-card__title">未签到员工列表</span>
|
||||
<span style="font-size:var(--font-sm);color:var(--text-secondary);">共 22 条</span>
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>员工姓名</th>
|
||||
<th>员工编号</th>
|
||||
<th>部门名称</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>马超</td>
|
||||
<td>EMP004</td>
|
||||
<td>研发部</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>赵敏</td>
|
||||
<td>EMP005</td>
|
||||
<td>财务部</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>单位</th>
|
||||
<th>部门</th>
|
||||
<th>姓名</th>
|
||||
<th>员工编号</th>
|
||||
<th>未参加活动</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="pendingEmpTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>显示 2 条,共 22 条</span>
|
||||
<span id="pendingEmpPageInfo"></span>
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -266,27 +232,514 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
|
||||
</main>
|
||||
|
||||
<!-- 已参加人员弹窗 -->
|
||||
<div class="modal-mask" id="doneModal">
|
||||
<div class="modal" style="max-width:1020px;">
|
||||
<div class="modal__header">
|
||||
<h3 id="doneModalTitle">已参加人员</h3>
|
||||
<button class="modal__close" onclick="closeModal('doneModal')">×</button>
|
||||
</div>
|
||||
<div class="modal-filter">
|
||||
<div class="filter-item"><label>单位/部门</label>
|
||||
<select class="filter-select" id="doneDeptFilter" style="min-width:160px;height:32px;font-size:var(--font-xs);">
|
||||
<option value="">全部</option>
|
||||
<option value="能源集团/人力资源部">能源集团/人力资源部</option>
|
||||
<option value="能源集团/安全环保部">能源集团/安全环保部</option>
|
||||
<option value="能源集团/工会">能源集团/工会</option>
|
||||
<option value="能源集团/生产技术部">能源集团/生产技术部</option>
|
||||
<option value="能源集团/财务部">能源集团/财务部</option>
|
||||
<option value="能源集团/信息中心">能源集团/信息中心</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item"><label>姓名</label>
|
||||
<input class="filter-input" id="doneNameFilter" placeholder="请输入姓名" style="min-width:130px;height:32px;font-size:var(--font-xs);">
|
||||
</div>
|
||||
<div class="filter-item"><label>员工编号</label>
|
||||
<input class="filter-input" id="doneEmpIdFilter" placeholder="请输入编号" style="min-width:130px;height:32px;font-size:var(--font-xs);">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="filterDoneModal()" style="height:32px;padding:0 12px;font-size:var(--font-xs);">查询</button>
|
||||
<button class="btn btn-default" onclick="resetDoneModalFilter()" style="height:32px;padding:0 12px;font-size:var(--font-xs);">重置</button>
|
||||
<span style="flex:1;"></span>
|
||||
<button class="btn" onclick="alert('导出已参加人员数据')" style="height:32px;padding:0 12px;font-size:var(--font-xs);">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1v8M4 6l3 3 3-3M2 11h10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
导出
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:16%;">单位</th>
|
||||
<th style="width:16%;">部门</th>
|
||||
<th style="width:10%;">姓名</th>
|
||||
<th style="width:10%;">员工编号</th>
|
||||
<th style="width:8%;">性别</th>
|
||||
<th style="width:8%;">年龄</th>
|
||||
<th style="width:20%;">问卷</th>
|
||||
<th style="width:14%;">填写问卷时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="doneModalTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('doneModal')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 未参加人员弹窗 -->
|
||||
<div class="modal-mask" id="pendingModal">
|
||||
<div class="modal" style="max-width:900px;">
|
||||
<div class="modal__header">
|
||||
<h3 id="pendingModalTitle">未参加人员</h3>
|
||||
<button class="modal__close" onclick="closeModal('pendingModal')">×</button>
|
||||
</div>
|
||||
<div class="modal-filter">
|
||||
<div class="filter-item"><label>单位/部门</label>
|
||||
<select class="filter-select" id="pendingModalDeptFilter" style="min-width:160px;height:32px;font-size:var(--font-xs);">
|
||||
<option value="">全部</option>
|
||||
<option value="能源集团/人力资源部">能源集团/人力资源部</option>
|
||||
<option value="能源集团/安全环保部">能源集团/安全环保部</option>
|
||||
<option value="能源集团/工会">能源集团/工会</option>
|
||||
<option value="能源集团/生产技术部">能源集团/生产技术部</option>
|
||||
<option value="能源集团/财务部">能源集团/财务部</option>
|
||||
<option value="能源集团/信息中心">能源集团/信息中心</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item"><label>姓名</label>
|
||||
<input class="filter-input" id="pendingModalNameFilter" placeholder="请输入姓名" style="min-width:130px;height:32px;font-size:var(--font-xs);">
|
||||
</div>
|
||||
<div class="filter-item"><label>员工编号</label>
|
||||
<input class="filter-input" id="pendingModalEmpIdFilter" placeholder="请输入编号" style="min-width:130px;height:32px;font-size:var(--font-xs);">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="filterPendingModal()" style="height:32px;padding:0 12px;font-size:var(--font-xs);">查询</button>
|
||||
<button class="btn btn-default" onclick="resetPendingModalFilter()" style="height:32px;padding:0 12px;font-size:var(--font-xs);">重置</button>
|
||||
<span style="flex:1;"></span>
|
||||
<button class="btn" onclick="alert('导出未参加人员数据')" style="height:32px;padding:0 12px;font-size:var(--font-xs);">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1v8M4 6l3 3 3-3M2 11h10" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
导出
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:20%;">单位</th>
|
||||
<th style="width:20%;">部门</th>
|
||||
<th style="width:15%;">姓名</th>
|
||||
<th style="width:15%;">员工编号</th>
|
||||
<th style="width:15%;">性别</th>
|
||||
<th style="width:15%;">年龄</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="pendingModalTbody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn-default" onclick="closeModal('pendingModal')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function getUrlParam(name) {
|
||||
/* ===== 工具 ===== */
|
||||
function getUrlParam(name){
|
||||
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
return r ? decodeURIComponent(r[2]) : null;
|
||||
}
|
||||
function esc(s){return (s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
function closeModal(id){document.getElementById(id).classList.remove('show');}
|
||||
|
||||
function switchTab(tabName, elem) {
|
||||
document.querySelectorAll('.tab-item').forEach(function(t) { t.classList.remove('active'); });
|
||||
document.querySelectorAll('.tab-panel').forEach(function(p) { p.classList.remove('active'); });
|
||||
elem.classList.add('active');
|
||||
document.getElementById('panel-' + tabName).classList.add('active');
|
||||
/* 点击遮罩关闭弹窗 */
|
||||
document.querySelectorAll('.modal-mask').forEach(function(m){
|
||||
m.addEventListener('click',function(e){if(e.target===m) closeModal(m.id);});
|
||||
});
|
||||
|
||||
/* ===== 数据 ===== */
|
||||
var statusMap = {'待开始':'tag-blue','进行中':'tag-orange','已完成':'tag-green'};
|
||||
|
||||
var activities = [
|
||||
{id:1, name:'2026年上半年员工健康排查', org:'能源集团', dept:'人力资源部', dateFrom:'2026-01-01', dateTo:'2026-03-31', personCount:1280, status:'已完成', leader:'张明', phone:'13800001234', desc:'年度例行员工健康排查活动,覆盖全体员工。', doneCount:1147, pendingCount:133},
|
||||
{id:2, name:'2026年Q2心理健康专项排查', org:'能源集团', dept:'安全环保部', dateFrom:'2026-04-01', dateTo:'2026-06-30', personCount:356, status:'进行中', leader:'李华', phone:'13800005678', desc:'针对C类和D类人群的心理健康专项排查。', doneCount:298, pendingCount:58},
|
||||
{id:3, name:'2026年Q3职业健康排查', org:'能源集团', dept:'安全环保部', dateFrom:'2026-07-01', dateTo:'2026-09-30', personCount:520, status:'待开始', leader:'王强', phone:'13800009012', desc:'第三季度职业健康专项排查,针对A类和B类人群。', doneCount:0, pendingCount:520},
|
||||
{id:4, name:'新员工入职健康基线调查', org:'能源集团', dept:'人力资源部', dateFrom:'2026-06-01', dateTo:'2026-12-31', personCount:85, status:'进行中', leader:'赵芳', phone:'13800003456', desc:'2026年度新入职员工健康基线数据采集。', doneCount:72, pendingCount:13},
|
||||
{id:5, name:'慢病患者季度随访', org:'能源集团', dept:'工会', dateFrom:'2026-04-01', dateTo:'2026-06-30', personCount:128, status:'进行中', leader:'孙丽', phone:'13800007890', desc:'E类慢病患者第二季度定期随访。', doneCount:115, pendingCount:13}
|
||||
];
|
||||
|
||||
var allPersons = [
|
||||
{id:'001001', name:'张伟', org:'能源集团', dept:'人力资源部', gender:'男', age:32, done:true, fillTime:'2026-03-05 09:32'},
|
||||
{id:'001002', name:'李娜', org:'能源集团', dept:'人力资源部', gender:'女', age:28, done:true, fillTime:'2026-03-05 10:15'},
|
||||
{id:'001003', name:'王磊', org:'能源集团', dept:'人力资源部', gender:'男', age:35, done:false},
|
||||
{id:'002001', name:'赵敏', org:'能源集团', dept:'安全环保部', gender:'女', age:30, done:true, fillTime:'2026-03-06 14:20'},
|
||||
{id:'002002', name:'刘洋', org:'能源集团', dept:'安全环保部', gender:'男', age:27, done:true, fillTime:'2026-03-06 16:45'},
|
||||
{id:'002003', name:'陈晨', org:'能源集团', dept:'安全环保部', gender:'女', age:25, done:false},
|
||||
{id:'002004', name:'周杰', org:'能源集团', dept:'安全环保部', gender:'男', age:33, done:false},
|
||||
{id:'003001', name:'吴芳', org:'能源集团', dept:'工会', gender:'女', age:29, done:true, fillTime:'2026-03-07 08:50'},
|
||||
{id:'003002', name:'孙丽', org:'能源集团', dept:'工会', gender:'女', age:31, done:true, fillTime:'2026-03-07 11:30'},
|
||||
{id:'003003', name:'郑浩', org:'能源集团', dept:'工会', gender:'男', age:26, done:false},
|
||||
{id:'004001', name:'黄磊', org:'能源集团', dept:'生产技术部', gender:'男', age:38, done:true, fillTime:'2026-03-08 09:10'},
|
||||
{id:'004002', name:'林燕', org:'能源集团', dept:'生产技术部', gender:'女', age:24, done:true, fillTime:'2026-03-08 15:22'},
|
||||
{id:'004003', name:'何强', org:'能源集团', dept:'生产技术部', gender:'男', age:34, done:false},
|
||||
{id:'004004', name:'马超', org:'能源集团', dept:'生产技术部', gender:'男', age:30, done:true, fillTime:'2026-03-09 10:05'},
|
||||
{id:'005001', name:'杨丽', org:'能源集团', dept:'财务部', gender:'女', age:27, done:true, fillTime:'2026-03-09 14:18'},
|
||||
{id:'005002', name:'朱峰', org:'能源集团', dept:'财务部', gender:'男', age:36, done:false},
|
||||
{id:'006001', name:'徐明', org:'能源集团', dept:'信息中心', gender:'男', age:29, done:true, fillTime:'2026-03-10 09:45'},
|
||||
{id:'006002', name:'韩雪', org:'能源集团', dept:'信息中心', gender:'女', age:26, done:true, fillTime:'2026-03-10 16:30'},
|
||||
{id:'006003', name:'曹杰', org:'能源集团', dept:'信息中心', gender:'男', age:31, done:false},
|
||||
{id:'006004', name:'邓辉', org:'能源集团', dept:'信息中心', gender:'男', age:28, done:false}
|
||||
];
|
||||
|
||||
/* 问卷数据 */
|
||||
var surveyAnswers = {
|
||||
'001001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]},
|
||||
{surveyName:'职业健康排查问卷', questions:[
|
||||
{q:'今天工作中是否接触有害物质?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否佩戴了防护用品?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'本周是否参加了安全培训?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
'001002': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]},
|
||||
{surveyName:'职业健康排查问卷', questions:[
|
||||
{q:'今天工作中是否接触有害物质?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否佩戴了防护用品?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'本周是否参加了安全培训?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]}
|
||||
],
|
||||
'002001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]},
|
||||
{surveyName:'职业健康排查问卷', questions:[
|
||||
{q:'今天工作中是否接触有害物质?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否佩戴了防护用品?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'本周是否参加了安全培训?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
'002002': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]},
|
||||
{surveyName:'职业健康排查问卷', questions:[
|
||||
{q:'今天工作中是否接触有害物质?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否佩戴了防护用品?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'本周是否参加了安全培训?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
'003001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
'003002': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]}
|
||||
],
|
||||
'004001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'是'}
|
||||
]}
|
||||
],
|
||||
'004002': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', type:'radio', opts:['是','否'], answer:'否'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', type:'radio', opts:['是','否'], answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', type:'radio', opts:['是','否'], answer:'否'}
|
||||
]}
|
||||
],
|
||||
'004004': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', answer:'否'}
|
||||
]}
|
||||
],
|
||||
'005001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', answer:'否'}
|
||||
]}
|
||||
],
|
||||
'006001': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', answer:'否'},
|
||||
{q:'今天是否进行了30分钟以上运动?', answer:'是'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', answer:'否'}
|
||||
]}
|
||||
],
|
||||
'006002': [
|
||||
{surveyName:'健康记录问卷', questions:[
|
||||
{q:'今天是否按时吃早餐?', answer:'是'},
|
||||
{q:'今天饮水量是否达到1500ml?', answer:'是'},
|
||||
{q:'今天是否进行了30分钟以上运动?', answer:'否'},
|
||||
{q:'昨晚睡眠时间是否达到7小时?', answer:'是'},
|
||||
{q:'今天是否感到焦虑或压力过大?', answer:'是'}
|
||||
]}
|
||||
]
|
||||
};
|
||||
|
||||
/* 当前状态 */
|
||||
var currentActForModal = null;
|
||||
var donePersons = [];
|
||||
var pendingPersons = [];
|
||||
|
||||
/* ===== Tab切换 ===== */
|
||||
function switchTab(tabName, el){
|
||||
document.querySelectorAll('.tab-item').forEach(function(t){t.classList.remove('active');});
|
||||
document.querySelectorAll('.tab-panel').forEach(function(p){p.classList.remove('active');});
|
||||
el.classList.add('active');
|
||||
document.getElementById('panel-'+tabName).classList.add('active');
|
||||
}
|
||||
|
||||
var unit = getUrlParam('unit') || '采油一厂';
|
||||
var dept = getUrlParam('dept') || '';
|
||||
var displayName = unit + (dept ? ' - ' + dept : '');
|
||||
/* ===== 活动列表 ===== */
|
||||
function renderActivityList(data){
|
||||
var html = '';
|
||||
if(data.length === 0){
|
||||
html = '<tr><td colspan="11"><div class="empty-state"><svg viewBox="0 0 64 64" fill="none"><circle cx="32" cy="32" r="26" stroke="currentColor" stroke-width="2" stroke-dasharray="4 3"/><path d="M24 28h16M24 34h10M24 40h6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><div class="empty-state__title">暂无活动数据</div></div></td></tr>';
|
||||
} else {
|
||||
data.forEach(function(a){
|
||||
var surveys = surveyAnswers[a.id] || [];
|
||||
var surveyText = surveys.map(function(sv){return '<span class="tag tag-blue">'+esc(sv.surveyName)+'</span>';}).join(' ');
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(a.name)+'</td>';
|
||||
html += '<td>'+esc(a.org)+'</td>';
|
||||
html += '<td>'+esc(a.dept)+'</td>';
|
||||
html += '<td>'+a.dateFrom+' ~ '+a.dateTo+'</td>';
|
||||
html += '<td>'+a.personCount+'</td>';
|
||||
html += '<td><button class="link" onclick="openDoneModal('+a.id+')">'+a.doneCount+'</button></td>';
|
||||
html += '<td><button class="link" onclick="openPendingModal('+a.id+')">'+a.pendingCount+'</button></td>';
|
||||
html += '<td><span class="tag '+statusMap[a.status]+'">'+a.status+'</span></td>';
|
||||
html += '<td>'+esc(a.leader)+'</td>';
|
||||
html += '<td>'+a.phone+'</td>';
|
||||
html += '<td>'+esc(a.desc||'—')+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('actListTbody').innerHTML = html;
|
||||
document.getElementById('actListPageInfo').textContent = '共 '+data.length+' 条数据';
|
||||
}
|
||||
|
||||
document.getElementById('unitDept').textContent = displayName;
|
||||
document.getElementById('detailTitle').textContent = displayName + ' — 健康排查 详情';
|
||||
document.getElementById('detailMeta').textContent = '2026年 · 总人数 120';
|
||||
function filterActivityList(){
|
||||
var name = document.getElementById('actNameFilter').value.trim().toLowerCase();
|
||||
var filtered = activities.filter(function(a){
|
||||
if(name && a.name.toLowerCase().indexOf(name) === -1) return false;
|
||||
return true;
|
||||
});
|
||||
renderActivityList(filtered);
|
||||
}
|
||||
|
||||
function resetActivityFilter(){
|
||||
document.getElementById('actNameFilter').value = '';
|
||||
renderActivityList(activities);
|
||||
}
|
||||
|
||||
/* ===== 已参加弹窗 ===== */
|
||||
function openDoneModal(actId){
|
||||
currentActForModal = actId;
|
||||
var act = activities.find(function(a){return a.id===actId;});
|
||||
document.getElementById('doneModalTitle').textContent = esc(act.name)+' — 已参加人员('+act.doneCount+'人)';
|
||||
donePersons = allPersons.filter(function(p){return p.done;});
|
||||
renderDoneModalTable(donePersons);
|
||||
document.getElementById('doneModal').classList.add('show');
|
||||
}
|
||||
|
||||
function renderDoneModalTable(data){
|
||||
var html = '';
|
||||
if(data.length === 0){
|
||||
html = '<tr><td colspan="8"><div class="empty-state"><svg viewBox="0 0 64 64" fill="none"><circle cx="32" cy="32" r="26" stroke="currentColor" stroke-width="2" stroke-dasharray="4 3"/><path d="M24 28h16M24 34h10M24 40h6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><div class="empty-state__title">暂无已参加人员</div></div></td></tr>';
|
||||
} else {
|
||||
data.forEach(function(p){
|
||||
var surveys = surveyAnswers[p.id] || [];
|
||||
var surveyText = surveys.map(function(sv){return '<span class="tag tag-blue">'+esc(sv.surveyName)+'</span>';}).join(' ');
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(p.org)+'</td>';
|
||||
html += '<td>'+esc(p.dept)+'</td>';
|
||||
html += '<td>'+esc(p.name)+'</td>';
|
||||
html += '<td>'+p.id+'</td>';
|
||||
html += '<td>'+p.gender+'</td>';
|
||||
html += '<td>'+p.age+'</td>';
|
||||
html += '<td>'+surveyText+'</td>';
|
||||
html += '<td>'+p.fillTime+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('doneModalTbody').innerHTML = html;
|
||||
}
|
||||
|
||||
function filterDoneModal(){
|
||||
var name = document.getElementById('doneNameFilter').value.trim().toLowerCase();
|
||||
var empId = document.getElementById('doneEmpIdFilter').value.trim().toLowerCase();
|
||||
var deptVal = document.getElementById('doneDeptFilter').value;
|
||||
var filtered = donePersons.filter(function(p){
|
||||
if(name && p.name.toLowerCase().indexOf(name) === -1) return false;
|
||||
if(empId && p.id.toLowerCase().indexOf(empId) === -1) return false;
|
||||
if(deptVal && (p.org+'/'+p.dept) !== deptVal) return false;
|
||||
return true;
|
||||
});
|
||||
renderDoneModalTable(filtered);
|
||||
}
|
||||
|
||||
function resetDoneModalFilter(){
|
||||
document.getElementById('doneNameFilter').value = '';
|
||||
document.getElementById('doneEmpIdFilter').value = '';
|
||||
document.getElementById('doneDeptFilter').value = '';
|
||||
renderDoneModalTable(donePersons);
|
||||
}
|
||||
|
||||
/* ===== 未参加弹窗 ===== */
|
||||
function openPendingModal(actId){
|
||||
currentActForModal = actId;
|
||||
var act = activities.find(function(a){return a.id===actId;});
|
||||
document.getElementById('pendingModalTitle').textContent = esc(act.name)+' — 未参加人员('+act.pendingCount+'人)';
|
||||
pendingPersons = allPersons.filter(function(p){return !p.done;});
|
||||
renderPendingModalTable(pendingPersons);
|
||||
document.getElementById('pendingModal').classList.add('show');
|
||||
}
|
||||
|
||||
function renderPendingModalTable(data){
|
||||
var html = '';
|
||||
if(data.length === 0){
|
||||
html = '<tr><td colspan="6"><div class="empty-state"><svg viewBox="0 0 64 64" fill="none"><circle cx="32" cy="32" r="26" stroke="currentColor" stroke-width="2" stroke-dasharray="4 3"/><path d="M24 28h16M24 34h10M24 40h6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><div class="empty-state__title">暂无未参加人员</div></div></td></tr>';
|
||||
} else {
|
||||
data.forEach(function(p){
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(p.org)+'</td>';
|
||||
html += '<td>'+esc(p.dept)+'</td>';
|
||||
html += '<td>'+esc(p.name)+'</td>';
|
||||
html += '<td>'+p.id+'</td>';
|
||||
html += '<td>'+p.gender+'</td>';
|
||||
html += '<td>'+p.age+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('pendingModalTbody').innerHTML = html;
|
||||
}
|
||||
|
||||
function filterPendingModal(){
|
||||
var name = document.getElementById('pendingModalNameFilter').value.trim().toLowerCase();
|
||||
var empId = document.getElementById('pendingModalEmpIdFilter').value.trim().toLowerCase();
|
||||
var deptVal = document.getElementById('pendingModalDeptFilter').value;
|
||||
var filtered = pendingPersons.filter(function(p){
|
||||
if(name && p.name.toLowerCase().indexOf(name) === -1) return false;
|
||||
if(empId && p.id.toLowerCase().indexOf(empId) === -1) return false;
|
||||
if(deptVal && (p.org+'/'+p.dept) !== deptVal) return false;
|
||||
return true;
|
||||
});
|
||||
renderPendingModalTable(filtered);
|
||||
}
|
||||
|
||||
function resetPendingModalFilter(){
|
||||
document.getElementById('pendingModalNameFilter').value = '';
|
||||
document.getElementById('pendingModalEmpIdFilter').value = '';
|
||||
document.getElementById('pendingModalDeptFilter').value = '';
|
||||
renderPendingModalTable(pendingPersons);
|
||||
}
|
||||
|
||||
/* ===== 未参加员工列表 ===== */
|
||||
function buildPendingEmpList(){
|
||||
/* 每个人列出所有未参加的活动 */
|
||||
var rows = [];
|
||||
activities.forEach(function(a){
|
||||
allPersons.filter(function(p){return !p.done;}).forEach(function(p){
|
||||
rows.push({org:p.org, dept:p.dept, name:p.name, empId:p.id, activityName:a.name});
|
||||
});
|
||||
});
|
||||
return rows;
|
||||
}
|
||||
|
||||
function renderPendingEmpTable(data){
|
||||
var html = '';
|
||||
if(data.length === 0){
|
||||
html = '<tr><td colspan="5"><div class="empty-state"><svg viewBox="0 0 64 64" fill="none"><circle cx="32" cy="32" r="26" stroke="currentColor" stroke-width="2" stroke-dasharray="4 3"/><path d="M24 28h16M24 34h10M24 40h6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><div class="empty-state__title">暂无未参加员工数据</div></div></td></tr>';
|
||||
} else {
|
||||
data.forEach(function(r){
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(r.org)+'</td>';
|
||||
html += '<td>'+esc(r.dept)+'</td>';
|
||||
html += '<td>'+esc(r.name)+'</td>';
|
||||
html += '<td>'+r.empId+'</td>';
|
||||
html += '<td>'+esc(r.activityName)+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
}
|
||||
document.getElementById('pendingEmpTbody').innerHTML = html;
|
||||
document.getElementById('pendingEmpPageInfo').textContent = '共 '+data.length+' 条数据';
|
||||
}
|
||||
|
||||
function filterPendingEmp(){
|
||||
var name = document.getElementById('pendingNameFilter').value.trim().toLowerCase();
|
||||
var empId = document.getElementById('pendingEmpIdFilter').value.trim().toLowerCase();
|
||||
var deptVal = document.getElementById('pendingDeptFilter').value;
|
||||
var data = buildPendingEmpList().filter(function(r){
|
||||
if(name && r.name.toLowerCase().indexOf(name) === -1) return false;
|
||||
if(empId && r.empId.toLowerCase().indexOf(empId) === -1) return false;
|
||||
if(deptVal && r.dept !== deptVal) return false;
|
||||
return true;
|
||||
});
|
||||
renderPendingEmpTable(data);
|
||||
}
|
||||
|
||||
function resetPendingEmpFilter(){
|
||||
document.getElementById('pendingNameFilter').value = '';
|
||||
document.getElementById('pendingEmpIdFilter').value = '';
|
||||
document.getElementById('pendingDeptFilter').value = '';
|
||||
renderPendingEmpTable(buildPendingEmpList());
|
||||
}
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
(function(){
|
||||
var unit = getUrlParam('unit') || '采油一厂';
|
||||
var dept = getUrlParam('dept') || '';
|
||||
var displayName = unit + (dept ? ' - ' + dept : '');
|
||||
document.getElementById('bcUnit').textContent = displayName;
|
||||
renderActivityList(activities);
|
||||
renderPendingEmpTable(buildPendingEmpList());
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -112,9 +112,9 @@ tbody tr.stat-row:hover{background:#E6F0FF;}
|
||||
<!-- 侧边栏 -->
|
||||
<div class="sidebar">
|
||||
<div class="sidebar-menu__title">档案</div>
|
||||
<a class="sidebar-item" href="archive-personal.html"><span class="mi">👤</span>个人监测数据</a>
|
||||
<a class="sidebar-item active" href="archive-unit.html"><span class="mi">🏢</span>单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html"><span class="mi">🤖</span>算法模型</a>
|
||||
<a class="sidebar-item" href="archive-personal.html">个人监测数据</a>
|
||||
<a class="sidebar-item active" href="archive-unit.html">单位报表数据</a>
|
||||
<a class="sidebar-item" href="archive-algorithm.html">算法模型</a>
|
||||
</div>
|
||||
|
||||
<!-- 主内容区域 -->
|
||||
@@ -171,14 +171,13 @@ tbody tr.stat-row:hover{background:#E6F0FF;}
|
||||
<tr>
|
||||
<th rowspan="2">单位名称</th>
|
||||
<th rowspan="2">总人数</th>
|
||||
<th colspan="2">健康排查</th>
|
||||
<th>健康排查</th>
|
||||
<th colspan="4">穿戴监测</th>
|
||||
<th colspan="5">体重监测</th>
|
||||
<th colspan="5">环境监测</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>已签到人数 ↕</th>
|
||||
<th>未签到人数 ↕</th>
|
||||
<th>活动次数 ↕</th>
|
||||
<th>入库设备数 ↕</th>
|
||||
<th>分配设备数 ↕</th>
|
||||
<th>告警次数 ↕</th>
|
||||
@@ -197,13 +196,13 @@ tbody tr.stat-row:hover{background:#E6F0FF;}
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="stat-row">
|
||||
<td>统计行</td><td>1,280</td><td>1,147</td><td>133</td><td>1,280</td><td>1,147</td><td>45</td><td>27</td><td>1,147</td><td>244</td><td>129</td><td>86</td><td>53</td><td>80</td><td>25</td><td>12</td><td>6</td><td>12</td>
|
||||
<td>统计行</td><td>1,280</td><td>5</td><td>1,280</td><td>1,147</td><td>45</td><td>27</td><td>1,147</td><td>244</td><td>129</td><td>86</td><td>53</td><td>80</td><td>25</td><td>12</td><td>6</td><td>12</td>
|
||||
</tr>
|
||||
<tr><td>采油一厂</td><td>420</td><td>398</td><td>22</td><td>420</td><td>398</td><td>12</td><td>8</td><td>398</td><td>85</td><td>42</td><td>28</td><td>15</td><td>24</td><td>8</td><td>4</td><td>2</td><td>3</td></tr>
|
||||
<tr><td>采油二厂</td><td>380</td><td>356</td><td>24</td><td>380</td><td>356</td><td>18</td><td>12</td><td>356</td><td>76</td><td>38</td><td>25</td><td>18</td><td>20</td><td>6</td><td>3</td><td>2</td><td>5</td></tr>
|
||||
<tr><td>采气一厂</td><td>260</td><td>245</td><td>15</td><td>260</td><td>245</td><td>8</td><td>5</td><td>245</td><td>52</td><td>26</td><td>18</td><td>12</td><td>16</td><td>5</td><td>2</td><td>1</td><td>2</td></tr>
|
||||
<tr><td>能源总部机关</td><td>150</td><td>148</td><td>2</td><td>150</td><td>148</td><td>4</td><td>2</td><td>148</td><td>32</td><td>16</td><td>10</td><td>5</td><td>12</td><td>4</td><td>2</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>勘探开发研究院</td><td>70</td><td>65</td><td>5</td><td>70</td><td>65</td><td>3</td><td>2</td><td>65</td><td>14</td><td>7</td><td>5</td><td>3</td><td>8</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>420</td><td>5</td><td>420</td><td>398</td><td>12</td><td>8</td><td>398</td><td>85</td><td>42</td><td>28</td><td>15</td><td>24</td><td>8</td><td>4</td><td>2</td><td>3</td></tr>
|
||||
<tr><td>采油二厂</td><td>380</td><td>5</td><td>380</td><td>356</td><td>18</td><td>12</td><td>356</td><td>76</td><td>38</td><td>25</td><td>18</td><td>20</td><td>6</td><td>3</td><td>2</td><td>5</td></tr>
|
||||
<tr><td>采气一厂</td><td>260</td><td>4</td><td>260</td><td>245</td><td>8</td><td>5</td><td>245</td><td>52</td><td>26</td><td>18</td><td>12</td><td>16</td><td>5</td><td>2</td><td>1</td><td>2</td></tr>
|
||||
<tr><td>能源总部机关</td><td>150</td><td>5</td><td>150</td><td>148</td><td>4</td><td>2</td><td>148</td><td>32</td><td>16</td><td>10</td><td>5</td><td>12</td><td>4</td><td>2</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>勘探开发研究院</td><td>70</td><td>3</td><td>70</td><td>65</td><td>3</td><td>2</td><td>65</td><td>14</td><td>7</td><td>5</td><td>3</td><td>8</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -225,14 +224,13 @@ tbody tr.stat-row:hover{background:#E6F0FF;}
|
||||
<th rowspan="2">单位名称</th>
|
||||
<th rowspan="2">部门名称</th>
|
||||
<th rowspan="2">总人数</th>
|
||||
<th colspan="2">健康排查</th>
|
||||
<th>健康排查</th>
|
||||
<th colspan="4">穿戴监测</th>
|
||||
<th colspan="5">体重监测</th>
|
||||
<th colspan="5">环境监测</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>已签到人数 ↕</th>
|
||||
<th>未签到人数 ↕</th>
|
||||
<th>活动次数 ↕</th>
|
||||
<th>入库设备数 ↕</th>
|
||||
<th>分配设备数 ↕</th>
|
||||
<th>异常次数 ↕</th>
|
||||
@@ -251,13 +249,13 @@ tbody tr.stat-row:hover{background:#E6F0FF;}
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="stat-row">
|
||||
<td>统计行</td><td>—</td><td>405</td><td>384</td><td>21</td><td>405</td><td>384</td><td>14</td><td>8</td><td>384</td><td>82</td><td>41</td><td>27</td><td>15</td><td>24</td><td>8</td><td>4</td><td>4</td><td>5</td>
|
||||
<td>统计行</td><td>—</td><td>405</td><td>5</td><td>405</td><td>384</td><td>14</td><td>8</td><td>384</td><td>82</td><td>41</td><td>27</td><td>15</td><td>24</td><td>8</td><td>4</td><td>4</td><td>5</td>
|
||||
</tr>
|
||||
<tr><td>采油一厂</td><td>研发部</td><td>85</td><td>82</td><td>3</td><td>85</td><td>82</td><td>2</td><td>1</td><td>82</td><td>18</td><td>9</td><td>6</td><td>3</td><td>6</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>运营部</td><td>120</td><td>112</td><td>8</td><td>120</td><td>112</td><td>5</td><td>3</td><td>112</td><td>24</td><td>12</td><td>8</td><td>5</td><td>8</td><td>3</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>市场部</td><td>95</td><td>90</td><td>5</td><td>95</td><td>90</td><td>3</td><td>2</td><td>90</td><td>19</td><td>10</td><td>6</td><td>4</td><td>6</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油二厂</td><td>财务部</td><td>60</td><td>58</td><td>2</td><td>60</td><td>58</td><td>2</td><td>1</td><td>58</td><td>12</td><td>6</td><td>4</td><td>2</td><td>4</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油二厂</td><td>人事部</td><td>45</td><td>42</td><td>3</td><td>45</td><td>42</td><td>2</td><td>1</td><td>42</td><td>9</td><td>5</td><td>3</td><td>2</td><td>3</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>研发部</td><td>85</td><td>5</td><td>85</td><td>82</td><td>2</td><td>1</td><td>82</td><td>18</td><td>9</td><td>6</td><td>3</td><td>6</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>运营部</td><td>120</td><td>4</td><td>120</td><td>112</td><td>5</td><td>3</td><td>112</td><td>24</td><td>12</td><td>8</td><td>5</td><td>8</td><td>3</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油一厂</td><td>市场部</td><td>95</td><td>5</td><td>95</td><td>90</td><td>3</td><td>2</td><td>90</td><td>19</td><td>10</td><td>6</td><td>4</td><td>6</td><td>2</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油二厂</td><td>财务部</td><td>60</td><td>3</td><td>60</td><td>58</td><td>2</td><td>1</td><td>58</td><td>12</td><td>6</td><td>4</td><td>2</td><td>4</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
<tr><td>采油二厂</td><td>人事部</td><td>45</td><td>3</td><td>45</td><td>42</td><td>2</td><td>1</td><td>42</td><td>9</td><td>5</td><td>3</td><td>2</td><td>3</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -314,10 +312,8 @@ function switchTab(idx) {
|
||||
|
||||
// 二级单位表格
|
||||
if(tableIdx === 0){
|
||||
// 健康排查列 (2-3): 已签到、未签到
|
||||
for(var i = 2; i <= 3; i++){
|
||||
wrapLink(cells[i], 'archive-unit-health-checkup-detail.html?unit=' + encodeURIComponent(unitName));
|
||||
}
|
||||
// 健康排查列 (2): 活动次数
|
||||
wrapLink(cells[2], 'archive-unit-health-checkup-detail.html?unit=' + encodeURIComponent(unitName));
|
||||
// 穿戴监测列 (4-7): 入库、分配、异常次数、异常人数
|
||||
for(var i = 4; i <= 7; i++){
|
||||
wrapLink(cells[i], 'archive-unit-wearable-detail.html?unit=' + encodeURIComponent(unitName));
|
||||
@@ -337,10 +333,8 @@ function switchTab(idx) {
|
||||
var unitCell = cells[1];
|
||||
var unitNameFromCell = unitCell.textContent;
|
||||
|
||||
// 健康排查列 (3-4): 已签到、未签到
|
||||
for(var i = 3; i <= 4; i++){
|
||||
wrapLink(cells[i], 'archive-unit-health-checkup-detail.html?unit=' + encodeURIComponent(unitNameFromCell) + '&dept=' + encodeURIComponent(deptName));
|
||||
}
|
||||
// 健康排查列 (3): 活动次数
|
||||
wrapLink(cells[3], 'archive-unit-health-checkup-detail.html?unit=' + encodeURIComponent(unitNameFromCell) + '&dept=' + encodeURIComponent(deptName));
|
||||
// 穿戴监测列 (5-8): 入库、分配、异常次数、异常人数
|
||||
for(var i = 5; i <= 8; i++){
|
||||
wrapLink(cells[i], 'archive-unit-wearable-detail.html?unit=' + encodeURIComponent(unitNameFromCell) + '&dept=' + encodeURIComponent(deptName));
|
||||
|
||||
@@ -68,8 +68,8 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">健康现状</div>
|
||||
<a class="sidebar-item active" href="crowd-status-employee.html"><span class="mi">👤</span>员工评估信息</a>
|
||||
<a class="sidebar-item" href="crowd-status-unit.html"><span class="mi">🏢</span>单位评估统计</a>
|
||||
<a class="sidebar-item active" href="crowd-status-employee.html">员工评估信息</a>
|
||||
<a class="sidebar-item" href="crowd-status-unit.html">单位评估统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
|
||||
@@ -68,8 +68,8 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">健康现状</div>
|
||||
<a class="sidebar-item" href="crowd-status-employee.html"><span class="mi">👤</span>员工评估信息</a>
|
||||
<a class="sidebar-item active" href="crowd-status-unit.html"><span class="mi">🏢</span>单位评估统计</a>
|
||||
<a class="sidebar-item" href="crowd-status-employee.html">员工评估信息</a>
|
||||
<a class="sidebar-item active" href="crowd-status-unit.html">单位评估统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
|
||||
@@ -111,8 +111,8 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">异常事件</div>
|
||||
<a href="exception-dirty.html" class="sidebar-item active"><span class="mi">🗑️</span>系统脏数据</a>
|
||||
<a href="exception-result.html" class="sidebar-item"><span class="mi">❌</span>结果异常</a>
|
||||
<a href="exception-dirty.html" class="sidebar-item active">系统脏数据</a>
|
||||
<a href="exception-result.html" class="sidebar-item">结果异常</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
|
||||
@@ -106,8 +106,8 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">异常事件</div>
|
||||
<a href="exception-dirty.html" class="sidebar-item"><span class="mi">🗑️</span>系统脏数据</a>
|
||||
<a href="exception-result.html" class="sidebar-item active"><span class="mi">❌</span>结果异常</a>
|
||||
<a href="exception-dirty.html" class="sidebar-item">系统脏数据</a>
|
||||
<a href="exception-result.html" class="sidebar-item active">结果异常</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
|
||||
Reference in New Issue
Block a user