feat: 体重管理异常事件页面补全,新增历史干预模块及个人目标详情
- exception-system-dirty.html: 补全系统脏数据页(筛选栏/操作栏/9列表格/分页/10条Mock数据) - exception-result-abnormal.html: 补全结果异常页(筛选栏含单位部门联动/操作栏/9列表格/分页/10条Mock数据) - 新增 history-plan-list.html、history-plan-detail.html、personal-target-detail.html - activity-statistics.html、weight-ranking.html、detail-data.html、personal-target-data.html 等页面大幅重构 - 全部36个页面顶部导航新增「历史干预」菜单 - index.html SITE_MAP 同步更新 - health-monitor/exception-result.html 移除异常等级筛选及列 - CHANGELOG 追加 2026-06-18 条目 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
7b05763222
commit
06587d20a3
@@ -240,7 +240,10 @@ const SITE_MAP = [
|
||||
{ file:'detail-data.html', label:'详细数据' },
|
||||
{ file:'weight-ranking.html', label:'体重排名' },
|
||||
{ file:'activity-statistics.html', label:'活动统计' },
|
||||
{ file:'history-plan-list.html', label:'历史干预-计划列表' },
|
||||
{ file:'history-plan-detail.html', label:'历史干预-计划详情' },
|
||||
{ file:'personal-target-data.html', label:'个人目标数据' },
|
||||
{ file:'personal-target-detail.html', label:'个人目标数据-详情' },
|
||||
{ file:'scale-device.html', label:'体重秤-设备管理' },
|
||||
{ file:'scale-monitor.html', label:'体重秤-设备监测' },
|
||||
{ file:'scale-device-add.html', label:'体重秤-新增设备' },
|
||||
|
||||
@@ -143,15 +143,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<option>环境监测</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>异常等级</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>严重</option>
|
||||
<option>中等</option>
|
||||
<option>轻微</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>年份</label>
|
||||
<select class="filter-select" style="min-width:90px;">
|
||||
@@ -183,7 +174,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<th>业务模块</th>
|
||||
<th>异常指标</th>
|
||||
<th>异常值</th>
|
||||
<th>异常等级</th>
|
||||
<th>发现时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -196,7 +186,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<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>
|
||||
@@ -207,7 +196,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<td>穿戴监测</td>
|
||||
<td>心率异常</td>
|
||||
<td>125 bpm</td>
|
||||
<td><span class="tag tag-red">严重</span></td>
|
||||
<td>2026-05-13 14:22</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -218,7 +206,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<td>健康排查</td>
|
||||
<td>积分异常</td>
|
||||
<td>0分</td>
|
||||
<td><span class="tag tag-orange">中等</span></td>
|
||||
<td>2026-05-12 09:15</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -229,7 +216,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<td>环境监测</td>
|
||||
<td>温度异常</td>
|
||||
<td>38.2°C</td>
|
||||
<td><span class="tag tag-red">严重</span></td>
|
||||
<td>2026-05-11 16:45</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -240,7 +226,6 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<td>穿戴监测</td>
|
||||
<td>血氧异常</td>
|
||||
<td>92%</td>
|
||||
<td><span class="tag tag-orange">轻微</span></td>
|
||||
<td>2026-05-10 11:20</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -133,6 +133,7 @@ tbody tr:hover td:nth-child(1){background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html" class="active">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -168,6 +168,7 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html" class="active">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -318,6 +319,8 @@ tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
<th rowspan="2">腰围变化<br>(cm)</th>
|
||||
<th class="th-parent" colspan="4">饮食总览</th>
|
||||
<th class="th-parent" colspan="4">运动总览</th>
|
||||
<th rowspan="2">减重量<br>排名</th>
|
||||
<th rowspan="2">减重率<br>排名</th>
|
||||
<th rowspan="2">赛况明细</th>
|
||||
</tr>
|
||||
<!-- [交互] 表头第二行:饮食总览和运动总览的子列 -->
|
||||
@@ -456,6 +459,26 @@ function buildOverviewData(){
|
||||
|
||||
var overviewData = buildOverviewData();
|
||||
var selectedPlanId = null;
|
||||
|
||||
/* ===== 计算排名:按计划内排序 ===== */
|
||||
(function computeRanks(){
|
||||
var planGroups = {};
|
||||
overviewData.forEach(function(d){
|
||||
if(!planGroups[d.planId]) planGroups[d.planId] = [];
|
||||
var weightLoss = +(d.initWeight - d.curWeight).toFixed(1);
|
||||
var weightLossRate = +((d.initWeight - d.curWeight) / d.initWeight * 100).toFixed(1);
|
||||
d.weightLoss = weightLoss;
|
||||
d.weightLossRate = weightLossRate;
|
||||
planGroups[d.planId].push(d);
|
||||
});
|
||||
Object.keys(planGroups).forEach(function(pid){
|
||||
var group = planGroups[pid];
|
||||
group.sort(function(a,b){return b.weightLoss - a.weightLoss;});
|
||||
group.forEach(function(d,i){d.weightLossRank = i + 1;});
|
||||
group.sort(function(a,b){return b.weightLossRate - a.weightLossRate;});
|
||||
group.forEach(function(d,i){d.weightLossRateRank = i + 1;});
|
||||
});
|
||||
})();
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
var filteredData = overviewData.slice();
|
||||
@@ -607,7 +630,7 @@ 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="33" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
|
||||
tbody.innerHTML = '<tr><td colspan="35" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
@@ -655,6 +678,9 @@ function renderTable(){
|
||||
html += '<td>'+d.exAvgSteps.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.exAvgDaily+'</td>';
|
||||
html += '<td class="col-exercise-last">'+d.exTotal+'</td>';
|
||||
// 排名
|
||||
html += '<td>'+d.weightLossRank+'</td>';
|
||||
html += '<td>'+d.weightLossRateRank+'</td>';
|
||||
// 赛况明细
|
||||
html += '<td><a class="link" href="javascript:void(0)" onclick="openMatchDetail(\''+esc(d.empId)+'\',\''+esc(d.name)+'\')">查看</a></td>';
|
||||
html += '</tr>';
|
||||
|
||||
@@ -256,6 +256,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html" class="active">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -5,35 +5,150 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>活动统计 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);
|
||||
}
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
|
||||
/* 顶部导航栏 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
|
||||
/* 侧边栏 */
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
|
||||
/* 主内容区 */
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 页面标题 */
|
||||
.page-header{margin-bottom:16px;}
|
||||
.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);}
|
||||
.search-select__input::placeholder{color:var(--text-placeholder);}
|
||||
.search-select__panel{position:absolute;top:100%;left:0;right:0;margin-top:4px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:500;display:none;max-height:280px;overflow-y:auto;}
|
||||
.search-select__panel.show{display:block;}
|
||||
.search-select__option{padding:12px 16px;font-size:var(--font-sm);cursor:pointer;transition:background .1s;border-bottom:1px solid #F5F5F5;}
|
||||
.search-select__option:last-child{border-bottom:none;}
|
||||
.search-select__option:hover{background:#F5F7FA;}
|
||||
.search-select__option.selected{color:var(--primary);background:var(--primary-light);}
|
||||
.search-select__option .ss-org{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:2px;}
|
||||
.search-select__empty{padding:20px;text-align:center;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
.search-select__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:none;background:none;cursor:pointer;color:var(--text-placeholder);font-size:16px;display:none;align-items:center;justify-content:center;border-radius:50%;line-height:1;padding:0;z-index:1;}
|
||||
.search-select__clear:hover{color:var(--text-primary);background:#F0F0F0;}
|
||||
.search-select__clear.show{display:flex;}
|
||||
.search-select--selected .search-select__input{background-image:none;padding-right:32px;}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
|
||||
|
||||
/* 单位多选下拉 */
|
||||
.unit-multi-select{position:relative;display:inline-block;}
|
||||
.unit-multi-trigger{height:32px;min-width:160px;max-width:280px;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;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.unit-multi-trigger.open,.unit-multi-trigger:hover{border-color:var(--primary);}
|
||||
.unit-multi-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);width:220px;max-height:280px;overflow-y:auto;}
|
||||
.unit-multi-panel.open{display:block;}
|
||||
.unit-check-item{padding:9px 14px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid #F5F5F5;}
|
||||
.unit-check-item:last-child{border-bottom:none;}
|
||||
.unit-check-item:hover{background:#F0F8FF;}
|
||||
.unit-check-item__box{width:16px;height:16px;border:1.5px solid var(--border);border-radius:2px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .15s;}
|
||||
.unit-check-item.active .unit-check-item__box{background:var(--primary);border-color:var(--primary);}
|
||||
.unit-check-item.active .unit-check-item__box::after{content:'';width:4px;height:8px;border:solid #fff;border-width:0 1.5px 1.5px 0;transform:rotate(45deg);margin-top:-1px;}
|
||||
.unit-multi-panel__actions{display:flex;gap:8px;padding:8px 12px;border-top:1px solid var(--border);position:sticky;bottom:0;background:#fff;}
|
||||
.unit-multi-panel__actions .btn-xs{height:26px;padding:0 12px;font-size:var(--font-xs);border-radius:var(--radius-sm);cursor:pointer;border:none;transition:all .2s;}
|
||||
.unit-multi-panel__actions .btn-xs--primary{background:var(--primary);color:#fff;}
|
||||
.unit-multi-panel__actions .btn-xs--primary:hover{background:#40a9ff;}
|
||||
.unit-multi-panel__actions .btn-xs--default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}
|
||||
.unit-multi-panel__actions .btn-xs--default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:32px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-xs);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.btn-export{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-export:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;border-top:1px solid var(--border);}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:collapse;min-width:1800px;}
|
||||
|
||||
/* 表头 */
|
||||
thead th{background:#FAFAFA;padding:8px 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;}
|
||||
thead th.th-divider{border-right:2px solid var(--border);}
|
||||
|
||||
/* 表体 */
|
||||
tbody td{padding:10px 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 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;}
|
||||
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 变化值颜色 */
|
||||
.change-down{color:var(--success);}
|
||||
.change-up{color:var(--danger);}
|
||||
.change-zero{color:var(--text-placeholder);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
|
||||
/* Toast */
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部导航栏 -->
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
<nav class="top-bar__nav">
|
||||
@@ -41,6 +156,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html" class="active">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -51,6 +167,8 @@
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">过程管理</div>
|
||||
<a href="action-record.html" class="sidebar-item">行动记录</a>
|
||||
@@ -59,8 +177,491 @@
|
||||
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
|
||||
<a href="activity-statistics.html" class="sidebar-item active">活动统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
<!-- 主内容区域 -->
|
||||
|
||||
<!-- 页面标题 -->
|
||||
<div class="page-header">
|
||||
<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-item">
|
||||
<label>单位</label>
|
||||
<div class="unit-multi-select" id="unitMultiWrap">
|
||||
<div class="unit-multi-trigger" id="unitMultiTrigger" onclick="toggleUnitMulti()">全部单位</div>
|
||||
<!-- [交互] 单位多选下拉面板,勾选后点击确定刷新列表 -->
|
||||
<div class="unit-multi-panel" id="unitMultiPanel">
|
||||
<div class="unit-check-item active" data-unit="" onclick="toggleUnitCheck(this,'')">
|
||||
<span class="unit-check-item__box"></span>全部单位
|
||||
</div>
|
||||
<div class="unit-check-item" data-unit="第四采油厂" onclick="toggleUnitCheck(this,'第四采油厂')">
|
||||
<span class="unit-check-item__box"></span>第四采油厂
|
||||
</div>
|
||||
<div class="unit-check-item" data-unit="采油一厂" onclick="toggleUnitCheck(this,'采油一厂')">
|
||||
<span class="unit-check-item__box"></span>采油一厂
|
||||
</div>
|
||||
<div class="unit-check-item" data-unit="采油二厂" onclick="toggleUnitCheck(this,'采油二厂')">
|
||||
<span class="unit-check-item__box"></span>采油二厂
|
||||
</div>
|
||||
<div class="unit-check-item" data-unit="采气一厂" onclick="toggleUnitCheck(this,'采气一厂')">
|
||||
<span class="unit-check-item__box"></span>采气一厂
|
||||
</div>
|
||||
<div class="unit-multi-panel__actions">
|
||||
<button class="btn-xs btn-xs--primary" onclick="confirmUnitFilter()">确定</button>
|
||||
<button class="btn-xs btn-xs--default" onclick="resetUnitFilter()">清空</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- [交互] 点击查询按钮筛选列表 -->
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作按钮区 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-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="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>干预计划</th>
|
||||
<th>单位</th>
|
||||
<th>起止日期</th>
|
||||
<th>应参加<br>人数</th>
|
||||
<th>已参加<br>人数</th>
|
||||
<th>未参加<br>人数</th>
|
||||
<th>人均初始<br>体重(kg)</th>
|
||||
<th>人均初始<br>BMI</th>
|
||||
<th>人均现<br>体重(kg)</th>
|
||||
<th>人均现<br>BMI</th>
|
||||
<th>人均减重<br>量(kg)</th>
|
||||
<th>活动累计<br>减重量(kg)</th>
|
||||
<th>人均减重率</th>
|
||||
<th>人均BMI下降</th>
|
||||
<th>人均每日<br>摄入(千卡)</th>
|
||||
<th>累计摄入<br>(千卡)</th>
|
||||
<th>人均每日<br>消耗(千卡)</th>
|
||||
<th>累计消耗<br>(千卡)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span id="pageInfo">显示 0 条记录</span>
|
||||
<button class="page-btn" onclick="goPage(-1)">‹</button>
|
||||
<span id="pageNum" style="font-size:var(--font-sm);color:var(--text-secondary);">第 1 页</span>
|
||||
<button class="page-btn" onclick="goPage(1)">›</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Toast -->
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 侧边栏当前页高亮 ===== */
|
||||
(function(){
|
||||
var current = location.pathname.split('/').pop();
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item){
|
||||
var href = item.getAttribute('href');
|
||||
item.classList.toggle('active', href === current);
|
||||
});
|
||||
})();
|
||||
|
||||
/* ===== 干预计划数据 ===== */
|
||||
var plans = [
|
||||
{id:1,name:'第四采油厂2026年超重健康干预计划',org:'第四采油厂',dateFrom:'2026-03-01',dateTo:'2026-08-31',totalCount:234,actualCount:218},
|
||||
{id:2,name:'采油一厂2026年体重管理专项行动',org:'采油一厂',dateFrom:'2026-04-01',dateTo:'2026-09-30',totalCount:186,actualCount:180},
|
||||
{id:3,name:'采油二厂2026年健康减重计划',org:'采油二厂',dateFrom:'2026-05-15',dateTo:'2026-11-15',totalCount:312,actualCount:295},
|
||||
{id:4,name:'采气一厂2025年度体重管理计划',org:'采气一厂',dateFrom:'2025-06-01',dateTo:'2025-12-01',totalCount:158,actualCount:142},
|
||||
{id:5,name:'第四采油厂2025年超重健康干预计划',org:'第四采油厂',dateFrom:'2025-03-01',dateTo:'2025-08-31',totalCount:267,actualCount:251},
|
||||
{id:6,name:'采油一厂2025年员工健康体重计划',org:'采油一厂',dateFrom:'2025-04-15',dateTo:'2025-10-15',totalCount:420,actualCount:398},
|
||||
{id:7,name:'采气一厂2026下半年体重干预计划',org:'采气一厂',dateFrom:'2026-09-01',dateTo:'2026-12-31',totalCount:89,actualCount:72},
|
||||
{id:8,name:'采油二厂2024年体重控制专项计划',org:'采油二厂',dateFrom:'2024-07-01',dateTo:'2024-12-31',totalCount:145,actualCount:130}
|
||||
];
|
||||
|
||||
/* ===== 单位列表 ===== */
|
||||
var allUnits = ['第四采油厂','采油一厂','采油二厂','采气一厂'];
|
||||
|
||||
/* ===== 生成统计Mock数据 ===== */
|
||||
function buildStatsData(){
|
||||
var data = [];
|
||||
// 每个计划 + 每个相关单位 生成一行聚合统计
|
||||
plans.forEach(function(p){
|
||||
// 每个计划关联其所属单位 + 随机1-2个其他单位
|
||||
var planUnits = [p.org];
|
||||
var otherUnits = allUnits.filter(function(u){return u !== p.org;});
|
||||
// 随机选 1-2 个其他单位
|
||||
var extraCount = Math.floor(Math.random() * 2) + 1;
|
||||
for(var i = 0; i < extraCount && i < otherUnits.length; i++){
|
||||
if(planUnits.indexOf(otherUnits[i]) === -1){
|
||||
planUnits.push(otherUnits[i]);
|
||||
}
|
||||
}
|
||||
planUnits.forEach(function(unit, ui){
|
||||
// 该单位在此计划中的参与人数
|
||||
var shouldCount, actualCount;
|
||||
if(unit === p.org){
|
||||
shouldCount = p.totalCount;
|
||||
actualCount = p.actualCount;
|
||||
} else {
|
||||
shouldCount = Math.floor(Math.random() * 80) + 30;
|
||||
actualCount = Math.floor(shouldCount * (0.75 + Math.random() * 0.2));
|
||||
}
|
||||
var notCount = shouldCount - actualCount;
|
||||
// 人均初始体重: 70-85kg
|
||||
var avgInitWeight = +(70 + Math.random() * 15).toFixed(1);
|
||||
// 人均初始BMI: 25-30
|
||||
var avgInitBmi = +(25 + Math.random() * 5).toFixed(1);
|
||||
// 人均减重量: 1-6kg
|
||||
var avgWeightLoss = +(1 + Math.random() * 5).toFixed(1);
|
||||
// 人均现体重 = 初始 - 减重
|
||||
var avgCurWeight = +(avgInitWeight - avgWeightLoss).toFixed(1);
|
||||
// 人均现BMI: 现体重 / (假设平均身高1.68m) 的平方
|
||||
var avgHeight = 1.68;
|
||||
var avgCurBmi = +(avgCurWeight / (avgHeight * avgHeight)).toFixed(1);
|
||||
// 活动累计减重量 = 人均减重 × 实际参加人数
|
||||
var totalWeightLoss = +(avgWeightLoss * actualCount).toFixed(1);
|
||||
// 人均减重率 = 人均减重 / 人均初始体重
|
||||
var avgLossRate = +(avgWeightLoss / avgInitWeight * 100).toFixed(1);
|
||||
// 人均BMI下降 = 人均初始BMI - 人均现BMI
|
||||
var avgBmiDrop = +(avgInitBmi - avgCurBmi).toFixed(1);
|
||||
// 人均每日摄入: 1400-2200千卡
|
||||
var avgDailyIntake = Math.floor(Math.random() * 800) + 1400;
|
||||
// 累计摄入 = 人均每日摄入 × 实际参加人数 × 进行天数(取50%)
|
||||
var planDays = calcPlanDaysNum(p.dateFrom, p.dateTo);
|
||||
var activeDays = Math.floor(planDays * 0.5);
|
||||
var totalIntake = avgDailyIntake * actualCount * activeDays;
|
||||
// 人均每日消耗: 300-600千卡
|
||||
var avgDailyConsume = Math.floor(Math.random() * 300) + 300;
|
||||
// 累计消耗 = 人均每日消耗 × 实际参加人数 × 进行天数(取50%)
|
||||
var totalConsume = avgDailyConsume * actualCount * activeDays;
|
||||
|
||||
data.push({
|
||||
planId: p.id,
|
||||
planName: p.name,
|
||||
unit: unit,
|
||||
dateFrom: p.dateFrom,
|
||||
dateTo: p.dateTo,
|
||||
shouldCount: shouldCount,
|
||||
actualCount: actualCount,
|
||||
notCount: notCount,
|
||||
avgInitWeight: avgInitWeight,
|
||||
avgInitBmi: avgInitBmi,
|
||||
avgCurWeight: avgCurWeight,
|
||||
avgCurBmi: avgCurBmi,
|
||||
avgWeightLoss: avgWeightLoss,
|
||||
totalWeightLoss: totalWeightLoss,
|
||||
avgLossRate: avgLossRate,
|
||||
avgBmiDrop: avgBmiDrop,
|
||||
avgDailyIntake: avgDailyIntake,
|
||||
totalIntake: totalIntake,
|
||||
avgDailyConsume: avgDailyConsume,
|
||||
totalConsume: totalConsume
|
||||
});
|
||||
});
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
var statsData = buildStatsData();
|
||||
var selectedPlanId = null;
|
||||
var selectedUnits = []; // 当前选中的单位列表(空=全部)
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
var filteredData = statsData.slice();
|
||||
|
||||
/* ===== 计划搜索选择 ===== */
|
||||
function searchPlan(){
|
||||
var keyword = document.getElementById('planSearchInput').value.trim().toLowerCase();
|
||||
var panel = document.getElementById('planPanel');
|
||||
var filtered = plans;
|
||||
if(keyword){
|
||||
filtered = plans.filter(function(p){
|
||||
return p.name.toLowerCase().indexOf(keyword) > -1 || p.org.toLowerCase().indexOf(keyword) > -1;
|
||||
});
|
||||
}
|
||||
if(filtered.length === 0){
|
||||
panel.innerHTML = '<div class="search-select__empty">无匹配计划</div>';
|
||||
} else {
|
||||
var html = '';
|
||||
filtered.forEach(function(p){
|
||||
var sel = selectedPlanId === p.id ? ' selected' : '';
|
||||
html += '<div class="search-select__option'+sel+'" onclick="selectPlan('+p.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(p.name)+'</div>';
|
||||
html += '<div class="ss-org">'+esc(p.org)+' | '+p.dateFrom+' ~ '+p.dateTo+' | 应参加 '+p.totalCount+' 人</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
panel.innerHTML = html;
|
||||
}
|
||||
}
|
||||
|
||||
function showPlanPanel(){
|
||||
searchPlan();
|
||||
document.getElementById('planPanel').classList.add('show');
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
/* [交互] 清空已选干预计划,恢复未选择状态 */
|
||||
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 toggleUnitMulti(){
|
||||
var panel = document.getElementById('unitMultiPanel');
|
||||
var trigger = document.getElementById('unitMultiTrigger');
|
||||
panel.classList.toggle('open');
|
||||
trigger.classList.toggle('open');
|
||||
}
|
||||
|
||||
/* [交互] 点击切换单位选项的选中状态 — "全部单位"与其他互斥 */
|
||||
function toggleUnitCheck(elem, unitCode){
|
||||
if(unitCode === ''){
|
||||
// 点击"全部单位":清空所有其他选中,只选中"全部单位"
|
||||
var allItems = document.querySelectorAll('#unitMultiPanel .unit-check-item');
|
||||
allItems.forEach(function(item){item.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
} else {
|
||||
// 点击具体单位:取消"全部单位"选中
|
||||
var allItem = document.querySelector('#unitMultiPanel .unit-check-item[data-unit=""]');
|
||||
allItem.classList.remove('active');
|
||||
elem.classList.toggle('active');
|
||||
}
|
||||
}
|
||||
|
||||
/* [交互] 确定单位筛选 */
|
||||
function confirmUnitFilter(){
|
||||
var activeItems = document.querySelectorAll('#unitMultiPanel .unit-check-item.active');
|
||||
selectedUnits = [];
|
||||
activeItems.forEach(function(item){
|
||||
var u = item.getAttribute('data-unit');
|
||||
if(u !== ''){
|
||||
selectedUnits.push(u);
|
||||
}
|
||||
});
|
||||
// 更新触发按钮文字
|
||||
if(selectedUnits.length === 0){
|
||||
document.getElementById('unitMultiTrigger').textContent = '全部单位';
|
||||
// 自动勾选"全部单位"
|
||||
document.querySelector('#unitMultiPanel .unit-check-item[data-unit=""]').classList.add('active');
|
||||
} else if(selectedUnits.length === 1){
|
||||
document.getElementById('unitMultiTrigger').textContent = selectedUnits[0];
|
||||
} else {
|
||||
document.getElementById('unitMultiTrigger').textContent = selectedUnits.length + ' 个单位已选';
|
||||
}
|
||||
// 关闭面板
|
||||
document.getElementById('unitMultiPanel').classList.remove('open');
|
||||
document.getElementById('unitMultiTrigger').classList.remove('open');
|
||||
}
|
||||
|
||||
/* [交互] 清空单位筛选 */
|
||||
function resetUnitFilter(){
|
||||
document.querySelectorAll('#unitMultiPanel .unit-check-item').forEach(function(item){item.classList.remove('active');});
|
||||
document.querySelector('#unitMultiPanel .unit-check-item[data-unit=""]').classList.add('active');
|
||||
selectedUnits = [];
|
||||
document.getElementById('unitMultiTrigger').textContent = '全部单位';
|
||||
document.getElementById('unitMultiPanel').classList.remove('open');
|
||||
document.getElementById('unitMultiTrigger').classList.remove('open');
|
||||
}
|
||||
|
||||
/* ===== 筛选 ===== */
|
||||
function applyFilter(){
|
||||
var data = statsData.slice();
|
||||
// 按计划筛选(选中时只展示该计划数据,未选中时展示全部)
|
||||
if(selectedPlanId){
|
||||
data = data.filter(function(d){return d.planId === selectedPlanId;});
|
||||
}
|
||||
// 按单位筛选(多选,空=全部)
|
||||
if(selectedUnits.length > 0){
|
||||
data = data.filter(function(d){
|
||||
return selectedUnits.indexOf(d.unit) !== -1;
|
||||
});
|
||||
}
|
||||
filteredData = data;
|
||||
currentPage = 0;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
function resetFilter(){
|
||||
resetUnitFilter();
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
/* ===== 渲染表格 ===== */
|
||||
function renderTable(){
|
||||
var tbody = document.getElementById('tableBody');
|
||||
var start = currentPage * pageSize;
|
||||
var pageData = filteredData.slice(start, start + pageSize);
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize) || 1;
|
||||
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>';
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
pageData.forEach(function(d){
|
||||
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>'+esc(d.planName)+'</td>';
|
||||
html += '<td>'+esc(d.unit)+'</td>';
|
||||
html += '<td>'+d.dateFrom+' ~ '+d.dateTo+'</td>';
|
||||
html += '<td>'+d.shouldCount+'</td>';
|
||||
html += '<td>'+d.actualCount+'</td>';
|
||||
html += '<td>'+d.notCount+'</td>';
|
||||
html += '<td>'+d.avgInitWeight+'</td>';
|
||||
html += '<td>'+d.avgInitBmi+'</td>';
|
||||
html += '<td>'+d.avgCurWeight+'</td>';
|
||||
html += '<td>'+d.avgCurBmi+'</td>';
|
||||
html += '<td class="'+lossCls+'">'+lossSign+Math.abs(d.avgWeightLoss)+'</td>';
|
||||
html += '<td class="'+lossCls+'">'+lossSign+Math.abs(d.totalWeightLoss)+'</td>';
|
||||
html += '<td class="'+lossCls+'">'+lossSign+d.avgLossRate+'%</td>';
|
||||
html += '<td class="'+bmiCls+'">'+bmiSign+Math.abs(d.avgBmiDrop)+'</td>';
|
||||
html += '<td>'+d.avgDailyIntake.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.totalIntake.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.avgDailyConsume.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.totalConsume.toLocaleString()+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
/* ===== 翻页 ===== */
|
||||
function goPage(delta){
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize);
|
||||
var newPage = currentPage + delta;
|
||||
if(newPage < 0 || newPage >= totalPages) return;
|
||||
currentPage = newPage;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 工具函数 ===== */
|
||||
function calcPlanDaysNum(dateFrom, dateTo){
|
||||
var today = new Date();
|
||||
var from = new Date(dateFrom);
|
||||
var to = new Date(dateTo);
|
||||
var end = to < today ? to : today;
|
||||
if(end < from) return 0;
|
||||
return Math.ceil((end - from) / (1000*60*60*24)) + 1;
|
||||
}
|
||||
function esc(s){return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
setTimeout(function(){t.classList.remove('show');},1500);
|
||||
}
|
||||
|
||||
/* 点击外部关闭下拉 */
|
||||
document.addEventListener('click',function(e){
|
||||
if(!e.target.closest('#planSelect')){
|
||||
document.getElementById('planPanel').classList.remove('show');
|
||||
}
|
||||
var unitWrap = document.getElementById('unitMultiWrap');
|
||||
if(unitWrap && !unitWrap.contains(e.target)){
|
||||
document.getElementById('unitMultiPanel').classList.remove('open');
|
||||
document.getElementById('unitMultiTrigger').classList.remove('open');
|
||||
}
|
||||
});
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
(function init(){
|
||||
// 预填充计划下拉数据
|
||||
var html = '';
|
||||
plans.forEach(function(p){
|
||||
html += '<div class="search-select__option" onclick="selectPlan('+p.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(p.name)+'</div>';
|
||||
html += '<div class="ss-org">'+esc(p.org)+' | '+p.dateFrom+' ~ '+p.dateTo+' | 应参加 '+p.totalCount+' 人</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
document.getElementById('planPanel').innerHTML = html;
|
||||
renderTable();
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -65,11 +65,30 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);}
|
||||
.table-card__title{font-size:var(--font-base);font-weight:600;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:collapse;min-width:100%;white-space:nowrap;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;white-space:nowrap;}
|
||||
thead th{background:#FAFAFA;padding:10px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:12px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
tbody tr:hover td{background:#F8FBFF;}
|
||||
/* 左侧固定列:序号、姓名、员工编号 */
|
||||
thead th:nth-child(1),tbody td:nth-child(1){position:sticky;left:0;z-index:2;background:#fff;width:54px;min-width:54px;}
|
||||
thead th:nth-child(1){background:#FAFAFA;z-index:4;}
|
||||
thead th:nth-child(2),tbody td:nth-child(2){position:sticky;left:54px;z-index:2;background:#fff;width:72px;min-width:72px;}
|
||||
thead th:nth-child(2){background:#FAFAFA;z-index:4;}
|
||||
thead th:nth-child(3),tbody td:nth-child(3){position:sticky;left:126px;z-index:2;background:#fff;width:90px;min-width:90px;}
|
||||
thead th:nth-child(3){background:#FAFAFA;z-index:4;}
|
||||
/* 右侧固定列:详细数据 */
|
||||
thead th:last-child,tbody td:last-child{position:sticky;right:0;z-index:2;background:#fff;width:90px;min-width:90px;}
|
||||
thead th:last-child{background:#FAFAFA;z-index:4;}
|
||||
/* 左侧固定列分隔阴影 */
|
||||
thead th:nth-child(3),tbody td:nth-child(3){box-shadow:2px 0 8px rgba(0,0,0,0.06);}
|
||||
/* 右侧固定列分隔阴影 */
|
||||
thead th:last-child,tbody td:last-child{box-shadow:-2px 0 8px rgba(0,0,0,0.06);}
|
||||
/* hover时固定列保持hover背景 */
|
||||
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:last-child{background:#F8FBFF;}
|
||||
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-green{background:#F6FFED;color:var(--success);}
|
||||
.tag-orange{background:#FFF7E6;color:var(--warning);}
|
||||
@@ -106,6 +125,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -179,13 +199,21 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<th>年龄</th>
|
||||
<th>单位</th>
|
||||
<th>部门</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>
|
||||
<th>饮食记录次数</th>
|
||||
<th>运动记录次数</th>
|
||||
<th>体重记录次数</th>
|
||||
<th>体重变化(cm)</th>
|
||||
<th>BMI变化</th>
|
||||
<th>腰围变化(cm)</th>
|
||||
<th>体脂变化(%)</th>
|
||||
<th>详细数据</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -193,50 +221,50 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<tr>
|
||||
<td>1</td><td>李凯明</td><td>424234</td><td>男</td><td>23</td>
|
||||
<td>第四采油厂</td><td>岭南作业区</td>
|
||||
<td>95</td><td>30</td><td>30</td><td>90</td><td>80</td><td>28</td><td>28</td><td>80</td><td>-15</td><td>-2</td><td>-2</td><td>-10</td>
|
||||
<td>345</td><td>123</td><td>132</td>
|
||||
<td>95->80</td><td>30->28</td><td>90->80</td><td>30->28</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=424234">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td><td>张文胜</td><td>234223</td><td>男</td><td>45</td>
|
||||
<td>第四采油厂</td><td>虎狼山作业区</td>
|
||||
<td>95</td><td>30</td><td>30</td><td>90</td><td>80</td><td>28</td><td>28</td><td>80</td><td>-15</td><td>-2</td><td>-2</td><td>-10</td>
|
||||
<td>342</td><td>231</td><td>123</td>
|
||||
<td>95->80</td><td>30->28</td><td>90->80</td><td>30->28</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=234223">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td><td>王丽华</td><td>318756</td><td>女</td><td>32</td>
|
||||
<td>采油一厂</td><td>设备维护站</td>
|
||||
<td>72</td><td>26</td><td>28</td><td>82</td><td>66</td><td>23</td><td>25</td><td>76</td><td>-6</td><td>-3</td><td>-3</td><td>-6</td>
|
||||
<td>280</td><td>156</td><td>98</td>
|
||||
<td>72->66</td><td>26->23</td><td>82->76</td><td>28->25</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=318756">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td><td>刘建国</td><td>567890</td><td>男</td><td>38</td>
|
||||
<td>采气一厂</td><td>生产运行部</td>
|
||||
<td>88</td><td>29</td><td>32</td><td>95</td><td>82</td><td>27</td><td>29</td><td>89</td><td>-6</td><td>-2</td><td>-3</td><td>-6</td>
|
||||
<td>210</td><td>189</td><td>87</td>
|
||||
<td>88->82</td><td>29->27</td><td>95->89</td><td>32->29</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=567890">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5</td><td>陈思雨</td><td>192847</td><td>女</td><td>28</td>
|
||||
<td>CQ能源总部</td><td>人力资源部</td>
|
||||
<td>65</td><td>24</td><td>26</td><td>75</td><td>60</td><td>22</td><td>23</td><td>70</td><td>-5</td><td>-2</td><td>-3</td><td>-5</td>
|
||||
<td>356</td><td>200</td><td>145</td>
|
||||
<td>65->60</td><td>24->22</td><td>75->70</td><td>26->23</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=192847">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6</td><td>杨志强</td><td>445612</td><td>男</td><td>41</td>
|
||||
<td>采油二厂</td><td>后勤保障部</td>
|
||||
<td>92</td><td>31</td><td>33</td><td>98</td><td>86</td><td>28</td><td>30</td><td>92</td><td>-6</td><td>-3</td><td>-3</td><td>-6</td>
|
||||
<td>198</td><td>142</td><td>76</td>
|
||||
<td>92->86</td><td>31->28</td><td>98->92</td><td>33->30</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=445612">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>7</td><td>赵晓峰</td><td>678901</td><td>男</td><td>35</td>
|
||||
<td>采油一厂</td><td>技术研发部</td>
|
||||
<td>78</td><td>27</td><td>27</td><td>86</td><td>74</td><td>25</td><td>24</td><td>82</td><td>-4</td><td>-2</td><td>-3</td><td>-4</td>
|
||||
<td>267</td><td>178</td><td>110</td>
|
||||
<td>78->74</td><td>27->25</td><td>86->82</td><td>27->24</td>
|
||||
<td><a class="link" href="archive-personal-weight-detail.html?id=678901">查看</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -49,15 +49,26 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);outline:none;background:#fff;min-width:140px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;min-width:140px;}
|
||||
/* Tab */
|
||||
.tab-bar{display:flex;border-bottom:1px solid var(--border);margin-bottom:0;background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:0 24px;}
|
||||
.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);}
|
||||
.tab-item.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
|
||||
.tab-panel{display:none;}
|
||||
.tab-panel.active{display:block;}
|
||||
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card--tab{border-radius:0 0 var(--radius-md) var(--radius-md);}
|
||||
.table-card--tab .tab-panel:first-child .table-card__content{border-radius:0;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:collapse;white-space:nowrap;}
|
||||
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);}
|
||||
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);}
|
||||
thead th{background:#FAFAFA;padding:10px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);}
|
||||
tbody td{padding:12px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-green{background:#F6FFED;color:var(--success);}
|
||||
.tag-gray{background:#F5F5F5;color:#999;}
|
||||
.tag-blue{background:var(--primary-light);color:var(--primary);}
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;}.link:hover{color:#40a9ff;}
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
@@ -92,6 +103,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -136,25 +148,80 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 体重测量记录 -->
|
||||
<div class="table-card" style="margin-top:20px;">
|
||||
<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>体脂肪率(%)</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>2026-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>18.2</td><td><a class="link" onclick="openWeightModal(0)">详细信息</a></td></tr>
|
||||
<tr><td>2026-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>18.4</td><td><a class="link" onclick="openWeightModal(1)">详细信息</a></td></tr>
|
||||
<tr><td>2026-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>18.5</td><td><a class="link" onclick="openWeightModal(2)">详细信息</a></td></tr>
|
||||
<tr><td>2026-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>18.1</td><td><a class="link" onclick="openWeightModal(3)">详细信息</a></td></tr>
|
||||
<tr><td>2026-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>18.6</td><td><a class="link" onclick="openWeightModal(4)">详细信息</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- Tab导航 + 内容区 -->
|
||||
<div class="table-card" style="margin-top:16px;">
|
||||
<!-- Tab导航栏 -->
|
||||
<div class="tab-bar">
|
||||
<div class="tab-item active" onclick="switchTab(0)">饮食记录</div>
|
||||
<div class="tab-item" onclick="switchTab(1)">运动记录</div>
|
||||
<div class="tab-item" onclick="switchTab(2)">体重记录</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab面板:饮食记录 -->
|
||||
<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></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>2026-05-10 07:30</td><td><span class="tag tag-blue">早餐</span></td><td>356</td><td><span class="tag tag-green">智记</span></td></tr>
|
||||
<tr><td>2026-05-10 12:15</td><td><span class="tag tag-green">午餐</span></td><td>520</td><td><span class="tag tag-gray">自记</span></td></tr>
|
||||
<tr><td>2026-05-10 15:30</td><td><span class="tag tag-gray">加餐</span></td><td>185</td><td><span class="tag tag-green">智记</span></td></tr>
|
||||
<tr><td>2026-05-10 18:45</td><td><span class="tag tag-green">晚餐</span></td><td>410</td><td><span class="tag tag-gray">自记</span></td></tr>
|
||||
<tr><td>2026-05-09 08:00</td><td><span class="tag tag-blue">早餐</span></td><td>345</td><td><span class="tag tag-green">智记</span></td></tr>
|
||||
<tr><td>2026-05-09 12:00</td><td><span class="tag tag-green">午餐</span></td><td>580</td><td><span class="tag tag-gray">自记</span></td></tr>
|
||||
<tr><td>2026-05-09 19:00</td><td><span class="tag tag-green">晚餐</span></td><td>395</td><td><span class="tag tag-green">智记</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination"><span>共 345 条</span><button class="page-btn">‹</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">...</button><button class="page-btn">50</button><button class="page-btn">›</button></div>
|
||||
</div>
|
||||
|
||||
<!-- Tab面板:运动记录 -->
|
||||
<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></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>2026-05-10 06:30</td><td>跑步</td><td>45min</td><td>420</td><td><span class="tag tag-blue">穿戴</span></td></tr>
|
||||
<tr><td>2026-05-10 08:00</td><td>步行</td><td>12,500步</td><td>320</td><td><span class="tag tag-green">微信</span></td></tr>
|
||||
<tr><td>2026-05-09 12:00</td><td>器械推胸</td><td>60min</td><td>380</td><td><span class="tag tag-gray">自己</span></td></tr>
|
||||
<tr><td>2026-05-08 18:00</td><td>游泳</td><td>40min</td><td>350</td><td><span class="tag tag-orange">器械</span></td></tr>
|
||||
<tr><td>2026-05-07 08:00</td><td>瑜伽</td><td>50min</td><td>180</td><td><span class="tag tag-gray">自己</span></td></tr>
|
||||
<tr><td>2026-05-07 18:30</td><td>步行</td><td>8,200步</td><td>210</td><td><span class="tag tag-green">微信</span></td></tr>
|
||||
<tr><td>2026-05-06 16:00</td><td>骑行</td><td>90min</td><td>560</td><td><span class="tag tag-blue">穿戴</span></td></tr>
|
||||
<tr><td>2026-05-05 10:00</td><td>深蹲</td><td>55min</td><td>410</td><td><span class="tag tag-orange">器械</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination"><span>共 128 条</span><button class="page-btn">‹</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">...</button><button class="page-btn">21</button><button class="page-btn">›</button></div>
|
||||
</div>
|
||||
|
||||
<!-- Tab面板:体重记录 -->
|
||||
<div class="tab-panel" id="tab-panel-2">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>时间</th><th>体重(kg)</th><th>BMI</th><th>体脂率(%)</th><th>腰围(cm)</th><th>来源</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>2026-05-10 08:30</td><td>72.5</td><td>23.7</td><td>18.2</td><td>82</td><td><span class="tag tag-blue">身高秤</span></td></tr>
|
||||
<tr><td>2026-05-08 07:45</td><td>72.8</td><td>23.8</td><td>18.4</td><td>83</td><td><span class="tag tag-orange">体脂仪</span></td></tr>
|
||||
<tr><td>2026-05-06 18:20</td><td>73.0</td><td>23.8</td><td>18.5</td><td>82</td><td><span class="tag tag-green">蓝牙称</span></td></tr>
|
||||
<tr><td>2026-05-04 08:10</td><td>72.3</td><td>23.6</td><td>18.1</td><td>81</td><td><span class="tag tag-blue">身高秤</span></td></tr>
|
||||
<tr><td>2026-05-03 20:00</td><td>73.2</td><td>23.9</td><td>18.6</td><td>84</td><td><span class="tag tag-gray">自记</span></td></tr>
|
||||
<tr><td>2026-05-02 09:00</td><td>73.2</td><td>23.9</td><td>18.6</td><td>84</td><td><span class="tag tag-orange">体脂仪</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination"><span>共 142 条</span><button class="page-btn">‹</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">...</button><button class="page-btn">15</button><button class="page-btn">›</button></div>
|
||||
</div>
|
||||
<div class="pagination"><span>共 142 条</span><button class="page-btn">‹</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">...</button><button class="page-btn">15</button><button class="page-btn">›</button></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 体重详情弹窗 -->
|
||||
<div class="modal-mask" id="weightModal">
|
||||
<div class="modal">
|
||||
@@ -162,6 +229,21 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<div class="modal__body" id="weightModalBody"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 饮食详情弹窗 -->
|
||||
<div class="modal-mask" id="dietModal">
|
||||
<div class="modal">
|
||||
<div class="modal__header"><h3 id="dietModalTitle">饮食详情</h3><button class="modal__close" onclick="closeDietModal()">×</button></div>
|
||||
<div class="modal__body" id="dietModalBody"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 运动详情弹窗 -->
|
||||
<div class="modal-mask" id="sportModal">
|
||||
<div class="modal">
|
||||
<div class="modal__header"><h3 id="sportModalTitle">运动详情</h3><button class="modal__close" onclick="closeSportModal()">×</button></div>
|
||||
<div class="modal__body" id="sportModalBody"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 侧边栏菜单项点击高亮
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item) {
|
||||
@@ -170,6 +252,17 @@ document.querySelectorAll('.sidebar-item').forEach(function(item) {
|
||||
this.classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
// Tab切换
|
||||
function switchTab(idx) {
|
||||
document.querySelectorAll('.tab-item').forEach(function(el, i) {
|
||||
el.classList.toggle('active', i === idx);
|
||||
});
|
||||
document.querySelectorAll('.tab-panel').forEach(function(el, i) {
|
||||
el.classList.toggle('active', i === idx);
|
||||
});
|
||||
}
|
||||
|
||||
// 体重详情弹窗
|
||||
var weightRecords=[
|
||||
{device:'体重秤',data:{"基础指标":{"身高(cm)":"175","体重(kg)":"72.5","BMI":"23.7","基础代谢":"1,680","体脂肪量(kg)":"13.2","体脂肪率(%)":"18.2"},"水分与蛋白质":{"体水分量(kg)":"40.1","体水分率(%)":"55.3","蛋白质量(kg)":"11.6","蛋白质率(%)":"16.0"},"肌肉与骨骼":{"肌肉率(%)":"77.0","肌肉量(kg)":"55.8","体骨骼量(kg)":"2.9"},"脂肪分析":{"皮下脂肪率(%)":"14.9","内脏脂肪等级":"6","去脂体重(kg)":"59.3"}}},
|
||||
@@ -185,11 +278,47 @@ function openWeightModal(idx){
|
||||
}
|
||||
function closeWeightModal(){document.getElementById('weightModal').classList.remove('show');}
|
||||
document.getElementById('weightModal').addEventListener('click',function(e){if(e.target===this)closeWeightModal();});
|
||||
|
||||
// 饮食详情弹窗
|
||||
var dietRecords=[
|
||||
{meal:'早餐',food:'鸡蛋 + 全麦面包 + 牛奶',detail:{"重量(g)":"280","热量(kcal)":"356","蛋白质(g)":"22.5","脂肪(g)":"12.8","碳水化合物(g)":"38.2","膳食纤维(g)":"5.6","钠(mg)":"320","钙(mg)":"180"}},
|
||||
{meal:'午餐',food:'鸡胸肉 + 西兰花 + 糙米饭',detail:{"重量(g)":"450","热量(kcal)":"520","蛋白质(g)":"42.0","脂肪(g)":"14.5","碳水化合物(g)":"55.3","膳食纤维(g)":"8.2","钠(mg)":"450","钙(mg)":"120"}},
|
||||
{meal:'加餐',food:'苹果 + 酸奶',detail:{"重量(g)":"250","热量(kcal)":"185","蛋白质(g)":"5.8","脂肪(g)":"3.2","碳水化合物(g)":"35.6","膳食纤维(g)":"4.5","钠(mg)":"85","钙(mg)":"200"}},
|
||||
{meal:'晚餐',food:'清蒸鱼 + 凉拌黄瓜 + 小米粥',detail:{"重量(g)":"380","热量(kcal)":"410","蛋白质(g)":"35.2","脂肪(g)":"10.5","碳水化合物(g)":"42.8","膳食纤维(g)":"3.8","钠(mg)":"280","钙(mg)":"90"}},
|
||||
{meal:'早餐',food:'燕麦粥 + 鸡蛋',detail:{"重量(g)":"320","热量(kcal)":"345","蛋白质(g)":"18.6","脂肪(g)":"10.2","碳水化合物(g)":"48.5","膳食纤维(g)":"6.0","钠(mg)":"220","钙(mg)":"160"}},
|
||||
{meal:'午餐',food:'牛肉面 + 蔬菜沙拉',detail:{"重量(g)":"500","热量(kcal)":"580","蛋白质(g)":"32.5","脂肪(g)":"18.0","碳水化合物(g)":"68.3","膳食纤维(g)":"5.2","钠(mg)":"680","钙(mg)":"85"}},
|
||||
{meal:'晚餐',food:'豆腐汤 + 杂粮饭 + 炒青菜',detail:{"重量(g)":"400","热量(kcal)":"395","蛋白质(g)":"20.0","脂肪(g)":"8.5","碳水化合物(g)":"58.2","膳食纤维(g)":"7.5","钠(mg)":"350","钙(mg)":"220"}}
|
||||
];
|
||||
function openDietModal(idx){
|
||||
var r=dietRecords[idx];document.getElementById('dietModalTitle').textContent='饮食详情 - '+r.meal+' · '+r.food;
|
||||
var html='';html+='<div class="detail-section"><div class="detail-section__title">营养成分</div><div class="detail-grid">';var items=r.detail;for(var k in items){html+='<div class="detail-item"><span class="detail-item__label">'+k+'</span><span class="detail-item__value">'+items[k]+'</span></div>';}html+='</div></div>';
|
||||
document.getElementById('dietModalBody').innerHTML=html;document.getElementById('dietModal').classList.add('show');
|
||||
}
|
||||
function closeDietModal(){document.getElementById('dietModal').classList.remove('show');}
|
||||
document.getElementById('dietModal').addEventListener('click',function(e){if(e.target===this)closeDietModal();});
|
||||
|
||||
// 运动详情弹窗
|
||||
var sportRecords=[
|
||||
{type:'有氧运动',name:'户外跑步',detail:{"运动类型":"有氧运动","运动名称":"户外跑步","时长(min)":"45","消耗热量(kcal)":"420","距离(km)":"6.5","平均配速":"6'55\"","平均心率":"142","最大心率":"168","步频":"175"}},
|
||||
{type:'力量训练',name:'器械推胸 + 哑铃弯举',detail:{"运动类型":"力量训练","运动名称":"器械推胸 + 哑铃弯举","时长(min)":"60","消耗热量(kcal)":"380","组数":"12","器械推胸(kg)":"50","哑铃弯举(kg)":"12","平均心率":"125","最大心率":"148"}},
|
||||
{type:'有氧运动',name:'游泳',detail:{"运动类型":"有氧运动","运动名称":"游泳","时长(min)":"40","消耗热量(kcal)":"350","距离(km)":"1.2","泳姿":"自由泳","平均心率":"135","最大心率":"158","划水频率":"28"}},
|
||||
{type:'柔韧性',name:'瑜伽',detail:{"运动类型":"柔韧性","运动名称":"瑜伽","时长(min)":"50","消耗热量(kcal)":"180","体式数":"24","平均心率":"95","最大心率":"115","拉伸等级":"中级"}},
|
||||
{type:'有氧运动',name:'骑行',detail:{"运动类型":"有氧运动","运动名称":"骑行","时长(min)":"90","消耗热量(kcal)":"560","距离(km)":"25.0","平均速度(km/h)":"16.7","平均心率":"138","最大心率":"162","爬升(m)":"180"}},
|
||||
{type:'力量训练',name:'深蹲 + 硬拉 + 卧推',detail:{"运动类型":"力量训练","运动名称":"深蹲 + 硬拉 + 卧推","时长(min)":"55","消耗热量(kcal)":"410","组数":"15","深蹲(kg)":"80","硬拉(kg)":"90","卧推(kg)":"60","平均心率":"130","最大心率":"155"}}
|
||||
];
|
||||
function openSportModal(idx){
|
||||
var r=sportRecords[idx];document.getElementById('sportModalTitle').textContent='运动详情 - '+r.name;
|
||||
var html='';html+='<div class="detail-section"><div class="detail-section__title">运动数据</div><div class="detail-grid">';var items=r.detail;for(var k in items){html+='<div class="detail-item"><span class="detail-item__label">'+k+'</span><span class="detail-item__value">'+items[k]+'</span></div>';}html+='</div></div>';
|
||||
document.getElementById('sportModalBody').innerHTML=html;document.getElementById('sportModal').classList.add('show');
|
||||
}
|
||||
function closeSportModal(){document.getElementById('sportModal').classList.remove('show');}
|
||||
document.getElementById('sportModal').addEventListener('click',function(e){if(e.target===this)closeSportModal();});
|
||||
|
||||
// URL参数回显员工信息
|
||||
(function(){
|
||||
var params=new URLSearchParams(location.search);
|
||||
var id=params.get('id');
|
||||
var empData={EMP001:{name:'张伟',unit:'CQ能源总部',dept:'研发部'},EMP002:{name:'李娜',unit:'CQ能源总部',dept:'市场部'},EMP005:{name:'陈刚',unit:'CQ能源总部',dept:'人事部'},EMP003:{name:'王磊',unit:'采油一厂',dept:'运营部'},EMP004:{name:'赵敏',unit:'采油二厂',dept:'财务部'}};
|
||||
var empData={EMP001:{name:'张伟',unit:'CQ能源总部',dept:'研发部'},EMP002:{name:'李娜',unit:'CQ能源总部',dept:'市场部'},EMP005:{name:'陈刚',unit:'CQ能源总部',dept:'人事部'},EMP003:{name:'王磊',unit:'采油一厂',dept:'运营部'},EMP004:{name:'赵敏',unit:'采油二厂',dept:'财务部'},'424234':{name:'李凯明',unit:'第四采油厂',dept:'岭南作业区'},'234223':{name:'张文胜',unit:'第四采油厂',dept:'虎狼山作业区'},'318756':{name:'王丽华',unit:'采油一厂',dept:'设备维护站'},'567890':{name:'刘建国',unit:'采气一厂',dept:'生产运行部'},'192847':{name:'陈思雨',unit:'CQ能源总部',dept:'人力资源部'},'445612':{name:'杨志强',unit:'采油二厂',dept:'后勤保障部'},'678901':{name:'赵晓峰',unit:'采油一厂',dept:'技术研发部'}};
|
||||
var emp=empData[id]||empData.EMP001;
|
||||
document.getElementById('empAvatar').textContent=emp.name.charAt(0);
|
||||
document.getElementById('empName').textContent=emp.name;
|
||||
|
||||
@@ -76,6 +76,29 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
/* 固定列通用 */
|
||||
#tab-0 thead th[class*=sticky],
|
||||
#tab-1 thead th[class*=sticky]{position:sticky;z-index:3;background:#FAFAFA;}
|
||||
#tab-0 tbody td[class*=sticky],
|
||||
#tab-1 tbody td[class*=sticky]{position:sticky;z-index:2;background:#fff;}
|
||||
#tab-0 tbody tr:hover td[class*=sticky],
|
||||
#tab-1 tbody tr:hover td[class*=sticky]{background:#F8FBFF;}
|
||||
/* 二级单位:前三列左固定 */
|
||||
#tab-0 .sticky-l1{left:0;}
|
||||
#tab-0 .sticky-l2{left:50px;}
|
||||
#tab-0 .sticky-l3{left:140px;}
|
||||
/* 三级单位:前四列左固定 */
|
||||
#tab-1 .sticky-l1{left:0;}
|
||||
#tab-1 .sticky-l2{left:50px;}
|
||||
#tab-1 .sticky-l3{left:140px;}
|
||||
#tab-1 .sticky-l4{left:220px;}
|
||||
/* 最后列右固定 + 左阴影分隔 */
|
||||
.sticky-r{position:sticky;right:0;z-index:2;background:#fff;}
|
||||
#tab-0 thead th.sticky-r,
|
||||
#tab-1 thead th.sticky-r{background:#FAFAFA;z-index:3;}
|
||||
#tab-0 tbody tr:hover td.sticky-r,
|
||||
#tab-1 tbody tr:hover td.sticky-r{background:#F8FBFF;}
|
||||
.sticky-l3,.sticky-l4,.sticky-r{box-shadow:-2px 0 4px rgba(0,0,0,0.06);}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -91,6 +114,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -122,7 +146,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar" style="border-radius:0 0 var(--radius-md) var(--radius-md);margin-top:0;">
|
||||
<div class="filter-item">
|
||||
<label>组织单位</label>
|
||||
<label>单位</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>第四采油厂</option>
|
||||
@@ -132,8 +156,8 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>计划名称</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入计划名称" style="min-width:220px;">
|
||||
<label>干预计划组织次数</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入干预计划组织次数" style="min-width:220px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>年份</label>
|
||||
@@ -167,12 +191,9 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>组织单位</th>
|
||||
<th>计划名称</th>
|
||||
<th>起止日期</th>
|
||||
<th>应参加人数</th>
|
||||
<th>实际参加人数</th>
|
||||
<th class="sticky-l1">序号</th>
|
||||
<th class="sticky-l2">单位</th>
|
||||
<th class="sticky-l3">总人数</th>
|
||||
<th>完成体重目标人数</th>
|
||||
<th>完成体脂目标人数</th>
|
||||
<th>完成腰围目标人数</th>
|
||||
@@ -186,22 +207,21 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<th>人均每日热量缺口</th>
|
||||
<th>人均综合得分</th>
|
||||
<th>人均行动得分</th>
|
||||
<th>组织部门</th>
|
||||
<th>负责人</th>
|
||||
<th class="sticky-r">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td><td>第四采油厂</td><td>第四采油厂2023年超重健康干预</td><td>2023/08/23 – 2023/12/12</td><td>234</td><td>220</td><td>213</td><td>213</td><td>213</td><td>2.3</td><td>5</td><td>2</td><td>2</td><td>5</td><td>5410</td><td>3541</td><td>1570</td><td>86</td><td>86</td><td>健康部</td><td>宋喜宁</td>
|
||||
<td class="sticky-l1">1</td><td class="sticky-l2">第四采油厂</td><td class="sticky-l3">1234</td><td>213</td><td>213</td><td>213</td><td>2.3</td><td>5</td><td>2</td><td>2</td><td>5</td><td>5410</td><td>3541</td><td>1570</td><td>86</td><td>86</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td><td>第四采油厂</td><td>第四采油厂2022年超重健康干预</td><td>2022/08/23 – 2022/12/12</td><td>432</td><td>350</td><td>321</td><td>321</td><td>321</td><td>5.5</td><td>5</td><td>3</td><td>1</td><td>6</td><td>5410</td><td>3541</td><td>1570</td><td>75</td><td>75</td><td>健康部</td><td>宋喜宁</td>
|
||||
<td class="sticky-l1">2</td><td class="sticky-l2">第四采油厂</td><td class="sticky-l3">1234</td><td>321</td><td>321</td><td>321</td><td>5.5</td><td>5</td><td>3</td><td>1</td><td>6</td><td>5410</td><td>3541</td><td>1570</td><td>75</td><td>75</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td><td>采油一厂</td><td>采油一厂2024年体重管理专项行动</td><td>2024/03/01 – 2024/06/30</td><td>310</td><td>280</td><td>256</td><td>248</td><td>240</td><td>3.8</td><td>4</td><td>2.5</td><td>1.8</td><td>4</td><td>5200</td><td>3420</td><td>1620</td><td>82</td><td>80</td><td>健康部</td><td>刘建华</td>
|
||||
<td class="sticky-l1">3</td><td class="sticky-l2">采油一厂</td><td class="sticky-l3">980</td><td>256</td><td>248</td><td>240</td><td>3.8</td><td>4</td><td>2.5</td><td>1.8</td><td>4</td><td>5200</td><td>3420</td><td>1620</td><td>82</td><td>80</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td><td>采气一厂</td><td>采气一厂2024年健康管理计划</td><td>2024/05/10 – 2024/09/10</td><td>180</td><td>165</td><td>152</td><td>148</td><td>140</td><td>4.2</td><td>6</td><td>1.5</td><td>2.2</td><td>3</td><td>5350</td><td>3600</td><td>1590</td><td>78</td><td>76</td><td>健康部</td><td>王志强</td>
|
||||
<td class="sticky-l1">4</td><td class="sticky-l2">采气一厂</td><td class="sticky-l3">756</td><td>152</td><td>148</td><td>140</td><td>4.2</td><td>6</td><td>1.5</td><td>2.2</td><td>3</td><td>5350</td><td>3600</td><td>1590</td><td>78</td><td>76</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -222,12 +242,10 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>组织单位</th>
|
||||
<th>计划名称</th>
|
||||
<th>起止日期</th>
|
||||
<th>应参加人数</th>
|
||||
<th>实际参加人数</th>
|
||||
<th class="sticky-l1">序号</th>
|
||||
<th class="sticky-l2">单位</th>
|
||||
<th class="sticky-l3">部门</th>
|
||||
<th class="sticky-l4">总人数</th>
|
||||
<th>完成体重目标人数</th>
|
||||
<th>完成体脂目标人数</th>
|
||||
<th>完成腰围目标人数</th>
|
||||
@@ -241,19 +259,18 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
<th>人均每日热量缺口</th>
|
||||
<th>人均综合得分</th>
|
||||
<th>人均行动得分</th>
|
||||
<th>组织部门</th>
|
||||
<th>负责人</th>
|
||||
<th class="sticky-r">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td><td>第四采油厂</td><td>第四采油厂2024年超重健康干预</td><td>2024/08/01 – 2024/11/30</td><td>150</td><td>138</td><td>130</td><td>128</td><td>125</td><td>3.2</td><td>4</td><td>1.8</td><td>2.0</td><td>4</td><td>5300</td><td>3500</td><td>1600</td><td>84</td><td>82</td><td>健康部</td><td>宋喜宁</td>
|
||||
<td class="sticky-l1">1</td><td class="sticky-l2">第四采油厂</td><td class="sticky-l3">作业一区</td><td class="sticky-l4">1234</td><td>130</td><td>128</td><td>125</td><td>3.2</td><td>4</td><td>1.8</td><td>2.0</td><td>4</td><td>5300</td><td>3500</td><td>1600</td><td>84</td><td>82</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td><td>第四采油厂</td><td>第四采油厂2023年健康减重专项行动</td><td>2023/04/01 – 2023/09/30</td><td>200</td><td>185</td><td>172</td><td>168</td><td>160</td><td>4.0</td><td>5</td><td>2.2</td><td>1.5</td><td>5</td><td>5150</td><td>3480</td><td>1550</td><td>80</td><td>78</td><td>健康部</td><td>宋喜宁</td>
|
||||
<td class="sticky-l1">2</td><td class="sticky-l2">第四采油厂</td><td class="sticky-l3">作业二区</td><td class="sticky-l4">1234</td><td>172</td><td>168</td><td>160</td><td>4.0</td><td>5</td><td>2.2</td><td>1.5</td><td>5</td><td>5150</td><td>3480</td><td>1550</td><td>80</td><td>78</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td><td>采油一厂</td><td>采油一厂2023年体重管理专项行动</td><td>2023/06/01 – 2023/10/31</td><td>280</td><td>260</td><td>242</td><td>238</td><td>230</td><td>2.8</td><td>3</td><td>1.2</td><td>1.8</td><td>3</td><td>5250</td><td>3380</td><td>1520</td><td>76</td><td>74</td><td>健康部</td><td>刘建华</td>
|
||||
<td class="sticky-l1">3</td><td class="sticky-l2">采油一厂</td><td class="sticky-l3">采油一队</td><td class="sticky-l4">980</td><td>242</td><td>238</td><td>230</td><td>2.8</td><td>3</td><td>1.2</td><td>1.8</td><td>3</td><td>5250</td><td>3380</td><td>1520</td><td>76</td><td>74</td><td class="sticky-r"><a class="link">详细数据</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -107,6 +107,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -5,35 +5,203 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>详细数据 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);
|
||||
}
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
|
||||
/* 顶部导航栏 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
|
||||
/* 侧边栏 */
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
|
||||
/* 主内容区 */
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 页面标题 */
|
||||
.page-header{margin-bottom:16px;}
|
||||
.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);}
|
||||
.search-select__input::placeholder{color:var(--text-placeholder);}
|
||||
.search-select__panel{position:absolute;top:100%;left:0;right:0;margin-top:4px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:500;display:none;max-height:280px;overflow-y:auto;}
|
||||
.search-select__panel.show{display:block;}
|
||||
.search-select__option{padding:12px 16px;font-size:var(--font-sm);cursor:pointer;transition:background .1s;border-bottom:1px solid #F5F5F5;}
|
||||
.search-select__option:last-child{border-bottom:none;}
|
||||
.search-select__option:hover{background:#F5F7FA;}
|
||||
.search-select__option.selected{color:var(--primary);background:var(--primary-light);}
|
||||
.search-select__option .ss-org{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:2px;}
|
||||
.search-select__empty{padding:20px;text-align:center;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
.search-select__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:none;background:none;cursor:pointer;color:var(--text-placeholder);font-size:16px;display:none;align-items:center;justify-content:center;border-radius:50%;line-height:1;padding:0;z-index:1;}
|
||||
.search-select__clear:hover{color:var(--text-primary);background:#F0F0F0;}
|
||||
.search-select__clear.show{display:flex;}
|
||||
.search-select--selected .search-select__input{background-image:none;padding-right:32px;}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-input{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-xs);outline:none;transition:border-color .2s;box-sizing:border-box;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-date{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-xs);outline:none;transition:border-color .2s;box-sizing:border-box;color:var(--text-primary);}
|
||||
.filter-date:focus{border-color:var(--primary);}
|
||||
.filter-divider{color:var(--text-placeholder);font-size:var(--font-xs);margin:0 2px;}
|
||||
|
||||
/* 单位部门双列面板 */
|
||||
.org-select-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:32px;min-width:160px;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;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:36px;left:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:420px;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-col{flex:1;overflow-y:auto;max-height:240px;border-right:1px solid var(--border);}
|
||||
.org-col:last-child{border-right:none;}
|
||||
.org-col__title{padding:8px 14px;font-size:var(--font-xs);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.org-item{padding:9px 14px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:32px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-xs);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.btn-export{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-export:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;border-top:1px solid var(--border);}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
.table-card__content table{min-width:4800px;white-space:nowrap;}
|
||||
table{width:100%;border-collapse:collapse;}
|
||||
|
||||
/* 表头 - 两行结构 */
|
||||
thead th{background:#FAFAFA;padding:8px 4px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
thead th.th-parent{background:#F0F2F5;font-weight:600;color:var(--text-primary);border-bottom:1px solid var(--border);}
|
||||
thead th.th-divider{border-right:2px solid var(--border);}
|
||||
|
||||
tbody td{padding:10px 4px;text-align:center;font-size:var(--font-xs);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: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),
|
||||
tbody tr:hover td:nth-child(2),
|
||||
tbody tr:hover td:nth-child(3){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;}
|
||||
thead tr:first-child th:last-child{z-index:4;background:#FAFAFA;}
|
||||
thead tr:nth-child(2) th:last-child{background:#FAFAFA;}
|
||||
tbody tr:hover td:last-child{background:#F8FBFF;}
|
||||
|
||||
/* 饮食、运动、体重子列分隔线 */
|
||||
.col-diet-last{border-right:2px solid var(--border) !important;}
|
||||
.col-exercise-last{border-right:2px solid var(--border) !important;}
|
||||
.col-weight-last{border-right:2px solid var(--border) !important;}
|
||||
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 变化值颜色 */
|
||||
.change-up{color:var(--danger);}
|
||||
.change-down{color:var(--success);}
|
||||
.change-zero{color:var(--text-placeholder);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
|
||||
/* 链接 */
|
||||
.link{color:var(--primary);cursor:pointer;font-size:var(--font-xs);text-decoration:none;}.link:hover{color:#40a9ff;}
|
||||
|
||||
/* Toast */
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
|
||||
/* ===== 体重报告弹窗 ===== */
|
||||
.report-overlay{display:none;position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,0.45);justify-content:center;align-items:flex-start;padding-top:40px;}
|
||||
.report-overlay.show{display:flex;}
|
||||
.report-modal{background:#fff;border-radius:var(--radius-lg);width:720px;max-height:calc(100vh - 80px);display:flex;flex-direction:column;overflow:hidden;box-shadow:0 8px 40px rgba(0,0,0,0.18);}
|
||||
.report-modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
|
||||
.report-modal__title{font-size:var(--font-lg);font-weight:700;color:var(--text-primary);}
|
||||
.report-modal__close{width:32px;height:32px;border:none;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);color:var(--text-placeholder);font-size:20px;transition:all .15s;}
|
||||
.report-modal__close:hover{background:#F0F0F0;color:var(--text-primary);}
|
||||
.report-modal__body{flex:1;overflow-y:auto;padding:0 24px 24px;display:flex;flex-direction:column;}
|
||||
.report-modal__body::-webkit-scrollbar{width:6px;}
|
||||
.report-modal__body::-webkit-scrollbar-thumb{background:#D9D9D9;border-radius:3px;}
|
||||
|
||||
/* 总览卡片(固定在弹窗顶部,不随列表滚动) */
|
||||
.report-overview{background:linear-gradient(135deg, #36cfc9 0%, #2ec4b6 100%);border-radius:var(--radius-md);padding:20px 24px;color:#fff;position:relative;overflow:hidden;flex-shrink:0;margin:16px 24px 0;}
|
||||
.report-overview::before{content:'';position:absolute;top:-40px;right:-40px;width:120px;height:120px;border-radius:50%;background:rgba(255,255,255,0.08);pointer-events:none;}
|
||||
.report-overview::after{content:'';position:absolute;bottom:-50px;left:-30px;width:140px;height:140px;border-radius:50%;background:rgba(255,255,255,0.05);pointer-events:none;}
|
||||
.report-overview__title{font-size:18px;font-weight:800;margin-bottom:12px;position:relative;z-index:1;letter-spacing:1px;}
|
||||
.report-overview__row{display:flex;align-items:center;gap:32px;position:relative;z-index:1;font-size:13px;opacity:0.9;margin-bottom:8px;}
|
||||
.report-overview__rank{position:relative;z-index:1;font-size:13px;opacity:0.9;margin-bottom:14px;line-height:1.8;}
|
||||
.report-overview__metrics{display:flex;gap:16px;position:relative;z-index:1;}
|
||||
.report-overview__metric{flex:1;background:rgba(255,255,255,0.15);border-radius:10px;padding:14px 18px;backdrop-filter:blur(4px);}
|
||||
.report-overview__metric-label{font-size:12px;opacity:0.8;margin-bottom:6px;}
|
||||
.report-overview__metric-val{font-size:28px;font-weight:800;}
|
||||
.report-overview__metric-unit{font-size:13px;font-weight:500;opacity:0.8;margin-left:2px;}
|
||||
|
||||
/* 记录表格 */
|
||||
.report-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
.report-table{width:100%;border-collapse:collapse;}
|
||||
.report-table thead{position:sticky;top:0;z-index:5;}
|
||||
.report-table thead th{background:#FAFAFA;padding:8px 10px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
.report-table tbody td{padding:9px 10px;text-align:center;font-size:var(--font-xs);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
|
||||
.report-table tbody tr:hover{background:#F8FBFF;}
|
||||
.report-table tbody tr:last-child td{border-bottom:none;}
|
||||
.report-table-empty{text-align:center;padding:40px 20px;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 弹窗底部 */
|
||||
.report-modal__footer{display:flex;align-items:center;justify-content:flex-end;padding:12px 24px;border-top:1px solid var(--border);flex-shrink:0;gap:8px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部导航栏 -->
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
<nav class="top-bar__nav">
|
||||
@@ -41,6 +209,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html" class="active">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -51,6 +220,8 @@
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">过程管理</div>
|
||||
<a href="action-record.html" class="sidebar-item">行动记录</a>
|
||||
@@ -59,8 +230,737 @@
|
||||
<a href="weight-ranking.html" class="sidebar-item">体重排名</a>
|
||||
<a href="activity-statistics.html" class="sidebar-item">活动统计</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
<!-- 主内容区域 -->
|
||||
|
||||
<!-- 页面标题 -->
|
||||
<div class="page-header">
|
||||
<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-item">
|
||||
<label>日期范围</label>
|
||||
<input class="filter-date" type="date" id="filterDateFrom" onchange="applyFilter()">
|
||||
<span class="filter-divider">~</span>
|
||||
<input class="filter-date" type="date" id="filterDateTo" onchange="applyFilter()">
|
||||
</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">
|
||||
<div class="org-col" id="orgUnitCol">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" data-unit="" onclick="selectUnit(this,'全部单位/部门','')">全部单位/部门</div>
|
||||
<div class="org-item" data-unit="第四采油厂" onclick="selectUnit(this,'第四采油厂','第四采油厂')">第四采油厂</div>
|
||||
<div class="org-item" data-unit="采油一厂" onclick="selectUnit(this,'采油一厂','采油一厂')">采油一厂</div>
|
||||
<div class="org-item" data-unit="采油二厂" onclick="selectUnit(this,'采油二厂','采油二厂')">采油二厂</div>
|
||||
<div class="org-item" data-unit="采气一厂" onclick="selectUnit(this,'采气一厂','采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgDeptCol">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" data-dept="" onclick="selectDept(this,'全部部门','')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>姓名</label>
|
||||
<input class="filter-input" id="filterName" placeholder="请输入姓名" style="width:100px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" id="filterEmpId" placeholder="请输入编号" style="width:110px;">
|
||||
</div>
|
||||
<!-- [交互] 点击查询按钮筛选列表 -->
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作按钮区 -->
|
||||
<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="table-card__content">
|
||||
<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">身高<br>(cm)</th>
|
||||
<th rowspan="2">初始<br>体重(kg)</th>
|
||||
<th rowspan="2">初始<br>BMI</th>
|
||||
<th rowspan="2">初始<br>体脂(%)</th>
|
||||
<th rowspan="2">初始<br>腰围(cm)</th>
|
||||
<th rowspan="2">目标<br>体重(kg)</th>
|
||||
<th rowspan="2">目标<br>BMI</th>
|
||||
<th rowspan="2">目标<br>体脂(%)</th>
|
||||
<th rowspan="2">目标<br>腰围(cm)</th>
|
||||
<th rowspan="2">现体重<br>(kg)</th>
|
||||
<th rowspan="2">现BMI</th>
|
||||
<th rowspan="2">现体脂<br>(%)</th>
|
||||
<th rowspan="2">现腰围<br>(cm)</th>
|
||||
<th rowspan="2">体重变化<br>(kg)</th>
|
||||
<th rowspan="2">BMI变化</th>
|
||||
<th rowspan="2">体脂变化<br>(%)</th>
|
||||
<th rowspan="2">腰围变化<br>(cm)</th>
|
||||
<th class="th-parent" colspan="4">饮食摄入(千卡)</th>
|
||||
<th class="th-parent" colspan="1">运动消耗(千卡)</th>
|
||||
<th class="th-parent" colspan="1">体重(kg)</th>
|
||||
<th rowspan="2">体重报告</th>
|
||||
</tr>
|
||||
<!-- [交互] 表头第二行:饮食摄入、运动消耗、体重的子列 -->
|
||||
<tr>
|
||||
<th>早餐</th>
|
||||
<th>午餐</th>
|
||||
<th>晚餐</th>
|
||||
<th class="col-diet-last">加餐</th>
|
||||
<th class="col-exercise-last">当日消耗</th>
|
||||
<th class="col-weight-last">当日体重</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span id="pageInfo">显示 0 条记录</span>
|
||||
<button class="page-btn" onclick="goPage(-1)">‹</button>
|
||||
<span id="pageNum" style="font-size:var(--font-sm);color:var(--text-secondary);">第 1 页</span>
|
||||
<button class="page-btn" onclick="goPage(1)">›</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</main>
|
||||
|
||||
<!-- [交互] 体重报告弹窗 — 点击列表"查看"按钮打开 -->
|
||||
<div class="report-overlay" id="reportOverlay" onclick="if(event.target===this)closeReport()">
|
||||
<div class="report-modal">
|
||||
<div class="report-modal__header">
|
||||
<span class="report-modal__title" id="reportModalTitle">体重报告</span>
|
||||
<!-- [交互] 点击关闭弹窗 -->
|
||||
<button class="report-modal__close" onclick="closeReport()">✕</button>
|
||||
</div>
|
||||
<!-- 总览卡片(固定不滚动) -->
|
||||
<div class="report-overview">
|
||||
<div class="report-overview__title" id="rpOverviewTitle">体重报告</div>
|
||||
<div class="report-overview__row">
|
||||
<span>截止至 <strong id="rpCutoff">-</strong></span>
|
||||
<span>第 <strong id="rpDay">-</strong> 天(共 <strong id="rpTotal">-</strong> 天)</span>
|
||||
</div>
|
||||
<div class="report-overview__rank" id="rpRank">
|
||||
目前的减重量排名 <strong id="rpRankWeight">-</strong>,减重率排名 <strong id="rpRankRate">-</strong>,结合个人打卡情况,综合分排名 <strong id="rpRankScore">-</strong>
|
||||
</div>
|
||||
<div class="report-overview__metrics">
|
||||
<div class="report-overview__metric">
|
||||
<div class="report-overview__metric-label">已减重</div>
|
||||
<div class="report-overview__metric-val" id="rpLoss">-<span class="report-overview__metric-unit">kg</span></div>
|
||||
</div>
|
||||
<div class="report-overview__metric">
|
||||
<div class="report-overview__metric-label">减重率</div>
|
||||
<div class="report-overview__metric-val" id="rpRate">-<span class="report-overview__metric-unit">%</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 记录表格(可滚动) -->
|
||||
<div class="report-modal__body">
|
||||
<div class="report-table-wrap">
|
||||
<table class="report-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>日期</th>
|
||||
<th>体重(kg)</th>
|
||||
<th>BMI</th>
|
||||
<th>体脂率(%)</th>
|
||||
<th>腰围(cm)</th>
|
||||
<th>摄入(kcal)</th>
|
||||
<th>消耗(kcal)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="reportTableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="report-modal__footer">
|
||||
<button class="btn btn-default" onclick="closeReport()">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Toast -->
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== 侧边栏当前页高亮 ===== */
|
||||
(function(){
|
||||
var current = location.pathname.split('/').pop();
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item){
|
||||
var href = item.getAttribute('href');
|
||||
item.classList.toggle('active', href === current);
|
||||
});
|
||||
})();
|
||||
|
||||
/* ===== 干预计划数据 ===== */
|
||||
var plans = [
|
||||
{id:1,name:'第四采油厂2026年超重健康干预计划',org:'第四采油厂',dateFrom:'2026-03-01',dateTo:'2026-08-31',totalCount:234,actualCount:218},
|
||||
{id:2,name:'采油一厂2026年体重管理专项行动',org:'采油一厂',dateFrom:'2026-04-01',dateTo:'2026-09-30',totalCount:186,actualCount:180},
|
||||
{id:3,name:'采油二厂2026年健康减重计划',org:'采油二厂',dateFrom:'2026-05-15',dateTo:'2026-11-15',totalCount:312,actualCount:295},
|
||||
{id:4,name:'采气一厂2025年度体重管理计划',org:'采气一厂',dateFrom:'2025-06-01',dateTo:'2025-12-01',totalCount:158,actualCount:142},
|
||||
{id:5,name:'第四采油厂2025年超重健康干预计划',org:'第四采油厂',dateFrom:'2025-03-01',dateTo:'2025-08-31',totalCount:267,actualCount:251},
|
||||
{id:6,name:'采油一厂2025年员工健康体重计划',org:'采油一厂',dateFrom:'2025-04-15',dateTo:'2025-10-15',totalCount:420,actualCount:398},
|
||||
{id:7,name:'采气一厂2026下半年体重干预计划',org:'采气一厂',dateFrom:'2026-09-01',dateTo:'2026-12-31',totalCount:89,actualCount:72},
|
||||
{id:8,name:'采油二厂2024年体重控制专项计划',org:'采油二厂',dateFrom:'2024-07-01',dateTo:'2024-12-31',totalCount:145,actualCount:130}
|
||||
];
|
||||
|
||||
/* ===== 基础员工数据 ===== */
|
||||
var baseEmployees = [
|
||||
{org:'第四采油厂',dept:'健康管理部',name:'张伟',empId:'CQ001234',gender:'男',age:42,height:172,weight:85,bmi:28.7,waist:96,fat:28.5},
|
||||
{org:'第四采油厂',dept:'健康管理部',name:'李娜',empId:'CQ001235',gender:'女',age:35,height:160,weight:72,bmi:28.1,waist:84,fat:35.2},
|
||||
{org:'第四采油厂',dept:'健康管理部',name:'王磊',empId:'CQ001236',gender:'男',age:28,height:178,weight:90,bmi:28.4,waist:98,fat:26.8},
|
||||
{org:'第四采油厂',dept:'安全环保科',name:'赵敏',empId:'CQ001237',gender:'女',age:39,height:163,weight:75,bmi:28.2,waist:86,fat:36.5},
|
||||
{org:'第四采油厂',dept:'安全环保科',name:'刘洋',empId:'CQ001238',gender:'男',age:45,height:175,weight:88,bmi:28.7,waist:100,fat:29.2},
|
||||
{org:'第四采油厂',dept:'安全环保科',name:'陈晨',empId:'CQ001239',gender:'男',age:31,height:170,weight:82,bmi:28.4,waist:94,fat:27.5},
|
||||
{org:'第四采油厂',dept:'工会办公室',name:'周杰',empId:'CQ001240',gender:'男',age:50,height:168,weight:78,bmi:27.6,waist:92,fat:28.1},
|
||||
{org:'第四采油厂',dept:'工会办公室',name:'吴芳',empId:'CQ001241',gender:'女',age:33,height:158,weight:70,bmi:28.0,waist:82,fat:34.8},
|
||||
{org:'第四采油厂',dept:'生产技术部',name:'孙丽',empId:'CQ001242',gender:'女',age:40,height:165,weight:76,bmi:27.9,waist:88,fat:37.0},
|
||||
{org:'第四采油厂',dept:'生产技术部',name:'郑浩',empId:'CQ001243',gender:'男',age:36,height:180,weight:95,bmi:29.3,waist:104,fat:30.5},
|
||||
{org:'第四采油厂',dept:'生产技术部',name:'黄磊',empId:'CQ001244',gender:'男',age:27,height:176,weight:88,bmi:28.4,waist:97,fat:27.0},
|
||||
{org:'第四采油厂',dept:'生产技术部',name:'林燕',empId:'CQ001245',gender:'女',age:29,height:162,weight:74,bmi:28.2,waist:85,fat:35.8},
|
||||
{org:'采油一厂',dept:'健康管理部',name:'杨帆',empId:'CQ001246',gender:'男',age:38,height:170,weight:88,bmi:30.4,waist:102,fat:31.2},
|
||||
{org:'采油一厂',dept:'安全环保科',name:'孙强',empId:'CQ001247',gender:'男',age:44,height:173,weight:86,bmi:28.7,waist:99,fat:28.8},
|
||||
{org:'采油一厂',dept:'工会办公室',name:'周强',empId:'CQ001248',gender:'男',age:50,height:168,weight:78,bmi:27.6,waist:93,fat:27.6},
|
||||
{org:'采油一厂',dept:'生产技术部',name:'吴敏',empId:'CQ001249',gender:'女',age:29,height:162,weight:56,bmi:21.3,waist:72,fat:26.5},
|
||||
{org:'采油二厂',dept:'健康管理部',name:'郑浩',empId:'CQ001250',gender:'男',age:33,height:176,weight:82,bmi:26.5,waist:91,fat:25.8},
|
||||
{org:'采油二厂',dept:'安全环保科',name:'黄丽',empId:'CQ001251',gender:'女',age:27,height:162,weight:74,bmi:28.2,waist:86,fat:36.0},
|
||||
{org:'采油二厂',dept:'财务部',name:'林涛',empId:'CQ001252',gender:'男',age:41,height:175,weight:92,bmi:30.0,waist:105,fat:31.5},
|
||||
{org:'采气一厂',dept:'生产技术部',name:'何婷',empId:'CQ001253',gender:'女',age:34,height:160,weight:70,bmi:27.3,waist:84,fat:35.3},
|
||||
{org:'采气一厂',dept:'信息中心',name:'马超',empId:'CQ001254',gender:'男',age:36,height:179,weight:95,bmi:29.6,waist:107,fat:32.0}
|
||||
];
|
||||
|
||||
/* ===== 每日明细Mock数据 ===== */
|
||||
function buildDailyData(){
|
||||
var data = [];
|
||||
var today = new Date();
|
||||
// 生成最近10天日期列表
|
||||
var dateList = [];
|
||||
for(var d = 9; d >= 0; d--){
|
||||
var dt = new Date(today);
|
||||
dt.setDate(today.getDate() - d);
|
||||
dateList.push(formatDate(dt));
|
||||
}
|
||||
baseEmployees.forEach(function(e, empIdx){
|
||||
var planIdx = empIdx % plans.length;
|
||||
var p = plans[planIdx];
|
||||
// 目标指标(比初始降低约15%)
|
||||
var targetWeight = Math.round(e.weight * 0.85);
|
||||
var targetBmi = +(e.bmi * 0.85).toFixed(1);
|
||||
var targetWaist = Math.round(e.waist * 0.88);
|
||||
var targetFat = +(e.fat * 0.80).toFixed(1);
|
||||
// 第一个员工的进度基准
|
||||
var progressBase = (empIdx % 5) / 4;
|
||||
dateList.forEach(function(dateStr, dateIdx){
|
||||
// 模拟每日波动 + 整体趋势向目标靠近
|
||||
var dayProgress = progressBase - (9 - dateIdx) * 0.015;
|
||||
var curWeight = +(e.weight - (e.weight - targetWeight) * Math.max(0, dayProgress) + (Math.random() - 0.5) * 0.6).toFixed(1);
|
||||
var curBmi = +(curWeight / ((e.height/100) * (e.height/100))).toFixed(1);
|
||||
var curWaist = +(e.waist - (e.waist - targetWaist) * Math.max(0, dayProgress) + (Math.random() - 0.5) * 0.4).toFixed(1);
|
||||
var curFat = +(e.fat - (e.fat - targetFat) * Math.max(0, dayProgress) + (Math.random() - 0.5) * 0.3).toFixed(1);
|
||||
var weightChange = +(curWeight - e.weight).toFixed(1);
|
||||
var bmiChange = +(curBmi - e.bmi).toFixed(1);
|
||||
var fatChange = +(curFat - e.fat).toFixed(1);
|
||||
var waistChange = +(curWaist - e.waist).toFixed(1);
|
||||
// 饮食摄入 - 三餐 + 加餐
|
||||
var breakfast = Math.floor(Math.random() * 200) + 300;
|
||||
var lunch = Math.floor(Math.random() * 300) + 400;
|
||||
var dinner = Math.floor(Math.random() * 250) + 350;
|
||||
var snack = Math.floor(Math.random() * 150);
|
||||
// 运动消耗
|
||||
var exercise = Math.floor(Math.random() * 300) + 150;
|
||||
// 最新体重(略高于现体重,带微小波动)
|
||||
var latestWeight = +(curWeight + (Math.random() - 0.3) * 0.5).toFixed(1);
|
||||
data.push({
|
||||
planId: p.id, planName: p.name,
|
||||
org: e.org, dept: e.dept,
|
||||
name: e.name, empId: e.empId,
|
||||
gender: e.gender, age: e.age,
|
||||
date: dateStr,
|
||||
height: e.height,
|
||||
initWeight: e.weight, initBmi: e.bmi, initFat: e.fat, initWaist: e.waist,
|
||||
targetWeight: targetWeight, targetBmi: targetBmi, targetFat: targetFat, targetWaist: targetWaist,
|
||||
curWeight: curWeight, curBmi: curBmi, curFat: curFat, curWaist: curWaist,
|
||||
weightChange: weightChange, bmiChange: bmiChange, fatChange: fatChange, waistChange: waistChange,
|
||||
breakfast: breakfast, lunch: lunch, dinner: dinner, snack: snack,
|
||||
exercise: exercise, latestWeight: latestWeight
|
||||
});
|
||||
});
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
var dailyData = buildDailyData();
|
||||
var selectedPlanId = null;
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
var filteredData = dailyData.slice();
|
||||
|
||||
/* ===== 计划搜索选择 ===== */
|
||||
function searchPlan(){
|
||||
var keyword = document.getElementById('planSearchInput').value.trim().toLowerCase();
|
||||
var panel = document.getElementById('planPanel');
|
||||
var filtered = plans;
|
||||
if(keyword){
|
||||
filtered = plans.filter(function(p){
|
||||
return p.name.toLowerCase().indexOf(keyword) > -1 || p.org.toLowerCase().indexOf(keyword) > -1;
|
||||
});
|
||||
}
|
||||
if(filtered.length === 0){
|
||||
panel.innerHTML = '<div class="search-select__empty">无匹配计划</div>';
|
||||
} else {
|
||||
var html = '';
|
||||
filtered.forEach(function(p){
|
||||
var sel = selectedPlanId === p.id ? ' selected' : '';
|
||||
html += '<div class="search-select__option'+sel+'" onclick="selectPlan('+p.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(p.name)+'</div>';
|
||||
html += '<div class="ss-org">'+esc(p.org)+' | '+p.dateFrom+' ~ '+p.dateTo+' | 应参加 '+p.totalCount+' 人</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
panel.innerHTML = html;
|
||||
}
|
||||
}
|
||||
|
||||
function showPlanPanel(){
|
||||
searchPlan();
|
||||
document.getElementById('planPanel').classList.add('show');
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
/* [交互] 清空已选干预计划,恢复未选择状态 */
|
||||
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();
|
||||
}
|
||||
|
||||
/* ===== 单位部门双列面板 ===== */
|
||||
var deptMap = {
|
||||
'第四采油厂':['健康管理部','安全环保科','工会办公室','生产技术部','财务部','信息中心'],
|
||||
'采油一厂':['健康管理部','安全环保科','工会办公室','生产技术部'],
|
||||
'采油二厂':['健康管理部','安全环保科','财务部'],
|
||||
'采气一厂':['生产技术部','信息中心']
|
||||
};
|
||||
var selectedUnitName = '';
|
||||
var selectedUnitCode = '';
|
||||
var selectedDeptName = '';
|
||||
var selectedDeptCode = '';
|
||||
|
||||
function toggleOrg(){
|
||||
var panel = document.getElementById('orgPanel');
|
||||
var trigger = document.getElementById('orgTrigger');
|
||||
panel.classList.toggle('open');
|
||||
trigger.classList.toggle('open');
|
||||
}
|
||||
|
||||
function selectUnit(elem, unitName, unitCode){
|
||||
document.querySelectorAll('#orgUnitCol .org-item').forEach(function(item){item.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selectedUnitName = unitName;
|
||||
selectedUnitCode = unitCode;
|
||||
var depts = deptMap[unitCode] || [];
|
||||
var html = '<div class="org-col__title">部门</div>';
|
||||
html += '<div class="org-item active" data-dept="" onclick="selectDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
depts.forEach(function(d){
|
||||
html += '<div class="org-item" data-dept="'+d+'" onclick="selectDept(this,\''+d+'\',\''+d+'\')">'+d+'</div>';
|
||||
});
|
||||
document.getElementById('orgDeptCol').innerHTML = html;
|
||||
selectedDeptName = '';
|
||||
selectedDeptCode = '';
|
||||
}
|
||||
|
||||
function selectDept(elem, deptName, deptCode){
|
||||
document.querySelectorAll('#orgDeptCol .org-item').forEach(function(item){item.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
selectedDeptName = deptName;
|
||||
selectedDeptCode = deptCode;
|
||||
var label = selectedUnitCode ? selectedUnitName : '全部单位';
|
||||
label += deptCode ? ' / ' + deptName : ' / 全部部门';
|
||||
document.getElementById('orgTrigger').textContent = label;
|
||||
}
|
||||
|
||||
/* ===== 筛选 ===== */
|
||||
function applyFilter(){
|
||||
var dateFrom = document.getElementById('filterDateFrom').value;
|
||||
var dateTo = document.getElementById('filterDateTo').value;
|
||||
var unit = selectedUnitCode;
|
||||
var dept = selectedDeptCode;
|
||||
var name = document.getElementById('filterName').value.trim().toLowerCase();
|
||||
var empId = document.getElementById('filterEmpId').value.trim().toLowerCase();
|
||||
var data = dailyData.slice();
|
||||
if(selectedPlanId){ data = data.filter(function(d){return d.planId === selectedPlanId;}); }
|
||||
filteredData = data.filter(function(d){
|
||||
if(dateFrom && d.date < dateFrom) return false;
|
||||
if(dateTo && d.date > dateTo) return false;
|
||||
if(unit && d.org !== unit) return false;
|
||||
if(dept && d.dept !== dept) return false;
|
||||
if(name && d.name.toLowerCase().indexOf(name) === -1) return false;
|
||||
if(empId && d.empId.toLowerCase().indexOf(empId) === -1) return false;
|
||||
return true;
|
||||
});
|
||||
currentPage = 0;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
function resetFilter(){
|
||||
// 恢复日期默认当日
|
||||
var today = formatDate(new Date());
|
||||
document.getElementById('filterDateFrom').value = today;
|
||||
document.getElementById('filterDateTo').value = today;
|
||||
selectedUnitName = '';
|
||||
selectedUnitCode = '';
|
||||
selectedDeptName = '';
|
||||
selectedDeptCode = '';
|
||||
document.getElementById('orgTrigger').textContent = '全部单位/部门';
|
||||
document.querySelectorAll('#orgUnitCol .org-item').forEach(function(item){item.classList.remove('active');});
|
||||
document.querySelectorAll('#orgUnitCol .org-item').item(0).classList.add('active');
|
||||
document.getElementById('orgDeptCol').innerHTML = '<div class="org-col__title">部门</div><div class="org-item active" data-dept="" onclick="selectDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
document.getElementById('filterName').value = '';
|
||||
document.getElementById('filterEmpId').value = '';
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
/* ===== 渲染表格 ===== */
|
||||
function renderTable(){
|
||||
var tbody = document.getElementById('tableBody');
|
||||
var start = currentPage * pageSize;
|
||||
var pageData = filteredData.slice(start, start + pageSize);
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize) || 1;
|
||||
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
|
||||
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
|
||||
if(filteredData.length === 0){
|
||||
tbody.innerHTML = '<tr><td colspan="29" 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>';
|
||||
html += '<td>'+esc(d.name)+'</td>';
|
||||
html += '<td>'+esc(d.empId)+'</td>';
|
||||
html += '<td>'+d.gender+'</td>';
|
||||
html += '<td>'+d.age+'</td>';
|
||||
html += '<td>'+esc(d.org)+'</td>';
|
||||
html += '<td>'+esc(d.dept)+'</td>';
|
||||
html += '<td>'+d.date+'</td>';
|
||||
html += '<td>'+d.height+'</td>';
|
||||
html += '<td>'+d.initWeight+'</td>';
|
||||
html += '<td>'+d.initBmi.toFixed(1)+'</td>';
|
||||
html += '<td>'+d.initFat.toFixed(1)+'</td>';
|
||||
html += '<td>'+d.initWaist+'</td>';
|
||||
html += '<td>'+d.targetWeight+'</td>';
|
||||
html += '<td>'+d.targetBmi+'</td>';
|
||||
html += '<td>'+d.targetFat+'</td>';
|
||||
html += '<td>'+d.targetWaist+'</td>';
|
||||
html += '<td>'+d.curWeight+'</td>';
|
||||
html += '<td>'+d.curBmi.toFixed(1)+'</td>';
|
||||
html += '<td>'+d.curFat.toFixed(1)+'</td>';
|
||||
html += '<td>'+d.curWaist+'</td>';
|
||||
html += '<td class="'+wcCls+'">'+wcSign+d.weightChange+'</td>';
|
||||
html += '<td class="'+bcCls+'">'+bcSign+d.bmiChange+'</td>';
|
||||
html += '<td class="'+fcCls+'">'+fcSign+d.fatChange+'</td>';
|
||||
html += '<td class="'+wacCls+'">'+wacSign+d.waistChange+'</td>';
|
||||
// 饮食摄入(千卡):早餐、午餐、晚餐、加餐
|
||||
html += '<td>'+d.breakfast+'</td>';
|
||||
html += '<td>'+d.lunch+'</td>';
|
||||
html += '<td>'+d.dinner+'</td>';
|
||||
html += '<td class="col-diet-last">'+d.snack+'</td>';
|
||||
// 运动消耗(千卡):今日消耗
|
||||
html += '<td class="col-exercise-last">'+d.exercise+'</td>';
|
||||
// 体重:最新体重
|
||||
html += '<td class="col-weight-last">'+d.latestWeight+'</td>';
|
||||
// 体重报告
|
||||
html += '<td><a class="link" href="javascript:void(0)" onclick="viewWeightReport(\''+esc(d.empId)+'\',\''+esc(d.name)+'\',\''+d.date+'\')">查看</a></td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
/* ===== 翻页 ===== */
|
||||
function goPage(delta){
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize);
|
||||
var newPage = currentPage + delta;
|
||||
if(newPage < 0 || newPage >= totalPages) return;
|
||||
currentPage = newPage;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 体重报告弹窗 ===== */
|
||||
var reportEmpId = null;
|
||||
var reportEmpName = '';
|
||||
var reportDate = '';
|
||||
var reportRecords = [];
|
||||
|
||||
/* 生成指定员工的体重报告Mock数据 */
|
||||
function generateReportRecords(empId, empName, targetDate){
|
||||
var endDate = parseDate(targetDate);
|
||||
var records = [];
|
||||
var emp = null;
|
||||
for(var i = 0; i < baseEmployees.length; i++){
|
||||
if(baseEmployees[i].empId === empId){ emp = baseEmployees[i]; break; }
|
||||
}
|
||||
if(!emp) emp = baseEmployees[0];
|
||||
var initWeight = emp.weight;
|
||||
var height = emp.height;
|
||||
var currentWeight = initWeight - (Math.random() * 8 + 4);
|
||||
var startWeight = currentWeight + (Math.random() * 6 + 6);
|
||||
for(var d = 60; d >= 0; d -= (Math.random() > 0.5 ? 2 : 3)){
|
||||
var dt = new Date(endDate);
|
||||
dt.setDate(dt.getDate() - d);
|
||||
if(dt > endDate) continue;
|
||||
var progress = (60 - d) / 60;
|
||||
var w = +(startWeight - (startWeight - currentWeight) * progress + (Math.random() - 0.5) * 0.4).toFixed(1);
|
||||
if(d === 0) w = currentWeight;
|
||||
var bmi = +(w / ((height/100) * (height/100))).toFixed(1);
|
||||
var fat = +(22 + (initWeight - w) * 0.3 + (Math.random() - 0.5) * 0.5).toFixed(1);
|
||||
var waist = +(80 + (initWeight - w) * 1.2 + (Math.random() - 0.5) * 0.3).toFixed(1);
|
||||
var intake = Math.floor(Math.random() * 600) + 1000;
|
||||
var consume = Math.floor(Math.random() * 500) + 800;
|
||||
records.push({
|
||||
date: formatDate(dt),
|
||||
weight: w, bmi: bmi, bodyFat: fat, waist: waist,
|
||||
intake: intake, consume: consume
|
||||
});
|
||||
if(d === 0) break;
|
||||
}
|
||||
if(records.length === 0 || records[records.length-1].date !== targetDate){
|
||||
var w = currentWeight;
|
||||
var bmi = +(w / ((height/100) * (height/100))).toFixed(1);
|
||||
var fat = +(22 + (initWeight - w) * 0.3).toFixed(1);
|
||||
var waist = +(80 + (initWeight - w) * 1.2).toFixed(1);
|
||||
records.push({
|
||||
date: targetDate,
|
||||
weight: w, bmi: bmi, bodyFat: fat, waist: waist,
|
||||
intake: Math.floor(Math.random() * 600) + 1000,
|
||||
consume: Math.floor(Math.random() * 500) + 800
|
||||
});
|
||||
}
|
||||
return records;
|
||||
}
|
||||
|
||||
function viewWeightReport(empId, name, date){
|
||||
reportEmpId = empId;
|
||||
reportEmpName = name;
|
||||
reportDate = date;
|
||||
reportRecords = generateReportRecords(empId, name, date);
|
||||
updateReportOverview();
|
||||
renderReportRecords();
|
||||
document.getElementById('reportOverlay').classList.add('show');
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
function closeReport(){
|
||||
document.getElementById('reportOverlay').classList.remove('show');
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
|
||||
function updateReportOverview(){
|
||||
var recs = reportRecords;
|
||||
if(recs.length === 0) return;
|
||||
var firstRec = recs[0];
|
||||
var lastRec = recs[recs.length - 1];
|
||||
var startW = firstRec.weight;
|
||||
var curW = lastRec.weight;
|
||||
var loss = startW - curW;
|
||||
var rate = startW > 0 ? (loss / startW) * 100 : 0;
|
||||
var firstDate = parseDate(firstRec.date);
|
||||
var lastDate = parseDate(lastRec.date);
|
||||
var days = Math.floor((lastDate - firstDate) / (1000*60*60*24)) + 1;
|
||||
document.getElementById('reportModalTitle').textContent = reportEmpName + ' - 体重报告';
|
||||
document.getElementById('rpOverviewTitle').textContent = reportEmpName + ' 的体重报告';
|
||||
document.getElementById('rpCutoff').textContent = lastRec.date;
|
||||
document.getElementById('rpDay').textContent = days;
|
||||
document.getElementById('rpTotal').textContent = days;
|
||||
document.getElementById('rpLoss').innerHTML = loss.toFixed(1) + '<span class="report-overview__metric-unit">kg</span>';
|
||||
document.getElementById('rpRate').innerHTML = rate.toFixed(1) + '<span class="report-overview__metric-unit">%</span>';
|
||||
// 模拟排名(基于empId的hash保证同一员工每次排名一致)
|
||||
var hash = 0;
|
||||
for(var i = 0; i < reportEmpId.length; i++){ hash = ((hash << 5) - hash) + reportEmpId.charCodeAt(i); hash |= 0; }
|
||||
var rankWeight = Math.abs(hash % 80) + 1;
|
||||
var rankRate = Math.abs((hash * 7 + 13) % 75) + 1;
|
||||
var rankScore = Math.abs((hash * 3 + 47) % 60) + 1;
|
||||
document.getElementById('rpRankWeight').textContent = '第 ' + rankWeight + ' 名';
|
||||
document.getElementById('rpRankRate').textContent = '第 ' + rankRate + ' 名';
|
||||
document.getElementById('rpRankScore').textContent = '第 ' + rankScore + ' 名';
|
||||
}
|
||||
|
||||
function renderReportRecords(){
|
||||
var tbody = document.getElementById('reportTableBody');
|
||||
if(reportRecords.length === 0){
|
||||
tbody.innerHTML = '<tr><td colspan="7" class="report-table-empty">暂无记录</td></tr>';
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
for(var i = 0; i < reportRecords.length; i++){
|
||||
var r = reportRecords[i];
|
||||
html += '<tr>';
|
||||
html += '<td>'+r.date+'</td>';
|
||||
html += '<td>'+r.weight.toFixed(1)+'</td>';
|
||||
html += '<td>'+r.bmi.toFixed(1)+'</td>';
|
||||
html += '<td>'+r.bodyFat.toFixed(1)+'</td>';
|
||||
html += '<td>'+r.waist.toFixed(1)+'</td>';
|
||||
html += '<td>'+r.intake+'</td>';
|
||||
html += '<td>'+r.consume+'</td>';
|
||||
html += '</tr>';
|
||||
}
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
function parseDate(s){ var p = s.split('-'); return new Date(+p[0], +p[1]-1, +p[2]); }
|
||||
|
||||
/* ===== 工具函数 ===== */
|
||||
function formatDate(d){
|
||||
var y = d.getFullYear();
|
||||
var m = (d.getMonth() + 1);
|
||||
var day = d.getDate();
|
||||
return y + '-' + (m < 10 ? '0' + m : m) + '-' + (day < 10 ? '0' + day : day);
|
||||
}
|
||||
|
||||
function calcPlanDays(dateFrom, dateTo){
|
||||
var today = new Date();
|
||||
var from = new Date(dateFrom);
|
||||
var to = new Date(dateTo);
|
||||
var end = to < today ? to : today;
|
||||
if(end < from) return '未开始';
|
||||
return Math.ceil((end - from) / (1000*60*60*24)) + 1;
|
||||
}
|
||||
|
||||
function esc(s){return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
setTimeout(function(){t.classList.remove('show');},1500);
|
||||
}
|
||||
|
||||
/* 点击外部关闭下拉 */
|
||||
document.addEventListener('click',function(e){
|
||||
if(!e.target.closest('#planSelect')){
|
||||
document.getElementById('planPanel').classList.remove('show');
|
||||
}
|
||||
var orgWrap = document.getElementById('orgWrap');
|
||||
if(orgWrap && !orgWrap.contains(e.target)){
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
document.getElementById('orgTrigger').classList.remove('open');
|
||||
}
|
||||
});
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
(function init(){
|
||||
// 初始化日期范围为当日
|
||||
var today = formatDate(new Date());
|
||||
document.getElementById('filterDateFrom').value = today;
|
||||
document.getElementById('filterDateTo').value = today;
|
||||
// 预填充计划下拉数据
|
||||
var html = '';
|
||||
plans.forEach(function(p){
|
||||
html += '<div class="search-select__option" onclick="selectPlan('+p.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(p.name)+'</div>';
|
||||
html += '<div class="ss-org">'+esc(p.org)+' | '+p.dateFrom+' ~ '+p.dateTo+' | 应参加 '+p.totalCount+' 人</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
document.getElementById('planPanel').innerHTML = html;
|
||||
renderTable();
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# CHANGELOG | 体重管理 Web 管理端
|
||||
|
||||
## 2026-06-18 | 异常事件页面补全
|
||||
|
||||
### 页面补全
|
||||
- **`exception-system-dirty.html`**:系统脏数据页(220 行),补全筛选栏(业务模块/异常类型/年份下拉)、操作栏(导出列表数据/查看导出任务+计数)、数据表格(9 列:业务模块/异常类型/异常描述/异常检测时间/表名/字段名/编号/异常值/数据产生时间)、分页组件、10 条体重管理场景 Mock 脏数据(含数据缺失/格式错误/逻辑矛盾/重复数据/范围越界/关联缺失六种类型)
|
||||
- **`exception-result-abnormal.html`**:结果异常页(310 行),补全筛选栏(员工名称/员工编号/单位部门双列面板联动/业务模块/异常等级/年份)、操作栏(导出列表数据/查看导出任务+计数)、数据表格(9 列:员工/员工编号/单位名称/部门名称/业务模块/异常指标/异常值/异常等级/发现时间)、分页组件、10 条体重管理场景 Mock 异常数据(含BMI异常/体脂率异常/腰围异常/目标值偏差/体重反弹/数据缺失/体重异常,覆盖严重/中等/轻微三级)
|
||||
|
||||
### 参考来源
|
||||
- 列表字段设计参考 `web-admin/health-monitor/exception-dirty.html` 和 `web-admin/health-monitor/exception-result.html`
|
||||
- 异常指标覆盖体重管理核心维度:BMI、体重、体脂率、腰围、目标达成、体重反弹
|
||||
- 业务模块覆盖体重管理全部 7 个一级菜单:档案管理、计划管理、报名管理、过程管理、历史干预、个人体重管理、设备管理
|
||||
|
||||
## 2026-06-17 | 新增历史干预模块 + 活动统计页实现
|
||||
|
||||
### 新增页面
|
||||
- **`history-plan-list.html`**:历史干预-计划列表页(410 行),含筛选栏(活动所属单位/年份下拉)、操作栏(导出列表数据/查看导出任务)、20 列统计表格(干预计划/单位/部门/起止日期/人员范围(查看)/应参加已参加未参加人数/完成体重体脂腰围目标人数/人均减重减重率腰围减少/人均摄入消耗热量缺口/人均综合行动得分/负责人)、干预计划蓝色链接跳转详情、分页组件、12 条历史 Mock 数据
|
||||
- **`history-plan-detail.html`**:历史干预-计划详情页(280 行),含计划概览信息卡(5 字段网格)、6 列统计卡片(应参加/已参加/未参加/人均减重/减重率/综合得分)、参与者明细表(17 列:姓名编号性别年龄部门/初始体重BMI现体重BMI体重变化/体脂变化腰围变化/每日摄入消耗热量缺口/综合行动得分)、分页组件、Mock 参与者明细数据
|
||||
|
||||
### 新增功能
|
||||
- **`activity-statistics.html`**:活动统计页全面实现(666 行),含干预计划选择区(搜索下拉+信息展示,复用 action-overview 组件)、单位多选筛选组件(支持全选/多选/清空/确定)、操作栏、18 列统计表格(前两列 sticky 固定)、聚合 Mock 数据
|
||||
|
||||
### 全局变更
|
||||
- **顶部导航栏**:所有 weight-management 模块页面(36 个 HTML)新增一级菜单"历史干预",位于"过程管理"与"个人体重管理"之间
|
||||
|
||||
### 导航页同步
|
||||
- **`index.html`**:SITE_MAP 新增 `history-plan-list.html`(历史干预-计划列表)、`history-plan-detail.html`(历史干预-计划详情)
|
||||
|
||||
## 2026-06-16 | 体重管理活动计划管理页面全面重构
|
||||
|
||||
### 新增页面
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -5,42 +5,107 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>结果异常 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);
|
||||
}
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
/* 设计令牌 */
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.12);
|
||||
}
|
||||
|
||||
/* 通用布局 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;min-width:140px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;min-width:120px;}
|
||||
|
||||
/* 单位部门双列面板 */
|
||||
.org-select-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 10px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:40px;left:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:420px;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-col{flex:1;overflow-y:auto;max-height:240px;border-right:1px solid var(--border);}
|
||||
.org-col:last-child{border-right:none;}
|
||||
.org-col__title{padding:8px 14px;font-size:var(--font-xs);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.org-item{padding:9px 14px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;}
|
||||
.action-bar__right{margin-left:auto;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.action-bar__right strong{color:var(--primary);font-weight:600;}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
|
||||
.table-card__content table{min-width:100%;white-space:nowrap;}
|
||||
table{width:100%;border-collapse:collapse;}
|
||||
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
|
||||
/* 标签 */
|
||||
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-red{background:#FFF1F0;color:var(--danger);}
|
||||
.tag-orange{background:#FFF7E6;color:var(--warning);}
|
||||
.tag-blue{background:var(--primary-light);color:var(--primary);}
|
||||
.tag-green{background:#F6FFED;color:var(--success);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-top:1px solid var(--border);}
|
||||
.pagination__left{display:flex;align-items:center;gap:8px;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.pagination__right{display:flex;align-items:center;gap:6px;}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.page-ellipsis{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
|
||||
<!-- 顶部导航 -->
|
||||
<header class="top-bar">
|
||||
<div class="top-bar__logo">
|
||||
<svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg>
|
||||
体重管理
|
||||
</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-personal-weight-data.html">档案</a>
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html" class="active">异常事件</a>
|
||||
@@ -50,14 +115,332 @@
|
||||
<div class="avatar">管</div>
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">异常事件</div>
|
||||
<a href="exception-system-dirty.html" class="sidebar-item">系统脏数据</a>
|
||||
<a href="exception-result-abnormal.html" class="sidebar-item active">结果异常</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
<main class="main">
|
||||
<!-- 主内容区域 -->
|
||||
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>员工名称</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工名称">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="filter-input" type="text" placeholder="请输入员工编号">
|
||||
</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">
|
||||
<div class="org-col" id="orgUnitCol">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" data-unit="" onclick="selectUnit(this, '全部单位/部门', '')">全部单位/部门</div>
|
||||
<div class="org-item" data-unit="采油一厂" onclick="selectUnit(this, '采油一厂', '采油一厂')">采油一厂</div>
|
||||
<div class="org-item" data-unit="采油二厂" onclick="selectUnit(this, '采油二厂', '采油二厂')">采油二厂</div>
|
||||
<div class="org-item" data-unit="采气一厂" onclick="selectUnit(this, '采气一厂', '采气一厂')">采气一厂</div>
|
||||
<div class="org-item" data-unit="天然气处理厂" onclick="selectUnit(this, '天然气处理厂', '天然气处理厂')">天然气处理厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgDeptCol">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" data-dept="" onclick="selectDept(this, '全部部门', '')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>业务模块</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>档案管理</option>
|
||||
<option>计划管理</option>
|
||||
<option>报名管理</option>
|
||||
<option>过程管理</option>
|
||||
<option>历史干预</option>
|
||||
<option>个人体重管理</option>
|
||||
<option>设备管理</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>异常等级</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>严重</option>
|
||||
<option>中等</option>
|
||||
<option>轻微</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>年份</label>
|
||||
<select class="filter-select" style="min-width:90px;">
|
||||
<option>2026</option>
|
||||
<option>2025</option>
|
||||
<option>2024</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- [交互] 点击查询触发列表数据刷新 -->
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<!-- [交互] 点击重置将筛选条件恢复为默认值 -->
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<!-- [交互] 导出列表数据:触发浏览器下载当前列表数据为Excel文件 -->
|
||||
<button class="btn btn-primary"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="#fff" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
<!-- [交互] 查看导出任务:跳转至导出任务列表弹窗,展示历史导出记录及下载状态 -->
|
||||
<button class="btn btn-default"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
<div class="action-bar__right">共 <strong>62</strong> 条异常结果</div>
|
||||
</div>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<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 kg(30天)</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>
|
||||
<td>陈静</td>
|
||||
<td>EMP-10104</td>
|
||||
<td>天然气处理厂</td>
|
||||
<td>综合管理科</td>
|
||||
<td>计划管理</td>
|
||||
<td>目标值偏差</td>
|
||||
<td>距目标差6.3kg</td>
|
||||
<td><span class="tag tag-orange">中等</span></td>
|
||||
<td>2026-05-06 14:05</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>郑飞</td>
|
||||
<td>EMP-10105</td>
|
||||
<td>采油二厂</td>
|
||||
<td>生产运行科</td>
|
||||
<td>过程管理</td>
|
||||
<td>腰围异常</td>
|
||||
<td>98 cm</td>
|
||||
<td><span class="tag tag-orange">中等</span></td>
|
||||
<td>2026-05-05 17:42</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination">
|
||||
<div class="pagination__left">
|
||||
<span>显示 10 条,共 62 条</span>
|
||||
</div>
|
||||
<div class="pagination__right">
|
||||
<!-- [交互] 点击分页按钮切换当前页,当前页高亮 -->
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<span class="page-ellipsis">...</span>
|
||||
<button class="page-btn">7</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
// [交互] 侧边栏菜单项点击高亮切换
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item) {
|
||||
item.addEventListener('click', function() {
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(i) { i.classList.remove('active'); });
|
||||
this.classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
/* ———— 单位部门双列面板交互 ———— */
|
||||
|
||||
/* 部门映射数据:选中左侧单位后,右侧部门动态加载 */
|
||||
var deptMap = {
|
||||
'采油一厂': ['生产运行科', '安全环保科', '综合管理科', '健康管理部'],
|
||||
'采油二厂': ['生产运行科', '安全环保科', '财务部'],
|
||||
'采气一厂': ['安全生产科', '综合管理科', '信息中心'],
|
||||
'天然气处理厂': ['生产运行科', '安全环保科', '综合管理科']
|
||||
};
|
||||
|
||||
/* 当前选中状态 */
|
||||
var orgState = { unitName: '', unitCode: '', deptName: '', deptCode: '' };
|
||||
|
||||
/* [交互] 展开/收起单位部门双列面板 */
|
||||
function toggleOrg() {
|
||||
var panel = document.getElementById('orgPanel');
|
||||
var trigger = document.getElementById('orgTrigger');
|
||||
panel.classList.toggle('open');
|
||||
trigger.classList.toggle('open');
|
||||
}
|
||||
|
||||
/* [交互] 选择左侧单位 → 右侧部门列表联动刷新,选中"全部"则清空部门 */
|
||||
function selectUnit(elem, unitName, unitCode) {
|
||||
document.querySelectorAll('#orgUnitCol .org-item').forEach(function(item) {
|
||||
item.classList.remove('active');
|
||||
});
|
||||
elem.classList.add('active');
|
||||
orgState.unitName = unitName;
|
||||
orgState.unitCode = unitCode;
|
||||
|
||||
// 更新右侧部门列表
|
||||
var depts = deptMap[unitCode] || [];
|
||||
var html = '<div class="org-col__title">部门</div>';
|
||||
html += '<div class="org-item active" data-dept="" onclick="selectDept(this, \'全部部门\', \'\')">全部部门</div>';
|
||||
depts.forEach(function(d) {
|
||||
html += '<div class="org-item" data-dept="' + d + '" onclick="selectDept(this, \'' + d + '\', \'' + d + '\')">' + d + '</div>';
|
||||
});
|
||||
document.getElementById('orgDeptCol').innerHTML = html;
|
||||
orgState.deptName = '';
|
||||
orgState.deptCode = '';
|
||||
|
||||
// 更新触发器文本
|
||||
var label = unitCode ? unitName : '全部单位';
|
||||
label += ' / 全部部门';
|
||||
document.getElementById('orgTrigger').textContent = label;
|
||||
}
|
||||
|
||||
/* [交互] 选择右侧部门 → 更新触发器文本并关闭面板 */
|
||||
function selectDept(elem, deptName, deptCode) {
|
||||
document.querySelectorAll('#orgDeptCol .org-item').forEach(function(item) {
|
||||
item.classList.remove('active');
|
||||
});
|
||||
elem.classList.add('active');
|
||||
orgState.deptName = deptName;
|
||||
orgState.deptCode = deptCode;
|
||||
|
||||
// 更新触发器文本
|
||||
var label = orgState.unitCode ? orgState.unitName : '全部单位';
|
||||
if (deptCode) {
|
||||
label += ' / ' + deptName;
|
||||
} else {
|
||||
label += ' / 全部部门';
|
||||
}
|
||||
document.getElementById('orgTrigger').textContent = label;
|
||||
|
||||
// 关闭面板
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
document.getElementById('orgTrigger').classList.remove('open');
|
||||
}
|
||||
|
||||
/* [交互] 点击面板外部区域关闭 */
|
||||
document.addEventListener('click', function(e) {
|
||||
var orgWrap = document.getElementById('orgWrap');
|
||||
if (orgWrap && !orgWrap.contains(e.target)) {
|
||||
document.getElementById('orgPanel').classList.remove('open');
|
||||
document.getElementById('orgTrigger').classList.remove('open');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -5,42 +5,94 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>系统脏数据 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);
|
||||
}
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
/* 设计令牌 */
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
/* 通用布局 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;border-radius:var(--radius-md);padding:20px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;min-width:120px;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;margin-bottom:16px;}
|
||||
.action-bar__right{margin-left:auto;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.action-bar__right strong{color:var(--primary);font-weight:600;}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
|
||||
.table-card__content table{min-width:100%;white-space:nowrap;}
|
||||
table{width:100%;border-collapse:collapse;}
|
||||
thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
tbody tr:last-child td{border-bottom:none;}
|
||||
tbody tr:hover{background:#F8FBFF;}
|
||||
|
||||
/* 标签 */
|
||||
.tag{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.tag-red{background:#FFF1F0;color:var(--danger);}
|
||||
.tag-orange{background:#FFF7E6;color:var(--warning);}
|
||||
.tag-blue{background:var(--primary-light);color:var(--primary);}
|
||||
|
||||
/* 异常值高亮 */
|
||||
.val-error{color:var(--danger);font-weight:500;}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-top:1px solid var(--border);}
|
||||
.pagination__left{display:flex;align-items:center;gap:8px;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.pagination__right{display:flex;align-items:center;gap:6px;}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
.page-ellipsis{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
|
||||
<!-- 顶部导航 -->
|
||||
<header class="top-bar">
|
||||
<div class="top-bar__logo">
|
||||
<svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg>
|
||||
体重管理
|
||||
</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-personal-weight-data.html">档案</a>
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html" class="active">异常事件</a>
|
||||
@@ -50,14 +102,227 @@
|
||||
<div class="avatar">管</div>
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">异常事件</div>
|
||||
<a href="exception-system-dirty.html" class="sidebar-item active">系统脏数据</a>
|
||||
<a href="exception-result-abnormal.html" class="sidebar-item">结果异常</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
<main class="main">
|
||||
<!-- 主内容区域 -->
|
||||
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>业务模块</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>档案管理</option>
|
||||
<option>计划管理</option>
|
||||
<option>报名管理</option>
|
||||
<option>过程管理</option>
|
||||
<option>历史干预</option>
|
||||
<option>个人体重管理</option>
|
||||
<option>设备管理</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>异常类型</label>
|
||||
<select class="filter-select">
|
||||
<option>全部</option>
|
||||
<option>数据缺失</option>
|
||||
<option>格式错误</option>
|
||||
<option>逻辑矛盾</option>
|
||||
<option>重复数据</option>
|
||||
<option>范围越界</option>
|
||||
<option>关联缺失</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>年份</label>
|
||||
<select class="filter-select" style="min-width:90px;">
|
||||
<option>2026</option>
|
||||
<option>2025</option>
|
||||
<option>2024</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- [交互] 点击查询触发列表数据刷新 -->
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<!-- [交互] 点击重置将筛选条件恢复为默认值 -->
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- 操作栏 -->
|
||||
<div class="action-bar">
|
||||
<!-- [交互] 导出列表数据:触发浏览器下载当前列表数据为Excel文件 -->
|
||||
<button class="btn btn-primary"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 10v2h10v-2M7 2v7M4.5 6.5L7 9l2.5-2.5" stroke="#fff" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>导出列表数据</button>
|
||||
<!-- [交互] 查看导出任务:跳转至导出任务列表弹窗,展示历史导出记录及下载状态 -->
|
||||
<button class="btn btn-default"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="2" y="2" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M4 5h6M4 7.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>查看导出任务</button>
|
||||
<div class="action-bar__right">共 <strong>89</strong> 条脏数据</div>
|
||||
</div>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<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>
|
||||
<tr>
|
||||
<td>计划管理</td>
|
||||
<td><span class="tag tag-red">范围越界</span></td>
|
||||
<td>目标体重值低于40kg,超出合理设定范围</td>
|
||||
<td>2026-05-06 12:18</td>
|
||||
<td>t_weight_plan</td>
|
||||
<td>target_weight</td>
|
||||
<td>WP-20260506-0098</td>
|
||||
<td class="val-error">35.0</td>
|
||||
<td>2026-05-06 11:50</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>档案管理</td>
|
||||
<td><span class="tag tag-blue">重复数据</span></td>
|
||||
<td>同一员工存在多条档案记录,数据冗余</td>
|
||||
<td>2026-05-05 17:42</td>
|
||||
<td>t_weight_archive</td>
|
||||
<td>employee_id</td>
|
||||
<td>WA-20260505-0155</td>
|
||||
<td class="val-error">EMP-10003</td>
|
||||
<td>2026-05-05 17:20</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination">
|
||||
<div class="pagination__left">
|
||||
<span>显示 10 条,共 89 条</span>
|
||||
</div>
|
||||
<div class="pagination__right">
|
||||
<!-- [交互] 点击分页按钮切换当前页,当前页高亮 -->
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<span class="page-ellipsis">...</span>
|
||||
<button class="page-btn">9</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
// [交互] 侧边栏菜单项点击高亮切换
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item) {
|
||||
item.addEventListener('click', function() {
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(i) { i.classList.remove('active'); });
|
||||
this.classList.add('active');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,641 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>计划列表 | 历史干预 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
|
||||
/* 顶部导航栏 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
|
||||
/* 侧边栏 */
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
|
||||
/* 主内容区 */
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 页面标题 */
|
||||
.page-header{margin-bottom:16px;}
|
||||
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.page-header__breadcrumb span{color:var(--text-primary);}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-select{height:32px;min-width:140px;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;outline:none;appearance:none;-webkit-appearance:none;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:32px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-xs);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.btn-export{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-export:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;border-top:1px solid var(--border);}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:separate;border-spacing:0;min-width:2400px;}
|
||||
|
||||
/* 表头 */
|
||||
thead th{background:#FAFAFA;padding:8px 7px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
thead th.th-divider{border-right:2px solid var(--border);}
|
||||
|
||||
/* 表体 */
|
||||
tbody td{padding:10px 7px;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: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;}
|
||||
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 蓝色链接 */
|
||||
.link{color:var(--primary);cursor:pointer;text-decoration:none;font-weight:500;}
|
||||
.link:hover{color:#40a9ff;text-decoration:underline;}
|
||||
|
||||
/* 变化值颜色 */
|
||||
.change-down{color:var(--success);}
|
||||
.change-up{color:var(--danger);}
|
||||
.change-zero{color:var(--text-placeholder);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
|
||||
/* Toast */
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
|
||||
/* 弹窗遮罩 */
|
||||
.modal-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;}
|
||||
.modal-overlay.open{display:flex;}
|
||||
.modal-dialog{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);width:1100px;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;}
|
||||
.modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--border);flex-shrink:0;}
|
||||
.modal-header__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);}
|
||||
.modal-close{width:32px;height:32px;border:none;background:none;cursor:pointer;font-size:20px;color:var(--text-placeholder);display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);}
|
||||
.modal-close:hover{background:#F0F0F0;color:var(--text-primary);}
|
||||
.modal-body{flex:1;overflow-y:auto;padding:16px 24px 24px;}
|
||||
.modal-filter-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px;}
|
||||
.modal-filter-bar .filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.modal-filter-bar .filter-item label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
|
||||
.modal-filter-input{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-xs);outline:none;transition:border-color .2s;box-sizing:border-box;}
|
||||
.modal-filter-input:focus{border-color:var(--primary);}
|
||||
.modal-table-wrap{overflow-x:auto;}
|
||||
.modal-table-wrap table{min-width:900px;border-collapse:separate;border-spacing:0;}
|
||||
.modal-table-wrap thead th{background:#FAFAFA;padding:8px 12px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
.modal-table-wrap tbody td{padding:10px 12px;text-align:center;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid #F0F0F0;white-space:nowrap;}
|
||||
.modal-table-wrap tbody tr:last-child td{border-bottom:none;}
|
||||
.modal-table-wrap tbody tr:hover{background:#F8FBFF;}
|
||||
.modal-pagination{display:flex;align-items:center;justify-content:flex-end;padding-top:16px;gap:8px;}
|
||||
.modal-pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
|
||||
/* 弹窗内单位部门双列面板 */
|
||||
.modal-org-wrap{position:relative;display:inline-block;}
|
||||
.modal-org-trigger{height:32px;min-width:140px;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;user-select:none;white-space:nowrap;}
|
||||
.modal-org-trigger.open,.modal-org-trigger:hover{border-color:var(--primary);}
|
||||
.modal-org-panel{display:none;position:absolute;top:36px;left:0;z-index:310;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:380px;}
|
||||
.modal-org-panel.open{display:flex;}
|
||||
.modal-org-col{flex:1;overflow-y:auto;max-height:200px;border-right:1px solid var(--border);}
|
||||
.modal-org-col:last-child{border-right:none;}
|
||||
.modal-org-col__title{padding:6px 12px;font-size:var(--font-xs);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.modal-org-item{padding:8px 12px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.modal-org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.modal-org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部导航栏 -->
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-personal-weight-data.html">档案</a>
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html" class="active">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
</nav>
|
||||
<div class="top-bar__right">
|
||||
<a class="btn-back" href="../../index.html"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 3L5 8l5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg> 返回首页</a>
|
||||
<div class="avatar">管</div>
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">历史干预</div>
|
||||
<a href="history-plan-list.html" class="sidebar-item active">计划列表</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- 页面标题 -->
|
||||
<div class="page-header">
|
||||
<div class="page-header__breadcrumb">体重管理 / 历史干预 / <span>计划列表</span></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 筛选栏 — 活动所属单位下拉 + 年份下拉 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>活动所属单位</label>
|
||||
<!-- [交互] 下拉选择单位筛选 -->
|
||||
<select class="filter-select" id="filterUnit" onchange="applyFilter()">
|
||||
<option value="">全部单位</option>
|
||||
<option value="第四采油厂">第四采油厂</option>
|
||||
<option value="采油一厂">采油一厂</option>
|
||||
<option value="采油二厂">采油二厂</option>
|
||||
<option value="采气一厂">采气一厂</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>年份</label>
|
||||
<!-- [交互] 下拉选择年份筛选 -->
|
||||
<select class="filter-select" id="filterYear" onchange="applyFilter()">
|
||||
<option value="">全部年份</option>
|
||||
<option value="2026">2026</option>
|
||||
<option value="2025">2025</option>
|
||||
<option value="2024">2024</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- [交互] 点击查询按钮筛选列表 -->
|
||||
<button class="btn btn-primary" onclick="applyFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作按钮区 -->
|
||||
<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="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>干预计划</th>
|
||||
<th>活动所属单位</th>
|
||||
<th>组织部门</th>
|
||||
<th>起止日期</th>
|
||||
<th>人员范围</th>
|
||||
<th>应参加<br>人数</th>
|
||||
<th>已参加<br>人数</th>
|
||||
<th>未参加<br>人数</th>
|
||||
<th>完成体重<br>目标人数</th>
|
||||
<th>完成体脂<br>目标人数</th>
|
||||
<th>完成腰围<br>目标人数</th>
|
||||
<th>人均减重<br>(kg)</th>
|
||||
<th>人均减重<br>率(%)</th>
|
||||
<th>人均腰围<br>减少(cm)</th>
|
||||
<th>人均每日<br>摄入(千卡)</th>
|
||||
<th>人均每日<br>消耗(千卡)</th>
|
||||
<th>人均每日<br>热量缺口</th>
|
||||
<th>人均综合<br>得分</th>
|
||||
<th>人均行动<br>得分</th>
|
||||
<th>负责人</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span id="pageInfo">显示 0 条记录</span>
|
||||
<button class="page-btn" onclick="goPage(-1)">‹</button>
|
||||
<span id="pageNum" style="font-size:var(--font-sm);color:var(--text-secondary);">第 1 页</span>
|
||||
<button class="page-btn" onclick="goPage(1)">›</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Toast -->
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<!-- [交互] 人员范围弹窗 — 点击"查看"打开 -->
|
||||
<div class="modal-overlay" id="staffModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-header">
|
||||
<span class="modal-header__title" id="staffModalTitle">人员范围</span>
|
||||
<!-- [交互] 点击关闭弹窗 -->
|
||||
<button class="modal-close" onclick="closeStaffModal()">✕</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<!-- [交互] 弹窗筛选栏 — 单位部门级联 + 姓名 + 员工编号 -->
|
||||
<div class="modal-filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="modal-org-wrap" id="modalOrgWrap">
|
||||
<div class="modal-org-trigger" id="modalOrgTrigger" onclick="toggleModalOrg()">全部单位/部门</div>
|
||||
<div class="modal-org-panel" id="modalOrgPanel">
|
||||
<div class="modal-org-col" id="modalUnitCol">
|
||||
<div class="modal-org-col__title">单位</div>
|
||||
<div class="modal-org-item active" data-unit="" onclick="selectModalUnit(this,'全部单位/部门','')">全部单位/部门</div>
|
||||
<div class="modal-org-item" data-unit="第四采油厂" onclick="selectModalUnit(this,'第四采油厂','第四采油厂')">第四采油厂</div>
|
||||
<div class="modal-org-item" data-unit="采油一厂" onclick="selectModalUnit(this,'采油一厂','采油一厂')">采油一厂</div>
|
||||
<div class="modal-org-item" data-unit="采油二厂" onclick="selectModalUnit(this,'采油二厂','采油二厂')">采油二厂</div>
|
||||
<div class="modal-org-item" data-unit="采气一厂" onclick="selectModalUnit(this,'采气一厂','采气一厂')">采气一厂</div>
|
||||
</div>
|
||||
<div class="modal-org-col" id="modalDeptCol">
|
||||
<div class="modal-org-col__title">部门</div>
|
||||
<div class="modal-org-item active" data-dept="" onclick="selectModalDept(this,'全部部门','')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>姓名</label>
|
||||
<input class="modal-filter-input" id="modalFilterName" placeholder="请输入姓名" style="width:100px;">
|
||||
</div>
|
||||
<div class="filter-item">
|
||||
<label>员工编号</label>
|
||||
<input class="modal-filter-input" id="modalFilterEmpId" placeholder="请输入编号" style="width:110px;">
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="applyStaffFilter()">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="6" cy="6" r="4.5" stroke="#fff" stroke-width="1.3"/><path d="M9.5 9.5L13 13" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/></svg>查询
|
||||
</button>
|
||||
<button class="btn btn-default" onclick="resetStaffFilter()">重置</button>
|
||||
</div>
|
||||
<!-- 人员列表 -->
|
||||
<div class="modal-table-wrap">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>姓名</th>
|
||||
<th>员工编号</th>
|
||||
<th>性别</th>
|
||||
<th>年龄</th>
|
||||
<th>单位</th>
|
||||
<th>部门</th>
|
||||
<th>身高(cm)</th>
|
||||
<th>体重(kg)</th>
|
||||
<th>BMI</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="staffTableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-pagination">
|
||||
<span id="staffPageInfo">显示 0 条记录</span>
|
||||
<button class="page-btn" onclick="goStaffPage(-1)">‹</button>
|
||||
<span id="staffPageNum" style="font-size:var(--font-sm);color:var(--text-secondary);">第 1 页</span>
|
||||
<button class="page-btn" onclick="goStaffPage(1)">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
/* ===== 侧边栏当前页高亮 ===== */
|
||||
(function(){
|
||||
var current = location.pathname.split('/').pop();
|
||||
document.querySelectorAll('.sidebar-item').forEach(function(item){
|
||||
var href = item.getAttribute('href');
|
||||
item.classList.toggle('active', href === current);
|
||||
});
|
||||
})();
|
||||
|
||||
/* ===== Mock 数据:历史干预计划列表 ===== */
|
||||
var historyPlans = [
|
||||
{id:1,planName:'第四采油厂2024年超重健康干预计划',unit:'第四采油厂',dept:'健康管理部',dateFrom:'2024-03-01',dateTo:'2024-08-31',staffScope:'全厂员工',shouldCount:220,actualCount:205,notCount:15,weightGoalDone:168,fatGoalDone:152,waistGoalDone:145,avgWeightLoss:3.8,avgLossRate:4.5,avgWaistLoss:4.2,avgDailyIntake:1850,avgDailyConsume:520,avgDailyGap:330,avgScore:82.5,avgActionScore:76.3,responsible:'王建国'},
|
||||
{id:2,planName:'第四采油厂2025年超重健康干预计划',unit:'第四采油厂',dept:'健康管理部',dateFrom:'2025-03-01',dateTo:'2025-08-31',staffScope:'全厂员工',shouldCount:267,actualCount:251,notCount:16,weightGoalDone:198,fatGoalDone:185,waistGoalDone:172,avgWeightLoss:4.2,avgLossRate:5.1,avgWaistLoss:4.8,avgDailyIntake:1780,avgDailyConsume:560,avgDailyGap:380,avgScore:85.3,avgActionScore:79.1,responsible:'王建国'},
|
||||
{id:3,planName:'第四采油厂2026年超重健康干预计划',unit:'第四采油厂',dept:'健康管理部',dateFrom:'2026-03-01',dateTo:'2026-08-31',staffScope:'全厂员工',shouldCount:234,actualCount:218,notCount:16,weightGoalDone:92,fatGoalDone:78,waistGoalDone:71,avgWeightLoss:2.1,avgLossRate:2.5,avgWaistLoss:2.3,avgDailyIntake:1920,avgDailyConsume:490,avgDailyGap:280,avgScore:74.8,avgActionScore:68.2,responsible:'王建国'},
|
||||
{id:4,planName:'采油一厂2024年健康体重专项计划',unit:'采油一厂',dept:'安全环保科',dateFrom:'2024-04-01',dateTo:'2024-09-30',staffScope:'管理部门',shouldCount:156,actualCount:142,notCount:14,weightGoalDone:110,fatGoalDone:98,waistGoalDone:89,avgWeightLoss:3.5,avgLossRate:4.2,avgWaistLoss:3.9,avgDailyIntake:1900,avgDailyConsume:480,avgDailyGap:300,avgScore:80.1,avgActionScore:73.5,responsible:'李明辉'},
|
||||
{id:5,planName:'采油一厂2025年员工健康体重计划',unit:'采油一厂',dept:'安全环保科',dateFrom:'2025-04-15',dateTo:'2025-10-15',staffScope:'全厂员工',shouldCount:420,actualCount:398,notCount:22,weightGoalDone:310,fatGoalDone:285,waistGoalDone:268,avgWeightLoss:3.9,avgLossRate:4.8,avgWaistLoss:4.3,avgDailyIntake:1820,avgDailyConsume:540,avgDailyGap:360,avgScore:83.7,avgActionScore:77.8,responsible:'李明辉'},
|
||||
{id:6,planName:'采油一厂2026年体重管理专项行动',unit:'采油一厂',dept:'安全环保科',dateFrom:'2026-04-01',dateTo:'2026-09-30',staffScope:'全厂员工',shouldCount:186,actualCount:180,notCount:6,weightGoalDone:65,fatGoalDone:52,waistGoalDone:48,avgWeightLoss:1.8,avgLossRate:2.1,avgWaistLoss:2.0,avgDailyIntake:1950,avgDailyConsume:470,avgDailyGap:250,avgScore:72.3,avgActionScore:65.8,responsible:'李明辉'},
|
||||
{id:7,planName:'采油二厂2024年体重控制专项计划',unit:'采油二厂',dept:'工会办公室',dateFrom:'2024-07-01',dateTo:'2024-12-31',staffScope:'一线员工',shouldCount:145,actualCount:130,notCount:15,weightGoalDone:102,fatGoalDone:89,waistGoalDone:82,avgWeightLoss:3.2,avgLossRate:3.8,avgWaistLoss:3.5,avgDailyIntake:1880,avgDailyConsume:500,avgDailyGap:320,avgScore:78.9,avgActionScore:72.1,responsible:'张翠花'},
|
||||
{id:8,planName:'采油二厂2025年健康减重计划',unit:'采油二厂',dept:'工会办公室',dateFrom:'2025-05-15',dateTo:'2025-11-15',staffScope:'全厂员工',shouldCount:312,actualCount:295,notCount:17,weightGoalDone:228,fatGoalDone:202,waistGoalDone:195,avgWeightLoss:4.0,avgLossRate:4.6,avgWaistLoss:4.5,avgDailyIntake:1800,avgDailyConsume:550,avgDailyGap:370,avgScore:84.2,avgActionScore:78.6,responsible:'张翠花'},
|
||||
{id:9,planName:'采油二厂2026年健康减重计划',unit:'采油二厂',dept:'工会办公室',dateFrom:'2026-05-15',dateTo:'2026-11-15',staffScope:'全厂员工',shouldCount:312,actualCount:295,notCount:17,weightGoalDone:58,fatGoalDone:42,waistGoalDone:35,avgWeightLoss:1.2,avgLossRate:1.5,avgWaistLoss:1.4,avgDailyIntake:1980,avgDailyConsume:460,avgDailyGap:220,avgScore:68.5,avgActionScore:61.2,responsible:'张翠花'},
|
||||
{id:10,planName:'采气一厂2024年健康体重计划',unit:'采气一厂',dept:'生产技术部',dateFrom:'2024-06-01',dateTo:'2024-11-30',staffScope:'全厂员工',shouldCount:135,actualCount:118,notCount:17,weightGoalDone:92,fatGoalDone:78,waistGoalDone:72,avgWeightLoss:3.6,avgLossRate:4.3,avgWaistLoss:4.0,avgDailyIntake:1860,avgDailyConsume:510,avgDailyGap:340,avgScore:81.4,avgActionScore:74.9,responsible:'赵铁柱'},
|
||||
{id:11,planName:'采气一厂2025年度体重管理计划',unit:'采气一厂',dept:'生产技术部',dateFrom:'2025-06-01',dateTo:'2025-12-01',staffScope:'全厂员工',shouldCount:158,actualCount:142,notCount:16,weightGoalDone:115,fatGoalDone:98,waistGoalDone:90,avgWeightLoss:4.1,avgLossRate:5.0,avgWaistLoss:4.6,avgDailyIntake:1790,avgDailyConsume:570,avgDailyGap:390,avgScore:86.0,avgActionScore:80.2,responsible:'赵铁柱'},
|
||||
{id:12,planName:'采气一厂2026下半年体重干预计划',unit:'采气一厂',dept:'生产技术部',dateFrom:'2026-09-01',dateTo:'2026-12-31',staffScope:'全厂员工',shouldCount:89,actualCount:72,notCount:17,weightGoalDone:0,fatGoalDone:0,waistGoalDone:0,avgWeightLoss:0,avgLossRate:0,avgWaistLoss:0,avgDailyIntake:0,avgDailyConsume:0,avgDailyGap:0,avgScore:0,avgActionScore:0,responsible:'赵铁柱'}
|
||||
];
|
||||
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
var filteredData = historyPlans.slice();
|
||||
|
||||
/* ===== 筛选 ===== */
|
||||
function applyFilter(){
|
||||
var unit = document.getElementById('filterUnit').value;
|
||||
var year = document.getElementById('filterYear').value;
|
||||
var data = historyPlans.slice();
|
||||
if(unit){
|
||||
data = data.filter(function(d){return d.unit === unit;});
|
||||
}
|
||||
if(year){
|
||||
data = data.filter(function(d){return d.dateFrom.indexOf(year) === 0 || d.dateTo.indexOf(year) === 0;});
|
||||
}
|
||||
filteredData = data;
|
||||
currentPage = 0;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
function resetFilter(){
|
||||
document.getElementById('filterUnit').value = '';
|
||||
document.getElementById('filterYear').value = '';
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
/* ===== 渲染表格 ===== */
|
||||
function renderTable(){
|
||||
var tbody = document.getElementById('tableBody');
|
||||
var start = currentPage * pageSize;
|
||||
var pageData = filteredData.slice(start, start + pageSize);
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize) || 1;
|
||||
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>';
|
||||
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>';
|
||||
// [交互] 干预计划蓝色链接,点击跳转至二级详情页 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>';
|
||||
html += '<td>'+esc(d.dept)+'</td>';
|
||||
html += '<td>'+d.dateFrom+' ~ '+d.dateTo+'</td>';
|
||||
// [交互] 人员范围(查看) — 点击弹窗展示人员范围详情
|
||||
html += '<td><a class="link" href="javascript:void(0)" onclick="showStaffScope(\''+esc(d.staffScope)+'\',\''+esc(d.planName)+'\')">查看</a></td>';
|
||||
html += '<td>'+d.shouldCount+'</td>';
|
||||
html += '<td>'+d.actualCount+'</td>';
|
||||
html += '<td>'+d.notCount+'</td>';
|
||||
html += '<td>'+d.weightGoalDone+'</td>';
|
||||
html += '<td>'+d.fatGoalDone+'</td>';
|
||||
html += '<td>'+d.waistGoalDone+'</td>';
|
||||
html += '<td class="'+lossCls+'">'+(d.avgWeightLoss > 0 ? '-'+d.avgWeightLoss : d.avgWeightLoss)+'</td>';
|
||||
html += '<td class="'+rateCls+'">'+(d.avgLossRate > 0 ? '-'+d.avgLossRate : d.avgLossRate)+'</td>';
|
||||
html += '<td class="'+waistCls+'">'+(d.avgWaistLoss > 0 ? '-'+d.avgWaistLoss : d.avgWaistLoss)+'</td>';
|
||||
html += '<td>'+d.avgDailyIntake.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.avgDailyConsume.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.avgDailyGap.toLocaleString()+'</td>';
|
||||
html += '<td>'+d.avgScore+'</td>';
|
||||
html += '<td>'+d.avgActionScore+'</td>';
|
||||
html += '<td>'+esc(d.responsible)+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
/* ===== 翻页 ===== */
|
||||
function goPage(delta){
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize);
|
||||
var newPage = currentPage + delta;
|
||||
if(newPage < 0 || newPage >= totalPages) return;
|
||||
currentPage = newPage;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 人员范围查看 — 弹窗 ===== */
|
||||
var staffModalPlanId = null;
|
||||
var staffModalPlanName = '';
|
||||
var staffAllData = [];
|
||||
var staffFilteredData = [];
|
||||
var staffPageSize = 10;
|
||||
var staffCurrentPage = 0;
|
||||
var modalUnitCode = '';
|
||||
var modalUnitName = '';
|
||||
var modalDeptCode = '';
|
||||
var modalDeptName = '';
|
||||
|
||||
/* 部门映射 */
|
||||
var modalDeptMap = {
|
||||
'第四采油厂':['健康管理部','安全环保科','工会办公室','生产技术部','财务部','信息中心'],
|
||||
'采油一厂':['健康管理部','安全环保科','工会办公室','生产技术部'],
|
||||
'采油二厂':['健康管理部','安全环保科','财务部'],
|
||||
'采气一厂':['生产技术部','信息中心']
|
||||
};
|
||||
|
||||
/* 生成 Mock 人员数据 */
|
||||
function buildStaffData(plan){
|
||||
var surnames = ['张','李','王','赵','刘','陈','周','吴','郑','黄','杨','孙','林','何','马'];
|
||||
var names = ['伟','娜','磊','敏','洋','晨','杰','芳','丽','浩','燕','强','涛','婷','超','娟','军','明','平','勇'];
|
||||
var depts = plan.dept ? [plan.dept].concat(modalDeptMap[plan.unit] || []) : (modalDeptMap[plan.unit] || ['健康管理部','安全环保科']);
|
||||
var data = [];
|
||||
for(var i = 0; i < plan.shouldCount; i++){
|
||||
var gender = i % 4 === 0 ? '女' : '男';
|
||||
var age = 25 + Math.floor(Math.random() * 28);
|
||||
var height = gender === '男' ? (165 + Math.floor(Math.random() * 18)) : (155 + Math.floor(Math.random() * 13));
|
||||
var weight = gender === '男' ? +(65 + Math.random() * 30).toFixed(1) : +(52 + Math.random() * 25).toFixed(1);
|
||||
var bmi = +(weight / ((height/100)*(height/100))).toFixed(1);
|
||||
data.push({
|
||||
name: surnames[Math.floor(Math.random()*surnames.length)] + names[Math.floor(Math.random()*names.length)],
|
||||
empId: 'CQ' + String(100001 + Math.floor(Math.random()*90000)),
|
||||
gender: gender, age: age,
|
||||
unit: plan.unit,
|
||||
dept: depts[Math.floor(Math.random()*depts.length)],
|
||||
height: height, weight: weight, bmi: bmi
|
||||
});
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/* [交互] 打开人员范围弹窗 */
|
||||
function showStaffScope(scope, planName){
|
||||
staffModalPlanName = planName;
|
||||
document.getElementById('staffModalTitle').textContent = planName;
|
||||
// 找到对应计划
|
||||
var plan = historyPlans.find(function(p){return p.planName === planName;});
|
||||
if(plan){
|
||||
staffModalPlanId = plan.id;
|
||||
staffAllData = buildStaffData(plan);
|
||||
} else {
|
||||
staffAllData = [];
|
||||
}
|
||||
staffFilteredData = staffAllData.slice();
|
||||
staffCurrentPage = 0;
|
||||
resetStaffFilterSilent();
|
||||
document.getElementById('staffModal').classList.add('open');
|
||||
renderStaffTable();
|
||||
}
|
||||
|
||||
/* [交互] 关闭弹窗 */
|
||||
function closeStaffModal(){
|
||||
document.getElementById('staffModal').classList.remove('open');
|
||||
}
|
||||
|
||||
/* 点击遮罩关闭 */
|
||||
document.getElementById('staffModal').addEventListener('click', function(e){
|
||||
if(e.target === this) closeStaffModal();
|
||||
});
|
||||
|
||||
/* ===== 弹窗单位部门级联 ===== */
|
||||
function toggleModalOrg(){
|
||||
var panel = document.getElementById('modalOrgPanel');
|
||||
var trigger = document.getElementById('modalOrgTrigger');
|
||||
panel.classList.toggle('open');
|
||||
trigger.classList.toggle('open');
|
||||
}
|
||||
|
||||
function selectModalUnit(elem, unitName, unitCode){
|
||||
document.querySelectorAll('#modalUnitCol .modal-org-item').forEach(function(item){item.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
modalUnitName = unitName;
|
||||
modalUnitCode = unitCode;
|
||||
var depts = modalDeptMap[unitCode] || [];
|
||||
var html = '<div class="modal-org-col__title">部门</div>';
|
||||
html += '<div class="modal-org-item active" data-dept="" onclick="selectModalDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
depts.forEach(function(d){
|
||||
html += '<div class="modal-org-item" data-dept="'+d+'" onclick="selectModalDept(this,\''+d+'\',\''+d+'\')">'+d+'</div>';
|
||||
});
|
||||
document.getElementById('modalDeptCol').innerHTML = html;
|
||||
modalDeptName = '';
|
||||
modalDeptCode = '';
|
||||
}
|
||||
|
||||
function selectModalDept(elem, deptName, deptCode){
|
||||
document.querySelectorAll('#modalDeptCol .modal-org-item').forEach(function(item){item.classList.remove('active');});
|
||||
elem.classList.add('active');
|
||||
modalDeptName = deptName;
|
||||
modalDeptCode = deptCode;
|
||||
var label = modalUnitCode ? modalUnitName : '全部单位';
|
||||
label += deptCode ? ' / ' + deptName : ' / 全部部门';
|
||||
document.getElementById('modalOrgTrigger').textContent = label;
|
||||
}
|
||||
|
||||
/* ===== 弹窗人员筛选 ===== */
|
||||
function applyStaffFilter(){
|
||||
var unit = modalUnitCode;
|
||||
var dept = modalDeptCode;
|
||||
var name = document.getElementById('modalFilterName').value.trim().toLowerCase();
|
||||
var empId = document.getElementById('modalFilterEmpId').value.trim().toLowerCase();
|
||||
var data = staffAllData.slice();
|
||||
if(unit){ data = data.filter(function(d){return d.unit === unit;}); }
|
||||
if(dept){ data = data.filter(function(d){return d.dept === dept;}); }
|
||||
if(name){ data = data.filter(function(d){return d.name.toLowerCase().indexOf(name) !== -1;}); }
|
||||
if(empId){ data = data.filter(function(d){return d.empId.toLowerCase().indexOf(empId) !== -1;}); }
|
||||
staffFilteredData = data;
|
||||
staffCurrentPage = 0;
|
||||
renderStaffTable();
|
||||
}
|
||||
|
||||
function resetStaffFilter(){
|
||||
resetStaffFilterSilent();
|
||||
applyStaffFilter();
|
||||
}
|
||||
|
||||
function resetStaffFilterSilent(){
|
||||
modalUnitName = ''; modalUnitCode = '';
|
||||
modalDeptName = ''; modalDeptCode = '';
|
||||
document.getElementById('modalOrgTrigger').textContent = '全部单位/部门';
|
||||
document.querySelectorAll('#modalUnitCol .modal-org-item').forEach(function(item){item.classList.remove('active');});
|
||||
var firstUnit = document.querySelector('#modalUnitCol .modal-org-item');
|
||||
if(firstUnit) firstUnit.classList.add('active');
|
||||
document.getElementById('modalDeptCol').innerHTML = '<div class="modal-org-col__title">部门</div><div class="modal-org-item active" data-dept="" onclick="selectModalDept(this,\'全部部门\',\'\')">全部部门</div>';
|
||||
document.getElementById('modalFilterName').value = '';
|
||||
document.getElementById('modalFilterEmpId').value = '';
|
||||
}
|
||||
|
||||
/* ===== 弹窗表格渲染 ===== */
|
||||
function renderStaffTable(){
|
||||
var tbody = document.getElementById('staffTableBody');
|
||||
var start = staffCurrentPage * staffPageSize;
|
||||
var pageData = staffFilteredData.slice(start, start + staffPageSize);
|
||||
var totalPages = Math.ceil(staffFilteredData.length / staffPageSize) || 1;
|
||||
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>';
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
pageData.forEach(function(d){
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(d.name)+'</td>';
|
||||
html += '<td>'+esc(d.empId)+'</td>';
|
||||
html += '<td>'+d.gender+'</td>';
|
||||
html += '<td>'+d.age+'</td>';
|
||||
html += '<td>'+esc(d.unit)+'</td>';
|
||||
html += '<td>'+esc(d.dept)+'</td>';
|
||||
html += '<td>'+d.height+'</td>';
|
||||
html += '<td>'+d.weight+'</td>';
|
||||
html += '<td>'+d.bmi+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
function goStaffPage(delta){
|
||||
var totalPages = Math.ceil(staffFilteredData.length / staffPageSize) || 1;
|
||||
var newPage = staffCurrentPage + delta;
|
||||
if(newPage < 0 || newPage >= totalPages) return;
|
||||
staffCurrentPage = newPage;
|
||||
renderStaffTable();
|
||||
}
|
||||
|
||||
/* 点击外部关闭弹窗内单位面板 */
|
||||
document.addEventListener('click', function(e){
|
||||
var mw = document.getElementById('modalOrgWrap');
|
||||
if(mw && !mw.contains(e.target)){
|
||||
document.getElementById('modalOrgPanel').classList.remove('open');
|
||||
document.getElementById('modalOrgTrigger').classList.remove('open');
|
||||
}
|
||||
});
|
||||
|
||||
/* ===== 工具函数 ===== */
|
||||
function esc(s){return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
setTimeout(function(){t.classList.remove('show');},2000);
|
||||
}
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
(function init(){
|
||||
renderTable();
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -31,6 +31,78 @@
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* Tab 切换栏 */
|
||||
.tab-bar{display:flex;gap:0;padding:0 24px;background:#fff;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);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);}
|
||||
.tab-item.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;}
|
||||
.tab-item__badge{display:inline-block;margin-left:6px;padding:0 8px;border-radius:10px;font-size:var(--font-xs);background:#F0F0F0;color:var(--text-secondary);line-height:1.8;}
|
||||
.tab-item.active .tab-item__badge{background:var(--primary-light);color:var(--primary);}
|
||||
.tab-panel{display:none;}
|
||||
.tab-panel.active{display:block;}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-bottom:1px solid var(--border);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-input{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff;min-width:140px;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 12px;font-size:var(--font-sm);color:var(--text-primary);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 10px center;appearance:none;cursor:pointer;min-width:140px;}
|
||||
|
||||
/* 单位部门双列面板 */
|
||||
.org-select-wrap{position:relative;display:inline-block;}
|
||||
.org-trigger{height:36px;min-width:160px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 28px 0 10px;font-size:var(--font-sm);color:var(--text-primary);background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center;cursor:pointer;display:flex;align-items:center;user-select:none;white-space:nowrap;}
|
||||
.org-trigger.open,.org-trigger:hover{border-color:var(--primary);}
|
||||
.org-panel{display:none;position:absolute;top:40px;left:0;z-index:300;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);width:420px;}
|
||||
.org-panel.open{display:flex;}
|
||||
.org-col{flex:1;overflow-y:auto;max-height:240px;border-right:1px solid var(--border);}
|
||||
.org-col:last-child{border-right:none;}
|
||||
.org-col__title{padding:8px 14px;font-size:var(--font-xs);color:var(--text-placeholder);background:#FAFAFA;border-bottom:1px solid var(--border);font-weight:500;}
|
||||
.org-item{padding:9px 14px;font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:4px;}
|
||||
.org-item:hover{background:#F0F8FF;color:var(--primary);}
|
||||
.org-item.active{background:var(--primary-light);color:var(--primary);font-weight:500;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:12px;padding:16px 24px;background:#fff;border-bottom:1px solid var(--border);}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:collapse;min-width:2400px;}
|
||||
thead th{background:#FAFAFA;padding:10px 10px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
thead th.th-divider{border-right:2px solid var(--border);}
|
||||
tbody td{padding:10px 10px;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;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 固定列:首两列左固定,末列右固定 */
|
||||
.col-fixed-l1{position:sticky;left:0;z-index:2;}
|
||||
.col-fixed-l2{position:sticky;left:72px;z-index:2;}
|
||||
.col-fixed-r{position:sticky;right:0;z-index:2;}
|
||||
thead .col-fixed-l1,thead .col-fixed-l2,thead .col-fixed-r{background:#FAFAFA;}
|
||||
tbody .col-fixed-l1,tbody .col-fixed-l2,tbody .col-fixed-r{background:#fff;}
|
||||
tbody tr:hover .col-fixed-l1,tbody tr:hover .col-fixed-l2,tbody tr:hover .col-fixed-r{background:#F8FBFF;}
|
||||
/* 查看按钮 */
|
||||
.btn-link{color:var(--primary);cursor:pointer;background:none;border:none;font-size:var(--font-sm);padding:0;text-decoration:none;}
|
||||
.btn-link:hover{color:#40a9ff;text-decoration:underline;}
|
||||
|
||||
/* 变化值颜色 */
|
||||
.change-down{color:var(--success);}
|
||||
.change-up{color:var(--danger);}
|
||||
.change-zero{color:var(--text-placeholder);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -41,6 +113,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html" class="active">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -56,7 +129,306 @@
|
||||
<a href="personal-target-data.html" class="sidebar-item active">个人目标数据</a>
|
||||
</aside>
|
||||
<main class="main">
|
||||
<!-- 主内容区域 -->
|
||||
<!-- [交互] Tab 切换:已设置目标 / 未设置目标,切换时下方筛选区+列表联动 -->
|
||||
<div class="tab-bar">
|
||||
<div class="tab-item active" data-tab="0" onclick="switchTab(0)">已设置目标</div>
|
||||
<div class="tab-item" data-tab="1" onclick="switchTab(1)">未设置目标</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab 0:已设置目标 -->
|
||||
<div class="tab-panel active" id="tabPanel0">
|
||||
<!-- 筛选条件 -->
|
||||
<div class="filter-bar">
|
||||
<!-- [交互] 单位部门双列面板:左选单位→右侧部门联动加载 -->
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-select-wrap" id="orgWrap0">
|
||||
<div class="org-trigger" id="orgTrigger0" onclick="toggleOrg(0)">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel0">
|
||||
<div class="org-col" id="orgUnitCol0">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" data-unit="" onclick="selectUnit(0, this, '全部单位/部门', '')">全部单位/部门</div>
|
||||
<div class="org-item" data-unit="采油一厂" onclick="selectUnit(0, this, '采油一厂', '采油一厂')">采油一厂</div>
|
||||
<div class="org-item" data-unit="采油二厂" onclick="selectUnit(0, this, '采油二厂', '采油二厂')">采油二厂</div>
|
||||
<div class="org-item" data-unit="采气厂" onclick="selectUnit(0, this, '采气厂', '采气厂')">采气厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgDeptCol0">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" data-dept="" onclick="selectDept(0, this, '全部部门', '')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
<!-- [交互] 操作按钮:导出列表数据触发浏览器下载;查看导出任务跳转至导出任务列表弹窗 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-default">查看导出任务</button>
|
||||
</div>
|
||||
<!-- 数据列表 -->
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<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>
|
||||
<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="2" style="text-align:center;border-bottom:1px solid var(--border);" class="th-divider">目标周期</th>
|
||||
<th colspan="5" style="text-align:center;border-bottom:1px solid var(--border);" class="th-divider">初始指标</th>
|
||||
<th colspan="4" style="text-align:center;border-bottom:1px solid var(--border);" class="th-divider">目标指标</th>
|
||||
<th colspan="4" style="text-align:center;border-bottom:1px solid var(--border);" class="th-divider">当前指标</th>
|
||||
<th colspan="4" style="text-align:center;border-bottom:1px solid var(--border);">变化</th>
|
||||
<th rowspan="2" style="vertical-align:middle;" class="col-fixed-r">详细数据</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>目标起止日期</th><th class="th-divider">目标天数</th>
|
||||
<th>身高(cm)</th><th>初始体重(kg)</th><th>初始BMI</th><th>初始体脂(%)</th><th class="th-divider">初始腰围(cm)</th>
|
||||
<th>目标体重(kg)</th><th>目标BMI</th><th>目标体脂(%)</th><th class="th-divider">目标腰围(cm)</th>
|
||||
<th>现体重(kg)</th><th>现BMI</th><th>现体脂(%)</th><th class="th-divider">现腰围(cm)</th>
|
||||
<th>体重变化(kg)</th><th>BMI变化</th><th>体脂变化(%)</th><th>腰围变化(cm)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<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>
|
||||
<td>72.0</td><td>23.5</td><td>20.0</td><td class="th-divider">82</td>
|
||||
<td>73.5</td><td>24.0</td><td>21.2</td><td class="th-divider">84</td>
|
||||
<td class="change-down">-11.5</td><td class="change-down">-3.8</td><td class="change-down">-5.3</td><td class="change-down">-12</td>
|
||||
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10001">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<td>55.0</td><td>20.7</td><td>24.0</td><td class="th-divider">68</td>
|
||||
<td>57.2</td><td>21.5</td><td>25.1</td><td class="th-divider">70</td>
|
||||
<td class="change-down">-11.3</td><td class="change-down">-4.3</td><td class="change-down">-6.9</td><td class="change-down">-12</td>
|
||||
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10002">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<td>78.0</td><td>27.0</td><td>24.0</td><td class="th-divider">90</td>
|
||||
<td>80.5</td><td>27.9</td><td>25.8</td><td class="th-divider">93</td>
|
||||
<td class="change-down">-11.5</td><td class="change-down">-3.9</td><td class="change-down">-4.4</td><td class="change-down">-12</td>
|
||||
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10003">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<td>52.0</td><td>20.3</td><td>22.0</td><td class="th-divider">66</td>
|
||||
<td>53.5</td><td>20.9</td><td>23.1</td><td class="th-divider">68</td>
|
||||
<td class="change-down">-8.5</td><td class="change-down">-3.3</td><td class="change-down">-5.4</td><td class="change-down">-10</td>
|
||||
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10004">查看</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<td>75.0</td><td>23.7</td><td>20.0</td><td class="th-divider">85</td>
|
||||
<td>77.2</td><td>24.4</td><td>21.5</td><td class="th-divider">87</td>
|
||||
<td class="change-down">-11.3</td><td class="change-down">-3.5</td><td class="change-down">-6.3</td><td class="change-down">-13</td>
|
||||
<td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10005">查看</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>共 156 条</span>
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<button class="page-btn">...</button>
|
||||
<button class="page-btn">16</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab 1:未设置目标 -->
|
||||
<div class="tab-panel" id="tabPanel1">
|
||||
<!-- 筛选条件 -->
|
||||
<div class="filter-bar">
|
||||
<!-- [交互] 单位部门双列面板:左选单位→右侧部门联动加载 -->
|
||||
<div class="filter-item">
|
||||
<label>单位部门</label>
|
||||
<div class="org-select-wrap" id="orgWrap1">
|
||||
<div class="org-trigger" id="orgTrigger1" onclick="toggleOrg(1)">全部单位/部门</div>
|
||||
<div class="org-panel" id="orgPanel1">
|
||||
<div class="org-col" id="orgUnitCol1">
|
||||
<div class="org-col__title">单位</div>
|
||||
<div class="org-item active" data-unit="" onclick="selectUnit(1, this, '全部单位/部门', '')">全部单位/部门</div>
|
||||
<div class="org-item" data-unit="采油一厂" onclick="selectUnit(1, this, '采油一厂', '采油一厂')">采油一厂</div>
|
||||
<div class="org-item" data-unit="采油二厂" onclick="selectUnit(1, this, '采油二厂', '采油二厂')">采油二厂</div>
|
||||
<div class="org-item" data-unit="采气厂" onclick="selectUnit(1, this, '采气厂', '采气厂')">采气厂</div>
|
||||
</div>
|
||||
<div class="org-col" id="orgDeptCol1">
|
||||
<div class="org-col__title">部门</div>
|
||||
<div class="org-item active" data-dept="" onclick="selectDept(1, this, '全部部门', '')">全部部门</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
<!-- [交互] 操作按钮 -->
|
||||
<div class="action-bar">
|
||||
<button class="btn btn-default">导出列表数据</button>
|
||||
<button class="btn btn-default">查看导出任务</button>
|
||||
</div>
|
||||
<!-- 数据列表 -->
|
||||
<div class="table-card">
|
||||
<div class="table-card__content">
|
||||
<table style="min-width:1100px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-fixed-l1">姓名</th>
|
||||
<th class="col-fixed-l2">员工编号</th>
|
||||
<th>性别</th>
|
||||
<th>年龄</th>
|
||||
<th>单位</th>
|
||||
<th>部门</th>
|
||||
<th>身高(cm)</th>
|
||||
<th>初始体重(kg)</th>
|
||||
<th>初始BMI</th>
|
||||
<th>初始体脂(%)</th>
|
||||
<th>初始腰围(cm)</th>
|
||||
<th class="col-fixed-r">详细数据</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td class="col-fixed-l1">孙磊</td><td class="col-fixed-l2">EMP-10101</td><td>男</td><td>29</td><td>采油一厂</td><td>生产运行科</td><td>172</td><td>78.0</td><td>26.4</td><td>24.5</td><td>92</td><td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10101&tab=noTarget">查看</a></td></tr>
|
||||
<tr><td class="col-fixed-l1">周婷</td><td class="col-fixed-l2">EMP-10102</td><td>女</td><td>33</td><td>采油二厂</td><td>安全环保科</td><td>158</td><td>65.2</td><td>26.1</td><td>31.0</td><td>80</td><td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10102&tab=noTarget">查看</a></td></tr>
|
||||
<tr><td class="col-fixed-l1">吴刚</td><td class="col-fixed-l2">EMP-10103</td><td>男</td><td>45</td><td>采气厂</td><td>综合管理科</td><td>168</td><td>90.5</td><td>32.1</td><td>33.5</td><td>108</td><td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10103&tab=noTarget">查看</a></td></tr>
|
||||
<tr><td class="col-fixed-l1">陈静</td><td class="col-fixed-l2">EMP-10104</td><td>女</td><td>26</td><td>采油一厂</td><td>综合管理科</td><td>165</td><td>58.0</td><td>21.3</td><td>25.0</td><td>72</td><td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10104&tab=noTarget">查看</a></td></tr>
|
||||
<tr><td class="col-fixed-l1">郑飞</td><td class="col-fixed-l2">EMP-10105</td><td>男</td><td>40</td><td>采油二厂</td><td>生产运行科</td><td>175</td><td>86.2</td><td>28.1</td><td>28.5</td><td>98</td><td class="col-fixed-r"><a class="btn-link" href="personal-target-detail.html?empId=EMP-10105&tab=noTarget">查看</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span>共 42 条</span>
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<button class="page-btn">...</button>
|
||||
<button class="page-btn">5</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
/* [交互] Tab 切换:点击 tab 按钮切换显示对应的 tab-panel */
|
||||
function switchTab(index) {
|
||||
document.querySelectorAll('.tab-item').forEach(function(el, i) {
|
||||
el.classList.toggle('active', i === index);
|
||||
});
|
||||
document.querySelectorAll('.tab-panel').forEach(function(el, i) {
|
||||
el.classList.toggle('active', i === index);
|
||||
});
|
||||
}
|
||||
|
||||
/* ———— 单位部门双列面板交互 ———— */
|
||||
|
||||
/* 部门映射数据:选中左侧单位后,右侧部门动态加载 */
|
||||
var deptMap = {
|
||||
'采油一厂': ['生产运行科', '安全环保科', '综合管理科', '健康管理部'],
|
||||
'采油二厂': ['生产运行科', '安全环保科', '财务部'],
|
||||
'采气厂': ['安全生产科', '综合管理科', '信息中心']
|
||||
};
|
||||
|
||||
/* 每个tab实例的选中状态 */
|
||||
var orgState = [
|
||||
{ unitName: '', unitCode: '', deptName: '', deptCode: '' },
|
||||
{ unitName: '', unitCode: '', deptName: '', deptCode: '' }
|
||||
];
|
||||
|
||||
/* [交互] 展开/收起单位部门双列面板 */
|
||||
function toggleOrg(tabIdx) {
|
||||
var panel = document.getElementById('orgPanel' + tabIdx);
|
||||
var trigger = document.getElementById('orgTrigger' + tabIdx);
|
||||
var isOpen = panel.classList.contains('open');
|
||||
panel.classList.toggle('open');
|
||||
trigger.classList.toggle('open');
|
||||
}
|
||||
|
||||
/* [交互] 选择左侧单位 → 右侧部门列表联动刷新,选中"全部"则清空部门 */
|
||||
function selectUnit(tabIdx, elem, unitName, unitCode) {
|
||||
document.querySelectorAll('#orgUnitCol' + tabIdx + ' .org-item').forEach(function(item) {
|
||||
item.classList.remove('active');
|
||||
});
|
||||
elem.classList.add('active');
|
||||
orgState[tabIdx].unitName = unitName;
|
||||
orgState[tabIdx].unitCode = unitCode;
|
||||
|
||||
// 更新右侧部门列表
|
||||
var depts = deptMap[unitCode] || [];
|
||||
var html = '<div class="org-col__title">部门</div>';
|
||||
html += '<div class="org-item active" data-dept="" onclick="selectDept(' + tabIdx + ', this, \'全部部门\', \'\')">全部部门</div>';
|
||||
depts.forEach(function(d) {
|
||||
html += '<div class="org-item" data-dept="' + d + '" onclick="selectDept(' + tabIdx + ', this, \'' + d + '\', \'' + d + '\')">' + d + '</div>';
|
||||
});
|
||||
document.getElementById('orgDeptCol' + tabIdx).innerHTML = html;
|
||||
orgState[tabIdx].deptName = '';
|
||||
orgState[tabIdx].deptCode = '';
|
||||
|
||||
// 更新触发器文本
|
||||
var label = unitCode ? unitName : '全部单位';
|
||||
label += ' / 全部部门';
|
||||
document.getElementById('orgTrigger' + tabIdx).textContent = label;
|
||||
}
|
||||
|
||||
/* [交互] 选择右侧部门 → 更新触发器文本并关闭面板 */
|
||||
function selectDept(tabIdx, elem, deptName, deptCode) {
|
||||
document.querySelectorAll('#orgDeptCol' + tabIdx + ' .org-item').forEach(function(item) {
|
||||
item.classList.remove('active');
|
||||
});
|
||||
elem.classList.add('active');
|
||||
orgState[tabIdx].deptName = deptName;
|
||||
orgState[tabIdx].deptCode = deptCode;
|
||||
|
||||
// 更新触发器文本
|
||||
var label = orgState[tabIdx].unitCode ? orgState[tabIdx].unitName : '全部单位';
|
||||
if (deptCode) {
|
||||
label += ' / ' + deptName;
|
||||
} else {
|
||||
label += ' / 全部部门';
|
||||
}
|
||||
document.getElementById('orgTrigger' + tabIdx).textContent = label;
|
||||
|
||||
// 关闭面板
|
||||
document.getElementById('orgPanel' + tabIdx).classList.remove('open');
|
||||
document.getElementById('orgTrigger' + tabIdx).classList.remove('open');
|
||||
}
|
||||
|
||||
/* [交互] 点击面板外部区域关闭 */
|
||||
document.addEventListener('click', function(e) {
|
||||
for (var i = 0; i < 2; i++) {
|
||||
var orgWrap = document.getElementById('orgWrap' + i);
|
||||
if (orgWrap && !orgWrap.contains(e.target)) {
|
||||
document.getElementById('orgPanel' + i).classList.remove('open');
|
||||
document.getElementById('orgTrigger' + i).classList.remove('open');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,715 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>每日记录详情 | 体重管理</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0;}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#F5F7FA;color:#333;min-width:1280px;}
|
||||
:root{
|
||||
--primary:#1890FF;--primary-light:#E6F7FF;--success:#52C41A;--warning:#FAAD14;--danger:#FF4D4F;
|
||||
--text-primary:#333;--text-secondary:#666;--text-placeholder:#999;--border:#E8E8E8;--background:#F5F7FA;
|
||||
--font-xs:11px;--font-sm:13px;--font-base:15px;--font-lg:17px;
|
||||
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;
|
||||
--shadow-sm:0 1px 4px rgba(0,0,0,0.08);--shadow-md:0 4px 12px rgba(0,0,0,0.10);
|
||||
}
|
||||
|
||||
/* 顶部导航栏 */
|
||||
.top-bar{display:flex;align-items:center;height:56px;background:#001529;padding:0 24px;position:fixed;top:0;left:0;right:0;z-index:100;}
|
||||
.top-bar__logo{display:flex;align-items:center;gap:8px;color:#fff;font-size:var(--font-lg);font-weight:600;white-space:nowrap;width:240px;flex-shrink:0;}
|
||||
.top-bar__logo svg{width:28px;height:28px;}
|
||||
.top-bar__nav{display:flex;align-items:center;gap:4px;flex:1;}
|
||||
.top-bar__nav a{color:rgba(255,255,255,0.65);text-decoration:none;padding:6px 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);transition:all .2s;}
|
||||
.top-bar__nav a:hover{color:#fff;background:rgba(255,255,255,0.08);}
|
||||
.top-bar__nav a.active{color:#fff;background:var(--primary);}
|
||||
.top-bar__right{display:flex;align-items:center;gap:16px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);}
|
||||
.btn-back{color:rgba(255,255,255,0.65);cursor:pointer;display:flex;align-items:center;gap:4px;text-decoration:none;}
|
||||
.btn-back:hover{color:#fff;}
|
||||
.avatar{width:32px;height:32px;border-radius:50%;background:#1890FF;display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--font-sm);cursor:pointer;}
|
||||
|
||||
/* 侧边栏 */
|
||||
.sidebar{position:fixed;top:56px;left:0;bottom:0;width:240px;background:#001529;overflow-y:auto;z-index:90;padding-top:8px;}
|
||||
.sidebar-menu__title{color:rgba(255,255,255,0.35);font-size:var(--font-xs);padding:16px 24px 8px;letter-spacing:.5px;}
|
||||
.sidebar-item{display:flex;align-items:center;gap:8px;padding:10px 24px;color:rgba(255,255,255,0.65);font-size:var(--font-sm);cursor:pointer;transition:all .15s;text-decoration:none;}
|
||||
.sidebar-item:hover{color:#fff;background:rgba(255,255,255,0.06);}
|
||||
.sidebar-item.active{color:#fff;background:var(--primary);}
|
||||
|
||||
/* 主内容区 */
|
||||
.main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);}
|
||||
|
||||
/* 页面标题 */
|
||||
.page-header{margin-bottom:16px;}
|
||||
.page-header__breadcrumb{font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.page-header__breadcrumb a{color:var(--text-placeholder);text-decoration:none;}
|
||||
.page-header__breadcrumb a:hover{color:var(--primary);}
|
||||
.page-header__breadcrumb span{color:var(--text-primary);}
|
||||
|
||||
/* 返回按钮 */
|
||||
.back-link{display:inline-flex;align-items:center;gap:6px;color:var(--primary);text-decoration:none;font-size:var(--font-sm);margin-bottom:12px;}
|
||||
.back-link:hover{color:#40a9ff;}
|
||||
|
||||
/* 顶部三列信息卡片 */
|
||||
.overview-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);margin-bottom:16px;display:flex;}
|
||||
.overview-card__col{padding:12px 20px;}
|
||||
.overview-card__col--left{width:200px;flex-shrink:0;border-right:1px solid var(--border);}
|
||||
.overview-card__col--mid{flex:1;border-right:1px solid var(--border);display:flex;flex-direction:column;}
|
||||
.overview-card__col--right{width:200px;flex-shrink:0;}
|
||||
.overview-card__title{font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #F0F0F0;}
|
||||
.overview-card__name{font-size:var(--font-base);font-weight:600;color:var(--text-primary);margin-bottom:8px;}
|
||||
.overview-card__info-list{display:flex;flex-direction:column;gap:6px;}
|
||||
.overview-card__info-row{display:flex;font-size:var(--font-sm);}
|
||||
.overview-card__info-label{color:var(--text-secondary);width:65px;flex-shrink:0;}
|
||||
.overview-card__info-value{color:var(--text-primary);}
|
||||
|
||||
/* 中列:计划下拉 + 初始/目标/现三列指标 */
|
||||
.overview-card__plan-select{margin-bottom:6px;display:flex;align-items:center;gap:16px;}
|
||||
.overview-card__plan-select .search-select{flex:1;min-width:0;}
|
||||
.overview-card__plan-info{display:flex;align-items:center;gap:16px;font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;flex-shrink:0;}
|
||||
.overview-card__plan-info .plan-status{display:inline-block;padding:1px 8px;border-radius:10px;font-size:var(--font-xs);}
|
||||
.overview-card__plan-info .plan-status--active{background:#F6FFED;color:var(--success);}
|
||||
.overview-card__plan-info .plan-status--ended{background:#F5F5F5;color:var(--text-placeholder);}
|
||||
.overview-card__metrics-row{display:flex;gap:0;}
|
||||
.overview-card__metrics-col{flex:1;padding:0 12px;text-align:center;}
|
||||
.overview-card__metrics-col+.overview-card__metrics-col{border-left:1px solid #F0F0F0;}
|
||||
.overview-card__metrics-title{font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;margin-bottom:8px;}
|
||||
.overview-card__metrics-row{flex:1;display:flex;align-items:center;}
|
||||
.overview-card__metrics-line{display:flex;justify-content:space-around;font-size:var(--font-sm);line-height:1.6;}
|
||||
.overview-card__metric{display:flex;flex-direction:column;align-items:center;flex:1;}
|
||||
.overview-card__metric-val{color:var(--text-primary);font-weight:600;}
|
||||
.overview-card__metric-val .unit{font-size:var(--font-xs);color:var(--text-placeholder);font-weight:400;}
|
||||
.overview-card__metric-label{font-size:var(--font-xs);color:var(--text-placeholder);}
|
||||
.overview-card__metrics-value{font-weight:600;}
|
||||
.overview-card__metrics-unit{font-size:var(--font-xs);color:var(--text-placeholder);}
|
||||
|
||||
/* 右列:累计天数 */
|
||||
.overview-card__stat-list{display:flex;flex-direction:column;gap:12px;}
|
||||
.overview-card__stat-item{display:flex;align-items:center;gap:12px;}
|
||||
.overview-card__stat-icon{width:38px;height:38px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
|
||||
.overview-card__stat-icon--diet{background:#E6F7FF;color:var(--primary);}
|
||||
.overview-card__stat-icon--exercise{background:#F6FFED;color:var(--success);}
|
||||
.overview-card__stat-icon--weight{background:#FFF7E6;color:var(--warning);}
|
||||
.overview-card__stat-body{display:flex;flex-direction:column;}
|
||||
.overview-card__stat-val{font-size:20px;font-weight:700;color:var(--text-primary);line-height:1.2;}
|
||||
.overview-card__stat-label{font-size:var(--font-xs);color:var(--text-secondary);}
|
||||
|
||||
/* 搜索下拉(干预计划选择) */
|
||||
.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);}
|
||||
.search-select__input::placeholder{color:var(--text-placeholder);}
|
||||
.search-select__panel{position:absolute;top:100%;left:0;right:0;margin-top:4px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:500;display:none;max-height:280px;overflow-y:auto;}
|
||||
.search-select__panel.show{display:block;}
|
||||
.search-select__option{padding:12px 16px;font-size:var(--font-sm);cursor:pointer;transition:background .1s;border-bottom:1px solid #F5F5F5;}
|
||||
.search-select__option:last-child{border-bottom:none;}
|
||||
.search-select__option:hover{background:#F5F7FA;}
|
||||
.search-select__option.selected{color:var(--primary);background:var(--primary-light);}
|
||||
.search-select__option .ss-org{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:2px;}
|
||||
.search-select__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:none;background:none;cursor:pointer;color:var(--text-placeholder);font-size:16px;display:none;align-items:center;justify-content:center;border-radius:50%;line-height:1;padding:0;z-index:1;}
|
||||
.search-select__clear:hover{color:var(--text-primary);background:#F0F0F0;}
|
||||
.search-select__clear.show{display:flex;}
|
||||
.search-select--selected .search-select__input{background-image:none;padding-right:32px;}
|
||||
|
||||
/* 筛选栏 */
|
||||
.filter-bar{background:#fff;padding:16px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;border-radius:var(--radius-md) var(--radius-md) 0 0;box-shadow:var(--shadow-sm);}
|
||||
.filter-item{display:flex;align-items:center;gap:8px;}
|
||||
.filter-item label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
|
||||
.filter-input{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 10px;font-size:var(--font-xs);outline:none;transition:border-color .2s;box-sizing:border-box;}
|
||||
.filter-input:focus{border-color:var(--primary);}
|
||||
.filter-divider{color:var(--text-placeholder);font-size:var(--font-xs);margin:0 2px;}
|
||||
|
||||
/* 按钮 */
|
||||
.btn{height:32px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-xs);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
|
||||
.btn-primary{background:var(--primary);color:#fff;}.btn-primary:hover{background:#40a9ff;}
|
||||
.btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-default:hover{color:var(--primary);border-color:var(--primary);}
|
||||
.btn-export{background:#fff;color:var(--text-primary);border:1px solid var(--border);}.btn-export:hover{color:var(--primary);border-color:var(--primary);}
|
||||
|
||||
/* 操作栏 */
|
||||
.action-bar{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;border-top:1px solid var(--border);}
|
||||
|
||||
/* 表格卡片 */
|
||||
.table-card{background:#fff;border-radius:0 0 var(--radius-md) var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;}
|
||||
.table-card__content{overflow-x:auto;-webkit-overflow-scrolling:touch;}
|
||||
table{width:100%;border-collapse:collapse;min-width:900px;white-space:nowrap;}
|
||||
|
||||
thead th{background:#FAFAFA;padding:10px 12px;text-align:center;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;}
|
||||
thead th.th-divider{border-right:2px solid var(--border);}
|
||||
tbody td{padding:10px 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;}
|
||||
.td-empty{text-align:center;padding:48px 0;color:var(--text-placeholder);font-size:var(--font-sm);}
|
||||
|
||||
/* 分页 */
|
||||
.pagination{display:flex;align-items:center;justify-content:flex-end;padding:16px 24px;gap:8px;border-top:1px solid var(--border);}
|
||||
.pagination span{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);display:inline-flex;align-items:center;justify-content:center;transition:all .2s;}
|
||||
.page-btn:hover,.page-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
|
||||
|
||||
/* Toast */
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%);background:#333;color:#fff;padding:10px 24px;border-radius:var(--radius-sm);font-size:var(--font-sm);z-index:9999;opacity:0;transition:opacity .2s;pointer-events:none;}
|
||||
.toast.show{opacity:1;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部导航栏 -->
|
||||
<div class="top-bar">
|
||||
<div class="top-bar__logo"><svg viewBox="0 0 28 28" fill="none"><rect width="28" height="28" rx="6" fill="#1890FF"/><path d="M7 14h14M14 7v14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/></svg> 体重管理</div>
|
||||
<nav class="top-bar__nav">
|
||||
<a href="archive-personal-weight-data.html">档案</a>
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html" class="active">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
</nav>
|
||||
<div class="top-bar__right">
|
||||
<a class="btn-back" href="../../index.html"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 3L5 8l5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg> 返回首页</a>
|
||||
<div class="avatar">管</div>
|
||||
<span style="color:rgba(255,255,255,0.65);">系统管理员 ▾</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 侧边栏 -->
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-menu__title">个人体重管理</div>
|
||||
<a href="personal-target-data.html" class="sidebar-item active">个人目标数据</a>
|
||||
</aside>
|
||||
|
||||
<!-- 主内容 -->
|
||||
<main class="main">
|
||||
|
||||
<!-- 页面标题 -->
|
||||
<a class="back-link" href="personal-target-data.html">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 3L5 8l5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
返回列表
|
||||
</a>
|
||||
<div class="page-header">
|
||||
<div class="page-header__breadcrumb">体重管理 / 个人体重管理 / <a href="personal-target-data.html">个人目标数据</a> / <span id="pageTitle">-</span></div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 顶部三列信息卡片:左=个人信息 | 中=目标信息+计划选择 | 右=累计记录天数 -->
|
||||
<div class="overview-card">
|
||||
<!-- 左列:个人信息 -->
|
||||
<div class="overview-card__col overview-card__col--left">
|
||||
<div class="overview-card__title">个人信息</div>
|
||||
<div class="overview-card__name" id="empName">-</div>
|
||||
<div class="overview-card__info-list">
|
||||
<div class="overview-card__info-row"><span class="overview-card__info-label">员工编号</span><span class="overview-card__info-value" id="empCode">-</span></div>
|
||||
<div class="overview-card__info-row"><span class="overview-card__info-label">性别</span><span class="overview-card__info-value" id="empGender">-</span></div>
|
||||
<div class="overview-card__info-row"><span class="overview-card__info-label">年龄</span><span class="overview-card__info-value" id="empAge">-</span></div>
|
||||
<div class="overview-card__info-row"><span class="overview-card__info-label">单位</span><span class="overview-card__info-value" id="empOrg">-</span></div>
|
||||
<div class="overview-card__info-row"><span class="overview-card__info-label">部门</span><span class="overview-card__info-value" id="empDept">-</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 中列:个人目标信息 + 干预计划下拉 -->
|
||||
<div class="overview-card__col overview-card__col--mid" id="midCol">
|
||||
<div class="overview-card__title">个人目标信息</div>
|
||||
<!-- [交互] 未设置目标时显示缺省提示 -->
|
||||
<div id="targetEmpty" style="display:none;flex:1;justify-content:center;align-items:center;color:var(--text-placeholder);font-size:var(--font-sm);">
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" style="opacity:0.3;"><circle cx="24" cy="24" r="20" stroke="#999" stroke-width="2" stroke-dasharray="4 3"/><path d="M24 14v12M24 30v1" stroke="#999" stroke-width="2" stroke-linecap="round"/></svg>
|
||||
<span style="margin-left:12px;">未设置个人目标</span>
|
||||
</div>
|
||||
<div id="targetContent">
|
||||
<!-- [交互] 个人目标下拉选择 + 右侧日期/状态 -->
|
||||
<div class="overview-card__plan-select">
|
||||
<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 class="overview-card__plan-info" id="planDateInfo" style="display:none;">
|
||||
<span id="piDateRange">-</span>
|
||||
<span id="piDays">-</span>
|
||||
<span class="plan-status" id="piStatus">-</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overview-card__metrics-row">
|
||||
<div class="overview-card__metrics-col">
|
||||
<div class="overview-card__metrics-title">初始指标</div>
|
||||
<div class="overview-card__metrics-line">
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="initWeight">-</span><span class="overview-card__metric-label">体重</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="initBmi">-</span><span class="overview-card__metric-label">BMI</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="initFat">-</span><span class="overview-card__metric-label">体脂率</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="initWaist">-</span><span class="overview-card__metric-label">腰围</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overview-card__metrics-col">
|
||||
<div class="overview-card__metrics-title">目标指标</div>
|
||||
<div class="overview-card__metrics-line">
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="tgWeight">-</span><span class="overview-card__metric-label">体重</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="tgBmi">-</span><span class="overview-card__metric-label">BMI</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="tgFat">-</span><span class="overview-card__metric-label">体脂率</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="tgWaist">-</span><span class="overview-card__metric-label">腰围</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overview-card__metrics-col">
|
||||
<div class="overview-card__metrics-title">最新指标</div>
|
||||
<div class="overview-card__metrics-line">
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="curWeight">-</span><span class="overview-card__metric-label">体重</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="curBmi">-</span><span class="overview-card__metric-label">BMI</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="curFat">-</span><span class="overview-card__metric-label">体脂率</span></div>
|
||||
<div class="overview-card__metric"><span class="overview-card__metric-val" id="curWaist">-</span><span class="overview-card__metric-label">腰围</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /targetContent -->
|
||||
</div>
|
||||
<!-- 右列:累计记录天数 -->
|
||||
<div class="overview-card__col overview-card__col--right">
|
||||
<div class="overview-card__title">累计记录天数</div>
|
||||
<div class="overview-card__stat-list">
|
||||
<div class="overview-card__stat-item">
|
||||
<div class="overview-card__stat-icon overview-card__stat-icon--diet">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"><rect x="3" y="2" width="18" height="20" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M3 8h18" stroke="currentColor" stroke-width="1.5"/><path d="M8 12h2M14 12h2M8 16h2M14 16h2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="overview-card__stat-body">
|
||||
<span class="overview-card__stat-val" id="dietDays">0</span>
|
||||
<span class="overview-card__stat-label">饮食记录天数</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overview-card__stat-item">
|
||||
<div class="overview-card__stat-icon overview-card__stat-icon--exercise">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.5"/><path d="M8 12h8M12 8v8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="overview-card__stat-body">
|
||||
<span class="overview-card__stat-val" id="exerciseDays">0</span>
|
||||
<span class="overview-card__stat-label">运动记录天数</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overview-card__stat-item">
|
||||
<div class="overview-card__stat-icon overview-card__stat-icon--weight">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"><rect x="4" y="2" width="16" height="20" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M8 8h4M8 12h4M8 16h8" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
<div class="overview-card__stat-body">
|
||||
<span class="overview-card__stat-val" id="weightDays">0</span>
|
||||
<span class="overview-card__stat-label">体重记录天数</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 筛选栏 — 日期范围(默认当日)、查询/重置 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item">
|
||||
<label>日期范围</label>
|
||||
<input class="filter-input" type="date" id="filterDateFrom" onchange="applyFilter()">
|
||||
<span class="filter-divider">~</span>
|
||||
<input class="filter-input" type="date" id="filterDateTo" onchange="applyFilter()">
|
||||
</div>
|
||||
<!-- [交互] 点击查询按钮筛选列表 -->
|
||||
<button class="btn btn-primary" onclick="applyFilter()">查询</button>
|
||||
<button class="btn btn-default" onclick="resetFilter()">重置</button>
|
||||
</div>
|
||||
|
||||
<!-- [交互] 操作按钮区 -->
|
||||
<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="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>日期</th>
|
||||
<th>饮食记录(千卡)</th>
|
||||
<th>运动记录(千卡)</th>
|
||||
<th>体重(kg)</th>
|
||||
<th>BMI</th>
|
||||
<th>体脂率(%)</th>
|
||||
<th>腰围(cm)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<span id="pageInfo">显示 0 条记录</span>
|
||||
<button class="page-btn" onclick="goPage(-1)">‹</button>
|
||||
<span id="pageNum" style="font-size:var(--font-sm);color:var(--text-secondary);">第 1 页</span>
|
||||
<button class="page-btn" onclick="goPage(1)">›</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Toast -->
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
/* ===== URL参数解析 ===== */
|
||||
function getParam(name){
|
||||
var params = new URLSearchParams(location.search);
|
||||
return params.get(name);
|
||||
}
|
||||
|
||||
/* ===== 个人目标数据(员工自己创建的目标标题) ===== */
|
||||
var targets = [
|
||||
{id:1,title:'减重10kg计划',targetWeight:75,targetBmi:24.5,targetFat:20.0,targetWaist:85,dateFrom:'2026-03-01',dateTo:'2026-09-01'},
|
||||
{id:2,title:'体脂率控制目标',targetWeight:78,targetBmi:25.5,targetFat:18.0,targetWaist:88,dateFrom:'2026-04-15',dateTo:'2026-10-15'},
|
||||
{id:3,title:'腰围缩减方案',targetWeight:80,targetBmi:26.1,targetFat:22.0,targetWaist:82,dateFrom:'2026-05-01',dateTo:'2026-11-01'}
|
||||
];
|
||||
|
||||
/* ===== 员工数据 ===== */
|
||||
var allEmployees = [
|
||||
{name:'张伟',empId:'EMP-10001',gender:'男',age:35,org:'采油一厂',dept:'生产运行科',height:175,weight:85.0,bmi:27.8,fat:26.5,waist:96,targetIds:[1,2]},
|
||||
{name:'李娜',empId:'EMP-10002',gender:'女',age:28,org:'采油一厂',dept:'安全环保科',height:163,weight:68.5,bmi:25.8,fat:32.0,waist:82,targetIds:[1,3]},
|
||||
{name:'王强',empId:'EMP-10003',gender:'男',age:42,org:'采油二厂',dept:'综合管理科',height:170,weight:92.0,bmi:31.8,fat:30.2,waist:105,targetIds:[2]},
|
||||
{name:'赵敏',empId:'EMP-10004',gender:'女',age:31,org:'采油二厂',dept:'生产运行科',height:160,weight:62.0,bmi:24.2,fat:28.5,waist:78,targetIds:[2,3]},
|
||||
{name:'刘洋',empId:'EMP-10005',gender:'男',age:38,org:'采气厂',dept:'安全环保科',height:178,weight:88.5,bmi:27.9,fat:27.8,waist:100,targetIds:[3]},
|
||||
{name:'孙磊',empId:'EMP-10101',gender:'男',age:29,org:'采油一厂',dept:'生产运行科',height:172,weight:78.0,bmi:26.4,fat:24.5,waist:92,targetIds:[]},
|
||||
{name:'周婷',empId:'EMP-10102',gender:'女',age:33,org:'采油二厂',dept:'安全环保科',height:158,weight:65.2,bmi:26.1,fat:31.0,waist:80,targetIds:[]},
|
||||
{name:'吴刚',empId:'EMP-10103',gender:'男',age:45,org:'采气厂',dept:'综合管理科',height:168,weight:90.5,bmi:32.1,fat:33.5,waist:108,targetIds:[]},
|
||||
{name:'陈静',empId:'EMP-10104',gender:'女',age:26,org:'采油一厂',dept:'综合管理科',height:165,weight:58.0,bmi:21.3,fat:25.0,waist:72,targetIds:[]},
|
||||
{name:'郑飞',empId:'EMP-10105',gender:'男',age:40,org:'采油二厂',dept:'生产运行科',height:175,weight:86.2,bmi:28.1,fat:28.5,waist:98,targetIds:[]}
|
||||
];
|
||||
|
||||
var selectedPlanId = null;
|
||||
var currentEmployee = null;
|
||||
var dailyData = [];
|
||||
var filteredData = [];
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
|
||||
/* ===== 生成每日明细Mock数据 ===== */
|
||||
function buildDailyData(emp, target){
|
||||
var data = [];
|
||||
var today = new Date();
|
||||
var dateFrom, dateTo, end, totalDays;
|
||||
if(target){
|
||||
dateFrom = new Date(target.dateFrom);
|
||||
dateTo = new Date(target.dateTo);
|
||||
} else {
|
||||
// 未设置目标:模拟最近90天
|
||||
dateFrom = new Date(today);
|
||||
dateFrom.setDate(dateFrom.getDate() - 89);
|
||||
dateTo = today;
|
||||
}
|
||||
end = dateTo < today ? dateTo : today;
|
||||
totalDays = Math.ceil((end - dateFrom) / (1000*60*60*24)) + 1;
|
||||
if(totalDays < 1) totalDays = 1;
|
||||
|
||||
// 无目标时用初始值附近小波动
|
||||
var baseWeight = emp.weight;
|
||||
var baseBmi = emp.bmi;
|
||||
var baseWaist = emp.waist;
|
||||
var baseFat = emp.fat;
|
||||
var weightDiff = target ? (emp.weight - target.targetWeight) : 0;
|
||||
var bmiDiff = target ? +(emp.bmi - target.targetBmi).toFixed(1) : 0;
|
||||
var waistDiff = target ? (emp.waist - target.targetWaist) : 0;
|
||||
var fatDiff = target ? +(emp.fat - target.targetFat).toFixed(1) : 0;
|
||||
|
||||
for(var d = 0; d < totalDays; d++){
|
||||
var curDate = new Date(dateFrom);
|
||||
curDate.setDate(curDate.getDate() + d);
|
||||
var dateStr = curDate.getFullYear()+'-'+('0'+(curDate.getMonth()+1)).slice(-2)+'-'+('0'+curDate.getDate()).slice(-2);
|
||||
|
||||
var progress = d / Math.max(totalDays - 1, 1);
|
||||
var curWeight = +(emp.weight - weightDiff * progress + (Math.random() - 0.5) * 0.6).toFixed(1);
|
||||
var curBmi = +(curWeight / ((emp.height/100) * (emp.height/100))).toFixed(1);
|
||||
var curWaist = Math.round(emp.waist - waistDiff * progress + (Math.random() - 0.5) * 1.5);
|
||||
var curFat = +(emp.fat - fatDiff * progress + (Math.random() - 0.5) * 0.5).toFixed(1);
|
||||
|
||||
// 饮食记录(千卡)
|
||||
var dietKcal = Math.floor(Math.random() * 800) + 1200;
|
||||
// 运动记录(千卡)
|
||||
var exerciseKcal = Math.floor(Math.random() * 500) + 200;
|
||||
|
||||
data.push({
|
||||
date: dateStr,
|
||||
dietKcal: dietKcal,
|
||||
exerciseKcal: exerciseKcal,
|
||||
weight: curWeight,
|
||||
bmi: curBmi,
|
||||
fat: curFat,
|
||||
waist: curWaist
|
||||
});
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/* ===== 计算行动累计 ===== */
|
||||
function updateSummaryCards(){
|
||||
if(!dailyData.length){
|
||||
document.getElementById('dietDays').textContent = '0';
|
||||
document.getElementById('exerciseDays').textContent = '0';
|
||||
document.getElementById('weightDays').textContent = '0';
|
||||
return;
|
||||
}
|
||||
var currentFiltered = getFilteredData();
|
||||
var dietCount = 0, exerciseCount = 0, weightCount = 0;
|
||||
currentFiltered.forEach(function(d){
|
||||
if(d.dietKcal > 0) dietCount++;
|
||||
if(d.exerciseKcal > 0) exerciseCount++;
|
||||
if(d.weight > 0) weightCount++;
|
||||
});
|
||||
document.getElementById('dietDays').textContent = dietCount;
|
||||
document.getElementById('exerciseDays').textContent = exerciseCount;
|
||||
document.getElementById('weightDays').textContent = weightCount;
|
||||
}
|
||||
|
||||
/* ===== 渲染员工信息卡片 ===== */
|
||||
function renderEmployeeCard(){
|
||||
if(!currentEmployee) return;
|
||||
document.getElementById('empName').textContent = currentEmployee.name;
|
||||
document.getElementById('empCode').textContent = currentEmployee.empId;
|
||||
document.getElementById('empGender').textContent = currentEmployee.gender;
|
||||
document.getElementById('empAge').textContent = currentEmployee.age + ' 岁';
|
||||
document.getElementById('empOrg').textContent = currentEmployee.org;
|
||||
document.getElementById('empDept').textContent = currentEmployee.dept;
|
||||
document.getElementById('pageTitle').textContent = currentEmployee.name + ' 的每日记录';
|
||||
}
|
||||
|
||||
/* ===== 计划搜索选择 ===== */
|
||||
function searchPlan(){
|
||||
var keyword = document.getElementById('planSearchInput').value.trim().toLowerCase();
|
||||
var panel = document.getElementById('planPanel');
|
||||
var filtered = targets;
|
||||
if(keyword){
|
||||
filtered = targets.filter(function(t){
|
||||
return t.title.toLowerCase().indexOf(keyword) > -1;
|
||||
});
|
||||
}
|
||||
if(filtered.length === 0){
|
||||
panel.innerHTML = '<div style="padding:20px;text-align:center;color:var(--text-placeholder);font-size:var(--font-sm);">无匹配目标</div>';
|
||||
} else {
|
||||
var html = '';
|
||||
filtered.forEach(function(t){
|
||||
var sel = selectedPlanId === t.id ? ' selected' : '';
|
||||
html += '<div class="search-select__option'+sel+'" onclick="selectPlan('+t.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(t.title)+'</div>';
|
||||
html += '<div class="ss-org">'+t.dateFrom+' ~ '+t.dateTo+' | 目标体重 '+t.targetWeight+'kg</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
panel.innerHTML = html;
|
||||
}
|
||||
}
|
||||
|
||||
function showPlanPanel(){
|
||||
searchPlan();
|
||||
document.getElementById('planPanel').classList.add('show');
|
||||
}
|
||||
|
||||
/* [交互] 选中个人目标 → 更新目标指标 */
|
||||
function selectPlan(targetId){
|
||||
selectedPlanId = targetId;
|
||||
var target = targets.find(function(t){return t.id === targetId;});
|
||||
if(!target) return;
|
||||
document.getElementById('planSearchInput').value = target.title;
|
||||
document.getElementById('planPanel').classList.remove('show');
|
||||
document.getElementById('planClearBtn').classList.add('show');
|
||||
document.getElementById('planSelect').classList.add('search-select--selected');
|
||||
|
||||
// 显示日期/状态信息
|
||||
document.getElementById('planDateInfo').style.display = 'flex';
|
||||
document.getElementById('piDateRange').textContent = target.dateFrom + ' ~ ' + target.dateTo;
|
||||
var today = new Date(); today.setHours(0,0,0,0);
|
||||
var from = new Date(target.dateFrom);
|
||||
var to = new Date(target.dateTo);
|
||||
var totalDays = Math.ceil((to - from) / (1000*60*60*24)) + 1;
|
||||
var isEnded = today > to;
|
||||
document.getElementById('piDays').textContent = '共' + totalDays + '天';
|
||||
var statusEl = document.getElementById('piStatus');
|
||||
if(isEnded){
|
||||
statusEl.textContent = '已结束';
|
||||
statusEl.className = 'plan-status plan-status--ended';
|
||||
} else {
|
||||
statusEl.textContent = '进行中';
|
||||
statusEl.className = 'plan-status plan-status--active';
|
||||
}
|
||||
|
||||
// 初始指标(来自员工档案)
|
||||
document.getElementById('initWeight').innerHTML = currentEmployee.weight + '<span class="unit">kg</span>';
|
||||
document.getElementById('initBmi').textContent = currentEmployee.bmi;
|
||||
document.getElementById('initFat').innerHTML = currentEmployee.fat + '<span class="unit">%</span>';
|
||||
document.getElementById('initWaist').innerHTML = currentEmployee.waist + '<span class="unit">cm</span>';
|
||||
// 目标指标
|
||||
document.getElementById('tgWeight').innerHTML = target.targetWeight + '<span class="unit">kg</span>';
|
||||
document.getElementById('tgBmi').textContent = target.targetBmi;
|
||||
document.getElementById('tgFat').innerHTML = target.targetFat + '<span class="unit">%</span>';
|
||||
document.getElementById('tgWaist').innerHTML = target.targetWaist + '<span class="unit">cm</span>';
|
||||
|
||||
// 重建数据
|
||||
dailyData = buildDailyData(currentEmployee, target);
|
||||
currentPage = 0;
|
||||
applyFilter();
|
||||
// 现指标取最新一条数据
|
||||
updateCurrentMetrics();
|
||||
}
|
||||
|
||||
/* [交互] 清空已选目标 */
|
||||
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('planDateInfo').style.display = 'none';
|
||||
document.getElementById('initWeight').textContent = '-';
|
||||
document.getElementById('initBmi').textContent = '-';
|
||||
document.getElementById('initFat').textContent = '-';
|
||||
document.getElementById('initWaist').textContent = '-';
|
||||
document.getElementById('tgWeight').textContent = '-';
|
||||
document.getElementById('tgBmi').textContent = '-';
|
||||
document.getElementById('tgFat').textContent = '-';
|
||||
document.getElementById('tgWaist').textContent = '-';
|
||||
document.getElementById('curWeight').textContent = '-';
|
||||
document.getElementById('curBmi').textContent = '-';
|
||||
document.getElementById('curFat').textContent = '-';
|
||||
document.getElementById('curWaist').textContent = '-';
|
||||
dailyData = [];
|
||||
currentPage = 0;
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
/* ===== 更新现指标(取最新一条数据) ===== */
|
||||
function updateCurrentMetrics(){
|
||||
if(!dailyData.length) return;
|
||||
var latest = dailyData[dailyData.length - 1];
|
||||
document.getElementById('curWeight').innerHTML = latest.weight + '<span class="unit">kg</span>';
|
||||
document.getElementById('curBmi').textContent = latest.bmi;
|
||||
document.getElementById('curFat').innerHTML = latest.fat + '<span class="unit">%</span>';
|
||||
document.getElementById('curWaist').innerHTML = latest.waist + '<span class="unit">cm</span>';
|
||||
}
|
||||
|
||||
/* ===== 筛选 ===== */
|
||||
function getFilteredData(){
|
||||
var dateFrom = document.getElementById('filterDateFrom').value;
|
||||
var dateTo = document.getElementById('filterDateTo').value;
|
||||
return dailyData.filter(function(d){
|
||||
if(dateFrom && d.date < dateFrom) return false;
|
||||
if(dateTo && d.date > dateTo) return false;
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
function applyFilter(){
|
||||
filteredData = getFilteredData();
|
||||
currentPage = 0;
|
||||
renderTable();
|
||||
updateSummaryCards();
|
||||
}
|
||||
|
||||
function resetFilter(){
|
||||
var today = formatDate(new Date());
|
||||
document.getElementById('filterDateFrom').value = '';
|
||||
document.getElementById('filterDateTo').value = '';
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
/* ===== 渲染表格 ===== */
|
||||
function renderTable(){
|
||||
var tbody = document.getElementById('tableBody');
|
||||
var start = currentPage * pageSize;
|
||||
var pageData = filteredData.slice(start, start + pageSize);
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize) || 1;
|
||||
document.getElementById('pageInfo').textContent = '显示 ' + pageData.length + ' 条,共 ' + filteredData.length + ' 条记录';
|
||||
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
|
||||
|
||||
if(filteredData.length === 0){
|
||||
tbody.innerHTML = '<tr><td colspan="7" class="td-empty">暂无匹配数据,请选择干预计划后查看</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
var html = '';
|
||||
pageData.forEach(function(d){
|
||||
html += '<tr>';
|
||||
html += '<td>'+esc(d.date)+'</td>';
|
||||
html += '<td>'+d.dietKcal+'</td>';
|
||||
html += '<td>'+d.exerciseKcal+'</td>';
|
||||
html += '<td>'+d.weight+'</td>';
|
||||
html += '<td>'+d.bmi+'</td>';
|
||||
html += '<td>'+d.fat+'</td>';
|
||||
html += '<td>'+d.waist+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
|
||||
/* ===== 翻页 ===== */
|
||||
function goPage(delta){
|
||||
var totalPages = Math.ceil(filteredData.length / pageSize);
|
||||
var newPage = currentPage + delta;
|
||||
if(newPage < 0 || newPage >= totalPages) return;
|
||||
currentPage = newPage;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
/* ===== 工具函数 ===== */
|
||||
function formatDate(d){
|
||||
var y = d.getFullYear();
|
||||
var m = (d.getMonth() + 1);
|
||||
var day = d.getDate();
|
||||
return y + '-' + (m < 10 ? '0' + m : m) + '-' + (day < 10 ? '0' + day : day);
|
||||
}
|
||||
|
||||
function esc(s){return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');}
|
||||
|
||||
function showToast(msg){
|
||||
var t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');
|
||||
setTimeout(function(){t.classList.remove('show');},1500);
|
||||
}
|
||||
|
||||
/* 点击外部关闭下拉 */
|
||||
document.addEventListener('click',function(e){
|
||||
if(!e.target.closest('#planSelect')){
|
||||
document.getElementById('planPanel').classList.remove('show');
|
||||
}
|
||||
});
|
||||
|
||||
/* ===== 初始化 ===== */
|
||||
(function init(){
|
||||
var empId = getParam('empId');
|
||||
var targetId = getParam('targetId');
|
||||
var tab = getParam('tab');
|
||||
|
||||
// 未设置目标:显示缺省样式,隐藏目标内容区
|
||||
if(tab === 'noTarget'){
|
||||
document.getElementById('targetContent').style.display = 'none';
|
||||
var emptyEl = document.getElementById('targetEmpty');
|
||||
emptyEl.style.display = 'flex';
|
||||
}
|
||||
|
||||
// 查找员工
|
||||
currentEmployee = allEmployees.find(function(e){return e.empId === empId;}) || allEmployees[0];
|
||||
|
||||
// 渲染员工信息
|
||||
renderEmployeeCard();
|
||||
|
||||
// 预填充下拉数据
|
||||
var html = '';
|
||||
targets.forEach(function(t){
|
||||
html += '<div class="search-select__option" onclick="selectPlan('+t.id+')">';
|
||||
html += '<div style="font-weight:500;">'+esc(t.title)+'</div>';
|
||||
html += '<div class="ss-org">'+t.dateFrom+' ~ '+t.dateTo+' | 目标体重 '+t.targetWeight+'kg</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
document.getElementById('planPanel').innerHTML = html;
|
||||
|
||||
// 默认选中员工第一个目标(未设置目标时生成无目标数据)
|
||||
if(tab === 'noTarget'){
|
||||
dailyData = buildDailyData(currentEmployee, null);
|
||||
applyFilter();
|
||||
} else {
|
||||
var defaultTargetId = targetId ? parseInt(targetId) : (currentEmployee.targetIds && currentEmployee.targetIds.length ? currentEmployee.targetIds[0] : targets[0].id);
|
||||
if(defaultTargetId){
|
||||
selectPlan(defaultTargetId);
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化日期范围为全部(不设默认值)
|
||||
renderTable();
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -184,6 +184,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
|
||||
<a href="plan-list.html" class="active">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -160,6 +160,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<a href="plan-list.html" class="active">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -205,6 +205,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html" class="active">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
@@ -521,7 +522,7 @@ tbody tr:hover td:nth-child(3){background:#F8FBFF;}
|
||||
<div class="promise-overlay" id="promiseOverlay">
|
||||
<div class="promise-dialog">
|
||||
<div class="promise-dialog__header">
|
||||
<span class="promise-dialog__title">我的承诺</span>
|
||||
<span class="promise-dialog__title" id="promiseTitle">我的承诺</span>
|
||||
<button class="promise-dialog__close" onclick="closePromise()">✕</button>
|
||||
</div>
|
||||
<div class="promise-dialog__body">
|
||||
@@ -989,6 +990,7 @@ function showToast(msg){
|
||||
|
||||
/* ===== 承诺书弹窗 ===== */
|
||||
function openPromise(name, signTime){
|
||||
document.getElementById('promiseTitle').textContent = name + '的承诺';
|
||||
document.getElementById('promiseName').textContent = name;
|
||||
// 从签署时间提取日期部分
|
||||
var dateStr = signTime ? signTime.split(' ')[0] : '';
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html" class="active">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
@@ -240,6 +240,7 @@ tbody tr:hover .td-actions{background:#F8FBFF;}
|
||||
<a href="plan-list.html">计划管理</a>
|
||||
<a href="registration-tracking.html" class="active">报名管理</a>
|
||||
<a href="action-record.html">过程管理</a>
|
||||
<a href="history-plan-list.html">历史干预</a>
|
||||
<a href="personal-target-data.html">个人体重管理</a>
|
||||
<a href="scale-device.html">设备管理</a>
|
||||
<a href="exception-system-dirty.html">异常事件</a>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user