feat: 营养用餐模块交互完善——等级配置弹窗、消费管理筛选优化、取餐列表金额列
- 用户管理:等级配置tab增加新增/查看/编辑等级弹窗交互 - 消费管理:日期默认今天、金额范围改为双输入框、消费类型精简为消费/充值/退款并加标签样式、部门改为单位/部门格式、去掉日结状态列、新增实际支付金额列、消费时间加日期、新增单位部门级联筛选和流水号筛选、交易明细弹窗对齐列表全部字段 - 取餐管理:列表新增总金额列、取餐详情弹窗餐品列表新增金额列 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -93,6 +93,30 @@ thead th:last-child,tbody td.td-actions{position:sticky;right:0;background:#fff;
|
||||
thead th:last-child{background:#FAFAFA;}
|
||||
tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
|
||||
/* 页面信息栏 */
|
||||
.page-header-bar{display:flex;align-items:center;justify-content:space-between;background:#fff;border-radius:var(--radius-md);padding:16px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);}
|
||||
.page-header-bar__left{display:flex;align-items:center;gap:12px;}
|
||||
.page-header-bar__title{font-size:var(--font-lg);font-weight:700;color:var(--text-primary);}
|
||||
.page-header-bar__meta{font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.page-header-bar__right{display:flex;align-items:center;gap:12px;}
|
||||
.page-header-bar__right label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.page-header-bar__right .canteen-select{height:36px;border:2px solid var(--primary);border-radius:var(--radius-sm);padding:0 32px 0 14px;font-size:var(--font-sm);color:var(--primary);font-weight:500;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='%231890FF'/%3E%3C/svg%3E") no-repeat right 12px center;appearance:none;cursor:pointer;min-width:140px;}
|
||||
|
||||
|
||||
/* 弹窗样式 */
|
||||
.cascader{position:relative;display:inline-block;}
|
||||
.cascader__trigger{display:flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);min-width:140px;justify-content:space-between;}
|
||||
.cascader__trigger:hover{border-color:var(--primary);}
|
||||
.cascader__arrow{font-size:10px;color:var(--text-placeholder);transition:transform .2s;}
|
||||
.cascader.open .cascader__arrow{transform:rotate(180deg);}
|
||||
.cascader__panel{display:none;position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);border:1px solid var(--border);z-index:100;white-space:nowrap;}
|
||||
.cascader.open .cascader__panel{display:flex;}
|
||||
.cascader__col{min-width:120px;max-height:240px;overflow-y:auto;padding:4px 0;border-right:1px solid var(--border);}
|
||||
.cascader__col:last-child{border-right:none;}
|
||||
.cascader__col-item{padding:6px 16px;cursor:pointer;font-size:var(--font-sm);color:var(--text-primary);}
|
||||
.cascader__col-item:hover{background:var(--background);}
|
||||
.cascader__col-item.active{color:var(--primary);background:var(--primary-light);}
|
||||
|
||||
/* 弹窗样式 */
|
||||
.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.45);z-index:1000;display:flex;align-items:center;justify-content:center;animation:modalFadeIn .2s ease;}
|
||||
.modal-overlay.closing{animation:modalFadeOut .2s ease forwards;}
|
||||
@@ -188,6 +212,23 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<!-- 主内容区 -->
|
||||
<div class="main">
|
||||
|
||||
<!-- 页面信息栏 -->
|
||||
<div class="page-header-bar">
|
||||
<div class="page-header-bar__left">
|
||||
<span class="page-header-bar__title">消费管理</span>
|
||||
<span class="page-header-bar__meta">2026-05-20 · 数据实时更新</span>
|
||||
</div>
|
||||
<div class="page-header-bar__right">
|
||||
<label>当前餐厅</label>
|
||||
<select class="canteen-select" id="globalCanteen">
|
||||
<option value="1">一餐厅(东区)</option>
|
||||
<option value="2">二餐厅(西区)</option>
|
||||
<option value="3">三餐厅(北区)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 统计卡片 -->
|
||||
<div class="stats-row">
|
||||
<div class="stat-card">
|
||||
@@ -222,15 +263,17 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item"><label>员工姓名/工号</label><input class="filter-input" type="text" placeholder="请输入姓名或工号"></div>
|
||||
<div class="filter-item"><label>消费类型</label><select class="filter-select"><option>全部</option><option>午餐消费</option><option>早餐消费</option><option>账户充值</option><option>退款</option></select></div>
|
||||
<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="cascader" id="cascaderDept"><div class="cascader__trigger" onclick="toggleCascader()"><span class="cascader__text">全部</span><span class="cascader__arrow">▾</span></div><div class="cascader__panel"><div class="cascader__col cascader__col--left" id="cascaderLeft"></div><div class="cascader__col cascader__col--right" id="cascaderRight"></div></div></div></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"><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"><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></select></div>
|
||||
<div class="filter-item"><label>是否退款</label><select class="filter-select"><option>全部</option><option>是</option><option>否</option></select></div>
|
||||
<div class="filter-item"><label>日期范围</label><input class="filter-input" type="date"></div>
|
||||
<div class="filter-item"><label>金额范围</label><input class="filter-input" type="text" placeholder="如 10-50" style="min-width:100px;"></div>
|
||||
<div class="filter-item"><label>日期</label><input class="filter-input" type="date" id="filterDate" style="min-width:150px;"></div>
|
||||
<div class="filter-item"><label>金额范围</label><input class="filter-input" type="number" placeholder="最小金额" style="min-width:100px;width:100px;"><span style="color:var(--text-placeholder);margin:0 4px;">~</span><input class="filter-input" type="number" placeholder="最大金额" style="min-width:100px;width:100px;"></div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
@@ -239,8 +282,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<div class="action-bar">
|
||||
<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>
|
||||
<button class="btn btn-default">📊 消费报表</button>
|
||||
<button class="btn btn-default">🧮 日结对账</button>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
@@ -251,15 +293,15 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>流水号</th><th>员工</th><th>部门</th><th>订单来源</th><th>餐次</th><th>消费类型</th><th>消费金额</th><th>支付方式</th><th>支付状态</th><th>关联营养评分</th><th>账实一致</th><th>异常标签</th><th>日结状态</th><th>交易后余额</th><th>消费时间</th><th>操作</th></tr>
|
||||
<tr><th>流水号</th><th>姓名/编号</th><th>单位/部门</th><th>订单来源</th><th>餐次</th><th>消费类型</th><th>消费金额</th><th>实际支付金额</th><th>支付方式</th><th>支付状态</th><th>关联营养评分</th><th>账实一致</th><th>异常标签</th><th>交易后余额</th><th>消费时间</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>TX-20260421-001</td><td>张伟(EMP001)</td><td>研发部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td>午餐消费</td><td><a class="link">¥22.00</a></td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">88分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td><span class="tag tag-gray">已日结</span></td><td>¥234.50</td><td>11:02</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-002</td><td>李娜(EMP002)</td><td>市场部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td>午餐消费</td><td><a class="link">¥18.00</a></td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">92分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td><span class="tag tag-gray">已日结</span></td><td>¥86.20</td><td>11:08</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-003</td><td>王磊(EMP003)</td><td>运营部</td><td><span class="tag tag-gray">餐线</span></td><td>午餐</td><td>午餐消费</td><td><a class="link">¥28.00</a></td><td>微信支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-orange">68分</span></td><td><span class="tag tag-orange">待对账</span></td><td><span class="tag tag-orange">短时多笔</span></td><td><span class="tag tag-orange">未日结</span></td><td>—</td><td>11:15</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-004</td><td>赵敏(EMP004)</td><td>财务部</td><td><span class="tag tag-blue">账户</span></td><td>—</td><td>账户充值</td><td>+¥100.00</td><td>微信支付</td><td><span class="tag tag-green">成功</span></td><td>—</td><td><span class="tag tag-green">已对账</span></td><td>—</td><td><span class="tag tag-gray">已日结</span></td><td>¥356.80</td><td>09:30</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-005</td><td>陈刚(EMP005)</td><td>人事部</td><td><span class="tag tag-gray">餐线</span></td><td>早餐</td><td>早餐消费</td><td><a class="link">¥12.00</a></td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">85分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td><span class="tag tag-gray">已日结</span></td><td>¥142.60</td><td>07:45</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-006</td><td>刘芳(EMP006)</td><td>市场部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td>退款</td><td>+¥18.00</td><td>原路退回</td><td><span class="tag tag-gray">已退款</span></td><td><span class="tag tag-orange">76分</span></td><td><span class="tag tag-red">差异</span></td><td><span class="tag tag-orange">退款频繁</span></td><td><span class="tag tag-orange">未日结</span></td><td>¥68.40</td><td>10:20</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-001</td><td>张伟(EMP001)</td><td>总部机关/研发部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td><span class="tag tag-green">消费</span></td><td><a class="link">¥22.00</a></td><td>¥22.00</td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">88分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td>¥234.50</td><td>2026-04-21 11:02</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-002</td><td>李娜(EMP002)</td><td>总部机关/市场部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td><span class="tag tag-green">消费</span></td><td><a class="link">¥18.00</a></td><td>¥18.00</td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">92分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td>¥86.20</td><td>2026-04-21 11:08</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-003</td><td>王磊(EMP003)</td><td>总部机关/运营部</td><td><span class="tag tag-gray">餐线</span></td><td>午餐</td><td><span class="tag tag-green">消费</span></td><td><a class="link">¥28.00</a></td><td>¥25.20</td><td>微信支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-orange">68分</span></td><td><span class="tag tag-orange">待对账</span></td><td><span class="tag tag-orange">短时多笔</span></td><td>—</td><td>2026-04-21 11:15</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-004</td><td>赵敏(EMP004)</td><td>总部机关/财务部</td><td><span class="tag tag-blue">账户</span></td><td>—</td><td><span class="tag tag-blue">充值</span></td><td>+¥100.00</td><td>¥100.00</td><td>微信支付</td><td><span class="tag tag-green">成功</span></td><td>—</td><td><span class="tag tag-green">已对账</span></td><td>—</td><td>¥356.80</td><td>2026-04-21 09:30</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-005</td><td>陈刚(EMP005)</td><td>总部机关/人事部</td><td><span class="tag tag-gray">餐线</span></td><td>早餐</td><td><span class="tag tag-green">消费</span></td><td><a class="link">¥12.00</a></td><td>¥12.00</td><td>余额支付</td><td><span class="tag tag-green">成功</span></td><td><span class="tag tag-green">85分</span></td><td><span class="tag tag-green">已对账</span></td><td>—</td><td>¥142.60</td><td>2026-04-21 07:45</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
<tr><td>TX-20260421-006</td><td>刘芳(EMP006)</td><td>总部机关/市场部</td><td><span class="tag tag-blue">点餐</span></td><td>午餐</td><td><span class="tag tag-red">退款</span></td><td>+¥18.00</td><td>¥18.00</td><td>原路退回</td><td><span class="tag tag-gray">已退款</span></td><td><span class="tag tag-orange">76分</span></td><td><span class="tag tag-red">差异</span></td><td><span class="tag tag-orange">退款频繁</span></td><td>¥68.40</td><td>2026-04-21 10:20</td><td class="td-actions"><a class="link">交易明细</a> <a class="link">餐品明细</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -280,6 +322,9 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
(function(){var active=document.querySelector('.sidebar-item.active');if(!active)return;var sub=active.closest('.sidebar-subgroup');if(sub)sub.classList.add('open');})();
|
||||
|
||||
/* 日期默认今天 */
|
||||
(function(){var d=document.getElementById('filterDate');if(d){var t=new Date();d.value=t.getFullYear()+'-'+String(t.getMonth()+1).padStart(2,'0')+'-'+String(t.getDate()).padStart(2,'0');}})();
|
||||
|
||||
/* ========== 弹窗基础 ========== */
|
||||
const Modal = {
|
||||
open(title, bodyHtml) {
|
||||
@@ -303,33 +348,33 @@ const Modal = {
|
||||
|
||||
/* ========== 消费数据 ========== */
|
||||
const consumeData = {
|
||||
'TX-20260421-001': { txId:'TX-20260421-001', user:'张伟(EMP001)', dept:'研发部', type:'午餐消费', pay:'余额支付', amount:'¥22.00', time:'2026-04-21 11:02:35', status:'成功', preBal:'¥256.50', postBal:'¥234.50', orderId:'ORD-20260421-001', mealId:'MEAL-20260421-001', operator:'系统自动', remark:'—',
|
||||
'TX-20260421-001': { txId:'TX-20260421-001', user:'张伟(EMP001)', dept:'总部机关/研发部', source:'点餐', mealTime:'午餐', type:'消费', pay:'余额支付', amount:'¥22.00', actualPay:'¥22.00', time:'2026-04-21 11:02:35', status:'成功', score:'88分', reconcile:'已对账', abnormal:'—', preBal:'¥256.50', postBal:'¥234.50', orderId:'ORD-20260421-001', mealId:'MEAL-20260421-001', operator:'系统自动', remark:'—',
|
||||
dishes:[
|
||||
{ code:'DISH-001', name:'宫保鸡丁', weight:'0.18kg', price:'¥14/份', total:'¥14.00' },
|
||||
{ code:'DISH-012', name:'米饭', weight:'0.25kg', price:'¥2/份', total:'¥2.00' },
|
||||
{ code:'DISH-008', name:'紫菜蛋花汤', weight:'0.30kg', price:'¥6/份', total:'¥6.00' },
|
||||
]},
|
||||
'TX-20260421-002': { txId:'TX-20260421-002', user:'李娜(EMP002)', dept:'市场部', type:'午餐消费', pay:'余额支付', amount:'¥18.00', time:'2026-04-21 11:08:12', status:'成功', preBal:'¥104.20', postBal:'¥86.20', orderId:'ORD-20260421-002', mealId:'MEAL-20260421-002', operator:'系统自动', remark:'—',
|
||||
'TX-20260421-002': { txId:'TX-20260421-002', user:'李娜(EMP002)', dept:'总部机关/市场部', source:'点餐', mealTime:'午餐', type:'消费', pay:'余额支付', amount:'¥18.00', actualPay:'¥18.00', time:'2026-04-21 11:08:12', status:'成功', score:'92分', reconcile:'已对账', abnormal:'—', preBal:'¥104.20', postBal:'¥86.20', orderId:'ORD-20260421-002', mealId:'MEAL-20260421-002', operator:'系统自动', remark:'—',
|
||||
dishes:[
|
||||
{ code:'DISH-003', name:'清蒸鱼', weight:'0.15kg', price:'¥12/份', total:'¥12.00' },
|
||||
{ code:'DISH-012', name:'米饭', weight:'0.25kg', price:'¥2/份', total:'¥2.00' },
|
||||
{ code:'DISH-015', name:'炒时蔬', weight:'0.20kg', price:'¥4/份', total:'¥4.00' },
|
||||
]},
|
||||
'TX-20260421-003': { txId:'TX-20260421-003', user:'王磊(EMP003)', dept:'运营部', type:'午餐消费', pay:'微信支付', amount:'¥28.00', time:'2026-04-21 11:15:48', status:'成功', preBal:'—', postBal:'—', orderId:'ORD-20260421-003', mealId:'MEAL-20260421-003', operator:'系统自动', remark:'—',
|
||||
'TX-20260421-003': { txId:'TX-20260421-003', user:'王磊(EMP003)', dept:'总部机关/运营部', source:'餐线', mealTime:'午餐', type:'消费', pay:'微信支付', amount:'¥28.00', actualPay:'¥25.20', time:'2026-04-21 11:15:48', status:'成功', score:'68分', reconcile:'待对账', abnormal:'短时多笔', preBal:'—', postBal:'—', orderId:'ORD-20260421-003', mealId:'MEAL-20260421-003', operator:'系统自动', remark:'—',
|
||||
dishes:[
|
||||
{ code:'DISH-005', name:'红烧肉', weight:'0.22kg', price:'¥16/份', total:'¥16.00' },
|
||||
{ code:'DISH-012', name:'米饭', weight:'0.25kg', price:'¥2/份', total:'¥2.00' },
|
||||
{ code:'DISH-009', name:'番茄炒蛋', weight:'0.18kg', price:'¥8/份', total:'¥8.00' },
|
||||
{ code:'DISH-012', name:'酸辣汤', weight:'0.30kg', price:'¥2/份', total:'¥2.00' },
|
||||
]},
|
||||
'TX-20260421-004': { txId:'TX-20260421-004', user:'赵敏(EMP004)', dept:'财务部', type:'账户充值', pay:'微信支付', amount:'+¥100.00', time:'2026-04-21 09:30:22', status:'成功', preBal:'¥256.80', postBal:'¥356.80', orderId:'—', mealId:'—', operator:'系统自动', remark:'—', dishes:[] },
|
||||
'TX-20260421-005': { txId:'TX-20260421-005', user:'陈刚(EMP005)', dept:'人事部', type:'早餐消费', pay:'余额支付', amount:'¥12.00', time:'2026-04-21 07:45:10', status:'成功', preBal:'¥154.60', postBal:'¥142.60', orderId:'ORD-20260421-005', mealId:'MEAL-20260421-005', operator:'系统自动', remark:'—',
|
||||
'TX-20260421-004': { txId:'TX-20260421-004', user:'赵敏(EMP004)', dept:'总部机关/财务部', source:'账户', mealTime:'—', type:'充值', pay:'微信支付', amount:'+¥100.00', actualPay:'¥100.00', time:'2026-04-21 09:30:22', status:'成功', score:'—', reconcile:'已对账', abnormal:'—', preBal:'¥256.80', postBal:'¥356.80', orderId:'—', mealId:'—', operator:'系统自动', remark:'—', dishes:[] },
|
||||
'TX-20260421-005': { txId:'TX-20260421-005', user:'陈刚(EMP005)', dept:'总部机关/人事部', source:'餐线', mealTime:'早餐', type:'消费', pay:'余额支付', amount:'¥12.00', actualPay:'¥12.00', time:'2026-04-21 07:45:10', status:'成功', score:'85分', reconcile:'已对账', abnormal:'—', preBal:'¥154.60', postBal:'¥142.60', orderId:'ORD-20260421-005', mealId:'MEAL-20260421-005', operator:'系统自动', remark:'—',
|
||||
dishes:[
|
||||
{ code:'DISH-020', name:'小米粥', weight:'0.35kg', price:'¥5/份', total:'¥5.00' },
|
||||
{ code:'DISH-022', name:'煎蛋', weight:'0.08kg', price:'¥3/份', total:'¥3.00' },
|
||||
{ code:'DISH-025', name:'凉拌黄瓜', weight:'0.15kg', price:'¥4/份', total:'¥4.00' },
|
||||
]},
|
||||
'TX-20260421-006': { txId:'TX-20260421-006', user:'刘芳(EMP006)', dept:'市场部', type:'退款', pay:'原路退回', amount:'+¥18.00', time:'2026-04-21 10:20:05', status:'已退款', preBal:'¥50.40', postBal:'¥68.40', orderId:'ORD-20260421-006', mealId:'MEAL-20260421-006', operator:'客服张丽', remark:'用户申请退款',
|
||||
'TX-20260421-006': { txId:'TX-20260421-006', user:'刘芳(EMP006)', dept:'总部机关/市场部', source:'点餐', mealTime:'午餐', type:'退款', pay:'原路退回', amount:'+¥18.00', actualPay:'¥18.00', time:'2026-04-21 10:20:05', status:'已退款', score:'76分', reconcile:'差异', abnormal:'退款频繁', preBal:'¥50.40', postBal:'¥68.40', orderId:'ORD-20260421-006', mealId:'MEAL-20260421-006', operator:'客服张丽', remark:'用户申请退款',
|
||||
dishes:[
|
||||
{ code:'DISH-003', name:'清蒸鱼', weight:'0.15kg', price:'¥12/份', total:'¥12.00' },
|
||||
{ code:'DISH-015', name:'炒时蔬', weight:'0.20kg', price:'¥4/份', total:'¥4.00' },
|
||||
@@ -342,7 +387,7 @@ function showDishDetail(txId) {
|
||||
const d = consumeData[txId];
|
||||
if (!d) return;
|
||||
const infoHtml = `<div class="detail-info">
|
||||
<span>交易流水号:<b>${d.txId}</b></span>
|
||||
<span>流水号:<b>${d.txId}</b></span>
|
||||
<span>就餐记录号:<b>${d.mealId}</b></span>
|
||||
<span>用户:<b>${d.user}</b></span>
|
||||
<span>时间:<b>${d.time}</b></span>
|
||||
@@ -360,15 +405,25 @@ function showTransDetail(txId) {
|
||||
const d = consumeData[txId];
|
||||
if (!d) return;
|
||||
const statusTag = d.status === '成功' ? '<span class="tag tag-green">成功</span>' : '<span class="tag tag-gray">已退款</span>';
|
||||
const typeMap = {'消费':'tag-green','充值':'tag-blue','退款':'tag-red'};
|
||||
const typeTag = `<span class="tag ${typeMap[d.type]||'tag-gray'}">${d.type}</span>`;
|
||||
const html = `<div class="detail-grid">
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易流水号</span><span class="detail-grid__value">${d.txId}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易类型</span><span class="detail-grid__value">${d.type}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">流水号</span><span class="detail-grid__value">${d.txId}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">姓名/编号</span><span class="detail-grid__value">${d.user}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">单位/部门</span><span class="detail-grid__value">${d.dept}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">订单来源</span><span class="detail-grid__value">${d.source}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">餐次</span><span class="detail-grid__value">${d.mealTime}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">消费类型</span><span class="detail-grid__value">${typeTag}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">消费金额</span><span class="detail-grid__value">${d.amount}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">实际支付金额</span><span class="detail-grid__value">${d.actualPay}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">支付方式</span><span class="detail-grid__value">${d.pay}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易金额</span><span class="detail-grid__value">${d.amount}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易时间</span><span class="detail-grid__value">${d.time}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易状态</span><span class="detail-grid__value">${statusTag}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">支付状态</span><span class="detail-grid__value">${statusTag}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">关联营养评分</span><span class="detail-grid__value">${d.score}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">账实一致</span><span class="detail-grid__value">${d.reconcile}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">异常标签</span><span class="detail-grid__value">${d.abnormal}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易前余额</span><span class="detail-grid__value">${d.preBal}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">交易后余额</span><span class="detail-grid__value">${d.postBal}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">消费时间</span><span class="detail-grid__value">${d.time}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">关联订单</span><span class="detail-grid__value">${d.orderId}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">关联就餐记录</span><span class="detail-grid__value">${d.mealId}</span></div>
|
||||
<div class="detail-grid__item"><span class="detail-grid__label">操作员</span><span class="detail-grid__value">${d.operator}</span></div>
|
||||
@@ -377,6 +432,58 @@ function showTransDetail(txId) {
|
||||
Modal.open('交易明细 — ' + txId, html);
|
||||
}
|
||||
|
||||
/* ========== 级联选择器 ========== */
|
||||
var CASCADER_DATA={
|
||||
'总部机关':['运维部','后勤部','研发部','市场部','运营部','财务部','人事部','行政部','销售部'],
|
||||
'物业中心':['安保部','保洁部','绿化部','维修部'],
|
||||
'外部单位':['访客组','合作方']
|
||||
};
|
||||
var cascaderEl=document.getElementById('cascaderDept');
|
||||
var cascaderLeft=document.getElementById('cascaderLeft');
|
||||
var cascaderRight=document.getElementById('cascaderRight');
|
||||
var selectedUnit='',selectedDept='';
|
||||
|
||||
function renderCascaderLeft(){
|
||||
var html='<div class="cascader__col-item'+(selectedUnit===''?' active':'')+'" data-val="">全部</div>';
|
||||
Object.keys(CASCADER_DATA).forEach(function(u){
|
||||
html+='<div class="cascader__col-item'+(selectedUnit===u?' active':'')+'" data-val="'+u+'">'+u+'</div>';
|
||||
});
|
||||
cascaderLeft.innerHTML=html;
|
||||
cascaderLeft.querySelectorAll('.cascader__col-item').forEach(function(item){
|
||||
item.onclick=function(e){e.stopPropagation();selectUnit(this.dataset.val);};
|
||||
});
|
||||
}
|
||||
function renderCascaderRight(){
|
||||
if(!selectedUnit){cascaderRight.innerHTML='';return;}
|
||||
var depts=CASCADER_DATA[selectedUnit]||[];
|
||||
var html='<div class="cascader__col-item'+(selectedDept===''?' active':'')+'" data-val="">全部</div>';
|
||||
depts.forEach(function(d){
|
||||
html+='<div class="cascader__col-item'+(selectedDept===d?' active':'')+'" data-val="'+d+'">'+d+'</div>';
|
||||
});
|
||||
cascaderRight.innerHTML=html;
|
||||
cascaderRight.querySelectorAll('.cascader__col-item').forEach(function(item){
|
||||
item.onclick=function(e){e.stopPropagation();selectDept(this.dataset.val);};
|
||||
});
|
||||
}
|
||||
function selectUnit(val){
|
||||
selectedUnit=val;selectedDept='';
|
||||
renderCascaderLeft();renderCascaderRight();
|
||||
if(!val){updateCascaderText();closeCascader();}
|
||||
}
|
||||
function selectDept(val){
|
||||
selectedDept=val;renderCascaderRight();updateCascaderText();closeCascader();
|
||||
}
|
||||
function updateCascaderText(){
|
||||
var txt=selectedUnit?(selectedDept?selectedUnit+'/'+selectedDept:selectedUnit):'全部';
|
||||
cascaderEl.querySelector('.cascader__text').textContent=txt;
|
||||
}
|
||||
function toggleCascader(){
|
||||
var isOpen=cascaderEl.classList.contains('open');
|
||||
if(isOpen){closeCascader();}else{renderCascaderLeft();renderCascaderRight();cascaderEl.classList.add('open');}
|
||||
}
|
||||
function closeCascader(){cascaderEl.classList.remove('open');}
|
||||
document.addEventListener('click',function(e){if(!cascaderEl.contains(e.target))closeCascader();});
|
||||
|
||||
/* ========== 事件绑定 ========== */
|
||||
(function bindEvents() {
|
||||
document.querySelectorAll('tbody tr').forEach(row => {
|
||||
|
||||
@@ -159,6 +159,16 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
.mom-header__tags{display:flex;gap:6px;flex-wrap:wrap;}
|
||||
.mom-tag{display:inline-block;padding:2px 10px;border-radius:4px;font-size:var(--font-xs);color:#FA8C16;background:#FFF7E6;border:1px solid #FFD591;}
|
||||
|
||||
/* 页面信息栏 */
|
||||
.page-header-bar{display:flex;align-items:center;justify-content:space-between;background:#fff;border-radius:var(--radius-md);padding:16px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);}
|
||||
.page-header-bar__left{display:flex;align-items:center;gap:12px;}
|
||||
.page-header-bar__title{font-size:var(--font-lg);font-weight:700;color:var(--text-primary);}
|
||||
.page-header-bar__meta{font-size:var(--font-sm);color:var(--text-placeholder);}
|
||||
.page-header-bar__right{display:flex;align-items:center;gap:12px;}
|
||||
.page-header-bar__right label{font-size:var(--font-sm);color:var(--text-secondary);white-space:nowrap;}
|
||||
.page-header-bar__right .canteen-select{height:36px;border:2px solid var(--primary);border-radius:var(--radius-sm);padding:0 32px 0 14px;font-size:var(--font-sm);color:var(--primary);font-weight:500;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='%231890FF'/%3E%3C/svg%3E") no-repeat right 12px center;appearance:none;cursor:pointer;min-width:140px;}
|
||||
|
||||
|
||||
/* 个性模型 */
|
||||
.model-section{background:#E6F7FF;border-radius:var(--radius-md);padding:12px 16px;margin-bottom:16px;}
|
||||
.model-header{display:flex;align-items:center;gap:10px;margin-bottom:10px;}
|
||||
@@ -244,13 +254,28 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<!-- 主内容区 -->
|
||||
<div class="main">
|
||||
|
||||
<!-- 页面信息栏 -->
|
||||
<div class="page-header-bar">
|
||||
<div class="page-header-bar__left">
|
||||
<span class="page-header-bar__title">取餐管理</span>
|
||||
<span class="page-header-bar__meta">2026-05-20 · 数据实时更新</span>
|
||||
</div>
|
||||
<div class="page-header-bar__right">
|
||||
<label>当前食堂</label>
|
||||
<select class="canteen-select" id="globalCanteen">
|
||||
<option value="1">一食堂(东区)</option>
|
||||
<option value="2">二食堂(西区)</option>
|
||||
<option value="3">三食堂(北区)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 筛选栏 -->
|
||||
<div class="filter-bar">
|
||||
<div class="filter-item"><label>员工姓名</label><input class="filter-input" type="text" placeholder="请输入姓名" style="min-width:120px;"></div>
|
||||
<div class="filter-item"><label>员工编号</label><input class="filter-input" type="text" placeholder="请输入编号" style="min-width:120px;"></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"><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></select></div>
|
||||
<div class="filter-item"><label>取餐方式</label><select class="filter-select"><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></select></div>
|
||||
<div class="filter-item"><label>人员类别</label><select class="filter-select"><option>全部</option><option>会员</option><option>非会员</option><option>员工</option><option>工作人员</option><option>外部人员</option></select></div>
|
||||
@@ -273,18 +298,18 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>就餐记录号</th><th>姓名</th><th>员工编号</th><th>单位</th><th>部门</th><th>餐次</th><th>取餐方式</th><th>取餐类型</th><th>人员类别</th><th>取餐开始时间</th><th>取餐结束时间</th><th>取餐总数量</th><th>营养评分</th><th>操作</th></tr>
|
||||
<tr><th>就餐记录号</th><th>姓名</th><th>员工编号</th><th>单位</th><th>部门</th><th>餐次</th><th>取餐方式</th><th>取餐类型</th><th>人员类别</th><th>取餐开始时间</th><th>取餐结束时间</th><th>取餐总数量</th><th>总金额</th><th>营养评分</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>M-20260428-001</td><td>张伟</td><td>EMP001</td><td>长庆油田</td><td>研发部</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:02</td><td>11:08</td><td><a class="link">3件</a></td><td><span class="tag tag-green">88分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-002</td><td>李娜</td><td>EMP002</td><td>长庆油田</td><td>市场部</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:08</td><td>11:14</td><td><a class="link">3件</a></td><td><span class="tag tag-green">92分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-003</td><td>王磊</td><td>EMP003</td><td>长庆油田</td><td>运营部</td><td>午餐</td><td><span class="tag tag-gray">餐线取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-gray">非会员</span></td><td>11:15</td><td>11:20</td><td><a class="link">2件</a></td><td><span class="tag tag-orange">68分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-004</td><td>赵敏</td><td>EMP004</td><td>长庆油田</td><td>财务部</td><td>午餐</td><td><span class="tag tag-green">档口+餐线</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:22</td><td>11:30</td><td><a class="link">3件</a></td><td><span class="tag tag-green">94分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-005</td><td>陈刚</td><td>EMP005</td><td>长庆油田</td><td>人事部</td><td>早餐</td><td><span class="tag tag-gray">餐线取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-gray">非会员</span></td><td>07:48</td><td>07:55</td><td><a class="link">3件</a></td><td><span class="tag tag-green">85分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-006</td><td>刘芳</td><td>EMP006</td><td>长庆油田</td><td>市场部</td><td>午餐</td><td><span class="tag tag-blue">外卖/外带</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:45</td><td>11:48</td><td><a class="link">2件</a></td><td><span class="tag tag-green">90分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>SP-001-001</td><td>张运维</td><td>EMP101</td><td>长庆油田</td><td>运维部</td><td>午餐</td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-blue">员工</span></td><td>14:05</td><td>14:06</td><td><a class="link">1件</a></td><td>—</td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>SP-001-003</td><td>王保安</td><td>—</td><td>长庆油田</td><td>安保部</td><td>午餐</td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-blue">工作人员</span></td><td>14:10</td><td>14:11</td><td><a class="link">1件</a></td><td>—</td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-007</td><td>林教授</td><td>—</td><td>外部单位</td><td>外部访客</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-purple">外部人员</span></td><td>12:10</td><td>12:18</td><td><a class="link">3件</a></td><td><span class="tag tag-green">86分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-001</td><td>张伟</td><td>EMP001</td><td>长庆油田</td><td>研发部</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:02</td><td>11:08</td><td><a class="link">3件</a></td><td>¥22.00</td><td><span class="tag tag-green">88分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-002</td><td>李娜</td><td>EMP002</td><td>长庆油田</td><td>市场部</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:08</td><td>11:14</td><td><a class="link">3件</a></td><td>¥18.00</td><td><span class="tag tag-green">92分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-003</td><td>王磊</td><td>EMP003</td><td>长庆油田</td><td>运营部</td><td>午餐</td><td><span class="tag tag-gray">餐线取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-gray">非会员</span></td><td>11:15</td><td>11:20</td><td><a class="link">2件</a></td><td>¥28.00</td><td><span class="tag tag-orange">68分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-004</td><td>赵敏</td><td>EMP004</td><td>长庆油田</td><td>财务部</td><td>午餐</td><td><span class="tag tag-green">档口+餐线</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:22</td><td>11:30</td><td><a class="link">3件</a></td><td>¥25.50</td><td><span class="tag tag-green">94分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-005</td><td>陈刚</td><td>EMP005</td><td>长庆油田</td><td>人事部</td><td>早餐</td><td><span class="tag tag-gray">餐线取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-gray">非会员</span></td><td>07:48</td><td>07:55</td><td><a class="link">3件</a></td><td>¥12.00</td><td><span class="tag tag-green">85分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-006</td><td>刘芳</td><td>EMP006</td><td>长庆油田</td><td>市场部</td><td>午餐</td><td><span class="tag tag-blue">外卖/外带</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-orange">会员</span></td><td>11:45</td><td>11:48</td><td><a class="link">2件</a></td><td>¥15.80</td><td><span class="tag tag-green">90分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>SP-001-001</td><td>张运维</td><td>EMP101</td><td>长庆油田</td><td>运维部</td><td>午餐</td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-blue">员工</span></td><td>14:05</td><td>14:06</td><td><a class="link">1件</a></td><td>¥5.00</td><td>—</td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>SP-001-003</td><td>王保安</td><td>—</td><td>长庆油田</td><td>安保部</td><td>午餐</td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-orange">余量取餐</span></td><td><span class="tag tag-blue">工作人员</span></td><td>14:10</td><td>14:11</td><td><a class="link">1件</a></td><td>¥5.00</td><td>—</td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
<tr><td>M-20260428-007</td><td>林教授</td><td>—</td><td>外部单位</td><td>外部访客</td><td>午餐</td><td><span class="tag tag-blue">点餐取餐</span></td><td><span class="tag tag-green">正常取餐</span></td><td><span class="tag tag-purple">外部人员</span></td><td>12:10</td><td>12:18</td><td><a class="link">3件</a></td><td>¥26.50</td><td><span class="tag tag-green">86分</span></td><td class="td-actions"><a class="link">查看用户信息</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -528,43 +553,43 @@ document.querySelectorAll('tbody tr').forEach(row => {
|
||||
/* ========== 取餐详情弹窗 ========== */
|
||||
const mealData = {
|
||||
'M-20260428-001': [
|
||||
{ name:'清炒生菜', type:'秤', weight:133.0, cal:24.6, carb:1.6, fat:1.4, protein:2.2 },
|
||||
{ name:'西红柿鸡蛋', type:'秤', weight:114.0, cal:94.5, carb:4.7, fat:5.1, protein:8.4 },
|
||||
{ name:'辣子鸡丁', type:'秤', weight:79.0, cal:92.5, carb:3.3, fat:4.6, protein:9.8 }
|
||||
{ name:'清炒生菜', type:'秤', weight:133.0, price:6.00, cal:24.6, carb:1.6, fat:1.4, protein:2.2 },
|
||||
{ name:'西红柿鸡蛋', type:'秤', weight:114.0, price:8.00, cal:94.5, carb:4.7, fat:5.1, protein:8.4 },
|
||||
{ name:'辣子鸡丁', type:'秤', weight:79.0, price:8.00, cal:92.5, carb:3.3, fat:4.6, protein:9.8 }
|
||||
],
|
||||
'M-20260428-002': [
|
||||
{ name:'藜麦沙拉', type:'秤', weight:150.0, cal:68.0, carb:12.5, fat:1.8, protein:3.2 },
|
||||
{ name:'清蒸鲈鱼', type:'秤', weight:120.0, cal:112.0, carb:0.5, fat:4.2, protein:18.6 },
|
||||
{ name:'蒜蓉西兰花', type:'秤', weight:95.0, cal:32.0, carb:4.1, fat:1.2, protein:2.8 }
|
||||
{ name:'藜麦沙拉', type:'秤', weight:150.0, price:6.00, cal:68.0, carb:12.5, fat:1.8, protein:3.2 },
|
||||
{ name:'清蒸鲈鱼', type:'秤', weight:120.0, price:8.00, cal:112.0, carb:0.5, fat:4.2, protein:18.6 },
|
||||
{ name:'蒜蓉西兰花', type:'秤', weight:95.0, price:4.00, cal:32.0, carb:4.1, fat:1.2, protein:2.8 }
|
||||
],
|
||||
'M-20260428-003': [
|
||||
{ name:'红烧肉', type:'秤', weight:85.0, cal:210.5, carb:5.2, fat:15.3, protein:12.1 },
|
||||
{ name:'米饭', type:'秤', weight:200.0, cal:232.0, carb:50.8, fat:0.6, protein:4.6 }
|
||||
{ name:'红烧肉', type:'秤', weight:85.0, price:16.00, cal:210.5, carb:5.2, fat:15.3, protein:12.1 },
|
||||
{ name:'米饭', type:'秤', weight:200.0, price:12.00, cal:232.0, carb:50.8, fat:0.6, protein:4.6 }
|
||||
],
|
||||
'M-20260428-004': [
|
||||
{ name:'宫保鸡丁', type:'秤', weight:110.0, cal:145.0, carb:8.2, fat:7.5, protein:12.3 },
|
||||
{ name:'番茄牛腩', type:'秤', weight:130.0, cal:125.0, carb:6.8, fat:5.2, protein:14.5 },
|
||||
{ name:'杂粮饭', type:'秤', weight:180.0, cal:198.0, carb:42.0, fat:1.2, protein:5.8 }
|
||||
{ name:'宫保鸡丁', type:'秤', weight:110.0, price:9.50, cal:145.0, carb:8.2, fat:7.5, protein:12.3 },
|
||||
{ name:'番茄牛腩', type:'秤', weight:130.0, price:10.00, cal:125.0, carb:6.8, fat:5.2, protein:14.5 },
|
||||
{ name:'杂粮饭', type:'秤', weight:180.0, price:6.00, cal:198.0, carb:42.0, fat:1.2, protein:5.8 }
|
||||
],
|
||||
'M-20260428-005': [
|
||||
{ name:'小米粥', type:'秤', weight:250.0, cal:115.0, carb:24.5, fat:0.8, protein:2.4 },
|
||||
{ name:'煎蛋', type:'秤', weight:60.0, cal:90.0, carb:0.6, fat:7.0, protein:6.3 },
|
||||
{ name:'全麦馒头', type:'秤', weight:80.0, cal:176.0, carb:35.2, fat:1.5, protein:6.8 }
|
||||
{ name:'小米粥', type:'秤', weight:250.0, price:4.00, cal:115.0, carb:24.5, fat:0.8, protein:2.4 },
|
||||
{ name:'煎蛋', type:'秤', weight:60.0, price:3.00, cal:90.0, carb:0.6, fat:7.0, protein:6.3 },
|
||||
{ name:'全麦馒头', type:'秤', weight:80.0, price:5.00, cal:176.0, carb:35.2, fat:1.5, protein:6.8 }
|
||||
],
|
||||
'M-20260428-006': [
|
||||
{ name:'鸡胸肉沙拉', type:'秤', weight:180.0, cal:145.0, carb:5.2, fat:3.8, protein:22.5 },
|
||||
{ name:'玉米浓汤', type:'秤', weight:200.0, cal:88.0, carb:16.0, fat:2.1, protein:2.8 }
|
||||
{ name:'鸡胸肉沙拉', type:'秤', weight:180.0, price:10.80, cal:145.0, carb:5.2, fat:3.8, protein:22.5 },
|
||||
{ name:'玉米浓汤', type:'秤', weight:200.0, price:5.00, cal:88.0, carb:16.0, fat:2.1, protein:2.8 }
|
||||
],
|
||||
'SP-001-001': [
|
||||
{ name:'余量套餐A', type:'秤', weight:220.0, cal:185.0, carb:28.0, fat:4.5, protein:9.2 }
|
||||
{ name:'余量套餐A', type:'秤', weight:220.0, price:5.00, cal:185.0, carb:28.0, fat:4.5, protein:9.2 }
|
||||
],
|
||||
'SP-001-003': [
|
||||
{ name:'余量套餐B', type:'秤', weight:195.0, cal:168.0, carb:25.5, fat:3.8, protein:8.5 }
|
||||
{ name:'余量套餐B', type:'秤', weight:195.0, price:5.00, cal:168.0, carb:25.5, fat:3.8, protein:8.5 }
|
||||
],
|
||||
'M-20260428-007': [
|
||||
{ name:'糖醋里脊', type:'秤', weight:95.0, cal:178.0, carb:14.2, fat:8.5, protein:11.8 },
|
||||
{ name:'蛋花汤', type:'秤', weight:200.0, cal:35.0, carb:1.2, fat:1.5, protein:3.8 },
|
||||
{ name:'米饭', type:'秤', weight:180.0, cal:208.8, carb:45.7, fat:0.5, protein:4.1 }
|
||||
{ name:'糖醋里脊', type:'秤', weight:95.0, price:12.00, cal:178.0, carb:14.2, fat:8.5, protein:11.8 },
|
||||
{ name:'蛋花汤', type:'秤', weight:200.0, price:5.50, cal:35.0, carb:1.2, fat:1.5, protein:3.8 },
|
||||
{ name:'米饭', type:'秤', weight:180.0, price:9.00, cal:208.8, carb:45.7, fat:0.5, protein:4.1 }
|
||||
]
|
||||
};
|
||||
|
||||
@@ -583,6 +608,7 @@ function showMealDetail(row) {
|
||||
|
||||
const items = mealData[recordId] || [];
|
||||
const totalWeight = items.reduce((s, i) => s + i.weight, 0);
|
||||
const totalPrice = items.reduce((s, i) => s + i.price, 0);
|
||||
const totalCal = items.reduce((s, i) => s + i.cal, 0);
|
||||
const totalCarb = items.reduce((s, i) => s + i.carb, 0);
|
||||
const totalFat = items.reduce((s, i) => s + i.fat, 0);
|
||||
@@ -605,6 +631,7 @@ function showMealDetail(row) {
|
||||
|
||||
const tableRows = items.map(i => `<tr>
|
||||
<td>${i.name}</td>
|
||||
<td>¥${i.price.toFixed(2)}</td>
|
||||
<td>${i.weight.toFixed(1)}</td>
|
||||
<td>${i.cal.toFixed(1)}</td>
|
||||
<td>${i.carb.toFixed(1)}</td>
|
||||
@@ -614,6 +641,7 @@ function showMealDetail(row) {
|
||||
|
||||
const summaryRow = `<tr>
|
||||
<td>合计</td>
|
||||
<td>¥${totalPrice.toFixed(2)}</td>
|
||||
<td>${totalWeight.toFixed(1)}克</td>
|
||||
<td>${totalCal.toFixed(1)}千卡</td>
|
||||
<td>${totalCarb.toFixed(1)}克</td>
|
||||
@@ -624,7 +652,7 @@ function showMealDetail(row) {
|
||||
const tableHtml = `<div class="meal-section">
|
||||
<div class="meal-section__title">餐品列表</div>
|
||||
<table class="meal-table">
|
||||
<thead><tr><th>餐品名称</th><th>重量(克)</th><th>热量(千卡)</th><th>碳水化合物(克)</th><th>脂肪(克)</th><th>蛋白质(克)</th></tr></thead>
|
||||
<thead><tr><th>餐品名称</th><th>金额</th><th>重量(克)</th><th>热量(千卡)</th><th>碳水化合物(克)</th><th>脂肪(克)</th><th>蛋白质(克)</th></tr></thead>
|
||||
<tbody>${tableRows}${summaryRow}</tbody>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
@@ -259,6 +259,47 @@ tbody td.td-actions{overflow:visible;}
|
||||
.face-upload__preview{display:none;width:280px;text-align:center;}
|
||||
.face-upload__preview img{width:160px;height:160px;border-radius:50%;object-fit:cover;border:3px solid var(--primary);margin-bottom:12px;}
|
||||
.face-upload__preview-actions{display:flex;gap:8px;justify-content:center;}
|
||||
/* 新增用户表单 */
|
||||
.add-user-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:1000;display:none;align-items:center;justify-content:center;animation:modalFadeIn .2s ease;}
|
||||
.add-user-overlay.show{display:flex;}
|
||||
.add-user-modal{background:#fff;border-radius:8px;width:640px;max-height:85vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,.15);animation:modalSlideIn .25s ease;}
|
||||
.add-user-modal .modal-body{overflow-y:auto;}
|
||||
.add-form-row{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px;}
|
||||
.add-form-item{display:flex;flex-direction:column;gap:6px;}
|
||||
.add-form-item label{font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;}
|
||||
.add-form-item label .req{color:var(--danger);margin-left:2px;}
|
||||
.add-form-item input,.add-form-item select{height:36px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font-size:var(--font-sm);outline:none;background:#fff;width:100%;}
|
||||
.add-form-item input:focus,.add-form-item select:focus{border-color:var(--primary);}
|
||||
.add-form-item select{padding-right:28px;appearance: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;cursor:pointer;}
|
||||
/* Toast */
|
||||
.toast{position:fixed;top:80px;left:50%;transform:translateX(-50%) translateY(-20px);background:rgba(0,0,0,0.75);color:#fff;padding:10px 24px;border-radius:var(--radius-md);font-size:var(--font-sm);opacity:0;pointer-events:none;transition:all .3s;z-index:2000;}
|
||||
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}
|
||||
/* 开通会员弹窗 */
|
||||
.vip-search-wrap{position:relative;margin-bottom:20px;}
|
||||
.vip-search-wrap input{width:100%;height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px 0 36px;font-size:var(--font-sm);outline:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none'%3E%3Ccircle cx='6' cy='6' r='4.5' stroke='%23999' stroke-width='1.2'/%3E%3Cpath d='M9.5 9.5L12.5 12.5' stroke='%23999' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat 12px center;}
|
||||
.vip-search-wrap input:focus{border-color:var(--primary);}
|
||||
.vip-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);max-height:240px;overflow-y:auto;z-index:50;display:none;}
|
||||
.vip-dropdown.show{display:block;}
|
||||
.vip-dropdown__item{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;padding:10px 16px;cursor:pointer;font-size:var(--font-sm);border-bottom:1px solid #f5f5f5;transition:background .1s;}
|
||||
.vip-dropdown__item:last-child{border-bottom:none;}
|
||||
.vip-dropdown__item:hover{background:#F8FBFF;}
|
||||
.vip-dropdown__item.selected{background:var(--primary-light);}
|
||||
.vip-dropdown__head{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;padding:8px 16px;font-size:var(--font-xs);color:var(--text-placeholder);border-bottom:1px solid var(--border);}
|
||||
.vip-user-card{background:#f8fafc;border-radius:var(--radius-md);padding:16px 20px;display:none;gap:16px;align-items:center;}
|
||||
.vip-user-card.show{display:flex;}
|
||||
.vip-user-card__avatar{width:48px;height:48px;border-radius:50%;background:var(--primary);display:flex;align-items:center;justify-content:center;color:#fff;font-size:20px;font-weight:600;flex-shrink:0;}
|
||||
.vip-user-card__info{display:flex;flex-direction:column;gap:4px;flex:1;}
|
||||
.vip-user-card__name{font-size:var(--font-base);font-weight:600;color:var(--text-primary);}
|
||||
.vip-user-card__meta{font-size:var(--font-sm);color:var(--text-secondary);}
|
||||
.modal.vip-modal{width:560px;min-height:360px;}
|
||||
.modal.level-modal{width:600px;}
|
||||
.add-form-item textarea{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 12px;font-size:var(--font-sm);outline:none;resize:vertical;min-height:60px;font-family:inherit;}
|
||||
.add-form-item textarea:focus{border-color:var(--primary);}
|
||||
.level-detail{display:grid;grid-template-columns:1fr 1fr;gap:16px 24px;}
|
||||
.level-detail__item{display:flex;flex-direction:column;gap:4px;}
|
||||
.level-detail__item.full{grid-column:1/-1;}
|
||||
.level-detail__label{font-size:var(--font-xs);color:var(--text-secondary);}
|
||||
.level-detail__value{font-size:var(--font-sm);color:var(--text-primary);}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -391,7 +432,7 @@ tbody td.td-actions{overflow:visible;}
|
||||
<div class="filter-item"><label>员工/用户编号</label><input class="filter-input" type="text" placeholder="请输入编号" style="min-width:140px;"></div>
|
||||
<div class="filter-item"><label>单位部门</label><div class="cascader" id="cascaderDept"><div class="cascader__trigger" onclick="toggleCascader()"><span class="cascader__text">全部</span><span class="cascader__arrow">▾</span></div><div class="cascader__panel"><div class="cascader__col cascader__col--left" id="cascaderLeft"></div><div class="cascader__col cascader__col--right" id="cascaderRight"></div></div></div></div>
|
||||
<div class="filter-item"><label>活动水平</label><select class="filter-select"><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></select></div>
|
||||
<div class="filter-item"><label>人员类别</label><select class="filter-select"><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></select></div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
@@ -411,14 +452,14 @@ tbody td.td-actions{overflow:visible;}
|
||||
<tr><th>姓名</th><th>员工/用户编号</th><th>性别</th><th>年龄</th><th>单位部门</th><th>BMI</th><th>活动水平</th><th>人员类别</th><th>饮食禁忌</th><th>状态</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>张伟</td><td>EMP003</td><td>男</td><td>38</td><td>—</td><td>22.9</td><td>中度活动</td><td><span class="tag tag-orange">会员</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>李娜</td><td>EMP001</td><td>女</td><td>34</td><td>—</td><td>19.8</td><td>轻度活动</td><td><span class="tag tag-orange">会员</span></td><td><span class="tag tag-red">高钠</span></td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>王磊</td><td>EMP002</td><td>男</td><td>41</td><td>—</td><td>26.8</td><td>久坐</td><td><span class="tag tag-gray">非会员</span></td><td><span class="tag tag-red">高脂</span></td><td><span class="tag tag-orange">预警</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>赵敏</td><td>EMP004</td><td>女</td><td>36</td><td>—</td><td>18.8</td><td>轻度活动</td><td><span class="tag tag-orange">会员</span></td><td><span class="tag tag-red">高糖</span></td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>陈刚</td><td>EMP005</td><td>男</td><td>29</td><td>—</td><td>21.4</td><td>重度活动</td><td><span class="tag tag-gray">非会员</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>刘芳</td><td>EMP006</td><td>女</td><td>32</td><td>—</td><td>20.6</td><td>中度活动</td><td><span class="tag tag-orange">会员</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>孙磊</td><td>EMP007</td><td>男</td><td>45</td><td>—</td><td>24.3</td><td>久坐</td><td><span class="tag tag-gray">非会员</span></td><td><span class="tag tag-red">高钠</span></td><td><span class="tag tag-orange">预警</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>钱芳</td><td>EMP008</td><td>女</td><td>27</td><td>—</td><td>17.9</td><td>轻度活动</td><td><span class="tag tag-orange">会员</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>张伟</td><td>EMP003</td><td>男</td><td>38</td><td>—</td><td>22.9</td><td>中度活动</td><td><span class="tag tag-orange">会员用户</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>李娜</td><td>EMP001</td><td>女</td><td>34</td><td>—</td><td>19.8</td><td>轻度活动</td><td><span class="tag tag-orange">会员用户</span></td><td><span class="tag tag-red">高钠</span></td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>王磊</td><td>EMP002</td><td>男</td><td>41</td><td>—</td><td>26.8</td><td>久坐</td><td><span class="tag tag-gray">普通用户</span></td><td><span class="tag tag-red">高脂</span></td><td><span class="tag tag-orange">预警</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>赵敏</td><td>EMP004</td><td>女</td><td>36</td><td>—</td><td>18.8</td><td>轻度活动</td><td><span class="tag tag-orange">会员用户</span></td><td><span class="tag tag-red">高糖</span></td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>陈刚</td><td>EMP005</td><td>男</td><td>29</td><td>—</td><td>21.4</td><td>重度活动</td><td><span class="tag tag-gray">普通用户</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>刘芳</td><td>EMP006</td><td>女</td><td>32</td><td>—</td><td>20.6</td><td>中度活动</td><td><span class="tag tag-orange">会员用户</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>孙磊</td><td>EMP007</td><td>男</td><td>45</td><td>—</td><td>24.3</td><td>久坐</td><td><span class="tag tag-gray">普通用户</span></td><td><span class="tag tag-red">高钠</span></td><td><span class="tag tag-orange">预警</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>钱芳</td><td>EMP008</td><td>女</td><td>27</td><td>—</td><td>17.9</td><td>轻度活动</td><td><span class="tag tag-orange">会员用户</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>张运维</td><td>EMP009</td><td>男</td><td>35</td><td>总部机关/运维部</td><td>23.5</td><td>中度活动</td><td><span class="tag tag-blue">员工</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>李后勤</td><td>EMP010</td><td>男</td><td>42</td><td>总部机关/后勤部</td><td>25.1</td><td>中度活动</td><td><span class="tag tag-blue">员工</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
<tr><td>王保安</td><td>WK003</td><td>男</td><td>48</td><td>—</td><td>24.8</td><td>重度活动</td><td><span class="tag tag-blue">工作人员</span></td><td>无</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link" data-action="detail">详情</a> <a class="link" data-action="edit">编辑</a> <span class="more-wrap"><a class="link" data-action="more">更多 ▾</a><div class="more-tip"><a class="more-tip__item" data-action="recipe">推荐食谱</a><a class="more-tip__item" data-action="face">人脸采集</a><a class="more-tip__item more-tip__item--danger" data-action="delete">删除</a></div></span></td></tr>
|
||||
@@ -446,16 +487,16 @@ tbody td.td-actions{overflow:visible;}
|
||||
<!-- Tab3: 会员账户 -->
|
||||
<div class="tab-panel">
|
||||
<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="请输入姓名" style="min-width:140px;"></div>
|
||||
<div class="filter-item"><label>用户编号</label><input class="filter-input" type="text" placeholder="请输入用户编号" style="min-width:140px;"></div>
|
||||
<div class="filter-item"><label>会员卡号</label><input class="filter-input" type="text" placeholder="请输入会员卡号" style="min-width:140px;"></div>
|
||||
<div class="filter-item"><label>会员等级</label><select class="filter-select"><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"><option>全部</option><option>研发部</option><option>市场部</option><option>运营部</option><option>财务部</option></select></div>
|
||||
<button class="btn btn-primary">查询</button>
|
||||
<button class="btn btn-default">重置</button>
|
||||
</div>
|
||||
<div class="action-bar">
|
||||
<!-- 开通会员:后续用独立二级页面实现 --><button class="btn btn-primary">➕ 开通会员</button>
|
||||
<button class="btn btn-default">⬆ 批量升级</button>
|
||||
<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>
|
||||
@@ -466,15 +507,15 @@ tbody td.td-actions{overflow:visible;}
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>会员卡号</th><th>姓名/工号</th><th>部门</th><th>会员等级</th><th>当前积分</th><th>累计消费(元)</th><th>本月消费</th><th>开通日期</th><th>有效期至</th><th>最近活跃</th><th>会员状态</th><th>操作</th></tr>
|
||||
<tr><th>会员卡号</th><th>姓名</th><th>用户编号</th><th>会员等级</th><th>当前积分</th><th>累计消费(元)</th><th>本月消费</th><th>开通日期</th><th>有效期至</th><th>最近活跃</th><th>会员状态</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>MB-202401-001</td><td>张伟(EMP001)</td><td>研发部</td><td><span class="tag tag-red">钻石</span></td><td>8,628</td><td>12,860</td><td>¥1,286</td><td>2024-01-15</td><td>2027-01-14</td><td>2026-04-28 11:32</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202405-008</td><td>李娜(EMP002)</td><td>市场部</td><td><span class="tag tag-orange">金卡</span></td><td>3,286</td><td>4,820</td><td>¥682</td><td>2024-05-08</td><td>2027-05-07</td><td>2026-04-28 12:08</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202508-015</td><td>赵敏(EMP004)</td><td>财务部</td><td><span class="tag tag-blue">银卡</span></td><td>1,420</td><td>2,180</td><td>¥486</td><td>2025-08-12</td><td>2027-08-11</td><td>2026-04-28 11:30</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202510-026</td><td>刘芳(EMP006)</td><td>市场部</td><td><span class="tag tag-blue">银卡</span></td><td>986</td><td>1,520</td><td>¥320</td><td>2025-10-20</td><td>2027-10-19</td><td>2026-04-28 11:48</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202312-003</td><td>孙磊(EMP010)</td><td>研发部</td><td><span class="tag tag-orange">金卡</span></td><td>5,120</td><td>7,860</td><td>¥0</td><td>2023-12-08</td><td>2026-12-07</td><td>2026-04-15 12:20</td><td><span class="tag tag-orange">即将到期</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202402-005</td><td>周明(EMP008)</td><td>运营部</td><td><span class="tag tag-red">钻石</span></td><td>12,486</td><td>16,820</td><td>¥0</td><td>2024-02-10</td><td>2027-02-09</td><td>2026-03-28 12:15</td><td><span class="tag tag-gray">休眠</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202401-001</td><td>张伟</td><td>EMP001</td><td><span class="tag tag-red">钻石</span></td><td>8,628</td><td>12,860</td><td>¥1,286</td><td>2024-01-15</td><td>2027-01-14</td><td>2026-04-28 11:32</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202405-008</td><td>李娜</td><td>EMP002</td><td><span class="tag tag-orange">金卡</span></td><td>3,286</td><td>4,820</td><td>¥682</td><td>2024-05-08</td><td>2027-05-07</td><td>2026-04-28 12:08</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202508-015</td><td>赵敏</td><td>EMP004</td><td><span class="tag tag-blue">银卡</span></td><td>1,420</td><td>2,180</td><td>¥486</td><td>2025-08-12</td><td>2027-08-11</td><td>2026-04-28 11:30</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202510-026</td><td>刘芳</td><td>EMP006</td><td><span class="tag tag-blue">银卡</span></td><td>986</td><td>1,520</td><td>¥320</td><td>2025-10-20</td><td>2027-10-19</td><td>2026-04-28 11:48</td><td><span class="tag tag-green">正常</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202312-003</td><td>孙磊</td><td>EMP010</td><td><span class="tag tag-orange">金卡</span></td><td>5,120</td><td>7,860</td><td>¥0</td><td>2023-12-08</td><td>2026-12-07</td><td>2026-04-15 12:20</td><td><span class="tag tag-orange">即将到期</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>MB-202402-005</td><td>周明</td><td>EMP008</td><td><span class="tag tag-red">钻石</span></td><td>12,486</td><td>16,820</td><td>¥0</td><td>2024-02-10</td><td>2027-02-09</td><td>2026-03-28 12:15</td><td><span class="tag tag-gray">休眠</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -499,7 +540,7 @@ tbody td.td-actions{overflow:visible;}
|
||||
</div>
|
||||
<div class="action-bar">
|
||||
<!-- 新增等级:后续用独立二级页面实现 --><button class="btn btn-primary">➕ 新增等级</button>
|
||||
<button class="btn btn-default">✏️ 调整权益</button>
|
||||
|
||||
</div>
|
||||
<div class="table-card">
|
||||
<div class="table-card__header">
|
||||
@@ -511,10 +552,10 @@ tbody td.td-actions{overflow:visible;}
|
||||
<tr><th>等级编号</th><th>等级名称</th><th>升级条件(累计消费)</th><th>积分倍数</th><th>点餐折扣</th><th>取餐特权</th><th>专属权益</th><th>当前人数</th><th>状态</th><th>操作</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>LV-01</td><td><span class="tag tag-gray">普通会员</span></td><td>注册即可</td><td>1.0x</td><td>无折扣</td><td>常规</td><td>基础点餐功能</td><td>794</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>LV-02</td><td><span class="tag tag-blue">银卡会员</span></td><td>累计消费 ¥1,000+</td><td>1.2x</td><td>9.8折</td><td>常规</td><td>生日券 ¥10、月度营养报告</td><td>186</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>LV-03</td><td><span class="tag tag-orange">金卡会员</span></td><td>累计消费 ¥3,000+</td><td>1.5x</td><td>9.5折</td><td>优先取餐</td><td>生日券 ¥30、AI营养周报、专属客服</td><td>218</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>LV-04</td><td><span class="tag tag-red">钻石会员</span></td><td>累计消费 ¥10,000+</td><td>2.0x</td><td>9.0折</td><td>专属窗口</td><td>专属营养师、VIP定制菜单、季度体检券</td><td>82</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link">查看</a> <a class="link">编辑</a></td></tr>
|
||||
<tr><td>LV-01</td><td><span class="tag tag-gray">普通会员</span></td><td>注册即可</td><td>1.0x</td><td>无折扣</td><td>常规</td><td>基础点餐功能</td><td>794</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link" onclick="viewLevel(0)">查看</a> <a class="link" onclick="editLevel(0)">编辑</a></td></tr>
|
||||
<tr><td>LV-02</td><td><span class="tag tag-blue">银卡会员</span></td><td>累计消费 ¥1,000+</td><td>1.2x</td><td>9.8折</td><td>常规</td><td>生日券 ¥10、月度营养报告</td><td>186</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link" onclick="viewLevel(1)">查看</a> <a class="link" onclick="editLevel(1)">编辑</a></td></tr>
|
||||
<tr><td>LV-03</td><td><span class="tag tag-orange">金卡会员</span></td><td>累计消费 ¥3,000+</td><td>1.5x</td><td>9.5折</td><td>优先取餐</td><td>生日券 ¥30、AI营养周报、专属客服</td><td>218</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link" onclick="viewLevel(2)">查看</a> <a class="link" onclick="editLevel(2)">编辑</a></td></tr>
|
||||
<tr><td>LV-04</td><td><span class="tag tag-red">钻石会员</span></td><td>累计消费 ¥10,000+</td><td>2.0x</td><td>9.0折</td><td>专属窗口</td><td>专属营养师、VIP定制菜单、季度体检券</td><td>82</td><td><span class="tag tag-green">启用</span></td><td class="td-actions"><a class="link" onclick="viewLevel(3)">查看</a> <a class="link" onclick="editLevel(3)">编辑</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -527,6 +568,83 @@ tbody td.td-actions{overflow:visible;}
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 新增用户弹窗 -->
|
||||
<div class="add-user-overlay" id="addUserOverlay">
|
||||
<div class="add-user-modal">
|
||||
<div class="modal-header">
|
||||
<div class="modal-title">新增用户</div>
|
||||
<button class="modal-close" onclick="closeAddUser()">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item">
|
||||
<label>姓名<span class="req">*</span></label>
|
||||
<input type="text" placeholder="请输入姓名">
|
||||
</div>
|
||||
<div class="add-form-item">
|
||||
<label>性别<span class="req">*</span></label>
|
||||
<select>
|
||||
<option value="">请选择</option>
|
||||
<option>男</option>
|
||||
<option>女</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item">
|
||||
<label>年龄<span class="req">*</span></label>
|
||||
<input type="number" placeholder="请输入年龄" min="1" max="150">
|
||||
</div>
|
||||
<div class="add-form-item">
|
||||
<label>身份证号</label>
|
||||
<input type="text" placeholder="请输入身份证号">
|
||||
</div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item">
|
||||
<label>手机号码<span class="req">*</span></label>
|
||||
<input type="tel" placeholder="请输入手机号码">
|
||||
</div>
|
||||
<div class="add-form-item">
|
||||
<label>身高(cm)</label>
|
||||
<input type="number" placeholder="请输入身高" min="50" max="250">
|
||||
</div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item">
|
||||
<label>体重(kg)</label>
|
||||
<input type="number" placeholder="请输入体重" min="10" max="300">
|
||||
</div>
|
||||
<div class="add-form-item">
|
||||
<label>活动水平</label>
|
||||
<select>
|
||||
<option value="">请选择</option>
|
||||
<option>久坐</option>
|
||||
<option>轻度活动</option>
|
||||
<option>中度活动</option>
|
||||
<option>重度活动</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item">
|
||||
<label>人员类别<span class="req">*</span></label>
|
||||
<select>
|
||||
<option value="">请选择</option>
|
||||
<option>普通用户</option>
|
||||
<option>工作人员</option>
|
||||
<option>外部人员</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-default" onclick="closeAddUser()">取消</button>
|
||||
<button class="btn btn-primary" onclick="confirmAddUser()">确认新增</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 交互脚本 -->
|
||||
<script>
|
||||
function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
|
||||
@@ -615,7 +733,7 @@ const Modal = {
|
||||
|
||||
/* ========== 十维档案 ========== */
|
||||
const userProfiles = {
|
||||
'张伟': { dept:'公司机关/研发部', age:38, gender:'男', height:'175cm', weight:'72kg', bmi:'22.9', activity:'中度活动',
|
||||
'张伟': { dept:'公司机关/研发部', age:38, gender:'男', height:'175cm', weight:'72kg', bmi:'22.9', activity:'中度活动', category:'会员用户',
|
||||
disease:'无', chronic:'无', medicine:'无', family:'高血压(父)',
|
||||
examDate:'2026-03-15', bp:'125/80', glucose:'5.2', lipid:'正常', uric:'380', liver:'正常', kidney:'正常',
|
||||
taste:'偏辣', region:'川菜、湘菜', taboo:'无', allergy:'花生',
|
||||
@@ -634,7 +752,7 @@ const userProfiles = {
|
||||
favDish:'宫保鸡丁、清炒西兰花、杂粮饭', recDish:'三文鱼沙拉、蒜蓉菠菜', avoidDish:'油炸花生', topRate:'宫保鸡丁(94分)', repurchase:'宫保鸡丁(近30日18次)',
|
||||
hometown:'四川成都', momTag:'麻辣、红油、鲜香', momList:'回锅肉、麻婆豆腐、水煮鱼', memory:'从小常吃妈妈做的回锅肉,奠定了麻辣口味偏好。', recTry:'川味水煮鱼套餐(已上架一号食堂)',
|
||||
modelVer:'v2.3', modelTime:'2026-04-20', recCal:'2,250 kcal', nutriFocus:'蛋白质+膳食纤维', risk:'无风险', tags:'清淡偏好、中度活动、无慢病', confidence:'94%', nextUpdate:'2026-05-28' },
|
||||
'李娜': { dept:'市场部', age:34, gender:'女', height:'163cm', weight:'52kg', bmi:'19.8', activity:'轻度活动',
|
||||
'李娜': { dept:'市场部', age:34, gender:'女', height:'163cm', weight:'52kg', bmi:'19.8', activity:'轻度活动', category:'会员用户',
|
||||
disease:'无', chronic:'无', medicine:'无', family:'糖尿病(母)',
|
||||
examDate:'2026-02-20', bp:'110/70', glucose:'4.8', lipid:'正常', uric:'290', liver:'正常', kidney:'正常',
|
||||
taste:'清淡', region:'粤菜、日料', taboo:'无', allergy:'海鲜(虾蟹)',
|
||||
@@ -654,7 +772,7 @@ const userProfiles = {
|
||||
hometown:'广东广州', momTag:'清炖、甜咸适中、河鲜', momList:'松鼠桂鱼、响油鳝糊、腌笃鲜', memory:'从小常吃妈妈做的清炖鱼,奠定了清淡口味偏好。', recTry:'苏式清蒸鱼套餐(已上架二号食堂)',
|
||||
modelVer:'v2.3', modelTime:'2026-04-18', recCal:'1,650 kcal', nutriFocus:'钙+铁+维生素D', risk:'注意糖摄入', tags:'轻食主义、养生达人、低糖饮食', confidence:'95%', nextUpdate:'2026-05-28' }
|
||||
};
|
||||
const defaultProfile = { dept:'—', age:30, gender:'—', height:'170cm', weight:'65kg', bmi:'22.5', activity:'中等',
|
||||
const defaultProfile = { dept:'—', age:30, gender:'—', height:'170cm', weight:'65kg', bmi:'22.5', activity:'中等', category:'普通用户',
|
||||
disease:'无', chronic:'无', medicine:'无', family:'无',
|
||||
examDate:'2026-01-10', bp:'120/78', glucose:'5.0', lipid:'正常', uric:'350', liver:'正常', kidney:'正常',
|
||||
taste:'适中', region:'不限', taboo:'无', allergy:'无',
|
||||
@@ -774,7 +892,8 @@ function buildProfileHTML(name, p) {
|
||||
};
|
||||
const tabs = tabDefs.map((t, i) => `<div class="profile-tab${i===0?' active':''}" onclick="switchProfileTab(this,'${t.key}')">${t.label}</div>`).join('');
|
||||
const panelsHtml = tabDefs.map((t, i) => `<div class="profile-panel${i===0?' active':''}" data-panel="${t.key}">${panels[t.key]}</div>`).join('');
|
||||
const summary = `<div class="profile-summary"><div class="profile-summary__avatar">${name[0]}</div><div class="profile-summary__info"><div class="profile-summary__name">${name}</div><div class="profile-summary__meta">${p.dept} · ${p.gender} · ${p.age}岁 · BMI ${p.bmi}</div></div></div>`;
|
||||
const catColor = {'会员用户':'tag-orange','普通用户':'tag-gray','员工':'tag-blue','工作人员':'tag-blue','外部人员':'tag-purple'}[p.category]||'tag-gray';
|
||||
const summary = `<div class="profile-summary"><div class="profile-summary__avatar">${name[0]}</div><div class="profile-summary__info"><div class="profile-summary__name">${name}</div><div class="profile-summary__meta">${p.dept} · ${p.gender} · ${p.age}岁 · BMI ${p.bmi}</div></div><div style="margin-left:auto;"><span class="tag ${catColor}">${p.category}</span></div></div>`;
|
||||
return summary + `<div class="profile-tabs">${tabs}</div>${panelsHtml}`;
|
||||
}
|
||||
|
||||
@@ -845,7 +964,17 @@ document.querySelectorAll('.tab-panel')[0].querySelectorAll('tbody tr').forEach(
|
||||
if (detailLink) detailLink.addEventListener('click', () => showUserProfile(name));
|
||||
// 编辑
|
||||
const editLink = row.querySelector('[data-action="edit"]');
|
||||
if (editLink) editLink.addEventListener('click', () => { Modal.open('编辑用户 — '+name, '<div style="padding:20px;text-align:center;color:var(--text-placeholder);">编辑表单(原型占位)</div>', '', '<button class="btn btn-default" onclick="Modal.close()">取消</button><button class="btn btn-primary" onclick="Modal.close()">保存</button>'); });
|
||||
if (editLink) {
|
||||
var catTag = row.querySelectorAll('td')[7].querySelector('.tag');
|
||||
var catText = catTag ? catTag.textContent : '';
|
||||
if (catText === '员工') {
|
||||
editLink.style.color = '#ccc';
|
||||
editLink.style.cursor = 'not-allowed';
|
||||
editLink.style.pointerEvents = 'none';
|
||||
} else {
|
||||
editLink.addEventListener('click', () => { showEditUser(row); });
|
||||
}
|
||||
}
|
||||
// 更多按钮
|
||||
const moreLink = row.querySelector('[data-action="more"]');
|
||||
if (moreLink) {
|
||||
@@ -1001,6 +1130,215 @@ function closeAllMoreTips() {
|
||||
document.querySelectorAll('body > .more-tip').forEach(t => { t.style.display = 'none'; });
|
||||
}
|
||||
document.addEventListener('click', closeAllMoreTips);
|
||||
|
||||
/* ========== 编辑用户弹窗 ========== */
|
||||
function showEditUser(row) {
|
||||
var tds = row.querySelectorAll('td');
|
||||
var name = tds[0].textContent;
|
||||
var gender = tds[2].textContent;
|
||||
var age = tds[3].textContent;
|
||||
var activity = tds[6].textContent;
|
||||
var catEl = tds[7].querySelector('.tag');
|
||||
var category = catEl ? catEl.textContent : '';
|
||||
// 从 userProfiles 获取更多数据
|
||||
var p = userProfiles[name] || defaultProfile;
|
||||
var heightVal = p.height ? p.height.replace('cm','') : '';
|
||||
var weightVal = p.weight ? p.weight.replace('kg','') : '';
|
||||
|
||||
function selOpt(options, val) {
|
||||
return options.map(function(o){ return '<option'+(o===val?' selected':'')+'>'+o+'</option>'; }).join('');
|
||||
}
|
||||
|
||||
var html = `<div class="add-form-row">
|
||||
<div class="add-form-item"><label>姓名<span class="req">*</span></label><input type="text" value="${name}"></div>
|
||||
<div class="add-form-item"><label>性别<span class="req">*</span></label><select><option value="">请选择</option>${selOpt(['男','女'], gender)}</select></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>年龄<span class="req">*</span></label><input type="number" value="${age}" min="1" max="150"></div>
|
||||
<div class="add-form-item"><label>身份证号</label><input type="text" placeholder="请输入身份证号"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>手机号码<span class="req">*</span></label><input type="tel" placeholder="请输入手机号码"></div>
|
||||
<div class="add-form-item"><label>身高(cm)</label><input type="number" value="${heightVal}" min="50" max="250"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>体重(kg)</label><input type="number" value="${weightVal}" min="10" max="300"></div>
|
||||
<div class="add-form-item"><label>活动水平</label><select><option value="">请选择</option>${selOpt(['久坐','轻度活动','中度活动','重度活动'], activity)}</select></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>人员类别<span class="req">*</span></label><select><option value="">请选择</option>${selOpt(['普通用户','工作人员','外部人员'], category)}</select></div>
|
||||
</div>`;
|
||||
|
||||
Modal.open('编辑用户 — '+name, html, '', '<button class="btn btn-default" onclick="Modal.close()">取消</button><button class="btn btn-primary" onclick="Modal.close()">保存</button>');
|
||||
}
|
||||
|
||||
/* ========== 新增用户弹窗 ========== */
|
||||
function openAddUser(){document.getElementById('addUserOverlay').classList.add('show');}
|
||||
function closeAddUser(){document.getElementById('addUserOverlay').classList.remove('show');}
|
||||
function confirmAddUser(){closeAddUser();}
|
||||
document.getElementById('addUserOverlay').addEventListener('click',function(e){if(e.target===this)closeAddUser();});
|
||||
// 绑定新增用户按钮
|
||||
document.querySelectorAll('.action-bar .btn-primary').forEach(function(btn){
|
||||
if(btn.textContent.trim().indexOf('新增用户')>-1) btn.addEventListener('click', openAddUser);
|
||||
});
|
||||
|
||||
/* ========== Toast ========== */
|
||||
function showToast(msg){var el=document.getElementById('toast');el.textContent=msg;el.classList.add('show');setTimeout(function(){el.classList.remove('show');},2000);}
|
||||
|
||||
/* ========== 开通会员弹窗 ========== */
|
||||
var VIP_USERS=[
|
||||
{name:'王磊',code:'EMP002',points:0,spend:'0'},
|
||||
{name:'陈刚',code:'EMP005',points:0,spend:'0'},
|
||||
{name:'孙磊',code:'EMP007',points:0,spend:'0'},
|
||||
{name:'钱芳',code:'EMP008',points:0,spend:'0'},
|
||||
{name:'张运维',code:'EMP009',points:120,spend:'860'},
|
||||
{name:'李后勤',code:'EMP010',points:80,spend:'520'},
|
||||
{name:'王保安',code:'WK003',points:0,spend:'0'},
|
||||
{name:'赵清洁',code:'WK004',points:0,spend:'0'},
|
||||
{name:'林教授',code:'EXT001',points:0,spend:'0'}
|
||||
];
|
||||
var vipSelectedUser=null;
|
||||
|
||||
function openVipModal(){
|
||||
vipSelectedUser=null;
|
||||
var html=`<div class="vip-search-wrap">
|
||||
<input type="text" id="vipSearchInput" placeholder="搜索用户姓名或编号..." autocomplete="off">
|
||||
<div class="vip-dropdown" id="vipDropdown">
|
||||
<div class="vip-dropdown__head"><span>姓名</span><span>编号</span><span>当前积分</span><span>累计消费</span></div>
|
||||
<div id="vipDropdownList"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="vip-user-card" id="vipUserCard">
|
||||
<div class="vip-user-card__avatar" id="vipCardAvatar"></div>
|
||||
<div class="vip-user-card__info">
|
||||
<div class="vip-user-card__name" id="vipCardName"></div>
|
||||
<div class="vip-user-card__meta" id="vipCardMeta"></div>
|
||||
</div>
|
||||
</div>`;
|
||||
Modal.open('开通会员', html, 'vip-modal', '<button class="btn btn-default" onclick="Modal.close()">取消</button><button class="btn btn-primary" onclick="confirmOpenVip()">确定</button>');
|
||||
setTimeout(function(){
|
||||
var input=document.getElementById('vipSearchInput');
|
||||
var dropdown=document.getElementById('vipDropdown');
|
||||
if(!input)return;
|
||||
input.addEventListener('input',function(){
|
||||
var kw=this.value.trim().toLowerCase();
|
||||
if(!kw){dropdown.classList.remove('show');return;}
|
||||
var list=VIP_USERS.filter(function(u){return u.name.toLowerCase().indexOf(kw)>-1||u.code.toLowerCase().indexOf(kw)>-1;});
|
||||
var listEl=document.getElementById('vipDropdownList');
|
||||
if(!list.length){listEl.innerHTML='<div style="padding:16px;text-align:center;color:#999;font-size:13px;">无匹配用户</div>';dropdown.classList.add('show');return;}
|
||||
listEl.innerHTML=list.map(function(u){return '<div class="vip-dropdown__item" data-name="'+u.name+'" data-code="'+u.code+'" data-points="'+u.points+'" data-spend="'+u.spend+'"><span>'+u.name+'</span><span>'+u.code+'</span><span>'+u.points+'</span><span>¥'+u.spend+'</span></div>';}).join('');
|
||||
dropdown.classList.add('show');
|
||||
listEl.querySelectorAll('.vip-dropdown__item').forEach(function(item){
|
||||
item.addEventListener('click',function(){selectVipUser(this);});
|
||||
});
|
||||
});
|
||||
input.addEventListener('focus',function(){if(this.value.trim())this.dispatchEvent(new Event('input'));});
|
||||
// 点击弹窗内其他区域关闭下拉
|
||||
var modalBody=input.closest('.modal-body');
|
||||
modalBody.addEventListener('click',function(e){
|
||||
if(!input.contains(e.target)&&!dropdown.contains(e.target)){dropdown.classList.remove('show');}
|
||||
});
|
||||
},50);
|
||||
}
|
||||
|
||||
function selectVipUser(el){
|
||||
var name=el.dataset.name,code=el.dataset.code,points=el.dataset.points,spend=el.dataset.spend;
|
||||
vipSelectedUser={name:name,code:code,points:points,spend:spend};
|
||||
document.getElementById('vipSearchInput').value=name+' ('+code+')';
|
||||
document.getElementById('vipDropdown').classList.remove('show');
|
||||
var card=document.getElementById('vipUserCard');
|
||||
card.classList.add('show');
|
||||
document.getElementById('vipCardAvatar').textContent=name[0];
|
||||
document.getElementById('vipCardName').textContent=name+' ('+code+')';
|
||||
document.getElementById('vipCardMeta').textContent='当前积分:'+points+' · 累计消费:¥'+spend;
|
||||
}
|
||||
|
||||
function confirmOpenVip(){
|
||||
if(!vipSelectedUser){showToast('请先选择用户');return;}
|
||||
Modal.close();
|
||||
showToast('普通会员开通成功');
|
||||
}
|
||||
|
||||
// 绑定开通会员按钮
|
||||
document.querySelectorAll('.action-bar .btn-primary').forEach(function(btn){
|
||||
if(btn.textContent.trim().indexOf('开通会员')>-1) btn.addEventListener('click', openVipModal);
|
||||
});
|
||||
|
||||
/* ========== 等级配置交互 ========== */
|
||||
const LEVEL_DATA = [
|
||||
{code:'LV-01',name:'普通会员',tagColor:'tag-gray',condition:'注册即可',multiplier:'1.0x',discount:'无折扣',privilege:'常规',benefits:'基础点餐功能',count:794,status:'启用'},
|
||||
{code:'LV-02',name:'银卡会员',tagColor:'tag-blue',condition:'累计消费 ¥1,000+',multiplier:'1.2x',discount:'9.8折',privilege:'常规',benefits:'生日券 ¥10、月度营养报告',count:186,status:'启用'},
|
||||
{code:'LV-03',name:'金卡会员',tagColor:'tag-orange',condition:'累计消费 ¥3,000+',multiplier:'1.5x',discount:'9.5折',privilege:'优先取餐',benefits:'生日券 ¥30、AI营养周报、专属客服',count:218,status:'启用'},
|
||||
{code:'LV-04',name:'钻石会员',tagColor:'tag-red',condition:'累计消费 ¥10,000+',multiplier:'2.0x',discount:'9.0折',privilege:'专属窗口',benefits:'专属营养师、VIP定制菜单、季度体检券',count:82,status:'启用'}
|
||||
];
|
||||
|
||||
function openAddLevel(){
|
||||
var html = `<div class="add-form-row">
|
||||
<div class="add-form-item"><label>等级编号<span class="req">*</span></label><input type="text" placeholder="如 LV-05"></div>
|
||||
<div class="add-form-item"><label>等级名称<span class="req">*</span></label><input type="text" placeholder="请输入等级名称"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>升级条件(累计消费)<span class="req">*</span></label><input type="text" placeholder="如 累计消费 ¥5,000+"></div>
|
||||
<div class="add-form-item"><label>积分倍数<span class="req">*</span></label><input type="text" placeholder="如 1.5x"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>点餐折扣</label><input type="text" placeholder="如 9.5折"></div>
|
||||
<div class="add-form-item"><label>取餐特权</label><select><option value="">请选择</option><option>常规</option><option>优先取餐</option><option>专属窗口</option></select></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item" style="grid-column:1/-1"><label>专属权益</label><textarea placeholder="请输入专属权益,多项用顿号分隔"></textarea></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>状态</label><select><option>启用</option><option>停用</option></select></div>
|
||||
</div>`;
|
||||
Modal.open('新增等级', html, 'level-modal', '<button class="btn btn-default" onclick="Modal.close()">取消</button><button class="btn btn-primary" onclick="Modal.close();showToast(\'新增等级成功\')">确定</button>');
|
||||
}
|
||||
|
||||
function viewLevel(idx){
|
||||
var d = LEVEL_DATA[idx];
|
||||
var html = `<div class="level-detail">
|
||||
<div class="level-detail__item"><div class="level-detail__label">等级编号</div><div class="level-detail__value">${d.code}</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">等级名称</div><div class="level-detail__value"><span class="tag ${d.tagColor}">${d.name}</span></div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">升级条件(累计消费)</div><div class="level-detail__value">${d.condition}</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">积分倍数</div><div class="level-detail__value">${d.multiplier}</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">点餐折扣</div><div class="level-detail__value">${d.discount}</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">取餐特权</div><div class="level-detail__value">${d.privilege}</div></div>
|
||||
<div class="level-detail__item full"><div class="level-detail__label">专属权益</div><div class="level-detail__value">${d.benefits}</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">当前人数</div><div class="level-detail__value">${d.count} 人</div></div>
|
||||
<div class="level-detail__item"><div class="level-detail__label">状态</div><div class="level-detail__value"><span class="tag tag-green">${d.status}</span></div></div>
|
||||
</div>`;
|
||||
Modal.open('查看等级 — '+d.name, html, 'level-modal', '<button class="btn btn-default" onclick="Modal.close()">关闭</button>');
|
||||
}
|
||||
|
||||
function editLevel(idx){
|
||||
var d = LEVEL_DATA[idx];
|
||||
function selOpt2(opts, cur){ return opts.map(o=>`<option${o===cur?' selected':''}>${o}</option>`).join(''); }
|
||||
var html = `<div class="add-form-row">
|
||||
<div class="add-form-item"><label>等级编号<span class="req">*</span></label><input type="text" value="${d.code}"></div>
|
||||
<div class="add-form-item"><label>等级名称<span class="req">*</span></label><input type="text" value="${d.name}"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>升级条件(累计消费)<span class="req">*</span></label><input type="text" value="${d.condition}"></div>
|
||||
<div class="add-form-item"><label>积分倍数<span class="req">*</span></label><input type="text" value="${d.multiplier}"></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>点餐折扣</label><input type="text" value="${d.discount}"></div>
|
||||
<div class="add-form-item"><label>取餐特权</label><select>${selOpt2(['常规','优先取餐','专属窗口'], d.privilege)}</select></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item" style="grid-column:1/-1"><label>专属权益</label><textarea>${d.benefits}</textarea></div>
|
||||
</div>
|
||||
<div class="add-form-row">
|
||||
<div class="add-form-item"><label>状态</label><select>${selOpt2(['启用','停用'], d.status)}</select></div>
|
||||
</div>`;
|
||||
Modal.open('编辑等级 — '+d.name, html, 'level-modal', '<button class="btn btn-default" onclick="Modal.close()">取消</button><button class="btn btn-primary" onclick="Modal.close();showToast(\'保存成功\')">保存</button>');
|
||||
}
|
||||
|
||||
// 绑定等级配置按钮和操作链接
|
||||
document.querySelectorAll('.action-bar .btn-primary').forEach(function(btn){
|
||||
if(btn.textContent.trim().indexOf('新增等级')>-1) btn.addEventListener('click', openAddLevel);
|
||||
});
|
||||
</script>
|
||||
<div class="toast" id="toast"></div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user