feat: 小程序就餐记录列表改造与拍照记录页新增,web-admin营养模块字段与终端设备列完善

- mini-program/eat-home.html: 今日就餐记录列表移除食物图标、加序号徽标、副信息改为重量/热量、新增就餐时间;数据来源扩展为员工食堂/补充记录/拍照记录三种;底部"自记餐品"按钮拆为"手动补录"+"拍照记录"双按钮
- mini-program/eat-photo-record.html: 新增拍照记录页,支持餐品名称输入+拍照/上传图片,可添加多个餐品并保存至 sessionStorage 与首页联动
- web-admin/nutrition: din-dish-add/din-dish-all 食材"是否主料"字段改为"食材类型"(主材/辅材/调料);prod-proc-combo/sup-in-cleanin/sup-in-raw/sup-pkg-label 新增"终端设备"列展示设备名与编号;din-recipe-mgmt 新增"同步至生产任务"按钮与"已同步"标签

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fengpu
2026-06-22 17:01:08 +08:00
co-authored by Claude Opus 4.7
parent fbc9fdbddf
commit 7d7488737b
10 changed files with 523 additions and 108 deletions
@@ -1,5 +1,13 @@
# 营养管理小程序 CHANGELOG
## [1.3.0] - 2026-06-22
### 变更
**吃模块**
- `eat-home.html` — 今日就餐记录列表改造:移除食物图标,食物名称左上角新增序号徽标,食物名称下方副信息由「蛋白质/脂肪/碳水」改为「重量(g)· 热量(kcal)」;数据来源标识由两种扩展为三种(员工食堂 / 补充记录 / 拍照记录),其中拍照记录条目不显示重量与热量;底部「自记餐品」按钮拆分为「手动补录」+「拍照记录」两个按钮,分别跳转 `eat-self-record.html` 与新增页 `eat-photo-record.html`
- `eat-photo-record.html` — 新增拍照记录页:支持手动输入餐品名称 + 拍照/上传图片,可添加多个餐品并保存至 `sessionStorage['photoRecord_餐次']`,与 `eat-home.html` 就餐记录联动
## [1.2.1] - 2026-06-17
### 变更
+110 -53
View File
@@ -81,26 +81,37 @@
border-bottom: 0.5px solid #f5f5f5; cursor: pointer; text-decoration: none; color: inherit;
}
.meal-item:last-child { border-bottom: none; }
.meal-item .food-icon {
width: 44px; height: 44px; border-radius: 12px; background: #f5f5f5;
display: flex; align-items: center; justify-content: center; font-size: 22px; flex-shrink: 0;
}
.meal-item .food-info { flex: 1; min-width: 0; }
.meal-item .food-name { font-size: 14px; font-weight: 500; }
.meal-item .food-meta { font-size: 12px; color: #999; margin-top: 2px; }
/* 右侧:热量 + 来源徽标(员工食堂 / 自记餐品) */
.meal-item .food-right { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex-shrink: 0; }
.meal-item .food-cal { font-size: 13px; font-weight: 600; color: #fa8c16; }
.meal-item .food-source { font-size: 10px; color: #999; padding: 1px 6px; border-radius: 3px; background: #f5f5f5; }
.meal-item .food-source.self { color: #1677ff; background: #e6f4ff; }
/* 自记餐品按钮(位于餐品列表下方) */
.self-record-btn-wrap { padding: 4px 16px 16px; background: #fff; }
.self-record-btn {
width: 100%; padding: 11px 0; border-radius: 12px; border: 1.5px dashed #1677ff;
background: #f0f7ff; color: #1677ff; font-size: 14px; font-weight: 600;
cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 4px;
/* 食物名称行:序号 + 名称 + 重量/热量(右对齐) */
.meal-item .food-name-row { display: flex; align-items: center; gap: 6px; }
.meal-item .food-index {
flex-shrink: 0; min-width: 18px; height: 18px; line-height: 18px; padding: 0 5px;
border-radius: 9px; background: #1677ff; color: #fff;
font-size: 11px; font-weight: 600; text-align: center;
}
.self-record-btn:active { background: #d6e8ff; }
.meal-item .food-name { font-size: 14px; font-weight: 500; flex-shrink: 0; }
.meal-item .food-meta { font-size: 12px; color: #999; text-align: right; }
/* 就餐时间 */
.meal-item .food-time { font-size: 11px; color: #bbb; margin-top: 4px; }
/* 右侧:来源徽标(员工食堂 / 补充记录 / 拍照记录) */
.meal-item .food-right { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex-shrink: 0; }
.meal-item .food-source {
font-size: 10px; color: #999; padding: 1px 6px; border-radius: 3px; background: #f5f5f5;
}
.meal-item .food-source.self { color: #1677ff; background: #e6f4ff; }
.meal-item .food-source.photo { color: #fa8c16; background: #fff7e6; }
/* 底部双按钮:手动补录 / 拍照记录 */
.record-actions-wrap { padding: 4px 16px 16px; background: #fff; }
.record-actions { display: flex; gap: 10px; }
.record-action-btn {
flex: 1; padding: 11px 0; border-radius: 12px;
font-size: 14px; font-weight: 600; cursor: pointer;
display: flex; align-items: center; justify-content: center; gap: 4px;
border: 1.5px dashed #1677ff; background: #f0f7ff; color: #1677ff;
}
.record-action-btn.photo { border-color: #fa8c16; background: #fff7e6; color: #fa8c16; }
.record-action-btn:active { opacity: 0.8; }
.record-action-btn .ra-icon { font-size: 16px; }
</style>
</head>
<body>
@@ -134,11 +145,16 @@
<div class="meal-tab">晚餐</div>
</div>
<div class="meal-list"></div>
<!-- 自记餐品按钮:跳转至自记餐品二级页面,按当前激活餐次 -->
<div class="self-record-btn-wrap">
<button class="self-record-btn" onclick="goSelfRecord()">
<span style="font-size:16px;"></span>自记餐品
</button>
<!-- 双按钮:手动补录 / 拍照记录 -->
<div class="record-actions-wrap">
<div class="record-actions">
<button class="record-action-btn" onclick="goSelfRecord()">
<span class="ra-icon">✏️</span>手动补录
</button>
<button class="record-action-btn photo" onclick="goPhotoRecord()">
<span class="ra-icon">📷</span>拍照记录
</button>
</div>
</div>
</div>
@@ -156,26 +172,27 @@
</div>
<script>
/* ========== 餐次菜品数据(来源:员工食堂) ========== */
/* meta 改为「重量 + 热量」格式,去除食物图标,新增就餐时间 */
var mealData = {
'早餐': [
{ icon: '🥛', name: '豆浆', meta: '蛋白质 3.6g · 碳水 8.2g', cal: '65kcal', source: '员工食堂' },
{ icon: '🥖', name: '油条', meta: '碳水 24g · 脂肪 12.8g', cal: '198kcal', source: '员工食堂' },
{ icon: '🥚', name: '水煮蛋', meta: '蛋白质 6.3g · 脂肪 5.3g', cal: '78kcal', source: '员工食堂' },
{ icon: '🥣', name: '小米粥', meta: '碳水 16g · 蛋白质 1.8g', cal: '72kcal', source: '员工食堂' }
{ name: '豆浆', weight: 250, cal: 65, source: '员工食堂', time: '2026-06-22 07:32:18' },
{ name: '油条', weight: 80, cal: 198, source: '员工食堂', time: '2026-06-22 07:32:42' },
{ name: '水煮蛋', weight: 50, cal: 78, source: '员工食堂', time: '2026-06-22 07:33:05' },
{ name: '小米粥', weight: 200, cal: 72, source: '员工食堂', time: '2026-06-22 07:33:28' }
],
'午餐': [
{ icon: '🍗', name: '宫保鸡丁', meta: '蛋白质 22.4g · 脂肪 14.2g', cal: '285kcal', source: '员工食堂' },
{ icon: '🐟', name: '清蒸鱼', meta: '蛋白质 20.8g · 脂肪 4.6g', cal: '142kcal', source: '员工食堂' },
{ icon: '🥦', name: '炒西兰花', meta: '蛋白质 3.2g · 脂肪 3.8g', cal: '68kcal', source: '员工食堂' },
{ icon: '🍚', name: '米饭(中碗)', meta: '碳水 58g · 蛋白质 4.2g', cal: '232kcal', source: '员工食堂' },
{ icon: '🥬', name: '蒜蓉油麦菜', meta: '蛋白质 1.8g · 脂肪 3.2g', cal: '52kcal', source: '员工食堂' },
{ icon: '🍲', name: '番茄蛋花汤', meta: '蛋白质 4.6g · 脂肪 2.1g', cal: '48kcal', source: '员工食堂' }
{ name: '宫保鸡丁', weight: 200, cal: 285, source: '员工食堂', time: '2026-06-22 12:08:15' },
{ name: '清蒸鱼', weight: 180, cal: 142, source: '员工食堂', time: '2026-06-22 12:08:38' },
{ name: '炒西兰花', weight: 150, cal: 68, source: '员工食堂', time: '2026-06-22 12:09:02' },
{ name: '米饭(中碗)', weight: 200, cal: 232, source: '员工食堂', time: '2026-06-22 12:09:25' },
{ name: '蒜蓉油麦菜', weight: 150, cal: 52, source: '员工食堂', time: '2026-06-22 12:09:48' },
{ name: '番茄蛋花汤', weight: 200, cal: 48, source: '员工食堂', time: '2026-06-22 12:10:12' }
],
'晚餐': [
{ icon: '🍳', name: '番茄炒蛋', meta: '蛋白质 10.2g · 脂肪 8.6g', cal: '156kcal', source: '员工食堂' },
{ icon: '🫑', name: '青椒肉丝', meta: '蛋白质 14.8g · 脂肪 9.2g', cal: '178kcal', source: '员工食堂' },
{ icon: '🥬', name: '紫菜蛋花汤', meta: '蛋白质 3.4g · 脂肪 1.2g', cal: '32kcal', source: '员工食堂' },
{ icon: '🍞', name: '馒头', meta: '碳水 44g · 蛋白质 7.0g', cal: '221kcal', source: '员工食堂' }
{ name: '番茄炒蛋', weight: 200, cal: 156, source: '员工食堂', time: '2026-06-22 18:15:33' },
{ name: '青椒肉丝', weight: 180, cal: 178, source: '员工食堂', time: '2026-06-22 18:15:58' },
{ name: '紫菜蛋花汤', weight: 200, cal: 32, source: '员工食堂', time: '2026-06-22 18:16:22' },
{ name: '馒头', weight: 100, cal: 221, source: '员工食堂', time: '2026-06-22 18:16:45' }
]
};
@@ -232,7 +249,15 @@
} catch (e) { return {}; }
}
/* 把某餐次的自记记录转为主列表渲染格式 */
/* 读取 sessionStorage 中某餐次的拍照记录 */
function loadPhotoRecord(mealType) {
try {
var raw = sessionStorage.getItem('photoRecord_' + mealType);
return raw ? JSON.parse(raw) : [];
} catch (e) { return []; }
}
/* 把某餐次的自记记录转为主列表渲染格式(补充记录来源) */
function computeSelfItems(mealType) {
var state = loadSelfRecord(mealType);
var items = [];
@@ -241,39 +266,66 @@
if (!rec || !rec.qty || rec.qty <= 0) return;
var d = findSelfDish(id);
if (!d) return;
var cal, qtyText;
var cal, gram;
if (rec.mode === '份') {
gram = d.gram * rec.qty;
cal = Math.round(d.cal * rec.qty);
qtyText = rec.qty + ' 份';
} else {
gram = rec.qty;
cal = Math.round(d.cal * rec.qty / d.gram);
qtyText = rec.qty + ' g';
}
items.push({
icon: d.icon, name: d.name,
meta: qtyText + ' · ' + d.desc,
cal: cal + 'kcal',
source: '自记餐品', isSelf: true
name: d.name,
weight: gram, cal: cal,
source: '补充记录', sourceClass: 'self',
time: rec.time || formatNow()
});
});
return items;
}
/* 把某餐次的拍照记录转为主列表渲染格式(拍照记录来源,无重量/热量) */
function computePhotoItems(mealType) {
return loadPhotoRecord(mealType).map(function(p) {
return {
name: p.name,
source: '拍照记录', sourceClass: 'photo',
skipMeta: true,
time: p.time || formatNow()
};
});
}
/* 格式化当前时间为「YYYY-MM-DD HH:mm:ss」 */
function formatNow() {
function pad(n) { return n < 10 ? '0' + n : '' + n; }
var d = new Date();
return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
+ ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds());
}
/* ========== 主列表渲染 ========== */
var mealTabs = document.querySelectorAll('.meal-tab');
var mealList = document.querySelector('.meal-list');
function renderMeal(mealType) {
currentMeal = mealType;
var items = (mealData[mealType] || []).slice().concat(computeSelfItems(mealType));
mealList.innerHTML = items.map(function(d) {
var items = (mealData[mealType] || []).slice()
.concat(computeSelfItems(mealType))
.concat(computePhotoItems(mealType));
mealList.innerHTML = items.map(function(d, idx) {
/* 重量/热量放在餐品名后面(右对齐),拍照记录无此元素 */
var metaHtml = d.skipMeta ? '' :
'<span class="food-meta">重量 ' + d.weight + 'g · 热量 ' + d.cal + 'kcal</span>';
return '<a class="meal-item" href="eat-dish-detail.html">'
+ '<div class="food-icon">' + d.icon + '</div>'
+ '<div class="food-info"><div class="food-name">' + d.name + '</div>'
+ '<div class="food-meta">' + d.meta + '</div></div>'
+ '<div class="food-info">'
+ '<div class="food-name-row"><span class="food-index">' + (idx + 1) + '</span>'
+ '<span class="food-name">' + d.name + '</span></div>'
+ '<div class="food-time">' + (d.time || '') + '</div>'
+ '</div>'
+ '<div class="food-right">'
+ '<span class="food-cal">' + d.cal + '</span>'
+ '<span class="food-source' + (d.isSelf ? ' self' : '') + '">' + d.source + '</span>'
+ metaHtml
+ '<span class="food-source ' + (d.sourceClass || '') + '">' + d.source + '</span>'
+ '</div></a>';
}).join('');
}
@@ -286,11 +338,16 @@
});
});
/* 跳转到自记餐品二级页面,传当前餐次 */
/* 跳转到手动补录页(原自记餐品),传当前餐次 */
function goSelfRecord() {
location.href = 'eat-self-record.html?meal=' + encodeURIComponent(currentMeal);
}
/* 跳转到拍照记录页,传当前餐次 */
function goPhotoRecord() {
location.href = 'eat-photo-record.html?meal=' + encodeURIComponent(currentMeal);
}
/* 初始渲染:午餐 */
renderMeal('午餐');
</script>
@@ -0,0 +1,324 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>拍照记录 | 智能餐养小程序</title>
<style>
/* 全局重置 */
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #2a2a2a; display: flex; justify-content: center; align-items: flex-start;
min-height: 100vh; font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif;
padding: 24px 0 40px;
}
/* 手机壳 */
.phone-shell {
width: 390px; height: 844px; background: #fff; border-radius: 44px;
box-shadow: 0 20px 60px rgba(0,0,0,0.3), inset 0 0 0 2px #e0e0e0;
overflow: hidden; position: relative; display: flex; flex-direction: column;
}
/* 状态栏 */
.status-bar {
height: 44px; background: #fff; display: flex; align-items: center;
justify-content: space-between; padding: 0 24px; font-size: 12px; font-weight: 600; flex-shrink: 0;
}
.status-bar .time { font-size: 15px; font-weight: 700; }
.status-bar .icons { display: flex; gap: 6px; align-items: center; }
/* 导航栏 */
.nav-bar {
height: 44px; background: #fff; display: flex; align-items: center;
padding: 0 16px; border-bottom: 0.5px solid #f0f0f0; flex-shrink: 0; position: relative;
}
.nav-bar .back { font-size: 22px; color: #1677ff; cursor: pointer; text-decoration: none; line-height: 1; }
.nav-bar .title { position: absolute; left: 50%; transform: translateX(-50%); font-size: 17px; font-weight: 600; }
.home-indicator {
height: 20px; display: flex; align-items: center; justify-content: center; background: #fff; flex-shrink: 0;
}
.home-indicator::after { content: ''; width: 120px; height: 5px; background: #1a1a1a; border-radius: 3px; opacity: 0.2; }
/* === 业务样式 === */
.page-body {
flex: 1; overflow-y: auto; background: #f5f5f5;
display: flex; flex-direction: column;
}
.page-body::-webkit-scrollbar { display: none; }
/* 当前餐次提示 */
.meal-tip {
padding: 10px 16px; background: #fff7e6; color: #fa8c16;
font-size: 12px; border-bottom: 0.5px solid #ffe7ba;
}
/* 添加区卡片 */
.add-card {
margin: 12px; background: #fff; border-radius: 12px; padding: 14px;
box-shadow: 0 1px 3px rgba(0,0,0,0.04);
}
.add-card .label {
font-size: 13px; color: #666; margin-bottom: 8px;
}
.name-input {
width: 100%; height: 38px; border: 1px solid #e0e0e0; border-radius: 8px;
padding: 0 12px; font-size: 14px; color: #333; outline: none;
background: #fafafa;
}
.name-input:focus { border-color: #fa8c16; background: #fff; }
.photo-row {
display: flex; gap: 10px; margin-top: 12px; align-items: center;
}
/* 拍照按钮 */
.photo-btn {
flex: 1; height: 80px; border: 1.5px dashed #fa8c16; border-radius: 10px;
background: #fff7e6; color: #fa8c16; font-size: 14px; font-weight: 600;
cursor: pointer; display: flex; flex-direction: column; align-items: center;
justify-content: center; gap: 4px;
}
.photo-btn .pb-icon { font-size: 26px; line-height: 1; }
.photo-btn:active { opacity: 0.8; }
.photo-btn input[type=file] { display: none; }
/* 添加到列表按钮 */
.add-list-btn {
width: 80px; height: 80px; border-radius: 10px;
background: #fa8c16; color: #fff; font-size: 13px; font-weight: 600;
cursor: pointer; border: none;
display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
}
.add-list-btn:active { opacity: 0.85; }
.add-list-btn .al-icon { font-size: 22px; line-height: 1; }
/* 已添加餐品列表 */
.list-card {
flex: 1; margin: 0 12px 12px; background: #fff; border-radius: 12px;
padding: 4px 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.04);
overflow-y: auto;
}
.list-card::-webkit-scrollbar { display: none; }
.list-card .lc-title {
font-size: 13px; color: #666; padding: 10px 0 6px;
border-bottom: 0.5px solid #f0f0f0;
}
.list-empty {
padding: 30px 0; text-align: center; color: #bbb; font-size: 13px;
}
/* 餐品条目 */
.dish-row {
display: flex; align-items: center; gap: 10px; padding: 10px 0;
border-bottom: 0.5px solid #f5f5f5;
}
.dish-row:last-child { border-bottom: none; }
.dish-row .dish-thumb {
width: 56px; height: 56px; border-radius: 8px; background: #f5f5f5;
background-size: cover; background-position: center; flex-shrink: 0;
display: flex; align-items: center; justify-content: center; font-size: 24px;
}
.dish-row .dish-info { flex: 1; min-width: 0; }
.dish-row .dish-name {
font-size: 14px; color: #333; font-weight: 500;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dish-row .dish-sub {
font-size: 11px; color: #fa8c16; margin-top: 3px;
}
.dish-row .del-btn {
width: 28px; height: 28px; border-radius: 50%; border: none;
background: #fff1f0; color: #ff4d4f; font-size: 16px; cursor: pointer;
flex-shrink: 0;
}
.dish-row .del-btn:active { opacity: 0.8; }
/* 底部保存栏 */
.save-bar {
padding: 10px 16px 14px; background: #fff; border-top: 0.5px solid #f0f0f0;
flex-shrink: 0;
}
.save-btn {
width: 100%; height: 44px; border-radius: 22px; border: none;
background: #fa8c16; color: #fff; font-size: 15px; font-weight: 600;
cursor: pointer;
}
.save-btn:active { opacity: 0.85; }
.save-btn:disabled { background: #ffd6a8; cursor: not-allowed; }
</style>
</head>
<body>
<div class="phone-shell">
<!-- 状态栏 -->
<div class="status-bar">
<span class="time">09:41</span>
<div class="icons">
<span>📶</span><span>WiFi</span><span>🔋</span>
</div>
</div>
<!-- 导航栏 -->
<div class="nav-bar">
<a class="back" href="eat-home.html"></a>
<span class="title">拍照记录</span>
</div>
<!-- 主体 -->
<div class="page-body">
<!-- 当前餐次提示 -->
<div class="meal-tip">当前餐次:<strong id="mealName">午餐</strong></div>
<!-- 添加区 -->
<div class="add-card">
<div class="label">餐品名称</div>
<input class="name-input" id="dishName" type="text" placeholder="请输入餐品名称" maxlength="20" />
<div class="photo-row">
<!-- 拍照/上传 -->
<label class="photo-btn">
<span class="pb-icon">📷</span>
<span id="photoBtnText">拍照 / 上传图片</span>
<input id="photoInput" type="file" accept="image/*" capture="environment" />
</label>
<!-- 添加到列表 -->
<button class="add-list-btn" onclick="addDish()">
<span class="al-icon"></span>
<span>添加</span>
</button>
</div>
</div>
<!-- 已添加餐品列表 -->
<div class="list-card">
<div class="lc-title">已添加餐品(<span id="dishCount">0</span></div>
<div id="dishList"></div>
</div>
</div>
<!-- 底部保存按钮 -->
<div class="save-bar">
<button class="save-btn" id="saveBtn" onclick="saveAll()">保存</button>
</div>
<!-- Home Indicator -->
<div class="home-indicator"></div>
</div>
<script>
/* ========== 解析当前餐次 ========== */
function getQueryMeal() {
var m = decodeURIComponent((location.search.match(/meal=([^&]+)/) || [,''])[1]);
return ['早餐','午餐','晚餐'].indexOf(m) >= 0 ? m : '午餐';
}
var currentMeal = getQueryMeal();
document.getElementById('mealName').textContent = currentMeal;
/* ========== 已添加餐品列表(内存态,未保存前不持久化) ========== */
/* 每条:{ name, image(DataURL 缩略图) } */
var dishList = [];
/* 当前选中的图片(DataURL */
var pendingImage = null;
/* 格式化当前时间为「YYYY-MM-DD HH:mm:ss」 */
function formatNow() {
function pad(n) { return n < 10 ? '0' + n : '' + n; }
var d = new Date();
return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
+ ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds());
}
/* 拍照/上传图片处理 */
document.getElementById('photoInput').addEventListener('change', function(e) {
var file = e.target.files && e.target.files[0];
if (!file) return;
/* 压缩为缩略图,避免 sessionStorage 撑爆 */
var reader = new FileReader();
reader.onload = function(ev) {
var img = new Image();
img.onload = function() {
var canvas = document.createElement('canvas');
var maxW = 200;
var w = img.width, h = img.height;
if (w > maxW) { h = h * maxW / w; w = maxW; }
canvas.width = w; canvas.height = h;
canvas.getContext('2d').drawImage(img, 0, 0, w, h);
pendingImage = canvas.toDataURL('image/jpeg', 0.7);
document.getElementById('photoBtnText').textContent = '已选图片 ✓';
};
img.src = ev.target.result;
};
reader.readAsDataURL(file);
});
/* 添加餐品到列表 */
function addDish() {
var nameEl = document.getElementById('dishName');
var name = nameEl.value.trim();
if (!name) {
alert('请输入餐品名称');
nameEl.focus();
return;
}
if (!pendingImage) {
alert('请先拍照或上传一张图片');
return;
}
dishList.push({ name: name, image: pendingImage, time: formatNow() });
/* 重置输入 */
nameEl.value = '';
pendingImage = null;
document.getElementById('photoInput').value = '';
document.getElementById('photoBtnText').textContent = '拍照 / 上传图片';
renderList();
}
/* 删除餐品 */
function removeDish(idx) {
dishList.splice(idx, 1);
renderList();
}
/* 渲染列表 */
function renderList() {
var listEl = document.getElementById('dishList');
document.getElementById('dishCount').textContent = dishList.length;
var saveBtn = document.getElementById('saveBtn');
saveBtn.disabled = dishList.length === 0;
if (dishList.length === 0) {
listEl.innerHTML = '<div class="list-empty">暂无餐品,请输入名称并拍照后添加</div>';
return;
}
listEl.innerHTML = dishList.map(function(d, idx) {
return '<div class="dish-row">'
+ '<div class="dish-thumb" style="background-image:url(' + d.image + ')"></div>'
+ '<div class="dish-info">'
+ '<div class="dish-name">' + escapeHtml(d.name) + '</div>'
+ '<div class="dish-sub">拍照记录</div>'
+ '</div>'
+ '<button class="del-btn" onclick="removeDish(' + idx + ')">×</button>'
+ '</div>';
}).join('');
}
/* 简单转义,避免 name 中含 HTML 特殊字符 */
function escapeHtml(s) {
return s.replace(/[&<>"']/g, function(c) {
return ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'})[c];
});
}
/* 保存到 sessionStorage 并返回首页 */
function saveAll() {
if (dishList.length === 0) return;
try {
sessionStorage.setItem('photoRecord_' + currentMeal, JSON.stringify(dishList));
} catch (e) {
alert('保存失败:图片数据过大');
return;
}
location.href = 'eat-home.html';
}
/* 初始化 */
renderList();
</script>
</body>
</html>
+16 -15
View File
@@ -274,7 +274,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
<div class="form-group"><label>净菜类型<span class="required">*</span></label><select class="form-select" id="ingredientNetType" disabled><option value="">请先选择食材</option></select></div>
</div>
<div class="form-row"><div class="form-group"><label>用量(g/份)<span class="required">*</span></label><input class="form-input" type="number" id="ingredientAmount" placeholder="请输入用量"></div><div class="form-group"><label>是否主料</label><select class="form-select" id="ingredientIsMain"><option></option><option>主料</option></select></div></div>
<div class="form-row"><div class="form-group"><label>用量(g/份)<span class="required">*</span></label><input class="form-input" type="number" id="ingredientAmount" placeholder="请输入用量"></div><div class="form-group"><label>食材类型</label><select class="form-select" id="ingredientType"><option></option><option></option><option></option></select></div></div>
<div class="form-row"><div class="form-group"><label>过敏原</label><input class="form-input" type="text" id="ingredientAllergen" placeholder="无则填无"></div><div class="form-group"><label>备注</label><input class="form-input" type="text" id="ingredientNote" placeholder="请输入备注信息"></div></div>
</div>
<div class="dialog__footer">
@@ -302,9 +302,9 @@ var INNOV_MAP = {
expNo:'INN-H002', goal:'添加燕麦、藜麦,膳食纤维提升3倍', members:'厨师长陈磊 / 营养师王芳',
name:'高纤维主食包', category:'主食', meal:'早/午', pyramid:'谷薯杂豆', allergen:'无', tag:'高纤维',
composition:[
{name:'燕麦',netType:'燕麦片',amount:80,pct:'40%',main:true,allergen:'无',note:'提升纤维'},
{name:'藜麦',netType:'藜麦粒',amount:60,pct:'30%',main:true,allergen:'无',note:'低GI'},
{name:'大米',netType:'熟米饭',amount:60,pct:'30%',main:false,allergen:'无',note:'基底'}
{name:'燕麦',netType:'燕麦片',amount:80,pct:'40%',type:'主材',allergen:'无',note:'提升纤维'},
{name:'藜麦',netType:'藜麦粒',amount:60,pct:'30%',type:'主材',allergen:'无',note:'低GI'},
{name:'大米',netType:'熟米饭',amount:60,pct:'30%',type:'辅材',allergen:'无',note:'基底'}
],
cook:{mainMethod:'蒸',subMethod:'无',heat:'大火→中火',duration:30,oil:0,salt:3,temp:100,output:200,steps:4,desc:''},
nutri:{calorie:342,protein:12.8,carb:58.4,fat:5.2,vitC:0,mineral:38,fiber:9.6,sodium:210},
@@ -317,10 +317,10 @@ var INNOV_MAP = {
expNo:'INN-H004', goal:'搭配维C食材,补铁效率提升2倍', members:'厨师长赵敏 / 营养师李明',
name:'富铁青菜汤', category:'汤品', meal:'午/晚', pyramid:'蔬菜', allergen:'大豆', tag:'高铁',
composition:[
{name:'菠菜',netType:'菠菜段',amount:120,pct:'40%',main:true,allergen:'无',note:'高铁来源'},
{name:'豆腐',netType:'豆腐块',amount:80,pct:'27%',main:true,allergen:'大豆',note:'补充蛋白'},
{name:'胡萝卜',netType:'胡萝卜丝',amount:40,pct:'13%',main:false,allergen:'无',note:'维C协同'},
{name:'食用油',netType:'净油',amount:5,pct:'2%',main:false,allergen:'无',note:'少量'}
{name:'菠菜',netType:'菠菜段',amount:120,pct:'40%',type:'主材',allergen:'无',note:'高铁来源'},
{name:'豆腐',netType:'豆腐块',amount:80,pct:'27%',type:'主材',allergen:'大豆',note:'补充蛋白'},
{name:'胡萝卜',netType:'胡萝卜丝',amount:40,pct:'13%',type:'辅材',allergen:'无',note:'维C协同'},
{name:'食用油',netType:'净油',amount:5,pct:'2%',type:'调料',allergen:'无',note:'少量'}
],
cook:{mainMethod:'煮',subMethod:'无',heat:'大火→小火',duration:15,oil:5,salt:2,temp:100,output:300,steps:3,desc:''},
nutri:{calorie:68,protein:5.4,carb:6.2,fat:2.8,vitC:32,mineral:86,fiber:2.4,sodium:320},
@@ -394,7 +394,7 @@ var STEP_HTML = [
<button class="btn btn-primary" style="height:30px;font-size:var(--font-xs);" onclick="openIngredientDialog()"> 新增食材</button>
</div>
<table class="ingredient-table">
<thead><tr><th>食材名称</th><th>净菜类型</th><th>用量(g/份)</th><th>是否主料</th><th>过敏原</th><th>备注</th><th>操作</th></tr></thead>
<thead><tr><th>食材名称</th><th>净菜类型</th><th>用量(g/份)</th><th>食材类型</th><th>过敏原</th><th>备注</th><th>操作</th></tr></thead>
<tbody><tr><td colspan="7" style="text-align:center;color:var(--text-placeholder);padding:32px;">暂无食材,请点击"新增食材"添加</td></tr></tbody>
</table>`,
@@ -564,7 +564,7 @@ function resetIngredientForm(){
netTypeSelect.disabled=true;
}
document.getElementById('ingredientAmount').value='';
document.getElementById('ingredientIsMain').selectedIndex=0;
document.getElementById('ingredientType').selectedIndex=0;
document.getElementById('ingredientAllergen').value='';
document.getElementById('ingredientNote').value='';
}
@@ -591,7 +591,7 @@ function confirmAddIngredient(){
if(!name){alert('请选择食材');return;}
if(!netType){alert('请选择净菜类型');return;}
if(!amount){alert('请填写用量');return;}
var isMain=document.getElementById('ingredientIsMain').value;
var ingredientType=document.getElementById('ingredientType').value;
var allergen=document.getElementById('ingredientAllergen').value.trim()||'无';
var note=document.getElementById('ingredientNote').value.trim()||'—';
var tbody=document.querySelector('.ingredient-table tbody');
@@ -599,8 +599,9 @@ function confirmAddIngredient(){
var emptyRow=tbody.querySelector('td[colspan]');
if(emptyRow) emptyRow.parentElement.remove();
var tr=document.createElement('tr');
var typeTagMap={'主材':'tag-blue','辅材':'tag-gray','调料':'tag-orange'};
tr.innerHTML='<td>'+name+'</td><td>'+netType+'</td><td>'+amount+'</td>'
+'<td>'+(isMain==='主料'?'<span class="tag tag-blue">主料</span>':'<span class="tag tag-gray">辅料</span>')+'</td>'
+'<td><span class="tag '+(typeTagMap[ingredientType]||'tag-gray')+'">'+ingredientType+'</span></td>'
+'<td>'+allergen+'</td>'
+'<td>'+note+'</td>'
+'<td><a class="link" onclick="this.closest(\'tr\').remove()">删除</a></td>';
@@ -678,7 +679,7 @@ var EDIT_DATA = {
allergen:'无', tag:'高蛋白', status:'上架',
crowd:[{name:'成人',level:'推荐'},{name:'高血脂人群',level:'慎食'},{name:'高血压人群',level:'适量'}],
specs:[{spec:'标准份',weight:200,price:12,isDefault:true},{spec:'小份',weight:120,price:8,isDefault:false},{spec:'大份',weight:300,price:18,isDefault:false}],
composition:[{name:'五花肉',netType:'红烧块',amount:150,pct:'60%',main:true,allergen:'无',note:'—'},{name:'冰糖',netType:'糖浆',amount:20,pct:'8%',main:false,allergen:'无',note:'上色'},{name:'酱油',netType:'调味汁',amount:15,pct:'6%',main:false,allergen:'含大豆',note:'调味'},{name:'料酒',netType:'料酒汁',amount:10,pct:'4%',main:false,allergen:'无',note:'去腥'}],
composition:[{name:'五花肉',netType:'红烧块',amount:150,pct:'60%',type:'主材',allergen:'无',note:'—'},{name:'冰糖',netType:'糖浆',amount:20,pct:'8%',type:'调料',allergen:'无',note:'上色'},{name:'酱油',netType:'调味汁',amount:15,pct:'6%',type:'调料',allergen:'含大豆',note:'调味'},{name:'料酒',netType:'料酒汁',amount:10,pct:'4%',type:'调料',allergen:'无',note:'去腥'}],
cook:{mainMethod:'炖',subMethod:'煎',heat:'中火→小火',duration:45,oil:15,salt:3,temp:100,output:200,steps:6,desc:'1.五花肉切块焯水;2.锅中煎至金黄;3.加冰糖炒色;4.加酱油料酒;5.加水小火炖40分钟;6.大火收汁'},
nutri:{calorie:385,protein:18.2,carb:12.4,fat:28.6,vitC:2.1,mineral:45,fiber:1.8,sodium:486},
taste:{sour:1,sweet:3,bitter:1,spicy:1,salty:4,smell:4.2,flavorScore:3.8,flavorGrade:'good'},
@@ -773,8 +774,8 @@ function fillEditData(){
d.composition.forEach(function(c){
var tr = document.createElement('tr');
tr.innerHTML = (pageMode==='convert'
? '<td>'+c.name+'</td><td>'+(c.netType||'—')+'</td><td>'+c.amount+'g</td><td><span class="tag tag-'+(c.main?'green':'gray')+'">'+(c.main?'主料':'辅')+'</span></td><td>'+c.allergen+'</td><td>'+c.note+'</td><td><span style="color:#bbb;cursor:not-allowed;">编辑</span> <span style="color:#bbb;cursor:not-allowed;">删除</span></td>'
: '<td>'+c.name+'</td><td>'+(c.netType||'—')+'</td><td>'+c.amount+'g</td><td><span class="tag tag-'+(c.main?'green':'gray')+'">'+(c.main?'主料':'辅')+'</span></td><td>'+c.allergen+'</td><td>'+c.note+'</td><td><span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td>');
? '<td>'+c.name+'</td><td>'+(c.netType||'—')+'</td><td>'+c.amount+'g</td><td><span class="tag '+(c.type==='主材'?'tag-blue':c.type==='调料'?'tag-orange':'tag-gray')+'">'+(c.type||'辅')+'</span></td><td>'+c.allergen+'</td><td>'+c.note+'</td><td><span style="color:#bbb;cursor:not-allowed;">编辑</span> <span style="color:#bbb;cursor:not-allowed;">删除</span></td>'
: '<td>'+c.name+'</td><td>'+(c.netType||'—')+'</td><td>'+c.amount+'g</td><td><span class="tag '+(c.type==='主材'?'tag-blue':c.type==='调料'?'tag-orange':'tag-gray')+'">'+(c.type||'辅')+'</span></td><td>'+c.allergen+'</td><td>'+c.note+'</td><td><span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td>');
tbody.appendChild(tr);
});
}
+8 -8
View File
@@ -275,7 +275,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
// 餐品数据
const DISHES = [
{id:'DISH001',name:'红烧肉',icon:'🥩',category:'荤菜',tags:['高蛋白'],specs:[{name:'标准份',weight:200,price:12,isDefault:true},{name:'小份',weight:120,price:8},{name:'大份',weight:300,price:18}],method:'炖',meal:'午/晚',allergen:'无',status:'启用',source:'手动添加',weightBasePrice:'6.00',weightVipPrice:'5.40',crowd:[{name:'成人',level:'推荐'},{name:'高血脂人群',level:'慎食'},{name:'高血压人群',level:'适量'}],crowdNote:'高血脂人群控制摄入量',
composition:[{name:'猪五花肉',netType:'红烧块',amount:160,pct:'80%',state:'净菜',main:true,allergen:'无',note:'—'},{name:'生姜',netType:'姜片',amount:5,pct:'2.5%',state:'净菜',main:false,allergen:'无',note:'—'},{name:'生抽',netType:'调味汁',amount:15,pct:'7.5%',state:'原料',main:false,allergen:'含麸质',note:'酱油'},{name:'冰糖',netType:'糖浆',amount:10,pct:'5%',state:'原料',main:false,allergen:'无',note:'上色提味'},{name:'料酒',netType:'料酒汁',amount:10,pct:'5%',state:'原料',main:false,allergen:'无',note:'去腥'}],
composition:[{name:'猪五花肉',netType:'红烧块',amount:160,pct:'80%',state:'净菜',type:'主材',allergen:'无',note:'—'},{name:'生姜',netType:'姜片',amount:5,pct:'2.5%',state:'净菜',type:'辅材',allergen:'无',note:'—'},{name:'生抽',netType:'调味汁',amount:15,pct:'7.5%',state:'原料',type:'调料',allergen:'含麸质',note:'酱油'},{name:'冰糖',netType:'糖浆',amount:10,pct:'5%',state:'原料',type:'调料',allergen:'无',note:'上色提味'},{name:'料酒',netType:'料酒汁',amount:10,pct:'5%',state:'原料',type:'调料',allergen:'无',note:'去腥'}],
nutri:{calorie:385,protein:18.2,carb:12.4,fat:28.6,vitC:0.8,mineral:42,fiber:0.3,sodium:486,nutriGrade:'偏差',note:'铁2.4mg、锌1.8mg'},
cook:{mainMethod:'炖',subMethod:'煎',heat:'中火→小火',duration:45,oil:15,salt:3,temp:'100→80',output:200,steps:6},
taste:{sour:1,sweet:3,bitter:1,spicy:1,salty:4,smell:4.2,flavorScore:3.8,flavorGrade:'良好'},
@@ -283,7 +283,7 @@ const DISHES = [
texture:{hardness:2,sticky:3,crispy:1,smooth:4,elastic:3,textureScore:3.6,textureGrade:'良好'}
},
{id:'DISH002',name:'清炒时蔬',icon:'🥬',category:'素菜',tags:['低脂','素食'],specs:[{name:'标准份',weight:150,price:6,isDefault:true},{name:'小份',weight:100,price:4}],method:'炒',meal:'早/午/晚',allergen:'无',status:'启用',source:'系统内置',weightBasePrice:'3.00',weightVipPrice:'2.70',crowd:[{name:'全人群',level:'推荐'},{name:'糖尿病人群',level:'推荐'},{name:'肾结石人群',level:'慎食'}],crowdNote:'肾结石人群慎食(草酸含量高)',
composition:[{name:'时令青菜',netType:'青菜段',amount:120,pct:'80%',state:'净菜',main:true,allergen:'无',note:'—'},{name:'蒜末',netType:'蒜末',amount:5,pct:'3.3%',state:'净菜',main:false,allergen:'无',note:'—'},{name:'食用油',netType:'净油',amount:8,pct:'5.3%',state:'原料',main:false,allergen:'无',note:'—'},{name:'食盐',netType:'盐粒',amount:2,pct:'1.3%',state:'原料',main:false,allergen:'无',note:'—'}],
composition:[{name:'时令青菜',netType:'青菜段',amount:120,pct:'80%',state:'净菜',type:'主材',allergen:'无',note:'—'},{name:'蒜末',netType:'蒜末',amount:5,pct:'3.3%',state:'净菜',type:'调料',allergen:'无',note:'—'},{name:'食用油',netType:'净油',amount:8,pct:'5.3%',state:'原料',type:'调料',allergen:'无',note:'—'},{name:'食盐',netType:'盐粒',amount:2,pct:'1.3%',state:'原料',type:'调料',allergen:'无',note:'—'}],
nutri:{calorie:68,protein:2.1,carb:8.6,fat:3.2,vitC:28.5,mineral:86,fiber:2.4,sodium:186,nutriGrade:'达标',note:'铁1.2mg、钙45mg'},
cook:{mainMethod:'炒',subMethod:'—',heat:'大火',duration:5,oil:8,salt:2,temp:'200',output:150,steps:4},
taste:{sour:1,sweet:2,bitter:1,spicy:1,salty:2,smell:3.5,flavorScore:3.2,flavorGrade:'一般'},
@@ -291,7 +291,7 @@ const DISHES = [
texture:{hardness:3,sticky:1,crispy:4,smooth:3,elastic:2,textureScore:3.4,textureGrade:'良好'}
},
{id:'DISH003',name:'番茄鸡蛋汤',icon:'🍅',category:'汤品',tags:['低卡'],specs:[{name:'标准份',weight:300,price:5,isDefault:true}],method:'煮',meal:'午/晚',allergen:'含蛋类',status:'启用',source:'系统内置',weightBasePrice:'1.67',weightVipPrice:'1.50',crowd:[{name:'全人群',level:'推荐'},{name:'儿童',level:'推荐'},{name:'老年人',level:'推荐'}],crowdNote:'',
composition:[{name:'番茄',netType:'番茄块',amount:150,pct:'50%',state:'净菜',main:true,allergen:'无',note:'—'},{name:'鸡蛋',netType:'鸡蛋液',amount:60,pct:'20%',state:'原料',main:true,allergen:'含蛋类',note:'—'},{name:'食用油',netType:'净油',amount:5,pct:'1.7%',state:'原料',main:false,allergen:'无',note:'—'},{name:'食盐',netType:'盐粒',amount:2,pct:'0.7%',state:'原料',main:false,allergen:'无',note:'—'}],
composition:[{name:'番茄',netType:'番茄块',amount:150,pct:'50%',state:'净菜',type:'主材',allergen:'无',note:'—'},{name:'鸡蛋',netType:'鸡蛋液',amount:60,pct:'20%',state:'原料',type:'主材',allergen:'含蛋类',note:'—'},{name:'食用油',netType:'净油',amount:5,pct:'1.7%',state:'原料',type:'调料',allergen:'无',note:'—'},{name:'食盐',netType:'盐粒',amount:2,pct:'0.7%',state:'原料',type:'调料',allergen:'无',note:'—'}],
nutri:{calorie:45,protein:3.8,carb:4.2,fat:2.1,vitC:18.2,mineral:32,fiber:1.1,sodium:280,nutriGrade:'达标',note:'铁0.8mg、钾210mg'},
cook:{mainMethod:'煮',subMethod:'炒',heat:'中火',duration:12,oil:5,salt:2,temp:'100',output:300,steps:5},
taste:{sour:3,sweet:2,bitter:1,spicy:1,salty:2,smell:3.8,flavorScore:3.5,flavorGrade:'良好'},
@@ -299,7 +299,7 @@ const DISHES = [
texture:{hardness:1,sticky:2,crispy:1,smooth:5,elastic:2,textureScore:3.8,textureGrade:'良好'}
},
{id:'DISH004',name:'米饭',icon:'🍚',category:'主食',tags:['主食'],specs:[{name:'标准份',weight:200,price:3,isDefault:true},{name:'小份',weight:100,price:2},{name:'大份',weight:300,price:4}],method:'蒸',meal:'早/午/晚',allergen:'无',status:'启用',source:'系统内置',weightBasePrice:'1.50',weightVipPrice:'1.35',crowd:[{name:'全人群',level:'推荐'},{name:'糖尿病人群',level:'适量'}],crowdNote:'糖尿病人群注意控制量',
composition:[{name:'大米',netType:'熟米饭',amount:100,pct:'100%',state:'原料',main:true,allergen:'无',note:'—'}],
composition:[{name:'大米',netType:'熟米饭',amount:100,pct:'100%',state:'原料',type:'主材',allergen:'无',note:'—'}],
nutri:{calorie:232,protein:4.8,carb:51.2,fat:0.6,vitC:0,mineral:12,fiber:0.4,sodium:3,nutriGrade:'达标',note:'—'},
cook:{mainMethod:'蒸',subMethod:'—',heat:'大火→中火',duration:30,oil:0,salt:0,temp:'100',output:200,steps:2},
taste:{sour:1,sweet:2,bitter:1,spicy:1,salty:1,smell:3.0,flavorScore:2.8,flavorGrade:'一般'},
@@ -307,7 +307,7 @@ const DISHES = [
texture:{hardness:2,sticky:3,crispy:1,smooth:3,elastic:2,textureScore:3.2,textureGrade:'一般'}
},
{id:'DISH005',name:'糖醋里脊',icon:'🍖',category:'荤菜',tags:['高糖'],specs:[{name:'标准份',weight:180,price:14,isDefault:true},{name:'大份',weight:280,price:20}],method:'炸',meal:'午',allergen:'无',status:'停用',source:'味养创新',weightBasePrice:'7.78',weightVipPrice:'7.00',crowd:[{name:'成人',level:'推荐'},{name:'糖尿病人群',level:'慎食'},{name:'高血脂人群',level:'适量'}],crowdNote:'糖尿病人群慎食,含糖量高',
composition:[{name:'猪里脊肉',netType:'里脊丝',amount:120,pct:'66.7%',state:'净菜',main:true,allergen:'无',note:'—'},{name:'淀粉',netType:'淀粉糊',amount:20,pct:'11.1%',state:'原料',main:false,allergen:'无',note:'挂糊'},{name:'白糖',netType:'糖浆',amount:25,pct:'13.9%',state:'原料',main:false,allergen:'无',note:'糖醋汁'},{name:'食醋',netType:'调味汁',amount:15,pct:'8.3%',state:'原料',main:false,allergen:'无',note:'糖醋汁'}],
composition:[{name:'猪里脊肉',netType:'里脊丝',amount:120,pct:'66.7%',state:'净菜',type:'主材',allergen:'无',note:'—'},{name:'淀粉',netType:'淀粉糊',amount:20,pct:'11.1%',state:'原料',type:'辅材',allergen:'无',note:'挂糊'},{name:'白糖',netType:'糖浆',amount:25,pct:'13.9%',state:'原料',type:'调料',allergen:'无',note:'糖醋汁'},{name:'食醋',netType:'调味汁',amount:15,pct:'8.3%',state:'原料',type:'调料',allergen:'无',note:'糖醋汁'}],
nutri:{calorie:420,protein:22.4,carb:38.2,fat:18.6,vitC:1.2,mineral:28,fiber:0.6,sodium:620,nutriGrade:'未达标',note:'铁1.8mg'},
cook:{mainMethod:'炸',subMethod:'炒',heat:'大火',duration:15,oil:50,salt:1,temp:'180',output:180,steps:7},
taste:{sour:4,sweet:4,bitter:1,spicy:1,salty:3,smell:4.0,flavorScore:4.2,flavorGrade:'良好'},
@@ -385,9 +385,9 @@ function renderBasic(d){
}
function renderComposition(d){
const rows = (d.composition||[]).map(c=>`<tr><td>${c.name}</td><td>${c.netType}</td><td>${c.amount}</td><td>${c.pct}</td><td><span class="tag tag-${c.main?'green':'gray'}">${c.main?'主料':'辅'}</span></td><td>${c.allergen}</td><td>${c.note}</td></tr>`).join('');
const rows = (d.composition||[]).map(c=>`<tr><td>${c.name}</td><td>${c.netType}</td><td>${c.amount}</td><td>${c.pct}</td><td><span class="tag tag-${c.type==='主材'?'blue':c.type==='调料'?'orange':'gray'}">${c.type||'辅'}</span></td><td>${c.allergen}</td><td>${c.note}</td></tr>`).join('');
return `<div class="info-section"><div class="info-section__title">食材构成(共 ${(d.composition||[]).length} 项) <span><a class="link" href="din-dish-add.html?mode=edit&tab=1">编辑</a></span></div>
<table class="info-table"><thead><tr><th>食材名称</th><th>净菜类型</th><th>用量(g/份)</th><th>占比(%)</th><th>是否主料</th><th>过敏原</th><th>备注</th></tr></thead><tbody>${rows}</tbody></table></div>`;
<table class="info-table"><thead><tr><th>食材名称</th><th>净菜类型</th><th>用量(g/份)</th><th>占比(%)</th><th>食材类型</th><th>过敏原</th><th>备注</th></tr></thead><tbody>${rows}</tbody></table></div>`;
}
function renderCook(d){
@@ -513,7 +513,7 @@ renderDetail();
<div class="form-group"><label>加工状态</label><select class="form-select"><option>请选择</option><option>原料</option><option>净菜</option><option>半成品</option></select></div>
</div>
<div class="form-row">
<div class="form-group"><label>是否主料</label><select class="form-select"><option></option><option>主料</option></select></div>
<div class="form-group"><label>食材类型</label><select class="form-select"><option></option><option></option><option></option></select></div>
<div class="form-group"><label>过敏原</label><input class="form-input" type="text" placeholder="无则填无"></div>
</div>
<div class="form-group"><label>备注</label><input class="form-input" type="text" placeholder="请输入备注信息"></div>
+25
View File
@@ -97,6 +97,8 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
.btn-outline-danger:hover{background:#FFF1F0;}
.btn-outline-primary{height:36px;padding:0 16px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:1px solid var(--primary);color:var(--primary);background:#fff;display:inline-flex;align-items:center;gap:6px;transition:all .2s;}
.btn-outline-primary:hover{background:var(--primary-light);}
.sync-tag{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 12px;border-radius:var(--radius-sm);background:#F6FFED;border:1px solid #B7EB8F;color:var(--success);font-size:var(--font-sm);}
.sync-dot{width:8px;height:8px;border-radius:50%;background:var(--success);box-shadow:0 0 0 3px rgba(82,196,26,0.18);}
.week-grid{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden;border:1px solid var(--border);}
.week-grid table{width:100%;border-collapse:collapse;table-layout:fixed;}
@@ -319,6 +321,8 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
<button class="btn-outline-danger" id="btnResetWeek">↻ 重置本周</button>
<button class="btn-outline-primary" id="btnReuseRecipe">📋 复用规划食谱</button>
<button class="btn-outline-primary">⧉ 复制到下周</button>
<span class="sync-tag" id="syncTag" style="display:none;"><span class="sync-dot"></span>已同步</span>
<button class="btn-outline-primary" id="btnSyncProd">⇄ 同步至生产任务</button>
</div>
</div>
@@ -810,6 +814,27 @@ function toggleSubgroup(header){header.parentElement.classList.toggle('open');}
document.getElementById('btnResetWeek').addEventListener('click',resetWeek);
})();
/* ===== 同步至生产任务 ===== */
(function(){
var btn=document.getElementById('btnSyncProd');
var tag=document.getElementById('syncTag');
var synced=false;
btn.addEventListener('click',function(){
synced=!synced;
if(synced){
btn.className='btn-outline-danger';
btn.innerHTML='↩ 撤销已同步的生产任务';
tag.style.display='inline-flex';
alert('已同步至生产任务');
}else{
btn.className='btn-outline-primary';
btn.innerHTML='⇄ 同步至生产任务';
tag.style.display='none';
alert('已撤销同步的生产任务');
}
});
})();
/* ===== 复用规划食谱弹窗逻辑 ===== */
(function(){
var RECIPES=[
+7 -7
View File
@@ -185,14 +185,14 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
<div class="table-card__header"><div class="table-card__title">净菜组配</div></div>
<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></thead>
<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></tr></thead>
<tbody>
<tr><td>CMB-001</td><td>宫保鸡丁</td><td>标准份(300g</td><td>50</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('宫保鸡丁')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-green">已完成</span></td><td>李组配</td><td><span class="tag tag-blue">设备自动</span></td><td>2026-05-20 10:30:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-002</td><td>番茄炒蛋</td><td>大份(500g</td><td>80</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('番茄炒蛋')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-green">已完成</span></td><td>王组配</td><td><span class="tag tag-blue">设备自动</span></td><td>2026-05-20 10:45:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-003</td><td>红烧肉</td><td>标准份(300g</td><td>60</td><td>2026-05-20 11:30</td><td><a class="link" onclick="openRecipeModal('红烧肉')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-blue">组配中</span></td><td>张组配</td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" style="color:var(--success)" onclick="finishCombo(this)">完成组配</a></td></tr>
<tr><td>CMB-004</td><td>清蒸鱼</td><td>标准份(500g</td><td>40</td><td>2026-05-20 12:00</td><td><a class="link" onclick="openRecipeModal('清蒸鱼')">食材明细</a></td><td><span class="tag tag-orange">点餐</span></td><td><span class="tag tag-orange">待组配</span></td><td></td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" onclick="startCombo(this)">开始组配</a></td></tr>
<tr><td>CMB-005</td><td>炒时蔬</td><td>小份(200g</td><td>20</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('炒时蔬')">食材明细</a></td><td><span class="tag tag-gray">录入</span></td><td><span class="tag tag-green">已完成</span></td><td>赵组配</td><td><span class="tag tag-blue">设备自动</span></td><td>2026-05-20 10:50:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-006</td><td>豆腐</td><td>小份(200g</td><td>35</td><td>2026-05-20 12:00</td><td><a class="link" onclick="openRecipeModal('豆腐')">食材明细</a></td><td><span class="tag tag-orange">点餐</span></td><td><span class="tag tag-orange">待组配</span></td><td></td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" onclick="startCombo(this)">开始组配</a></td></tr>
<tr><td>CMB-001</td><td>宫保鸡丁</td><td>标准份(300g</td><td>50</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('宫保鸡丁')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-green">已完成</span></td><td>李组配</td><td><span class="tag tag-blue">设备自动</span></td><td><div>智能组配秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">CMB-SCALE-001</div></td><td>2026-05-20 10:30:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-002</td><td>番茄炒蛋</td><td>大份(500g</td><td>80</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('番茄炒蛋')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-green">已完成</span></td><td>王组配</td><td><span class="tag tag-blue">设备自动</span></td><td><div>智能组配秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">CMB-SCALE-002</div></td><td>2026-05-20 10:45:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-003</td><td>红烧肉</td><td>标准份(300g</td><td>60</td><td>2026-05-20 11:30</td><td><a class="link" onclick="openRecipeModal('红烧肉')">食材明细</a></td><td><span class="tag tag-blue">餐线</span></td><td><span class="tag tag-blue">组配中</span></td><td>张组配</td><td><span class="tag tag-green">人工录入</span></td><td></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" style="color:var(--success)" onclick="finishCombo(this)">完成组配</a></td></tr>
<tr><td>CMB-004</td><td>清蒸鱼</td><td>标准份(500g</td><td>40</td><td>2026-05-20 12:00</td><td><a class="link" onclick="openRecipeModal('清蒸鱼')">食材明细</a></td><td><span class="tag tag-orange">点餐</span></td><td><span class="tag tag-orange">待组配</span></td><td></td><td><span class="tag tag-green">人工录入</span></td><td></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" onclick="startCombo(this)">开始组配</a></td></tr>
<tr><td>CMB-005</td><td>炒时蔬</td><td>小份(200g</td><td>20</td><td>2026-05-20 11:00</td><td><a class="link" onclick="openRecipeModal('炒时蔬')">食材明细</a></td><td><span class="tag tag-gray">录入</span></td><td><span class="tag tag-green">已完成</span></td><td>赵组配</td><td><span class="tag tag-blue">设备自动</span></td><td><div>智能组配秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">CMB-SCALE-003</div></td><td>2026-05-20 10:50:00</td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span></td></tr>
<tr><td>CMB-006</td><td>豆腐</td><td>小份(200g</td><td>35</td><td>2026-05-20 12:00</td><td><a class="link" onclick="openRecipeModal('豆腐')">食材明细</a></td><td><span class="tag tag-orange">点餐</span></td><td><span class="tag tag-orange">待组配</span></td><td></td><td><span class="tag tag-green">人工录入</span></td><td></td><td></td><td class="td-actions"><a class="link">食材溯源链路</a> <a class="link">查看视频</a> <span class="action-more"><a class="action-more__trigger">更多 ▾</a><div class="action-more__menu"><a class="action-more__item" onclick="showDetail(this)">详情</a><a class="action-more__item" onclick="openEditModal(this)">编辑</a><a class="action-more__item action-more__item--danger">删除</a></div></span> <a class="link" onclick="startCombo(this)">开始组配</a></td></tr>
</tbody>
</table>
</div>
+6 -6
View File
@@ -200,23 +200,23 @@ tbody td.td-actions{white-space:nowrap;}
<div class="table-card__content">
<table>
<thead><tr>
<th>入库单号</th><th>操作类型</th><th>溯源码</th><th>食材名称</th><th>净菜类型</th><th>入库规格</th><th>入库数量</th><th>入库重量(kg)</th><th>当前库存(kg)</th><th>操作时间</th><th>保质期至</th><th>存储方式</th><th>存放区域</th><th>存放温度(℃)</th><th>操作人</th><th>操作</th>
<th>入库单号</th><th>操作类型</th><th>终端设备</th><th>溯源码</th><th>食材名称</th><th>净菜类型</th><th>入库规格</th><th>入库数量</th><th>入库重量(kg)</th><th>当前库存(kg)</th><th>操作时间</th><th>保质期至</th><th>存储方式</th><th>存放区域</th><th>存放温度(℃)</th><th>操作人</th><th>操作</th>
</tr></thead>
<tbody>
<tr>
<td>NC-IN-001</td><td><span class="tag tag-blue">设备自动</span></td><td>NC-PROC-BOCA-20260415-01</td><td>土豆</td><td>土豆丝</td><td>袋装/500g</td><td>86</td><td>43.0</td><td>31.0</td><td>2026-04-15 09:15</td><td>2026-04-17 09:15</td><td><span class="tag tag-blue">净菜柜</span></td><td>8号柜-A01格口</td><td>4.1</td><td>李入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-001')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
<td>NC-IN-001</td><td><span class="tag tag-blue">设备自动</span></td><td><div>净菜入库秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">NC-IN-SCALE-001</div></td><td>NC-PROC-BOCA-20260415-01</td><td>土豆</td><td>土豆丝</td><td>袋装/500g</td><td>86</td><td>43.0</td><td>31.0</td><td>2026-04-15 09:15</td><td>2026-04-17 09:15</td><td><span class="tag tag-blue">净菜柜</span></td><td>8号柜-A01格口</td><td>4.1</td><td>李入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-001')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
</tr>
<tr>
<td>NC-IN-002</td><td><span class="tag tag-blue">设备自动</span></td><td>NC-PROC-HLUB-20260415-01</td><td>土豆</td><td>土豆片</td><td>袋装/500g</td><td>120</td><td>60.0</td><td>47.5</td><td>2026-04-15 09:45</td><td>2026-04-18 09:45</td><td><span class="tag tag-blue">净菜柜</span></td><td>8号柜-B03格口</td><td>4.2</td><td>王入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-002')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
<td>NC-IN-002</td><td><span class="tag tag-blue">设备自动</span></td><td><div>净菜入库秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">NC-IN-SCALE-002</div></td><td>NC-PROC-HLUB-20260415-01</td><td>土豆</td><td>土豆片</td><td>袋装/500g</td><td>120</td><td>60.0</td><td>47.5</td><td>2026-04-15 09:45</td><td>2026-04-18 09:45</td><td><span class="tag tag-blue">净菜柜</span></td><td>8号柜-B03格口</td><td>4.2</td><td>王入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-002')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
</tr>
<tr>
<td>NC-IN-003</td><td><span class="tag tag-green">人工录入</span></td><td>NC-PROC-XGUO-20260415-01</td><td>土豆</td><td>土豆泥</td><td>盒装/300g</td><td>48</td><td>14.4</td><td>9.0</td><td>2026-04-15 11:00</td><td>2026-04-17 11:00</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-03</td><td>4.0</td><td>李入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-003')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
<td>NC-IN-003</td><td><span class="tag tag-green">人工录入</span></td><td></td><td>NC-PROC-XGUO-20260415-01</td><td>土豆</td><td>土豆泥</td><td>盒装/300g</td><td>48</td><td>14.4</td><td>9.0</td><td>2026-04-15 11:00</td><td>2026-04-17 11:00</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-03</td><td>4.0</td><td>李入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-003')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
</tr>
<tr>
<td>NC-IN-004</td><td><span class="tag tag-green">人工录入</span></td><td>NC-PROC-BCAI-20260415-01</td><td>白菜</td><td>整棵</td><td>散装/整棵</td><td>70</td><td>35.0</td><td>22.5</td><td>2026-04-15 11:30</td><td>2026-04-18 11:30</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-04</td><td>3.8</td><td>张入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-004')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
<td>NC-IN-004</td><td><span class="tag tag-green">人工录入</span></td><td></td><td>NC-PROC-BCAI-20260415-01</td><td>白菜</td><td>整棵</td><td>散装/整棵</td><td>70</td><td>35.0</td><td>22.5</td><td>2026-04-15 11:30</td><td>2026-04-18 11:30</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-04</td><td>3.8</td><td>张入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-004')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
</tr>
<tr>
<td>NC-IN-005</td><td><span class="tag tag-blue">设备自动</span></td><td>NC-PROC-ZLRJ-20260415-01</td><td>猪里脊</td><td>丁(1.5cm</td><td>袋装/400g</td><td>76</td><td>30.4</td><td>18.8</td><td>2026-04-15 12:00</td><td>2026-04-16 12:00</td><td><span class="tag tag-gray">仓库</span></td><td>B仓-肉类区-01</td><td>-2.0</td><td>王入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-005')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
<td>NC-IN-005</td><td><span class="tag tag-blue">设备自动</span></td><td><div>净菜入库秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">NC-IN-SCALE-003</div></td><td>NC-PROC-ZLRJ-20260415-01</td><td>猪里脊</td><td>丁(1.5cm</td><td>袋装/400g</td><td>76</td><td>30.4</td><td>18.8</td><td>2026-04-15 12:00</td><td>2026-04-16 12:00</td><td><span class="tag tag-gray">仓库</span></td><td>B仓-肉类区-01</td><td>-2.0</td><td>王入库</td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="openOutModal('NC-IN-005')">出库明细</span> <span class="action-more"><span class="more-btn">更多 ▾</span><div class="dropdown"><a href="javascript:;" onclick="showDetail(this)">详情</a><a href="javascript:;" onclick="openModal()">编辑</a><a href="javascript:;" class="danger" onclick="if(confirm('确认删除该记录?')){}">删除</a></div></span></td>
</tr>
</tbody>
</table>
+6 -6
View File
@@ -203,23 +203,23 @@ tbody tr:hover{background:#F8FBFF;}
<div class="table-card__content">
<table>
<thead><tr>
<th>入库单号</th><th>操作类型</th><th>溯源码</th><th>来源类型</th><th>食材名称</th><th>供应商</th><th>入库规格</th><th>入库数量</th><th>入库重量(kg)</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>入库重量(kg)</th><th>入库时间</th><th>存储方式</th><th>存放区域</th><th>操作人</th><th>操作</th>
</tr></thead>
<tbody>
<tr>
<td>IN-20260415-001</td><td><span class="tag tag-green">设备自动</span></td><td>ST-FH-FA01-VG-BOCA-286K-20260415-001</td><td><span class="tag tag-blue">自产</span></td><td>菠菜</td><td>A区蔬菜基地</td><td>25kg/件</td><td>12件</td><td>286</td><td>2026-04-15 10:30</td><td><span class="tag tag-green">毛菜柜</span></td><td>8号柜-A01格口</td><td>张三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
<td>IN-20260415-001</td><td><span class="tag tag-green">设备自动</span></td><td><div>毛菜验收秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">RW-SCALE-001</div></td><td>ST-FH-FA01-VG-BOCA-286K-20260415-001</td><td><span class="tag tag-blue">自产</span></td><td>菠菜</td><td>A区蔬菜基地</td><td>25kg/件</td><td>12件</td><td>286</td><td>2026-04-15 10:30</td><td><span class="tag tag-green">毛菜柜</span></td><td>8号柜-A01格口</td><td>张三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
</tr>
<tr>
<td>IN-20260415-002</td><td><span class="tag tag-green">设备自动</span></td><td>ST-EX-LY01-VG-BOCA-050K-20260415-002</td><td><span class="tag tag-gray">外采</span></td><td>菠菜</td><td>绿源蔬菜配送</td><td>10kg/筐</td><td>5筐</td><td>50</td><td>2026-04-15 08:30</td><td><span class="tag tag-green">毛菜柜</span></td><td>8号柜-B03格口</td><td>李三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
<td>IN-20260415-002</td><td><span class="tag tag-green">设备自动</span></td><td><div>毛菜验收秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">RW-SCALE-002</div></td><td>ST-EX-LY01-VG-BOCA-050K-20260415-002</td><td><span class="tag tag-gray">外采</span></td><td>菠菜</td><td>绿源蔬菜配送</td><td>10kg/筐</td><td>5筐</td><td>50</td><td>2026-04-15 08:30</td><td><span class="tag tag-green">毛菜柜</span></td><td>8号柜-B03格口</td><td>李三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
</tr>
<tr>
<td>IN-20260415-003</td><td><span class="tag tag-orange">人工录入</span></td><td>ST-EX-XR01-MT-ZLRJ-080K-20260415-005</td><td><span class="tag tag-gray">外采</span></td><td>猪里脊</td><td>鲜肉直供公司</td><td>20kg/箱</td><td>4箱</td><td>80</td><td>2026-04-15 09:15</td><td><span class="tag tag-gray">仓库</span></td><td>B仓-肉类区-01</td><td>王三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
<td>IN-20260415-003</td><td><span class="tag tag-orange">人工录入</span></td><td></td><td>ST-EX-XR01-MT-ZLRJ-080K-20260415-005</td><td><span class="tag tag-gray">外采</span></td><td>猪里脊</td><td>鲜肉直供公司</td><td>20kg/箱</td><td>4箱</td><td>80</td><td>2026-04-15 09:15</td><td><span class="tag tag-gray">仓库</span></td><td>B仓-肉类区-01</td><td>王三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
</tr>
<tr>
<td>IN-20260415-004</td><td><span class="tag tag-orange">人工录入</span></td><td>ST-EX-HS01-SF-CAYO-060K-20260414-001</td><td><span class="tag tag-gray">外采</span></td><td>草鱼</td><td>海鲜水产配送</td><td>散装(kg)</td><td>60kg</td><td>60</td><td>2026-04-15 09:45</td><td><span class="tag tag-gray">仓库</span></td><td>C仓-水产区-01</td><td>李三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
<td>IN-20260415-004</td><td><span class="tag tag-orange">人工录入</span></td><td></td><td>ST-EX-HS01-SF-CAYO-060K-20260414-001</td><td><span class="tag tag-gray">外采</span></td><td>草鱼</td><td>海鲜水产配送</td><td>散装(kg)</td><td>60kg</td><td>60</td><td>2026-04-15 09:45</td><td><span class="tag tag-gray">仓库</span></td><td>C仓-水产区-01</td><td>李三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
</tr>
<tr>
<td>IN-20260416-005</td><td><span class="tag tag-green">设备自动</span></td><td>ST-FH-FB01-VG-HLUB-420K-20260415-002</td><td><span class="tag tag-blue">自产</span></td><td>胡萝卜</td><td>B区根茎基地</td><td>25kg/件</td><td>17件</td><td>420</td><td>2026-04-16 11:00</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-03</td><td>张三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
<td>IN-20260416-005</td><td><span class="tag tag-green">设备自动</span></td><td><div>毛菜验收秤</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">RW-SCALE-003</div></td><td>ST-FH-FB01-VG-HLUB-420K-20260415-002</td><td><span class="tag tag-blue">自产</span></td><td>胡萝卜</td><td>B区根茎基地</td><td>25kg/件</td><td>17件</td><td>420</td><td>2026-04-16 11:00</td><td><span class="tag tag-gray">仓库</span></td><td>A仓-蔬菜区-03</td><td>张三丰</td><td class="td-actions"><span class="link" onclick="openVideo()">查看视频</span> <span class="link">编辑</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link" style="color:var(--danger)">删除</span></td>
</tr>
</tbody>
</table>
+13 -13
View File
@@ -208,15 +208,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><th>包装规格</th><th>包装份数</th><th>包装日期</th><th>保质期至</th><th>存放温度(℃)</th><th>包装人</th><th>操作类型</th><th>终端设备</th><th>操作</th>
</tr></thead>
<tbody>
<tr><td>BATCH-NC-20260415-01</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>500</td><td>20</td><td>2026-04-15</td><td>2026-04-17</td><td>4.1</td><td>李包装</td><td>PKG-T01</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-01</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>500</td><td>20</td><td>2026-04-15</td><td>2026-04-17</td><td>4.1</td><td>李包装</td><td>PKG-T01</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-02</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">保鲜盒</span></td><td>1000</td><td>15</td><td>2026-04-15</td><td>2026-04-18</td><td>4.2</td><td>王包装</td><td>PKG-T01</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-02</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">保鲜盒</span></td><td>1000</td><td>15</td><td>2026-04-15</td><td>2026-04-18</td><td>4.2</td><td>王包装</td><td>PKG-T01</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-03</td><td>NC-PROC-XGUO-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">散装托盘</span></td><td>2000</td><td>8</td><td>2026-04-15</td><td>2026-04-17</td><td>4.0</td><td>张包装</td><td>PKG-T02</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-04</td><td>NC-PROC-LAJP-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>1000</td><td>12</td><td>2026-04-15</td><td>2026-04-17</td><td>4.3</td><td>李包装</td><td>PKG-T02</td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-01</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>500</td><td>20</td><td>2026-04-15</td><td>2026-04-17</td><td>4.1</td><td>李包装</td><td><span class="tag tag-blue">设备自动</span></td><td><div>真空机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T01</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-01</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>500</td><td>20</td><td>2026-04-15</td><td>2026-04-17</td><td>4.1</td><td>李包装</td><td><span class="tag tag-blue">设备自动</span></td><td><div>真空机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T01</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-02</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">保鲜盒</span></td><td>1000</td><td>15</td><td>2026-04-15</td><td>2026-04-18</td><td>4.2</td><td>王包装</td><td><span class="tag tag-blue">设备自动</span></td><td><div>真空机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T01</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-02</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">保鲜盒</span></td><td>1000</td><td>15</td><td>2026-04-15</td><td>2026-04-18</td><td>4.2</td><td>王包装</td><td><span class="tag tag-blue">设备自动</span></td><td><div>真空机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T01</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-03</td><td>NC-PROC-XGUO-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">散装托盘</span></td><td>2000</td><td>8</td><td>2026-04-15</td><td>2026-04-17</td><td>4.0</td><td>张包装</td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-NC-20260415-04</td><td>NC-PROC-LAJP-20260415-01</td><td>土豆-土豆丝</td><td><span class="tag tag-gray">真空袋</span></td><td>1000</td><td>12</td><td>2026-04-15</td><td>2026-04-17</td><td>4.3</td><td>李包装</td><td><span class="tag tag-blue">设备自动</span></td><td><div>真空机-2号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T02</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
</tbody>
</table>
</div>
@@ -253,14 +253,14 @@ 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><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>BATCH-DH-20260415-01</td><td>宫保鸡丁</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>10</td><td><span class="link" onclick="showIngredients(0)">3种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.8</td><td>赵配餐</td><td>PKG-T03</td><td><span class="tag tag-blue">设备自动</span></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-01</td><td>宫保鸡丁</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>10</td><td><span class="link" onclick="showIngredients(0)">3种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.8</td><td>赵配餐</td><td>PKG-T03</td><td><span class="tag tag-blue">设备自动</span></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-02</td><td>清蒸鱼</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">保鲜盒</span></td><td>8</td><td><span class="link" onclick="showIngredients(1)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.5</td><td>陈配餐</td><td>PKG-T03</td><td><span class="tag tag-green">人工录入</span></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-03</td><td>蒜蓉菠菜</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>12</td><td><span class="link" onclick="showIngredients(2)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>4.0</td><td>陈配餐</td><td>PKG-T04</td><td><span class="tag tag-green">人工录入</span></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-04</td><td>炒胡萝卜</td><td><span class="tag tag-blue">大份(800g</span></td><td><span class="tag tag-gray">保鲜盒</span></td><td>6</td><td><span class="link" onclick="showIngredients(3)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>4.2</td><td>赵配餐</td><td>PKG-T04</td><td><span class="tag tag-blue">设备自动</span></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-01</td><td>宫保鸡丁</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>10</td><td><span class="link" onclick="showIngredients(0)">3种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.8</td><td>赵配餐</td><td><span class="tag tag-blue">设备自动</span></td><td><div>封口机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T03</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-01</td><td>宫保鸡丁</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>10</td><td><span class="link" onclick="showIngredients(0)">3种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.8</td><td>赵配餐</td><td><span class="tag tag-blue">设备自动</span></td><td><div>封口机-1号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T03</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-02</td><td>清蒸鱼</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">保鲜盒</span></td><td>8</td><td><span class="link" onclick="showIngredients(1)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>3.5</td><td>陈配餐</td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-03</td><td>蒜蓉菠菜</td><td><span class="tag tag-green">标准份(500g</span></td><td><span class="tag tag-gray">冷鲜袋</span></td><td>12</td><td><span class="link" onclick="showIngredients(2)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>4.0</td><td>陈配餐</td><td><span class="tag tag-green">人工录入</span></td><td></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
<tr><td>BATCH-DH-20260415-04</td><td>炒胡萝卜</td><td><span class="tag tag-blue">大份(800g</span></td><td><span class="tag tag-gray">保鲜盒</span></td><td>6</td><td><span class="link" onclick="showIngredients(3)">2种</span></td><td>2026-04-15</td><td>2026-04-17</td><td>4.2</td><td>赵配餐</td><td><span class="tag tag-blue">设备自动</span></td><td><div>封口机-2号</div><div style="font-size:var(--font-xs);color:var(--text-secondary);">PKG-T04</div></td><td class="td-actions"><span class="link">查看视频</span> <span class="link" onclick="openEditDh(this)">编辑</span> <span class="link" style="color:var(--danger)">删除</span></td></tr>
</tbody>
</table>
</div>