From f9ecf8b7e9238267b0866309e57b9e2e51c504c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=86=AF=E6=99=AE?= <18691763612@163.com>
Date: Tue, 26 May 2026 11:24:10 +0800
Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=81=A5=E5=BA=B7=E7=94=9F?=
=?UTF-8?q?=E4=BA=A7=E5=92=8C=E5=8D=AB=E7=94=9F=E4=BE=9B=E5=BA=94=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E4=BA=8C=E7=BA=A7=E8=8F=9C=E5=8D=95=E4=B8=B2=E8=81=94?=
=?UTF-8?q?=E8=A1=A5=E5=85=A8=E9=A4=90=E5=93=81=E6=BA=AF=E6=BA=90=E7=8E=AF?=
=?UTF-8?q?=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web-admin/nutrition/doc/营养管理功能说明.md | 22 ++
web-admin/nutrition/prod-clean-order.html | 132 +++++++--
web-admin/nutrition/prod-proc-combo.html | 285 ++++++++++++++++----
web-admin/nutrition/prod-proc-cook.html | 238 ++++++++++++++--
web-admin/nutrition/sup-clean-external.html | 2 +
web-admin/nutrition/sup-clean-internal.html | 4 +-
6 files changed, 576 insertions(+), 107 deletions(-)
diff --git a/web-admin/nutrition/doc/营养管理功能说明.md b/web-admin/nutrition/doc/营养管理功能说明.md
index e525507..107b3db 100644
--- a/web-admin/nutrition/doc/营养管理功能说明.md
+++ b/web-admin/nutrition/doc/营养管理功能说明.md
@@ -1131,6 +1131,11 @@
- 新增右侧抽屉详情组件,点击"详情"以抽屉形式展示当前行所有字段
- 新增"确认收货"二次确认弹窗(配送中状态订单)
- 新增"备货完成"二次确认弹窗(备货中状态订单)
+- 列表移除「溯源码」「出库区域」列,精简表格宽度
+- 新建弹窗「包装批次号」字段始终显示(非必填),选择净菜后自动回显批次信息
+- 「备货完成」改为「补全备货信息」弹窗(选择包装批次号,确认后状态变更)
+- 详情抽屉按净菜类型定制渲染:净菜包显示溯源码+包装批次号;餐品净菜包显示批次号+食材明细表
+- 新建外售弹窗客户信息后置(移至净菜选择之后),客户名称/联系人/电话改为手动输入框
##### 2. sup-clean-internal.html(净菜内供)
- 筛选栏"申领部门"改为"申领食堂"
@@ -1142,6 +1147,10 @@
- 新增"确认收货"二次确认弹窗
- 新增"立即配送"弹窗(含配送人姓名、备注输入)
- 新增"备货完成"二次确认弹窗
+- 列表移除「溯源码」「仓库」列,精简表格宽度
+- 新建弹窗「包装批次号」字段始终显示(非必填),选择净菜后自动回显批次信息
+- 「备货完成」改为「补全备货信息」弹窗(选择包装批次号,确认后状态变更)
+- 详情抽屉按净菜类型定制渲染:净菜包显示溯源码+包装批次号;餐品净菜包显示批次号+食材明细表
##### 3. sup-hygiene-check.html(卫生检测)
- 新增监测弹窗以及交互
@@ -1272,6 +1281,11 @@
- 新增「操作类型」列(负责人与完成时间之间),值为"设备自动"(蓝色tag)/"人工录入"(绿色tag)
- 新建任务弹窗补充「操作类型」必填下拉字段
- 新增右侧抽屉详情组件,下拉菜单"详情"以抽屉形式展示任务各字段
+- 新建/编辑共用弹窗:选择餐品后自动计算食材明细(含溯源码/食材名称/分类/标准用量/实际用量/单位)
+- 食材明细弹窗溯源码改为可编辑输入框
+- 详情抽屉新增食材明细表格区域
+- 新增编辑弹窗(任务信息只读 + 食材明细溯源码可编辑)
+- 新增原型备注区域(仅开发环境可见,标注交互说明)
##### 2. prod-proc-cook.html(按单烹制)
- 筛选栏新增「当前食堂」「烹制日期」筛选,烹制日期默认当天
@@ -1282,6 +1296,10 @@
- 新增烹制状态对应不同的操作按钮
- 「开始烹制」「烹制完成」「通知取餐」按钮新增顶部 toast 提示交互(状态联动切换)
- 新增右侧抽屉详情组件,下拉菜单"详情"以抽屉形式展示烹制任务各字段
+- 食材明细弹窗「食材编码」列改为「溯源码」,溯源码改为可编辑输入框
+- 详情抽屉新增食材明细表格区域(溯源码/食材名称/分类/标准用量/实际用量/单位)
+- 新增编辑弹窗(640px):任务信息只读 + 厨师/生重(kg)/熟重(kg)可编辑 + 食材明细溯源码可编辑
+- 编辑保存时自动计算生熟比
##### 3. prod-proc-serve.html(上餐监控)
- 筛选栏新增「当前食堂」下拉
@@ -1326,6 +1344,10 @@
- 调整表格字段(净菜类型,调整规格与计量方式)
- 「确认收货」按钮新增二次确认弹窗(含订单信息展示),确认后状态变为"已完成"并移除按钮
- 新增右侧抽屉详情组件,操作列"详情"以抽屉形式展示订单各字段
+- 列表移除「溯源码」列,新建弹窗移除溯源码字段
+- 新建订单默认状态改为「备货中」
+- 详情抽屉按净菜类型定制渲染:净菜包显示溯源码+包装批次号;餐品净菜包显示批次号+食材明细表
+- 「确认收货」按钮列索引修正
##### 8. prod-proc-cabinet.html(净菜进柜)
- 新增页面标题行 + 食堂切换下拉
diff --git a/web-admin/nutrition/prod-clean-order.html b/web-admin/nutrition/prod-clean-order.html
index 15dc6c1..33c5ade 100644
--- a/web-admin/nutrition/prod-clean-order.html
+++ b/web-admin/nutrition/prod-clean-order.html
@@ -180,14 +180,14 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
- | 订单号 | 溯源码 | 净菜类型 | 净菜/餐品 | 包装规格 | 需求份数 | 需求计量(kg) | 订单状态 | 申领时间 | 预定配送时间 | 创建人 | 操作 |
+ | 订单号 | 净菜类型 | 净菜/餐品 | 包装规格 | 需求份数 | 需求计量(kg) | 订单状态 | 申领时间 | 预定配送时间 | 创建人 | 操作 |
- | CO-001 | NC-INT-BOCA-20260422-01 | 🥬 净菜包 | 菠菜 | 500g/袋 | 50 | 25 | 已完成 | 2026-04-22 07:30 | 2026-04-22 10:00 | 张厨师 | 详情 删除 |
- | CO-002 | NC-INT-ZLRJ-20260422-01 | 🥬 净菜包 | 猪排骨 | 2kg/盘 | 20 | 40 | 配送中 | 2026-04-22 08:00 | 2026-04-22 10:30 | 李主管 | 确认收货 详情 删除 |
- | CO-003 | NC-INT-JXRJ-20260422-01 | 🍱 餐品净菜包 | 宫保鸡丁 | 标准份(500g) | 30 | 15 | 配送中 | 2026-04-22 08:00 | 2026-04-22 10:30 | 李主管 | 确认收货 详情 删除 |
- | CO-005 | NC-INT-QZYU-20260422-01 | 🍱 餐品净菜包 | 清蒸鱼 | 标准份(500g) | 15 | 7.5 | 待配送 | 2026-04-22 09:00 | 2026-04-22 11:00 | 王厨师 | 详情 删除 |
- | CO-006 | NC-INT-TDSI-20260422-01 | 🥬 净菜包 | 土豆(土豆丝) | 500g/袋 | 40 | 20 | 备货中 | 2026-04-22 09:15 | 2026-04-22 11:00 | 张厨师 | 详情 删除 |
- | CO-008 | NC-INT-XLHU-20260422-01 | 🥬 净菜包 | 西兰花 | 500g/袋 | 30 | 15 | 已完成 | 2026-04-22 10:00 | 2026-04-22 11:30 | 王厨师 | 详情 删除 |
+ | CO-001 | 🥬 净菜包 | 菠菜 | 500g/袋 | 50 | 25 | 已完成 | 2026-04-22 07:30 | 2026-04-22 10:00 | 张厨师 | 详情 删除 |
+ | CO-002 | 🥬 净菜包 | 猪排骨 | 2kg/盘 | 20 | 40 | 配送中 | 2026-04-22 08:00 | 2026-04-22 10:30 | 李主管 | 确认收货 详情 删除 |
+ | CO-003 | 🍱 餐品净菜包 | 宫保鸡丁 | 标准份(500g) | 30 | 15 | 配送中 | 2026-04-22 08:00 | 2026-04-22 10:30 | 李主管 | 确认收货 详情 删除 |
+ | CO-005 | 🍱 餐品净菜包 | 清蒸鱼 | 标准份(500g) | 15 | 7.5 | 待配送 | 2026-04-22 09:00 | 2026-04-22 11:00 | 王厨师 | 详情 删除 |
+ | CO-006 | 🥬 净菜包 | 土豆(土豆丝) | 500g/袋 | 40 | 20 | 备货中 | 2026-04-22 09:15 | 2026-04-22 11:00 | 张厨师 | 详情 删除 |
+ | CO-008 | 🥬 净菜包 | 西兰花 | 500g/袋 | 30 | 15 | 已完成 | 2026-04-22 10:00 | 2026-04-22 11:30 | 王厨师 | 详情 删除 |
@@ -206,10 +206,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
@@ -285,14 +281,14 @@ var _confirmReceiveRow=null;
function confirmReceive(el){
_confirmReceiveRow=el.closest('tr');
var orderNo=_confirmReceiveRow.querySelectorAll('td')[0].textContent;
- var foodName=_confirmReceiveRow.querySelectorAll('td')[3].textContent;
+ var foodName=_confirmReceiveRow.querySelectorAll('td')[2].textContent;
document.getElementById('confirmReceiveMsg').innerHTML='确认已收到订单 '+orderNo+'('+foodName+')的净菜配送?';
openModal('modal-confirm-receive');
}
function doConfirmReceive(){
if(!_confirmReceiveRow)return;
- // 更新状态列为"已完成"
- var statusTd=_confirmReceiveRow.querySelectorAll('td')[7];
+ // 更新状态列为"已完成"(去掉溯源码后状态在第6列)
+ var statusTd=_confirmReceiveRow.querySelectorAll('td')[6];
statusTd.innerHTML='已完成';
// 移除"确认收货"按钮
var actionTd=_confirmReceiveRow.querySelector('.td-actions');
@@ -309,23 +305,111 @@ function closeDrawer(){
overlay.classList.add('closing');
setTimeout(function(){overlay.remove();},200);
}
+
+/* ========== 餐品食材数据 ========== */
+var dishIngredients={
+ '宫保鸡丁':[
+ {trace:'NC-PROC-JXR-20260415-01',name:'鸡胸肉',type:'主材',amount:'120g'},
+ {trace:'NC-PROC-HUS-20260415-01',name:'花生',type:'辅材',amount:'20g'},
+ {trace:'NC-PROC-GLJ-20260415-01',name:'干辣椒',type:'调料',amount:'5g'}
+ ],
+ '清蒸鱼':[
+ {trace:'NC-PROC-CYU-20260415-01',name:'草鱼',type:'主材',amount:'100g'},
+ {trace:'NC-PROC-JPN-20260415-01',name:'姜片',type:'调料',amount:'适量'}
+ ],
+ '红烧排骨':[
+ {trace:'NC-PROC-ZPG-20260415-01',name:'猪排骨',type:'主材',amount:'200g'},
+ {trace:'NC-PROC-JYO-20260415-01',name:'酱油',type:'调料',amount:'15ml'}
+ ]
+};
+// 餐品净菜包对应的包装批次号
+var dishBatch={
+ '宫保鸡丁':'BATCH-DH-20260415-01',
+ '清蒸鱼':'BATCH-DH-20260415-02',
+ '红烧排骨':'BATCH-DH-20260415-03'
+};
+// 净菜包溯源码映射
+var traceMap={
+ '菠菜':'NC-INT-BOCA-20260422-01',
+ '猪排骨':'NC-INT-ZLRJ-20260422-01',
+ '土豆(土豆丝)':'NC-INT-TDSI-20260422-01',
+ '西兰花':'NC-INT-XLHU-20260422-01'
+};
+// 净菜包对应的包装批次号
+var ncBatch={
+ '菠菜':'BATCH-NC-20260422-01',
+ '猪排骨':'BATCH-NC-20260422-02',
+ '土豆(土豆丝)':'BATCH-NC-20260422-03',
+ '西兰花':'BATCH-NC-20260422-04'
+};
+
+/* ========== 详情抽屉(定制化渲染) ========== */
function showDetail(el){
var tr=el.closest('tr');
var tds=tr.querySelectorAll('td');
- var ths=document.querySelectorAll('thead th');
- // 获取订单号(第一列)
+ /* 列序:0订单号 1净菜类型 2净菜/餐品 3包装规格 4需求份数 5需求计量 6订单状态 7申领时间 8预定配送时间 9创建人 */
var orderNo=tds[0].textContent;
- // 构建字段数据(排除最后的操作列)
- var fields='';
- for(var i=0;i'+ths[i].textContent+'
'+tds[i].innerHTML+'
';
+ var typeHtml=tds[1].innerHTML;
+ var typeText=tds[1].textContent.trim();
+ var foodName=tds[2].textContent;
+ var spec=tds[3].textContent;
+ var qty=tds[4].textContent;
+ var weight=tds[5].textContent;
+ var statusHtml=tds[6].innerHTML;
+ var claimTime=tds[7].textContent;
+ var deliverTime=tds[8].textContent;
+ var creator=tds[9].textContent;
+
+ var isCp=typeText.indexOf('餐品')>=0;
+
+ // 基础信息区
+ var html='订单信息
';
+ html+='
';
+ html+='
';
+ html+='
';
+
+ // 根据类型显示不同字段
+ if(!isCp){
+ // 净菜包 → 显示溯源码 + 包装批次号
+ html+='
溯源码
'+(traceMap[foodName]||'—')+'
';
+ html+='
包装批次号
'+(ncBatch[foodName]||'—')+'
';
+ } else {
+ // 餐品净菜包 → 显示包装批次号
+ html+='
包装批次号
'+(dishBatch[foodName]||'—')+'
';
}
- var html='
'
+
+ html+='
';
+ html+='
';
+ html+='
';
+ html+='
';
+ html+='
';
+ html+='
';
+ html+='
';
+ html+='
';
+
+ // 餐品净菜包 → 追加净菜包明细表格
+ if(isCp){
+ var ings=dishIngredients[foodName]||[];
+ var tagCls={'主材':'tag-blue','辅材':'tag-green','调料':'tag-orange'};
+ html+='
净菜包明细
';
+ html+='
| 食材溯源码 | 食材名称 | 分类 | 每份用量 |
';
+ if(ings.length>0){
+ ings.forEach(function(i){
+ html+='| '+i.trace+' | '+i.name+' | '+i.type+' | '+i.amount+' |
';
+ });
+ } else {
+ html+='| 暂无明细数据 |
';
+ }
+ html+='
';
+ }
+
+ // 渲染抽屉
+ var drawerHtml='
'
+'
'
+''
- +'
'
+ +'
'+html+'
'
+'
';
- document.body.insertAdjacentHTML('beforeend',html);
+ document.body.insertAdjacentHTML('beforeend',drawerHtml);
}