feat: 营养管理主子表重构——净菜订单/外售/内供/采购/进柜/组配/烹制全面升级,小程序订单页增强
后台营养管理7个页面数据模型从扁平结构重构为主子表(一单多品),支持动态明细行构建、 展开查看、行级确认收货、验收明细弹窗等交互;采购/进柜/组配/烹制同步适配新列。 小程序端订单详情新增支付信息卡片与餐线订单渲染,我的订单新增Tab切换过滤与餐线卡片。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
bb83ecdb37
commit
91621bc48b
@@ -1,11 +1,11 @@
|
||||
_Last synced: 2026-07-23 | Base commit: `ea8239d`_
|
||||
_Last synced: 2026-07-24 | Base commit: `1e7c5a1`_
|
||||
|
||||
# 记忆索引
|
||||
| 文件 | 描述 | 类型 | 最后更新 |
|
||||
|------|------|------|----------|
|
||||
| project_overview.md | 项目技术栈、架构与模块结构 | project | 2026-05-14 |
|
||||
| project_progress.md | 各模块原型开发进度 | project | 2026-07-23 |
|
||||
| project_progress.md | 各模块原型开发进度 | project | 2026-07-24 |
|
||||
| decisions.md | 关键设计决策与架构约定 | project | 2026-06-15 |
|
||||
| feedback.md | 协作规范与用户纠正记录 | feedback | 2026-06-15 |
|
||||
| user_profile.md | 用户角色与偏好 | user | 2026-04-21 |
|
||||
| lint_report.md | 记忆健康检查报告 | lint | 2026-06-26 |
|
||||
| lint_report.md | 记忆健康检查报告 | lint | 2026-07-24 |
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
name: 记忆健康检查报告
|
||||
description: memory-lint 最新一次执行的检查结果与待处理项
|
||||
type: lint
|
||||
last_updated: 2026-07-23
|
||||
last_updated: 2026-07-24
|
||||
---
|
||||
|
||||
# 记忆健康检查报告
|
||||
|
||||
> _执行时间: 2026-07-23 | Base commit: `ea8239d` | Last synced: 2026-07-23_
|
||||
> _执行时间: 2026-07-24 | Base commit: `1e7c5a1` | Last synced: 2026-07-24_
|
||||
|
||||
## 健康概览
|
||||
|
||||
@@ -35,22 +35,22 @@ last_updated: 2026-07-23
|
||||
|
||||
### [ERROR] 严重过期 — user_profile.md
|
||||
|
||||
- **文件**:`user_profile.md`(last_updated: 2026-04-21,距今 93 天,超过 90 天 ERROR 阈值)
|
||||
- **文件**:`user_profile.md`(last_updated: 2026-04-21,距今 94 天,超过 90 天 ERROR 阈值)
|
||||
- **建议**:确认用户角色/偏好是否有变化,执行 `/memory-update` 更新。
|
||||
|
||||
### [WARN] 过期 — project_overview.md
|
||||
|
||||
- **文件**:`project_overview.md`(last_updated: 2026-05-14,距今 70 天)
|
||||
- **文件**:`project_overview.md`(last_updated: 2026-05-14,距今 71 天)
|
||||
- **建议**:确认技术栈、三端架构描述是否需要更新。
|
||||
|
||||
### [WARN] 过期 — decisions.md
|
||||
|
||||
- **文件**:`decisions.md`(last_updated: 2026-06-15,距今 38 天)
|
||||
- **文件**:`decisions.md`(last_updated: 2026-06-15,距今 39 天)
|
||||
- **建议**:确认是否有新增关键决策需要记录。
|
||||
|
||||
### [WARN] 过期 — feedback.md
|
||||
|
||||
- **文件**:`feedback.md`(last_updated: 2026-06-15,距今 38 天)
|
||||
- **文件**:`feedback.md`(last_updated: 2026-06-15,距今 39 天)
|
||||
- **建议**:确认是否有新的协作规范需要记录。
|
||||
|
||||
---
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- `health-consult/` — 健康咨询(32 页)✅
|
||||
- `emergency-medical/` — 应急就医(25+ 页)✅
|
||||
- `health-checkup/` — 健康体检(20+ 页)✅
|
||||
- `weight-management/` — 体重管理(23 页)✅
|
||||
- `weight-management/` — 体重管理(25 页)✅
|
||||
- `weight-main.html` — 体重管理主页(三态切换/英雄区/三态卡片/吃动平衡/体重记录/排行榜/推荐视频)
|
||||
- `goal-commitment.html` — 目标承诺签订(活动/个人双类型+URL参数状态同步)
|
||||
- `goal-management.html` — 目标管理(7种状态多卡片显隐+自我/活动目标切换)
|
||||
@@ -38,6 +38,8 @@
|
||||
- `weight-history.html` — 体重记录历史
|
||||
- `weight-ranking.html` — 排行榜
|
||||
- `weight-report.html` — 体重报告
|
||||
- `eat-checkin-v2.html` — 饮食打卡v2(重构版)
|
||||
- `weight-main-v2.html` — 体重管理主页v2(重构版)
|
||||
- `health-monitor/` — 健康监测(20+ 页)🔨 设计中
|
||||
- `wearable/` — 穿戴设备监测(16 页:血氧/心率/压力/体温/步数/运动/睡眠/血压/心电+告警)
|
||||
- `weight/` — 体重监测(3 页,已独立为 `weight-management/` 模块)
|
||||
@@ -85,10 +87,11 @@
|
||||
Web 管理端和员工端 APP 的其余模块(系统管理、运动管理、健康评估、知识普及、健康数据、心脑血管/糖尿病/癌症预防等)均为待开发状态。
|
||||
|
||||
## 总计
|
||||
- 已完成/设计中:561+ 个 HTML 原型页面
|
||||
- 已完成/设计中:563+ 个 HTML 原型页面
|
||||
- 覆盖模块:18 个(含三端+其他终端)
|
||||
|
||||
## 近期里程碑
|
||||
- 2026-07-24:营养管理后台净菜订单/外售功能增强——prod-clean-order 新增订单类型列/筛选、加工类型重命名、食谱快速创建订单弹窗(选日期→展示餐次菜品→勾选+人数→汇总表);sup-clean-external 新增预定配送时间列/表单字段/详情抽屉;小程序 eat-nutrition 膳食宝塔重构(饮水移至塔基+横排极矮样式+食物分类明细列表);体重管理新增 eat-checkin-v2 饮食打卡v2 和 weight-main-v2 体重管理主页v2。
|
||||
- 2026-07-23:营养管理后台与小程序多项增强——后台:场所新增/编辑页重构(营业时段/场所图片/资质证照 5 卡片区)、食材与餐品总库新增分类管理弹窗(树形增删改查)、食材新增/编辑页支持从已有食材复制;小程序:净菜包订单按状态差异化展示(待配送/配送中/已完成)、履约信息时间选择器重构为日期+时段联动下拉面板、新增收货地址管理页 me-address.html、健康档案移除营养目标分区;同步更新 CHANGELOG 及导航页。
|
||||
- 2026-07-21:导航页 popover 事件冒泡回归再次修复(同一根因第二次出现)——0603113 提交将 popover 重构为延迟渲染模式(首次点击"X 页"才动态构建 DOM),但 `togglePop` 函数内 `insertAdjacentHTML` 模板漏加 `onclick="event.stopPropagation()"`,导致同样的双 tab 打开回归。修复方式:在延迟构建模板中补上 stopPropagation(commit f671764)。系统性教训:嵌套 onclick 结构中子容器的 stopPropagation 在代码重构时极易遗漏,后续涉及 popover/弹层 DOM 创建位置变更时需检查事件冒泡拦截。
|
||||
- 2026-07-20:导航页 popover 事件冒泡回归修复——8a96ead 提交重构 popover 关闭逻辑时误删 `<div class="page-popover">` 上的 `onclick="event.stopPropagation()"`,导致 popover 内 `<a>` 点击事件冒泡到父级 `module-card` 触发 `window.open` 打开模块入口页,与 `<a>` 默认跳转叠加造成点击"页面总览"等列表项时同时打开两个 tab。修复方式:恢复 popover 容器上的 stopPropagation,与新版本 document click 监听器(靠 `closest` 判断)兼容(commit 5c518cb)。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!-- Last updated: 2026-07-23 | Commit: ea8239d -->
|
||||
<!-- Last updated: 2026-07-24 | Commit: 1e7c5a1 -->
|
||||
# 项目约束
|
||||
|
||||
本项目所有工作必须严格遵守 `项目背景.md` 中定义的全部规范,包括:
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
.oh-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; }
|
||||
.oh-date { font-size: 15px; font-weight: 700; color: #333; margin-bottom: 3px; }
|
||||
.oh-id { font-size: 11px; color: #999; }
|
||||
.oh-order-time { font-size: 11px; color: #999; margin-top: 2px; }
|
||||
.oh-badge { font-size: 12px; padding: 3px 10px; border-radius: 12px; background: #f6ffed; color: #52c41a; font-weight: 600; }
|
||||
.oh-stats { display: flex; gap: 0; padding: 10px 0; border-top: 0.5px solid #f5f5f5; border-bottom: 0.5px solid #f5f5f5; }
|
||||
.oh-stat { flex: 1; text-align: center; }
|
||||
@@ -116,6 +117,7 @@
|
||||
<div>
|
||||
<div class="oh-date">2026-04-28 午餐</div>
|
||||
<div class="oh-id">NM-20260428-001</div>
|
||||
<div class="oh-order-time">下单时间:2026-04-28 11:32:15</div>
|
||||
</div>
|
||||
<span class="oh-badge">✅ 已完成</span>
|
||||
</div>
|
||||
@@ -273,10 +275,26 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 营养建议 -->
|
||||
<div class="advice-card" style="margin:0">
|
||||
<div class="advice-card" style="margin:0 0 12px;">
|
||||
<div class="advice-title">营养建议</div>
|
||||
<div class="advice-text">⚠ 本餐脂肪摄入偏高,建议下次适当减少荤菜;蔬菜摄入量不足,建议增加一份绿叶菜。</div>
|
||||
</div>
|
||||
<!-- 支付信息 -->
|
||||
<div class="sec-card" style="margin:0;">
|
||||
<div class="sec-title">📋 支付信息</div>
|
||||
<div class="info-row">
|
||||
<span class="ir-label">支付方式</span>
|
||||
<span class="ir-value">💳 微信支付</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="ir-label">支付流水号</span>
|
||||
<span class="ir-value" style="font-family:monospace;font-size:11px;">4200002564202604281132180015</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="ir-label">支付时间</span>
|
||||
<span class="ir-value">2026-04-28 11:32:18</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="home-indicator"></div>
|
||||
@@ -288,7 +306,8 @@
|
||||
return m ? decodeURIComponent(m[1]) : '';
|
||||
}
|
||||
|
||||
var type = getQuery('type') === 'clean' ? 'clean' : 'meal';
|
||||
var rawType = getQuery('type');
|
||||
var type = (rawType === 'clean' || rawType === 'line') ? rawType : 'meal';
|
||||
/* 净菜包订单状态:delivering=待配送 / shipped=已发货 / done=已完成;缺省按待配送处理 */
|
||||
var rawStatus = getQuery('status');
|
||||
var status = ['delivering', 'shipped', 'done'].indexOf(rawStatus) >= 0 ? rawStatus : 'delivering';
|
||||
@@ -296,7 +315,100 @@
|
||||
/* 是否展示食材来源与溯源按钮:仅 已发货 / 已完成 可见 */
|
||||
var showTrace = status === 'shipped' || status === 'done';
|
||||
|
||||
if (type === 'clean') {
|
||||
if (type === 'line') {
|
||||
/* ========== 餐线订单详情 ========== */
|
||||
var payMap = { alipay: '支付宝', wechat: '微信支付', cash: '现金' };
|
||||
var payMethod = payMap[getQuery('pay')] || '微信支付';
|
||||
|
||||
/* 订单头部 */
|
||||
document.getElementById('orderHeader').innerHTML =
|
||||
'<div class="oh-top">'
|
||||
+ '<div>'
|
||||
+ '<div class="oh-date">2026-05-14 午餐</div>'
|
||||
+ '<div class="oh-id">XL-20260514-001</div>'
|
||||
+ '<div class="oh-order-time">下单时间:2026-05-14 11:58:32</div>'
|
||||
+ '</div>'
|
||||
+ '<span class="oh-badge" style="background:#f6ffed;color:#52c41a;">✅ 已完成</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="oh-stats">'
|
||||
+ '<div class="oh-stat"><div class="sv" style="color:#fa8c16">85</div><div class="sl">营养评分</div></div>'
|
||||
+ '<div class="oh-stat"><div class="sv" style="color:#f5222d">¥32.50</div><div class="sl">消费金额</div></div>'
|
||||
+ '<div class="oh-stat"><div class="sv" style="color:#1677ff">3</div><div class="sl">菜品数</div></div>'
|
||||
+ '<div class="oh-stat"><div class="sv" style="color:#555">505</div><div class="sl">总热量kcal</div></div>'
|
||||
+ '</div>';
|
||||
|
||||
/* 菜品明细:克重计量 + 食材来源溯源 */
|
||||
document.getElementById('dishSection').innerHTML =
|
||||
'<div class="dish-sec-title">菜品明细 · 食材 · 溯源</div>'
|
||||
/* 清蒸鱼 */
|
||||
+ '<div class="dish-card">'
|
||||
+ '<div class="dish-head">'
|
||||
+ '<div class="dish-icon">🐟</div>'
|
||||
+ '<div class="dish-info">'
|
||||
+ '<div class="dish-name-row"><span class="dish-name">清蒸鱼</span></div>'
|
||||
+ '<div class="dish-meta">185g · 142kcal</div>'
|
||||
+ '</div>'
|
||||
+ '<span class="dish-price">¥18.00</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="ing-section">'
|
||||
+ '<div class="ing-label">食材来源</div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">草鱼 120g</div><div class="ing-code">ST-EX-HS01-SF-CAYO-060K-20260414-001</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">葱丝 15g</div><div class="ing-code">NC-PROC-CGSI-20260422-01</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">姜丝 10g</div><div class="ing-code">NC-PROC-JIAS-20260422-01</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '</div>'
|
||||
+ '</div>'
|
||||
/* 炒时蔬 */
|
||||
+ '<div class="dish-card">'
|
||||
+ '<div class="dish-head">'
|
||||
+ '<div class="dish-icon">🥬</div>'
|
||||
+ '<div class="dish-info">'
|
||||
+ '<div class="dish-name-row"><span class="dish-name">炒时蔬</span></div>'
|
||||
+ '<div class="dish-meta">120g · 68kcal</div>'
|
||||
+ '</div>'
|
||||
+ '<span class="dish-price">¥8.00</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="ing-section">'
|
||||
+ '<div class="ing-label">食材来源</div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">西兰花 100g</div><div class="ing-code">ST-EX-LY01-VG-XLHU-080K-20260416-001</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">蒜末 5g</div><div class="ing-code">ST-EX-LY02-VG-SUAN-010K-20260418-001</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '</div>'
|
||||
+ '</div>'
|
||||
/* 米饭 */
|
||||
+ '<div class="dish-card">'
|
||||
+ '<div class="dish-head">'
|
||||
+ '<div class="dish-icon">🍚</div>'
|
||||
+ '<div class="dish-info">'
|
||||
+ '<div class="dish-name-row"><span class="dish-name">米饭</span></div>'
|
||||
+ '<div class="dish-meta">200g · 232kcal</div>'
|
||||
+ '</div>'
|
||||
+ '<span class="dish-price">¥2.00</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="ing-section">'
|
||||
+ '<div class="ing-label">食材来源</div>'
|
||||
+ '<div class="ing-row"><div class="ing-dot"></div><div class="ing-info"><div class="ing-name">大米 200g</div><div class="ing-code">ST-EX-LY02-DG-DAMI-1000-20260413-001</div></div><span class="ing-ok">✅合格</span><a class="ing-trace" href="trace-detail.html">🔗溯源</a></div>'
|
||||
+ '</div>'
|
||||
+ '</div>'
|
||||
/* 支付信息 */
|
||||
+ '<div class="sec-card" style="margin:12px 0 0;">'
|
||||
+ '<div class="sec-title">📋 支付信息</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付方式</span>'
|
||||
+ '<span class="ir-value">💳 ' + payMethod + '</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付流水号</span>'
|
||||
+ '<span class="ir-value" style="font-family:monospace;font-size:11px;">' + (payMethod === '支付宝' ? '2026051422001416320500123456' : payMethod === '微信支付' ? '4200002564202605141132180012' : 'CASH-20260514-0003') + '</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付时间</span>'
|
||||
+ '<span class="ir-value">2026-05-14 11:58:35</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">取餐餐线</span>'
|
||||
+ '<span class="ir-value">A区中餐线</span>'
|
||||
+ '</div>'
|
||||
+ '</div>';
|
||||
} else if (type === 'clean') {
|
||||
/* 状态徽标:文案与配色随 status 切换 */
|
||||
var badgeMap = {
|
||||
delivering: { text: '🚚 待配送', bg: '#e6f4ff', color: '#1677ff' },
|
||||
@@ -311,6 +423,7 @@
|
||||
+ '<div>'
|
||||
+ '<div class="oh-date">2026-04-29 午餐时段配送</div>'
|
||||
+ '<div class="oh-id">CL-20260428-017</div>'
|
||||
+ '<div class="oh-order-time">下单时间:2026-04-28 14:23:08</div>'
|
||||
+ '</div>'
|
||||
+ '<span class="oh-badge" style="background:' + b.bg + ';color:' + b.color + ';">' + b.text + '</span>'
|
||||
+ '</div>'
|
||||
@@ -396,9 +509,25 @@
|
||||
+ '</div>'
|
||||
+ lowFatIng
|
||||
+ '</div>'
|
||||
+ '<div class="advice-card" style="margin:0;">'
|
||||
+ '<div class="advice-card" style="margin:0 0 12px;">'
|
||||
+ '<div class="advice-title">🍳 烹制提示</div>'
|
||||
+ '<div class="advice-text" style="color:#1677ff;">宫保鸡丁净菜包:热锅冷油下鸡丁滑炒至变色,加入配料包翻炒 2 分钟即可出锅;糙米饭需另行准备。</div>'
|
||||
+ '</div>'
|
||||
/* 支付信息 */
|
||||
+ '<div class="sec-card" style="margin:0;">'
|
||||
+ '<div class="sec-title">📋 支付信息</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付方式</span>'
|
||||
+ '<span class="ir-value">💳 微信支付</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付流水号</span>'
|
||||
+ '<span class="ir-value" style="font-family:monospace;font-size:11px;">4200002564202604281423080017</span>'
|
||||
+ '</div>'
|
||||
+ '<div class="info-row">'
|
||||
+ '<span class="ir-label">支付时间</span>'
|
||||
+ '<span class="ir-value">2026-04-28 14:23:08</span>'
|
||||
+ '</div>'
|
||||
+ '</div>';
|
||||
|
||||
/* 订单进度时间线:按状态高亮对应节点 */
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
.order-card .type-tag { font-size: 10px; padding: 1px 6px; border-radius: 8px; font-weight: 600; line-height: 16px; }
|
||||
.order-card .type-tag.meal { background: #e6f4ff; color: #1677ff; }
|
||||
.order-card .type-tag.clean { background: #fff7e6; color: #fa8c16; }
|
||||
.order-card .type-tag.line { background: #e6fffb; color: #13c2c2; }
|
||||
.order-card .status { font-size: 12px; color: #52c41a; font-weight: 500; }
|
||||
.order-card .status.pending { color: #fa8c16; }
|
||||
.order-card .status.shipping { color: #1677ff; }
|
||||
@@ -40,9 +41,12 @@
|
||||
background: #fff7e6; border-radius: 6px; display: flex; align-items: center; gap: 4px;
|
||||
}
|
||||
.order-card .fulfill-meta.done { color: #52c41a; background: #f6ffed; }
|
||||
.order-card .pay-meta { font-size: 11px; color: #666; margin-bottom: 8px; padding: 4px 8px; background: #f5f5f5; border-radius: 6px; display: flex; align-items: center; gap: 4px; }
|
||||
.order-card .card-bottom { display: flex; justify-content: space-between; align-items: center; }
|
||||
.order-card .total { font-size: 14px; font-weight: 700; color: #f5222d; }
|
||||
.order-card .time { font-size: 11px; color: #999; }
|
||||
.order-tabs .ot { cursor: pointer; }
|
||||
.order-card.hidden { display: none; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -62,15 +66,15 @@
|
||||
<span class="ot">待配送</span>
|
||||
<span class="ot">已完成</span>
|
||||
</div>
|
||||
<a class="order-card" href="me-order-detail-pending.html">
|
||||
<a class="order-card" href="me-order-detail-pending.html" data-status="pending">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 午餐</span><span class="type-tag meal">餐品</span></div>
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 午餐</span><span class="type-tag meal">点餐</span></div>
|
||||
<span class="status pending">待取餐</span>
|
||||
</div>
|
||||
<div class="items">低脂鸡胸肉沙拉 ×1、杂粮饭 ×1、紫菜蛋花汤 ×1</div>
|
||||
<div class="card-bottom"><span class="total">¥ 28.5</span><span class="time">今天 11:32</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html?type=clean&status=delivering">
|
||||
<a class="order-card" href="me-order-detail.html?type=clean&status=delivering" data-status="shipping">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🥬 阳光食堂 · 净菜包订单</span><span class="type-tag clean">净菜包</span></div>
|
||||
<span class="status shipping">待配送</span>
|
||||
@@ -79,15 +83,15 @@
|
||||
<div class="fulfill-meta">🚚 配送到家 · 明日(4月29日)11:00-12:00</div>
|
||||
<div class="card-bottom"><span class="total">¥ 79.0</span><span class="time">今天 14:23 下单</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html">
|
||||
<a class="order-card" href="me-order-detail.html" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 早餐</span><span class="type-tag meal">餐品</span></div>
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 早餐</span><span class="type-tag meal">点餐</span></div>
|
||||
<span class="status">已完成</span>
|
||||
</div>
|
||||
<div class="items">全麦三明治 ×1、鲜榨橙汁 ×1</div>
|
||||
<div class="card-bottom"><span class="total">¥ 15.0</span><span class="time">今天 07:45</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html?type=clean&status=done">
|
||||
<a class="order-card" href="me-order-detail.html?type=clean&status=done" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🥬 阳光食堂 · 净菜包订单</span><span class="type-tag clean">净菜包</span></div>
|
||||
<span class="status">已完成</span>
|
||||
@@ -96,16 +100,70 @@
|
||||
<div class="fulfill-meta done">🏪 食堂自提 · 已取货</div>
|
||||
<div class="card-bottom"><span class="total">¥ 36.0</span><span class="time">昨天 12:15</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html">
|
||||
<a class="order-card" href="me-order-detail.html" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🍽️ 健康轻食 · 午餐</span><span class="type-tag meal">餐品</span></div>
|
||||
<div class="shop-row"><span class="shop">🍽️ 健康轻食 · 午餐</span><span class="type-tag meal">点餐</span></div>
|
||||
<span class="status">已完成</span>
|
||||
</div>
|
||||
<div class="items">三文鱼牛油果碗 ×1、蔬菜汁 ×1</div>
|
||||
<div class="card-bottom"><span class="total">¥ 42.0</span><span class="time">昨天 12:15</span></div>
|
||||
</a>
|
||||
<!-- 餐线订单:始终已完成、克重计量、支付方式见详情页 -->
|
||||
<a class="order-card" href="me-order-detail.html?type=line&pay=alipay" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 午餐</span><span class="type-tag line">餐线</span></div>
|
||||
<span class="status">已完成</span>
|
||||
</div>
|
||||
<div class="items">清蒸鱼 185g、炒时蔬 120g、米饭 200g</div>
|
||||
<div class="card-bottom"><span class="total">¥ 32.50</span><span class="time">今天 12:05</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html?type=line&pay=wechat" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🍽️ 阳光食堂 · 早餐</span><span class="type-tag line">餐线</span></div>
|
||||
<span class="status">已完成</span>
|
||||
</div>
|
||||
<div class="items">小米粥 300g、茶叶蛋 60g、花卷 100g</div>
|
||||
<div class="card-bottom"><span class="total">¥ 8.00</span><span class="time">今天 07:30</span></div>
|
||||
</a>
|
||||
<a class="order-card" href="me-order-detail.html?type=line&pay=cash" data-status="done">
|
||||
<div class="card-top">
|
||||
<div class="shop-row"><span class="shop">🥗 健康轻食 · 午餐</span><span class="type-tag line">餐线</span></div>
|
||||
<span class="status">已完成</span>
|
||||
</div>
|
||||
<div class="items">香煎鸡胸 150g、藜麦沙拉 200g、南瓜汤 250ml</div>
|
||||
<div class="card-bottom"><span class="total">¥ 38.00</span><span class="time">昨天 11:50</span></div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="home-indicator"></div>
|
||||
</div>
|
||||
<script>
|
||||
/* Tab 切换过滤 */
|
||||
(function() {
|
||||
var tabs = document.querySelectorAll('.order-tabs .ot');
|
||||
var cards = document.querySelectorAll('.order-card');
|
||||
if (!tabs.length || !cards.length) return;
|
||||
|
||||
/* 状态映射:tab 文本 → data-status 值 */
|
||||
var statusMap = { '待取餐': 'pending', '待配送': 'shipping', '已完成': 'done' };
|
||||
|
||||
tabs.forEach(function(tab) {
|
||||
tab.addEventListener('click', function() {
|
||||
/* 切换 active 样式 */
|
||||
tabs.forEach(function(t) { t.classList.remove('active'); });
|
||||
tab.classList.add('active');
|
||||
|
||||
var filter = tab.textContent.trim();
|
||||
cards.forEach(function(card) {
|
||||
if (filter === '全部') {
|
||||
card.classList.remove('hidden');
|
||||
} else {
|
||||
var target = statusMap[filter];
|
||||
card.classList.toggle('hidden', card.getAttribute('data-status') !== target);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -4,8 +4,19 @@
|
||||
|
||||
### 后台营养管理
|
||||
|
||||
- **`prod-clean-order.html`**(净菜订单):筛选栏新增「订单类型」筛选(内供/外售),表格新增「订单类型」列,外售订单行隐藏删除按钮。新建订单弹窗新增「订单类型」字段(默认「内供」且不可选),原二级「净菜类型」重命名为「加工类型」避免与一级净菜类型混淆。新增「由食谱快速创建订单」按钮与弹窗——选食谱日期后展示当日各餐次(早/午/晚/加餐)菜品列表(数据来源 `din-recipe-mgmt.html`),勾选餐次并输入就餐人数后实时汇总:餐品名称 / 包装规格 / 需求份数 / 需求计量(kg)。详情抽屉、确认收货等 JS 逻辑同步适配新列索引。
|
||||
- **`sup-clean-external.html`**(净菜外售):表格新增「预定配送时间」列,8 条示例数据补充配送时间。新建外售订单弹窗新增「预定配送时间」字段(含必填校验)。详情抽屉新增「预定配送时间」展示,JS 列索引同步适配。
|
||||
- **`prod-clean-order.html`**(净菜订单):数据模型重构为主子表结构(一单多品)。筛选栏新增「订单类型」筛选(内供/外售),订单状态新增「部分完成」选项。表格新增展开箭头——主表展示订单号/订单类型/菜品数/总份数/总计量/订单状态,点击展开显示各菜品明细行(净菜类型/菜品食材/包装规格/份数/计量/行状态)。新增「部分完成」状态(tag-purple),当订单下各菜品状态不一致时自动聚合显示。新建订单弹窗全面重构为动态明细行构建器——支持逐行添加/移除菜品,每行支持净菜包/餐品净菜包切换、食材联动加工类型、餐品联动规格、份数自动计算计量,底部实时汇总预览;原二级「净菜类型」重命名为「加工类型」避免与一级净菜类型混淆。新增「由食谱快速创建订单」按钮与弹窗——选食谱日期后展示当日各餐次菜品列表,勾选餐次并输入就餐人数后实时汇总。确认收货改为行级确认收货(按菜品行逐条确认)。详情抽屉展示订单信息汇总+全部菜品明细列表(餐品净菜包含食材构成展示)。示例数据从 6 行扩展为 8 条订单 17 条明细行。
|
||||
- **`sup-clean-external.html`**(净菜外售):数据模型重构为主子表结构。表格主表展示订单号/客户名称/菜品数/总份数/总计量/订单金额/下单时间/预定配送/物流单号/订单状态,展开显示各菜品明细(净菜类型/菜品食材/包装规格/份数/计量/单价/小计/行状态)。新增「预定配送时间」列。新建外售订单弹窗重构为动态明细行构建器,新增「预定配送时间」字段(含必填校验),支持多菜品添加与金额汇总预览。详情抽屉展示订单明细列表+金额合计。JS 数据模型统一改为主子表。
|
||||
- **`sup-clean-internal.html`**(净菜内供):数据模型重构为主子表结构。表格主表展示申领单号/申领场所/菜品数/总份数/总数量/申领单状态/申领时间/预定配送时间/配送人,展开显示各菜品明细(净菜类型/菜品食材/包装规格/份数/数量/行状态)。新建申领单弹窗重构为动态明细行构建器,支持多菜品添加与汇总预览。详情抽屉展示申领单汇总+明细列表。JS 数据模型统一改为主子表。
|
||||
- **`farm-purchase.html`**(采购管理):采购明细子表新增「验收数量」列,所有示例数据行补充验收数量字段。确认收货弹窗从简单确认框重构为验收明细弹窗——展示食材名称/规格/采购数量/验收数量/备注表格,逐项填写验收数量后方可提交(含全覆盖校验)。已完成的采购单自动预填验收数量。详情抽屉表格同步新增验收数量列。
|
||||
- **`prod-proc-cabinet.html`**(净菜进柜):表头新增「订单菜品」列(区分于原「存放净菜」列语义),数据行同步适配(如土豆行拆分为订单菜品=土豆丝 / 存放净菜=土豆(土豆丝))。空闲行补齐新增列占位。进柜弹窗新增「选择订单菜品」联动回显区域。
|
||||
- **`prod-proc-combo.html`**(净菜组配):表头新增「关联订单」列,数据行关联订单号 CO-001~CO-004,同一订单的多条组配任务以 `order-last` 样式标记末行。任务来源字段从下拉选择改为 tag 展示(餐线/点餐/录入)。
|
||||
- **`prod-proc-cook.html`**(按单烹制):表头新增「关联订单」列,数据行关联订单号并展示该订单下的烹制进度汇总(✓ 已烹齐 / 烹制中 n/m / 待烹制 n/m)。新增 `updateOrderBadge()` / `showCookOrderDetail()` JS 函数支持订单进度动态更新。
|
||||
- **`sup-in-clean.html`**(净菜加工):表头移除「质检结果」列,所有数据行同步移除质检结果字段。新建/编辑弹窗移除质检结果下拉选择。
|
||||
|
||||
### 营养管理小程序
|
||||
|
||||
- **`me-order-detail.html`**(订单详情):订单头部新增下单时间显示。餐品/净菜包订单均新增「支付信息」卡片(支付方式/支付流水号/支付时间)。新增 `type=line` 餐线订单详情渲染——展示菜品明细含克重计量、食材来源及溯源链接、支付信息(含取餐餐线),支持支付宝/微信/现金三种支付方式差异化流水号。
|
||||
- **`me-orders.html`**(我的订单):新增 3 条餐线订单卡片(青色「餐线」标签),支持支付宝/微信/现金三种支付方式。所有订单卡片「餐品」标签改为「点餐」。新增 Tab 切换过滤 JS 逻辑——「全部/待取餐/待配送/已完成」点击联动卡片显隐,所有订单卡片补充 `data-status` 属性。
|
||||
|
||||
## [2026-07-23]
|
||||
|
||||
@@ -20,9 +31,9 @@
|
||||
|
||||
### 营养管理小程序
|
||||
|
||||
- **`eat-order.html`**(订餐页):净菜包菜品名称去掉「净菜包」后缀;菜品图标、名称、描述区域点击可跳转至菜品详情页。
|
||||
- **`eat-order.html`**(订餐页):新增净菜包购买链路全流程(涉及下单、购物车、订单结算、订单详情、我的订单等页面),增加点击餐品查看详情的操作。
|
||||
- **`eat-order-confirm.html`**(订单确认页 · 净菜包):期望配送时间由 chip 单选改为日期+时段联动下拉面板,左侧日期卡片右侧时段列表;取货方式切换时时间标签文案联动(期望配送时间 ↔ 自提时间)。
|
||||
- **`me-health.html`**(健康档案):移除「营养目标」分区及其编辑弹窗。
|
||||
- **`me-health.html`**(健康档案):健康档案重构页面整体重构对齐后台用户十维档案。
|
||||
- **`me-home.html`**(我的主页):菜单列表新增「收货地址」入口,指向新增的 `me-address.html`。
|
||||
- **`me-address.html`**(收货地址 · 新增页面):支持地址卡片列表展示、编辑/删除/设为默认操作,含内联编辑表单。
|
||||
- **`me-order-detail.html`**(订单详情 · 净菜包):按订单状态(待配送/配送中/已完成)差异化渲染——头部徽标文案与配色联动,待配送状态仅展示食材明细+主辅材角色标签,已发货/已完成展示食材来源及溯源按钮;订单进度时间线改为动态渲染,按状态高亮对应节点。
|
||||
|
||||
@@ -98,6 +98,7 @@ tbody tr:hover{background:#F8FBFF;}
|
||||
.sub-table th{background:#F0F5FF;padding:10px 14px;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;border-bottom:1px solid #e8e8e8;}
|
||||
.sub-table td{padding:10px 14px;font-size:var(--font-xs);border-bottom:1px solid #f0f0f0;background:#fff;}
|
||||
.sub-table tr:last-child td{border-bottom:none;}
|
||||
.sub-table input.receive-qty-input:focus{border-color:var(--primary);outline:none;box-shadow:0 0 0 2px rgba(24,144,255,0.15);}
|
||||
.sub-table__footer{display:flex;justify-content:flex-end;padding:8px 14px;background:#F0F5FF;font-size:var(--font-xs);color:var(--text-secondary);font-weight:500;}
|
||||
/* 操作列 */
|
||||
thead th:last-child,tbody td.td-actions{position:sticky;right:0;background:#fff;box-shadow:-4px 0 8px rgba(0,0,0,0.04);z-index:2;white-space:nowrap;}
|
||||
@@ -303,10 +304,10 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<tr class="detail-row" id="detail-1">
|
||||
<td colspan="11">
|
||||
<table class="sub-table">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-XLHU-080K-20260416-001</td><td>西兰花</td><td>蔬菜类</td><td>80</td><td>散装(kg)</td><td>¥4.5</td><td>¥360</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-QCAI-120K-20260416-002</td><td>芹菜</td><td>蔬菜类</td><td>120</td><td>散装(kg)</td><td>¥2.5</td><td>¥300</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-XLHU-080K-20260416-001</td><td>西兰花</td><td>蔬菜类</td><td>80</td><td>散装(kg)</td><td>¥4.5</td><td>¥360</td><td>—</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-QCAI-120K-20260416-002</td><td>芹菜</td><td>蔬菜类</td><td>120</td><td>散装(kg)</td><td>¥2.5</td><td>¥300</td><td>—</td><td>—</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sub-table__footer">合计:2 种食材,200 kg,¥660</div>
|
||||
@@ -329,11 +330,11 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<tr class="detail-row" id="detail-2">
|
||||
<td colspan="11">
|
||||
<table class="sub-table">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-BOCA-050K-20260415-002</td><td>菠菜</td><td>蔬菜类</td><td>50</td><td>散装(kg)</td><td>¥2.5</td><td>¥125</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-BCAI-080K-20260415-003</td><td>白菜</td><td>蔬菜类</td><td>80</td><td>散装(kg)</td><td>¥1.8</td><td>¥144</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-HLUB-120K-20260415-004</td><td>胡萝卜</td><td>蔬菜类</td><td>120</td><td>散装(kg)</td><td>¥1.8</td><td>¥216</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-BOCA-050K-20260415-002</td><td>菠菜</td><td>蔬菜类</td><td>50</td><td>散装(kg)</td><td>¥2.5</td><td>¥125</td><td>—</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-BCAI-080K-20260415-003</td><td>白菜</td><td>蔬菜类</td><td>80</td><td>散装(kg)</td><td>¥1.8</td><td>¥144</td><td>—</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY01-VG-HLUB-120K-20260415-004</td><td>胡萝卜</td><td>蔬菜类</td><td>120</td><td>散装(kg)</td><td>¥1.8</td><td>¥216</td><td>—</td><td>—</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sub-table__footer">合计:3 种食材,250 kg,¥485</div>
|
||||
@@ -356,10 +357,10 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<tr class="detail-row" id="detail-3">
|
||||
<td colspan="11">
|
||||
<table class="sub-table">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-XR01-MT-ZLRJ-080K-20260415-005</td><td>猪里脊</td><td>肉禽类</td><td>80</td><td>25kg/件</td><td>¥28</td><td>¥2,240</td><td>需冷链运输</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-XR01-MT-ZWUA-240K-20260415-006</td><td>猪五花</td><td>肉禽类</td><td>240</td><td>25kg/件</td><td>¥26</td><td>¥6,240</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-XR01-MT-ZLRJ-080K-20260415-005</td><td>猪里脊</td><td>肉禽类</td><td>80</td><td>25kg/件</td><td>¥28</td><td>¥2,240</td><td>—</td><td>需冷链运输</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-XR01-MT-ZWUA-240K-20260415-006</td><td>猪五花</td><td>肉禽类</td><td>240</td><td>25kg/件</td><td>¥26</td><td>¥6,240</td><td>—</td><td>—</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sub-table__footer">合计:2 种食材,320 kg,¥8,480</div>
|
||||
@@ -382,11 +383,11 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<tr class="detail-row" id="detail-4">
|
||||
<td colspan="11">
|
||||
<table class="sub-table">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-CAYO-060K-20260414-001</td><td>草鱼</td><td>水产类</td><td>60</td><td>散装(kg)</td><td>¥18</td><td>¥1,080</td><td>活鲜运输</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-JIYU-080K-20260414-002</td><td>鲫鱼</td><td>水产类</td><td>80</td><td>散装(kg)</td><td>¥16</td><td>¥1,280</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-XIAA-050K-20260414-003</td><td>虾</td><td>水产类</td><td>50</td><td>散装(kg)</td><td>¥30</td><td>¥1,500</td><td>冰鲜</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-CAYO-060K-20260414-001</td><td>草鱼</td><td>水产类</td><td>60</td><td>散装(kg)</td><td>¥18</td><td>¥1,080</td><td>60</td><td>活鲜运输</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-JIYU-080K-20260414-002</td><td>鲫鱼</td><td>水产类</td><td>80</td><td>散装(kg)</td><td>¥16</td><td>¥1,280</td><td>80</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-HS01-SF-XIAA-050K-20260414-003</td><td>虾</td><td>水产类</td><td>50</td><td>散装(kg)</td><td>¥30</td><td>¥1,500</td><td>—</td><td>冰鲜</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sub-table__footer">合计:3 种食材,190 kg,¥3,860</div>
|
||||
@@ -409,10 +410,10 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<tr class="detail-row" id="detail-5">
|
||||
<td colspan="11">
|
||||
<table class="sub-table">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY02-DG-DAMI-1000-20260413-001</td><td>大米</td><td>粮油类</td><td>1000</td><td>20kg/箱</td><td>¥3.5</td><td>¥3,500</td><td>东北五常大米</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY02-DG-HSYO-168K-20260413-002</td><td>花生油</td><td>粮油类</td><td>168</td><td>5L/桶</td><td>¥16</td><td>¥2,688</td><td>—</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY02-DG-DAMI-1000-20260413-001</td><td>大米</td><td>粮油类</td><td>1000</td><td>20kg/箱</td><td>¥3.5</td><td>¥3,500</td><td>—</td><td>东北五常大米</td></tr>
|
||||
<tr><td style="font-size:10px;color:#999;">ST-EX-LY02-DG-HSYO-168K-20260413-002</td><td>花生油</td><td>粮油类</td><td>168</td><td>5L/桶</td><td>¥16</td><td>¥2,688</td><td>—</td><td>—</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sub-table__footer">合计:2 种食材,1168 kg,¥6,188</div>
|
||||
@@ -498,7 +499,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
<div class="drawer-section-title">食材明细</div>
|
||||
<div style="padding:12px 24px 20px;">
|
||||
<table class="sub-table" id="drawerItemsTable">
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody id="drawerItemsBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -601,17 +602,22 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 确认收货弹窗 -->
|
||||
<!-- 确认收货验收弹窗 -->
|
||||
<div class="modal-overlay" id="receiveModal" style="display:none;">
|
||||
<div class="modal" style="width:400px;">
|
||||
<div class="modal" style="width:680px;">
|
||||
<div class="modal-header">
|
||||
<span class="modal-title">确认收货</span>
|
||||
<span class="modal-title">确认收货 — 验收明细</span>
|
||||
<span class="modal-close" onclick="closeReceiveModal()">×</span>
|
||||
</div>
|
||||
<div class="modal-body" style="text-align:center;padding:32px 24px;">
|
||||
<div style="font-size:40px;margin-bottom:12px;">📦</div>
|
||||
<p style="font-size:var(--font-base);color:var(--text-primary);margin-bottom:8px;">确认收货采购单 <strong id="receiveOrderNo">—</strong> ?</p>
|
||||
<p style="font-size:var(--font-sm);color:var(--text-secondary);">确认后订单将变为已完成状态,请确保食材已验收无误</p>
|
||||
<div class="modal-body" style="padding:24px;">
|
||||
<p style="font-size:var(--font-sm);color:var(--text-primary);margin-bottom:4px;">采购单号:<strong id="receiveOrderNo">—</strong></p>
|
||||
<p style="font-size:var(--font-xs);color:var(--text-secondary);margin-bottom:16px;">请逐项填写验收数量,确认无误后再提交收货</p>
|
||||
<table class="sub-table" style="width:100%;">
|
||||
<thead>
|
||||
<tr><th style="width:40px;">序号</th><th>食材名称</th><th>规格</th><th style="width:90px;">采购数量</th><th style="width:110px;">验收数量</th><th>备注</th></tr>
|
||||
</thead>
|
||||
<tbody id="receiveItemsBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-default" onclick="closeReceiveModal()">取消</button>
|
||||
@@ -643,41 +649,41 @@ var orders = [
|
||||
supplier:'绿源蔬菜配送', supplierContact:'李明', supplierPhone:'138-9912-3456',
|
||||
date:'2026-04-16', arrival:'2026-04-17', source:'食谱搭配', status:'待接单', total:'¥660',
|
||||
items:[
|
||||
{trace:'ST-EX-LY01-VG-XLHU-080K-20260416-001',name:'西兰花',cat:'蔬菜类',qty:80,spec:'散装(kg)',price:4.5,subtotal:'¥360',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-QCAI-120K-20260416-002',name:'芹菜',cat:'蔬菜类',qty:120,spec:'散装(kg)',price:2.5,subtotal:'¥300',remark:'—'}
|
||||
{trace:'ST-EX-LY01-VG-XLHU-080K-20260416-001',name:'西兰花',cat:'蔬菜类',qty:80,spec:'散装(kg)',price:4.5,subtotal:'¥360',acceptedQty:'—',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-QCAI-120K-20260416-002',name:'芹菜',cat:'蔬菜类',qty:120,spec:'散装(kg)',price:2.5,subtotal:'¥300',acceptedQty:'—',remark:'—'}
|
||||
]},
|
||||
{ no:'PO-20260415-001', canteen:'一号场所', canteenContact:'王建国', canteenPhone:'029-8812-3001',
|
||||
supplier:'绿源蔬菜配送', supplierContact:'李明', supplierPhone:'138-9912-3456',
|
||||
date:'2026-04-15', arrival:'2026-04-16', source:'食谱搭配', status:'待发货', total:'¥485',
|
||||
items:[
|
||||
{trace:'ST-EX-LY01-VG-BOCA-050K-20260415-002',name:'菠菜',cat:'蔬菜类',qty:50,spec:'散装(kg)',price:2.5,subtotal:'¥125',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-BCAI-080K-20260415-003',name:'白菜',cat:'蔬菜类',qty:80,spec:'散装(kg)',price:1.8,subtotal:'¥144',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-HLUB-120K-20260415-004',name:'胡萝卜',cat:'蔬菜类',qty:120,spec:'散装(kg)',price:1.8,subtotal:'¥216',remark:'—'}
|
||||
{trace:'ST-EX-LY01-VG-BOCA-050K-20260415-002',name:'菠菜',cat:'蔬菜类',qty:50,spec:'散装(kg)',price:2.5,subtotal:'¥125',acceptedQty:'—',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-BCAI-080K-20260415-003',name:'白菜',cat:'蔬菜类',qty:80,spec:'散装(kg)',price:1.8,subtotal:'¥144',acceptedQty:'—',remark:'—'},
|
||||
{trace:'ST-EX-LY01-VG-HLUB-120K-20260415-004',name:'胡萝卜',cat:'蔬菜类',qty:120,spec:'散装(kg)',price:1.8,subtotal:'¥216',acceptedQty:'—',remark:'—'}
|
||||
]},
|
||||
{ no:'PO-20260415-002', canteen:'一号场所', canteenContact:'王建国', canteenPhone:'029-8812-3001',
|
||||
supplier:'鲜肉直供公司', supplierContact:'张伟', supplierPhone:'139-0088-7654',
|
||||
date:'2026-04-15', arrival:'2026-04-16', source:'食谱搭配', status:'待收货', total:'¥8,480',
|
||||
deliveryMethod:'供应商自送', deliveryPerson:'张伟', deliveryPhone:'139-0088-7654', deliveryETA:'2026-04-16 14:00',
|
||||
items:[
|
||||
{trace:'ST-EX-XR01-MT-ZLRJ-080K-20260415-005',name:'猪里脊',cat:'肉禽类',qty:80,spec:'25kg/件',price:28,subtotal:'¥2,240',remark:'需冷链运输'},
|
||||
{trace:'ST-EX-XR01-MT-ZWUA-240K-20260415-006',name:'猪五花',cat:'肉禽类',qty:240,spec:'25kg/件',price:26,subtotal:'¥6,240',remark:'—'}
|
||||
{trace:'ST-EX-XR01-MT-ZLRJ-080K-20260415-005',name:'猪里脊',cat:'肉禽类',qty:80,spec:'25kg/件',price:28,subtotal:'¥2,240',acceptedQty:'—',remark:'需冷链运输'},
|
||||
{trace:'ST-EX-XR01-MT-ZWUA-240K-20260415-006',name:'猪五花',cat:'肉禽类',qty:240,spec:'25kg/件',price:26,subtotal:'¥6,240',acceptedQty:'—',remark:'—'}
|
||||
]},
|
||||
{ no:'PO-20260414-003', canteen:'二号场所', canteenContact:'赵芳', canteenPhone:'029-8812-3002',
|
||||
supplier:'海鲜水产配送', supplierContact:'陈浩', supplierPhone:'136-7766-5432',
|
||||
date:'2026-04-14', arrival:'2026-04-15', source:'手动创建', status:'已完成', total:'¥3,860',
|
||||
deliveryMethod:'第三方物流', deliveryPerson:'陈浩', deliveryPhone:'136-7766-5432', deliveryETA:'2026-04-15 10:30',
|
||||
items:[
|
||||
{trace:'ST-EX-HS01-SF-CAYO-060K-20260414-001',name:'草鱼',cat:'水产类',qty:60,spec:'散装(kg)',price:18,subtotal:'¥1,080',remark:'活鲜运输'},
|
||||
{trace:'ST-EX-HS01-SF-JIYU-080K-20260414-002',name:'鲫鱼',cat:'水产类',qty:80,spec:'散装(kg)',price:16,subtotal:'¥1,280',remark:'—'},
|
||||
{trace:'ST-EX-HS01-SF-XIAA-050K-20260414-003',name:'虾',cat:'水产类',qty:50,spec:'散装(kg)',price:30,subtotal:'¥1,500',remark:'冰鲜'}
|
||||
{trace:'ST-EX-HS01-SF-CAYO-060K-20260414-001',name:'草鱼',cat:'水产类',qty:60,spec:'散装(kg)',price:18,subtotal:'¥1,080',acceptedQty:'60',remark:'活鲜运输'},
|
||||
{trace:'ST-EX-HS01-SF-JIYU-080K-20260414-002',name:'鲫鱼',cat:'水产类',qty:80,spec:'散装(kg)',price:16,subtotal:'¥1,280',acceptedQty:'80',remark:'—'},
|
||||
{trace:'ST-EX-HS01-SF-XIAA-050K-20260414-003',name:'虾',cat:'水产类',qty:50,spec:'散装(kg)',price:30,subtotal:'¥1,500',acceptedQty:'—',remark:'冰鲜'}
|
||||
]},
|
||||
{ no:'PO-20260413-004', canteen:'三号场所', canteenContact:'刘洋', canteenPhone:'029-8812-3003',
|
||||
supplier:'粮油批发商行', supplierContact:'孙强', supplierPhone:'137-5544-3210',
|
||||
date:'2026-04-13', arrival:'2026-04-14', source:'手动创建', status:'已取消', total:'¥6,188',
|
||||
cancelReason:'供应商无法供货',
|
||||
items:[
|
||||
{trace:'ST-EX-LY02-DG-DAMI-1000-20260413-001',name:'大米',cat:'粮油类',qty:1000,spec:'20kg/箱',price:3.5,subtotal:'¥3,500',remark:'东北五常大米'},
|
||||
{trace:'ST-EX-LY02-DG-HSYO-168K-20260413-002',name:'花生油',cat:'粮油类',qty:168,spec:'5L/桶',price:16,subtotal:'¥2,688',remark:'—'}
|
||||
{trace:'ST-EX-LY02-DG-DAMI-1000-20260413-001',name:'大米',cat:'粮油类',qty:1000,spec:'20kg/箱',price:3.5,subtotal:'¥3,500',acceptedQty:'—',remark:'东北五常大米'},
|
||||
{trace:'ST-EX-LY02-DG-HSYO-168K-20260413-002',name:'花生油',cat:'粮油类',qty:168,spec:'5L/桶',price:16,subtotal:'¥2,688',acceptedQty:'—',remark:'—'}
|
||||
]}
|
||||
];
|
||||
|
||||
@@ -835,7 +841,7 @@ function showDetail(idx) {
|
||||
tbody.innerHTML = '';
|
||||
o.items.forEach(function(it, i) {
|
||||
var tr = document.createElement('tr');
|
||||
tr.innerHTML = '<td>'+(i+1)+'</td><td style="font-size:10px;color:#999;">'+it.trace+'</td><td>'+it.name+'</td><td>'+it.cat+'</td><td>'+it.qty+'</td><td>'+it.spec+'</td><td>¥'+it.price+'</td><td>'+it.subtotal+'</td><td>'+it.remark+'</td>';
|
||||
tr.innerHTML = '<td>'+(i+1)+'</td><td style="font-size:10px;color:#999;">'+it.trace+'</td><td>'+it.name+'</td><td>'+it.cat+'</td><td>'+it.qty+'</td><td>'+it.spec+'</td><td>¥'+it.price+'</td><td>'+it.subtotal+'</td><td>'+(it.acceptedQty||'—')+'</td><td>'+it.remark+'</td>';
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
/* 配送信息(待收货/已完成显示) */
|
||||
@@ -934,12 +940,30 @@ function openReceiveModal(idx) {
|
||||
receiveIdx = idx;
|
||||
var o = orders[idx];
|
||||
document.getElementById('receiveOrderNo').textContent = o.no;
|
||||
var tbody = document.getElementById('receiveItemsBody');
|
||||
tbody.innerHTML = '';
|
||||
o.items.forEach(function(it, i) {
|
||||
var tr = document.createElement('tr');
|
||||
var qtyVal = (it.acceptedQty && it.acceptedQty !== '—') ? it.acceptedQty : '';
|
||||
tr.innerHTML = '<td>'+(i+1)+'</td><td>'+it.name+'</td><td>'+it.spec+'</td><td>'+it.qty+'</td>'
|
||||
+'<td><input type="number" class="receive-qty-input" value="'+qtyVal+'" placeholder="请输入" style="height:30px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 8px;font-size:var(--font-xs);width:95px;text-align:center;"></td>'
|
||||
+'<td style="color:var(--text-secondary);">'+(it.remark==='—'?'':it.remark)+'</td>';
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
document.getElementById('receiveModal').style.display = 'flex';
|
||||
}
|
||||
function closeReceiveModal() { document.getElementById('receiveModal').style.display = 'none'; receiveIdx = -1; }
|
||||
document.getElementById('receiveModal').addEventListener('click', function(e) { if(e.target===this) closeReceiveModal(); });
|
||||
function confirmReceive() {
|
||||
var inputs = document.querySelectorAll('.receive-qty-input');
|
||||
var o = orders[receiveIdx];
|
||||
var allFilled = true;
|
||||
inputs.forEach(function(inp, i) {
|
||||
var val = inp.value.trim();
|
||||
if (!val) { allFilled = false; return; }
|
||||
o.items[i].acceptedQty = val;
|
||||
});
|
||||
if (!allFilled) { showToast('请填写所有食材的验收数量', 'warning'); return; }
|
||||
showToast('采购单 ' + o.no + ' 已确认收货', 'success');
|
||||
closeReceiveModal();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -330,18 +330,18 @@ tbody tr.row-active td.td-actions{background:var(--primary-light);}
|
||||
</div>
|
||||
<div class="table-card__content">
|
||||
<table>
|
||||
<thead><tr><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></tr></thead>
|
||||
<thead><tr><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></tr></thead>
|
||||
<tbody id="detailTable">
|
||||
<tr class="row-active" data-slot="0" data-type="净菜" data-order="JC-2026-0422-001" data-trace="NC-CAB-BOCA-0422-01"><td>A1-01</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-001</a></td><td>土豆(土豆丝)</td><td><span class="tag tag-green">🥬 净菜</span></td><td>12.5</td><td>10.2</td><td>张厨师</td><td>4.2</td><td>剩余32h</td><td>04-22 09:15</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-01','土豆')">视频</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="1" data-type="净菜" data-order="JC-2026-0422-002" data-trace="NC-CAB-HLUB-0422-01"><td>A1-02</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-002</a></td><td>净胡萝卜</td><td><span class="tag tag-green">🥬 净菜</span></td><td>18.0</td><td>15.6</td><td>李主管</td><td>4.1</td><td>剩余46h</td><td>04-22 09:20</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-02','净胡萝卜')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="2" data-type="净菜" data-order="JC-2026-0422-003" data-trace="NC-CAB-XGUO-0422-01"><td>A1-03</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-003</a></td><td>净香菇</td><td><span class="tag tag-green">🥬 净菜</span></td><td>9.0</td><td>6.8</td><td>王厨师</td><td>4.3</td><td>剩余6h</td><td>04-22 09:30</td><td><span class="tag tag-orange">临期预警</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-03','净香菇')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="3" data-type="净菜" data-order="JC-2026-0422-004" data-trace="NC-CAB-XLHU-0422-01"><td>A1-04</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-004</a></td><td>净西兰花</td><td><span class="tag tag-green">🥬 净菜</span></td><td>10.0</td><td>8.5</td><td>张厨师</td><td>4.0</td><td>剩余50h</td><td>04-22 09:40</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-04','净西兰花')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="4" data-type="餐品包" data-order="JC-2026-0422-005" data-trace="PKG-DH-001"><td>A1-05</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-005</a></td><td>宫保鸡丁</td><td><span class="tag tag-orange">🍱 餐品包</span></td><td>6.0</td><td>5.4</td><td>李主管</td><td>3.8</td><td>剩余44h</td><td>04-22 10:20</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-05','宫保鸡丁')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="5" data-type="净菜" data-order="JC-2026-0422-006" data-trace="NC-CAB-BCAI-0422-01"><td>A1-06</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-006</a></td><td>净白菜</td><td><span class="tag tag-green">🥬 净菜</span></td><td>22.0</td><td>18.0</td><td>王厨师</td><td>7.8</td><td>剩余40h</td><td>04-22 08:50</td><td><span class="tag tag-red">已过期</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-06','净白菜')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="6"><td>A1-07</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.1</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="7"><td>A1-08</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.1</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="8"><td>A1-09</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.2</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="9"><td>A1-10</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.2</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr class="row-active" data-slot="0" data-type="净菜" data-order="JC-2026-0422-001" data-dish="土豆丝" data-trace="NC-CAB-BOCA-0422-01"><td>A1-01</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-001</a></td><td>土豆丝</td><td>土豆(土豆丝)</td><td><span class="tag tag-green">🥬 净菜</span></td><td>12.5</td><td>10.2</td><td>张厨师</td><td>4.2</td><td>剩余32h</td><td>04-22 09:15</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-01','土豆')">视频</span> <span class="link" onclick="showDetail(this)">详情</span> <span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="1" data-type="净菜" data-order="JC-2026-0422-002" data-dish="净胡萝卜" data-trace="NC-CAB-HLUB-0422-01"><td>A1-02</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-002</a></td><td>净胡萝卜</td><td>净胡萝卜</td><td><span class="tag tag-green">🥬 净菜</span></td><td>18.0</td><td>15.6</td><td>李主管</td><td>4.1</td><td>剩余46h</td><td>04-22 09:20</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-02','净胡萝卜')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="2" data-type="净菜" data-order="JC-2026-0422-003" data-dish="净香菇" data-trace="NC-CAB-XGUO-0422-01"><td>A1-03</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-003</a></td><td>净香菇</td><td>净香菇</td><td><span class="tag tag-green">🥬 净菜</span></td><td>9.0</td><td>6.8</td><td>王厨师</td><td>4.3</td><td>剩余6h</td><td>04-22 09:30</td><td><span class="tag tag-orange">临期预警</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-03','净香菇')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="3" data-type="净菜" data-order="JC-2026-0422-004" data-dish="净西兰花" data-trace="NC-CAB-XLHU-0422-01"><td>A1-04</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-004</a></td><td>净西兰花</td><td>净西兰花</td><td><span class="tag tag-green">🥬 净菜</span></td><td>10.0</td><td>8.5</td><td>张厨师</td><td>4.0</td><td>剩余50h</td><td>04-22 09:40</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-04','净西兰花')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="4" data-type="餐品包" data-order="JC-2026-0422-005" data-dish="宫保鸡丁" data-trace="PKG-DH-001"><td>A1-05</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-005</a></td><td>宫保鸡丁</td><td>宫保鸡丁</td><td><span class="tag tag-orange">🍱 餐品包</span></td><td>6.0</td><td>5.4</td><td>李主管</td><td>3.8</td><td>剩余44h</td><td>04-22 10:20</td><td><span class="tag tag-green">存放中</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-05','宫保鸡丁')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="5" data-type="净菜" data-order="JC-2026-0422-006" data-dish="净白菜" data-trace="NC-CAB-BCAI-0422-01"><td>A1-06</td><td><a class="link" href="prod-clean-order.html">JC-2026-0422-006</a></td><td>净白菜</td><td>净白菜</td><td><span class="tag tag-green">🥬 净菜</span></td><td>22.0</td><td>18.0</td><td>王厨师</td><td>7.8</td><td>剩余40h</td><td>04-22 08:50</td><td><span class="tag tag-red">已过期</span></td><td class="td-actions"><a class="link" href="trace-timeline-ingredient.html">溯源</a> <span class="link" onclick="showVideo('A1-06','净白菜')">视频</span> <span class="link" onclick="showDetail(this)">详情</span><span class="link">编辑</span></td></tr>
|
||||
<tr data-slot="6"><td>A1-07</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.1</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="7"><td>A1-08</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.1</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="8"><td>A1-09</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.2</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
<tr data-slot="9"><td>A1-10</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>—</td><td>4.2</td><td>—</td><td>—</td><td><span class="tag tag-gray">空闲</span></td><td class="td-actions">—</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -370,12 +370,19 @@ tbody tr.row-active td.td-actions{background:var(--primary-light);}
|
||||
<div class="form-item__label">选择净菜订单<span class="required">*</span></div>
|
||||
<select id="orderSelect" onchange="onOrderSelect(this)">
|
||||
<option value="">请选择净菜订单</option>
|
||||
<option value="JC-2026-0422-007">JC-2026-0422-007 — 土豆丝 20份</option>
|
||||
<option value="JC-2026-0422-008">JC-2026-0422-008 — 净黄瓜 15份</option>
|
||||
<option value="JC-2026-0422-009">JC-2026-0422-009 — 宫保鸡丁(餐品包) 30份</option>
|
||||
<option value="JC-2026-0422-007">JC-2026-0422-007 — 含2道菜品</option>
|
||||
<option value="JC-2026-0422-008">JC-2026-0422-008 — 含3道菜品</option>
|
||||
<option value="JC-2026-0422-009">JC-2026-0422-009 — 含1道菜品</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 选择订单后回显区域 -->
|
||||
<!-- 选择订单后显示订单菜品明细(多选一) -->
|
||||
<div class="form-item full" id="orderDishArea" style="display:none;">
|
||||
<div class="form-item__label">选择订单菜品<span class="required">*</span></div>
|
||||
<select id="orderDishSelect" onchange="onDishSelect(this.value)">
|
||||
<option value="">请选择菜品</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 选择菜品后回显区域 -->
|
||||
<div class="form-item full" id="orderEchoArea" style="display:none;">
|
||||
<div style="background:#F8FBFF;border:1px solid var(--border);border-radius:var(--radius-md);padding:16px;">
|
||||
<div style="font-size:var(--font-sm);font-weight:600;margin-bottom:12px;color:var(--primary);">净菜订单</div>
|
||||
@@ -447,19 +454,44 @@ function showVideo(code,name){
|
||||
}
|
||||
function closeVideoModal(){var m=document.getElementById('videoModal');if(m)m.remove();}
|
||||
|
||||
/* 存入净菜弹窗 — 选择净菜订单后回显信息 */
|
||||
var orderData={
|
||||
'JC-2026-0422-007':{name:'土豆丝',spec:'5kg/袋',qty:'20份',weight:'12.5',time:'2026-04-22 08:00'},
|
||||
'JC-2026-0422-008':{name:'净黄瓜',spec:'3kg/袋',qty:'15份',weight:'9.0',time:'2026-04-22 08:30'},
|
||||
'JC-2026-0422-009':{name:'宫保鸡丁(餐品包)',spec:'6份/箱',qty:'30份',weight:'18.0',time:'2026-04-22 07:45'}
|
||||
/* 存入净菜弹窗 — 先选订单再选菜品明细 */
|
||||
var ORDER_DISHES={
|
||||
'JC-2026-0422-007':[
|
||||
{name:'土豆丝',spec:'5kg/袋',qty:'20份',weight:'12.5',time:'2026-04-22 08:00',type:'nc'},
|
||||
{name:'宫保鸡丁',spec:'标准份(500g)',qty:'30份',weight:'15.0',time:'2026-04-22 08:00',type:'cp'}
|
||||
],
|
||||
'JC-2026-0422-008':[
|
||||
{name:'净黄瓜',spec:'3kg/袋',qty:'15份',weight:'9.0',time:'2026-04-22 08:30',type:'nc'},
|
||||
{name:'净西兰花',spec:'500g/袋',qty:'10份',weight:'5.0',time:'2026-04-22 08:30',type:'nc'},
|
||||
{name:'清蒸鱼',spec:'标准份(600g)',qty:'12份',weight:'7.2',time:'2026-04-22 08:30',type:'cp'}
|
||||
],
|
||||
'JC-2026-0422-009':[
|
||||
{name:'宫保鸡丁',spec:'6份/箱',qty:'30份',weight:'18.0',time:'2026-04-22 07:45',type:'cp'}
|
||||
]
|
||||
};
|
||||
function onOrderSelect(sel){
|
||||
var v=sel.value;
|
||||
var area=document.getElementById('orderEchoArea');
|
||||
if(!v){area.style.display='none';return;}
|
||||
var d=orderData[v];
|
||||
if(!d){area.style.display='none';return;}
|
||||
area.style.display='';
|
||||
var dishArea=document.getElementById('orderDishArea');
|
||||
var dishSelect=document.getElementById('orderDishSelect');
|
||||
var echoArea=document.getElementById('orderEchoArea');
|
||||
if(!v){dishArea.style.display='none';echoArea.style.display='none';return;}
|
||||
var dishes=ORDER_DISHES[v]||[];
|
||||
dishSelect.innerHTML='<option value="">请选择菜品</option>';
|
||||
dishes.forEach(function(d,i){
|
||||
dishSelect.innerHTML+='<option value="'+i+'">'+d.name+' — '+d.spec+' — '+d.qty+'</option>';
|
||||
});
|
||||
dishSelect.value='';
|
||||
dishArea.style.display='flex';
|
||||
echoArea.style.display='none';
|
||||
}
|
||||
function onDishSelect(idx){
|
||||
var orderNo=document.getElementById('orderSelect').value;
|
||||
var echoArea=document.getElementById('orderEchoArea');
|
||||
if(idx===''){echoArea.style.display='none';return;}
|
||||
var dishes=ORDER_DISHES[orderNo]||[];
|
||||
var d=dishes[parseInt(idx)];
|
||||
if(!d){echoArea.style.display='none';return;}
|
||||
echoArea.style.display='';
|
||||
document.getElementById('echo-name').textContent=d.name;
|
||||
document.getElementById('echo-spec').textContent=d.spec;
|
||||
document.getElementById('echo-qty').textContent=d.qty;
|
||||
@@ -493,15 +525,15 @@ function showDetail(el){
|
||||
var orderNo=row.getAttribute('data-order')||'—';
|
||||
var traceCode=row.getAttribute('data-trace')||'—';
|
||||
var slotId=cells[0].textContent.trim();
|
||||
var itemName=cells[2].textContent.trim();
|
||||
var typeHtml=cells[3].innerHTML.trim();
|
||||
var initWeight=cells[4].textContent.trim();
|
||||
var curWeight=cells[5].textContent.trim();
|
||||
var operator=cells[6].textContent.trim();
|
||||
var temp=cells[7].textContent.trim();
|
||||
var remain=cells[8].textContent.trim();
|
||||
var storeTime=cells[9].textContent.trim();
|
||||
var status=cells[10].innerHTML.trim();
|
||||
var itemName=cells[3].textContent.trim();
|
||||
var typeHtml=cells[4].innerHTML.trim();
|
||||
var initWeight=cells[5].textContent.trim();
|
||||
var curWeight=cells[6].textContent.trim();
|
||||
var operator=cells[7].textContent.trim();
|
||||
var temp=cells[8].textContent.trim();
|
||||
var remain=cells[9].textContent.trim();
|
||||
var storeTime=cells[10].textContent.trim();
|
||||
var status=cells[11].innerHTML.trim();
|
||||
|
||||
/* 基础信息区 */
|
||||
var html='<div class="drawer-section"><div class="drawer-section__title">基础信息</div><div class="drawer-fields">';
|
||||
|
||||
@@ -97,6 +97,8 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
.action-more__item:hover{background:var(--primary-light);color:var(--primary);}
|
||||
.action-more__item--danger{color:var(--danger);}
|
||||
.action-more__item--danger:hover{background:#FFF1F0;color:var(--danger);}
|
||||
/* 订单分组:同订单最后一行加分隔线 */
|
||||
tr.order-last td{border-bottom:2px solid #d9d9d9;}
|
||||
/* 右侧抽屉 */
|
||||
.drawer-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.45);z-index:1000;animation:modalFadeIn .2s ease;}
|
||||
.drawer-overlay.closing{animation:modalFadeOut .2s ease forwards;}
|
||||
@@ -185,14 +187,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><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><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><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>
|
||||
<tr data-order="CO-001"><td>CMB-001</td><td><span class="link">CO-001</span></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 data-order="CO-001" class="order-last"><td>CMB-002</td><td><span class="link">CO-001</span></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 data-order="CO-002"><td>CMB-003</td><td><span class="link">CO-002</span></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 data-order="CO-002" class="order-last"><td>CMB-004</td><td><span class="link">CO-002</span></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 data-order="CO-003"><td>CMB-005</td><td><span class="link">CO-003</span></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 data-order="CO-004"><td>CMB-006</td><td><span class="link">CO-004</span></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>
|
||||
@@ -363,15 +365,15 @@ function openEditModal(el){
|
||||
document.getElementById('modalSubmitBtn').textContent='保存';
|
||||
// 回填数据
|
||||
document.getElementById('formTaskId').value=tds[0].textContent;
|
||||
document.getElementById('createDish').value=tds[1].textContent;
|
||||
document.getElementById('createDish').value=tds[2].textContent;
|
||||
document.getElementById('createDish').disabled=true;
|
||||
document.getElementById('formSpec').value=tds[2].textContent;
|
||||
document.getElementById('createQty').value=tds[3].textContent;
|
||||
document.getElementById('formPerson').value=tds[8].textContent==='—'?'':tds[8].textContent;
|
||||
document.getElementById('formSpec').value=tds[3].textContent;
|
||||
document.getElementById('createQty').value=tds[4].textContent;
|
||||
document.getElementById('formPerson').value=tds[9].textContent==='—'?'':tds[9].textContent;
|
||||
// 来源和操作类型回填
|
||||
var srcText=tds[6].textContent.trim();
|
||||
var srcText=tds[7].textContent.trim();
|
||||
document.getElementById('formSource').value=srcText;
|
||||
var opText=tds[9].textContent.trim();
|
||||
var opText=tds[10].textContent.trim();
|
||||
document.getElementById('formOpType').value=opText;
|
||||
// 触发食材明细计算
|
||||
calcIngredients();
|
||||
@@ -385,10 +387,10 @@ function submitModal(){
|
||||
if(_modalMode==='edit'&&_editRow){
|
||||
// 编辑模式:更新表格行
|
||||
var tds=_editRow.querySelectorAll('td');
|
||||
tds[2].textContent=document.getElementById('formSpec').value;
|
||||
tds[3].textContent=document.getElementById('createQty').value;
|
||||
tds[3].textContent=document.getElementById('formSpec').value;
|
||||
tds[4].textContent=document.getElementById('createQty').value;
|
||||
var person=document.getElementById('formPerson').value.trim();
|
||||
if(person)tds[8].textContent=person;
|
||||
if(person)tds[9].textContent=person;
|
||||
closeModal();
|
||||
showToast('✅ 任务信息已更新');
|
||||
} else {
|
||||
@@ -429,8 +431,8 @@ function openRecipeModal(name){
|
||||
var rows=document.querySelectorAll('tbody tr');
|
||||
var qty=50;
|
||||
for(var i=0;i<rows.length;i++){
|
||||
if(rows[i].querySelectorAll('td')[1]&&rows[i].querySelectorAll('td')[1].textContent.trim()===name){
|
||||
qty=parseInt(rows[i].querySelectorAll('td')[3].textContent)||50;break;
|
||||
if(rows[i].querySelectorAll('td')[2]&&rows[i].querySelectorAll('td')[2].textContent.trim()===name){
|
||||
qty=parseInt(rows[i].querySelectorAll('td')[4].textContent)||50;break;
|
||||
}
|
||||
}
|
||||
var ings=recipeData[name]||[];
|
||||
@@ -486,7 +488,7 @@ function startCombo(el){
|
||||
var tr=el.closest('tr');
|
||||
var tds=tr.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent;
|
||||
tds[7].innerHTML='<span class="tag tag-blue">组配中</span>';
|
||||
tds[8].innerHTML='<span class="tag tag-blue">组配中</span>';
|
||||
el.style.color='var(--success)';
|
||||
el.setAttribute('onclick','finishCombo(this)');
|
||||
el.textContent='完成组配';
|
||||
@@ -498,10 +500,10 @@ function finishCombo(el){
|
||||
var tr=el.closest('tr');
|
||||
var tds=tr.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent;
|
||||
tds[7].innerHTML='<span class="tag tag-green">已完成</span>';
|
||||
tds[8].innerHTML='<span class="tag tag-green">已完成</span>';
|
||||
var now=new Date();
|
||||
var ts=now.getFullYear()+'-'+String(now.getMonth()+1).padStart(2,'0')+'-'+String(now.getDate()).padStart(2,'0')+' '+String(now.getHours()).padStart(2,'0')+':'+String(now.getMinutes()).padStart(2,'0')+':'+String(now.getSeconds()).padStart(2,'0');
|
||||
tds[10].textContent=ts;
|
||||
tds[12].textContent=ts;
|
||||
el.remove();
|
||||
showToast('✅ '+taskId+' 组配已完成');
|
||||
}
|
||||
@@ -511,15 +513,15 @@ function showDetail(el){
|
||||
var tr=el.closest('tr');
|
||||
var tds=tr.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent.trim();
|
||||
var dishName=tds[1].textContent.trim();
|
||||
var spec=tds[2].textContent.trim();
|
||||
var qty=parseInt(tds[3].textContent)||0;
|
||||
var deadline=tds[4].textContent.trim();
|
||||
var source=tds[6].textContent.trim();
|
||||
var status=tds[7].innerHTML;
|
||||
var person=tds[8].textContent.trim();
|
||||
var opType=tds[9].textContent.trim();
|
||||
var finishTime=tds[10].textContent.trim();
|
||||
var dishName=tds[2].textContent.trim();
|
||||
var spec=tds[3].textContent.trim();
|
||||
var qty=parseInt(tds[4].textContent)||0;
|
||||
var deadline=tds[5].textContent.trim();
|
||||
var source=tds[7].textContent.trim();
|
||||
var status=tds[8].innerHTML;
|
||||
var person=tds[9].textContent.trim();
|
||||
var opType=tds[10].textContent.trim();
|
||||
var finishTime=tds[12].textContent.trim();
|
||||
|
||||
var html='<div class="drawer-section"><div class="drawer-section__title">基本信息</div><div class="drawer-fields">';
|
||||
html+='<div class="drawer-field"><div class="drawer-field__label">任务编号</div><div class="drawer-field__value">'+taskId+'</div></div>';
|
||||
|
||||
@@ -79,6 +79,8 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
|
||||
.action-more__item:hover{background:var(--primary-light);color:var(--primary);}
|
||||
.action-more__item--danger{color:var(--danger);}
|
||||
.action-more__item--danger:hover{background:#FFF1F0;color:var(--danger);}
|
||||
/* 订单分组:同订单最后一行加分隔线 */
|
||||
tr.order-last td{border-bottom:2px solid #d9d9d9;}
|
||||
/* 弹窗 */
|
||||
.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.45);z-index:1000;display:flex;align-items:center;justify-content:center;}
|
||||
.modal{background:#fff;border-radius:8px;max-height:85vh;overflow-y:auto;box-shadow:0 4px 12px rgba(0,0,0,0.15);}
|
||||
@@ -198,15 +200,15 @@ 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><th>食材明细</th><th>温度过程</th><th>模型数据</th><th>生重(kg)</th><th>熟重(kg)</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><th>食材明细</th><th>温度过程</th><th>模型数据</th><th>生重(kg)</th><th>熟重(kg)</th><th>生熟比</th><th>操作</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>COOK-001</td><td><span class="tag tag-blue">点餐</span></td><td>CMB-001</td><td>宫保鸡丁</td><td>标准份(300g)</td><td>50</td><td>50</td><td>2026-05-20</td><td>11:00</td><td>11:20</td><td><span class="tag tag-green">已完成</span></td><td>张厨师</td><td><a class="link" onclick="openIngredientModal('宫保鸡丁')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">92分</span></a></td><td>8.5</td><td>7.2</td><td>1:0.85</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr><td>COOK-002</td><td><span class="tag tag-blue">点餐</span></td><td>CMB-002</td><td>番茄炒蛋</td><td>大份(500g)</td><td>80</td><td>80</td><td>2026-05-20</td><td>11:05</td><td>11:20</td><td><span class="tag tag-green">已完成</span></td><td>李厨师</td><td><a class="link" onclick="openIngredientModal('番茄炒蛋')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">88分</span></a></td><td>12.0</td><td>10.4</td><td>1:0.87</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr><td>COOK-003</td><td><span class="tag tag-gray">餐线</span></td><td>CMB-003</td><td>红烧肉</td><td>标准份(300g)</td><td>60</td><td>—</td><td>2026-05-20</td><td>11:10</td><td>—</td><td><span class="tag tag-blue">烹制中</span></td><td>王厨师</td><td><a class="link" onclick="openIngredientModal('红烧肉')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><span class="tag tag-blue">分析中</span></td><td>10.0</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><span class="link" onclick="finishCook(this)">烹制完成</span></td></tr>
|
||||
<tr><td>COOK-004</td><td><span class="tag tag-gray">餐线</span></td><td>CMB-004</td><td>清蒸鱼</td><td>标准份(500g)</td><td>40</td><td>—</td><td>2026-05-20</td><td>11:15</td><td>—</td><td><span class="tag tag-blue">烹制中</span></td><td>张厨师</td><td><a class="link" onclick="openIngredientModal('清蒸鱼')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><span class="tag tag-blue">分析中</span></td><td>6.5</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><span class="link" onclick="finishCook(this)">烹制完成</span></td></tr>
|
||||
<tr><td>COOK-005</td><td><span class="tag tag-gray">餐线</span></td><td>CMB-005</td><td>蒜蓉菠菜</td><td>标准份(300g)</td><td>100</td><td>—</td><td>2026-05-20</td><td>—</td><td>—</td><td><span class="tag tag-orange">待烹制</span></td><td>—</td><td><a class="link" onclick="openIngredientModal('蒜蓉菠菜')">食材明细</a></td><td>—</td><td>—</td><td>15.0</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><span class="link" onclick="startCook(this)">开始烹制</span></td></tr>
|
||||
<tr><td>COOK-006</td><td><span class="tag tag-gray">餐线</span></td><td>CMB-005</td><td>炒时蔬</td><td>小份(200g)</td><td>20</td><td>20</td><td>2026-05-20</td><td>11:10</td><td>11:30</td><td><span class="tag tag-green">已完成</span></td><td>赵厨师</td><td><a class="link" onclick="openIngredientModal('炒时蔬')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">95分</span></a></td><td>18.0</td><td>15.6</td><td>1:0.87</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr><td>COOK-007</td><td><span class="tag tag-blue">点餐</span></td><td>CMB-006</td><td>豆腐</td><td>小份(200g)</td><td>35</td><td>35</td><td>2026-05-20</td><td>11:20</td><td>11:35</td><td><span class="tag tag-green">已完成</span></td><td>陈厨师</td><td><a class="link" onclick="openIngredientModal('豆腐')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">78分</span></a></td><td>4.2</td><td>3.9</td><td>1:0.93</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr data-order="CO-001"><td>COOK-001</td><td><span class="link" onclick="showCookOrderDetail('CO-001')">CO-001</span><span class="tag tag-green" style="margin-left:4px;">✓ 已烹齐</span></td><td><span class="tag tag-blue">点餐</span></td><td>CMB-001</td><td>宫保鸡丁</td><td>标准份(300g)</td><td>50</td><td>50</td><td>2026-05-20</td><td>11:00</td><td>11:20</td><td><span class="tag tag-green">已完成</span></td><td>张厨师</td><td><a class="link" onclick="openIngredientModal('宫保鸡丁')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">92分</span></a></td><td>8.5</td><td>7.2</td><td>1:0.85</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr data-order="CO-001" class="order-last"><td>COOK-002</td><td><span class="link" onclick="showCookOrderDetail('CO-001')">CO-001</span></td><td><span class="tag tag-blue">点餐</span></td><td>CMB-002</td><td>番茄炒蛋</td><td>大份(500g)</td><td>80</td><td>80</td><td>2026-05-20</td><td>11:05</td><td>11:20</td><td><span class="tag tag-green">已完成</span></td><td>李厨师</td><td><a class="link" onclick="openIngredientModal('番茄炒蛋')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">88分</span></a></td><td>12.0</td><td>10.4</td><td>1:0.87</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr data-order="CO-002"><td>COOK-003</td><td><span class="link" onclick="showCookOrderDetail('CO-002')">CO-002</span><span class="tag tag-orange" style="margin-left:4px;">烹制中 1/2</span></td><td><span class="tag tag-gray">餐线</span></td><td>CMB-003</td><td>红烧肉</td><td>标准份(300g)</td><td>60</td><td>—</td><td>2026-05-20</td><td>11:10</td><td>—</td><td><span class="tag tag-blue">烹制中</span></td><td>王厨师</td><td><a class="link" onclick="openIngredientModal('红烧肉')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><span class="tag tag-blue">分析中</span></td><td>10.0</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><span class="link" onclick="finishCook(this)">烹制完成</span></td></tr>
|
||||
<tr data-order="CO-002" class="order-last"><td>COOK-004</td><td><span class="link" onclick="showCookOrderDetail('CO-002')">CO-002</span></td><td><span class="tag tag-gray">餐线</span></td><td>CMB-004</td><td>清蒸鱼</td><td>标准份(500g)</td><td>40</td><td>—</td><td>2026-05-20</td><td>11:15</td><td>—</td><td><span class="tag tag-blue">烹制中</span></td><td>张厨师</td><td><a class="link" onclick="openIngredientModal('清蒸鱼')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><span class="tag tag-blue">分析中</span></td><td>6.5</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><span class="link" onclick="finishCook(this)">烹制完成</span></td></tr>
|
||||
<tr data-order="CO-003"><td>COOK-005</td><td><span class="link" onclick="showCookOrderDetail('CO-003')">CO-003</span><span class="tag tag-gray" style="margin-left:4px;">待烹制 0/2</span></td><td><span class="tag tag-gray">餐线</span></td><td>CMB-005</td><td>蒜蓉菠菜</td><td>标准份(300g)</td><td>100</td><td>—</td><td>2026-05-20</td><td>—</td><td>—</td><td><span class="tag tag-orange">待烹制</span></td><td>—</td><td><a class="link" onclick="openIngredientModal('蒜蓉菠菜')">食材明细</a></td><td>—</td><td>—</td><td>15.0</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><span class="link" onclick="startCook(this)">开始烹制</span></td></tr>
|
||||
<tr data-order="CO-003" class="order-last"><td>COOK-006</td><td><span class="link" onclick="showCookOrderDetail('CO-003')">CO-003</span></td><td><span class="tag tag-gray">餐线</span></td><td>CMB-005</td><td>炒时蔬</td><td>小份(200g)</td><td>20</td><td>20</td><td>2026-05-20</td><td>11:10</td><td>11:30</td><td><span class="tag tag-green">已完成</span></td><td>赵厨师</td><td><a class="link" onclick="openIngredientModal('炒时蔬')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">95分</span></a></td><td>18.0</td><td>15.6</td><td>1:0.87</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
<tr data-order="CO-004"><td>COOK-007</td><td><span class="link" onclick="showCookOrderDetail('CO-004')">CO-004</span><span class="tag tag-green" style="margin-left:4px;">✓ 已烹齐</span></td><td><span class="tag tag-blue">点餐</span></td><td>CMB-006</td><td>豆腐</td><td>小份(200g)</td><td>35</td><td>35</td><td>2026-05-20</td><td>11:20</td><td>11:35</td><td><span class="tag tag-green">已完成</span></td><td>陈厨师</td><td><a class="link" onclick="openIngredientModal('豆腐')">食材明细</a></td><td><a class="link" onclick="openTempModal()">温度曲线</a></td><td><a class="link" onclick="openModelModal()"><span class="tag tag-green">78分</span></a></td><td>4.2</td><td>3.9</td><td>1:0.93</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><span class="link" onclick="notifyPickup(this)">通知取餐</span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -409,8 +411,8 @@ function openIngredientModal(name){
|
||||
var rows=document.querySelectorAll('.table-card tbody tr');
|
||||
var qty=50;
|
||||
for(var i=0;i<rows.length;i++){
|
||||
if(rows[i].querySelectorAll('td')[3]&&rows[i].querySelectorAll('td')[3].textContent.trim()===name){
|
||||
qty=parseInt(rows[i].querySelectorAll('td')[5].textContent)||50;break;
|
||||
if(rows[i].querySelectorAll('td')[4]&&rows[i].querySelectorAll('td')[4].textContent.trim()===name){
|
||||
qty=parseInt(rows[i].querySelectorAll('td')[6].textContent)||50;break;
|
||||
}
|
||||
}
|
||||
var ings=recipeData[name]||[];
|
||||
@@ -443,13 +445,13 @@ function openEditModal(el){
|
||||
_editRow=el.closest('tr');
|
||||
var tds=_editRow.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent.trim();
|
||||
var dishName=tds[3].textContent.trim();
|
||||
var spec=tds[4].textContent.trim();
|
||||
var qty=parseInt(tds[5].textContent)||0;
|
||||
var cookDate=tds[7].textContent.trim();
|
||||
var chef=tds[11].textContent.trim();
|
||||
var rawWeight=tds[15].textContent.trim();
|
||||
var cookedWeight=tds[16].textContent.trim();
|
||||
var dishName=tds[4].textContent.trim();
|
||||
var spec=tds[5].textContent.trim();
|
||||
var qty=parseInt(tds[6].textContent)||0;
|
||||
var cookDate=tds[8].textContent.trim();
|
||||
var chef=tds[12].textContent.trim();
|
||||
var rawWeight=tds[16].textContent.trim();
|
||||
var cookedWeight=tds[17].textContent.trim();
|
||||
|
||||
document.getElementById('editTitle').textContent='编辑烹制任务 — '+taskId;
|
||||
document.getElementById('editTaskId').value=taskId;
|
||||
@@ -488,16 +490,16 @@ function submitEdit(){
|
||||
if(_editRow){
|
||||
var tds=_editRow.querySelectorAll('td');
|
||||
var chef=document.getElementById('editChef').value.trim();
|
||||
if(chef)tds[11].textContent=chef;
|
||||
if(chef)tds[12].textContent=chef;
|
||||
var rw=document.getElementById('editRawWeight').value.trim();
|
||||
if(rw)tds[15].textContent=rw;
|
||||
if(rw)tds[16].textContent=rw;
|
||||
var cw=document.getElementById('editCookedWeight').value.trim();
|
||||
if(cw){
|
||||
tds[16].textContent=cw;
|
||||
tds[17].textContent=cw;
|
||||
// 自动计算生熟比
|
||||
var rwNum=parseFloat(tds[15].textContent);
|
||||
var rwNum=parseFloat(tds[16].textContent);
|
||||
var cwNum=parseFloat(cw);
|
||||
if(rwNum&&cwNum)tds[17].textContent='1:'+(cwNum/rwNum).toFixed(2);
|
||||
if(rwNum&&cwNum)tds[18].textContent='1:'+(cwNum/rwNum).toFixed(2);
|
||||
}
|
||||
closeEditModal();
|
||||
showToast('✅ 烹制任务已更新');
|
||||
@@ -541,38 +543,87 @@ function showToast(msg){
|
||||
}
|
||||
function _timeNow(){var d=new Date();return String(d.getHours()).padStart(2,'0')+':'+String(d.getMinutes()).padStart(2,'0');}
|
||||
|
||||
/* 更新关联订单列的状态标记 */
|
||||
function updateOrderBadge(orderNo){
|
||||
var rows=document.querySelectorAll('tr[data-order="'+orderNo+'"]');
|
||||
var total=rows.length;
|
||||
var done=0;
|
||||
rows.forEach(function(r){
|
||||
var statusTd=r.querySelectorAll('td')[11]; // 烹制状态列
|
||||
if(statusTd&&statusTd.textContent.trim()==='已完成')done++;
|
||||
});
|
||||
var badgeHtml='';
|
||||
if(done===total)badgeHtml='<span class="tag tag-green" style="margin-left:4px;">✓ 已烹齐</span>';
|
||||
else if(done>0)badgeHtml='<span class="tag tag-orange" style="margin-left:4px;">烹制中 '+done+'/'+total+'</span>';
|
||||
else badgeHtml='<span class="tag tag-gray" style="margin-left:4px;">待烹制 0/'+total+'</span>';
|
||||
/* 更新该订单所有行的关联订单列标记 */
|
||||
rows.forEach(function(r){
|
||||
var orderTd=r.querySelectorAll('td')[1];
|
||||
if(orderTd){
|
||||
/* 保留订单号链接,追加/替换标记 */
|
||||
var linkHtml='<span class="link" onclick="showCookOrderDetail(\''+orderNo+'\')">'+orderNo+'</span>';
|
||||
orderTd.innerHTML=linkHtml+badgeHtml;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* 开始烹制 */
|
||||
function startCook(el){
|
||||
var tr=el.closest('tr');
|
||||
var tds=tr.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent;
|
||||
tds[10].innerHTML='<span class="tag tag-blue">烹制中</span>';
|
||||
tds[8].textContent=_timeNow();
|
||||
var orderNo=tr.getAttribute('data-order');
|
||||
tds[11].innerHTML='<span class="tag tag-blue">烹制中</span>';
|
||||
tds[9].textContent=_timeNow();
|
||||
el.setAttribute('onclick','finishCook(this)');
|
||||
el.textContent='烹制完成';
|
||||
if(orderNo)updateOrderBadge(orderNo);
|
||||
showToast('✅ '+taskId+' 已开始烹制');
|
||||
}
|
||||
|
||||
/* 烹制完成 */
|
||||
/* 烹制完成 —— 核心改动:检查该订单下所有烹制任务是否全部完成 */
|
||||
function finishCook(el){
|
||||
var tr=el.closest('tr');
|
||||
var tds=tr.querySelectorAll('td');
|
||||
var taskId=tds[0].textContent;
|
||||
tds[10].innerHTML='<span class="tag tag-green">已完成</span>';
|
||||
tds[9].textContent=_timeNow();
|
||||
var orderNo=tr.getAttribute('data-order');
|
||||
var dishName=tds[4].textContent;
|
||||
tds[11].innerHTML='<span class="tag tag-green">已完成</span>';
|
||||
tds[10].textContent=_timeNow();
|
||||
el.setAttribute('onclick','notifyPickup(this)');
|
||||
el.textContent='通知取餐';
|
||||
showToast('✅ '+taskId+' 烹制已完成');
|
||||
if(orderNo)updateOrderBadge(orderNo);
|
||||
/* 检查是否该订单全部烹制完成 */
|
||||
if(orderNo){
|
||||
var rows=document.querySelectorAll('tr[data-order="'+orderNo+'"]');
|
||||
var allDone=true;
|
||||
rows.forEach(function(r){
|
||||
var st=r.querySelectorAll('td')[11];
|
||||
if(st&&st.textContent.trim()!=='已完成')allDone=false;
|
||||
});
|
||||
if(allDone){
|
||||
showToast('🎉 订单 '+orderNo+' 全部菜品烹制完成!可通知出餐');
|
||||
}else{
|
||||
showToast('✅ '+taskId+'('+dishName+')烹制完成,订单 '+orderNo+' 还有未完成的菜品');
|
||||
}
|
||||
}else{
|
||||
showToast('✅ '+taskId+' 烹制已完成');
|
||||
}
|
||||
}
|
||||
|
||||
/* 通知取餐 */
|
||||
function notifyPickup(el){
|
||||
var tr=el.closest('tr');
|
||||
var taskId=tr.querySelectorAll('td')[0].textContent;
|
||||
var dishName=tr.querySelectorAll('td')[3].textContent;
|
||||
var dishName=tr.querySelectorAll('td')[4].textContent;
|
||||
showToast('✅ '+taskId+'('+dishName+')已通知取餐');
|
||||
}
|
||||
|
||||
/* 点击关联订单号查看订单详情(跳转到净菜订单详情) */
|
||||
function showCookOrderDetail(orderNo){
|
||||
showToast('📋 查看订单 '+orderNo+' 详情(含所有菜品烹制进度)');
|
||||
}
|
||||
|
||||
/* 详情抽屉(含食材明细) */
|
||||
function showDetail(el){
|
||||
var tr=el.closest('tr');
|
||||
@@ -585,8 +636,8 @@ function showDetail(el){
|
||||
fields+='<div class="drawer-field"><div class="drawer-field__label">'+label+'</div><div class="drawer-field__value">'+value+'</div></div>';
|
||||
}
|
||||
var taskId=tds[0].textContent.trim();
|
||||
var dishName=tds[3].textContent.trim();
|
||||
var qty=parseInt(tds[5].textContent)||0;
|
||||
var dishName=tds[4].textContent.trim();
|
||||
var qty=parseInt(tds[6].textContent)||0;
|
||||
|
||||
var bodyHtml='<div class="drawer-section"><div class="drawer-section__title">基本信息</div><div class="drawer-fields">'+fields+'</div></div>';
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -198,29 +198,29 @@ 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>净菜需求量(kg)</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>净菜需求量(kg)</th><th>毛菜重量(kg)</th><th>净菜产出量(kg)</th><th>出净率(%)</th><th>加工人员</th><th>开始时间</th><th>结束时间</th><th>入库状态</th><th>操作</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>PROC-001</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆</td><td>土豆丝</td><td>去皮/切割</td><td>80</td><td>100</td><td>86</td><td>86.0</td><td>李加工</td><td>2026-04-15 08:00</td><td>2026-04-15 08:45</td><td><span class="tag tag-green">合格</span></td><td><span class="tag tag-green">已入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>PROC-001</td><td>NC-PROC-BOCA-20260415-01</td><td>土豆</td><td>土豆丝</td><td>去皮/切割</td><td>80</td><td>100</td><td>86</td><td>86.0</td><td>李加工</td><td>2026-04-15 08:00</td><td>2026-04-15 08:45</td><td><span class="tag tag-green">已入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>PROC-002</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆</td><td>土豆片</td><td>去皮/切割</td><td>115</td><td>140</td><td>120</td><td>85.7</td><td>王加工</td><td>2026-04-15 08:30</td><td>2026-04-15 09:20</td><td><span class="tag tag-green">合格</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-002</td><td>NC-PROC-HLUB-20260415-01</td><td>土豆</td><td>土豆片</td><td>去皮/切割</td><td>115</td><td>140</td><td>120</td><td>85.7</td><td>王加工</td><td>2026-04-15 08:30</td><td>2026-04-15 09:20</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-003</td><td>NC-PROC-XGUO-20260415-01</td><td>土豆</td><td>土豆泥</td><td>去皮/切割</td><td>45</td><td>56</td><td>48</td><td>85.7</td><td>李加工</td><td>2026-04-15 09:00</td><td>2026-04-15 09:40</td><td><span class="tag tag-green">合格</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-003</td><td>NC-PROC-XGUO-20260415-01</td><td>土豆</td><td>土豆泥</td><td>去皮/切割</td><td>45</td><td>56</td><td>48</td><td>85.7</td><td>李加工</td><td>2026-04-15 09:00</td><td>2026-04-15 09:40</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-004</td><td>NC-PROC-SJDOU-20260415-01</td><td>四季豆</td><td>段(5cm)</td><td>清洗</td><td>50</td><td>60</td><td>52</td><td>86.7</td><td>张加工</td><td>2026-04-15 09:30</td><td>2026-04-15 10:00</td><td><span class="tag tag-orange">待处理</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>PROC-004</td><td>NC-PROC-SJDOU-20260415-01</td><td>四季豆</td><td>段(5cm)</td><td>清洗</td><td>50</td><td>60</td><td>52</td><td>86.7</td><td>张加工</td><td>2026-04-15 09:30</td><td>2026-04-15 10:00</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>PROC-005</td><td>NC-PROC-BCAI-20260415-01</td><td>白菜</td><td>整棵</td><td>清洗</td><td>65</td><td>80</td><td>70</td><td>87.5</td><td>张加工</td><td>2026-04-15 07:30</td><td>2026-04-15 08:10</td><td><span class="tag tag-green">合格</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-005</td><td>NC-PROC-BCAI-20260415-01</td><td>白菜</td><td>整棵</td><td>清洗</td><td>65</td><td>80</td><td>70</td><td>87.5</td><td>张加工</td><td>2026-04-15 07:30</td><td>2026-04-15 08:10</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-006</td><td>NC-PROC-ZLRJ-20260415-01</td><td>猪里脊</td><td>丁(1.5cm)</td><td>切割</td><td>72</td><td>80</td><td>76</td><td>95.0</td><td>王加工</td><td>2026-04-15 09:30</td><td>2026-04-15 09:55</td><td><span class="tag tag-green">合格</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-006</td><td>NC-PROC-ZLRJ-20260415-01</td><td>猪里脊</td><td>丁(1.5cm)</td><td>切割</td><td>72</td><td>80</td><td>76</td><td>95.0</td><td>王加工</td><td>2026-04-15 09:30</td><td>2026-04-15 09:55</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</span> <span class="link" onclick="confirmGenStock(this)">生成入库单</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>PROC-007</td><td>NC-PROC-ZLRJ-20260415-02</td><td>猪里脊</td><td>条(4cm)</td><td>切割</td><td>80</td><td>90</td><td>85</td><td>94.4</td><td>李加工</td><td>2026-04-15 10:00</td><td>2026-04-15 10:30</td><td><span class="tag tag-orange">待处理</span></td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>PROC-007</td><td>NC-PROC-ZLRJ-20260415-02</td><td>猪里脊</td><td>条(4cm)</td><td>切割</td><td>80</td><td>90</td><td>85</td><td>94.4</td><td>李加工</td><td>2026-04-15 10:00</td><td>2026-04-15 10:30</td><td><span class="tag tag-gray">未入库</span></td><td class="td-actions"><span class="link" onclick="openVideoModal()">查看视频</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>
|
||||
@@ -294,7 +294,6 @@ tbody td.td-actions{white-space:nowrap;}
|
||||
<div class="form-item"><label>加工人员<span class="required">*</span></label><input type="text" placeholder="请输入加工人员"></div>
|
||||
<div class="form-item"><label>开始时间<span class="required">*</span></label><input type="datetime-local"></div>
|
||||
<div class="form-item"><label>结束时间</label><input type="datetime-local"></div>
|
||||
<div class="form-item"><label>质检结果</label><select><option>请选择</option><option>合格</option><option>不合格</option><option>待检</option></select></div>
|
||||
<div class="form-item full"><label>备注</label><textarea placeholder="请输入备注信息"></textarea></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user