diff --git a/index.html b/index.html index 3e9af86..23f0fb3 100644 --- a/index.html +++ b/index.html @@ -386,6 +386,7 @@ const SITE_MAP = [ { file:'din-place-goal.html', label:'场所目标考核' }, { file:'prod-recipe-plan.html', label:'食谱排期' }, { file:'prod-clean-order.html', label:'净菜下单' }, + { file:'prod-clean-order-history.html', label:'净菜下单生成历史' }, { file:'prod-proc-combo.html', label:'配菜组合' }, { file:'prod-proc-cook.html', label:'烹饪加工' }, { file:'prod-proc-serve.html', label:'出餐管理' }, diff --git a/web-admin/nutrition/din-order-pickup.html b/web-admin/nutrition/din-order-pickup.html index 36e59d0..70e92c9 100644 --- a/web-admin/nutrition/din-order-pickup.html +++ b/web-admin/nutrition/din-order-pickup.html @@ -95,6 +95,35 @@ tbody tr:hover{background:#F8FBFF;} .modal-close:hover{background:#f5f5f5;color:var(--text-primary);} .modal-body{padding:24px;overflow-y:auto;flex:1;} +/* 主 Tab 栏 */ +.main-tabs{display:flex;gap:0;background:#fff;border-radius:var(--radius-md);padding:0 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);} +.main-tab{padding:14px 20px;font-size:var(--font-base);color:var(--text-secondary);cursor:pointer;border-bottom:2px solid transparent;white-space:nowrap;transition:all .2s;user-select:none;} +.main-tab:hover{color:var(--primary);} +.main-tab.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600;} +.main-tab-panel{display:none;} +.main-tab-panel.active{display:block;} + +/* 取餐明细 - 视频回放与丢餐提示 */ +.video-info{font-size:var(--font-sm);color:var(--text-secondary);margin-bottom:16px;} +.scale-info{display:flex;gap:24px;padding:12px 16px;background:#F8FAFC;border-radius:var(--radius-md);margin-bottom:16px;font-size:var(--font-sm);} +.scale-info__item{color:var(--text-primary);} +.scale-info__item strong{color:var(--primary);font-weight:600;} +.raw-data-table{width:100%;border-collapse:collapse;font-size:var(--font-sm);} +.raw-data-table thead th{background:#FAFAFA;padding:10px 14px;text-align:left;color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;} +.raw-data-table tbody td{padding:12px 14px;color:var(--text-primary);border-bottom:1px solid #f0f0f0;white-space:nowrap;} +.raw-data-table tbody tr:last-child td{border-bottom:none;} +.raw-data-table tbody tr:hover{background:#F8FBFF;} +.video-player{background:#000;border-radius:var(--radius-md);overflow:hidden;} +.video-player__screen{position:relative;height:320px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);} +.video-player__placeholder{color:rgba(255,255,255,0.6);font-size:var(--font-sm);letter-spacing:2px;} +.video-player__bigplay{position:absolute;width:64px;height:64px;border-radius:50%;background:rgba(255,255,255,0.2);color:#fff;display:flex;align-items:center;justify-content:center;font-size:26px;cursor:pointer;transition:all .2s;} +.video-player__bigplay:hover{background:rgba(255,255,255,0.35);} +.video-player__bar{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#111;} +.video-player__btn{width:32px;height:32px;border:none;border-radius:50%;background:rgba(255,255,255,0.15);color:#fff;cursor:pointer;font-size:14px;} +.video-player__time{color:rgba(255,255,255,0.7);font-size:var(--font-xs);white-space:nowrap;} +.video-player__progress{flex:1;height:4px;background:rgba(255,255,255,0.2);border-radius:2px;position:relative;} +.video-player__progress-fill{width:40%;height:100%;background:var(--primary);border-radius:2px;} + /* 十维档案 Tab */ .profile-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:20px;overflow-x:auto;} .profile-tab{padding:10px 16px;font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;border-bottom:2px solid transparent;white-space:nowrap;transition:all .2s;} @@ -300,6 +329,15 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} + +
+
用户取餐记录
+
取餐明细
+
+ + +
+
@@ -328,7 +366,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
取餐管理
- +
@@ -356,6 +394,70 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} + + + +
+ + +
+
+
+
+
+
+
+
+
+ + +
+ + +
+ + +
+ + +
+
+
取餐明细
+
+
+
就餐记录号姓名员工编号单位部门餐次取餐方式取餐类型人员类别取餐开始时间取餐结束时间取餐总数量结算重量(克)实际重量(克)重量偏差(克)总金额营养评分操作
+ + + + + + + + + + + + + + + + + + +
序号取用记录ID餐次餐品名称记录状态取餐重量(克)金额用户(工号-姓名)人员类别取餐时间取餐设备取餐方式取餐类型就餐记录号操作
1P-20260428-0001午餐清炒生菜正常133.0¥6.00EMP001-张伟会员2026-04-28 11:02:15一号餐线·3号秤餐线取餐正常取餐M-20260428-001原始数据 查看视频
2P-20260428-0002午餐西红柿鸡蛋正常114.0¥8.00EMP001-张伟会员2026-04-28 11:03:02一号餐线·3号秤餐线取餐正常取餐M-20260428-001原始数据 查看视频
3P-20260428-0003午餐辣子鸡丁正常79.0¥8.00EMP001-张伟会员2026-04-28 11:04:30一号餐线·3号秤餐线取餐正常取餐M-20260428-001原始数据 查看视频
4P-20260428-0011午餐红烧肉正常85.0¥16.00EMP003-王磊非会员2026-04-28 11:16:40一号餐线·5号秤餐线取餐正常取餐M-20260428-003原始数据 查看视频
5P-20260428-0021午餐宫保鸡丁无主记录110.0¥9.502026-04-28 11:25:08一号餐线·5号秤餐线取餐正常取餐原始数据 查看视频
6P-20260428-0022午餐米饭无主记录200.0¥12.002026-04-28 11:25:33一号餐线·5号秤餐线取餐正常取餐原始数据 查看视频
7P-20260428-0031晚餐清蒸鲈鱼无主记录120.0¥8.002026-04-28 18:12:45二号档口·1号秤档口取餐正常取餐原始数据 查看视频
8P-20260427-0005午餐糖醋里脊手动修正95.0¥12.00EMP007-林教授外部人员2026-04-27 12:12:20二号档口·1号秤档口取餐正常取餐M-20260428-007原始数据 查看视频
9P-20260427-0018午餐余量套餐B手动修正195.0¥5.00EMP102-王保安工作人员2026-04-27 14:11:05一号餐线·2号秤餐线取餐余量取餐SP-001-003原始数据 查看视频
10P-20260428-0004早餐小米粥正常250.0¥4.00EMP005-陈刚非会员2026-04-28 07:49:10一号餐线·2号秤餐线取餐正常取餐M-20260428-005原始数据 查看视频
11P-20260428-0041午餐鸡胸肉沙拉正常180.0¥10.80EMP006-刘芳会员2026-04-28 11:46:22三号档口·2号秤档口取餐正常取餐M-20260428-006原始数据 查看视频
12P-20260428-0023午餐余量套餐A正常220.0¥5.00EMP101-张运维员工2026-04-28 14:05:50一号餐线·2号秤餐线取餐余量取餐SP-001-001原始数据 查看视频
+
+ +
+ + + @@ -367,20 +469,25 @@ function toggleSubgroup(header){header.parentElement.classList.toggle('open');} const Modal = { open(title, bodyHtml) { this.close(); + this.stack(title, bodyHtml); + }, + stack(title, bodyHtml) { const overlay = document.createElement('div'); overlay.className = 'modal-overlay'; overlay.innerHTML = ``; - overlay.addEventListener('click', e => { if (e.target === overlay) Modal.close(); }); + overlay.addEventListener('click', e => { if (e.target === overlay) Modal.closeTop(overlay); }); document.body.appendChild(overlay); }, close() { - const o = document.querySelector('.modal-overlay'); - if (!o) return; - o.classList.add('closing'); - setTimeout(() => o.remove(), 200); + document.querySelectorAll('.modal-overlay').forEach(o => { o.classList.add('closing'); setTimeout(() => o.remove(), 200); }); + }, + closeTop(overlay) { + if (!overlay) return; + overlay.classList.add('closing'); + setTimeout(() => overlay.remove(), 200); } }; @@ -575,7 +682,7 @@ function showUserProfile(name) { } /* 绑定表格中的"查看用户信息"链接 */ -document.querySelectorAll('tbody tr').forEach(row => { +document.querySelectorAll('#recordTable tbody tr').forEach(row => { const link = row.querySelector('td:last-child .link'); const nameCell = row.querySelector('td:nth-child(2)'); if (link && nameCell) { @@ -662,15 +769,24 @@ function showMealDetail(row) { `; - const tableRows = items.map(i => ` - ${i.name} - ¥${i.price.toFixed(2)} - ${i.weight.toFixed(1)} - ${i.cal.toFixed(1)} - ${i.carb.toFixed(1)} - ${i.fat.toFixed(1)} - ${i.protein.toFixed(1)} - `).join(''); + const dateStr = (recordId.match(/\d{8}/) || ['20260428'])[0].replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3'); + const methodDeviceMap = { '餐线取餐':'一号餐线·3号秤', '档口+餐线':'二号档口·1号秤', '点餐取餐':'一号餐线·3号秤', '外卖/外带':'二号档口·1号秤', '余量取餐':'一号餐线·2号秤' }; + const device = methodDeviceMap[pickupMethod] || '一号餐线·3号秤'; + + const tableRows = items.map((i, idx) => { + const itemTime = dateStr + ' ' + startTime + ':' + String(idx * 8).padStart(2, '0'); + return ` + ${i.name} + ¥${i.price.toFixed(2)} + ${i.weight.toFixed(1)} + ${i.cal.toFixed(1)} + ${i.carb.toFixed(1)} + ${i.fat.toFixed(1)} + ${i.protein.toFixed(1)} + 查看 + 查看 + `; + }).join(''); const summaryRow = ` 合计 @@ -680,12 +796,14 @@ function showMealDetail(row) { ${totalCarb.toFixed(1)}克 ${totalFat.toFixed(1)}克 ${totalProtein.toFixed(1)}克 + + `; const tableHtml = `
餐品列表
- + ${tableRows}${summaryRow}
餐品名称金额重量(克)热量(千卡)碳水化合物(克)脂肪(克)蛋白质(克)
餐品名称金额重量(克)热量(千卡)碳水化合物(克)脂肪(克)蛋白质(克)原始数据查看视频
`; @@ -693,13 +811,127 @@ function showMealDetail(row) { Modal.open('取餐详情 — ' + name, infoHtml + tableHtml); } +function showMealItemRawData(dish, weight, user, time, device) { + buildRawDataModal({ dish: dish, statusText: '正常', weight: parseFloat(weight), user: user, time: time, device: device }); +} + +function showMealItemVideo(dish, time, recordId) { + buildVideoModal({ id: recordId, dish: dish, statusText: '正常', time: time }); +} + /* 绑定"取餐总数量"列点击事件 */ -document.querySelectorAll('tbody tr').forEach(row => { +document.querySelectorAll('#recordTable tbody tr').forEach(row => { const quantityLink = row.querySelector('td:nth-child(12) .link'); if (quantityLink) { quantityLink.addEventListener('click', () => showMealDetail(row)); } }); + +/* ========== 主 Tab 切换 ========== */ +function switchMainTab(el, key) { + document.querySelectorAll('.main-tab').forEach(t => t.classList.remove('active')); + el.classList.add('active'); + document.querySelectorAll('.main-tab-panel').forEach(p => p.classList.remove('active')); + document.querySelector(`.main-tab-panel[data-panel="${key}"]`).classList.add('active'); +} + +/* ========== 取餐明细 - 原始数据弹窗 ========== */ +function showRawData(row) { + const c = row.querySelectorAll('td'); + Modal.close(); + buildRawDataModal({ + dish: c[3].textContent.trim(), + statusText: c[4].textContent.trim(), + weight: parseFloat(c[5].textContent.trim()), + user: c[7].textContent.trim(), + time: c[9].textContent.trim(), + device: c[10].textContent.trim() + }); +} + +function buildRawDataModal(data) { + const deviceNoMap = { '一号餐线·2号秤':'SC-002', '一号餐线·3号秤':'SC-003', '一号餐线·5号秤':'SC-005', '二号档口·1号秤':'DC-001', '三号档口·2号秤':'DC-002' }; + const deviceNo = deviceNoMap[data.device] || '—'; + + const isOrphan = data.statusText === '无主记录'; + const isManual = data.statusText === '手动修正'; + const recStatus = (isOrphan || isManual) ? '未识别' : '已识别'; + const recUser = (isOrphan || isManual) ? '—' : data.user; + const statusTag = recStatus === '已识别' ? '已识别' : '未识别'; + + const samples = [ + { t: minusSeconds(data.time, 5), w: (data.weight - 38).toFixed(1), d: '+' + (data.weight - 38).toFixed(1), stable: '否' }, + { t: minusSeconds(data.time, 2), w: (data.weight - 9).toFixed(1), d: '+29.0', stable: '否' }, + { t: data.time, w: data.weight.toFixed(1), d: '+9.0', stable: '是' } + ]; + + const rowsHtml = samples.map(s => ` + ${s.t} + ${s.w} + ${s.d} + ${statusTag} + ${recUser} + ${s.stable === '是' ? '' : ''} + `).join(''); + + const html = `
+
设备编号:${deviceNo}
+
设备名称:${data.device}
+
+ + + ${rowsHtml} +
采样时间当前重量(g)较上次变化重量(g)识别状态用户是否稳定
`; + + Modal.stack('秤原始数据 — ' + data.dish, html); +} + +function minusSeconds(timeStr, sec) { + const parts = timeStr.split(' '); + const date = parts[0]; + const hms = parts[1].split(':').map(Number); + const d = new Date(0); + d.setHours(hms[0], hms[1], hms[2] - sec); + const pad = n => String(n).padStart(2, '0'); + return date + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds()); +} + +/* ========== 取餐明细 - 视频回放弹窗 ========== */ +function showPickupVideo(row) { + const c = row.querySelectorAll('td'); + Modal.close(); + buildVideoModal({ + id: c[1].textContent.trim(), + dish: c[3].textContent.trim(), + statusText: c[4].textContent.trim(), + time: c[9].textContent.trim() + }); +} + +function buildVideoModal(data) { + const html = `
取用记录ID:${data.id} · 取餐时间:${data.time} · 记录状态:${data.statusText}
+
+
+
取餐过程监控画面
+
+
+
+ + 00:00 / 00:18 +
+
+
`; + Modal.stack('取餐视频回放 — ' + data.dish, html); +} + +/* 绑定取餐明细表格操作列 */ +document.querySelectorAll('#detailTable tbody tr').forEach(row => { + const links = row.querySelectorAll('.td-actions .link'); + if (links.length >= 2) { + links[0].addEventListener('click', () => showRawData(row)); + links[1].addEventListener('click', () => showPickupVideo(row)); + } +}); \ No newline at end of file diff --git a/web-admin/nutrition/prod-clean-order-history.html b/web-admin/nutrition/prod-clean-order-history.html new file mode 100644 index 0000000..97a6645 --- /dev/null +++ b/web-admin/nutrition/prod-clean-order-history.html @@ -0,0 +1,567 @@ + + + + + +营养管理 - 净菜订单生成历史 | 健康CQ原型 + + + +
+ + +
← 返回首页
系统管理员 ▾
+
+ +
+ + + + +
+
+
+
+
+ + +
+ + +
+
生成记录
+
+ + + + + + + + + + + + + + + + + + + +
序号订单号食谱日期生成方式生成状态餐次人数菜品种类预定配送时间开始生成时间生成成功时间创建人操作
+ +
+ +
+
+ + + + + + + diff --git a/web-admin/nutrition/prod-clean-order.html b/web-admin/nutrition/prod-clean-order.html index 6e31043..aaf555c 100644 --- a/web-admin/nutrition/prod-clean-order.html +++ b/web-admin/nutrition/prod-clean-order.html @@ -268,7 +268,7 @@ tr.detail-row td.td-actions{background:#FAFBFC;box-shadow:-4px 0 8px rgba(0,0,0,
- + 📜 净菜订单生成历史
净菜订单
@@ -398,34 +398,6 @@ tr.detail-row td.td-actions{background:#FAFBFC;box-shadow:-4px 0 8px rgba(0,0,0,
- - -