feat: 体重管理页面优化更新

This commit is contained in:
liuyunqin
2026-08-03 19:42:13 +08:00
parent a131d5545e
commit 09f1080730
37 changed files with 1634 additions and 1290 deletions
@@ -91,9 +91,10 @@ tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 日期列固定左侧 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(1){z-index:9;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
thead th:nth-child(1),tbody td:nth-child(1){width:52px;min-width:52px;max-width:52px;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:6;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(2){z-index:9;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 吃动热量差列 */
.col-diet-last{border-right:2px solid var(--border) !important;}
@@ -153,7 +154,7 @@ tbody tr:hover td:nth-child(1){background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item active">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
@@ -218,8 +219,9 @@ tbody tr:hover td:nth-child(1){background:#F8FBFF;}
<table>
<thead>
<!-- [交互] 表头第一行:父级分类 -->
<tr>
<th rowspan="2">日期</th>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">日期</th>
<th rowspan="2">身高<br>(cm)</th>
<th rowspan="2">初始<br>体重(kg)</th>
<th rowspan="2">初始<br>BMI</th>
@@ -614,12 +616,12 @@ function renderTable(){
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filtered.length === 0){
tbody.innerHTML = '<tr><td colspan="27" class="td-empty">暂无匹配的每日明细数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="28" class="td-empty">暂无匹配的每日明细数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
@@ -641,6 +643,7 @@ function renderTable(){
else rankHtml = '<span class="rank-other">'+d.rank+'</span>';
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.date)+'</td>';
html += '<td>'+d.height+'</td>';
html += '<td>'+d.initWeight+'</td>';
@@ -43,17 +43,6 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
.page-header__breadcrumb span{color:var(--text-primary);}
/* 计划选择区 */
.plan-selector{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:flex-start;gap:24px;}
.plan-selector__left{flex:1;min-width:0;max-width:400px;}
.plan-selector__label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;font-weight:500;}
.plan-selector__right{flex:1;display:flex;gap:28px;padding:18px 20px;background:#FAFAFA;border-radius:var(--radius-md);border:1px solid var(--border);min-height:78px;align-items:center;}
.plan-selector__right--empty{justify-content:center;color:var(--text-placeholder);font-size:var(--font-sm);}
.plan-info-item{display:flex;flex-direction:column;gap:6px;}
.plan-info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.plan-info-item__value{font-size:var(--font-base);color:var(--text-primary);font-weight:600;}
.plan-info-item__value strong{color:var(--primary);font-size:var(--font-lg);}
/* 搜索下拉 */
.search-select{position:relative;width:100%;}
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 36px 0 12px;font-size:var(--font-sm);outline:none;transition:border-color .2s;box-sizing:border-box;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
@@ -116,16 +105,19 @@ tbody td{padding:10px 6px;text-align:center;font-size:var(--font-sm);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 前三列固定左侧 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:200px;min-width:200px;max-width:200px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:9;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:200px;z-index:5;background:#fff;width:56px;min-width:56px;max-width:56px;}
thead th:nth-child(2){z-index:8;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:256px;z-index:4;background:#fff;width:88px;min-width:88px;max-width:88px;}
thead th:nth-child(3){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
/* 序号列 — 不固定 */
thead th:nth-child(1),tbody td:nth-child(1){width:52px;min-width:52px;max-width:52px;}
/* 干预计划/姓名/员工编号固定左侧(原1/2/3 → 现2/3/4 */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:6;background:#fff;width:200px;min-width:200px;max-width:200px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:9;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:200px;z-index:5;background:#fff;width:56px;min-width:56px;max-width:56px;}
thead th:nth-child(3){z-index:8;background:#FAFAFA;}
thead th:nth-child(4),tbody td:nth-child(4){position:sticky;left:256px;z-index:4;background:#fff;width:88px;min-width:88px;max-width:88px;}
thead th:nth-child(4){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
tbody tr:hover td:nth-child(3),
tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 赛况明细列固定右侧 — 仅第一行表头(rowspan=2的th)和tbody最后一列 */
thead tr:first-child th:last-child,tbody td:last-child{position:sticky;right:0;z-index:2;background:#fff;box-shadow:-2px 0 4px rgba(0,0,0,0.04);}
@@ -188,7 +180,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item active">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
@@ -199,49 +191,18 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>活动总览</span></div>
</div>
<!-- [交互] 干预计划选择区 — 搜索下拉选择计划,选中后右侧展示基本信息 -->
<div class="plan-selector">
<div class="plan-selector__left">
<div class="plan-selector__label">干预计划</div>
<div class="search-select" id="planSelect">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<!-- [交互] 点击清空已选计划,恢复未选择状态 -->
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 选中计划后此处展示基本信息;未选中时显示占位提示 -->
<div class="plan-selector__right plan-selector__right--empty" id="planInfoEmpty">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="margin-right:6px;flex-shrink:0;"><circle cx="9" cy="9" r="8" stroke="#999" stroke-width="1.2" stroke-dasharray="3 2"/><path d="M9 5v4M9 11v.5" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
可选择干预计划进行查看
</div>
<div class="plan-selector__right" id="planInfo" style="display:none;">
<div class="plan-info-item">
<span class="plan-info-item__label">组织机构</span>
<span class="plan-info-item__value" id="piOrg">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">起止日期</span>
<span class="plan-info-item__value" id="piDate">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">进行天数</span>
<span class="plan-info-item__value" id="piDays">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">应参加人数</span>
<span class="plan-info-item__value"><strong id="piCount">-</strong></span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">实际参加人数</span>
<span class="plan-info-item__value"><strong id="piActual">-</strong></span>
</div>
</div>
</div>
<!-- [交互] 筛选栏 — 单位部门、姓名、员工编号 -->
<div class="filter-bar">
<!-- [交互] 双列面板:左选单位→右选部门 -->
<!-- [交互] 筛选栏 — 干预计划、单位部门、姓名、员工编号 -->
<div class="filter-bar">
<!-- [交互] 干预计划下拉搜索 -->
<div class="filter-item">
<label>干预计划</label>
<div class="search-select" id="planSelect" style="width:280px;">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 双列面板:左选单位→右选部门 -->
<div class="filter-item">
<label>单位部门</label>
<div class="org-select-wrap" id="orgWrap">
@@ -294,6 +255,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<thead>
<!-- [交互] 表头第一行:父级分类(饮食总览、运动总览为合并单元格) -->
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">干预计划</th>
<th rowspan="2">姓名</th>
<th rowspan="2">员工编号</th>
@@ -515,34 +477,25 @@ function showPlanPanel(){
}
function selectPlan(planId){
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
document.getElementById('planInfoEmpty').style.display = 'none';
document.getElementById('planInfo').style.display = 'flex';
document.getElementById('piOrg').textContent = plan.org;
document.getElementById('piDate').textContent = plan.dateFrom + ' ~ ' + plan.dateTo;
document.getElementById('piDays').textContent = calcPlanDays(plan.dateFrom, plan.dateTo) + ' 天';
document.getElementById('piCount').textContent = plan.totalCount + ' 人';
document.getElementById('piActual').textContent = (plan.actualCount || 0) + ' 人';
applyFilter();
}
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
applyFilter();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planInfoEmpty').style.display = '';
document.getElementById('planInfo').style.display = 'none';
applyFilter();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
applyFilter();
}
/* ===== 单位部门双列面板 ===== */
var deptMap = {
@@ -631,11 +584,11 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="35" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="36" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
@@ -645,6 +598,7 @@ function renderTable(){
var fcSign = d.fatChange > 0 ? '+' : '';
var wacSign = d.waistChange > 0 ? '+' : '';
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
+241 -173
View File
@@ -42,18 +42,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
.page-header__breadcrumb span{color:var(--text-primary);}
/* 计划选择区 */
.plan-selector{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:flex-start;gap:24px;}
.plan-selector__left{flex:1;min-width:0;max-width:400px;}
.plan-selector__label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;font-weight:500;}
.plan-selector__right{flex:1;display:flex;gap:28px;padding:18px 20px;background:#FAFAFA;border-radius:var(--radius-md);border:1px solid var(--border);min-height:78px;align-items:center;}
.plan-selector__right--empty{justify-content:center;color:var(--text-placeholder);font-size:var(--font-sm);}
.plan-info-item{display:flex;flex-direction:column;gap:6px;}
.plan-info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.plan-info-item__value{font-size:var(--font-base);color:var(--text-primary);font-weight:600;}
.plan-info-item__value strong{color:var(--primary);font-size:var(--font-lg);}
/* 搜索下拉 */
/* 搜索下拉 */
.search-select{position:relative;width:100%;}
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 36px 0 12px;font-size:var(--font-sm);outline:none;transition:border-color .2s;box-sizing:border-box;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
.search-select__input:focus{border-color:var(--primary);}
@@ -72,7 +61,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.search-select--selected .search-select__input{background-image:none;padding-right:32px;}
/* 统计卡片 */
.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);padding:14px 20px;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:6px;}
.stat-card__title{font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;}
.stat-card__body{display:flex;align-items:baseline;gap:6px;}
@@ -94,16 +83,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.stat-card__unrecorded--clickable{cursor:pointer;text-decoration:underline;text-underline-offset:2px;}
.stat-card__unrecorded--clickable:hover{color:#FF7875;}
/* 累计卡片(一行三列布局) */
.stat-card--cumulative .stat-card__body{flex-direction:row;justify-content:space-around;gap:0;}
.stat-card--cumulative .stat-card__col{display:flex;flex-direction:column;align-items:center;gap:4px;flex:1;}
.stat-card--cumulative .stat-card__col-label{font-size:var(--font-xs);color:var(--text-secondary);}
.stat-card--cumulative .stat-card__col-value{font-size:20px;font-weight:700;color:var(--primary);}
.stat-card--cumulative .stat-card__col-unit{font-size:var(--font-sm);font-weight:400;color:var(--text-secondary);}
.stat-card__col-value--clickable{cursor:pointer;text-decoration:underline;text-underline-offset:2px;}
.stat-card__col-value--clickable:hover{opacity:0.8;}
/* Tab 切换 */
/* Tab 切换 */
.tab-bar{display:flex;gap:0;padding:0 24px;border-bottom:1px solid var(--border);}
.tab-item{padding:12px 20px;font-size:var(--font-sm);cursor:pointer;color:var(--text-secondary);border-bottom:2px solid transparent;margin-bottom:-1px;transition:all .2s;font-weight:500;}
.tab-item:hover{color:var(--primary);}
@@ -161,38 +141,41 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.table-card__count{font-size:var(--font-sm);color:var(--text-secondary);}
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.table-card__content table{min-width:100%;white-space:nowrap;}
#tab-panel-0 .table-card__content table{min-width:2600px;}
#tab-panel-0 .table-card__content table{min-width:2650px;}
table{width:100%;border-collapse:collapse;}
thead th{background:#FAFAFA;padding:10px 8px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
tbody td{padding:12px 8px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 前列固定(仅表头首行) */
thead tr:first-child th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead tr:first-child th:nth-child(1){z-index:8;background:#FAFAFA;}
thead tr:first-child th:nth-child(2),tbody td:nth-child(2){position:sticky;left:220px;z-index:5;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead tr:first-child th:nth-child(2){z-index:7;background:#FAFAFA;}
thead tr:first-child th:nth-child(3),tbody td:nth-child(3){position:sticky;left:284px;z-index:4;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead tr:first-child th:nth-child(3){z-index:6;background:#FAFAFA;}
/* 前列固定(仅表头首行) */
thead tr:first-child th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:52px;min-width:52px;max-width:52px;}
thead tr:first-child th:nth-child(1){z-index:9;background:#FAFAFA;}
thead tr:first-child th:nth-child(2),tbody td:nth-child(2){position:sticky;left:52px;z-index:5;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead tr:first-child th:nth-child(2){z-index:8;background:#FAFAFA;}
thead tr:first-child th:nth-child(3),tbody td:nth-child(3){position:sticky;left:272px;z-index:4;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead tr:first-child th:nth-child(3){z-index:7;background:#FAFAFA;}
thead tr:first-child th:nth-child(4),tbody td:nth-child(4){position:sticky;left:336px;z-index:3;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead tr:first-child th:nth-child(4){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
tbody tr:hover td:nth-child(3),
tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 每日记录最后三列固定右侧 */
#tab-panel-0 thead th:nth-child(26),
#tab-panel-0 tbody td:nth-child(26){position:sticky;right:136px;z-index:2;background:#fff;}
#tab-panel-0 thead th:nth-child(26){z-index:4;background:#FAFAFA;}
#tab-panel-0 thead th:nth-child(27),
#tab-panel-0 tbody td:nth-child(27){position:sticky;right:68px;z-index:2;background:#fff;}
#tab-panel-0 tbody td:nth-child(27){position:sticky;right:136px;z-index:2;background:#fff;}
#tab-panel-0 thead th:nth-child(27){z-index:4;background:#FAFAFA;}
#tab-panel-0 thead th:nth-child(28),
#tab-panel-0 tbody td:nth-child(28){position:sticky;right:0;z-index:2;background:#fff;}
#tab-panel-0 tbody td:nth-child(28){position:sticky;right:68px;z-index:2;background:#fff;}
#tab-panel-0 thead th:nth-child(28){z-index:4;background:#FAFAFA;}
#tab-panel-0 tbody tr:hover td:nth-child(26),
#tab-panel-0 thead th:nth-child(29),
#tab-panel-0 tbody td:nth-child(29){position:sticky;right:0;z-index:2;background:#fff;}
#tab-panel-0 thead th:nth-child(29){z-index:4;background:#FAFAFA;}
#tab-panel-0 tbody tr:hover td:nth-child(27),
#tab-panel-0 tbody tr:hover td:nth-child(28){background:#F8FBFF;}
#tab-panel-0 tbody td:nth-child(26),
#tab-panel-0 tbody td:nth-child(27){box-shadow:-2px 0 4px rgba(0,0,0,0.04);}
#tab-panel-0 tbody tr:hover td:nth-child(28),
#tab-panel-0 tbody tr:hover td:nth-child(29){background:#F8FBFF;}
#tab-panel-0 tbody td:nth-child(27),
#tab-panel-0 tbody td:nth-child(28){box-shadow:-2px 0 4px rgba(0,0,0,0.04);}
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
/* 标签 */
@@ -244,6 +227,10 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
.record-dialog__title{font-size:var(--font-lg);font-weight:600;}
.record-dialog__close{width:32px;height:32px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:20px;transition:all .15s;}
.record-dialog__close:hover{background:#F5F7FA;color:var(--text-primary);}
/* 弹窗内表格取消全局固定列,避免重叠 */
.record-overlay thead th,.record-overlay tbody td{position:static;width:auto;min-width:0;max-width:none;box-shadow:none;background:#fff;}
.record-overlay thead th{background:#FAFAFA;}
.record-overlay tbody tr:hover td{background:#F8FBFF;}
.record-table{width:100%;border-collapse:collapse;table-layout:auto;}
.record-table th,.record-table td{padding:10px 12px;text-align:center;font-size:var(--font-sm);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
.record-table thead th{background:#FAFAFA;color:var(--text-secondary);font-weight:500;font-size:var(--font-xs);}
@@ -287,7 +274,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
<main class="main">
@@ -297,47 +284,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>行动记录</span></div>
</div>
<!-- [交互] 干预计划选择区 — 搜索下拉选择计划,选中后右侧展示基本信息 -->
<div class="plan-selector">
<div class="plan-selector__left">
<div class="plan-selector__label">干预计划</div>
<div class="search-select" id="planSelect">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<!-- [交互] 点击清空已选计划,恢复未选择状态 -->
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 选中计划后此处展示基本信息;未选中时显示占位提示 -->
<div class="plan-selector__right plan-selector__right--empty" id="planInfoEmpty">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="margin-right:6px;flex-shrink:0;"><circle cx="9" cy="9" r="8" stroke="#999" stroke-width="1.2" stroke-dasharray="3 2"/><path d="M9 5v4M9 11v.5" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
可选择干预计划进行查看
</div>
<div class="plan-selector__right" id="planInfo" style="display:none;">
<div class="plan-info-item">
<span class="plan-info-item__label">组织机构</span>
<span class="plan-info-item__value" id="piOrg">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">起止日期</span>
<span class="plan-info-item__value" id="piDate">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">进行天数</span>
<span class="plan-info-item__value" id="piDays">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">应参加人数</span>
<span class="plan-info-item__value"><strong id="piCount">-</strong></span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">实际参加人数</span>
<span class="plan-info-item__value"><strong id="piActual">-</strong></span>
</div>
</div>
</div>
<!-- [交互] 统计卡片 — 根据筛选的计划范围实时更新 -->
<!-- [交互] 统计卡片 — 根据筛选的计划范围实时更新 -->
<div class="stat-cards" id="statCards">
<div class="stat-card">
<div class="stat-card__title">今日饮食</div>
@@ -359,25 +306,8 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<span class="stat-card__num stat-card__num--blue stat-card__num--clickable" id="weightRecorded" onclick="openWeightRecordedDialog()" title="点击查看已记录员工列表">0</span>
<span class="stat-card__unit">人已记录,未记录 <strong class="stat-card__unrecorded stat-card__unrecorded--clickable" id="weightNo" onclick="openWeightUnrecordedDialog()" title="点击查看未记录员工列表">0</strong></span>
</div>
</div>
<div class="stat-card stat-card--cumulative">
<div class="stat-card__title">活动期间累计</div>
<div class="stat-card__body">
<div class="stat-card__col">
<span class="stat-card__col-label">饮食记录</span>
<span class="stat-card__col-value" onclick="openCumulativeDialog('diet')" style="cursor:pointer;" title="点击查看详情"><span id="cumDiet" class="stat-card__col-value--clickable">-</span> <span class="stat-card__col-unit"></span></span>
</div>
<div class="stat-card__col">
<span class="stat-card__col-label">运动记录</span>
<span class="stat-card__col-value" onclick="openCumulativeDialog('exercise')" style="cursor:pointer;" title="点击查看详情"><span id="cumExercise" class="stat-card__col-value--clickable">-</span> <span class="stat-card__col-unit"></span></span>
</div>
<div class="stat-card__col">
<span class="stat-card__col-label">体重记录</span>
<span class="stat-card__col-value" onclick="openCumulativeDialog('weight')" style="cursor:pointer;" title="点击查看详情"><span id="cumWeight" class="stat-card__col-value--clickable">-</span> <span class="stat-card__col-unit"></span></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 大Tab:员工数据 / 单位数据 -->
<div class="data-tab-bar">
@@ -386,11 +316,19 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
<!-- 员工数据 -->
<div class="data-tab-panel active" data-data-panel="employee" id="dataTabEmployee">
<!-- 筛选栏 — 三测记录 -->
<div class="filter-bar" style="border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);">
<div class="filter-item">
<label>日期范围</label>
<div class="data-tab-panel active" data-data-panel="employee" id="dataTabEmployee">
<!-- 筛选栏 — 三测记录 -->
<div class="filter-bar" style="border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);">
<div class="filter-item">
<label>干预计划</label>
<div class="search-select" id="planSelect" style="width:280px;">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<div class="filter-item">
<label>日期范围</label>
<input class="filter-date" type="date" id="filterDateFrom1">
<span style="font-size:var(--font-xs);color:var(--text-placeholder);"></span>
<input class="filter-date" type="date" id="filterDateTo1">
@@ -508,6 +446,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table id="unitTable">
<thead>
<tr>
<th>序号</th>
<th>单位</th>
<th>总人数</th>
<th>三测人数</th>
@@ -536,7 +475,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<!-- 记录列表 -->
<table class="record-table">
<thead>
<tr><th>序号</th><th>餐次</th><th>摄入时间</th><th>总摄入(千卡)</th><th>数据来源</th></tr>
<tr><th>序号</th><th>记录时间</th><th>餐次</th><th>总摄入(千卡)</th><th>数据来源</th></tr>
</thead>
<tbody id="dietTbody"></tbody>
</table>
@@ -556,7 +495,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<!-- 记录列表 -->
<table class="record-table">
<thead>
<tr><th>序号</th><th>运动类型</th><th>运动数据</th><th>消耗(千卡)</th><th>来源</th></tr>
<tr><th>序号</th><th>记录时间</th><th>运动类型</th><th>运动数据</th><th>消耗(千卡)</th><th>来源</th></tr>
</thead>
<tbody id="exerciseTbody"></tbody>
</table>
@@ -584,6 +523,23 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
</div>
<!-- [弹窗] 打卡记录查看 -->
<div class="record-overlay" id="checkinOverlay">
<div class="record-dialog" id="checkinDialog">
<div class="record-dialog__header">
<span class="record-dialog__title" id="checkinTitle">打卡记录</span>
<button class="record-dialog__close" onclick="closeCheckinDialog()"></button>
</div>
<div class="record-dialog__body">
<div class="record-info" id="checkinInfo"></div>
<table class="record-table">
<thead id="checkinThead"></thead>
<tbody id="checkinTbody"></tbody>
</table>
</div>
</div>
</div>
<!-- [弹窗] 今日饮食未记录员工列表 -->
<div class="record-overlay" id="dietUnrecordedOverlay">
<div class="record-dialog" style="width:960px;">
@@ -641,6 +597,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -710,6 +667,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -785,6 +743,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -859,6 +818,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -911,6 +871,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>单位</th>
<th>部门</th>
<th>姓名</th>
@@ -984,6 +945,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -1053,6 +1015,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<table class="record-table" style="width:100%;">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -1237,36 +1200,27 @@ function showPlanPanel(){
}
function selectPlan(planId){
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
document.getElementById('planInfoEmpty').style.display = 'none';
document.getElementById('planInfo').style.display = 'flex';
document.getElementById('piOrg').textContent = plan.org;
document.getElementById('piDate').textContent = plan.dateFrom + ' ~ ' + plan.dateTo;
document.getElementById('piDays').textContent = calcPlanDays(plan.dateFrom, plan.dateTo) + ' 天';
document.getElementById('piCount').textContent = plan.totalCount + ' 人';
document.getElementById('piActual').textContent = (plan.actualCount || 0) + ' 人';
applyFilter();
updateStatCards();
}
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
applyFilter();
updateStatCards();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planInfoEmpty').style.display = '';
document.getElementById('planInfo').style.display = 'none';
applyFilter();
updateStatCards();
}
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
applyFilter();
updateStatCards();
}
/* ===== Tab 切换 ===== */
function switchTab(idx){
@@ -1529,12 +1483,13 @@ function renderUnitTable(){
var tbody = document.getElementById('unitTableBody');
document.getElementById('unitCount').textContent = '共 ' + unitFilteredData.length + ' 个单位';
if(unitFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="4" class="td-empty">暂无匹配数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="5" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
unitFilteredData.forEach(function(d){
unitFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+d.total+'</td>';
html += '<td>'+d.measured+'</td>';
@@ -1561,12 +1516,9 @@ function updateStatCards(){
document.getElementById('dietNo').textContent = dietNo;
document.getElementById('exerciseRecorded').textContent = exerciseYes;
document.getElementById('exerciseNo').textContent = exerciseNo;
document.getElementById('weightRecorded').textContent = weightYes;
document.getElementById('weightNo').textContent = weightNo;
document.getElementById('cumDiet').textContent = selectedPlanId ? dietYes : '-';
document.getElementById('cumExercise').textContent = selectedPlanId ? exerciseYes : '-';
document.getElementById('cumWeight').textContent = selectedPlanId ? weightYes : '-';
}
document.getElementById('weightRecorded').textContent = weightYes;
document.getElementById('weightNo').textContent = weightNo;
}
/* ===== 渲染每日记录表格 ===== */
function renderDailyTable(){
@@ -1581,7 +1533,7 @@ function renderDailyTable(){
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
@@ -1591,6 +1543,7 @@ function renderDailyTable(){
var fcSign = d.fatChange > 0 ? '+' : '';
var wacSign = d.waistChange > 0 ? '+' : '';
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -1632,6 +1585,7 @@ function renderOverviewHeader(){
var html = '';
if(currentSubTab === 'weight'){
html += '<tr>';
html += '<th rowspan="2">序号</th>';
html += '<th rowspan="2">干预计划</th>';
html += '<th rowspan="2">姓名</th>';
html += '<th rowspan="2">员工编号</th>';
@@ -1655,6 +1609,7 @@ function renderOverviewHeader(){
html += '</tr>';
} else {
html += '<tr>';
html += '<th>序号</th>';
html += '<th>干预计划</th>';
html += '<th>姓名</th>';
html += '<th>员工编号</th>';
@@ -1680,14 +1635,15 @@ function renderOverviewTable(){
document.getElementById('pageInfo1').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum1').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
var isWeight = currentSubTab === 'weight';
var colCount = isWeight ? 17 : 11;
var colCount = isWeight ? 18 : 12;
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="'+colCount+'" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -1695,7 +1651,7 @@ function renderOverviewTable(){
html += '<td>'+d.age+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+esc(d.dept)+'</td>';
html += '<td>'+d.checkinCount+'</td>';
html += '<td><a class="link" href="javascript:void(0)" onclick="openCheckinDialog(\''+esc(d.empId)+'\',\''+esc(d.name)+'\',\''+esc(d.org)+'\',\''+esc(d.dept)+'\')">'+d.checkinCount+'</a></td>';
html += '<td>'+d.checkinDays+'</td>';
html += '<td>'+esc(d.firstDate)+'</td>';
html += '<td>'+esc(d.lastDate)+'</td>';
@@ -1807,8 +1763,8 @@ function openDietDialog(empId, name, date){
var kcal = (Math.floor(Math.random()*6)+3)*100 + Math.floor(Math.random()*50);
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+meals[i % meals.length]+'</td>';
html += '<td>'+date+' '+times[i % times.length]+'</td>';
html += '<td>'+meals[i % meals.length]+'</td>';
html += '<td>'+kcal+'</td>';
html += '<td>'+sources[Math.floor(Math.random()*2)]+'</td>';
html += '</tr>';
@@ -1838,24 +1794,30 @@ function openExerciseDialog(empId, name, date){
document.getElementById('exerciseInfo').innerHTML = infoHtml;
// 模拟运动记录列表
var sportTypes = ['跑步','健走','骑行','游泳','健身','瑜伽','跳绳','羽毛球','篮球','爬山'];
// 根据来源匹配运动数据:微信→步数,穿戴→心率/距离,自记→自定义,器械→组次/时长
var dataBySource = {
'微信': ['8,523步','12,100步','6,850步','15,200步','10,030步','9,450步','7,800步','11,600步'],
'自记': ['45分钟','45分钟','45分钟','45分钟','45分钟','45分钟'],
'穿戴': ['45分钟','45分钟','45分钟','45分钟','45分钟'],
'器械': ['45分钟','45分钟','45分钟','45分钟','60分钟']
};
var sources = ['微信','自记','穿戴','器械'];
var rows = Math.floor(Math.random()*4)+2;
var html = '';
for(var i=0;i<rows;i++){
var type = sportTypes[i % sportTypes.length];
var source = sources[i % sources.length];
var dataArr = dataBySource[source];
var sportData = dataArr[Math.floor(Math.random()*dataArr.length)];
var kcal = (Math.floor(Math.random()*8)+2)*100 + Math.floor(Math.random()*50);
// 步行/健走 → 步数,其他 → 分钟
var sportData;
if(type === '健走' || type === '步行'){
var steps = [8523,12100,6850,15200,10030,9450,7800,11600];
sportData = steps[Math.floor(Math.random()*steps.length)].toLocaleString()+'步';
} else {
var mins = [30,35,45,50,60,75,90];
sportData = mins[Math.floor(Math.random()*mins.length)]+'分钟';
}
var d2 = new Date(); d2.setDate(d2.getDate() - i);
var dateStr2 = d2.getFullYear()+'-'+('0'+(d2.getMonth()+1)).slice(-2)+'-'+('0'+d2.getDate()).slice(-2);
var timeHour2 = 6 + Math.floor(Math.random()*16);
var timeStr2 = dateStr2+' '+('0'+timeHour2).slice(-2)+':'+('0'+Math.floor(Math.random()*60)).slice(-2);
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+sportTypes[i % sportTypes.length]+'</td>';
html += '<td>'+timeStr2+'</td>';
html += '<td>'+type+'</td>';
html += '<td>'+sportData+'</td>';
html += '<td>'+kcal+'</td>';
html += '<td>'+source+'</td>';
@@ -1924,6 +1886,105 @@ document.getElementById('weightOverlay').addEventListener('click',function(e){
if(e.target === this) closeWeightDialog();
});
/* ===== 打卡记录弹窗 ===== */
function openCheckinDialog(empId, name, org, dept){
var emp = baseEmployees.find(function(e){return e.empId === empId;}) || {};
// 基本信息卡片
var infoHtml = '';
infoHtml += '<div class="record-info__item"><span class="record-info__label">姓名:</span><span class="record-info__value">'+esc(name)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">员工编号:</span><span class="record-info__value">'+esc(empId)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">单位:</span><span class="record-info__value">'+esc(org)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">部门:</span><span class="record-info__value">'+esc(dept)+'</span></div>';
document.getElementById('checkinInfo').innerHTML = infoHtml;
var type = currentSubTab;
var titleMap = {weight:'体重打卡记录', diet:'饮食打卡记录', exercise:'运动打卡记录'};
document.getElementById('checkinTitle').textContent = titleMap[type] || '打卡记录';
// 根据类型调整弹窗宽度和表头
var dialog = document.getElementById('checkinDialog');
var thead = document.getElementById('checkinThead');
var tbody = document.getElementById('checkinTbody');
if(type === 'weight'){
dialog.style.width = '860px';
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>数据来源</th></tr>';
var sources = ['自记','身高称','蓝牙称','体脂仪'];
var baseW = emp.weight || 80;
var baseBmi = emp.bmi || 28.0;
var baseFat = emp.fat || 30.0;
var baseWaist = emp.waist || 95;
var rows = Math.floor(Math.random()*4)+3;
var html = '';
for(var i=0;i<rows;i++){
var source = sources[i % sources.length];
var d = new Date(); d.setDate(d.getDate() - i);
var dateStr = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var timeHour = 7 + Math.floor(Math.random()*15);
var timeMin = Math.floor(Math.random()*60);
var timeStr = dateStr+' '+('0'+timeHour).slice(-2)+':'+('0'+timeMin).slice(-2);
var w = (baseW - (i*0.3) + (Math.random()-0.5)*1.0).toFixed(1);
var bmi = (w / ((emp.height||170)/100 * (emp.height||170)/100)).toFixed(1);
var fat = source==='身高称'||source==='蓝牙称' ? '-' : (baseFat - i*0.5 + (Math.random()-0.5)*0.8).toFixed(1);
var waist = source==='蓝牙称'||source==='自记' ? '-' : Math.round(baseWaist - i*1.5 + (Math.random()-0.5)*2);
html += '<tr><td>'+(i+1)+'</td><td>'+timeStr+'</td><td>'+w+'</td><td>'+bmi+'</td><td>'+fat+'</td><td>'+(waist==='-'?'-':waist)+'</td><td>'+source+'</td></tr>';
}
tbody.innerHTML = html;
} else if(type === 'diet'){
dialog.style.width = '760px';
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>餐次</th><th>总摄入(千卡)</th><th>数据来源</th></tr>';
var meals = ['早餐','午餐','晚餐','加餐'];
var times = ['07:30','08:15','12:00','12:30','18:00','18:45','15:30','10:00'];
var srcs = ['智记','自记'];
var rows = Math.floor(Math.random()*5)+3;
var html = '';
for(var i=0;i<rows;i++){
var d = new Date(); d.setDate(d.getDate() - Math.floor(i/2));
var dateStr = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var kcal = (Math.floor(Math.random()*6)+3)*100 + Math.floor(Math.random()*50);
html += '<tr><td>'+(i+1)+'</td><td>'+dateStr+' '+times[i%8]+'</td><td>'+meals[i%4]+'</td><td>'+kcal+'</td><td>'+srcs[i%2]+'</td></tr>';
}
tbody.innerHTML = html;
} else {
dialog.style.width = '900px';
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>运动类型</th><th>运动数据</th><th>消耗(千卡)</th><th>来源</th></tr>';
var sportTypes = ['跑步','健走','骑行','游泳','健身','瑜伽','跳绳','羽毛球','篮球','爬山'];
var sources = ['微信','自记','穿戴','器械'];
var rows = Math.floor(Math.random()*4)+3;
var html = '';
for(var i=0;i<rows;i++){
var type = sportTypes[i % sportTypes.length];
var source = sources[i % sources.length];
var d = new Date(); d.setDate(d.getDate() - i);
var dateStr = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var timeHour = 6 + Math.floor(Math.random()*16);
var timeMin = Math.floor(Math.random()*60);
var timeStr = dateStr+' '+('0'+timeHour).slice(-2)+':'+('0'+timeMin).slice(-2);
var kcal = (Math.floor(Math.random()*8)+2)*100 + Math.floor(Math.random()*50);
// 步行/健走 → 步数,其他 → 分钟
var data;
if(type === '健走' || type === '步行'){
var steps = [8523,12100,6850,15200,10030,9450,7800,11600];
data = steps[Math.floor(Math.random()*steps.length)].toLocaleString()+'步';
} else {
var mins = [30,35,45,50,60,75,90];
data = mins[Math.floor(Math.random()*mins.length)]+'分钟';
}
html += '<tr><td>'+(i+1)+'</td><td>'+timeStr+'</td><td>'+type+'</td><td>'+data+'</td><td>'+kcal+'</td><td>'+source+'</td></tr>';
}
tbody.innerHTML = html;
}
document.getElementById('checkinOverlay').classList.add('show');
}
function closeCheckinDialog(){
document.getElementById('checkinOverlay').classList.remove('show');
}
document.getElementById('checkinOverlay').addEventListener('click',function(e){
if(e.target === this) closeCheckinDialog();
});
/* ===== 今日饮食未记录弹窗 ===== */
var dietUnrecAllData = [];
var dietUnrecFilteredData = [];
@@ -2026,12 +2087,13 @@ function renderDietUnrecTable(){
var tbody = document.getElementById('dietUnrecTbody');
document.getElementById('dietUnrecCount').textContent = '共 ' + dietUnrecFilteredData.length + ' 人未记录';
if(dietUnrecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无未记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="8" class="td-empty">暂无未记录员工</td></tr>';
return;
}
var html = '';
dietUnrecFilteredData.forEach(function(d){
dietUnrecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -2158,12 +2220,13 @@ function renderDietRecTable(){
var tbody = document.getElementById('dietRecTbody');
document.getElementById('dietRecCount').textContent = '共 ' + dietRecFilteredData.length + ' 人已记录';
if(dietRecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="13" class="td-empty">暂无已记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="14" class="td-empty">暂无已记录员工</td></tr>';
return;
}
var html = '';
dietRecFilteredData.forEach(function(d){
dietRecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -2298,12 +2361,13 @@ function renderExRecTable(){
var tbody = document.getElementById('exRecTbody');
document.getElementById('exRecCount').textContent = '共 ' + exRecFilteredData.length + ' 人已记录';
if(exRecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="12" class="td-empty">暂无已记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="13" class="td-empty">暂无已记录员工</td></tr>';
return;
}
var html = '';
exRecFilteredData.forEach(function(d){
exRecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -2429,12 +2493,13 @@ function renderWtRecTable(){
var tbody = document.getElementById('wtRecTbody');
document.getElementById('wtRecCount').textContent = '共 ' + wtRecFilteredData.length + ' 人已记录';
if(wtRecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="14" class="td-empty">暂无已记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="15" class="td-empty">暂无已记录员工</td></tr>';
return;
}
var html = '';
wtRecFilteredData.forEach(function(d){
wtRecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -2528,13 +2593,14 @@ function renderCumTable(){
var count = cumAllData.length;
document.getElementById('cumTableCount').textContent = '共 ' + count + ' 人';
if(count === 0){
tbody.innerHTML = '<tr><td colspan="11" class="td-empty">暂无数据,请先选择干预计划</td></tr>';
tbody.innerHTML = '<tr><td colspan="12" class="td-empty">暂无数据,请先选择干预计划</td></tr>';
return;
}
var html = '';
var dayField = cumCurrentTab === 'diet' ? 'dietDays' : (cumCurrentTab === 'exercise' ? 'exerciseDays' : 'weightDays');
cumAllData.forEach(function(d){
cumAllData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+esc(d.dept)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
@@ -2649,12 +2715,13 @@ function renderExUnrecTable(){
var tbody = document.getElementById('exUnrecTbody');
document.getElementById('exUnrecCount').textContent = '共 ' + exUnrecFilteredData.length + ' 人未记录';
if(exUnrecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无未记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="8" class="td-empty">暂无未记录员工</td></tr>';
return;
}
var html = '';
exUnrecFilteredData.forEach(function(d){
exUnrecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -2765,12 +2832,13 @@ function renderWtUnrecTable(){
var tbody = document.getElementById('wtUnrecTbody');
document.getElementById('wtUnrecCount').textContent = '共 ' + wtUnrecFilteredData.length + ' 人未记录';
if(wtUnrecFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无未记录员工</td></tr>';
tbody.innerHTML = '<tr><td colspan="8" class="td-empty">暂无未记录员工</td></tr>';
return;
}
var html = '';
wtUnrecFilteredData.forEach(function(d){
wtUnrecFilteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
@@ -43,17 +43,6 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
.page-header__breadcrumb span{color:var(--text-primary);}
/* 计划选择区 */
.plan-selector{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:flex-start;gap:24px;}
.plan-selector__left{flex:1;min-width:0;max-width:400px;}
.plan-selector__label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;font-weight:500;}
.plan-selector__right{flex:1;display:flex;gap:28px;padding:18px 20px;background:#FAFAFA;border-radius:var(--radius-md);border:1px solid var(--border);min-height:78px;align-items:center;}
.plan-selector__right--empty{justify-content:center;color:var(--text-placeholder);font-size:var(--font-sm);}
.plan-info-item{display:flex;flex-direction:column;gap:6px;}
.plan-info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.plan-info-item__value{font-size:var(--font-base);color:var(--text-primary);font-weight:600;}
.plan-info-item__value strong{color:var(--primary);font-size:var(--font-lg);}
/* 搜索下拉 */
.search-select{position:relative;width:100%;}
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 36px 0 12px;font-size:var(--font-sm);outline:none;transition:border-color .2s;box-sizing:border-box;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
@@ -119,15 +108,15 @@ tbody td{padding:10px 8px;text-align:center;font-size:var(--font-sm);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 第列(干预计划)固定左侧 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:4;background:#fff;min-width:240px;max-width:240px;text-align:left;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
/* 第列(单位)固定左侧 */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:240px;z-index:3;background:#fff;min-width:120px;max-width:120px;}
thead th:nth-child(2){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 第列(干预计划)固定左侧 */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:4;background:#fff;min-width:240px;max-width:240px;text-align:left;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 第列(组织机构)固定左侧 */
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:240px;z-index:3;background:#fff;min-width:120px;max-width:120px;}
thead th:nth-child(3){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
@@ -176,7 +165,7 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item active">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
@@ -187,49 +176,18 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>活动统计</span></div>
</div>
<!-- [交互] 干预计划选择区 — 搜索下拉选择计划,选中后右侧展示基本信息 -->
<div class="plan-selector">
<div class="plan-selector__left">
<div class="plan-selector__label">干预计划</div>
<div class="search-select" id="planSelect">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<!-- [交互] 点击清空已选计划,恢复未选择状态 -->
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 选中计划后此处展示基本信息;未选中时显示占位提示 -->
<div class="plan-selector__right plan-selector__right--empty" id="planInfoEmpty">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="margin-right:6px;flex-shrink:0;"><circle cx="9" cy="9" r="8" stroke="#999" stroke-width="1.2" stroke-dasharray="3 2"/><path d="M9 5v4M9 11v.5" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
可选择干预计划进行查看
</div>
<div class="plan-selector__right" id="planInfo" style="display:none;">
<div class="plan-info-item">
<span class="plan-info-item__label">组织机构</span>
<span class="plan-info-item__value" id="piOrg">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">起止日期</span>
<span class="plan-info-item__value" id="piDate">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">进行天数</span>
<span class="plan-info-item__value" id="piDays">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">应参加人数</span>
<span class="plan-info-item__value"><strong id="piCount">-</strong></span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">实际参加人数</span>
<span class="plan-info-item__value"><strong id="piActual">-</strong></span>
</div>
</div>
</div>
<!-- [交互] 筛选栏 — 单位多选 -->
<div class="filter-bar">
<!-- [交互] 多选下拉:勾选单位,支持全选/清空 -->
<!-- [交互] 筛选栏 — 干预计划、单位多选 -->
<div class="filter-bar">
<!-- [交互] 干预计划下拉搜索 -->
<div class="filter-item">
<label>干预计划</label>
<div class="search-select" id="planSelect" style="width:280px;">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 多选下拉:勾选单位,支持全选/清空 -->
<div class="filter-item">
<label>单位</label>
<div class="unit-multi-select" id="unitMultiWrap">
@@ -281,6 +239,7 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
<table>
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>组织机构</th>
<th>起止日期</th>
@@ -461,34 +420,25 @@ function showPlanPanel(){
}
function selectPlan(planId){
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
document.getElementById('planInfoEmpty').style.display = 'none';
document.getElementById('planInfo').style.display = 'flex';
document.getElementById('piOrg').textContent = plan.org;
document.getElementById('piDate').textContent = plan.dateFrom + ' ~ ' + plan.dateTo;
document.getElementById('piDays').textContent = calcPlanDaysNum(plan.dateFrom, plan.dateTo) + ' 天';
document.getElementById('piCount').textContent = plan.totalCount + ' 人';
document.getElementById('piActual').textContent = (plan.actualCount || 0) + ' 人';
applyFilter();
}
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
applyFilter();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planInfoEmpty').style.display = '';
document.getElementById('planInfo').style.display = 'none';
applyFilter();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
applyFilter();
}
/* ===== 单位多选 ===== */
function toggleUnitMulti(){
@@ -580,16 +530,17 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="18" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="19" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var lossCls = d.avgWeightLoss < 0 ? 'change-up' : (d.avgWeightLoss > 0 ? 'change-down' : 'change-zero');
var bmiCls = d.avgBmiDrop < 0 ? 'change-up' : (d.avgBmiDrop > 0 ? 'change-down' : 'change-zero');
var lossSign = d.avgWeightLoss > 0 ? '-' : (d.avgWeightLoss < 0 ? '+' : '');
var bmiSign = d.avgBmiDrop > 0 ? '-' : (d.avgBmiDrop < 0 ? '+' : '');
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.unit)+'</td>';
html += '<td>'+d.dateFrom+' ~ '+d.dateTo+'</td>';
@@ -79,10 +79,10 @@ tbody td{padding:10px 7px;text-align:center;font-size:var(--font-sm);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 第列(姓名)固定左侧 — 仅第一行表头(避免rowspan第二行误匹配) */
thead tr:first-child th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:2px 0 6px rgba(0,0,0,0.08);}
thead tr:first-child th:nth-child(1){z-index:8;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
/* 第列(姓名)固定左侧 — 仅第一行表头(避免rowspan第二行误匹配) */
thead tr:first-child th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:2px 0 6px rgba(0,0,0,0.08);}
thead tr:first-child th:nth-child(2){z-index:8;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 最后一列(详细数据)固定右侧 — 仅第一行表头(避免rowspan第二行误匹配到"变化"列) */
thead tr:first-child th:last-child,tbody td:last-child{position:sticky;right:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:-2px 0 6px rgba(0,0,0,0.08);}
@@ -223,6 +223,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<table>
<thead>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">姓名</th>
<th rowspan="2">员工编号</th>
<th rowspan="2">性别</th>
@@ -406,16 +407,17 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="22" class="td-empty">暂无匹配数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="23" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var wCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
var waCls = d.waistChange < 0 ? 'change-down' : (d.waistChange > 0 ? 'change-up' : 'change-zero');
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
@@ -199,7 +199,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>餐次</th><th>摄入热量(千卡)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>餐次</th><th>摄入热量(千卡)</th><th>来源</th></tr>
</thead>
<tbody id="dietBody"></tbody>
</table>
@@ -217,7 +217,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>运动类型</th><th>运动时长/数据</th><th>消耗热量(千卡)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>运动类型</th><th>运动时长/数据</th><th>消耗热量(千卡)</th><th>来源</th></tr>
</thead>
<tbody id="sportBody"></tbody>
</table>
@@ -235,7 +235,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>来源</th></tr>
</thead>
<tbody id="weightBody"></tbody>
</table>
@@ -400,15 +400,16 @@ function renderDiet(){
document.getElementById('dietPageNum').textContent = '第 ' + (dietPage + 1) + '/' + totalPages + ' 页';
var srcTag = {智记:'tag-green',自记:'tag-gray'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.meal+'</td>';
html += '<td>'+d.calories+'</td>';
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="4" style="text-align:center;padding:48px 0;color:#999;">暂无饮食记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="5" style="text-align:center;padding:48px 0;color:#999;">暂无饮食记录</td></tr>';
}
function dietGoPage(delta){
@@ -431,8 +432,9 @@ function renderSport(){
document.getElementById('sportPageNum').textContent = '第 ' + (sportPage + 1) + '/' + totalPages + ' 页';
var srcTag = {穿戴:'tag-blue',微信:'tag-green',自记:'tag-gray',器械:'tag-orange'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.type+'</td>';
html += '<td>'+d.data+'</td>';
@@ -440,7 +442,7 @@ function renderSport(){
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="5" style="text-align:center;padding:48px 0;color:#999;">暂无运动记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="6" style="text-align:center;padding:48px 0;color:#999;">暂无运动记录</td></tr>';
}
function sportGoPage(delta){
@@ -463,8 +465,9 @@ function renderWeight(){
document.getElementById('weightPageNum').textContent = '第 ' + (weightPage + 1) + '/' + totalPages + ' 页';
var srcTag = {身高秤:'tag-blue',体脂仪:'tag-orange',蓝牙称:'tag-green',自记:'tag-gray'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.weight.toFixed(1)+'</td>';
html += '<td>'+d.bmi.toFixed(1)+'</td>';
@@ -473,7 +476,7 @@ function renderWeight(){
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="6" style="text-align:center;padding:48px 0;color:#999;">暂无体重记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="7" style="text-align:center;padding:48px 0;color:#999;">暂无体重记录</td></tr>';
}
function weightGoPage(delta){
@@ -252,6 +252,7 @@ tbody tr:hover{background:#F8FBFF;}
<table>
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>组织机构</th>
<th>组织部门</th>
@@ -424,13 +425,14 @@ function renderTable() {
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if (filteredActivities.length === 0) {
tbody.innerHTML = '<tr><td colspan="20" class="td-empty">暂无活动数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="21" class="td-empty">暂无活动数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d) {
pageData.forEach(function(d,i) {
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td><a class="link" href="history-plan-detail.html?id=' + d.id + '">' + esc(d.planName) + '</a></td>';
html += '<td>' + esc(d.unit) + '</td>';
html += '<td>' + esc(d.dept) + '</td>';
@@ -83,13 +83,14 @@
.member-table{width:100%;border-collapse:collapse;table-layout:fixed;}
.member-table thead th{background:#FAFAFA;padding:10px 8px;text-align:left;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
.member-table tbody td{padding:10px 8px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.member-table th:nth-child(1){width:60px;}
.member-table th:nth-child(2){width:180px;}
.member-table th:nth-child(3){width:44px;}
.member-table th:nth-child(1){width:40px;}
.member-table th:nth-child(2){width:60px;}
.member-table th:nth-child(3){width:180px;}
.member-table th:nth-child(4){width:44px;}
.member-table th:nth-child(5){width:60px;}
.member-table th:nth-child(6){width:120px;}
.member-table th:nth-child(7){width:90px;}
.member-table th:nth-child(5){width:44px;}
.member-table th:nth-child(6){width:60px;}
.member-table th:nth-child(7){width:120px;}
.member-table th:nth-child(8){width:90px;}
.member-table tbody tr:last-child td{border-bottom:none;}
.tag-blue{background:var(--primary-light);color:var(--primary);display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
/* 添加成员按钮 */
@@ -200,14 +201,14 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>BT-2024-001</td><td>蓝牙称A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(0)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>BT-2024-002</td><td>蓝牙称A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(1)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>BT-2024-003</td><td>蓝牙称B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(2)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>BT-2024-004</td><td>蓝牙称B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(3)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>BT-2024-005</td><td>蓝牙称C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(4)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
<thead><tr><th>序号</th><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>1</td><td>BT-2024-001</td><td>蓝牙称A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(0)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>2</td><td>BT-2024-002</td><td>蓝牙称A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(1)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>3</td><td>BT-2024-003</td><td>蓝牙称B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(2)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>4</td><td>BT-2024-004</td><td>蓝牙称B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(3)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>5</td><td>BT-2024-005</td><td>蓝牙称C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link" onclick="openMemberModal(4)">成员管理</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -266,11 +267,11 @@
// 存储当前设备索引,供添加成员时使用
document.getElementById('memberModal').setAttribute('data-device-idx', idx);
var tbody = document.getElementById('memberTbody');
tbody.innerHTML = members.map(function(m) {
tbody.innerHTML = members.map(function(m,i) {
var tagHtml = m.isCQ ? '<span class="tag-blue">是</span>' : '<span style="color:#999">否</span>';
var empHtml = m.isCQ ? m.empNo : '-';
var syncHtml = m.synced ? '<span class="tag tag-green">是</span>' : '<span class="tag tag-orange">否</span>';
return '<tr><td>'+m.name+'</td><td>'+m.idCard+'</td><td>'+m.gender+'</td><td>'+m.age+'</td><td>'+m.height+' cm</td><td>'+tagHtml+'</td><td>'+empHtml+'</td><td>'+syncHtml+'</td></tr>';
return '<tr><td>'+(i+1)+'</td><td>'+m.name+'</td><td>'+m.idCard+'</td><td>'+m.gender+'</td><td>'+m.age+'</td><td>'+m.height+' cm</td><td>'+tagHtml+'</td><td>'+empHtml+'</td><td>'+syncHtml+'</td></tr>';
}).join('');
document.getElementById('memberModal').classList.add('active');
}
@@ -388,7 +389,7 @@
<button class="btn btn-primary" onclick="openAddMemberModal()">+ 添加成员</button>
</div>
<table class="member-table">
<thead><tr><th>姓名</th><th>身份证</th><th>性别</th><th>年龄</th><th>身高</th><th>是否为CQ员工</th><th>员工编号</th><th>同步设备</th></tr></thead>
<thead><tr><th>序号</th><th>姓名</th><th>身份证</th><th>性别</th><th>年龄</th><th>身高</th><th>是否为CQ员工</th><th>员工编号</th><th>同步设备</th></tr></thead>
<tbody id="memberTbody"></tbody>
</table>
</div>
@@ -182,15 +182,15 @@
<table>
<thead>
<tr>
<th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th colspan="6">监测数据</th><th rowspan="2">更多信息</th>
</tr>
<tr><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th></tr>
</thead>
<tbody>
<tr><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
<tr><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
<tr><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
<tr><td>1</td><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
<tr><td>2</td><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
<tr><td>3</td><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0"},"水分与蛋白质":{"体水分量(kg)":"-","体水分率(%)":"-","蛋白质量(kg)":"-","蛋白质率(%)":"-"},"肌肉与骨骼":{"体肌肉量(kg)":"-","体肌肉率(%)":"-","体骨骼量(kg)":"-"},"脂肪分析":{"皮下脂肪量(kg)":"-","皮下脂肪率(%)":"-","除脂肪量(kg)":"-"},"细胞液":{"细胞外液量(L)":"-","细胞外液率(%)":"-","细胞内液量(L)":"-","细胞内液率(%)":"-"},"其他":{"矿物质量(kg)":"-"}}'>查看</a></td></tr>
</tbody>
</table>
</div>
@@ -212,6 +212,32 @@
function toggleSubgroup(h){var p=h.parentElement;var sidebar=p.closest("aside");if(sidebar)sidebar.querySelectorAll(".sidebar-subgroup.open").forEach(function(g){if(g!==p)g.classList.remove("open");});p.classList.toggle("open");}
(function(){var a=document.querySelector('.sidebar-item.active');if(!a)return;var sidebar=document.querySelector('aside');if(sidebar)sidebar.querySelectorAll('.sidebar-subgroup.open').forEach(function(g){g.classList.remove('open');});var s=a.closest('.sidebar-subgroup');if(s)s.classList.add('open');})();
function closeDialog(){document.getElementById('dialogMask').classList.remove('show');}
/* 根据URL参数period设置日期筛选 */
(function(){
var params = new URLSearchParams(location.search);
var period = params.get('period');
if(!period) return;
function fd(d){ return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2); }
var today = new Date();
var dateFrom = '', dateTo = '';
if(period === 'week'){
var day = today.getDay() || 7;
var monday = new Date(today); monday.setDate(today.getDate() - day + 1);
var sunday = new Date(today); sunday.setDate(today.getDate() - day + 7);
dateFrom = fd(monday); dateTo = fd(sunday);
} else if(period === 'month'){
dateFrom = fd(new Date(today.getFullYear(), today.getMonth(), 1));
dateTo = fd(new Date(today.getFullYear(), today.getMonth() + 1, 0));
} else if(period === 'year'){
dateFrom = today.getFullYear()+'-01-01';
dateTo = today.getFullYear()+'-12-31';
}
if(dateFrom){
var inputs = document.querySelectorAll('.filter-input[type="date"]');
if(inputs.length >= 2){ inputs[0].value = dateFrom; inputs[1].value = dateTo; }
}
})();
(function(){
var mask=document.getElementById('dialogMask');
var body=document.getElementById('dialogBody');
@@ -136,17 +136,17 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr>
<th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>蓝牙体脂称A01</td><td>BT-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td>48</td><td>205</td><td>1,180</td><td>3,210</td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>蓝牙体脂称A02</td><td>BT-2024-002</td><td>采油一厂</td><td>健身房</td><td>72</td><td>312</td><td>1,860</td><td>4,580</td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>蓝牙体脂称B01</td><td>BT-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td>35</td><td>156</td><td>890</td><td>1,920</td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>蓝牙体脂称B02</td><td>BT-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td>28</td><td>128</td><td>760</td><td>1,650</td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>蓝牙体脂称C01</td><td>BT-2024-005</td><td>采气厂</td><td>综合楼1层</td><td>58</td><td>245</td><td>1,420</td><td>3,560</td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
</tbody>
<thead><tr>
<th>序号</th><th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>1</td><td>蓝牙体脂称A01</td><td>BT-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td><a class="link" href="bluetooth-monitor-detail.html?period=week">48</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=month">205</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=year">1,180</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=all">3,210</a></td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>2</td><td>蓝牙体脂称A02</td><td>BT-2024-002</td><td>采油一厂</td><td>健身房</td><td><a class="link" href="bluetooth-monitor-detail.html?period=week">72</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=month">312</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=year">1,860</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=all">4,580</a></td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>3</td><td>蓝牙体脂称B01</td><td>BT-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td><a class="link" href="bluetooth-monitor-detail.html?period=week">35</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=month">156</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=year">890</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=all">1,920</a></td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>4</td><td>蓝牙体脂称B02</td><td>BT-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td><a class="link" href="bluetooth-monitor-detail.html?period=week">28</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=month">128</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=year">760</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=all">1,650</a></td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
<tr><td>5</td><td>蓝牙体脂称C01</td><td>BT-2024-005</td><td>采气厂</td><td>综合楼1层</td><td><a class="link" href="bluetooth-monitor-detail.html?period=week">58</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=month">245</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=year">1,420</a></td><td><a class="link" href="bluetooth-monitor-detail.html?period=all">3,560</a></td><td><a class="link" href="bluetooth-monitor-detail.html">数据明细</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
+243 -102
View File
@@ -82,6 +82,31 @@
.sort-icon .arrow-down{border-top:5px solid #ccc;}
.sortable.asc .sort-icon .arrow-up{border-bottom-color:var(--primary);}
.sortable.desc .sort-icon .arrow-down{border-top-color:var(--primary);}
/* 多选下拉 */
.multi-select{position:relative;display:inline-block;}
.multi-select__trigger{height:32px;min-width:150px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 10px;font-size:var(--font-xs);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;white-space:nowrap;overflow:hidden;}
.multi-select__panel{display:none;position:absolute;top:36px;left:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);min-width:160px;padding:4px 0;max-height:240px;overflow-y:auto;}
.multi-select__panel.open{display:block;}
.multi-select__item{display:flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--font-sm);cursor:pointer;white-space:nowrap;}
.multi-select__item:hover{background:#F5F7FA;}
.multi-select__item input[type="checkbox"]{accent-color:var(--primary);}
/* 弹窗 */
.record-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.45);z-index:1000;align-items:center;justify-content:center;}
.record-overlay.show{display:flex;}
.record-dialog{background:#fff;border-radius:var(--radius-lg);box-shadow:0 8px 40px rgba(0,0,0,0.18);width:900px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;}
.record-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
.record-dialog__title{font-size:var(--font-lg);font-weight:600;}
.record-dialog__close{width:32px;height:32px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:20px;transition:all .15s;}
.record-dialog__close:hover{background:#F5F7FA;color:var(--text-primary);}
.record-dialog__body{padding:24px;overflow-y:auto;flex:1;min-height:0;}
.record-info{display:flex;gap:24px;padding:14px 20px;background:#FAFAFA;border-radius:var(--radius-md);margin-bottom:16px;font-size:var(--font-sm);flex-wrap:wrap;}
.record-info__item{display:flex;gap:4px;}
.record-info__label{color:var(--text-secondary);}
.record-info__value{color:var(--text-primary);font-weight:500;}
.record-table{width:100%;border-collapse:collapse;table-layout:auto;}
.record-table th,.record-table td{padding:8px 12px;text-align:center;font-size:var(--font-sm);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
.record-table thead th{background:#FAFAFA;color:var(--text-secondary);font-weight:500;font-size:var(--font-xs);}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
</style>
</head>
<body>
@@ -150,23 +175,22 @@
<!-- 二级单位筛选栏 -->
<div class="filter-bar" id="filter-level2">
<div class="filter-item">
<label>年份</label>
<select class="filter-select" style="min-width:100px;">
<option>2026</option>
<option>2025</option>
<option>2024</option>
</select>
<label>日期范围</label>
<input class="filter-input" type="date" id="filterDateFrom" style="min-width:130px;"> ~ <input class="filter-input" type="date" id="filterDateTo" style="min-width:130px;">
</div>
<div class="filter-item">
<label>所属单位</label>
<select class="filter-select" style="min-width:150px;">
<option>全部</option>
<option>采油一厂</option>
<option>采油二厂</option>
<option>采气一厂</option>
<option>采气二厂</option>
<option>天然气处理</option>
</select>
<label>单位</label>
<div class="multi-select">
<div class="multi-select__trigger" id="unitTrigger2" onclick="toggleMultiSelect('unitPanel2')">全部</div>
<div class="multi-select__panel" id="unitPanel2">
<label class="multi-select__item"><input type="checkbox" value="" checked onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 全部</label>
<label class="multi-select__item"><input type="checkbox" value="采油一厂" onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 采油一厂</label>
<label class="multi-select__item"><input type="checkbox" value="采油二厂" onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 采油二厂</label>
<label class="multi-select__item"><input type="checkbox" value="采气一厂" onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 采气一</label>
<label class="multi-select__item"><input type="checkbox" value="采气二厂" onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 采气二厂</label>
<label class="multi-select__item"><input type="checkbox" value="天然气处理厂" onchange="updateMultiSelect('unitTrigger2','unitPanel2')"> 天然气处理厂</label>
</div>
</div>
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
@@ -175,34 +199,22 @@
<!-- 三级单位筛选栏 -->
<div class="filter-bar" id="filter-level3" style="display:none;">
<div class="filter-item">
<label>年份</label>
<select class="filter-select" style="min-width:100px;">
<option>2026</option>
<option>2025</option>
<option>2024</option>
</select>
<label>日期范围</label>
<input class="filter-input" type="date" id="filterDateFrom3" style="min-width:130px;"> ~ <input class="filter-input" type="date" id="filterDateTo3" style="min-width:130px;">
</div>
<div class="filter-item">
<label>所属单位</label>
<select class="filter-select" style="min-width:150px;">
<option>全部</option>
<option>采油一厂</option>
<option>采油二厂</option>
<option>采气一厂</option>
<option>采气二厂</option>
<option>天然气处理</option>
</select>
</div>
<div class="filter-item">
<label>所属部门</label>
<select class="filter-select" style="min-width:150px;">
<option>全部</option>
<option>第一作业区</option>
<option>第二作业区</option>
<option>集输大队</option>
<option>采气作业区</option>
<option>集气站</option>
</select>
<label>单位</label>
<div class="multi-select">
<div class="multi-select__trigger" id="unitTrigger3" onclick="toggleMultiSelect('unitPanel3')">全部</div>
<div class="multi-select__panel" id="unitPanel3">
<label class="multi-select__item"><input type="checkbox" value="" checked onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 全部</label>
<label class="multi-select__item"><input type="checkbox" value="采油一厂" onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 采油一厂</label>
<label class="multi-select__item"><input type="checkbox" value="采油二厂" onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 采油二厂</label>
<label class="multi-select__item"><input type="checkbox" value="采气一厂" onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 采气一</label>
<label class="multi-select__item"><input type="checkbox" value="采气二厂" onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 采气二厂</label>
<label class="multi-select__item"><input type="checkbox" value="天然气处理厂" onchange="updateMultiSelect('unitTrigger3','unitPanel3')"> 天然气处理厂</label>
</div>
</div>
</div>
<button class="btn btn-primary">查询</button>
<button class="btn btn-default">重置</button>
@@ -215,13 +227,14 @@
<button class="btn btn-default">查看导出任务</button>
</div>
<div class="table-card">
<div class="table-card__header">
<div class="table-card__header">
<span class="table-card__title">二级单位数据统计</span>
</div>
<div class="table-card__content">
<table>
<thead>
<tr>
<th rowspan="2" style="vertical-align:middle;">序号</th>
<th rowspan="2" style="vertical-align:middle;">单位</th>
<th rowspan="2" style="vertical-align:middle;">总人数</th>
<th colspan="3" class="group-header" style="border-bottom:1px solid var(--border);">体重秤</th>
@@ -246,39 +259,39 @@
</thead>
<tbody>
<tr>
<td style="font-weight:500;text-align:left;">采油一厂</td><td>283</td>
<td>18</td><td>821</td><td>200</td>
<td>12</td><td>505</td><td>155</td>
<td>7</td><td>319</td><td>114</td>
<td>4</td><td>176</td><td>72</td>
<td>1</td><td style="font-weight:500;text-align:left;">采油一厂</td><td>283</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','设备数量','18')">18</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用次数','821')">821</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用人数','200')">200</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','设备数量','12')">12</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用次数','505')">505</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用人数','155')">155</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','设备数量','7')">7</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用次数','319')">319</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用人数','114')">114</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','设备数量','4')">4</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用次数','176')">176</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用人数','72')">72</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采油二厂</td><td>198</td>
<td>12</td><td>565</td><td>140</td>
<td>7</td><td>345</td><td>103</td>
<td>5</td><td>215</td><td>74</td>
<td>3</td><td>123</td><td>50</td>
<td>2</td><td style="font-weight:500;text-align:left;">采油二厂</td><td>198</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','设备数量','12')">12</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用次数','565')">565</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用人数','140')">140</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','设备数量','7')">7</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用次数','345')">345</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用人数','103')">103</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','设备数量','5')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用次数','215')">215</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用人数','74')">74</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','设备数量','3')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用次数','123')">123</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用人数','50')">50</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采气一厂</td><td>127</td>
<td>8</td><td>350</td><td>93</td>
<td>5</td><td>223</td><td>72</td>
<td>3</td><td>145</td><td>57</td>
<td>3</td><td>100</td><td>43</td>
<td>3</td><td style="font-weight:500;text-align:left;">采气一厂</td><td>127</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','设备数量','8')">8</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用次数','350')">350</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用人数','93')">93</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','设备数量','5')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用次数','223')">223</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用人数','72')">72</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','设备数量','3')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用次数','145')">145</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用人数','57')">57</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','设备数量','3')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用次数','100')">100</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用人数','43')">43</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采气二厂</td><td>105</td>
<td>6</td><td>285</td><td>72</td>
<td>4</td><td>168</td><td>55</td>
<td>2</td><td>110</td><td>42</td>
<td>2</td><td>78</td><td>32</td>
<td>4</td><td style="font-weight:500;text-align:left;">采气二厂</td><td>105</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体重秤','设备数量','6')">6</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体重秤','使用次数','285')">285</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体重秤','使用人数','72')">72</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','蓝牙称','设备数量','4')">4</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','蓝牙称','使用次数','168')">168</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','蓝牙称','使用人数','55')">55</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体脂仪','设备数量','2')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体脂仪','使用次数','110')">110</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','体脂仪','使用人数','42')">42</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','运动器械','设备数量','2')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','运动器械','使用次数','78')">78</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气二厂','运动器械','使用人数','32')">32</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">天然气处理厂</td><td>86</td>
<td>5</td><td>220</td><td>58</td>
<td>3</td><td>132</td><td>42</td>
<td>2</td><td>85</td><td>35</td>
<td>1</td><td>55</td><td>25</td>
<td>5</td><td style="font-weight:500;text-align:left;">天然气处理厂</td><td>86</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体重秤','设备数量','5')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体重秤','使用次数','220')">220</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体重秤','使用人数','58')">58</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','蓝牙称','设备数量','3')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','蓝牙称','使用次数','132')">132</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','蓝牙称','使用人数','42')">42</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体脂仪','设备数量','2')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体脂仪','使用次数','85')">85</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','体脂仪','使用人数','35')">35</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','运动器械','设备数量','1')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','运动器械','使用次数','55')">55</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('天然气处理厂','运动器械','使用人数','25')">25</a></td>
</tr>
</tbody>
</table>
@@ -300,6 +313,7 @@
<table>
<thead>
<tr>
<th rowspan="2" style="vertical-align:middle;">序号</th>
<th rowspan="2" style="vertical-align:middle;">单位</th>
<th rowspan="2" style="vertical-align:middle;">部门</th>
<th rowspan="2" style="vertical-align:middle;">总人数</th>
@@ -325,53 +339,53 @@
</thead>
<tbody>
<tr>
<td style="font-weight:500;text-align:left;">采油一厂</td><td>第一作业区</td><td>120</td>
<td>8</td><td>356</td><td>85</td>
<td>5</td><td>210</td><td>62</td>
<td>3</td><td>145</td><td>48</td>
<td>2</td><td>89</td><td>35</td>
<td>1</td><td style="font-weight:500;text-align:left;">采油一厂</td><td>第一作业区</td><td>120</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','设备数量','8','第一作业区')">8</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用次数','356','第一作业区')">356</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用人数','85','第一作业区')">85</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','设备数量','5','第一作业区')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用次数','210','第一作业区')">210</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用人数','62','第一作业区')">62</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','设备数量','3','第一作业区')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用次数','145','第一作业区')">145</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用人数','48','第一作业区')">48</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','设备数量','2','第一作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用次数','89','第一作业区')">89</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用人数','35','第一作业区')">35</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采油一厂</td><td>第二作业区</td><td>95</td>
<td>6</td><td>280</td><td>70</td>
<td>4</td><td>175</td><td>55</td>
<td>2</td><td>98</td><td>38</td>
<td>1</td><td>52</td><td>22</td>
<td>2</td><td style="font-weight:500;text-align:left;">采油一厂</td><td>第二作业区</td><td>95</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','设备数量','6','第二作业区')">6</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用次数','280','第二作业区')">280</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用人数','70','第二作业区')">70</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','设备数量','4','第二作业区')">4</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用次数','175','第二作业区')">175</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用人数','55','第二作业区')">55</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','设备数量','2','第二作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用次数','98','第二作业区')">98</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用人数','38','第二作业区')">38</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','设备数量','1','第二作业区')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用次数','52','第二作业区')">52</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用人数','22','第二作业区')">22</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采油一厂</td><td>集输大队</td><td>68</td>
<td>4</td><td>185</td><td>45</td>
<td>3</td><td>120</td><td>38</td>
<td>2</td><td>76</td><td>28</td>
<td>1</td><td>35</td><td>15</td>
<td>3</td><td style="font-weight:500;text-align:left;">采油一厂</td><td>集输大队</td><td>68</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','设备数量','4','集输大队')">4</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用次数','185','集输大队')">185</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体重秤','使用人数','45','集输大队')">45</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','设备数量','3','集输大队')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用次数','120','集输大队')">120</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','蓝牙称','使用人数','38','集输大队')">38</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','设备数量','2','集输大队')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用次数','76','集输大队')">76</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','体脂仪','使用人数','28','集输大队')">28</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','设备数量','1','集输大队')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用次数','35','集输大队')">35</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油一厂','运动器械','使用人数','15','集输大队')">15</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采油二厂</td><td>第一作业区</td><td>110</td>
<td>7</td><td>320</td><td>78</td>
<td>4</td><td>195</td><td>58</td>
<td>3</td><td>130</td><td>42</td>
<td>2</td><td>75</td><td>30</td>
<td>4</td><td style="font-weight:500;text-align:left;">采油二厂</td><td>第一作业区</td><td>110</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','设备数量','7','第一作业区')">7</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用次数','320','第一作业区')">320</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用人数','78','第一作业区')">78</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','设备数量','4','第一作业区')">4</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用次数','195','第一作业区')">195</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用人数','58','第一作业区')">58</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','设备数量','3','第一作业区')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用次数','130','第一作业区')">130</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用人数','42','第一作业区')">42</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','设备数量','2','第一作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用次数','75','第一作业区')">75</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用人数','30','第一作业区')">30</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采油二厂</td><td>第二作业区</td><td>88</td>
<td>5</td><td>245</td><td>62</td>
<td>3</td><td>150</td><td>45</td>
<td>2</td><td>85</td><td>32</td>
<td>1</td><td>48</td><td>20</td>
<td>5</td><td style="font-weight:500;text-align:left;">采油二厂</td><td>第二作业区</td><td>88</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','设备数量','5','第二作业区')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用次数','245','第二作业区')">245</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体重秤','使用人数','62','第二作业区')">62</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','设备数量','3','第二作业区')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用次数','150','第二作业区')">150</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','蓝牙称','使用人数','45','第二作业区')">45</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','设备数量','2','第二作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用次数','85','第二作业区')">85</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','体脂仪','使用人数','32','第二作业区')">32</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','设备数量','1','第二作业区')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用次数','48','第二作业区')">48</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采油二厂','运动器械','使用人数','20','第二作业区')">20</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采气一厂</td><td>采气作业区</td><td>75</td>
<td>5</td><td>210</td><td>55</td>
<td>3</td><td>135</td><td>42</td>
<td>2</td><td>90</td><td>35</td>
<td>2</td><td>68</td><td>28</td>
<td>6</td><td style="font-weight:500;text-align:left;">采气一厂</td><td>采气作业区</td><td>75</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','设备数量','5','采气作业区')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用次数','210','采气作业区')">210</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用人数','55','采气作业区')">55</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','设备数量','3','采气作业区')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用次数','135','采气作业区')">135</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用人数','42','采气作业区')">42</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','设备数量','2','采气作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用次数','90','采气作业区')">90</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用人数','35','采气作业区')">35</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','设备数量','2','采气作业区')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用次数','68','采气作业区')">68</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用人数','28','采气作业区')">28</a></td>
</tr>
<tr>
<td style="font-weight:500;text-align:left;">采气一厂</td><td>集气站</td><td>52</td>
<td>3</td><td>140</td><td>38</td>
<td>2</td><td>88</td><td>30</td>
<td>1</td><td>55</td><td>22</td>
<td>1</td><td>32</td><td>15</td>
<td>7</td><td style="font-weight:500;text-align:left;">采气一厂</td><td>集气站</td><td>52</td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','设备数量','3','集气站')">3</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用次数','140','集气站')">140</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体重秤','使用人数','38','集气站')">38</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','设备数量','2','集气站')">2</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用次数','88','集气站')">88</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','蓝牙称','使用人数','30','集气站')">30</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','设备数量','1','集气站')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用次数','55','集气站')">55</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','体脂仪','使用人数','22','集气站')">22</a></td>
<td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','设备数量','1','集气站')">1</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用次数','32','集气站')">32</a></td><td><a class="link" href="javascript:void(0)" onclick="openDeptDetail('采气一厂','运动器械','使用人数','15','集气站')">15</a></td>
</tr>
</tbody>
</table>
@@ -387,6 +401,23 @@
</div>
</main>
<!-- 详情弹窗 -->
<div class="record-overlay" id="deptOverlay">
<div class="record-dialog">
<div class="record-dialog__header">
<span class="record-dialog__title" id="deptTitle">详情</span>
<button class="record-dialog__close" onclick="closeDeptDialog()"></button>
</div>
<div class="record-dialog__body">
<div class="record-info" id="deptInfo"></div>
<table class="record-table">
<thead id="deptThead"></thead>
<tbody id="deptTbody"></tbody>
</table>
</div>
</div>
</div>
<script>
function toggleSubgroup(h){var p=h.parentElement;var sidebar=p.closest("aside");if(sidebar)sidebar.querySelectorAll(".sidebar-subgroup.open").forEach(function(g){if(g!==p)g.classList.remove("open");});p.classList.toggle("open");}
(function(){var a=document.querySelector('.sidebar-item.active');if(!a)return;var sidebar=document.querySelector('aside');if(sidebar)sidebar.querySelectorAll('.sidebar-subgroup.open').forEach(function(g){g.classList.remove('open');});var s=a.closest('.sidebar-subgroup');if(s)s.classList.add('open');})();
@@ -409,6 +440,116 @@ function toggleSort(th) {
else if (wasAsc) { th.classList.add('desc'); }
/* desc -> 清除(第三次点击回到默认) */
}
/* 默认日期范围:近一个月 */
(function(){
var today = new Date();
var lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());
function fd(d){ return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2); }
document.getElementById('filterDateFrom').value = fd(lastMonth);
document.getElementById('filterDateTo').value = fd(today);
document.getElementById('filterDateFrom3').value = fd(lastMonth);
document.getElementById('filterDateTo3').value = fd(today);
})();
/* 多选下拉 */
function toggleMultiSelect(panelId){
var panel = document.getElementById(panelId);
panel.classList.toggle('open');
}
function updateMultiSelect(triggerId, panelId){
var trigger = document.getElementById(triggerId);
var panel = document.getElementById(panelId);
var allCb = panel.querySelector('input[value=""]');
var checkboxes = panel.querySelectorAll('input[type="checkbox"]:not([value=""])');
// 如果点了"全部"
if(allCb.checked){
checkboxes.forEach(function(cb){ cb.checked = false; });
trigger.textContent = '全部';
} else {
var selected = [];
checkboxes.forEach(function(cb){ if(cb.checked) selected.push(cb.value); });
if(selected.length === 0){ allCb.checked = true; trigger.textContent = '全部'; }
else if(selected.length <= 2){ trigger.textContent = selected.join('、'); }
else { trigger.textContent = selected.length + ' 个单位'; }
}
}
// 点击外部关闭
document.addEventListener('click', function(e){
if(!e.target.closest('.multi-select')){
document.querySelectorAll('.multi-select__panel').forEach(function(p){ p.classList.remove('open'); });
}
});
/* 详情弹窗 */
function openDeptDetail(unit, deviceType, metric, count, dept){
var from = document.getElementById('filterDateFrom').value || '-';
var to = document.getElementById('filterDateTo').value || '-';
var infoHtml = '';
infoHtml += '<div class="record-info__item"><span class="record-info__label">单位:</span><span class="record-info__value">'+esc(unit)+'</span></div>';
if(dept){ infoHtml += '<div class="record-info__item"><span class="record-info__label">部门:</span><span class="record-info__value">'+esc(dept)+'</span></div>'; }
infoHtml += '<div class="record-info__item"><span class="record-info__label">设备类型:</span><span class="record-info__value">'+deviceType+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">'+metric+'</span><span class="record-info__value">'+count+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">日期范围:</span><span class="record-info__value">'+from+' ~ '+to+'</span></div>';
document.getElementById('deptInfo').innerHTML = infoHtml;
document.getElementById('deptTitle').textContent = unit + ' - ' + deviceType + metric;
var thead = document.getElementById('deptThead');
var tbody = document.getElementById('deptTbody');
var rows = Math.floor(Math.random()*4)+3;
var html = '';
if(metric === '设备数量'){
thead.innerHTML = '<tr><th>序号</th><th>设备名称</th><th>设备编码</th><th>布放位置</th><th>入库日期</th></tr>';
var devices = [
{name:deviceType+'A01', code:'SC-2024-001', loc:'办公楼1层大厅', date:'2024-03-15'},
{name:deviceType+'A02', code:'SC-2024-002', loc:'健身房', date:'2024-03-18'},
{name:deviceType+'B01', code:'SC-2024-003', loc:'职工活动中心', date:'2024-04-02'},
{name:deviceType+'B02', code:'SC-2024-004', loc:'办公楼2层', date:'2024-04-10'},
{name:deviceType+'C01', code:'SC-2024-005', loc:'综合楼1层', date:'2024-05-08'},
{name:deviceType+'D01', code:'SC-2024-006', loc:'食堂入口', date:'2024-06-12'}
];
for(var i=0;i<Math.min(rows,devices.length);i++){
var dv = devices[i];
html += '<tr><td>'+(i+1)+'</td><td>'+dv.name+'</td><td>'+dv.code+'</td><td>'+dv.loc+'</td><td>'+dv.date+'</td></tr>';
}
} else if(metric === '使用人数'){
thead.innerHTML = '<tr><th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>使用次数</th></tr>';
var names = ['张伟','李娜','王强','赵敏','刘洋','陈静','孙磊','周芳'];
var empIds = ['EMP-10001','EMP-10002','EMP-10003','EMP-10004','EMP-10005','EMP-10006','EMP-10007','EMP-10008'];
for(var i=0;i<rows;i++){
html += '<tr><td>'+(i+1)+'</td><td>'+names[i%8]+'</td><td>'+empIds[i%8]+'</td><td>'+(i%2?'女':'男')+'</td><td>'+(25+Math.floor(Math.random()*25))+'</td><td>'+Math.floor(Math.random()*30+3)+'</td></tr>';
}
} else {
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>姓名</th><th>员工编号</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th></tr>';
var names = ['张伟','李娜','王强','赵敏','刘洋','陈静','孙磊','周芳'];
var empIds = ['EMP-10001','EMP-10002','EMP-10003','EMP-10004','EMP-10005','EMP-10006','EMP-10007','EMP-10008'];
for(var i=0;i<rows;i++){
var isAnon = i === 1 || i === 3;
var d = new Date(); d.setDate(d.getDate() - Math.floor(Math.random()*30));
var ds = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var h = 6+Math.floor(Math.random()*16), m = Math.floor(Math.random()*60);
var time = ds+' '+('0'+h).slice(-2)+':'+('0'+m).slice(-2);
var height = [170,175,178,165,160,172,168,180][i%8];
var weight = (60 + Math.random()*30).toFixed(1);
var bmi = (weight / ((height/100)*(height/100))).toFixed(1);
var fat = (15 + Math.random()*20).toFixed(1);
html += '<tr><td>'+(i+1)+'</td><td>'+time+'</td><td>'+(isAnon?'匿名用户':names[i%8])+'</td><td>'+(isAnon?'-':empIds[i%8])+'</td><td>'+height+'</td><td>'+weight+'</td><td>'+bmi+'</td><td>'+fat+'</td></tr>';
}
}
tbody.innerHTML = html;
document.getElementById('deptOverlay').classList.add('show');
}
function closeDeptDialog(){
document.getElementById('deptOverlay').classList.remove('show');
}
document.getElementById('deptOverlay').addEventListener('click',function(e){
if(e.target === this) closeDeptDialog();
});
function esc(s){ return String(s||'').replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }
</script>
</body>
</html>
+43 -92
View File
@@ -43,17 +43,6 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
.page-header__breadcrumb span{color:var(--text-primary);}
/* 计划选择区 */
.plan-selector{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:flex-start;gap:24px;}
.plan-selector__left{flex:1;min-width:0;max-width:400px;}
.plan-selector__label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;font-weight:500;}
.plan-selector__right{flex:1;display:flex;gap:28px;padding:18px 20px;background:#FAFAFA;border-radius:var(--radius-md);border:1px solid var(--border);min-height:78px;align-items:center;}
.plan-selector__right--empty{justify-content:center;color:var(--text-placeholder);font-size:var(--font-sm);}
.plan-info-item{display:flex;flex-direction:column;gap:6px;}
.plan-info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.plan-info-item__value{font-size:var(--font-base);color:var(--text-primary);font-weight:600;}
.plan-info-item__value strong{color:var(--primary);font-size:var(--font-lg);}
/* 搜索下拉 */
.search-select{position:relative;width:100%;}
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 36px 0 12px;font-size:var(--font-sm);outline:none;transition:border-color .2s;box-sizing:border-box;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
@@ -119,16 +108,16 @@ tbody td{padding:10px 4px;text-align:center;font-size:var(--font-xs);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 左侧固定列:干预计划、姓名 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:200px;min-width:200px;max-width:200px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:9;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:200px;z-index:5;background:#fff;width:60px;min-width:60px;max-width:60px;}
thead th:nth-child(2){z-index:8;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:260px;z-index:4;background:#fff;width:88px;min-width:88px;max-width:88px;}
thead th:nth-child(3){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
/* 左侧固定列:干预计划、姓名(序号列不固定) */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:6;background:#fff;width:200px;min-width:200px;max-width:200px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:9;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:200px;z-index:5;background:#fff;width:60px;min-width:60px;max-width:60px;}
thead th:nth-child(3){z-index:8;background:#FAFAFA;}
thead th:nth-child(4),tbody td:nth-child(4){position:sticky;left:260px;z-index:4;background:#fff;width:88px;min-width:88px;max-width:88px;}
thead th:nth-child(4){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
tbody tr:hover td:nth-child(3),
tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 右侧固定列:体重报告(操作列) */
thead tr:first-child th:last-child,tbody td:last-child{position:sticky;right:0;z-index:2;background:#fff;box-shadow:-2px 0 4px rgba(0,0,0,0.04);width:72px;min-width:72px;max-width:72px;}
@@ -229,7 +218,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
@@ -240,49 +229,18 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>详细数据</span></div>
</div>
<!-- [交互] 干预计划选择区 — 搜索下拉选择计划,选中后右侧展示基本信息 -->
<div class="plan-selector">
<div class="plan-selector__left">
<div class="plan-selector__label">干预计划</div>
<div class="search-select" id="planSelect">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<!-- [交互] 点击清空已选计划,恢复未选择状态 -->
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 选中计划后此处展示基本信息;未选中时显示占位提示 -->
<div class="plan-selector__right plan-selector__right--empty" id="planInfoEmpty">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="margin-right:6px;flex-shrink:0;"><circle cx="9" cy="9" r="8" stroke="#999" stroke-width="1.2" stroke-dasharray="3 2"/><path d="M9 5v4M9 11v.5" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
可选择干预计划进行查看
</div>
<div class="plan-selector__right" id="planInfo" style="display:none;">
<div class="plan-info-item">
<span class="plan-info-item__label">组织机构</span>
<span class="plan-info-item__value" id="piOrg">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">起止日期</span>
<span class="plan-info-item__value" id="piDate">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">进行天数</span>
<span class="plan-info-item__value" id="piDays">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">应参加人数</span>
<span class="plan-info-item__value"><strong id="piCount">-</strong></span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">实际参加人数</span>
<span class="plan-info-item__value"><strong id="piActual">-</strong></span>
</div>
</div>
</div>
<!-- [交互] 筛选栏 — 日期范围(默认当日)、单位部门、姓名、员工编号 -->
<div class="filter-bar">
<!-- [交互] 日期范围选择,默认当日 -->
<!-- [交互] 筛选栏 — 日期范围(默认当日)、单位部门、姓名、员工编号 -->
<div class="filter-bar">
<!-- [交互] 干预计划下拉搜索 -->
<div class="filter-item">
<label>干预计划</label>
<div class="search-select" id="planSelect" style="width:280px;">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 日期范围选择,默认当日 -->
<div class="filter-item">
<label>日期范围</label>
<input class="filter-date" type="date" id="filterDateFrom" onchange="applyFilter()">
@@ -343,6 +301,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<thead>
<!-- [交互] 表头第一行:父级分类(饮食摄入、运动消耗、体重为合并单元格) -->
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">干预计划</th>
<th rowspan="2">姓名</th>
<th rowspan="2">员工编号</th>
@@ -590,34 +549,25 @@ function showPlanPanel(){
}
function selectPlan(planId){
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
document.getElementById('planInfoEmpty').style.display = 'none';
document.getElementById('planInfo').style.display = 'flex';
document.getElementById('piOrg').textContent = plan.org;
document.getElementById('piDate').textContent = plan.dateFrom + ' ~ ' + plan.dateTo;
document.getElementById('piDays').textContent = calcPlanDays(plan.dateFrom, plan.dateTo) + ' 天';
document.getElementById('piCount').textContent = plan.totalCount + ' 人';
document.getElementById('piActual').textContent = (plan.actualCount || 0) + ' 人';
applyFilter();
}
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
applyFilter();
}
/* [交互] 清空已选干预计划,恢复未选择状态 */
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planInfoEmpty').style.display = '';
document.getElementById('planInfo').style.display = 'none';
applyFilter();
}
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
applyFilter();
}
/* ===== 单位部门双列面板 ===== */
var deptMap = {
@@ -714,13 +664,14 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="19" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="20" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+(start+i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
@@ -184,14 +184,14 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr><th>测量时间</th><th>测量设备</th><th>设备编码</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢(kcal)</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>蛋白质量(kg)</th><th>操作</th></tr></thead>
<tbody>
<tr><td>2024-05-10 08:30</td><td>体重秤</td><td>SC-2024-001</td><td>175</td><td>72.5</td><td>23.7</td><td>1680</td><td>13.2</td><td>18.2</td><td>40.1</td><td>11.6</td><td><a class="link" onclick="openModal(0)">详细信息</a></td></tr>
<tr><td>2024-05-08 07:45</td><td>体脂仪</td><td>FT-2024-002</td><td>175</td><td>72.8</td><td>23.8</td><td>1675</td><td>13.4</td><td>18.4</td><td>39.8</td><td>11.5</td><td><a class="link" onclick="openModal(1)">详细信息</a></td></tr>
<tr><td>2024-05-06 18:20</td><td>蓝牙称</td><td>BT-2024-003</td><td>175</td><td>73.0</td><td>23.8</td><td>1682</td><td>13.5</td><td>18.5</td><td>40.0</td><td>11.6</td><td><a class="link" onclick="openModal(2)">详细信息</a></td></tr>
<tr><td>2024-05-04 08:10</td><td>体重秤</td><td>SC-2024-001</td><td>175</td><td>72.3</td><td>23.6</td><td>1678</td><td>13.1</td><td>18.1</td><td>40.2</td><td>11.7</td><td><a class="link" onclick="openModal(3)">详细信息</a></td></tr>
<tr><td>2024-05-02 09:00</td><td>体脂仪</td><td>FT-2024-002</td><td>175</td><td>73.2</td><td>23.9</td><td>1685</td><td>13.6</td><td>18.6</td><td>39.9</td><td>11.5</td><td><a class="link" onclick="openModal(4)">详细信息</a></td></tr>
</tbody>
<thead><tr><th>序号</th><th>测量时间</th><th>测量设备</th><th>设备编码</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢(kcal)</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>蛋白质量(kg)</th><th>操作</th></tr></thead>
<tbody>
<tr><td>1</td><td>2024-05-10 08:30</td><td>体重秤</td><td>SC-2024-001</td><td>175</td><td>72.5</td><td>23.7</td><td>1680</td><td>13.2</td><td>18.2</td><td>40.1</td><td>11.6</td><td><a class="link" onclick="openModal(0)">详细信息</a></td></tr>
<tr><td>2</td><td>2024-05-08 07:45</td><td>体脂仪</td><td>FT-2024-002</td><td>175</td><td>72.8</td><td>23.8</td><td>1675</td><td>13.4</td><td>18.4</td><td>39.8</td><td>11.5</td><td><a class="link" onclick="openModal(1)">详细信息</a></td></tr>
<tr><td>3</td><td>2024-05-06 18:20</td><td>蓝牙称</td><td>BT-2024-003</td><td>175</td><td>73.0</td><td>23.8</td><td>1682</td><td>13.5</td><td>18.5</td><td>40.0</td><td>11.6</td><td><a class="link" onclick="openModal(2)">详细信息</a></td></tr>
<tr><td>4</td><td>2024-05-04 08:10</td><td>体重秤</td><td>SC-2024-001</td><td>175</td><td>72.3</td><td>23.6</td><td>1678</td><td>13.1</td><td>18.1</td><td>40.2</td><td>11.7</td><td><a class="link" onclick="openModal(3)">详细信息</a></td></tr>
<tr><td>5</td><td>2024-05-02 09:00</td><td>体脂仪</td><td>FT-2024-002</td><td>175</td><td>73.2</td><td>23.9</td><td>1685</td><td>13.6</td><td>18.6</td><td>39.9</td><td>11.5</td><td><a class="link" onclick="openModal(4)">详细信息</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -142,6 +142,7 @@
<table>
<thead>
<tr>
<th rowspan="2" style="vertical-align:middle;">序号</th>
<th rowspan="2" style="vertical-align:middle;">姓名</th>
<th rowspan="2" style="vertical-align:middle;">员工编号</th>
<th rowspan="2" style="vertical-align:middle;">性别</th>
@@ -156,11 +157,11 @@
</tr>
</thead>
<tbody>
<tr><td>张伟</td><td>EMP-10001</td><td></td><td>35</td><td>采油一厂</td><td>生产运行科</td><td>2024-05-10 08:30</td><td>体重秤</td><td>175</td><td>72.5</td><td>23.7</td><td>18.2</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>李娜</td><td>EMP-10002</td><td></td><td>28</td><td>采油一厂</td><td>安全环保科</td><td>2024-05-09 17:15</td><td>体脂仪</td><td>163</td><td>55.0</td><td>20.7</td><td>24.5</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>王强</td><td>EMP-10003</td><td></td><td>42</td><td>采油二厂</td><td>综合管理科</td><td>2024-05-08 12:00</td><td>蓝牙称</td><td>170</td><td>80.2</td><td>27.7</td><td>26.8</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>赵敏</td><td>EMP-10004</td><td></td><td>31</td><td>采油二厂</td><td>生产运行科</td><td>2024-05-10 09:45</td><td>体重秤</td><td>160</td><td>52.3</td><td>20.4</td><td>22.1</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>刘洋</td><td>EMP-10005</td><td></td><td>38</td><td>采气厂</td><td>安全环保科</td><td>2024-05-07 16:30</td><td>体脂仪</td><td>178</td><td>85.0</td><td>26.8</td><td>25.3</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>1</td><td>张伟</td><td>EMP-10001</td><td></td><td>35</td><td>采油一厂</td><td>生产运行科</td><td>2024-05-10 08:30</td><td>体重秤</td><td>175</td><td>72.5</td><td>23.7</td><td>18.2</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>2</td><td>李娜</td><td>EMP-10002</td><td></td><td>28</td><td>采油一厂</td><td>安全环保科</td><td>2024-05-09 17:15</td><td>体脂仪</td><td>163</td><td>55.0</td><td>20.7</td><td>24.5</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>3</td><td>王强</td><td>EMP-10003</td><td></td><td>42</td><td>采油二厂</td><td>综合管理科</td><td>2024-05-08 12:00</td><td>蓝牙称</td><td>170</td><td>80.2</td><td>27.7</td><td>26.8</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>4</td><td>赵敏</td><td>EMP-10004</td><td></td><td>31</td><td>采油二厂</td><td>生产运行科</td><td>2024-05-10 09:45</td><td>体重秤</td><td>160</td><td>52.3</td><td>20.4</td><td>22.1</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
<tr><td>5</td><td>刘洋</td><td>EMP-10005</td><td></td><td>38</td><td>采气厂</td><td>安全环保科</td><td>2024-05-07 16:30</td><td>体脂仪</td><td>178</td><td>85.0</td><td>26.8</td><td>25.3</td><td><a class="link" href="employee-data-record.html">测量记录</a></td></tr>
</tbody>
</table>
</div>
+132 -30
View File
@@ -69,6 +69,25 @@
.sort-icon .arrow-down{border-top:5px solid #ccc;}
.sortable.asc .sort-icon .arrow-up{border-bottom-color:var(--primary);}
.sortable.desc .sort-icon .arrow-down{border-top-color:var(--primary);}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
/* 弹窗 */
.record-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.45);z-index:1000;align-items:center;justify-content:center;}
.record-overlay.show{display:flex;}
.record-dialog{background:#fff;border-radius:var(--radius-lg);box-shadow:0 8px 40px rgba(0,0,0,0.18);width:960px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;}
.record-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
.record-dialog__title{font-size:var(--font-lg);font-weight:600;}
.record-dialog__close{width:32px;height:32px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:20px;transition:all .15s;}
.record-dialog__close:hover{background:#F5F7FA;color:var(--text-primary);}
.record-dialog__body{padding:24px;overflow-y:auto;flex:1;min-height:0;}
.record-info{display:flex;gap:24px;padding:14px 20px;background:#FAFAFA;border-radius:var(--radius-md);margin-bottom:12px;font-size:var(--font-sm);flex-wrap:wrap;}
.record-info__item{display:flex;gap:4px;}
.record-info__label{color:var(--text-secondary);}
.record-info__value{color:var(--text-primary);font-weight:500;}
.record-table{width:100%;border-collapse:collapse;table-layout:auto;}
.record-table th,.record-table td{padding:8px 12px;text-align:center;font-size:var(--font-sm);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
.record-table thead th{background:#FAFAFA;color:var(--text-secondary);font-weight:500;font-size:var(--font-xs);}
.record-table td:first-child,.record-table th:first-child{padding-left:4px;padding-right:8px;width:auto;}
</style>
</head>
<body>
@@ -131,12 +150,8 @@
<!-- 筛选条件 -->
<div class="filter-bar">
<div class="filter-item">
<label>年份</label>
<select class="filter-select" style="min-width:100px;">
<option>2026</option>
<option>2025</option>
<option>2024</option>
</select>
<label>日期范围</label>
<input class="filter-input" type="date" id="filterDateFrom" style="min-width:130px;"> ~ <input class="filter-input" type="date" id="filterDateTo" style="min-width:130px;">
</div>
<div class="filter-item"><label>姓名</label><input class="filter-input" placeholder="请输入姓名" style="min-width:120px;"></div>
<div class="filter-item"><label>员工编号</label><input class="filter-input" placeholder="请输入员工编号" style="min-width:140px;"></div>
@@ -167,30 +182,31 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>姓名</th>
<th>员工编号</th>
<th>性别</th>
<th>年龄</th>
<th>所属单位</th>
<th>所属部门</th>
<th class="sortable" onclick="toggleSort(this)">体重秤使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">蓝牙称使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">体脂仪使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">运动器械使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
</tr>
</thead>
<tbody>
<tr><td>张伟</td><td>EMP-10001</td><td></td><td>35</td><td>采油一厂</td><td>第一作业区</td><td>42</td><td>18</td><td>12</td><td>8</td></tr>
<tr><td>李娜</td><td>EMP-10002</td><td></td><td>28</td><td>采油一厂</td><td>作业区</td><td>35</td><td>22</td><td>15</td><td>5</td></tr>
<tr><td>王强</td><td>EMP-10003</td><td></td><td>42</td><td>采油</td><td>作业区</td><td>28</td><td>30</td><td>8</td><td>12</td></tr>
<tr><td>赵敏</td><td>EMP-10004</td><td></td><td>31</td><td>采油二厂</td><td>作业区</td><td>50</td><td>15</td><td>20</td><td>3</td></tr>
<tr><td>刘洋</td><td>EMP-10005</td><td></td><td>38</td><td>气一</td><td>采气作业区</td><td>18</td><td>25</td><td>10</td><td>15</td></tr>
<tr><td>陈静</td><td>EMP-10006</td><td></td><td>26</td><td>采气一厂</td><td>集气站</td><td>32</td><td>12</td><td>18</td><td>6</td></tr>
<tr><td>孙磊</td><td>EMP-10007</td><td></td><td>45</td><td>采气</td><td>采气作业区</td><td>22</td><td>28</td><td>5</td><td>20</td></tr>
<tr><td>周芳</td><td>EMP-10008</td><td></td><td>33</td><td>天然气处理</td><td>综合管理科</td><td>38</td><td>20</td><td>14</td><td>9</td></tr>
</tbody>
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>员工编号</th>
<th>性别</th>
<th>年龄</th>
<th>所属单位</th>
<th>所属部门</th>
<th class="sortable" onclick="toggleSort(this)">体重秤使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">蓝牙称使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">体脂仪使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
<th class="sortable" onclick="toggleSort(this)">运动器械使用次数<span class="sort-icon"><span class="arrow-up"></span><span class="arrow-down"></span></span></th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>张伟</td><td>EMP-10001</td><td></td><td>35</td><td>采油一厂</td><td>作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('张伟','EMP-10001','采油一厂','第一作业区','体重秤')">42</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('张伟','EMP-10001','采油一厂','第一作业区','蓝牙称')">18</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('张伟','EMP-10001','采油一厂','第一作业区','体脂仪')">12</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('张伟','EMP-10001','采油一厂','第一作业区','运动器械')">8</a></td></tr>
<tr><td>2</td><td>李娜</td><td>EMP-10002</td><td></td><td>28</td><td>采油</td><td>作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('李娜','EMP-10002','采油一厂','第二作业区','体重秤')">35</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('李娜','EMP-10002','采油一厂','第二作业区','蓝牙称')">22</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('李娜','EMP-10002','采油一厂','第二作业区','体脂仪')">15</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('李娜','EMP-10002','采油一厂','第二作业区','运动器械')">5</a></td></tr>
<tr><td>3</td><td>王强</td><td>EMP-10003</td><td></td><td>42</td><td>采油二厂</td><td>作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('王强','EMP-10003','采油二厂','第一作业区','体重秤')">28</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('王强','EMP-10003','采油二厂','第一作业区','蓝牙称')">30</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('王强','EMP-10003','采油二厂','第一作业区','体脂仪')">8</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('王强','EMP-10003','采油二厂','第一作业区','运动器械')">12</a></td></tr>
<tr><td>4</td><td>赵敏</td><td>EMP-10004</td><td></td><td>31</td><td>油二</td><td>第二作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('赵敏','EMP-10004','采油二厂','第二作业区','体重秤')">50</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('赵敏','EMP-10004','采油二厂','第二作业区','蓝牙称')">15</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('赵敏','EMP-10004','采油二厂','第二作业区','体脂仪')">20</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('赵敏','EMP-10004','采油二厂','第二作业区','运动器械')">3</a></td></tr>
<tr><td>5</td><td>刘洋</td><td>EMP-10005</td><td></td><td>38</td><td>采气一厂</td><td>采气作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('刘洋','EMP-10005','采气一厂','采气作业区','体重秤')">18</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('刘洋','EMP-10005','采气一厂','采气作业区','蓝牙称')">25</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('刘洋','EMP-10005','采气一厂','采气作业区','体脂仪')">10</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('刘洋','EMP-10005','采气一厂','采气作业区','运动器械')">15</a></td></tr>
<tr><td>6</td><td>陈静</td><td>EMP-10006</td><td></td><td>26</td><td>采气</td><td>集气站</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('陈静','EMP-10006','采气一厂','集气站','体重秤')">32</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('陈静','EMP-10006','采气一厂','集气站','蓝牙称')">12</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('陈静','EMP-10006','采气一厂','集气站','体脂仪')">18</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('陈静','EMP-10006','采气一厂','集气站','运动器械')">6</a></td></tr>
<tr><td>7</td><td>孙磊</td><td>EMP-10007</td><td></td><td>45</td><td>采气二</td><td>采气作业区</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('孙磊','EMP-10007','采气二厂','采气作业区','体重秤')">22</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('孙磊','EMP-10007','采气二厂','采气作业区','蓝牙称')">28</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('孙磊','EMP-10007','采气二厂','采气作业区','体脂仪')">5</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('孙磊','EMP-10007','采气二厂','采气作业区','运动器械')">20</a></td></tr>
<tr><td>8</td><td>周芳</td><td>EMP-10008</td><td></td><td>33</td><td>天然气处理厂</td><td>综合管理科</td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('周芳','EMP-10008','天然气处理厂','综合管理科','体重秤')">38</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('周芳','EMP-10008','天然气处理厂','综合管理科','蓝牙称')">20</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('周芳','EMP-10008','天然气处理厂','综合管理科','体脂仪')">14</a></td><td><a class="link" href="javascript:void(0)" onclick="openUsageDialog('周芳','EMP-10008','天然气处理厂','综合管理科','运动器械')">9</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -205,6 +221,23 @@
</div>
</div>
</main>
<!-- 使用记录弹窗 -->
<div class="record-overlay" id="usageOverlay">
<div class="record-dialog">
<div class="record-dialog__header">
<span class="record-dialog__title" id="usageTitle">使用记录</span>
<button class="record-dialog__close" onclick="closeUsageDialog()"></button>
</div>
<div class="record-dialog__body">
<div class="record-info" id="usageInfo"></div>
<table class="record-table">
<thead id="usageThead"></thead>
<tbody id="usageTbody"></tbody>
</table>
</div>
</div>
</div>
<script>
function toggleSubgroup(h){var p=h.parentElement;var sidebar=p.closest("aside");if(sidebar)sidebar.querySelectorAll(".sidebar-subgroup.open").forEach(function(g){if(g!==p)g.classList.remove("open");});p.classList.toggle("open");}
(function(){var a=document.querySelector('.sidebar-item.active');if(!a)return;var sidebar=document.querySelector('aside');if(sidebar)sidebar.querySelectorAll('.sidebar-subgroup.open').forEach(function(g){g.classList.remove('open');});var s=a.closest('.sidebar-subgroup');if(s)s.classList.add('open');})();
@@ -216,6 +249,75 @@ function toggleSort(th) {
if (!wasAsc && !wasDesc) { th.classList.add('asc'); }
else if (wasAsc) { th.classList.add('desc'); }
}
/* 默认日期范围:近一个月 */
(function(){
var today = new Date();
var lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());
function fd(d){ return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2); }
document.getElementById('filterDateFrom').value = fd(lastMonth);
document.getElementById('filterDateTo').value = fd(today);
})();
/* ===== 使用记录弹窗 ===== */
function openUsageDialog(name, empId, org, dept, deviceType){
var from = document.getElementById('filterDateFrom').value || '-';
var to = document.getElementById('filterDateTo').value || '-';
// 员工信息
var infoHtml = '';
infoHtml += '<div class="record-info__item"><span class="record-info__label">姓名:</span><span class="record-info__value">'+esc(name)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">员工编号:</span><span class="record-info__value">'+esc(empId)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">单位:</span><span class="record-info__value">'+esc(org)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">部门:</span><span class="record-info__value">'+esc(dept)+'</span></div>';
infoHtml += '<div class="record-info__item"><span class="record-info__label">日期范围:</span><span class="record-info__value">'+from+' ~ '+to+'</span></div>';
document.getElementById('usageInfo').innerHTML = infoHtml;
// 标题
document.getElementById('usageTitle').textContent = deviceType + '使用记录';
var thead = document.getElementById('usageThead');
var tbody = document.getElementById('usageTbody');
var rows = Math.floor(Math.random()*5)+3;
var html = '';
if(deviceType === '运动器械'){
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>运动类型</th><th>时长(分钟)</th><th>消耗(千卡)</th></tr>';
var sports = ['跑步','健走','骑行','游泳','健身','瑜伽','跳绳','羽毛球'];
for(var i=0;i<rows;i++){
var d = new Date(); d.setDate(d.getDate() - Math.floor(Math.random()*30));
var ds = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var h = 6+Math.floor(Math.random()*16), m = Math.floor(Math.random()*60);
var time = ds+' '+('0'+h).slice(-2)+':'+('0'+m).slice(-2);
var min = [30,35,45,50,60,75,90][Math.floor(Math.random()*7)];
var kcal = Math.round(min * (3+Math.random()*5));
html += '<tr><td>'+(i+1)+'</td><td>'+time+'</td><td>'+sports[i%8]+'</td><td>'+min+'</td><td>'+kcal+'</td></tr>';
}
} else {
thead.innerHTML = '<tr><th>序号</th><th>记录时间</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th></tr>';
for(var i=0;i<rows;i++){
var d = new Date(); d.setDate(d.getDate() - Math.floor(Math.random()*30));
var ds = d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);
var h = 6+Math.floor(Math.random()*16), m = Math.floor(Math.random()*60);
var time = ds+' '+('0'+h).slice(-2)+':'+('0'+m).slice(-2);
var height = [170,175,178,165,160,172,168,180][Math.floor(Math.random()*8)];
var weight = (60 + Math.random()*30).toFixed(1);
var bmi = (weight / ((height/100)*(height/100))).toFixed(1);
var fat = (15 + Math.random()*20).toFixed(1);
html += '<tr><td>'+(i+1)+'</td><td>'+time+'</td><td>'+height+'</td><td>'+weight+'</td><td>'+bmi+'</td><td>'+fat+'</td></tr>';
}
}
tbody.innerHTML = html;
document.getElementById('usageOverlay').classList.add('show');
}
function closeUsageDialog(){
document.getElementById('usageOverlay').classList.remove('show');
}
document.getElementById('usageOverlay').addEventListener('click',function(e){
if(e.target === this) closeUsageDialog();
});
function esc(s){ return String(s||'').replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }
</script>
</body>
</html>
@@ -207,109 +207,118 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>员工</th>
<th>员工编号</th>
<th>单位名称</th>
<th>部门名称</th>
<th>业务模块</th>
<th>异常指标</th>
<th>异常</th>
<th>异常等级</th>
<th>发现时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>张伟</td>
<td>EMP-10001</td>
<td>采油一厂</td>
<td>生产运行科</td>
<td>个人体重管理</td>
<td>BMI异常</td>
<td>28.5</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-14 10:30</td>
</tr>
<tr>
<td>李娜</td>
<td>EMP-10002</td>
<td>采油一厂</td>
<td>安全环保科</td>
<td>个人体重管理</td>
<td>体脂率异常</td>
<td>34.2%</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-13 14:22</td>
</tr>
<tr>
<td>王强</td>
<td>EMP-10003</td>
<td>采油二厂</td>
<td>综合管理科</td>
<td>个人体重管理</td>
<td>腰围异常</td>
<td>105 cm</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-12 09:15</td>
</tr>
<tr>
<td>赵敏</td>
<td>EMP-10004</td>
<td>采油二厂</td>
<td>生产运行科</td>
<td>计划管理</td>
<td>目标值偏差</td>
<td>距目标差8.5kg</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-11 16:45</td>
</tr>
<tr>
<td>刘洋</td>
<td>EMP-10005</td>
<td>采气一厂</td>
<td>安全环保科</td>
<td>过程管理</td>
<td>体重反弹</td>
<td>+3.2 kg30天)</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-10 11:20</td>
</tr>
<tr>
<td>孙磊</td>
<td>EMP-10101</td>
<td>采油一厂</td>
<td>生产运行科</td>
<td>个人体重管理</td>
<td>数据缺失</td>
<td>未设置目标</td>
<td><span class="tag tag-blue">轻微</span></td>
<td>2026-05-09 08:55</td>
</tr>
<tr>
<td>周婷</td>
<td>EMP-10102</td>
<td>采油二厂</td>
<td>安全环保科</td>
<td>个人体重管理</td>
<td>体重异常</td>
<td>80.2 kg</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-08 15:38</td>
</tr>
<tr>
<td>吴刚</td>
<td>EMP-10103</td>
<td>采气一厂</td>
<td>综合管理科</td>
<td>个人体重管理</td>
<td>BMI异常</td>
<td>32.1</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-07 10:12</td>
</tr>
<tr>
<thead>
<tr>
<th>序号</th>
<th>员工</th>
<th>员工编号</th>
<th>单位名称</th>
<th>部门名称</th>
<th>业务模块</th>
<th>异常指标</th>
<th>异常</th>
<th>异常等级</th>
<th>发现时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>张伟</td>
<td>EMP-10001</td>
<td>采油一厂</td>
<td>生产运行科</td>
<td>个人体重管理</td>
<td>BMI异常</td>
<td>28.5</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-14 10:30</td>
</tr>
<tr>
<td>2</td>
<td>李娜</td>
<td>EMP-10002</td>
<td>采油一厂</td>
<td>安全环保科</td>
<td>个人体重管理</td>
<td>体脂率异常</td>
<td>34.2%</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-13 14:22</td>
</tr>
<tr>
<td>3</td>
<td>王强</td>
<td>EMP-10003</td>
<td>采油二厂</td>
<td>综合管理科</td>
<td>个人体重管理</td>
<td>腰围异常</td>
<td>105 cm</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-12 09:15</td>
</tr>
<tr>
<td>4</td>
<td>赵敏</td>
<td>EMP-10004</td>
<td>采油二厂</td>
<td>生产运行科</td>
<td>计划管理</td>
<td>目标值偏差</td>
<td>距目标差8.5kg</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-11 16:45</td>
</tr>
<tr>
<td>5</td>
<td>刘洋</td>
<td>EMP-10005</td>
<td>采气一厂</td>
<td>安全环保科</td>
<td>过程管理</td>
<td>体重反弹</td>
<td>+3.2 kg30天)</td>
<td><span class="tag tag-orange">中等</span></td>
<td>2026-05-10 11:20</td>
</tr>
<tr>
<td>6</td>
<td>孙磊</td>
<td>EMP-10101</td>
<td>采油一厂</td>
<td>生产运行科</td>
<td>个人体重管理</td>
<td>数据缺失</td>
<td>未设置目标</td>
<td><span class="tag tag-blue">轻微</span></td>
<td>2026-05-09 08:55</td>
</tr>
<tr>
<td>7</td>
<td>周婷</td>
<td>EMP-10102</td>
<td>采油二厂</td>
<td>安全环保科</td>
<td>个人体重管理</td>
<td>体重异常</td>
<td>80.2 kg</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-08 15:38</td>
</tr>
<tr>
<td>8</td>
<td>吴刚</td>
<td>EMP-10103</td>
<td>采气一厂</td>
<td>综合管理科</td>
<td>个人体重管理</td>
<td>BMI异常</td>
<td>32.1</td>
<td><span class="tag tag-red">严重</span></td>
<td>2026-05-07 10:12</td>
</tr>
<tr>
<td>陈静</td>
<td>EMP-10104</td>
<td>天然气处理厂</td>
@@ -168,108 +168,117 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>业务模块</th>
<th>异常类型</th>
<th>异常描述</th>
<th>异常检测时间</th>
<th>表名</th>
<th>字段</th>
<th>编号</th>
<th>异常值</th>
<th>数据产生时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>档案管理</td>
<td><span class="tag tag-red">数据缺失</span></td>
<td>员工身高字段为空,无法计算BMI指标</td>
<td>2026-05-14 09:23</td>
<td>t_weight_archive</td>
<td>height</td>
<td>WA-20260514-0087</td>
<td class="val-error">NULL</td>
<td>2026-05-14 08:10</td>
</tr>
<tr>
<td>计划管理</td>
<td><span class="tag tag-orange">格式错误</span></td>
<td>目标起止日期格式非法,无法解析为有效日期范围</td>
<td>2026-05-13 14:56</td>
<td>t_weight_plan</td>
<td>target_date_range</td>
<td>WP-20260513-0045</td>
<td class="val-error">2026/05/13-2026/05</td>
<td>2026-05-13 14:30</td>
</tr>
<tr>
<td>个人体重管理</td>
<td><span class="tag tag-red">范围越界</span></td>
<td>BMI值超出合理范围(0-50),数据异常</td>
<td>2026-05-12 11:22</td>
<td>t_weight_target</td>
<td>bmi</td>
<td>WT-20260512-0156</td>
<td class="val-error">85.3</td>
<td>2026-05-12 10:45</td>
</tr>
<tr>
<td>过程管理</td>
<td><span class="tag tag-orange">逻辑矛盾</span></td>
<td>运动消耗卡路里为负值,与打卡记录冲突</td>
<td>2026-05-11 16:34</td>
<td>t_weight_action</td>
<td>calories_burned</td>
<td>WA-20260511-0234</td>
<td class="val-error">-150</td>
<td>2026-05-11 16:00</td>
</tr>
<tr>
<td>报名管理</td>
<td><span class="tag tag-blue">重复数据</span></td>
<td>同一员工同一活动出现重复报名记录</td>
<td>2026-05-10 13:45</td>
<td>t_weight_registration</td>
<td>employee_id</td>
<td>WR-20260510-0089</td>
<td class="val-error">EMP-10001</td>
<td>2026-05-10 13:20</td>
</tr>
<tr>
<td>设备管理</td>
<td><span class="tag tag-red">关联缺失</span></td>
<td>设备绑定记录缺少对应员工档案信息</td>
<td>2026-05-09 10:12</td>
<td>t_device_binding</td>
<td>employee_id</td>
<td>DB-20260509-0032</td>
<td class="val-error">EMP-99999</td>
<td>2026-05-09 09:45</td>
</tr>
<tr>
<td>历史干预</td>
<td><span class="tag tag-orange">格式错误</span></td>
<td>干预记录时间戳格式不符合标准ISO格式</td>
<td>2026-05-08 15:38</td>
<td>t_intervention_history</td>
<td>intervention_time</td>
<td>IH-20260508-0067</td>
<td class="val-error">2026年5月8日 15:30</td>
<td>2026-05-08 15:30</td>
</tr>
<tr>
<td>个人体重管理</td>
<td><span class="tag tag-red">数据缺失</span></td>
<td>腰围测量数据缺失,目标对比不完整</td>
<td>2026-05-07 08:55</td>
<td>t_weight_target</td>
<td>waist</td>
<td>WT-20260507-0123</td>
<td class="val-error">NULL</td>
<td>2026-05-07 08:30</td>
</tr>
<thead>
<tr>
<th>序号</th>
<th>业务模块</th>
<th>异常类型</th>
<th>异常描述</th>
<th>异常检测时间</th>
<th></th>
<th>字段名</th>
<th>编号</th>
<th>异常值</th>
<th>数据产生时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>档案管理</td>
<td><span class="tag tag-red">数据缺失</span></td>
<td>员工身高字段为空,无法计算BMI指标</td>
<td>2026-05-14 09:23</td>
<td>t_weight_archive</td>
<td>height</td>
<td>WA-20260514-0087</td>
<td class="val-error">NULL</td>
<td>2026-05-14 08:10</td>
</tr>
<tr>
<td>2</td>
<td>计划管理</td>
<td><span class="tag tag-orange">格式错误</span></td>
<td>目标起止日期格式非法,无法解析为有效日期范围</td>
<td>2026-05-13 14:56</td>
<td>t_weight_plan</td>
<td>target_date_range</td>
<td>WP-20260513-0045</td>
<td class="val-error">2026/05/13-2026/05</td>
<td>2026-05-13 14:30</td>
</tr>
<tr>
<td>3</td>
<td>个人体重管理</td>
<td><span class="tag tag-red">范围越界</span></td>
<td>BMI值超出合理范围(0-50),数据异常</td>
<td>2026-05-12 11:22</td>
<td>t_weight_target</td>
<td>bmi</td>
<td>WT-20260512-0156</td>
<td class="val-error">85.3</td>
<td>2026-05-12 10:45</td>
</tr>
<tr>
<td>4</td>
<td>过程管理</td>
<td><span class="tag tag-orange">逻辑矛盾</span></td>
<td>运动消耗卡路里为负值,与打卡记录冲突</td>
<td>2026-05-11 16:34</td>
<td>t_weight_action</td>
<td>calories_burned</td>
<td>WA-20260511-0234</td>
<td class="val-error">-150</td>
<td>2026-05-11 16:00</td>
</tr>
<tr>
<td>5</td>
<td>报名管理</td>
<td><span class="tag tag-blue">重复数据</span></td>
<td>同一员工同一活动出现重复报名记录</td>
<td>2026-05-10 13:45</td>
<td>t_weight_registration</td>
<td>employee_id</td>
<td>WR-20260510-0089</td>
<td class="val-error">EMP-10001</td>
<td>2026-05-10 13:20</td>
</tr>
<tr>
<td>6</td>
<td>设备管理</td>
<td><span class="tag tag-red">关联缺失</span></td>
<td>设备绑定记录缺少对应员工档案信息</td>
<td>2026-05-09 10:12</td>
<td>t_device_binding</td>
<td>employee_id</td>
<td>DB-20260509-0032</td>
<td class="val-error">EMP-99999</td>
<td>2026-05-09 09:45</td>
</tr>
<tr>
<td>7</td>
<td>历史干预</td>
<td><span class="tag tag-orange">格式错误</span></td>
<td>干预记录时间戳格式不符合标准ISO格式</td>
<td>2026-05-08 15:38</td>
<td>t_intervention_history</td>
<td>intervention_time</td>
<td>IH-20260508-0067</td>
<td class="val-error">2026年5月8日 15:30</td>
<td>2026-05-08 15:30</td>
</tr>
<tr>
<td>8</td>
<td>个人体重管理</td>
<td><span class="tag tag-red">数据缺失</span></td>
<td>腰围测量数据缺失,目标对比不完整</td>
<td>2026-05-07 08:55</td>
<td>t_weight_target</td>
<td>waist</td>
<td>WT-20260507-0123</td>
<td class="val-error">NULL</td>
<td>2026-05-07 08:30</td>
</tr>
<tr>
<td>计划管理</td>
<td><span class="tag tag-red">范围越界</span></td>
+8 -8
View File
@@ -150,14 +150,14 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>FT-2024-001</td><td>体脂仪A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>FT-2024-002</td><td>体脂仪A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>FT-2024-003</td><td>体脂仪B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>FT-2024-004</td><td>体脂仪B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>FT-2024-005</td><td>体脂仪C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
<thead><tr><th>序号</th><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>1</td><td>FT-2024-001</td><td>体脂仪A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>2</td><td>FT-2024-002</td><td>体脂仪A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>3</td><td>FT-2024-003</td><td>体脂仪B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>4</td><td>FT-2024-004</td><td>体脂仪B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>5</td><td>FT-2024-005</td><td>体脂仪C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -197,15 +197,15 @@
<table>
<thead>
<tr>
<th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th colspan="8">监测数据</th><th rowspan="2">更多信息</th>
</tr>
<tr><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>蛋白质量(kg)</th></tr>
</thead>
<tbody>
<tr><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td>38.6</td><td>8.5</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","InBody评分(分)":"62"},"体脂分析":{"体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0","内脏脂肪等级":"-","肥胖度(%)":"147","去脂体重(kg)":"59.6"},"体成分":{"体水分(L)":"43.7","蛋白质(kg)":"11.8","无机盐(kg)":"4.11","骨骼肌量(kg)":"33.6","骨骼肌指数(kg)":"8.8"},"体重管理":{"目标体重(kg)":"70.2","体重控制(kg)":"-23.1","脂肪控制(kg)":"-23.1","肌肉控制(kg)":"0.0","腰臀比(%)":"0.98"},"节段脂肪":{"左上肢(kg)":"2.7","左下肢(kg)":"4.7","右上肢(kg)":"2.6","右下肢(kg)":"4.8","躯干(kg)":"17.5"},"节段肌肉":{"左上肢(kg)":"3.35","左下肢(kg)":"9.11","右上肢(kg)":"3.5","右下肢(kg)":"9.4","躯干(kg)":"26.9"}}'>查看</a></td></tr>
<tr><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td>28.6</td><td>6.2</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","InBody评分(分)":"75"},"体脂分析":{"体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1","内脏脂肪等级":"-","肥胖度(%)":"105","去脂体重(kg)":"41.2"},"体成分":{"体水分(L)":"30.2","蛋白质(kg)":"8.1","无机盐(kg)":"2.95","骨骼肌量(kg)":"22.4","骨骼肌指数(kg)":"6.2"},"体重管理":{"目标体重(kg)":"52.0","体重控制(kg)":"-3.0","脂肪控制(kg)":"-5.8","肌肉控制(kg)":"2.8","腰臀比(%)":"0.82"},"节段脂肪":{"左上肢(kg)":"1.5","左下肢(kg)":"3.2","右上肢(kg)":"1.4","右下肢(kg)":"3.1","躯干(kg)":"4.6"},"节段肌肉":{"左上肢(kg)":"2.1","左下肢(kg)":"6.8","右上肢(kg)":"2.2","右下肢(kg)":"7.0","躯干(kg)":"18.5"}}'>查看</a></td></tr>
<tr><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td>40.2</td><td>9.1</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","InBody评分(分)":"58"},"体脂分析":{"体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0","内脏脂肪等级":"12","肥胖度(%)":"125","去脂体重(kg)":"58.5"},"体成分":{"体水分(L)":"42.1","蛋白质(kg)":"11.2","无机盐(kg)":"3.88","骨骼肌量(kg)":"31.8","骨骼肌指数(kg)":"8.2"},"体重管理":{"目标体重(kg)":"68.0","体重控制(kg)":"-10.0","脂肪控制(kg)":"-12.5","肌肉控制(kg)":"2.5","腰臀比(%)":"0.92"},"节段脂肪":{"左上肢(kg)":"2.4","左下肢(kg)":"4.2","右上肢(kg)":"2.3","右下肢(kg)":"4.3","躯干(kg)":"6.3"},"节段肌肉":{"左上肢(kg)":"3.2","左下肢(kg)":"8.9","右上肢(kg)":"3.3","右下肢(kg)":"9.1","躯干(kg)":"25.2"}}'>查看</a></td></tr>
<tr><td>1</td><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td>38.6</td><td>8.5</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","InBody评分(分)":"62"},"体脂分析":{"体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0","内脏脂肪等级":"-","肥胖度(%)":"147","去脂体重(kg)":"59.6"},"体成分":{"体水分(L)":"43.7","蛋白质(kg)":"11.8","无机盐(kg)":"4.11","骨骼肌量(kg)":"33.6","骨骼肌指数(kg)":"8.8"},"体重管理":{"目标体重(kg)":"70.2","体重控制(kg)":"-23.1","脂肪控制(kg)":"-23.1","肌肉控制(kg)":"0.0","腰臀比(%)":"0.98"},"节段脂肪":{"左上肢(kg)":"2.7","左下肢(kg)":"4.7","右上肢(kg)":"2.6","右下肢(kg)":"4.8","躯干(kg)":"17.5"},"节段肌肉":{"左上肢(kg)":"3.35","左下肢(kg)":"9.11","右上肢(kg)":"3.5","右下肢(kg)":"9.4","躯干(kg)":"26.9"}}'>查看</a></td></tr>
<tr><td>2</td><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td>28.6</td><td>6.2</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","InBody评分(分)":"75"},"体脂分析":{"体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1","内脏脂肪等级":"-","肥胖度(%)":"105","去脂体重(kg)":"41.2"},"体成分":{"体水分(L)":"30.2","蛋白质(kg)":"8.1","无机盐(kg)":"2.95","骨骼肌量(kg)":"22.4","骨骼肌指数(kg)":"6.2"},"体重管理":{"目标体重(kg)":"52.0","体重控制(kg)":"-3.0","脂肪控制(kg)":"-5.8","肌肉控制(kg)":"2.8","腰臀比(%)":"0.82"},"节段脂肪":{"左上肢(kg)":"1.5","左下肢(kg)":"3.2","右上肢(kg)":"1.4","右下肢(kg)":"3.1","躯干(kg)":"4.6"},"节段肌肉":{"左上肢(kg)":"2.1","左下肢(kg)":"6.8","右上肢(kg)":"2.2","右下肢(kg)":"7.0","躯干(kg)":"18.5"}}'>查看</a></td></tr>
<tr><td>3</td><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td>40.2</td><td>9.1</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","InBody评分(分)":"58"},"体脂分析":{"体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0","内脏脂肪等级":"12","肥胖度(%)":"125","去脂体重(kg)":"58.5"},"体成分":{"体水分(L)":"42.1","蛋白质(kg)":"11.2","无机盐(kg)":"3.88","骨骼肌量(kg)":"31.8","骨骼肌指数(kg)":"8.2"},"体重管理":{"目标体重(kg)":"68.0","体重控制(kg)":"-10.0","脂肪控制(kg)":"-12.5","肌肉控制(kg)":"2.5","腰臀比(%)":"0.92"},"节段脂肪":{"左上肢(kg)":"2.4","左下肢(kg)":"4.2","右上肢(kg)":"2.3","右下肢(kg)":"4.3","躯干(kg)":"6.3"},"节段肌肉":{"左上肢(kg)":"3.2","左下肢(kg)":"8.9","右上肢(kg)":"3.3","右下肢(kg)":"9.1","躯干(kg)":"25.2"}}'>查看</a></td></tr>
</tbody>
</table>
</div>
@@ -228,14 +228,14 @@
<table>
<thead>
<tr>
<th rowspan="2">姓名</th><th rowspan="2">使用时间</th>
<th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">使用时间</th>
<th colspan="8">监测数据</th><th rowspan="2">更多信息</th>
</tr>
<tr><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>蛋白质量(kg)</th></tr>
</thead>
<tbody>
<tr><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>23.0</td><td>1,450</td><td>14.3</td><td>22.0</td><td>34.5</td><td>7.8</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"168","体重(kg)":"65.0","BMI":"23.0","基础代谢":"1,450","InBody评分(分)":"68"},"体脂分析":{"体脂肪量(kg)":"14.3","体脂肪率(%)":"22.0","内脏脂肪等级":"-","肥胖度(%)":"112","去脂体重(kg)":"50.7"},"体成分":{"体水分(L)":"36.8","蛋白质(kg)":"9.8","无机盐(kg)":"3.42","骨骼肌量(kg)":"28.5","骨骼肌指数(kg)":"7.5"},"体重管理":{"目标体重(kg)":"62.0","体重控制(kg)":"-3.0","脂肪控制(kg)":"-5.3","肌肉控制(kg)":"2.3","腰臀比(%)":"0.86"},"节段脂肪":{"左上肢(kg)":"1.8","左下肢(kg)":"3.5","右上肢(kg)":"1.7","右下肢(kg)":"3.4","躯干(kg)":"3.9"},"节段肌肉":{"左上肢(kg)":"2.8","左下肢(kg)":"7.8","右上肢(kg)":"2.9","右下肢(kg)":"8.0","躯干(kg)":"22.1"}}'>查看</a></td></tr>
<tr><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>26.2</td><td>1,750</td><td>20.4</td><td>24.0</td><td>44.2</td><td>10.2</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"180","体重(kg)":"85.0","BMI":"26.2","基础代谢":"1,750","InBody评分(分)":"55"},"体脂分析":{"体脂肪量(kg)":"20.4","体脂肪率(%)":"24.0","内脏脂肪等级":"10","肥胖度(%)":"130","去脂体重(kg)":"64.6"},"体成分":{"体水分(L)":"46.5","蛋白质(kg)":"12.4","无机盐(kg)":"4.35","骨骼肌量(kg)":"35.2","骨骼肌指数(kg)":"9.2"},"体重管理":{"目标体重(kg)":"75.0","体重控制(kg)":"-10.0","脂肪控制(kg)":"-13.4","肌肉控制(kg)":"3.4","腰臀比(%)":"0.95"},"节段脂肪":{"左上肢(kg)":"2.5","左下肢(kg)":"4.5","右上肢(kg)":"2.4","右下肢(kg)":"4.6","躯干(kg)":"6.4"},"节段肌肉":{"左上肢(kg)":"3.5","左下肢(kg)":"9.5","右上肢(kg)":"3.6","右下肢(kg)":"9.7","躯干(kg)":"27.8"}}'>查看</a></td></tr>
<tr><td>1</td><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>23.0</td><td>1,450</td><td>14.3</td><td>22.0</td><td>34.5</td><td>7.8</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"168","体重(kg)":"65.0","BMI":"23.0","基础代谢":"1,450","InBody评分(分)":"68"},"体脂分析":{"体脂肪量(kg)":"14.3","体脂肪率(%)":"22.0","内脏脂肪等级":"-","肥胖度(%)":"112","去脂体重(kg)":"50.7"},"体成分":{"体水分(L)":"36.8","蛋白质(kg)":"9.8","无机盐(kg)":"3.42","骨骼肌量(kg)":"28.5","骨骼肌指数(kg)":"7.5"},"体重管理":{"目标体重(kg)":"62.0","体重控制(kg)":"-3.0","脂肪控制(kg)":"-5.3","肌肉控制(kg)":"2.3","腰臀比(%)":"0.86"},"节段脂肪":{"左上肢(kg)":"1.8","左下肢(kg)":"3.5","右上肢(kg)":"1.7","右下肢(kg)":"3.4","躯干(kg)":"3.9"},"节段肌肉":{"左上肢(kg)":"2.8","左下肢(kg)":"7.8","右上肢(kg)":"2.9","右下肢(kg)":"8.0","躯干(kg)":"22.1"}}'>查看</a></td></tr>
<tr><td>2</td><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>26.2</td><td>1,750</td><td>20.4</td><td>24.0</td><td>44.2</td><td>10.2</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"180","体重(kg)":"85.0","BMI":"26.2","基础代谢":"1,750","InBody评分(分)":"55"},"体脂分析":{"体脂肪量(kg)":"20.4","体脂肪率(%)":"24.0","内脏脂肪等级":"10","肥胖度(%)":"130","去脂体重(kg)":"64.6"},"体成分":{"体水分(L)":"46.5","蛋白质(kg)":"12.4","无机盐(kg)":"4.35","骨骼肌量(kg)":"35.2","骨骼肌指数(kg)":"9.2"},"体重管理":{"目标体重(kg)":"75.0","体重控制(kg)":"-10.0","脂肪控制(kg)":"-13.4","肌肉控制(kg)":"3.4","腰臀比(%)":"0.95"},"节段脂肪":{"左上肢(kg)":"2.5","左下肢(kg)":"4.5","右上肢(kg)":"2.4","右下肢(kg)":"4.6","躯干(kg)":"6.4"},"节段肌肉":{"左上肢(kg)":"3.5","左下肢(kg)":"9.5","右上肢(kg)":"3.6","右下肢(kg)":"9.7","躯干(kg)":"27.8"}}'>查看</a></td></tr>
</tbody>
</table>
</div>
+11 -11
View File
@@ -136,17 +136,17 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr>
<th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>智能体脂仪A01</td><td>FT-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td>48</td><td>205</td><td>1,230</td><td>3,420</td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体脂仪A02</td><td>FT-2024-002</td><td>采油一厂</td><td>健身房</td><td>76</td><td>312</td><td>1,890</td><td>4,680</td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体脂仪B01</td><td>FT-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td>38</td><td>162</td><td>920</td><td>1,985</td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体脂仪B02</td><td>FT-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td>27</td><td>128</td><td>756</td><td>1,650</td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体脂仪C01</td><td>FT-2024-005</td><td>采气厂</td><td>综合楼1层</td><td>59</td><td>256</td><td>1,520</td><td>3,780</td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
</tbody>
<thead><tr>
<th>序号</th><th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>1</td><td>智能体脂仪A01</td><td>FT-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td><a class="link" href="fat-monitor-detail.html?period=week">48</a></td><td><a class="link" href="fat-monitor-detail.html?period=month">205</a></td><td><a class="link" href="fat-monitor-detail.html?period=year">1,230</a></td><td><a class="link" href="fat-monitor-detail.html?period=all">3,420</a></td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>2</td><td>智能体脂仪A02</td><td>FT-2024-002</td><td>采油一厂</td><td>健身房</td><td><a class="link" href="fat-monitor-detail.html?period=week">76</a></td><td><a class="link" href="fat-monitor-detail.html?period=month">312</a></td><td><a class="link" href="fat-monitor-detail.html?period=year">1,890</a></td><td><a class="link" href="fat-monitor-detail.html?period=all">4,680</a></td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>3</td><td>智能体脂仪B01</td><td>FT-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td><a class="link" href="fat-monitor-detail.html?period=week">38</a></td><td><a class="link" href="fat-monitor-detail.html?period=month">162</a></td><td><a class="link" href="fat-monitor-detail.html?period=year">920</a></td><td><a class="link" href="fat-monitor-detail.html?period=all">1,985</a></td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>4</td><td>智能体脂仪B02</td><td>FT-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td><a class="link" href="fat-monitor-detail.html?period=week">27</a></td><td><a class="link" href="fat-monitor-detail.html?period=month">128</a></td><td><a class="link" href="fat-monitor-detail.html?period=year">756</a></td><td><a class="link" href="fat-monitor-detail.html?period=all">1,650</a></td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
<tr><td>5</td><td>智能体脂仪C01</td><td>FT-2024-005</td><td>采气厂</td><td>综合楼1层</td><td><a class="link" href="fat-monitor-detail.html?period=week">59</a></td><td><a class="link" href="fat-monitor-detail.html?period=month">256</a></td><td><a class="link" href="fat-monitor-detail.html?period=year">1,520</a></td><td><a class="link" href="fat-monitor-detail.html?period=all">3,780</a></td><td><a class="link" href="fat-monitor-detail.html">数据明细</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -197,7 +197,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>餐次</th><th>摄入热量(千卡)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>餐次</th><th>摄入热量(千卡)</th><th>来源</th></tr>
</thead>
<tbody id="dietBody"></tbody>
</table>
@@ -215,7 +215,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>运动类型</th><th>运动时长/数据</th><th>消耗热量(千卡)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>运动类型</th><th>运动时长/数据</th><th>消耗热量(千卡)</th><th>来源</th></tr>
</thead>
<tbody id="sportBody"></tbody>
</table>
@@ -233,7 +233,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead>
<tr><th>时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>来源</th></tr>
<tr><th>序号</th><th>时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>来源</th></tr>
</thead>
<tbody id="weightBody"></tbody>
</table>
@@ -379,15 +379,16 @@ function renderDiet(){
document.getElementById('dietPageNum').textContent = '第 ' + (dietPage + 1) + '/' + totalPages + ' 页';
var srcTag = {智记:'tag-green',自记:'tag-gray'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.meal+'</td>';
html += '<td>'+d.calories+'</td>';
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="4" style="text-align:center;padding:48px 0;color:#999;">暂无饮食记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="5" style="text-align:center;padding:48px 0;color:#999;">暂无饮食记录</td></tr>';
}
function dietGoPage(delta){
@@ -408,8 +409,9 @@ function renderSport(){
document.getElementById('sportPageNum').textContent = '第 ' + (sportPage + 1) + '/' + totalPages + ' 页';
var srcTag = {穿戴:'tag-blue',微信:'tag-green',自记:'tag-gray',器械:'tag-orange'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.type+'</td>';
html += '<td>'+d.data+'</td>';
@@ -417,7 +419,7 @@ function renderSport(){
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="5" style="text-align:center;padding:48px 0;color:#999;">暂无运动记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="6" style="text-align:center;padding:48px 0;color:#999;">暂无运动记录</td></tr>';
}
function sportGoPage(delta){
@@ -438,8 +440,9 @@ function renderWeight(){
document.getElementById('weightPageNum').textContent = '第 ' + (weightPage + 1) + '/' + totalPages + ' 页';
var srcTag = {身高秤:'tag-blue',体脂仪:'tag-orange',蓝牙称:'tag-green',自记:'tag-gray'};
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+d.time+'</td>';
html += '<td>'+d.weight.toFixed(1)+'</td>';
html += '<td>'+d.bmi.toFixed(1)+'</td>';
@@ -448,7 +451,7 @@ function renderWeight(){
html += '<td><span class="tag '+ (srcTag[d.source]||'tag-gray') +'">'+d.source+'</span></td>';
html += '</tr>';
});
tbody.innerHTML = html || '<tr><td colspan="6" style="text-align:center;padding:48px 0;color:#999;">暂无体重记录</td></tr>';
tbody.innerHTML = html || '<tr><td colspan="7" style="text-align:center;padding:48px 0;color:#999;">暂无体重记录</td></tr>';
}
function weightGoPage(delta){
@@ -80,9 +80,9 @@ tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 第一列(姓名)固定左侧 — 仅第一行表头(避免rowspan第二行误匹配) */
thead tr:first-child th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:2px 0 6px rgba(0,0,0,0.08);}
thead tr:first-child th:nth-child(1){z-index:8;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
thead tr:first-child th:nth-child(2),tbody td:nth-child(2){position:sticky;left:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:2px 0 6px rgba(0,0,0,0.08);}
thead tr:first-child th:nth-child(2){z-index:8;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 最后一列(详细数据)固定右侧 — 仅第一行表头(避免rowspan第二行误匹配到"变化"列) */
thead tr:first-child th:last-child,tbody td:last-child{position:sticky;right:0;z-index:5;background:#fff;min-width:80px;max-width:80px;box-shadow:-2px 0 6px rgba(0,0,0,0.08);}
@@ -218,6 +218,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
<table>
<thead>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">姓名</th>
<th rowspan="2">员工编号</th>
<th rowspan="2">性别</th>
@@ -409,16 +410,17 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="22" class="td-empty">暂无匹配数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="23" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
var wCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
var waCls = d.waistChange < 0 ? 'change-down' : (d.waistChange > 0 ? 'change-up' : 'change-zero');
html += '<tr>';
html += '<td>'+(start+i+1)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
@@ -467,7 +467,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table style="min-width:2600px;">
<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>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始体脂(%)</th><th>初始腰围(cm)</th>
<th>目标体重(kg)</th><th>目标BMI</th><th>目标体脂(%)</th><th>目标腰围(cm)</th>
<th>现体重(kg)</th><th>现BMI</th><th>现体脂(%)</th><th>现腰围(cm)</th>
@@ -514,7 +514,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead><tr>
<th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>单位</th><th>部门</th>
<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>单位</th><th>部门</th>
<th class="th-sortable" id="sortCount" onclick="toggleActSort()">打卡次数 <span class="sort-arrow"></span></th>
<th>首次记录日期</th><th>末次记录日期</th>
</tr></thead>
@@ -584,7 +584,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table style="min-width:4200px;">
<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>身高<br>(cm)</th><th>初始<br>体重(kg)</th><th>初始<br>BMI</th><th>初始<br>体脂(%)</th><th>初始<br>腰围(cm)</th>
<th>目标<br>体重(kg)</th><th>目标<br>BMI</th><th>目标<br>体脂(%)</th><th>目标<br>腰围(cm)</th>
@@ -633,7 +633,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table style="min-width:2000px;">
<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>初始BMI</th><th>现体重</th><th>现BMI</th>
<th>体重变化(kg)</th><th>减重率(%)</th><th>BMI变化</th>
<th>综合得分</th><th>行动得分</th>
@@ -680,7 +680,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead><tr>
<th>单位</th><th>参与人数</th><th>人均减重量(kg)</th><th>人均减重率</th>
<th>序号</th><th>单位</th><th>参与人数</th><th>人均减重量(kg)</th><th>人均减重率</th>
<th>人均综合得分</th><th>人均行动得分</th>
<th>减重量排名</th><th>减重率排名</th><th>综合分排名</th><th>行动分排名</th>
</tr></thead>
@@ -698,7 +698,7 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead><tr>
<th>单位</th><th>部门</th><th>参与人数</th><th>人均减重量(kg)</th><th>人均减重率</th>
<th>序号</th><th>单位</th><th>部门</th><th>参与人数</th><th>人均减重量(kg)</th><th>人均减重率</th>
<th>人均综合得分</th><th>人均行动得分</th>
<th>减重量排名</th><th>减重率排名</th><th>综合分排名</th><th>行动分排名</th>
</tr></thead>
@@ -810,7 +810,7 @@ tbody tr:hover{background:#F8FBFF;}
<table class="emp-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>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>大病信息</th>
</tr>
</thead>
@@ -1090,7 +1090,7 @@ function renderRegTable(){
// 构表头
var headHTML = '<thead><tr>';
headHTML += '<th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th>';
headHTML += '<th>序号</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th>';
headHTML += '<th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始腰围(cm)</th><th>初始体脂(%)</th>';
if(regStatus >= 1){ headHTML += '<th>目标体重(kg)</th><th>目标BMI</th><th>目标腰围(cm)</th><th>目标体脂(%)</th><th>提交时间</th>'; }
if(regStatus >= 2){ headHTML += '<th>审核时间</th>'; }
@@ -1099,12 +1099,12 @@ function renderRegTable(){
var bodyHTML = '<tbody>';
if(regFilteredData.length === 0){
var colSpan = 11 + (regStatus >= 1 ? 5 : 0) + (regStatus >= 2 ? 1 : 0) + (regStatus >= 3 ? 2 : 0);
var colSpan = 12 + (regStatus >= 1 ? 5 : 0) + (regStatus >= 2 ? 1 : 0) + (regStatus >= 3 ? 2 : 0);
bodyHTML += '<tr><td colspan="'+colSpan+'" class="td-empty">暂无匹配数据</td></tr>';
} else {
pageData.forEach(function(d){
pageData.forEach(function(d,i){
bodyHTML += '<tr>';
bodyHTML += '<td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td>';
bodyHTML += '<td>'+(i+1)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td>';
bodyHTML += '<td>'+esc(d.org)+'</td><td>'+esc(d.dept)+'</td>';
bodyHTML += '<td>'+d.height+'</td><td>'+d.weight+'</td><td>'+d.bmi.toFixed(1)+'</td><td>'+d.waist+'</td><td>'+d.fat.toFixed(1)+'</td>';
if(regStatus >= 1){ bodyHTML += '<td>'+d.targetWeight+'</td><td>'+d.targetBmi+'</td><td>'+d.targetWaist+'</td><td>'+d.targetFat+'</td><td>'+esc(d.submitTime)+'</td>'; }
@@ -1326,15 +1326,15 @@ function renderActTable0(){
var tp = Math.ceil(actFiltered0.length / actPageSize) || 1;
document.getElementById('actPageInfo0').textContent = '显示 '+pd.length+' 条,共 '+actFiltered0.length+' 条记录';
document.getElementById('actPageNum0').textContent = '第 '+(actPage[0]+1)+'/'+tp+' 页';
if(actFiltered0.length === 0){ tbody.innerHTML = '<tr><td colspan="28" class="td-empty">暂无数据</td></tr>'; return; }
if(actFiltered0.length === 0){ tbody.innerHTML = '<tr><td colspan="29" class="td-empty">暂无数据</td></tr>'; return; }
var html = '';
pd.forEach(function(d){
pd.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
var wacCls = d.waistChange < 0 ? 'change-down' : (d.waistChange > 0 ? 'change-up' : 'change-zero');
html += '<tr>';
html += '<td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+d.height+'</td><td>'+d.initWeight+'</td><td>'+d.initBmi+'</td><td>'+d.initFat+'</td><td>'+d.initWaist+'</td>';
html += '<td>'+d.targetWeight+'</td><td>'+d.targetBmi+'</td><td>'+d.targetFat+'</td><td>'+d.targetWaist+'</td>';
html += '<td>'+d.curWeight+'</td><td>'+d.curBmi+'</td><td>'+d.curFat+'</td><td>'+d.curWaist+'</td>';
@@ -1356,11 +1356,11 @@ function renderActTable1(){
var tp = Math.ceil(actFiltered1.length / actPageSize) || 1;
document.getElementById('actPageInfo1').textContent = '显示 '+pd.length+' 条,共 '+actFiltered1.length+' 条记录';
document.getElementById('actPageNum1').textContent = '第 '+(actPage[1]+1)+'/'+tp+' 页';
if(actFiltered1.length === 0){ tbody.innerHTML = '<tr><td colspan="10" class="td-empty">暂无数据</td></tr>'; return; }
if(actFiltered1.length === 0){ tbody.innerHTML = '<tr><td colspan="11" class="td-empty">暂无数据</td></tr>'; return; }
var html = '';
pd.forEach(function(d){
pd.forEach(function(d,i){
html += '<tr>';
html += '<td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+d.count+'</td><td>'+d.firstDate+'</td><td>'+d.lastDate+'</td>';
html += '</tr>';
});
@@ -1593,14 +1593,14 @@ function closeSeriousModal(){
function renderSeriousTable(data){
var html = '';
data.forEach(function(e){
data.forEach(function(e,i){
html += '<tr>';
html += '<td>'+esc(e.org)+'</td><td>'+esc(e.dept)+'</td><td>'+esc(e.name)+'</td><td>'+e.empId+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(e.org)+'</td><td>'+esc(e.dept)+'</td><td>'+esc(e.name)+'</td><td>'+e.empId+'</td>';
html += '<td>'+e.gender+'</td><td>'+e.age+'</td><td>'+e.height+'</td><td>'+e.weight+'</td><td>'+e.bmi.toFixed(1)+'</td>';
html += '<td><span style="color:#FA8C16;font-size:var(--font-xs);">'+esc(e.illness)+'</span></td>';
html += '</tr>';
});
document.getElementById('seriousTbody').innerHTML = html || '<tr><td colspan="10" class="emp-table__empty">暂无数据</td></tr>';
document.getElementById('seriousTbody').innerHTML = html || '<tr><td colspan="11" class="emp-table__empty">暂无数据</td></tr>';
document.getElementById('seriousTotalCount').textContent = data.length;
}
@@ -1773,12 +1773,12 @@ function renderPersonRankTable(){
var tp = Math.ceil(rankPersonFiltered.length / rankPageSize) || 1;
document.getElementById('rankPersonPageInfo').textContent = '显示 '+pd.length+' 条,共 '+rankPersonFiltered.length+' 条';
document.getElementById('rankPersonPageNum').textContent = '第 '+(rankPersonPage[0]+1)+'/'+tp+' 页';
if(pd.length===0){tbody.innerHTML='<tr><td colspan="19" class="td-empty">暂无数据</td></tr>';return;}
if(pd.length===0){tbody.innerHTML='<tr><td colspan="20" class="td-empty">暂无数据</td></tr>';return;}
var html='';
pd.forEach(function(d){
pd.forEach(function(d,i){
var wcCls = d.weightLoss<0?'change-down':(d.weightLoss>0?'change-up':'change-zero');
html += '<tr>';
html += '<td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+d.initWeight+'</td><td>'+d.initBmi+'</td><td>'+d.curWeight+'</td><td>'+d.curBmi+'</td>';
html += '<td class="'+wcCls+'">'+d.weightLoss+'</td><td>'+d.weightRate+'</td><td class="'+wcCls+'">'+d.bmiChange+'</td>';
html += '<td>'+d.compositeScore+'</td><td>'+d.actionScore+'</td>';
@@ -1794,11 +1794,11 @@ function renderRankUnitTable2(){
var tp = Math.ceil(rankUnitFiltered2.length / rankPageSize) || 1;
document.getElementById('rankUnitPageInfo2').textContent = '显示 '+pd.length+' 条,共 '+rankUnitFiltered2.length+' 条';
document.getElementById('rankUnitPageNum2').textContent = '第 '+(rankPersonPage[1]+1)+'/'+tp+' 页';
if(pd.length===0){tbody.innerHTML='<tr><td colspan="10" class="td-empty">暂无数据</td></tr>';return;}
if(pd.length===0){tbody.innerHTML='<tr><td colspan="11" class="td-empty">暂无数据</td></tr>';return;}
var html='';
pd.forEach(function(d){
pd.forEach(function(d,i){
html += '<tr>';
html += '<td>'+esc(d.unit)+'</td><td>'+d.count+'</td><td>'+d.avgWeightLoss+'</td><td>'+d.avgWeightRate+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.unit)+'</td><td>'+d.count+'</td><td>'+d.avgWeightLoss+'</td><td>'+d.avgWeightRate+'</td>';
html += '<td>'+d.avgScore+'</td><td>'+d.avgAction+'</td>';
html += '<td>'+d.weightLossRank+'</td><td>'+d.weightRateRank+'</td><td>'+d.compositeRank+'</td><td>'+d.actionRank+'</td>';
html += '</tr>';
@@ -1812,11 +1812,11 @@ function renderRankUnitTable3(){
var tp = Math.ceil(rankUnitFiltered3.length / rankPageSize) || 1;
document.getElementById('rankUnitPageInfo3').textContent = '显示 '+pd.length+' 条,共 '+rankUnitFiltered3.length+' 条';
document.getElementById('rankUnitPageNum3').textContent = '第 '+(rankPersonPage[2]+1)+'/'+tp+' 页';
if(pd.length===0){tbody.innerHTML='<tr><td colspan="11" class="td-empty">暂无数据</td></tr>';return;}
if(pd.length===0){tbody.innerHTML='<tr><td colspan="12" class="td-empty">暂无数据</td></tr>';return;}
var html='';
pd.forEach(function(d){
pd.forEach(function(d,i){
html += '<tr>';
html += '<td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td><td>'+d.count+'</td><td>'+d.avgWeightLoss+'</td><td>'+d.avgWeightRate+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td><td>'+d.count+'</td><td>'+d.avgWeightLoss+'</td><td>'+d.avgWeightRate+'</td>';
html += '<td>'+d.avgScore+'</td><td>'+d.avgAction+'</td>';
html += '<td>'+d.weightLossRank+'</td><td>'+d.weightRateRank+'</td><td>'+d.compositeRank+'</td><td>'+d.actionRank+'</td>';
html += '</tr>';
@@ -1983,9 +1983,9 @@ function renderOvTable(){
var tp = Math.ceil(ovFiltered.length / ovPageSize) || 1;
document.getElementById('ovPageInfo').textContent = '显示 ' + pd.length + ' 条,共 ' + ovFiltered.length + ' 条记录';
document.getElementById('ovPageNum').textContent = '第 ' + (ovPage + 1) + '/' + tp + ' 页';
if (ovFiltered.length === 0){ tbody.innerHTML = '<tr><td colspan="36" class="td-empty">暂无匹配数据</td></tr>'; return; }
if (ovFiltered.length === 0){ tbody.innerHTML = '<tr><td colspan="37" class="td-empty">暂无匹配数据</td></tr>'; return; }
var html = '';
pd.forEach(function(d){
pd.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
@@ -1995,7 +1995,7 @@ function renderOvTable(){
var fcSign = d.fatChange > 0 ? '+' : '';
var wacSign = d.waistChange > 0 ? '+' : '';
html += '<tr>';
html += '<td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td>';
html += '<td>'+(i+1)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td><td>'+d.gender+'</td><td>'+d.age+'</td>';
html += '<td>'+esc(d.unit)+'</td><td>'+esc(d.dept)+'</td>';
html += '<td>'+d.phone+'</td>';
html += '<td>'+d.height+'</td><td>'+d.initWeight+'</td><td>'+d.initBmi+'</td><td>'+d.initFat+'</td><td>'+d.initWaist+'</td>';
@@ -72,15 +72,20 @@ tbody td{padding:10px 7px;text-align:center;font-size:var(--font-sm);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 第一列(干预计划)固定左侧 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:4;background:#fff;min-width:240px;max-width:240px;text-align:left;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
/* 第一列(序号)固定左侧 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:5;background:#fff;min-width:52px;max-width:52px;text-align:center;}
thead th:nth-child(1){z-index:8;background:#FAFAFA;}
tbody tr:hover td:nth-child(1){background:#F8FBFF;}
/* 第二列(组织机构)固定左侧 */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:240px;z-index:3;background:#fff;min-width:120px;max-width:120px;}
thead th:nth-child(2){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 第二列(干预计划)固定左侧 */
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:52px;z-index:4;background:#fff;min-width:240px;max-width:240px;text-align:left;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:7;background:#FAFAFA;}
tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 第三列(组织机构)固定左侧 */
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:292px;z-index:3;background:#fff;min-width:120px;max-width:120px;}
thead th:nth-child(3){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
@@ -243,6 +248,7 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
<table>
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>组织机构</th>
<th>组织部门</th>
@@ -330,6 +336,7 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
<table>
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>员工编号</th>
<th>性别</th>
@@ -465,15 +472,16 @@ function renderTable(){
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="20" class="td-empty">暂无匹配数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="21" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
var lossCls = d.avgWeightLoss > 0 ? 'change-down' : (d.avgWeightLoss < 0 ? 'change-up' : 'change-zero');
var rateCls = d.avgLossRate > 0 ? 'change-down' : (d.avgLossRate < 0 ? 'change-up' : 'change-zero');
var waistCls = d.avgWaistLoss > 0 ? 'change-down' : (d.avgWaistLoss < 0 ? 'change-up' : 'change-zero');
html += '<tr>';
pageData.forEach(function(d,i){
var lossCls = d.avgWeightLoss > 0 ? 'change-down' : (d.avgWeightLoss < 0 ? 'change-up' : 'change-zero');
var rateCls = d.avgLossRate > 0 ? 'change-down' : (d.avgLossRate < 0 ? 'change-up' : 'change-zero');
var waistCls = d.avgWaistLoss > 0 ? 'change-down' : (d.avgWaistLoss < 0 ? 'change-up' : 'change-zero');
html += '<tr>';
html += '<td>'+(start+i+1)+'</td>';
// [交互] 干预计划蓝色链接,点击跳转至二级详情页 history-plan-detail.html
html += '<td><a class="link" href="history-plan-detail.html?id='+d.id+'">'+esc(d.planName)+'</a></td>';
html += '<td>'+esc(d.unit)+'</td>';
@@ -659,13 +667,14 @@ function renderStaffTable(){
document.getElementById('staffPageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + staffFilteredData.length + ' 条记录';
document.getElementById('staffPageNum').textContent = '第 ' + (staffCurrentPage + 1) + '/' + totalPages + ' 页';
if(staffFilteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="9" class="td-empty">暂无人员数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="10" class="td-empty">暂无人员数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
html += '<tr>';
html += '<td>'+esc(d.name)+'</td>';
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(staffCurrentPage*staffPageSize+i+1)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
html += '<td>'+d.age+'</td>';
@@ -158,6 +158,7 @@
<table>
<thead>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2" style="vertical-align:middle;" class="col-fixed-l1">姓名</th>
<th rowspan="2" style="vertical-align:middle;" class="col-fixed-l2">员工编号</th>
<th rowspan="2" style="vertical-align:middle;">性别</th>
@@ -182,6 +183,7 @@
<tbody>
<!-- 已设置目标的人员 -->
<tr>
<td>1</td>
<td class="col-fixed-l1">张伟</td><td class="col-fixed-l2">EMP-10001</td><td></td><td>35</td><td>采油一厂</td><td>生产运行科</td>
<td>2024-03-01 ~ 2024-09-01</td><td class="th-divider">184</td>
<td>175</td><td>85.0</td><td>27.8</td><td>26.5</td><td class="th-divider">96</td>
@@ -191,6 +193,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10001">查看</a></td>
</tr>
<tr>
<td>2</td>
<td class="col-fixed-l1">李娜</td><td class="col-fixed-l2">EMP-10002</td><td></td><td>28</td><td>采油一厂</td><td>安全环保科</td>
<td>2024-03-15 ~ 2024-09-15</td><td class="th-divider">184</td>
<td>163</td><td>68.5</td><td>25.8</td><td>32.0</td><td class="th-divider">82</td>
@@ -200,6 +203,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10002">查看</a></td>
</tr>
<tr>
<td>3</td>
<td class="col-fixed-l1">王强</td><td class="col-fixed-l2">EMP-10003</td><td></td><td>42</td><td>采油二厂</td><td>综合管理科</td>
<td>2024-04-01 ~ 2024-10-01</td><td class="th-divider">183</td>
<td>170</td><td>92.0</td><td>31.8</td><td>30.2</td><td class="th-divider">105</td>
@@ -209,6 +213,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10003">查看</a></td>
</tr>
<tr>
<td>4</td>
<td class="col-fixed-l1">赵敏</td><td class="col-fixed-l2">EMP-10004</td><td></td><td>31</td><td>采油二厂</td><td>生产运行科</td>
<td>2024-02-15 ~ 2024-08-15</td><td class="th-divider">182</td>
<td>160</td><td>62.0</td><td>24.2</td><td>28.5</td><td class="th-divider">78</td>
@@ -218,6 +223,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10004">查看</a></td>
</tr>
<tr>
<td>5</td>
<td class="col-fixed-l1">刘洋</td><td class="col-fixed-l2">EMP-10005</td><td></td><td>38</td><td>采气厂</td><td>安全环保科</td>
<td>2024-03-20 ~ 2024-09-20</td><td class="th-divider">184</td>
<td>178</td><td>88.5</td><td>27.9</td><td>27.8</td><td class="th-divider">100</td>
@@ -228,6 +234,7 @@
</tr>
<!-- 未设置目标的人员:目标周期/目标指标/初始指标/变化均显示"-",仅当前指标有实际称重数据 -->
<tr>
<td>6</td>
<td class="col-fixed-l1">孙磊</td><td class="col-fixed-l2">EMP-10101</td><td></td><td>29</td><td>采油一厂</td><td>生产运行科</td>
<td>-</td><td class="th-divider">-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td class="th-divider">-</td>
@@ -237,6 +244,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10101">查看</a></td>
</tr>
<tr>
<td>7</td>
<td class="col-fixed-l1">周婷</td><td class="col-fixed-l2">EMP-10102</td><td></td><td>33</td><td>采油二厂</td><td>安全环保科</td>
<td>-</td><td class="th-divider">-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td class="th-divider">-</td>
@@ -246,6 +254,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10102">查看</a></td>
</tr>
<tr>
<td>8</td>
<td class="col-fixed-l1">吴刚</td><td class="col-fixed-l2">EMP-10103</td><td></td><td>45</td><td>采气厂</td><td>综合管理科</td>
<td>-</td><td class="th-divider">-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td class="th-divider">-</td>
@@ -255,6 +264,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10103">查看</a></td>
</tr>
<tr>
<td>9</td>
<td class="col-fixed-l1">陈静</td><td class="col-fixed-l2">EMP-10104</td><td></td><td>26</td><td>采油一厂</td><td>综合管理科</td>
<td>-</td><td class="th-divider">-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td class="th-divider">-</td>
@@ -264,6 +274,7 @@
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10104">查看</a></td>
</tr>
<tr>
<td>10</td>
<td class="col-fixed-l1">郑飞</td><td class="col-fixed-l2">EMP-10105</td><td></td><td>40</td><td>采油二厂</td><td>生产运行科</td>
<td>-</td><td class="th-divider">-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td class="th-divider">-</td>
@@ -286,9 +286,10 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>日期</th>
<thead>
<tr>
<th>序号</th>
<th>日期</th>
<th>饮食记录(千卡)</th>
<th>运动记录(千卡)</th>
<th>体重(kg)</th>
@@ -592,13 +593,14 @@ function renderTable(){
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="8" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.date)+'</td>';
html += '<td>'+d.dietKcal+'</td>';
html += '<td>'+d.exerciseKcal+'</td>';
+7 -3
View File
@@ -578,6 +578,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
<table class="person-table">
<thead>
<tr>
<th>序号</th>
<th>单位</th>
<th>部门</th>
<th>姓名</th>
@@ -634,6 +635,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
<table class="person-table">
<thead>
<tr>
<th>序号</th>
<th>单位</th>
<th>姓名</th>
<th>所属医疗点</th>
@@ -1045,9 +1047,10 @@ function resetPersonFilter() {
/* 渲染人员表格 */
function renderPersonTable(data) {
var html = '';
data.forEach(function(p) {
data.forEach(function(p,i) {
var bmiClass = p.bmi >= 28 ? 'tag-orange' : (p.bmi >= 24 ? 'tag-blue' : 'tag-green');
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>' + esc(p.org) + '</td>';
html += '<td>' + esc(p.dept) + '</td>';
html += '<td>' + esc(p.name) + '</td>';
@@ -1061,7 +1064,7 @@ function renderPersonTable(data) {
html += '<td><a class="link" style="color:var(--danger);" onclick="removePerson(\'' + p.empId + '\')">移除</a></td>';
html += '</tr>';
});
document.getElementById('personTbody').innerHTML = html || '<tr><td colspan="11" style="text-align:center;padding:40px;color:var(--text-placeholder);">暂无数据</td></tr>';
document.getElementById('personTbody').innerHTML = html || '<tr><td colspan="12" style="text-align:center;padding:40px;color:var(--text-placeholder);">暂无数据</td></tr>';
// 更新统计
var total = data.length;
@@ -1129,6 +1132,7 @@ function renderReviewerTable(data) {
var html = '';
data.forEach(function(r, i) {
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>' + esc(r.org) + '</td>';
html += '<td>' + esc(r.name) + '</td>';
html += '<td>' + esc(r.site) + '</td>';
@@ -1138,7 +1142,7 @@ function renderReviewerTable(data) {
html += '<td><a class="link" style="color:var(--danger);" onclick="removeReviewer(' + i + ')">移除</a></td>';
html += '</tr>';
});
document.getElementById('reviewerTbody').innerHTML = html || '<tr><td colspan="7" style="text-align:center;padding:40px;color:var(--text-placeholder);">暂无数据</td></tr>';
document.getElementById('reviewerTbody').innerHTML = html || '<tr><td colspan="8" style="text-align:center;padding:40px;color:var(--text-placeholder);">暂无数据</td></tr>';
document.getElementById('reviewerPageTotal').textContent = '共 ' + data.length + ' 条数据';
}
@@ -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;background:#F5F7FA;color:#333;min-width:1280px;}
@@ -151,14 +151,14 @@ tbody tr:hover{background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
<a href="action-overview.html" class="sidebar-item">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item active">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item active">堂食</a>
</aside>
<!-- 主内容 -->
<main class="main">
<!-- 页面标题 -->
<div class="page-header">
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>食谱记录</span></div>
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>堂食</span></div>
</div>
<!-- 筛选栏 -->
@@ -218,6 +218,7 @@ tbody tr:hover{background:#F8FBFF;}
<table>
<thead>
<tr>
<th>序号</th>
<th>单位</th>
<th>食堂名称</th>
<th>用餐日期</th>
@@ -414,13 +415,14 @@ function renderTable(){
document.getElementById('tableCount').textContent = '共 ' + filteredData.length + ' 条记录';
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
if(filteredData.length === 0){
tbody.innerHTML = '<tr><td colspan="6" class="td-empty">暂无匹配数据</td></tr>';
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
html += '<tr>';
html += '<td>'+esc(d.unit)+'</td>';
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(start+i+1)+'</td>';
html += '<td>'+esc(d.unit)+'</td>';
html += '<td>'+esc(d.canteen)+'</td>';
html += '<td>'+d.date+'</td>';
html += '<td>'+d.meal+'</td>';
@@ -129,16 +129,23 @@ thead th{background:#FAFAFA;padding:10px 12px;text-align:center;font-size:var(--
tbody td{padding:12px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 前列固定 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:8;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:220px;z-index:5;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead th:nth-child(2){z-index:7;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:284px;z-index:4;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(3){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
/* 前列固定 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:7;background:#fff;width:52px;min-width:52px;max-width:52px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:9;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:52px;z-index:6;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:8;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:272px;z-index:5;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead th:nth-child(3){z-index:7;background:#FAFAFA;}
thead th:nth-child(4),tbody td:nth-child(4){position:sticky;left:336px;z-index:4;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(4){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3),
tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 最后一列固定(状态) */
thead th:last-child,tbody td:last-child{position:sticky;right:0;z-index:2;background:#fff;box-shadow:-2px 0 4px rgba(0,0,0,0.04);width:110px;min-width:110px;max-width:110px;}
thead th:last-child{z-index:4;background:#FAFAFA;}
tbody tr:hover td:last-child{background:#F8FBFF;}
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
/* 标签 */
@@ -274,16 +281,19 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<div class="tab-bar" style="background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);margin-bottom:0;">
<!-- [交互] 点击Tab切换下方数据列表 -->
<div class="tab-item active" data-tab="0" onclick="switchTab(0)">
未提交任务书<span class="tab-item__badge" id="tabBadge0">0</span>
全部<span class="tab-item__badge" id="tabBadge0">0</span>
</div>
<div class="tab-item" data-tab="1" onclick="switchTab(1)">
提交待审核<span class="tab-item__badge" id="tabBadge1">0</span>
提交任务书<span class="tab-item__badge" id="tabBadge1">0</span>
</div>
<div class="tab-item" data-tab="2" onclick="switchTab(2)">
通过待签署<span class="tab-item__badge" id="tabBadge2">0</span>
提交待审核<span class="tab-item__badge" id="tabBadge2">0</span>
</div>
<div class="tab-item" data-tab="3" onclick="switchTab(3)">
已签署<span class="tab-item__badge" id="tabBadge3">0</span>
通过待签署<span class="tab-item__badge" id="tabBadge3">0</span>
</div>
<div class="tab-item" data-tab="4" onclick="switchTab(4)">
已签署<span class="tab-item__badge" id="tabBadge4">0</span>
</div>
</div>
@@ -366,17 +376,21 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<button class="btn btn-export" onclick="showToast('导出功能开发中')">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据
</button>
<button class="btn btn-default" onclick="showToast('导出任务列表开发中')">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务
</button>
</div>
<!-- 数据表格 -->
<div class="table-card">
<!-- Tab 0: 未提交任务书 -->
<!-- Tab 0: 全部 -->
<div class="tab-panel active" id="tab-panel-0">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th>
<th>计划名称</th>
<th>姓名</th>
<th>员工编号</th>
@@ -385,10 +399,15 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<th>所属单位</th>
<th>所属部门</th>
<th>身高(cm)</th>
<th>初始体重(kg)</th>
<th>初始BMI</th>
<th>初始腰围(cm)</th>
<th>初始体脂(%)</th>
<th>体重(kg)</th>
<th>BMI</th>
<th>腰围(cm)</th>
<th>体脂(%)</th>
<th>提交时间</th>
<th>审核时间</th>
<th>签署时间</th>
<th>承诺书</th>
<th>状态</th>
</tr>
</thead>
<tbody id="tableBody0"></tbody>
@@ -402,12 +421,13 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
</div>
<!-- Tab 1: 提交待审核 -->
<!-- Tab 1: 提交任务书 -->
<div class="tab-panel" id="tab-panel-1">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th>
<th>计划名称</th>
<th>姓名</th>
<th>员工编号</th>
@@ -416,15 +436,10 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<th>所属单位</th>
<th>所属部门</th>
<th>身高(cm)</th>
<th>初始体重(kg)</th>
<th>初始BMI</th>
<th>初始腰围(cm)</th>
<th>初始体脂(%)</th>
<th>目标体重(kg)</th>
<th>目标BMI</th>
<th>目标腰围(cm)</th>
<th>目标体脂(%)</th>
<th>提交时间</th>
<th>体重(kg)</th>
<th>BMI</th>
<th>腰围(cm)</th>
<th>体脂(%)</th>
</tr>
</thead>
<tbody id="tableBody1"></tbody>
@@ -438,12 +453,13 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
</div>
<!-- Tab 2: 已通过待签署 -->
<!-- Tab 2: 已提交待审核 -->
<div class="tab-panel" id="tab-panel-2">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th>
<th>计划名称</th>
<th>姓名</th>
<th>员工编号</th>
@@ -452,16 +468,11 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<th>所属单位</th>
<th>所属部门</th>
<th>身高(cm)</th>
<th>初始体重(kg)</th>
<th>初始BMI</th>
<th>初始腰围(cm)</th>
<th>初始体脂(%)</th>
<th>目标体重(kg)</th>
<th>目标BMI</th>
<th>目标腰围(cm)</th>
<th>目标体脂(%)</th>
<th>体重(kg)</th>
<th>BMI</th>
<th>腰围(cm)</th>
<th>体脂(%)</th>
<th>提交时间</th>
<th>审核时间</th>
</tr>
</thead>
<tbody id="tableBody2"></tbody>
@@ -475,12 +486,13 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
</div>
<!-- Tab 3: 已签署 -->
<!-- Tab 3: 已通过待签署 -->
<div class="tab-panel" id="tab-panel-3">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th>
<th>计划名称</th>
<th>姓名</th>
<th>员工编号</th>
@@ -489,18 +501,12 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
<th>所属单位</th>
<th>所属部门</th>
<th>身高(cm)</th>
<th>初始体重(kg)</th>
<th>初始BMI</th>
<th>初始腰围(cm)</th>
<th>初始体脂(%)</th>
<th>目标体重(kg)</th>
<th>目标BMI</th>
<th>目标腰围(cm)</th>
<th>目标体脂(%)</th>
<th>体重(kg)</th>
<th>BMI</th>
<th>腰围(cm)</th>
<th>体脂(%)</th>
<th>提交时间</th>
<th>审核时间</th>
<th>签署时间</th>
<th>承诺书</th>
</tr>
</thead>
<tbody id="tableBody3"></tbody>
@@ -514,6 +520,42 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
</div>
</div>
<!-- Tab 4: 已签署 -->
<div class="tab-panel" id="tab-panel-4">
<div class="table-card__content">
<table>
<thead>
<tr>
<th>序号</th>
<th>计划名称</th>
<th>姓名</th>
<th>员工编号</th>
<th>性别</th>
<th>年龄</th>
<th>所属单位</th>
<th>所属部门</th>
<th>身高(cm)</th>
<th>体重(kg)</th>
<th>BMI</th>
<th>腰围(cm)</th>
<th>体脂(%)</th>
<th>提交时间</th>
<th>审核时间</th>
<th>签署时间</th>
<th>承诺书</th>
</tr>
</thead>
<tbody id="tableBody4"></tbody>
</table>
</div>
<div class="pagination">
<span id="pageInfo4">显示 0 条记录</span>
<button class="page-btn"></button>
<button class="page-btn active">1</button>
<button class="page-btn"></button>
</div>
</div>
</div>
</main>
@@ -617,7 +659,7 @@ function buildMockData(){
];
// 4个Tab的数据 — 为每个员工分配状态和计划
var data = [[],[],[],[]];
var data = [[],[],[],[],[]];
baseEmployees.forEach(function(e,i){
var status = i % 4; // 轮换分配到4个tab
var planIdx = i % plans.length;
@@ -635,9 +677,10 @@ function buildMockData(){
bmi: e.bmi,
waist: e.waist,
fat: e.fat,
planId: p.id
planId: p.id,
status: status
};
// 已提交待审核(tab1)补充目标数据和提交时间
// 已提交待审核(tab2)补充目标数据和提交时间
if(status === 1){
row.targetWeight = Math.round(e.weight * 0.85);
row.targetBmi = +(e.bmi * 0.85).toFixed(1);
@@ -645,7 +688,7 @@ function buildMockData(){
row.targetFat = +(e.fat * 0.80).toFixed(1);
row.submitTime = '2026-0'+((i%9)+1)+'-'+('0'+(10+i%28)).slice(-2)+' '+(8+i%12)+':'+('0'+(i%60)).slice(-2);
}
// 已通过待签署(tab2)补充目标数据、提交时间和审核时间
// 已通过待签署(tab3)补充目标数据、提交时间和审核时间
if(status === 2){
row.targetWeight = Math.round(e.weight * 0.85);
row.targetBmi = +(e.bmi * 0.85).toFixed(1);
@@ -654,7 +697,7 @@ function buildMockData(){
row.submitTime = '2026-0'+((i%9)+1)+'-'+('0'+(10+i%28)).slice(-2)+' '+(8+i%12)+':'+('0'+(i%60)).slice(-2);
row.auditTime = '2026-0'+((i%9)+1)+'-'+('0'+(12+i%28)).slice(-2)+' '+(9+i%10)+':'+('0'+(30+i%30)).slice(-2);
}
// 已签署(tab3)补充目标数据、提交/审核/签署时间
// 已签署(tab4)补充目标数据、提交/审核/签署时间
if(status === 3){
row.targetWeight = Math.round(e.weight * 0.85);
row.targetBmi = +(e.bmi * 0.85).toFixed(1);
@@ -664,8 +707,10 @@ function buildMockData(){
row.auditTime = '2026-0'+((i%9)+1)+'-'+('0'+(12+i%28)).slice(-2)+' '+(9+i%10)+':'+('0'+(30+i%30)).slice(-2);
row.signTime = '2026-0'+((i%9)+1)+'-'+('0'+(15+i%28)).slice(-2)+' '+(10+i%8)+':'+('0'+(45+i%15)).slice(-2);
}
data[status].push(row);
data[status + 1].push(row);
});
// Tab 0 (全部) 合并所有4个tab的数据
data[0] = data[1].concat(data[2]).concat(data[3]).concat(data[4]);
return data;
}
@@ -915,7 +960,7 @@ function resetFilter(){
/* 更新Tab角标 */
function updateTabBadges(){
for(var i=0;i<4;i++){
for(var i=0;i<5;i++){
var data = tabData[i];
if(selectedPlanId){
data = data.filter(function(d){return d.planId === selectedPlanId;});
@@ -930,16 +975,17 @@ function renderTable(){
document.getElementById('pageInfo'+currentTab).textContent = '显示 ' + filteredData.length + ' 条记录';
if(filteredData.length === 0){
var colSpanMap = {0:12, 1:17, 2:18, 3:20};
var colSpanMap = {0:18, 1:13, 2:14, 3:15, 4:17};
var colSpan = colSpanMap[currentTab] || 12;
tbody.innerHTML = '<tr><td colspan="'+colSpan+'" class="td-empty">暂无匹配数据</td></tr>';
return;
}
var html = '';
filteredData.forEach(function(d){
html += '<tr>';
html += '<td>'+esc(d.planName)+'</td>';
filteredData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
@@ -947,26 +993,26 @@ function renderTable(){
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+esc(d.dept)+'</td>';
html += '<td>'+d.height+'</td>';
html += '<td>'+d.weight+'</td>';
html += '<td>'+d.bmi.toFixed(1)+'</td>';
html += '<td>'+d.waist+'</td>';
html += '<td>'+d.fat.toFixed(1)+'</td>';
// tab1/2/3 共同:目标数据 + 提交时间
if(currentTab >= 1){
html += '<td>'+d.targetWeight+'</td>';
html += '<td>'+d.targetBmi+'</td>';
html += '<td>'+d.targetWaist+'</td>';
html += '<td>'+d.targetFat+'</td>';
html += '<td>'+esc(d.submitTime)+'</td>';
html += '<td>'+(d.targetWeight != null ? d.weight+' &rarr; '+d.targetWeight : d.weight)+'</td>';
html += '<td>'+(d.targetBmi != null ? d.bmi.toFixed(1)+' &rarr; '+d.targetBmi : d.bmi.toFixed(1))+'</td>';
html += '<td>'+(d.targetWaist != null ? d.waist+' &rarr; '+d.targetWaist : d.waist)+'</td>';
html += '<td>'+(d.targetFat != null ? d.fat.toFixed(1)+' &rarr; '+d.targetFat : d.fat.toFixed(1))+'</td>';
if(currentTab === 0 || currentTab >= 2){
html += '<td>'+esc(d.submitTime || '-')+'</td>';
}
// tab0(全部)/tab3/4 额外:审核时间
if(currentTab === 0 || currentTab >= 3){
html += '<td>'+esc(d.auditTime || '-')+'</td>';
}
// tab2/3 额外:审核时间
if(currentTab >= 2){
html += '<td>'+esc(d.auditTime)+'</td>';
// tab0(全部)/tab4 额外:签署时间 + 承诺书查看
if(currentTab === 0 || currentTab >= 4){
html += '<td>'+esc(d.signTime || '-')+'</td>';
html += '<td>'+(d.signTime ? '<a class="link" onclick="openPromise(\''+esc(d.name)+'\',\''+esc(d.signTime)+'\')">查看</a>' : '-')+'</td>';
}
// tab3 额外:签署时间 + 承诺书查看
if(currentTab >= 3){
html += '<td>'+esc(d.signTime)+'</td>';
html += '<td><a class="link" onclick="openPromise(\''+esc(d.name)+'\',\''+esc(d.signTime)+'\')">查看</a></td>';
// tab0(全部):状态
if(currentTab === 0){
var regStatusLabels = {0:'未提交任务书', 1:'已提交待审核', 2:'已通过待签署', 3:'已签署'};
html += '<td>'+esc(regStatusLabels[d.status] || '-')+'</td>';
}
html += '</tr>';
});
@@ -150,14 +150,14 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>SC-2024-001</td><td>体重秤A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SC-2024-002</td><td>体重秤A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SC-2024-003</td><td>体重秤B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SC-2024-004</td><td>体重秤B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SC-2024-005</td><td>体重秤C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
<thead><tr><th>序号</th><th>设备编码</th><th>设备名称</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>1</td><td>SC-2024-001</td><td>体重秤A1</td><td>华为</td><td>HW-S100</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>2</td><td>SC-2024-002</td><td>体重秤A2</td><td>小米</td><td>MI-Scale2</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>3</td><td>SC-2024-003</td><td>体重秤B1</td><td>乐心</td><td>LX-Pro</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>4</td><td>SC-2024-004</td><td>体重秤B2</td><td>华为</td><td>HW-S100</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>5</td><td>SC-2024-005</td><td>体重秤C1</td><td>小米</td><td>MI-Scale2</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -197,15 +197,15 @@
<table>
<thead>
<tr>
<th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">员工编号</th><th rowspan="2">所属单位</th><th rowspan="2">所属部门</th><th rowspan="2">性别</th><th rowspan="2">年龄</th><th rowspan="2">使用时间</th>
<th colspan="10">监测数据</th><th rowspan="2">更多信息</th>
</tr>
<tr><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>体水分率(%)</th><th>蛋白质量(kg)</th><th>蛋白质率(%)</th></tr>
</thead>
<tbody>
<tr><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td>38.6</td><td>53.2</td><td>8.5</td><td>11.7</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0"},"水分与蛋白质":{"体水分量(kg)":"38.6","体水分率(%)":"53.2","蛋白质量(kg)":"8.5","蛋白质率(%)":"11.7"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td>28.6</td><td>52.0</td><td>6.2</td><td>11.3</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1"},"水分与蛋白质":{"体水分量(kg)":"28.6","体水分率(%)":"52.0","蛋白质量(kg)":"6.2","蛋白质率(%)":"11.3"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td>40.2</td><td>51.5</td><td>9.1</td><td>11.7</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0"},"水分与蛋白质":{"体水分量(kg)":"40.2","体水分率(%)":"51.5","蛋白质量(kg)":"9.1","蛋白质率(%)":"11.7"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>1</td><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>2026-05-13 08:30</td><td>175</td><td>72.5</td><td>23.7</td><td>1,680</td><td>15.2</td><td>21.0</td><td>38.6</td><td>53.2</td><td>8.5</td><td>11.7</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","体脂肪量(kg)":"15.2","体脂肪率(%)":"21.0"},"水分与蛋白质":{"体水分量(kg)":"38.6","体水分率(%)":"53.2","蛋白质量(kg)":"8.5","蛋白质率(%)":"11.7"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>2</td><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>2026-05-13 09:15</td><td>162</td><td>55.0</td><td>21.0</td><td>1,320</td><td>13.8</td><td>25.1</td><td>28.6</td><td>52.0</td><td>6.2</td><td>11.3</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"162","体重(kg)":"55.0","BMI":"21.0","基础代谢":"1,320","体脂肪量(kg)":"13.8","体脂肪率(%)":"25.1"},"水分与蛋白质":{"体水分量(kg)":"28.6","体水分率(%)":"52.0","蛋白质量(kg)":"6.2","蛋白质率(%)":"11.3"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>3</td><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>2026-05-13 10:05</td><td>170</td><td>78.0</td><td>27.0</td><td>1,580</td><td>19.5</td><td>25.0</td><td>40.2</td><td>51.5</td><td>9.1</td><td>11.7</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"170","体重(kg)":"78.0","BMI":"27.0","基础代谢":"1,580","体脂肪量(kg)":"19.5","体脂肪率(%)":"25.0"},"水分与蛋白质":{"体水分量(kg)":"40.2","体水分率(%)":"51.5","蛋白质量(kg)":"9.1","蛋白质率(%)":"11.7"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
</tbody>
</table>
</div>
@@ -228,14 +228,14 @@
<table>
<thead>
<tr>
<th rowspan="2">姓名</th><th rowspan="2">使用时间</th>
<th rowspan="2">序号</th><th rowspan="2">姓名</th><th rowspan="2">使用时间</th>
<th colspan="10">监测数据</th><th rowspan="2">更多信息</th>
</tr>
<tr><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>基础代谢</th><th>体脂肪量(kg)</th><th>体脂肪率(%)</th><th>体水分量(kg)</th><th>体水分率(%)</th><th>蛋白质量(kg)</th><th>蛋白质率(%)</th></tr>
</thead>
<tbody>
<tr><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>23.0</td><td>1,450</td><td>14.3</td><td>22.0</td><td>34.5</td><td>53.1</td><td>7.8</td><td>12.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"168","体重(kg)":"65.0","BMI":"23.0","基础代谢":"1,450","体脂肪量(kg)":"14.3","体脂肪率(%)":"22.0"},"水分与蛋白质":{"体水分量(kg)":"34.5","体水分率(%)":"53.1","蛋白质量(kg)":"7.8","蛋白质率(%)":"12.0"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>26.2</td><td>1,750</td><td>20.4</td><td>24.0</td><td>44.2</td><td>52.0</td><td>10.2</td><td>12.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"180","体重(kg)":"85.0","BMI":"26.2","基础代谢":"1,750","体脂肪量(kg)":"20.4","体脂肪率(%)":"24.0"},"水分与蛋白质":{"体水分量(kg)":"44.2","体水分率(%)":"52.0","蛋白质量(kg)":"10.2","蛋白质率(%)":"12.0"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>1</td><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>23.0</td><td>1,450</td><td>14.3</td><td>22.0</td><td>34.5</td><td>53.1</td><td>7.8</td><td>12.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"168","体重(kg)":"65.0","BMI":"23.0","基础代谢":"1,450","体脂肪量(kg)":"14.3","体脂肪率(%)":"22.0"},"水分与蛋白质":{"体水分量(kg)":"34.5","体水分率(%)":"53.1","蛋白质量(kg)":"7.8","蛋白质率(%)":"12.0"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
<tr><td>2</td><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>26.2</td><td>1,750</td><td>20.4</td><td>24.0</td><td>44.2</td><td>52.0</td><td>10.2</td><td>12.0</td><td><a class="link tip-trigger" data-tip='{"基础指标":{"身高(cm)":"180","体重(kg)":"85.0","BMI":"26.2","基础代谢":"1,750","体脂肪量(kg)":"20.4","体脂肪率(%)":"24.0"},"水分与蛋白质":{"体水分量(kg)":"44.2","体水分率(%)":"52.0","蛋白质量(kg)":"10.2","蛋白质率(%)":"12.0"},"肌肉与骨骼":{"肌肉率(%)":"-","肌肉量(kg)":"-","体骨骼量/骨量(kg)":"-"},"脂肪分析":{"皮下脂肪率(%)":"-","内脏脂肪等级":"-","去脂体重(kg)":"-"},"其他":{"无机盐量/矿物质量(kg)":"-","细胞内液(kg)":"-","细胞外液(kg)":"-","健康评分":"-"}}'>查看</a></td></tr>
</tbody>
</table>
</div>
@@ -261,6 +261,32 @@ function switchTab(idx){
document.querySelectorAll('.tab-content').forEach(function(c,i){c.classList.toggle('active',i===idx);});
}
function closeDialog(){document.getElementById('dialogMask').classList.remove('show');}
/* 根据URL参数period设置日期筛选 */
(function(){
var params = new URLSearchParams(location.search);
var period = params.get('period');
if(!period) return;
function fd(d){ return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2); }
var today = new Date();
var dateFrom = '', dateTo = '';
if(period === 'week'){
var day = today.getDay() || 7;
var monday = new Date(today); monday.setDate(today.getDate() - day + 1);
var sunday = new Date(today); sunday.setDate(today.getDate() - day + 7);
dateFrom = fd(monday); dateTo = fd(sunday);
} else if(period === 'month'){
dateFrom = fd(new Date(today.getFullYear(), today.getMonth(), 1));
dateTo = fd(new Date(today.getFullYear(), today.getMonth() + 1, 0));
} else if(period === 'year'){
dateFrom = today.getFullYear()+'-01-01';
dateTo = today.getFullYear()+'-12-31';
}
if(dateFrom){
var inputs = document.querySelectorAll('.filter-input[type="date"]');
if(inputs.length >= 2){ inputs[0].value = dateFrom; inputs[1].value = dateTo; }
}
})();
(function(){
var mask=document.getElementById('dialogMask');
var body=document.getElementById('dialogBody');
+11 -11
View File
@@ -136,17 +136,17 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr>
<th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>智能体重秤A01</td><td>SC-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td>56</td><td>238</td><td>1,420</td><td>3,856</td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体重秤A02</td><td>SC-2024-002</td><td>采油一厂</td><td>健身房</td><td>89</td><td>356</td><td>2,105</td><td>5,230</td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体重秤B01</td><td>SC-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td>42</td><td>178</td><td>980</td><td>2,145</td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体重秤B02</td><td>SC-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td>31</td><td>145</td><td>876</td><td>1,920</td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能体重秤C01</td><td>SC-2024-005</td><td>采气厂</td><td>综合楼1层</td><td>67</td><td>289</td><td>1,680</td><td>4,102</td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
</tbody>
<thead><tr>
<th>序号</th><th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>1</td><td>智能体重秤A01</td><td>SC-2024-001</td><td>采油一厂</td><td>办公楼1层大厅</td><td><a class="link" href="scale-monitor-detail.html?period=week">56</a></td><td><a class="link" href="scale-monitor-detail.html?period=month">238</a></td><td><a class="link" href="scale-monitor-detail.html?period=year">1,420</a></td><td><a class="link" href="scale-monitor-detail.html?period=all">3,856</a></td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>2</td><td>智能体重秤A02</td><td>SC-2024-002</td><td>采油一厂</td><td>健身房</td><td><a class="link" href="scale-monitor-detail.html?period=week">89</a></td><td><a class="link" href="scale-monitor-detail.html?period=month">356</a></td><td><a class="link" href="scale-monitor-detail.html?period=year">2,105</a></td><td><a class="link" href="scale-monitor-detail.html?period=all">5,230</a></td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>3</td><td>智能体重秤B01</td><td>SC-2024-003</td><td>采油二厂</td><td>职工活动中心</td><td><a class="link" href="scale-monitor-detail.html?period=week">42</a></td><td><a class="link" href="scale-monitor-detail.html?period=month">178</a></td><td><a class="link" href="scale-monitor-detail.html?period=year">980</a></td><td><a class="link" href="scale-monitor-detail.html?period=all">2,145</a></td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>4</td><td>智能体重秤B02</td><td>SC-2024-004</td><td>采油二厂</td><td>办公楼2层</td><td><a class="link" href="scale-monitor-detail.html?period=week">31</a></td><td><a class="link" href="scale-monitor-detail.html?period=month">145</a></td><td><a class="link" href="scale-monitor-detail.html?period=year">876</a></td><td><a class="link" href="scale-monitor-detail.html?period=all">1,920</a></td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
<tr><td>5</td><td>智能体重秤C01</td><td>SC-2024-005</td><td>采气厂</td><td>综合楼1层</td><td><a class="link" href="scale-monitor-detail.html?period=week">67</a></td><td><a class="link" href="scale-monitor-detail.html?period=month">289</a></td><td><a class="link" href="scale-monitor-detail.html?period=year">1,680</a></td><td><a class="link" href="scale-monitor-detail.html?period=all">4,102</a></td><td><a class="link" href="scale-monitor-detail.html">数据明细</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -152,14 +152,14 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr><th>设备编码</th><th>设备名称</th><th>设备类型</th><th>设备厂商</th><th>设备型号</th><th>所属单位</th><th>布放位置</th><th>入库日期</th><th>设备状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>SP-2024-001</td><td>跑步机T1</td><td><span class="tag tag-blue">有氧器械</span></td><td>舒华</td><td>SH-T5170</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SP-2024-002</td><td>椭圆机E1</td><td><span class="tag tag-blue">有氧器械</span></td><td>岱宇</td><td>DY-E600</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SP-2024-003</td><td>划船机R1</td><td><span class="tag tag-blue">有氧器械</span></td><td>康乐佳</td><td>KLJ-R800</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SP-2024-004</td><td>史密斯架S1</td><td><span class="tag tag-purple">力量器械</span></td><td>舒华</td><td>SH-G6560</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>SP-2024-005</td><td>龙门架L1</td><td><span class="tag tag-purple">力量器械</span></td><td>康乐佳</td><td>KLJ-F800</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
<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>
<tr><td>1</td><td>SP-2024-001</td><td>跑步机T1</td><td><span class="tag tag-blue">有氧器械</span></td><td>舒华</td><td>SH-T5170</td><td>采油一厂</td><td>职工活动中心1F</td><td>2024-03-15</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>2</td><td>SP-2024-002</td><td>椭圆机E1</td><td><span class="tag tag-blue">有氧器械</span></td><td>岱宇</td><td>DY-E600</td><td>采油一厂</td><td>办公楼2F健身房</td><td>2024-03-18</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>3</td><td>SP-2024-003</td><td>划船机R1</td><td><span class="tag tag-blue">有氧器械</span></td><td>康乐佳</td><td>KLJ-R800</td><td>采油二厂</td><td>员工食堂入口</td><td>2024-04-02</td><td><span class="tag tag-orange">维护中</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>4</td><td>SP-2024-004</td><td>史密斯架S1</td><td><span class="tag tag-purple">力量器械</span></td><td>舒华</td><td>SH-G6560</td><td>采油二厂</td><td>宿舍楼大厅</td><td>2024-04-10</td><td><span class="tag tag-green">正常</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
<tr><td>5</td><td>SP-2024-005</td><td>龙门架L1</td><td><span class="tag tag-purple">力量器械</span></td><td>康乐佳</td><td>KLJ-F800</td><td>采气厂</td><td>综合办公楼1F</td><td>2024-05-08</td><td><span class="tag tag-red">已停用</span></td><td><a class="link">详情</a> <a class="link">编辑</a> <a class="link-danger">删除</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -175,13 +175,13 @@
<table>
<thead>
<tr>
<th>姓名</th><th>员工编号</th><th>所属单位</th><th>所属部门</th><th>性别</th><th>年龄</th><th>身高(cm)</th><th>体重(kg)</th><th>运动时间</th><th>运动时长(分钟)</th><th>运动消耗(千卡)</th>
<th>序号</th><th>姓名</th><th>员工编号</th><th>所属单位</th><th>所属部门</th><th>性别</th><th>年龄</th><th>身高(cm)</th><th>体重(kg)</th><th>运动时间</th><th>运动时长(分钟)</th><th>运动消耗(千卡)</th>
</tr>
</thead>
<tbody>
<tr><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>175</td><td>72.5</td><td>2026-05-13 07:30</td><td>45</td><td>380</td></tr>
<tr><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>162</td><td>55.0</td><td>2026-05-13 08:15</td><td>30</td><td>245</td></tr>
<tr><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>170</td><td>78.0</td><td>2026-05-13 12:00</td><td>60</td><td>520</td></tr>
<tr><td>1</td><td>张三</td><td>EMP001</td><td>采油一厂</td><td>生产部</td><td></td><td>35</td><td>175</td><td>72.5</td><td>2026-05-13 07:30</td><td>45</td><td>380</td></tr>
<tr><td>2</td><td>李四</td><td>EMP002</td><td>采油一厂</td><td>技术部</td><td></td><td>28</td><td>162</td><td>55.0</td><td>2026-05-13 08:15</td><td>30</td><td>245</td></tr>
<tr><td>3</td><td>王五</td><td>EMP003</td><td>采油一厂</td><td>安全部</td><td></td><td>42</td><td>170</td><td>78.0</td><td>2026-05-13 12:00</td><td>60</td><td>520</td></tr>
</tbody>
</table>
</div>
@@ -204,12 +204,12 @@
<table>
<thead>
<tr>
<th>姓名</th><th>使用时间</th><th>身高(cm)</th><th>体重(kg)</th><th>运动时间</th><th>运动时长(分钟)</th><th>运动消耗(千卡)</th>
<th>序号</th><th>姓名</th><th>使用时间</th><th>身高(cm)</th><th>体重(kg)</th><th>运动时间</th><th>运动时长(分钟)</th><th>运动消耗(千卡)</th>
</tr>
</thead>
<tbody>
<tr><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>2026-05-13 11:20</td><td>35</td><td>290</td></tr>
<tr><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>2026-05-13 14:35</td><td>50</td><td>450</td></tr>
<tr><td>1</td><td>匿名用户</td><td>2026-05-13 11:20</td><td>168</td><td>65.0</td><td>2026-05-13 11:20</td><td>35</td><td>290</td></tr>
<tr><td>2</td><td>匿名用户</td><td>2026-05-13 14:35</td><td>180</td><td>85.0</td><td>2026-05-13 14:35</td><td>50</td><td>450</td></tr>
</tbody>
</table>
</div>
@@ -224,6 +224,32 @@ function switchTab(idx){
document.querySelectorAll('.tab-item').forEach(function(t,i){t.classList.toggle('active',i===idx);});
document.querySelectorAll('.tab-content').forEach(function(c,i){c.classList.toggle('active',i===idx);});
}
/* 根据URL参数period设置日期筛选 */
(function(){
var params = new URLSearchParams(location.search);
var period = params.get('period');
if(!period) return;
function fd(d){ return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2); }
var today = new Date();
var dateFrom = '', dateTo = '';
if(period === 'week'){
var day = today.getDay() || 7;
var monday = new Date(today); monday.setDate(today.getDate() - day + 1);
var sunday = new Date(today); sunday.setDate(today.getDate() - day + 7);
dateFrom = fd(monday); dateTo = fd(sunday);
} else if(period === 'month'){
dateFrom = fd(new Date(today.getFullYear(), today.getMonth(), 1));
dateTo = fd(new Date(today.getFullYear(), today.getMonth() + 1, 0));
} else if(period === 'year'){
dateFrom = today.getFullYear()+'-01-01';
dateTo = today.getFullYear()+'-12-31';
}
if(dateFrom){
var inputs = document.querySelectorAll('.filter-input[type="date"]');
if(inputs.length >= 2){ inputs[0].value = dateFrom; inputs[1].value = dateTo; }
}
})();
</script>
</body>
</html>
+12 -12
View File
@@ -59,7 +59,7 @@
tbody tr:hover{background:#F8FBFF;}
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
.sortable{cursor:pointer;user-select:none;}.sortable:hover{color:var(--primary);}
.sortable::after{content:'&#8645;';margin-left:4px;font-size:10px;opacity:.5;}
.sortable::after{content:'';margin-left:4px;font-size:10px;opacity:.5;}
.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;}
@@ -136,17 +136,17 @@
<div class="table-card">
<div class="table-card__content">
<table>
<thead><tr>
<th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>智能跑步机A01</td><td>SP-2024-001</td><td>采油一厂</td><td>健身房</td><td>120</td><td>485</td><td>2,860</td><td>6,320</td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能跑步机A02</td><td>SP-2024-002</td><td>采油一厂</td><td>职工活动中心</td><td>98</td><td>412</td><td>2,350</td><td>5,180</td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能椭圆机B01</td><td>SP-2024-003</td><td>采油二厂</td><td>健身房</td><td>65</td><td>278</td><td>1,560</td><td>3,420</td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能动感单车B02</td><td>SP-2024-004</td><td>采油二厂</td><td>职工活动中心</td><td>78</td><td>320</td><td>1,890</td><td>4,150</td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>智能划船机C01</td><td>SP-2024-005</td><td>采气厂</td><td>综合楼健身房</td><td>45</td><td>198</td><td>1,120</td><td>2,560</td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
</tbody>
<thead><tr>
<th>序号</th><th>设备名称</th><th>设备编码</th><th>设备所属单位</th><th>布放位置</th>
<th class="sortable">本周使用次数</th><th class="sortable">本月使用次数</th><th class="sortable">本年使用次数</th><th class="sortable">累计使用次数</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>1</td><td>智能跑步机A01</td><td>SP-2024-001</td><td>采油一厂</td><td>健身房</td><td><a class="link" href="sport-monitor-detail.html?period=week">120</a></td><td><a class="link" href="sport-monitor-detail.html?period=month">485</a></td><td><a class="link" href="sport-monitor-detail.html?period=year">2,860</a></td><td><a class="link" href="sport-monitor-detail.html?period=all">6,320</a></td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>2</td><td>智能跑步机A02</td><td>SP-2024-002</td><td>采油一厂</td><td>职工活动中心</td><td><a class="link" href="sport-monitor-detail.html?period=week">98</a></td><td><a class="link" href="sport-monitor-detail.html?period=month">412</a></td><td><a class="link" href="sport-monitor-detail.html?period=year">2,350</a></td><td><a class="link" href="sport-monitor-detail.html?period=all">5,180</a></td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>3</td><td>智能椭圆机B01</td><td>SP-2024-003</td><td>采油二厂</td><td>健身房</td><td><a class="link" href="sport-monitor-detail.html?period=week">65</a></td><td><a class="link" href="sport-monitor-detail.html?period=month">278</a></td><td><a class="link" href="sport-monitor-detail.html?period=year">1,560</a></td><td><a class="link" href="sport-monitor-detail.html?period=all">3,420</a></td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>4</td><td>智能动感单车B02</td><td>SP-2024-004</td><td>采油二厂</td><td>职工活动中心</td><td><a class="link" href="sport-monitor-detail.html?period=week">78</a></td><td><a class="link" href="sport-monitor-detail.html?period=month">320</a></td><td><a class="link" href="sport-monitor-detail.html?period=year">1,890</a></td><td><a class="link" href="sport-monitor-detail.html?period=all">4,150</a></td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
<tr><td>5</td><td>智能划船机C01</td><td>SP-2024-005</td><td>采气厂</td><td>综合楼健身房</td><td><a class="link" href="sport-monitor-detail.html?period=week">45</a></td><td><a class="link" href="sport-monitor-detail.html?period=month">198</a></td><td><a class="link" href="sport-monitor-detail.html?period=year">1,120</a></td><td><a class="link" href="sport-monitor-detail.html?period=all">2,560</a></td><td><a class="link" href="sport-monitor-detail.html">数据明细</a></td></tr>
</tbody>
</table>
</div>
<div class="pagination">
@@ -132,16 +132,23 @@ thead th{background:#FAFAFA;padding:10px 12px;text-align:center;font-size:var(--
tbody td{padding:12px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 前列固定 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:6;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:8;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:220px;z-index:5;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead th:nth-child(2){z-index:7;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:284px;z-index:4;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(3){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3){background:#F8FBFF;}
/* 前列固定 */
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:7;background:#fff;width:52px;min-width:52px;max-width:52px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(1){z-index:9;background:#FAFAFA;}
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:52px;z-index:6;background:#fff;width:220px;min-width:220px;max-width:220px;overflow:hidden;text-overflow:ellipsis;}
thead th:nth-child(2){z-index:8;background:#FAFAFA;}
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:272px;z-index:5;background:#fff;width:64px;min-width:64px;max-width:64px;}
thead th:nth-child(3){z-index:7;background:#FAFAFA;}
thead th:nth-child(4),tbody td:nth-child(4){position:sticky;left:336px;z-index:4;background:#fff;width:100px;min-width:100px;max-width:100px;}
thead th:nth-child(4){z-index:6;background:#FAFAFA;}
tbody tr:hover td:nth-child(1),
tbody tr:hover td:nth-child(2),
tbody tr:hover td:nth-child(3),
tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 最后一列固定(状态) */
thead th:last-child,tbody td:last-child{position:sticky;right:0;z-index:2;background:#fff;box-shadow:-2px 0 4px rgba(0,0,0,0.04);width:110px;min-width:110px;max-width:110px;}
thead th:last-child{z-index:4;background:#FAFAFA;}
tbody tr:hover td:last-child{background:#F8FBFF;}
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
/* 操作列固定 */
@@ -174,7 +181,7 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
/* 审核弹窗 */
.audit-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.45);z-index:1000;align-items:center;justify-content:center;}
.audit-overlay.show{display:flex;}
.audit-dialog{background:#fff;border-radius:var(--radius-lg);box-shadow:0 8px 40px rgba(0,0,0,0.18);width:640px;overflow:hidden;max-height:90vh;display:flex;flex-direction:column;}
.audit-dialog{background:#fff;border-radius:var(--radius-lg);box-shadow:0 8px 40px rgba(0,0,0,0.18);width:720px;overflow:hidden;max-height:90vh;display:flex;flex-direction:column;}
.audit-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
.audit-dialog__title{font-size:var(--font-lg);font-weight:600;}
.audit-dialog__close{width:32px;height:32px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:20px;transition:all .15s;}
@@ -202,7 +209,7 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
.audit-cmp-table th.audit-cmp-table__col-after{background:#F6FFED;}
.audit-cmp-table th.audit-cmp-table__col-delta{width:80px;color:var(--text-placeholder);}
.audit-cmp-table td{padding:10px 16px;text-align:center;font-size:var(--font-sm);border-bottom:1px solid #F0F0F0;}
.audit-cmp-table td:first-child{text-align:left;font-weight:500;color:var(--text-primary);padding-left:20px;}
.audit-cmp-table td:first-child{text-align:left;font-weight:500;color:var(--text-primary);padding-left:20px;min-width:90px;white-space:nowrap;}
.audit-cmp-table tr:last-child td{border-bottom:none;}
.audit-cmp-table__before{color:var(--text-secondary);}
.audit-cmp-table__after{color:var(--success);font-weight:600;}
@@ -292,10 +299,11 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
<!-- Tab 切换 -->
<div class="tab-bar" style="background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);margin-bottom:0;">
<div class="tab-item active" data-tab="0" onclick="switchTab(0)">待审核<span class="tab-item__badge" id="tabBadge0">0</span></div>
<div class="tab-item" data-tab="1" onclick="switchTab(1)">已通过<span class="tab-item__badge" id="tabBadge1">0</span></div>
<div class="tab-item" data-tab="2" onclick="switchTab(2)">已通过待签署<span class="tab-item__badge" id="tabBadge2">0</span></div>
<div class="tab-item" data-tab="3" onclick="switchTab(3)">驳回<span class="tab-item__badge" id="tabBadge3">0</span></div>
<div class="tab-item active" data-tab="0" onclick="switchTab(0)">全部<span class="tab-item__badge" id="tabBadge0">0</span></div>
<div class="tab-item" data-tab="1" onclick="switchTab(1)">待审核<span class="tab-item__badge" id="tabBadge1">0</span></div>
<div class="tab-item" data-tab="2" onclick="switchTab(2)">已通过<span class="tab-item__badge" id="tabBadge2">0</span></div>
<div class="tab-item" data-tab="3" onclick="switchTab(3)">通过待签署<span class="tab-item__badge" id="tabBadge3">0</span></div>
<div class="tab-item" data-tab="4" onclick="switchTab(4)">已驳回<span class="tab-item__badge" id="tabBadge4">0</span></div>
</div>
<!-- 筛选栏 -->
@@ -346,15 +354,16 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
<div class="action-bar">
<button class="btn btn-export" onclick="showToast('导出功能开发中')"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
<button class="btn btn-default" onclick="showToast('导出任务列表开发中')"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
</div>
<!-- 数据表格 -->
<div class="table-card">
<div class="tab-panel active" id="tab-panel-0">
<div class="table-card__content">
<table>
<thead><tr><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始腰围(cm)</th><th>初始体脂(%)</th><th>目标体重(kg)</th><th>目标BMI</th><th>目标腰围(cm)</th><th>目标体脂(%)</th><th>提交时间</th><th class="th-actions">操作</th></tr></thead>
<tbody id="tableBody0"></tbody>
<div class="tab-panel active" id="tab-panel-0">
<div class="table-card__content">
<table>
<thead><tr><th>序号</th><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>腰围(cm)</th><th>体脂(%)</th><th>提交时间</th><th>驳回时间</th><th>审核人</th><th>驳回原因</th><th>状态</th></tr></thead>
<tbody id="tableBody0"></tbody>
</table>
</div>
<div class="pagination"><span id="pageInfo0">显示 0 条记录</span><button class="page-btn"></button><button class="page-btn active">1</button><button class="page-btn"></button></div>
@@ -362,8 +371,8 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
<div class="tab-panel" id="tab-panel-1">
<div class="table-card__content">
<table>
<thead><tr><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始腰围(cm)</th><th>初始体脂(%)</th><th>目标体重(kg)</th><th>目标BMI</th><th>目标腰围(cm)</th><th>目标体脂(%)</th><th>提交时间</th><th>审核时间</th><th>审核人</th></tr></thead>
<tbody id="tableBody1"></tbody>
<thead><tr><th>序号</th><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>腰围(cm)</th><th>体脂(%)</th><th>提交时间</th><th class="th-actions">操作</th></tr></thead>
<tbody id="tableBody1"></tbody>
</table>
</div>
<div class="pagination"><span id="pageInfo1">显示 0 条记录</span><button class="page-btn"></button><button class="page-btn active">1</button><button class="page-btn"></button></div>
@@ -371,8 +380,8 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
<div class="tab-panel" id="tab-panel-2">
<div class="table-card__content">
<table>
<thead><tr><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始腰围(cm)</th><th>初始体脂(%)</th><th>目标体重(kg)</th><th>目标BMI</th><th>目标腰围(cm)</th><th>目标体脂(%)</th><th>提交时间</th><th>审核时间</th><th>审核人</th></tr></thead>
<tbody id="tableBody2"></tbody>
<thead><tr><th>序号</th><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>腰围(cm)</th><th>体脂(%)</th><th>提交时间</th><th>审核时间</th><th>审核人</th></tr></thead>
<tbody id="tableBody2"></tbody>
</table>
</div>
<div class="pagination"><span id="pageInfo2">显示 0 条记录</span><button class="page-btn"></button><button class="page-btn active">1</button><button class="page-btn"></button></div>
@@ -380,12 +389,21 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
<div class="tab-panel" id="tab-panel-3">
<div class="table-card__content">
<table>
<thead><tr><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始腰围(cm)</th><th>初始体脂(%)</th><th>目标体重(kg)</th><th>目标BMI</th><th>目标腰围(cm)</th><th>目标体脂(%)</th><th>提交时间</th><th>驳回时间</th><th>审核人</th><th>驳回原因</th></tr></thead>
<tbody id="tableBody3"></tbody>
<thead><tr><th>序号</th><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>腰围(cm)</th><th>体脂(%)</th><th>提交时间</th><th>审核时间</th><th>审核人</th></tr></thead>
<tbody id="tableBody3"></tbody>
</table>
</div>
<div class="pagination"><span id="pageInfo3">显示 0 条记录</span><button class="page-btn"></button><button class="page-btn active">1</button><button class="page-btn"></button></div>
</div>
<div class="tab-panel" id="tab-panel-4">
<div class="table-card__content">
<table>
<thead><tr><th>序号</th><th>计划名称</th><th>姓名</th><th>员工编号</th><th>性别</th><th>年龄</th><th>所属单位</th><th>所属部门</th><th>身高(cm)</th><th>体重(kg)</th><th>BMI</th><th>腰围(cm)</th><th>体脂(%)</th><th>提交时间</th><th>驳回时间</th><th>审核人</th><th>驳回原因</th></tr></thead>
<tbody id="tableBody4"></tbody>
</table>
</div>
<div class="pagination"><span id="pageInfo4">显示 0 条记录</span><button class="page-btn"></button><button class="page-btn active">1</button><button class="page-btn"></button></div>
</div>
</div>
</main>
@@ -497,7 +515,7 @@ function buildMockData(){
var row = {
planName: p.name, org: e.org, dept: e.dept, name: e.name, empId: e.empId,
gender: e.gender, age: e.age, height: e.height,
weight: e.weight, bmi: e.bmi, waist: e.waist, fat: e.fat, planId: p.id,
weight: e.weight, bmi: e.bmi, waist: e.waist, fat: e.fat, planId: p.id, status: status,
targetWeight: Math.round(e.weight * 0.85),
targetBmi: +(e.bmi * 0.85).toFixed(1),
targetWaist: Math.round(e.waist * 0.88),
@@ -523,6 +541,7 @@ function buildMockData(){
}
var tabData = buildMockData();
tabData.unshift(tabData[0].concat(tabData[1], tabData[2], tabData[3]));
var currentTab = 0;
var filteredData = [];
var selectedPlanId = null;
@@ -643,25 +662,33 @@ function resetFilter(){
});
applyFilter();
}
function updateTabBadges(){for(var i=0;i<4;i++){var d=tabData[i];if(selectedPlanId)d=d.filter(function(x){return x.planId===selectedPlanId;});document.getElementById('tabBadge'+i).textContent=d.length;}}
function updateTabBadges(){for(var i=0;i<5;i++){var d=tabData[i];if(selectedPlanId)d=d.filter(function(x){return x.planId===selectedPlanId;});document.getElementById('tabBadge'+i).textContent=d.length;}}
/* 渲染表格 */
function renderTable(){
var tbody=document.getElementById('tableBody'+currentTab);
document.getElementById('pageInfo'+currentTab).textContent='显示 '+filteredData.length+' 条记录';
if(!filteredData.length){tbody.innerHTML='<tr><td colspan="19" class="td-empty">暂无匹配数据</td></tr>';return;}
if(!filteredData.length){tbody.innerHTML='<tr><td colspan="18" class="td-empty">暂无匹配数据</td></tr>';return;}
var html='';
filteredData.forEach(function(d){
html+='<tr>';
html+='<td>'+esc(d.planName)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td>';
filteredData.forEach(function(d,i){
html+='<tr>';
html+='<td>'+(i+1)+'</td>';
html+='<td>'+esc(d.planName)+'</td><td>'+esc(d.name)+'</td><td>'+esc(d.empId)+'</td>';
html+='<td>'+d.gender+'</td><td>'+d.age+'</td><td>'+esc(d.org)+'</td><td>'+esc(d.dept)+'</td>';
html+='<td>'+d.height+'</td><td>'+d.weight+'</td><td>'+d.bmi.toFixed(1)+'</td><td>'+d.waist+'</td><td>'+d.fat.toFixed(1)+'</td>';
html+='<td>'+d.targetWeight+'</td><td>'+d.targetBmi+'</td><td>'+d.targetWaist+'</td><td>'+d.targetFat+'</td>';
html+='<td>'+d.height+'</td>';
html+='<td>'+d.weight+' → '+d.targetWeight+'</td>';
html+='<td>'+d.bmi.toFixed(1)+' → '+d.targetBmi+'</td>';
html+='<td>'+d.waist+' → '+d.targetWaist+'</td>';
html+='<td>'+d.fat.toFixed(1)+' → '+d.targetFat+'</td>';
html+='<td>'+esc(d.submitTime)+'</td>';
if(currentTab===0) html+='<td class="td-actions"><a class="link" href="javascript:void(0)" onclick="openAudit(\''+esc(d.empId)+'\')">审核</a></td>';
if(currentTab===1){html+='<td>'+esc(d.auditTime)+'</td><td>'+esc(d.auditor)+'</td>';}
if(currentTab===0){html+='<td>'+esc(d.rejectTime||'-')+'</td><td>'+esc(d.rejectAuditor||d.auditor||'-')+'</td><td>'+esc(d.rejectReason||'-')+'</td>';
var reviewStatusLabels = {0:'待审核', 1:'已通过', 2:'已通过待签署', 3:'已驳回'};
html += '<td>'+esc(reviewStatusLabels[d.status] || '-')+'</td>';
}
if(currentTab===1) html+='<td class="td-actions"><a class="link" href="javascript:void(0)" onclick="openAudit(\''+esc(d.empId)+'\')">审核</a></td>';
if(currentTab===2){html+='<td>'+esc(d.auditTime)+'</td><td>'+esc(d.auditor)+'</td>';}
if(currentTab===3){html+='<td>'+esc(d.rejectTime)+'</td><td>'+esc(d.rejectAuditor)+'</td><td><span class="reject-reason" title="'+escAttr(d.rejectReason)+'">'+esc(d.rejectReason)+'</span></td>';}
if(currentTab===3){html+='<td>'+esc(d.auditTime)+'</td><td>'+esc(d.auditor)+'</td>';}
if(currentTab===4){html+='<td>'+esc(d.rejectTime)+'</td><td>'+esc(d.rejectAuditor)+'</td><td><span class="reject-reason" title="'+escAttr(d.rejectReason)+'">'+esc(d.rejectReason)+'</span></td>';}
html+='</tr>';
});
tbody.innerHTML=html;
@@ -728,12 +755,12 @@ function renderCmpTable(row){
function openAudit(empId){
var idx=-1;
for(var i=0;i<tabData[0].length;i++){if(tabData[0][i].empId===empId){idx=i;break;}}
for(var i=0;i<tabData[1].length;i++){if(tabData[1][i].empId===empId){idx=i;break;}}
if(idx===-1)return;
pendingAuditRow={data:tabData[0][idx],index:idx};
pendingAuditRow={data:tabData[1][idx],index:idx};
auditDecision='';
renderBasicInfoCard(tabData[0][idx]);
renderCmpTable(tabData[0][idx]);
renderBasicInfoCard(tabData[1][idx]);
renderCmpTable(tabData[1][idx]);
document.getElementById('auditBtnApprove').classList.remove('selected');
document.getElementById('auditBtnReject').classList.remove('selected');
document.getElementById('auditRejectSection').classList.remove('show');
@@ -760,16 +787,16 @@ function closeAudit(){document.getElementById('auditOverlay').classList.remove('
function confirmAudit(){
if(!pendingAuditRow||!auditDecision)return;
if(auditDecision==='approve'){
var row=tabData[0].splice(pendingAuditRow.index,1)[0];
var row=tabData[1].splice(pendingAuditRow.index,1)[0];
var now=new Date(); row.auditTime=now.getFullYear()+'-'+('0'+(now.getMonth()+1)).slice(-2)+'-'+('0'+now.getDate()).slice(-2)+' '+('0'+now.getHours()).slice(-2)+':'+('0'+now.getMinutes()).slice(-2);
row.auditor='张健康'; tabData[1].unshift(row);
row.auditor='张健康'; tabData[2].unshift(row);
closeAudit(); showToast('已通过「'+row.name+'」的目标体重审核'); applyFilter();
} else {
var reason=document.getElementById('auditRejectReason').value.trim();
if(!reason){showToast('请输入驳回原因');return;}
var row=tabData[0].splice(pendingAuditRow.index,1)[0];
var row=tabData[1].splice(pendingAuditRow.index,1)[0];
var now=new Date(); row.rejectTime=now.getFullYear()+'-'+('0'+(now.getMonth()+1)).slice(-2)+'-'+('0'+now.getDate()).slice(-2)+' '+('0'+now.getHours()).slice(-2)+':'+('0'+now.getMinutes()).slice(-2);
row.rejectReason=reason; row.rejectAuditor='张健康'; tabData[3].unshift(row);
row.rejectReason=reason; row.rejectAuditor='张健康'; tabData[4].unshift(row);
closeAudit(); showToast('已驳回「'+row.name+'」的目标体重申请'); applyFilter();
}
}
+112 -149
View File
@@ -43,17 +43,6 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
.page-header__breadcrumb span{color:var(--text-primary);}
/* 计划选择区 */
.plan-selector{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:flex-start;gap:24px;}
.plan-selector__left{flex:1;min-width:0;max-width:400px;}
.plan-selector__label{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:8px;font-weight:500;}
.plan-selector__right{flex:1;display:flex;gap:28px;padding:18px 20px;background:#FAFAFA;border-radius:var(--radius-md);border:1px solid var(--border);min-height:78px;align-items:center;}
.plan-selector__right--empty{justify-content:center;color:var(--text-placeholder);font-size:var(--font-sm);}
.plan-info-item{display:flex;flex-direction:column;gap:6px;}
.plan-info-item__label{font-size:var(--font-xs);color:var(--text-secondary);}
.plan-info-item__value{font-size:var(--font-base);color:var(--text-primary);font-weight:600;}
.plan-info-item__value strong{color:var(--primary);font-size:var(--font-lg);}
/* 搜索下拉 */
.search-select{position:relative;width:100%;}
.search-select__input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 36px 0 12px;font-size:var(--font-sm);outline:none;transition:border-color .2s;box-sizing:border-box;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 12px center;}
@@ -125,24 +114,30 @@ tbody td{padding:10px 6px;text-align:center;font-size:var(--font-sm);color:var(-
tbody tr:last-child td{border-bottom:none;}
tbody tr:hover{background:#F8FBFF;}
/* 前列固定左侧(个人排名) */
#personTable thead th:nth-child(1),#personTable tbody td:nth-child(1){position:sticky;left:0;z-index:14;background:#fff;width:180px;min-width:180px;max-width:180px;overflow:hidden;text-overflow:ellipsis;}
#personTable thead th:nth-child(1){z-index:17;background:#FAFAFA;}
#personTable thead th:nth-child(2),#personTable tbody td:nth-child(2){position:sticky;left:180px;z-index:13;background:#fff;width:56px;min-width:56px;max-width:56px;}
#personTable thead th:nth-child(2){z-index:16;background:#FAFAFA;}
#personTable thead th:nth-child(3),#personTable tbody td:nth-child(3){position:sticky;left:236px;z-index:12;background:#fff;width:88px;min-width:88px;max-width:88px;}
#personTable thead th:nth-child(3){z-index:15;background:#FAFAFA;}
#personTable tbody tr:hover td:nth-child(1),
#personTable tbody tr:hover td:nth-child(2),
#personTable tbody tr:hover td:nth-child(3){background:#F8FBFF;}
/* 前列固定左侧(个人排名) */
#personTable thead th:nth-child(1),#personTable tbody td:nth-child(1){position:sticky;left:0;z-index:15;background:#fff;width:52px;min-width:52px;max-width:52px;overflow:hidden;text-overflow:ellipsis;}
#personTable thead th:nth-child(1){z-index:18;background:#FAFAFA;}
#personTable thead th:nth-child(2),#personTable tbody td:nth-child(2){position:sticky;left:52px;z-index:14;background:#fff;width:180px;min-width:180px;max-width:180px;overflow:hidden;text-overflow:ellipsis;}
#personTable thead th:nth-child(2){z-index:17;background:#FAFAFA;}
#personTable thead th:nth-child(3),#personTable tbody td:nth-child(3){position:sticky;left:232px;z-index:13;background:#fff;width:56px;min-width:56px;max-width:56px;}
#personTable thead th:nth-child(3){z-index:16;background:#FAFAFA;}
#personTable thead th:nth-child(4),#personTable tbody td:nth-child(4){position:sticky;left:288px;z-index:12;background:#fff;width:88px;min-width:88px;max-width:88px;}
#personTable thead th:nth-child(4){z-index:15;background:#FAFAFA;}
#personTable tbody tr:hover td:nth-child(1),
#personTable tbody tr:hover td:nth-child(2),
#personTable tbody tr:hover td:nth-child(3),
#personTable tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 单位排名前列固定 */
#unitTable thead th:nth-child(1),#unitTable tbody td:nth-child(1){position:sticky;left:0;z-index:14;background:#fff;width:130px;min-width:130px;max-width:130px;overflow:hidden;text-overflow:ellipsis;}
#unitTable thead th:nth-child(1){z-index:17;background:#FAFAFA;}
#unitTable thead th:nth-child(2),#unitTable tbody td:nth-child(2){position:sticky;left:130px;z-index:13;background:#fff;width:72px;min-width:72px;max-width:72px;}
#unitTable thead th:nth-child(2){z-index:16;background:#FAFAFA;}
#unitTable tbody tr:hover td:nth-child(1),
#unitTable tbody tr:hover td:nth-child(2){background:#F8FBFF;}
/* 单位排名前列固定 */
#unitTable thead th:nth-child(1),#unitTable tbody td:nth-child(1){position:sticky;left:0;z-index:15;background:#fff;width:52px;min-width:52px;max-width:52px;overflow:hidden;text-overflow:ellipsis;}
#unitTable thead th:nth-child(1){z-index:18;background:#FAFAFA;}
#unitTable thead th:nth-child(2),#unitTable tbody td:nth-child(2){position:sticky;left:52px;z-index:14;background:#fff;width:130px;min-width:130px;max-width:130px;overflow:hidden;text-overflow:ellipsis;}
#unitTable thead th:nth-child(2){z-index:17;background:#FAFAFA;}
#unitTable thead th:nth-child(3),#unitTable tbody td:nth-child(3){position:sticky;left:182px;z-index:13;background:#fff;width:72px;min-width:72px;max-width:72px;}
#unitTable thead th:nth-child(3){z-index:16;background:#FAFAFA;}
#unitTable tbody tr:hover td:nth-child(1),
#unitTable tbody tr:hover td:nth-child(2),
#unitTable tbody tr:hover td:nth-child(3){background:#F8FBFF;}
/* 后四列固定右侧(个人排名)— 排名列始终可见,z-index整体低于左侧固定列 */
#personTable thead th:nth-last-child(4),#personTable tbody td:nth-last-child(4){position:sticky;right:228px;z-index:4;background:#fff;width:76px;min-width:76px;max-width:76px;box-shadow:-2px 0 4px rgba(0,0,0,0.04);}
@@ -172,16 +167,19 @@ tbody tr:hover{background:#F8FBFF;}
#unitTable tbody tr:hover td:nth-last-child(3),
#unitTable tbody tr:hover td:nth-last-child(4){background:#F8FBFF;}
/* 三级单位排名前列固定 */
#unitTable3 thead th:nth-child(1),#unitTable3 tbody td:nth-child(1){position:sticky;left:0;z-index:14;background:#fff;width:130px;min-width:130px;max-width:130px;overflow:hidden;text-overflow:ellipsis;}
#unitTable3 thead th:nth-child(1){z-index:17;background:#FAFAFA;}
#unitTable3 thead th:nth-child(2),#unitTable3 tbody td:nth-child(2){position:sticky;left:130px;z-index:13;background:#fff;width:64px;min-width:64px;max-width:64px;}
#unitTable3 thead th:nth-child(2){z-index:16;background:#FAFAFA;}
#unitTable3 thead th:nth-child(3),#unitTable3 tbody td:nth-child(3){position:sticky;left:194px;z-index:12;background:#fff;width:64px;min-width:64px;max-width:64px;}
#unitTable3 thead th:nth-child(3){z-index:15;background:#FAFAFA;}
#unitTable3 tbody tr:hover td:nth-child(1),
#unitTable3 tbody tr:hover td:nth-child(2),
#unitTable3 tbody tr:hover td:nth-child(3){background:#F8FBFF;}
/* 三级单位排名前列固定 */
#unitTable3 thead th:nth-child(1),#unitTable3 tbody td:nth-child(1){position:sticky;left:0;z-index:16;background:#fff;width:52px;min-width:52px;max-width:52px;overflow:hidden;text-overflow:ellipsis;}
#unitTable3 thead th:nth-child(1){z-index:19;background:#FAFAFA;}
#unitTable3 thead th:nth-child(2),#unitTable3 tbody td:nth-child(2){position:sticky;left:52px;z-index:15;background:#fff;width:130px;min-width:130px;max-width:130px;overflow:hidden;text-overflow:ellipsis;}
#unitTable3 thead th:nth-child(2){z-index:18;background:#FAFAFA;}
#unitTable3 thead th:nth-child(3),#unitTable3 tbody td:nth-child(3){position:sticky;left:182px;z-index:14;background:#fff;width:64px;min-width:64px;max-width:64px;}
#unitTable3 thead th:nth-child(3){z-index:17;background:#FAFAFA;}
#unitTable3 thead th:nth-child(4),#unitTable3 tbody td:nth-child(4){position:sticky;left:246px;z-index:13;background:#fff;width:64px;min-width:64px;max-width:64px;}
#unitTable3 thead th:nth-child(4){z-index:16;background:#FAFAFA;}
#unitTable3 tbody tr:hover td:nth-child(1),
#unitTable3 tbody tr:hover td:nth-child(2),
#unitTable3 tbody tr:hover td:nth-child(3),
#unitTable3 tbody tr:hover td:nth-child(4){background:#F8FBFF;}
/* 后四列固定右侧(三级单位排名) */
#unitTable3 thead th:nth-last-child(4),#unitTable3 tbody td:nth-last-child(4){position:sticky;right:168px;z-index:4;background:#fff;width:56px;min-width:56px;max-width:56px;box-shadow:-2px 0 4px rgba(0,0,0,0.04);}
@@ -270,7 +268,7 @@ tbody tr:hover{background:#F8FBFF;}
<a href="weight-ranking.html" class="sidebar-item active">体重排名</a>
<a href="action-overview.html" class="sidebar-item">活动总览</a>
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
<a href="recipe-record.html" class="sidebar-item">食谱记录</a>
<a href="recipe-record.html" class="sidebar-item">堂食</a>
</aside>
<!-- 主内容 -->
@@ -281,58 +279,26 @@ tbody tr:hover{background:#F8FBFF;}
<div class="page-header__breadcrumb">体重管理 / 过程管理 / <span>体重排名</span></div>
</div>
<!-- [交互] 干预计划选择区 — 搜索下拉选择计划,选中后右侧展示基本信息 -->
<div class="plan-selector">
<div class="plan-selector__left">
<div class="plan-selector__label">干预计划</div>
<div class="search-select" id="planSelect">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<!-- [交互] 点击清空已选计划,恢复未选择状态 -->
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<!-- [交互] 选中计划后此处展示基本信息;未选中时显示占位提示 -->
<div class="plan-selector__right plan-selector__right--empty" id="planInfoEmpty">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" style="margin-right:6px;flex-shrink:0;"><circle cx="9" cy="9" r="8" stroke="#999" stroke-width="1.2" stroke-dasharray="3 2"/><path d="M9 5v4M9 11v.5" stroke="#999" stroke-width="1.2" stroke-linecap="round"/></svg>
可选择干预计划进行查看
</div>
<div class="plan-selector__right" id="planInfo" style="display:none;">
<div class="plan-info-item">
<span class="plan-info-item__label">组织机构</span>
<span class="plan-info-item__value" id="piOrg">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">起止日期</span>
<span class="plan-info-item__value" id="piDate">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">进行天数</span>
<span class="plan-info-item__value" id="piDays">-</span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">应参加人数</span>
<span class="plan-info-item__value"><strong id="piCount">-</strong></span>
</div>
<div class="plan-info-item">
<span class="plan-info-item__label">实际参加人数</span>
<span class="plan-info-item__value"><strong id="piActual">-</strong></span>
</div>
</div>
</div>
<!-- [交互] 一级Tab:个人排名 | 单位排名 -->
<div class="tab-bar">
<div class="tab-item active" data-tab="person" onclick="switchMainTab('person')">个人排名</div>
<div class="tab-item" data-tab="unit" onclick="switchMainTab('unit')">单位排名</div>
</div>
<!-- [交互] 一级Tab:个人排名 | 单位排名 -->
<div class="tab-bar">
<div class="tab-item active" data-tab="person" onclick="switchMainTab('person')">个人排名</div>
<div class="tab-item" data-tab="unit" onclick="switchMainTab('unit')">单位排名</div>
</div>
<!-- ===== 个人排名 Tab ===== -->
<div class="tab-panel active" id="tabPerson">
<!-- [交互] 筛选栏 — 单位部门、姓名、员工编号 -->
<div class="filter-bar">
<div class="filter-item">
<label>单位部门</label>
<!-- ===== 个人排名 Tab ===== -->
<div class="tab-panel active" id="tabPerson">
<!-- [交互] 筛选栏 — 干预计划、单位部门、姓名、员工编号 -->
<div class="filter-bar">
<div class="filter-item">
<label>干预计划</label>
<div class="search-select" id="planSelect" style="width:280px;">
<input class="search-select__input" id="planSearchInput" placeholder="搜索计划名称或组织机构" oninput="searchPlan()" onfocus="showPlanPanel()" autocomplete="off">
<button class="search-select__clear" id="planClearBtn" onclick="clearPlan()" title="清空计划">×</button>
<div class="search-select__panel" id="planPanel"></div>
</div>
</div>
<div class="filter-item">
<label>单位部门</label>
<div class="org-select-wrap" id="orgWrap">
<div class="org-trigger" id="orgTrigger" onclick="toggleOrg()">全部单位/部门</div>
<div class="org-panel" id="orgPanel">
@@ -382,6 +348,7 @@ tbody tr:hover{background:#F8FBFF;}
<table id="personTable">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>姓名</th>
<th>员工编号</th>
@@ -474,6 +441,7 @@ tbody tr:hover{background:#F8FBFF;}
<table id="unitTable">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>单位</th>
<th>参与人数</th>
@@ -505,6 +473,7 @@ tbody tr:hover{background:#F8FBFF;}
<table id="unitTable3">
<thead>
<tr>
<th>序号</th>
<th>干预计划</th>
<th>单位</th>
<th>部门</th>
@@ -768,35 +737,26 @@ function showPlanPanel(){
}
function selectPlan(planId){
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
document.getElementById('planInfoEmpty').style.display = 'none';
document.getElementById('planInfo').style.display = 'flex';
document.getElementById('piOrg').textContent = plan.org;
document.getElementById('piDate').textContent = plan.dateFrom + ' ~ ' + plan.dateTo;
document.getElementById('piDays').textContent = calcPlanDays(plan.dateFrom, plan.dateTo) + ' 天';
document.getElementById('piCount').textContent = plan.totalCount + ' 人';
document.getElementById('piActual').textContent = (plan.actualCount || 0) + ' 人';
if(mainTab === 'person'){ applyPersonFilter(); }
else { applyUnitFilter(); }
}
selectedPlanId = planId;
var plan = plans.find(function(p){return p.id === planId;});
if(!plan) return;
document.getElementById('planSearchInput').value = plan.name;
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planClearBtn').classList.add('show');
document.getElementById('planSelect').classList.add('search-select--selected');
if(mainTab === 'person'){ applyPersonFilter(); }
else { applyUnitFilter(); }
}
function clearPlan(){
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
document.getElementById('planInfoEmpty').style.display = '';
document.getElementById('planInfo').style.display = 'none';
if(mainTab === 'person'){ applyPersonFilter(); }
else { applyUnitFilter(); }
}
selectedPlanId = null;
document.getElementById('planSearchInput').value = '';
document.getElementById('planClearBtn').classList.remove('show');
document.getElementById('planSelect').classList.remove('search-select--selected');
document.getElementById('planPanel').classList.remove('show');
if(mainTab === 'person'){ applyPersonFilter(); }
else { applyUnitFilter(); }
}
/* ===== 单位部门双列面板 ===== */
var deptMap = {
@@ -928,21 +888,22 @@ function renderPersonTable(){
document.getElementById('personPageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + personFiltered.length + ' 条记录';
document.getElementById('personPageNum').textContent = '第 ' + (personPage + 1) + '/' + totalPages + ' 页';
if(personFiltered.length === 0){
tbody.innerHTML = '<tr><td colspan="30" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="31" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
var wacCls = d.waistChange < 0 ? 'change-down' : (d.waistChange > 0 ? 'change-up' : 'change-zero');
var wcSign = d.weightChange > 0 ? '+' : '';
var bcSign = d.bmiChange > 0 ? '+' : '';
var fcSign = d.fatChange > 0 ? '+' : '';
var wacSign = d.waistChange > 0 ? '+' : '';
html += '<tr>';
html += '<td>'+esc(d.planName)+'</td>';
pageData.forEach(function(d,i){
var wcCls = d.weightChange < 0 ? 'change-down' : (d.weightChange > 0 ? 'change-up' : 'change-zero');
var bcCls = d.bmiChange < 0 ? 'change-down' : (d.bmiChange > 0 ? 'change-up' : 'change-zero');
var fcCls = d.fatChange < 0 ? 'change-down' : (d.fatChange > 0 ? 'change-up' : 'change-zero');
var wacCls = d.waistChange < 0 ? 'change-down' : (d.waistChange > 0 ? 'change-up' : 'change-zero');
var wcSign = d.weightChange > 0 ? '+' : '';
var bcSign = d.bmiChange > 0 ? '+' : '';
var fcSign = d.fatChange > 0 ? '+' : '';
var wacSign = d.waistChange > 0 ? '+' : '';
html += '<tr>';
html += '<td>'+(personPage*personPageSize+i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.name)+'</td>';
html += '<td>'+esc(d.empId)+'</td>';
html += '<td>'+d.gender+'</td>';
@@ -1031,27 +992,28 @@ function renderUnitTable(){
// 修正page超出范围
if(unitPage >= totalPages){ unitPage = Math.max(0, totalPages - 1); return renderUnitTable(); }
if(data.length === 0){
tbody.innerHTML = '<tr><td colspan="11" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
tbody.innerHTML = '<tr><td colspan="13" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
return;
}
var html = '';
pageData.forEach(function(d){
html += '<tr>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+d.count+'</td>';
html += '<td>'+d.avgWeightLoss+'</td>';
html += '<td>'+d.avgWeightRate+'%</td>';
html += '<td>'+d.avgCompositeScore+'</td>';
html += '<td>'+d.avgActionScore+'</td>';
html += '<td>'+d.weightLossRank+'</td>';
html += '<td>'+d.weightRateRank+'</td>';
html += '<td>'+d.compositeRank+'</td>';
html += '<td>'+d.actionRank+'</td>';
html += '</tr>';
});
tbody.innerHTML = html;
}
var html = '';
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(unitPage*unitPageSize+i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+d.count+'</td>';
html += '<td>'+d.avgWeightLoss+'</td>';
html += '<td>'+d.avgWeightRate+'%</td>';
html += '<td>'+d.avgCompositeScore+'</td>';
html += '<td>'+d.avgActionScore+'</td>';
html += '<td>'+d.weightLossRank+'</td>';
html += '<td>'+d.weightRateRank+'</td>';
html += '<td>'+d.compositeRank+'</td>';
html += '<td>'+d.actionRank+'</td>';
html += '</tr>';
});
tbody.innerHTML = html;
}
function goUnitPage(delta){
var data = unitRankData.slice();
@@ -1111,8 +1073,9 @@ function renderUnitTable3(){
return;
}
var html = '';
pageData.forEach(function(d){
pageData.forEach(function(d,i){
html += '<tr>';
html += '<td>'+(unitPage3*unitPageSize+i+1)+'</td>';
html += '<td>'+esc(d.planName)+'</td>';
html += '<td>'+esc(d.org)+'</td>';
html += '<td>'+esc(d.dept)+'</td>';