feat: 体重管理原型更新(管理端行动总览页面调整及PRD、截图同步)
@@ -240,6 +240,10 @@ tbody tr:hover td:nth-child(2){background:#F8FBFF;}
|
||||
<th>消耗<br>(千卡)</th>
|
||||
<th>吃动热量差<br>(千卡)</th>
|
||||
<th>当日减重<br>排名</th>
|
||||
<th>减重量<br>排名</th>
|
||||
<th>减重率<br>排名</th>
|
||||
<th>综合分<br>排名</th>
|
||||
<th>行动分<br>排名</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBody"></tbody>
|
||||
@@ -328,6 +332,8 @@ function getParam(name){
|
||||
/* ===== 生成每日明细Mock数据 ===== */
|
||||
function buildDetailData(emp){
|
||||
var data = [];
|
||||
// 活动内累计排名(跨日期循环使用)
|
||||
var cumWeightLossRank = 0, cumWeightLossRateRank = 0, cumCompositeRank = 0, cumActionRank = 0;
|
||||
// 使用活动起止日期生成每日数据
|
||||
var dateFrom = new Date(plan.dateFrom);
|
||||
var dateTo = new Date(plan.dateTo);
|
||||
@@ -383,6 +389,20 @@ function buildDetailData(emp){
|
||||
// 当日减重排名(1-20之间随机)
|
||||
var rank = Math.floor(Math.random() * 20) + 1;
|
||||
|
||||
// 活动内累计排名(减重量/减重率/综合分/行动分):初始随机,逐日小幅波动模拟名次变化
|
||||
if(d === 0){
|
||||
cumWeightLossRank = Math.floor(Math.random() * 20) + 1;
|
||||
cumWeightLossRateRank = Math.floor(Math.random() * 20) + 1;
|
||||
cumCompositeRank = Math.floor(Math.random() * 20) + 1;
|
||||
cumActionRank = Math.floor(Math.random() * 20) + 1;
|
||||
} else {
|
||||
function drift(v){ return Math.min(20, Math.max(1, v + (Math.random() < 0.5 ? -1 : 1) * (Math.random() < 0.7 ? 1 : 0))); }
|
||||
cumWeightLossRank = drift(cumWeightLossRank);
|
||||
cumWeightLossRateRank = drift(cumWeightLossRateRank);
|
||||
cumCompositeRank = drift(cumCompositeRank);
|
||||
cumActionRank = drift(cumActionRank);
|
||||
}
|
||||
|
||||
// 体重记录(最新测量值,带轻微波动)
|
||||
var latestWeight = +(curWeight + (Math.random() - 0.3) * 0.5).toFixed(1);
|
||||
var latestFat = +(curFat + (Math.random() - 0.5) * 0.4).toFixed(1);
|
||||
@@ -399,6 +419,8 @@ function buildDetailData(emp){
|
||||
basalMetab: basalMetab, stepBurn: stepBurn, otherBurn: otherBurn,
|
||||
totalIntake: totalIntake, totalBurn: totalBurn,
|
||||
balance: balance, rank: rank,
|
||||
weightLossRank: cumWeightLossRank, weightLossRateRank: cumWeightLossRateRank,
|
||||
compositeRank: cumCompositeRank, actionRank: cumActionRank,
|
||||
latestWeight: latestWeight, latestFat: latestFat, latestWaist: latestWaist
|
||||
});
|
||||
}
|
||||
@@ -623,7 +645,7 @@ function renderTable(){
|
||||
document.getElementById('pageNum').textContent = '第 ' + (currentPage + 1) + '/' + totalPages + ' 页';
|
||||
|
||||
if(filtered.length === 0){
|
||||
tbody.innerHTML = '<tr><td colspan="15" class="td-empty">暂无匹配的每日明细数据</td></tr>';
|
||||
tbody.innerHTML = '<tr><td colspan="19" class="td-empty">暂无匹配的每日明细数据</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -648,6 +670,13 @@ function renderTable(){
|
||||
else if(d.rank === 2) rankHtml = '<span class="rank-num rank-2">2</span>';
|
||||
else if(d.rank === 3) rankHtml = '<span class="rank-num rank-3">3</span>';
|
||||
else rankHtml = '<span class="rank-other">'+d.rank+'</span>';
|
||||
// 活动内累计排名样式(前三名同样高亮)
|
||||
function cumRankHtml(v){
|
||||
if(v === 1) return '<span class="rank-num rank-1">1</span>';
|
||||
if(v === 2) return '<span class="rank-num rank-2">2</span>';
|
||||
if(v === 3) return '<span class="rank-num rank-3">3</span>';
|
||||
return '<span class="rank-other">'+v+'</span>';
|
||||
}
|
||||
|
||||
html += '<tr>';
|
||||
html += '<td>'+(i+1)+'</td>';
|
||||
@@ -669,6 +698,11 @@ function renderTable(){
|
||||
html += '<td class="'+balCls+'">'+balSign+d.balance+'</td>';
|
||||
// 当日减重排名
|
||||
html += '<td>'+rankHtml+'</td>';
|
||||
// 活动内累计排名:减重量/减重率/综合分/行动分
|
||||
html += '<td>'+cumRankHtml(d.weightLossRank)+'</td>';
|
||||
html += '<td>'+cumRankHtml(d.weightLossRateRank)+'</td>';
|
||||
html += '<td>'+cumRankHtml(d.compositeRank)+'</td>';
|
||||
html += '<td>'+cumRankHtml(d.actionRank)+'</td>';
|
||||
html += '</tr>';
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
|
||||
@@ -101,6 +101,13 @@ thead th{background:#FAFAFA;padding:8px 6px;text-align:center;font-size:var(--fo
|
||||
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);}
|
||||
|
||||
/* 排名可排序列 */
|
||||
.th-sortable{cursor:pointer;user-select:none;position:relative;padding-right:18px !important;}
|
||||
.th-sortable:hover{color:var(--primary);}
|
||||
.th-sortable .sort-icon{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;line-height:1;font-size:9px;color:var(--text-placeholder);}
|
||||
.th-sortable .sort-icon span{line-height:1;}
|
||||
.th-sortable.asc .sort-icon .sort-up,.th-sortable.desc .sort-icon .sort-down{color:var(--primary);}
|
||||
|
||||
tbody td{padding:10px 6px;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;}
|
||||
@@ -282,8 +289,11 @@ 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 class="th-sortable" rowspan="2" onclick="toggleSort('weightLossRank')">减重量<br>排名<span class="sort-icon"><span class="sort-up">▲</span><span class="sort-down">▼</span></span></th>
|
||||
<th class="th-sortable" rowspan="2" onclick="toggleSort('weightLossRateRank')">减重率<br>排名<span class="sort-icon"><span class="sort-up">▲</span><span class="sort-down">▼</span></span></th>
|
||||
<th class="th-sortable" rowspan="2" onclick="toggleSort('compositeRank')">综合分<br>排名<span class="sort-icon"><span class="sort-up">▲</span><span class="sort-down">▼</span></span></th>
|
||||
<th class="th-sortable" rowspan="2" onclick="toggleSort('actionRank')">行动分<br>排名<span class="sort-icon"><span class="sort-up">▲</span><span class="sort-down">▼</span></span></th>
|
||||
<th rowspan="2">赛况明细</th>
|
||||
</tr>
|
||||
<!-- [交互] 表头第二行:饮食总览和运动总览的子列 -->
|
||||
@@ -436,16 +446,45 @@ var selectedPlanId = null;
|
||||
});
|
||||
Object.keys(planGroups).forEach(function(pid){
|
||||
var group = planGroups[pid];
|
||||
group.forEach(function(d){
|
||||
// 综合得分:减重量与减重率加权;行动得分:饮食/运动打卡完整度与日均步数
|
||||
d.compositeScore = Math.round(d.weightLoss * 10 + d.weightLossRate * 2);
|
||||
d.actionScore = Math.max(0, 100 - d.dietMissDays * 3 - d.exMissDays * 3 + Math.round(d.exAvgSteps / 2000));
|
||||
});
|
||||
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;});
|
||||
group.sort(function(a,b){return b.compositeScore - a.compositeScore;});
|
||||
group.forEach(function(d,i){d.compositeRank = i + 1;});
|
||||
group.sort(function(a,b){return b.actionScore - a.actionScore;});
|
||||
group.forEach(function(d,i){d.actionRank = i + 1;});
|
||||
});
|
||||
})();
|
||||
var pageSize = 10;
|
||||
var currentPage = 0;
|
||||
var filteredData = overviewData.slice();
|
||||
|
||||
/* ===== 排名列排序(升序/降序/默认切换) ===== */
|
||||
var sortField = null;
|
||||
var sortAsc = false;
|
||||
function toggleSort(field){
|
||||
if(sortField !== field){ sortField = field; sortAsc = true; }
|
||||
else if(sortAsc){ sortAsc = false; }
|
||||
else { sortField = null; sortAsc = false; }
|
||||
document.querySelectorAll('.th-sortable').forEach(function(th){
|
||||
th.classList.remove('asc','desc');
|
||||
if(th.getAttribute('onclick') && th.getAttribute('onclick').indexOf(field) > -1 && sortField){
|
||||
th.classList.add(sortAsc ? 'asc' : 'desc');
|
||||
}
|
||||
});
|
||||
applyFilter();
|
||||
}
|
||||
function applySort(){
|
||||
if(!sortField) return;
|
||||
filteredData.sort(function(a,b){ return sortAsc ? a[sortField] - b[sortField] : b[sortField] - a[sortField]; });
|
||||
}
|
||||
|
||||
/* ===== 活动搜索选择 ===== */
|
||||
function searchPlan(){
|
||||
var keyword = document.getElementById('planSearchInput').value.trim().toLowerCase();
|
||||
@@ -557,6 +596,7 @@ function applyFilter(){
|
||||
if(empId && d.empId.toLowerCase().indexOf(empId) === -1) return false;
|
||||
return true;
|
||||
});
|
||||
applySort();
|
||||
currentPage = 0;
|
||||
renderTable();
|
||||
}
|
||||
@@ -584,7 +624,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="36" class="td-empty">暂无匹配数据,请选择干预活动后查看</td></tr>';
|
||||
tbody.innerHTML = '<tr><td colspan="38" class="td-empty">暂无匹配数据,请选择干预活动后查看</td></tr>';
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
@@ -636,6 +676,8 @@ function renderTable(){
|
||||
// 排名
|
||||
html += '<td>'+d.weightLossRank+'</td>';
|
||||
html += '<td>'+d.weightLossRateRank+'</td>';
|
||||
html += '<td>'+d.compositeRank+'</td>';
|
||||
html += '<td>'+d.actionRank+'</td>';
|
||||
// 赛况明细
|
||||
html += '<td><a class="link" href="javascript:void(0)" onclick="openMatchDetail(\''+esc(d.empId)+'\',\''+esc(d.name)+'\')">查看</a></td>';
|
||||
html += '</tr>';
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
├── 历史活动(侧边栏)
|
||||
│ └── 活动列表
|
||||
│ ├── 人员范围弹窗
|
||||
│ └── 活动详情(5个Tab:报名管理/每日行动/总览数据/活动排名/活动信息)
|
||||
│ └── 活动详情(5个Tab:报名管理/行动记录/总览数据/活动排名/活动信息)
|
||||
│ └── 人员详情(3个Tab:饮食记录/运动记录/体重记录)
|
||||
│
|
||||
├── 人员数据(侧边栏)
|
||||
@@ -456,7 +456,7 @@
|
||||
|
||||
**Tab切换:** 全部 / 未提交任务书 / 已提交待审核 / 已通过待签署 / 已签署(各Tab带数量角标)
|
||||
|
||||
**筛选条件:** 单位部门(二级联动面板)、活动名称(搜索下拉)、姓名(输入框)、员工编号(输入框)、体重(kg)(运算符+值输入,支持等于/大于/小于/大于等于/小于等于/范围)、BMI(运算符+值输入,同上)
|
||||
**筛选条件:** 单位部门(二级联动面板)、活动名称(搜索下拉)、姓名(输入框)、员工编号(输入框)
|
||||
|
||||
**各Tab表格列:**
|
||||
|
||||
@@ -479,7 +479,6 @@
|
||||
**交互说明:**
|
||||
- 未选择活动时,查看所有进行中活动被纳入参加范围的员工,选择活动后,查看该活动内被纳入的员工
|
||||
- Tab切换筛选不同状态的报名记录
|
||||
- 体重和BMI筛选支持自定义运算符(等于/大于/小于/大于等于/小于等于/范围),选择"范围"时展开第二个输入框
|
||||
- 承诺书弹窗展示完整的承诺书内容
|
||||
- 支持导出列表数据
|
||||
|
||||
@@ -493,7 +492,7 @@
|
||||
|
||||
**Tab切换:** 全部 / 待审核 / 已通过 / 已通过待签署 / 已驳回(各Tab带数量角标)
|
||||
|
||||
**筛选条件:** 单位部门(二级联动面板)、活动名称(搜索下拉)、姓名(输入框)、员工编号(输入框)、体重(kg)(运算符筛选)、BMI(运算符筛选)
|
||||
**筛选条件:** 单位部门(二级联动面板)、活动名称(搜索下拉)、姓名(输入框)、员工编号(输入框)
|
||||
|
||||
**各Tab表格列:**
|
||||
|
||||
@@ -576,7 +575,12 @@
|
||||
| 今日体重未记录员工 | 序号、活动名称、姓名、员工编号、性别、年龄、所属单位、所属部门 |
|
||||
| 今日体重已记录员工 | 同上 + 身高(cm)、体重(kg)、BMI、体脂(%)、腰围(cm)、最后记录时间、数据来源 |
|
||||
| 活动期间累计行动员工 | 3个子Tab(饮食/运动/体重)+ 表格列:序号、单位、部门、姓名、员工编号、性别、年龄、联系方式、身高(cm)、体重(kg)、BMI、累计记录天数 |
|
||||
| 单位活动人数/三测人数 | 序号、活动名称、姓名、员工编号、单位、部门、体重记录、饮食记录、运动记录、三测完成 |
|
||||
| 单位活动人数/三测人数 | 序号、活动名称、姓名、员工编号、单位、部门、体重记录、体脂记录、腰围记录、三测完成 |
|
||||
|
||||
**三测口径说明(单位详情弹窗):**
|
||||
- 三测 = 体重/体脂/腰围,均来自员工的体重测量记录
|
||||
- 体重/体脂/腰围中有任一项记录即视为"三测完成";三测完成列:是(绿色标签)/否(红色标签)
|
||||
- "三测人数"弹窗仅显示三测完成的员工,活动人数弹窗显示单位所有已参加活动的员工
|
||||
|
||||
**弹窗截图:**
|
||||
|
||||
@@ -680,15 +684,20 @@
|
||||
|
||||
**筛选条件:** 单位部门(二级联动面板)、活动名称(搜索下拉)、姓名(输入框)、员工编号(输入框)
|
||||
|
||||
**表格列(多级表头,36列):**
|
||||
**表格列(多级表头,38列):**
|
||||
- 第一级(rowspan=2):序号、活动名称、姓名、员工编号、性别、年龄、单位、部门、身高(cm)、初始体重(kg)、初始BMI、初始体脂(%)、初始腰围(cm)、目标体重(kg)、目标BMI、目标体脂(%)、目标腰围(cm)、现体重(kg)、现BMI、现体脂(%)、现腰围(cm)、体重变化(kg)、BMI变化、体脂变化(%)、腰围变化(cm)
|
||||
- 第一级(colspan=4):饮食总览
|
||||
- 第一级(colspan=4):运动总览
|
||||
- 第一级(rowspan=2):减重量排名、减重率排名、赛况明细
|
||||
- 第一级(rowspan=2,可排序):减重量排名、减重率排名、综合分排名、行动分排名
|
||||
- 第一级(rowspan=2):赛况明细
|
||||
- 饮食总览子列:缺天、缺餐、日均摄入(千卡)、累计摄入(千卡)
|
||||
- 运动总览子列:缺天、日均步数、日均消耗(千卡)、累计消耗(千卡)
|
||||
- 活动名称/姓名/员工编号列左侧固定,赛况明细列右侧固定
|
||||
|
||||
**业务规则:**
|
||||
- 排名按活动内计算:综合得分 = 减重量×10 + 减重率×2 加权,行动得分 = 饮食/运动打卡完整度与日均步数折算
|
||||
- 4个排名列均支持点击表头排序(升序/降序/默认三态切换),与体重排名页一致
|
||||
|
||||
**交互说明:**
|
||||
- 操作列点击"赛况明细"跳转到赛况明细页(action-overview-detail.html)
|
||||
- 支持导出列表数据、查看导出任务
|
||||
@@ -707,9 +716,10 @@
|
||||
- 员工信息卡片:姓名、员工编号、性别、年龄、单位、部门、身高
|
||||
- 日期筛选Tab:全部 / 选时(范围选择)/ 日 / 周 / 月 / 季 / 年
|
||||
|
||||
**表格列(单行表头,15列):**
|
||||
- 序号、日期、身高(cm)、体重(kg)、BMI、体脂(%)、腰围(cm)、体重变化(kg)、BMI变化、体脂变化(%)、腰围变化(cm)、摄入(千卡)、消耗(千卡)、吃动热量差(千卡)、当日减重排名
|
||||
**表格列(单行表头,19列):**
|
||||
- 序号、日期、身高(cm)、体重(kg)、BMI、体脂(%)、腰围(cm)、体重变化(kg)、BMI变化、体脂变化(%)、腰围变化(cm)、摄入(千卡)、消耗(千卡)、吃动热量差(千卡)、当日减重排名、减重量排名、减重率排名、综合分排名、行动分排名
|
||||
- 日期列左侧固定
|
||||
- 排名列样式:前三名高亮显示(金银铜牌样式),减重量/减重率/综合分/行动分排名为活动内累计排名
|
||||
|
||||
**交互说明:**
|
||||
- 面包屑导航支持返回活动总览
|
||||
@@ -803,7 +813,7 @@
|
||||
**页面布局:**
|
||||
- 面包屑导航:体重管理 / 历史活动 / **活动名称**
|
||||
- 活动概览卡片:16项指标网格(应参加人数、实际参加人数、未参加人数、完成体重目标人数、完成体脂目标人数、完成腰围目标人数、人均减重(kg)、人均减重率(%)、人均BMI降低、人均体脂降低(%)、人均腰围减少(cm)、人均每日摄入热量(kcal)、人均每日消耗热量(kcal)、人均每日能量缺口、人均综合得分、人均行动得分)
|
||||
- 5个主Tab:报名管理 / 每日行动 / 总览数据 / 活动排名 / 活动信息
|
||||
- 5个主Tab:报名管理 / 行动记录 / 总览数据 / 活动排名 / 活动信息
|
||||
|
||||
**Tab 0 — 报名管理:**
|
||||
- 状态分段Tab:全部 / 未提交任务书 / 已提交待审核 / 已通过待签署 / 已签署(带数量角标)
|
||||
@@ -813,12 +823,12 @@
|
||||
- 状态 ≥ 已通过 增加:审核时间
|
||||
- 状态 = 已签署 增加:签署时间、承诺书
|
||||
|
||||
**Tab 1 — 每日行动:**
|
||||
- 子分段Tab:每日记录 / 三测记录
|
||||
- 每日记录筛选:日期范围、单位部门、姓名、员工编号
|
||||
- 每日记录表格(28列):序号、姓名、员工编号、性别、年龄、单位、部门、身高(cm)、初始体重(kg)、初始BMI、初始体脂(%)、初始腰围(cm)、目标体重(kg)、目标BMI、目标体脂(%)、目标腰围(cm)、现体重(kg)、现BMI、现体脂(%)、现腰围(cm)、体重变化(kg)、BMI变化、体脂变化(%)、腰围变化(cm)、日期、饮食记录、运动记录、体重记录
|
||||
- 三测记录子Tab:体重/饮食/运动 + 全部/已记录/未记录筛选
|
||||
- 三测记录表格:序号、姓名、员工编号、性别、年龄、单位、部门、首次记录日期、末次记录日期
|
||||
**Tab 1 — 行动记录:**
|
||||
- 筛选:日期范围(默认活动期间)、单位部门(二级联动面板)、姓名、员工编号
|
||||
- 子分类Tab:体重 / 饮食 / 运动;记录状态筛选:全部 / 已记录 / 未记录
|
||||
- 体重子Tab表格(多级表头):序号、姓名、员工编号、性别、年龄、单位、部门、打卡次数(可排序)、打卡天数(可排序)、首次记录日期、末次记录日期、末次记录数据(6子列:身高、体重、BMI、体脂、腰围、记录来源)
|
||||
- 饮食/运动子Tab表格(单行表头):序号、姓名、员工编号、性别、年龄、单位、部门、打卡次数(可排序)、打卡天数(可排序)、首次记录日期、末次记录日期
|
||||
- 点击打卡次数打开打卡记录弹窗(体重/饮食/运动,同"行动记录"页)
|
||||
|
||||
**Tab 2 — 总览数据:**
|
||||
- 筛选:单位部门、姓名、员工编号
|
||||
@@ -837,25 +847,15 @@
|
||||
- 奖励等级信息
|
||||
|
||||
**弹窗:**
|
||||
- 饮食记录弹窗:序号、餐次、摄入时间、总摄入(千卡)、数据来源
|
||||
- 运动记录弹窗:序号、运动类型、运动数据、消耗(千卡)、来源
|
||||
- 体重记录弹窗:序号、记录时间、体重(kg)、BMI、体脂率(%)、腰围(cm)、来源
|
||||
- 打卡记录弹窗(按当前子分类动态展示):体重 → 序号、记录时间、体重(kg)、BMI、体脂率(%)、腰围(cm)、数据来源;饮食 → 序号、记录时间、餐次、总摄入(千卡)、数据来源;运动 → 序号、记录时间、运动类型、运动数据、消耗(千卡)、来源
|
||||
- 承诺书弹窗:承诺书样式证书卡片
|
||||
- 大病人员弹窗:序号、单位、部门、姓名、员工编号、性别、年龄、身高(cm)、体重(kg)、BMI、大病信息
|
||||
|
||||
**弹窗截图:**
|
||||
|
||||
**饮食记录弹窗:**
|
||||
**打卡记录弹窗(体重子分类):**
|
||||
|
||||

|
||||
|
||||
**运动记录弹窗:**
|
||||
|
||||

|
||||
|
||||
**体重记录弹窗:**
|
||||
|
||||

|
||||

|
||||
|
||||
**承诺书弹窗:**
|
||||
|
||||
@@ -1002,7 +1002,7 @@
|
||||
|
||||
**业务规则:**
|
||||
- 变化列负值绿色(改善),正值红色(恶化)
|
||||
- 未设置目标的员工,目标周期和目标指标列显示"-",仅当前指标有实际称重数据
|
||||
- 未设置目标的员工,目标周期和目标指标列显示"-",仅当前指标有实际称重数据,详细数据列同样显示"-"(不可查看)
|
||||
- 姓名和员工编号列做左侧固定
|
||||
- 详细数据列做右侧固定
|
||||
|
||||
@@ -1067,7 +1067,7 @@
|
||||
|--------|------|------|--------------|
|
||||
| 设备编码 | 文本输入框 | 是 | 唯一性校验 |
|
||||
| 设备名称 | 文本输入框 | 是 | 不超过30字符 |
|
||||
| 设备厂商 | 下拉选择 | 是 | 预设厂商列表 |
|
||||
| 设备厂商 | 下拉选择 | 是 | 预设厂商列表(当前为:蚁熊) |
|
||||
| 设备型号 | 文本输入框 | 是 | 预设设备型号,与厂商联动 |
|
||||
| 所属单位 | 下拉选择 | 是 | 从组织机构选择 |
|
||||
| 布放位置 | 文本输入框 | 是 | 地图选择,可修改详细地址 |
|
||||
@@ -1140,12 +1140,10 @@
|
||||
|
||||
**员工匿名 Tab:** 仅含使用日期筛选,表格列为姓名、使用时间 + 同上10项监测数据列 + 更多信息
|
||||
|
||||
**详情弹窗(身体成分分析,5组指标):**
|
||||
- **基础指标:** 身高(cm)、体重(kg)、BMI、基础代谢、体脂肪量(kg)、体脂肪率(%)
|
||||
- **水分与蛋白质:** 体水分量(kg)、体水分率(%)、蛋白质量(kg)、蛋白质率(%)
|
||||
- **肌肉与骨骼:** 肌肉率(%)、肌肉量(kg)、体骨骼量/骨量(kg)
|
||||
- **脂肪分析:** 皮下脂肪率(%)、内脏脂肪等级、去脂体重(kg)
|
||||
- **其他:** 无机盐量/矿物质量(kg)、细胞内液(kg)、细胞外液(kg)、健康评分
|
||||
**详情弹窗(监测数据详情 - **员工姓名**,3组指标,对齐员工端身高秤报告):**
|
||||
- **基础指标:** 身高(cm)、体重(kg)、BMI、体脂率(%)
|
||||
- **身体成分:** 体脂肪(kg)、水分率(%)、水分量(kg)、肌肉率(%)、肌肉量(kg)、骨量(kg)、去脂体重(kg)
|
||||
- **体态分析:** 内脏脂肪、体型、理想体重(kg)、超重百分比(%)、体表面积(m²)
|
||||
|
||||
**弹窗截图:**
|
||||
|
||||
@@ -1166,13 +1164,16 @@
|
||||
|
||||
**表格列(多级表头,监测数据6子列):** 姓名、员工编号、所属单位、所属部门、性别、年龄、使用时间、身高(cm)、体重(kg)、BMI、基础代谢、体脂肪量(kg)、体脂肪率(%)、更多信息
|
||||
|
||||
**详情弹窗(身体成分分析,6组指标):**
|
||||
- **基础指标:** 身高(cm)、体重(kg)、BMI、基础代谢、体脂肪量(kg)、体脂肪率(%)
|
||||
- **水分与蛋白质:** 体水分量(kg)、体水分率(%)、蛋白质量(kg)、蛋白质率(%)
|
||||
- **肌肉与骨骼:** 体肌肉量(kg)、体肌肉率(%)、体骨骼量(kg)
|
||||
- **脂肪分析:** 皮下脂肪量(kg)、皮下脂肪率(%)、除脂肪量(kg)
|
||||
- **细胞液:** 细胞外液量(L)、细胞外液率(%)、细胞内液量(L)、细胞内液率(%)
|
||||
- **其他:** 矿物质量(kg)
|
||||
**详情弹窗(监测数据详情 - **员工姓名**,9组指标,对齐员工端蓝牙秤8电极报告):**
|
||||
- **基础指标:** 体重(kg)、BMI、体脂率(%)、身体得分、健康评估
|
||||
- **身体成分:** 水分率(%)、水分量(kg)、蛋白质率(%)、蛋白质量(kg)、体脂肪(kg)、肌肉量(kg)、肌肉率(%)、骨骼肌量(kg)、骨骼肌率(%)、骨量(kg)
|
||||
- **脂肪分析:** 内脏脂肪、皮下脂肪率(%)、皮下脂肪量(kg)
|
||||
- **体态管理:** 理想体重(kg)、去脂体重(kg)、身体年龄、身体类型、推测腰臀比
|
||||
- **体重管控:** 控制体重(kg)、脂肪控制量(kg)、肌肉控制量(kg)
|
||||
- **细胞液分析:** 细胞内水量(kg)、细胞外水量(kg)
|
||||
- **进阶成分:** 无机盐量(kg)、身体细胞量(kg)、骨骼肌质量指数(kg/m²)
|
||||
- **躯干/四肢脂肪:** 左/右臂、左/右腿、躯干的脂肪量(kg)与脂肪率(%)
|
||||
- **躯干/四肢肌肉:** 左/右臂、左/右腿、躯干的肌肉量(kg)与肌肉率(%)
|
||||
|
||||
**弹窗截图:**
|
||||
|
||||
@@ -1195,13 +1196,13 @@
|
||||
|
||||
**员工匿名 Tab:** 仅含使用日期筛选,表格列为姓名、使用时间 + 同上8项监测数据列 + 更多信息
|
||||
|
||||
**详情弹窗(身体成分分析,6组指标,最全面):**
|
||||
- **基础指标:** 身高(cm)、体重(kg)、BMI、基础代谢、InBody评分(分)
|
||||
- **体脂分析:** 体脂肪量(kg)、体脂肪率(%)、内脏脂肪等级、肥胖度(%)、去脂体重(kg)
|
||||
- **体成分:** 体水分(L)、蛋白质(kg)、无机盐(kg)、骨骼肌量(kg)、骨骼肌指数(kg)
|
||||
- **体重管理:** 目标体重(kg)、体重控制(kg)、脂肪控制(kg)、肌肉控制(kg)、腰臀比(%)
|
||||
- **节段脂肪:** 左上肢(kg)、左下肢(kg)、右上肢(kg)、右下肢(kg)、躯干(kg)
|
||||
- **节段肌肉:** 左上肢(kg)、左下肢(kg)、右上肢(kg)、右下肢(kg)、躯干(kg)
|
||||
**详情弹窗(监测数据详情 - **员工姓名**,6组指标,对齐员工端体脂仪InBody报告):**
|
||||
- **基础指标:** 体重(kg)、BMI、体脂率(%)、InBody评分(分)
|
||||
- **身体成分:** 体水分(L)、蛋白质(kg)、无机盐(kg)、体脂肪(kg)、去脂体重(kg)、骨骼肌量(kg)、骨骼肌指数(kg/m²)
|
||||
- **脂肪分析:** 内脏脂肪等级、肥胖度(%)
|
||||
- **节段肌肉量:** 右上肢(kg)、左上肢(kg)、躯干(kg)、右下肢(kg)、左下肢(kg)
|
||||
- **节段体脂肪量:** 右上肢(kg)、左上肢(kg)、躯干(kg)、右下肢(kg)、左下肢(kg)
|
||||
- **体重管理:** 目标体重(kg)、体重控制(kg)、脂肪控制(kg)、肌肉控制(kg)、腰臀比
|
||||
|
||||
**弹窗截图:**
|
||||
|
||||
|
||||
@@ -257,24 +257,10 @@ const MODALS = [
|
||||
},
|
||||
{
|
||||
file: 'history-plan-detail.html',
|
||||
desc: '历史活动详情-饮食记录弹窗',
|
||||
output: 'history-plan-detail-modal-diet.jpg',
|
||||
selector: '#dietOverlay .record-dialog',
|
||||
setup: '(() => { openDietDialog(actEmployees[0].empId, actEmployees[0].name, "2026-05-20"); })()',
|
||||
},
|
||||
{
|
||||
file: 'history-plan-detail.html',
|
||||
desc: '历史活动详情-运动记录弹窗',
|
||||
output: 'history-plan-detail-modal-exercise.jpg',
|
||||
selector: '#exerciseOverlay .record-dialog',
|
||||
setup: '(() => { openExerciseDialog(actEmployees[0].empId, actEmployees[0].name, "2026-05-20"); })()',
|
||||
},
|
||||
{
|
||||
file: 'history-plan-detail.html',
|
||||
desc: '历史活动详情-体重记录弹窗',
|
||||
output: 'history-plan-detail-modal-weight.jpg',
|
||||
selector: '#weightOverlay .record-dialog',
|
||||
setup: '(() => { openWeightDialog(actEmployees[0].empId, actEmployees[0].name, "2026-05-20"); })()',
|
||||
desc: '历史活动详情-打卡记录弹窗',
|
||||
output: 'history-plan-detail-modal-checkin.jpg',
|
||||
selector: '#checkinOverlay .record-dialog',
|
||||
setup: '(() => { var e = actEmployees[0]; openCheckinDialog(e.empId, e.name, e.org, e.dept); })()', // actSub默认weight,渲染体重打卡记录
|
||||
},
|
||||
{
|
||||
file: 'history-plan-detail.html',
|
||||
|
||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |