feat:数据质量筛选规则需求整理

This commit is contained in:
fengpu
2026-07-29 10:00:22 +08:00
parent 2a1e15d928
commit 3159df1bf5
9 changed files with 2266 additions and 8 deletions
@@ -1,8 +1,8 @@
# 营养管理功能说明书
> 文档版本:v2.0 | 更新日期:2026-07-15
> 文档版本:v2.1 | 更新日期:2026-07-27
> 本说明书基于 `web-admin/nutrition/` 后台原型与 `other-module/mini-program/nutrition/` 小程序原型重新梳理,描述营养管理版块的功能清单与业务概况。各页面的逐页调整明细见同目录《原型调整记录.md》。
> 本说明书基于 `web-admin/nutrition/` 后台原型与 `other-module/mini-program/nutrition/` 小程序原型重新梳理,描述营养管理版块的功能清单与业务概况。硬件终端设备原型参见 `other-module/canteen-device/`。各页面的逐页调整明细见同目录《原型调整记录.md》。
---
@@ -667,3 +667,83 @@ flowchart LR
| 双端协同 | B 端精细化管理 + C 端便捷化服务,数据实时互通 |
| 边缘云端协同 | 食堂边缘节点缓存中转,终端设备断网可用;数据下发/上报任务化追踪;异常告警集中处置 |
| 多终端设备生态 | 餐线营养秤、净菜包装秤、净菜组配秤、毛菜验收秤、加工毛菜秤等专用终端设备覆盖生产全流程 |
---
## 七、硬件设备生态
### 7.1 硬件设备清单与后台功能映射
> 下表按业务域分组列出全部硬件终端设备,说明其核心硬件组件、关联后台模块及在业务链路中的上下游关系。
> 关联后台模块名称对应本文第五章「模块功能概要说明」中的各模块。
#### 7.1.1 卫生供应域(8 款)
| 序号 | 设备名称 | 研发状态 | 核心硬件组件 | 关联后台模块 | 上游业务 | 下游业务 |
|------|---------|---------|-------------|-------------|---------|---------|
| 1 | 毛菜卫检设备 | 待硬件选型 | 农残/重金属/微生物检测传感器 | 卫生供应 | 绿色种采(采供管理→毛菜入库) | 卫生供应(卫生检测→仓储管理) |
| 2 | 毛菜验收秤 | 已设计 | 称重传感器、食材识别摄像头、人脸识别摄像头、场景监控摄像头 | 卫生供应、绿色种采 | 绿色种采(采供管理、供商管理) | 卫生供应(毛菜入库、卫生检测) |
| 3 | 毛菜库存柜 | 无需设计 | 温湿度传感器、库存货架 | 卫生供应 | 卫生供应(毛菜入库、卫生检测) | 卫生供应(净菜加工出库) |
| 4 | 加工毛菜秤 | 已设计 | 称重传感器、AI识别摄像头、人脸识别摄像头 | 卫生供应 | 卫生供应(仓储管理→出库领料) | 卫生供应(净菜加工→净菜入库) |
| 5 | 净菜加工秤 | 已设计 | 称重传感器、AI识别摄像头、人脸识别摄像头 | 卫生供应 | 卫生供应(仓储管理→毛菜出库) | 卫生供应(净菜入库、净菜包装) |
| 6 | 净菜库存柜 | 无需设计 | 温湿度传感器、库存货架 | 卫生供应 | 卫生供应(净菜加工→净菜入库) | 卫生供应(净菜包装)、健康生产(净菜下单→配菜组合) |
| 7 | 净菜组配秤 | 已设计 | 称重传感器(主辅材+调料双区)、食材识别摄像头、人脸识别摄像头 | 卫生供应、健康生产 | 卫生供应(净菜包装出库)、健康生产(净菜下单) | 卫生供应(净菜包装→内供/外售)、健康生产(配菜组合→烹饪加工) |
| 8 | 净菜包装贴标秤 | 已设计 | 称重传感器、标签打印机、食材识别摄像头、人脸识别摄像头 | 卫生供应、健康生产 | 卫生供应(净菜组配)、健康生产(配菜组合) | 卫生供应(净菜内供配送、净菜外售发货) |
#### 7.1.2 健康生产域(4 款)
| 序号 | 设备名称 | 研发状态 | 核心硬件组件 | 关联后台模块 | 上游业务 | 下游业务 |
|------|---------|---------|-------------|-------------|---------|---------|
| 9 | 食安监控设备 | 待硬件选型 | 视频监控摄像头、温湿度传感器、烟感/燃气传感器 | 健康生产、异常事件 | 健康生产(烹饪加工、出餐管理) | 健康生产(日常质检)、异常事件(异常告警) |
| 10 | 水电气计量表 | 无需设计 | 水表/电表/燃气表传感器 | 健康生产 | 健康生产(烹饪加工→能耗消耗) | 健康生产(加工统计→成本核算、日常质检→能耗检查) |
| 11 | 净菜厨房柜 | 无需设计 | 温湿度传感器、冷藏/保鲜模块 | 健康生产 | 卫生供应(净菜内供→配送收货) | 健康生产(配菜组合→领料出柜、烹饪加工) |
| 12 | 加工提示屏 | 无需设计 | 显示屏 | 健康生产 | 健康生产(配菜组合→烹制任务下发) | 健康生产(烹饪加工→操作指引展示) |
#### 7.1.3 营养用餐域(7 款)
| 序号 | 设备名称 | 研发状态 | 核心硬件组件 | 关联后台模块 | 上游业务 | 下游业务 |
|------|---------|---------|-------------|-------------|---------|---------|
| 13 | 营养检测设备 | 待硬件选型 | 近红外光谱/图像分析传感器 | 营养用餐、健康生产 | 营养用餐(菜品总库→餐品档案)、健康生产(烹饪加工→出品) | 健康生产(营养质检→四维检测)、营养用餐(营养数据→摄入统计) |
| 14 | 吐盘机 | 无需设计 | 餐盘自动分配机构 | 营养用餐 | 营养用餐(餐线管理→餐线配置) | 营养用餐(排队取餐→自助取盘、取餐管理→回盘核销) |
| 15 | 餐线充值屏 | 待产品设计 | 触摸屏、IC卡/NFC读卡器 | 营养用餐 | 营养用餐(用户管理→账户体系) | 营养用餐(消费数据→扣款流水)、小程序(我的余额→账户同步) |
| 16 | 营养秤 | 已设计 | 称重传感器、AI菜品识别摄像头、人脸识别摄像头 | 营养用餐、健康生产 | 营养用餐(菜品总库、食谱管理)、健康生产(食谱排期→当日菜单) | 营养用餐(取餐管理→核销记录、营养数据→摄入统计)、档案(员工营养数据) |
| 17 | 档口营养秤 | 已设计 | 称重传感器、AI菜品识别摄像头、人脸识别摄像头 | 营养用餐 | 营养用餐(菜品总库→菜品信息、食谱管理→当日食谱) | 营养用餐(点餐订单→下单、营养数据→营养素计算)、档案(员工营养数据) |
| 18 | 结算设备 | 无需设计 | 触摸屏、IC卡/NFC/二维码读卡器 | 营养用餐 | 营养用餐(取餐管理→取餐核销、点餐订单→订单确认) | 营养用餐(消费数据→支付流水)、小程序(我的订单→记录、我的余额→扣款) |
| 19 | 营养得分屏 | 无需设计 | 显示屏 | 营养用餐、档案管理 | 营养用餐(营养数据→摄入分析)、档案(员工营养数据→历史趋势) | 小程序(健康档案→数据同步、AI营养咨询→建议依据) |
### 7.2 设备与业务链路对照
下图为四条业务主线上各硬件设备的部署位置,展示设备在"从田间到餐桌"全链路中的节点角色。
```
食材供应链(田间→仓库)
土地环境 → 种养殖监控 → 收成入库 → 采供管理 → 供商管理
毛菜验收秤 ②
毛菜入库
食材加工链(仓库→厨房) 毛菜卫检设备 ①
毛菜入库 → 卫生检测 → 仓储管理 → 净菜加工 → 净菜入库 → 净菜包装 → 内供/外售
↑ ↑ ↑ ↑ ↑ ↑ ↑
毛菜库存柜 ③ 毛菜卫检 毛菜库存柜 加工毛菜秤 ④ 净菜库存柜 ⑥ 净菜包装 净菜组配秤 ⑦
净菜加工秤 ⑤ 贴标秤 ⑧ 净菜包装贴标秤 ⑧
配餐生产链(厨房→餐桌)
食谱排期 → 净菜下单 → 配菜组合 → 烹饪加工 → 出餐管理 → 余量处理
↑ ↑
净菜厨房柜 ⑪ 加工提示屏 ⑫
净菜组配秤 ⑦ 食安监控设备 ⑨
水电气计量表 ⑩
员工服务链(餐桌→健康)
浏览食谱 → 在线订餐 → 取餐核销 → 营养分析 → 健康档案 → AI 咨询
↑ ↑ ↑ ↑
档口营养秤 ⑰ 档口营养秤 营养秤 ⑯ 营养得分屏 ⑲
结算设备 ⑱ 吐盘机 ⑭ 营养检测设备 ⑬
结算设备 ⑱
餐线充值屏 ⑮
```
> 图中编号对应 7.1 节硬件清单中的序号。同一设备可能横跨多个业务链环节(如净菜组配秤同时服务于食材加工链和配餐生产链)。
@@ -0,0 +1,386 @@
# 营养管理——规格管理体系分析与设计方案
> 撰写日期:2026-07-24 | 状态:**待评审**
---
## 一、背景
营养管理从餐品总库、食物成分到后续的各个订单业务、采购、验收、入库等环节中都涉及"规格"概念,但目前:
- 规格没有统一维护入口
- 各业务环节之间规格如何转换完全没有考虑
- 同一概念在不同页面用不同数据格式表达,非常混乱
本文档对 10 个业务环节中"规格"的现状进行完整梳理,并给出统一设计方案。
---
## 二、全景总览:一个"规格",十种表达
```
采购环节 加工/包装环节 消费/生产环节
─────── ──────────── ────────────
farm-purchase sup-in-cleanin prod-clean-order
spec: "25kg/件" (自由文本) 入库规格: "袋装/500g" (下拉) specGram: 500 (自由输入)
净菜类型: "丁(1.5cm)" (联动下拉) specLabel: "500g/袋"
raw-veg-inspection-scale sup-in-raw sup-clean-external
采购规格: "斤" (14种下拉) 入库规格: "25kg/件" (7种下拉) spec: "5kg/箱" (自由输入+下拉)
实收规格: "斤" (14种下拉)
sup-pkg-label sup-clean-internal
din-dish-all 净菜包: 500 (纯数字输入) spec: "500g/袋" (自由输入+下拉)
specs: [{name:'标准份', 餐品包: "标准份(500g)" (下拉)
weight:200, price:12}] prod-proc-combo
餐品规格: "标准份(300g)" (硬编码下拉)
din-ingredient
vegTypes: [{name:'肉丁', prod-proc-cook
yieldRate:'92'}] 餐品规格: "标准份(300g)" (只读)
(此处的 vegTypes 实际是净菜类型)
prod-proc-cabinet
包装规格: "5kg/袋" (从订单回显)
```
**问题本质**:缺少一个统一的规格主数据中心,导致:
1. 同一概念(如"包装规格")在 6 个页面中以 6 种不同方式表达
2. 不同层级规格之间(采购→净菜→餐品)完全没有转换规则
3. 每个页面各自维护一套下拉选项,互不同步
---
## 三、各环节规格现状详析
### 3.1 餐品总库 `din-dish-all.html`——规格的定义源头(但只覆盖餐品层)
```javascript
// 每个餐品对象内嵌 specs 数组
specs: [
{ name:'标准份', weight:200, price:12, cleanPrice:9, cleanSale:false, isDefault:true },
{ name:'小份', weight:120, price:8, cleanPrice:6, cleanSale:false },
{ name:'大份', weight:300, price:18, cleanPrice:13, cleanSale:false }
]
```
- 规格名称枚举:`标准份` / `小份` / `大份` / `迷你份` / `加大份`(在 `din-dish-add.html` 的下拉中定义)
- 关键字段:name(份型名称)、weight(成品重量g)、price(餐品售价)、cleanPrice(净菜包售价)、cleanSale(是否外售上架)
- **问题**:组配/烹制等下游环节使用另一套硬编码的规格下拉,与总库中定义的不联动
### 3.2 食物成分库 `din-ingredient.html`——食材级"规格"
```javascript
// vegTypes 实际表达的是"净菜类型"而非规格
vegTypes: [
{ name:'肉片', yieldRate:'95' }, // 猪里脊可加工为肉片,出净率95%
{ name:'肉丁', yieldRate:'92' }, // 可加工为肉丁,出净率92%
{ name:'肉块', yieldRate:'97' } // 可加工为肉块,出净率97%
]
```
- 这里的"规格"实际上是**净菜加工类型 + 出净率**
- **问题**:出净率数据存在食材库中,但采购→净菜入库的换算从未使用出净率;净菜类型字典散落在 3-4 个页面中重复定义(`cleanFoodTypeOptions``cleanTypeMap` 等)
### 3.3 采供管理 `farm-purchase.html`
```
采购明细子表:溯源码 | 食材名称 | 食材分类 | 采购数量 | 规格 | 单价 | 小计
规格取值(自由文本输入,无约束):
蔬菜/水产 → "散装(kg)"
肉类 → "25kg/件"
粮油 → "5L/桶" / "20kg/箱"
```
- **问题**:完全自由文本,既不下拉也不关联食材目录。采购写了 "25kg/件",到毛菜入库环节还得重新选
### 3.4 毛菜验收秤 `01-verify-inspection.html`
```
表格8列:食材 | 采购规格 | 采购量 | 采购单价 | 应付金额 | 实收规格 | 实收量 | 操作
食材目录(20种可称重食材): { price:3.5, unit:'斤' }
调料目录(8种按规格验收): { price:12, unit:'瓶', spec:'500ml/瓶' }
UNIT_OPTIONS = ['斤','公斤','克','千克','袋','瓶','箱','桶','罐','份','个','只','条','把']
```
- 采购规格 = 14 种单位下拉,默认取食材目录的 unit
- 实收规格 = 同上,默认跟随采购规格但可修改
- **核心差异**:调料类走"规格验收"(不能称重,直接点收数量),食材类走"称重验收"
- **问题**`UNIT_OPTIONS` 混在一起的东西太多——有重量单位(斤/公斤/克/千克)、容器单位(袋/瓶/箱/桶/罐)、计数单位(份/个/只/条/把),语义完全不同
### 3.5 毛菜入库 `sup-in-raw.html`
```
入库规格下拉(7个固定选项):
25kg/件 | 20kg/箱 | 15kg/箱 | 10kg/筐 | 5kg/袋 | 1kg/包 | 散装(kg)
```
- **问题**:固定下拉与采购规格不联动,采购中选的 "25kg/件" 在这里要重新选一遍
### 3.6 净菜入库 `sup-in-cleanin.html`
```
入库规格下拉:袋装/500g | 袋装/400g | 盒装/300g | 散装/整棵 | 其他
食材→净菜类型联动:
土豆 → [土豆丝, 土豆块, 土豆泥]
猪里脊 → [丁(1.5cm), 丝(0.8cm), 片(2mm)]
西兰花 → [小朵, 西兰花段, 西兰花梗]
```
- 两层选择:先选食材→联动净菜类型→再选入库规格(袋/盒/散装+克数组合)
- **问题**:食材→净菜类型的映射(`cleanFoodTypeOptions`)在本页面独立维护,与 `din-ingredient.html` 中的 `vegTypes` 不联动
### 3.7 净菜订单 `prod-clean-order.html`
```
nc模式(净菜包): 食材 | 净菜名称 | 包装规格(g) | 份数 | 计量(kg)
cp模式(餐品包): 餐品名称 | 包装规格 | 份数 | 计量(kg)
nc: 包装规格 = 自由输入整数克数 → specLabel = "500g/袋"(自动拼接)
cp: 包装规格 = 从 cpSpecOptions 下拉选择 → specLabel = "标准份(500g)"
重量公式: weight = specGram × qty / 1000
```
```javascript
// 硬编码的餐品规格选项(与餐品总库中的 specs 不联动)
cpSpecOptions = {
'宫保鸡丁': [{label:'标准份(500g', grams:500}, {label:'加量份(750g', grams:750}],
'清蒸鱼': [{label:'标准份(600g', grams:600}, {label:'大份(900g', grams:900}],
...
}
```
- **问题**:nc 模式的规格自由输入整数,可能出现 499g、501g 等非标准包装;cp 模式的选项硬编码,总库改了这里不会同步
### 3.8 外售/内供 `sup-clean-external.html` / `sup-clean-internal.html`
与净菜订单结构相同(nc/cp 两套模式),但 Mock 数据规格格式不同:
| 环节 | nc 规格示例 | cp 规格示例 |
|------|------------|------------|
| 外售 | `5kg/箱`, `1kg/箱` | `标准份(500g)` |
| 内供 | `500g/袋`, `2kg/盘` | `标准份(500g)` |
- **问题**:外售用 `箱`,内供用 `袋/盘`,包装容器类型没有统一约束
### 3.9 净菜组配 + 按单烹制 `prod-proc-combo.html` / `prod-proc-cook.html`
```
组配: 餐品规格下拉 → 小份(200g) | 标准份(300g) | 大份(500g)【硬编码】
烹制: 餐品规格只读显示 + 生重(kg)/熟重(kg)/生熟比
```
```javascript
// 组配中每份餐品的食材配方(重量以克为单位)
recipeData = {
'宫保鸡丁': [
{trace:'NC-PROC-JXR-...', name:'鸡胸肉', type:'主材', amount:120, unit:'g'},
{trace:'NC-PROC-HUS-...', name:'花生米', type:'辅材', amount:30, unit:'g'},
...
]
}
```
- **问题**:规格下拉选项 "小份(200g)/标准份(300g)/大份(500g)" 与餐品总库中定义的 specs(标准份=200g, 小份=120g, 大份=300g)完全不一致
### 3.10 净菜进柜 `prod-proc-cabinet.html`
- 规格从订单数据回显,不独立编辑
- 跟踪 "初始重量(kg)" 和 "当前余量(kg)",规格只作为辅助标识
---
## 四、加工规格的额外维度
在净菜配比秤设置页 `clean-veg-ratio-scale/03-settings.html` 中:
```
丝条粗细 → 丝条规格的标准粗细
滚刀块大小 → 滚刀块规格的标准大小
方丁大小 → 方丁规格的标准大小
```
这些与净菜类型中的 "丁(1.5cm)"、"丝(0.8cm)" 概念重复但未统一。
---
## 五、核心问题总结
| # | 问题 | 严重程度 | 涉及页面数 |
|---|------|---------|-----------|
| 1 | **采购规格自由文本,无约束无联动**——下游入库要重选 | 🔴 高 | 3 |
| 2 | **餐品总库定义了 specs,但组配/烹制用另一套硬编码下拉** | 🔴 高 | 3 |
| 3 | **包装容器类型(袋/盒/箱/盘/筐/桶/瓶)散落各处,无统一枚举** | 🔴 高 | 6 |
| 4 | **食材→净菜类型映射在 3+ 页面重复定义,互不同步** | 🟡 中 | 4 |
| 5 | **采购→净菜→餐品三级规格之间没有任何转换规则** | 🔴 高 | 全部 |
| 6 | **加工规格(切配参数)与净菜类型概念重复** | 🟡 中 | 2 |
| 7 | **单位混用:重量单位、容器单位、计数单位混在一起** | 🟡 中 | 2 |
---
## 六、设计方案:四级规格主数据体系
### 6.1 架构总览
```
┌─────────────────────────────────────────────────────────────────┐
│ 规格主数据(统一维护入口) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ L1 采购规格 L2 净菜加工规格 L3 净菜包装规格 │
│ ────────── ────────────── ────────────── │
│ 采购单位 + 包装量 净菜类型 + 切配参数 容器类型 + 净含量 │
│ 例: 25kg/件 例: 丁(1.5cm) 例: 袋装/500g │
│ 散装(kg) 丝(0.8cm) 盒装/300g │
│ 5L/桶 片(2mm) 箱装/5kg │
│ │
│ L4 餐品规格 │
│ ────────── │
│ 份型 + 成品重量(g) │
│ 例: 标准份(300g) │
│ 大份(500g) │
│ │
│ 转换链: L1 ──(出净率)──→ L2 ──(包装组合)──→ L3 ──(配方)──→ L4 │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 6.2 各级规格数据模型
#### L1 — 采购规格(在食材目录中维护)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `purchaseUnit` | enum | 采购计量单位 | `kg`, `件`, `斤`, `L` |
| `packSize` | number | 单件包装量 | `25`25kg/件) |
| `specLabel` | string | 规格标签(自动生成) | `25kg/件`, `散装(kg)` |
| `allowLoose` | bool | 是否允许散装采购 | true/false |
| `isWeightBased` | bool | 是否按重量验收(否则按规格验收) | true=称重, false=点收 |
#### L2 — 净菜加工规格(在食材目录中维护)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `cleanTypeName` | string | 净菜类型名称 | `丁`, `丝`, `片`, `块`, `段` |
| `cutParam` | string | 切配参数 | `1.5cm`, `0.8cm`, `2mm` |
| `yieldRate` | number | 出净率(%) | `92` |
| `displayName` | string | 完整显示名(自动生成) | `丁(1.5cm)` |
#### L3 — 净菜包装规格(独立字典)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `containerType` | enum | 包装容器类型 | `袋`, `盒`, `箱`, `盘`, `筐`, `桶` |
| `netWeight` | number | 净含量(g) | `500`, `300`, `5000` |
| `specLabel` | string | 规格标签(自动生成) | `袋装/500g` |
#### L4 — 餐品规格(在餐品总库中维护,现有结构基本正确)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `specName` | string | 份型名称 | `标准份`, `大份`, `小份` |
| `finishedWeight` | number | 成品重量(g) | `300` |
| `price` | number | 餐品售价(元) | `12` |
| `cleanPrice` | number | 净菜包售价(元) | `9` |
### 6.3 规格转换规则
```
采购规格(L1) → 净菜加工规格(L2):
净料重量 = 采购量 × 出净率(来自食材目录 vegTypes.yieldRate)
例:25kg/件 猪里脊 → 切肉丁(出净率92%) → 净料 = 25 × 0.92 = 23kg
净菜加工规格(L2) → 净菜包装规格(L3):
可包装份数 = 净料重量(g) ÷ 包装规格净含量(g)
例:23kg = 23000g → 袋装/500g → 可包 23000 ÷ 500 = 46 袋
净菜包装规格(L3) → 餐品规格(L4):
可产出份数 = (袋数 × 净含量) ÷ 单品食材用量
例:46袋 × 500g/袋 ÷ 120g(宫保鸡丁每份需肉丁量) ≈ 191 份
```
### 6.4 规格字典管理页面(新增)
建议在营养管理后台新增"规格字典"维护入口:
```
┌─ 规格字典管理 ──────────────────────────────────────┐
│ │
│ Tab: [包装容器] [切配类型] [份型] [包装规格组合] │
│ │
│ ▸ 包装容器字典(L3 基础) │
│ 袋 | 盒 | 箱 | 盘 | 筐 | 桶 | 瓶 | 罐 │
│ │
│ ▸ 切配类型字典(L2 基础) │
│ 丁 | 丝 | 片 | 块 | 段 | 末 | 泥 | 条 │
│ └─ 可配置默认切配参数(丁→1.5cm, 丝→0.8cm, ...
│ │
│ ▸ 份型字典(L4 基础) │
│ 标准份 | 小份 | 大份 | 迷你份 | 加大份 │
│ │
│ ▸ 包装规格组合(L3 = 容器 × 净含量) │
│ 袋装/500g, 袋装/1000g, 盒装/300g, 箱装/5kg, ... │
│ │
│ ▸ 食材-净菜类型关联(在食材基础档案中维护,L1→L2) │
│ 猪里脊 → 肉丁(1.5cm/出净率92%) │
│ 肉丝(0.8cm/出净率95%) │
│ 肉片(2mm/出净率97%) │
└──────────────────────────────────────────────────────┘
```
### 6.5 各环节改造对照表
| 环节 | 当前做法 | 改造后 |
|------|---------|--------|
| **食材目录** `din-ingredient` | vegTypes 表达净菜类型 | 增加 L1 采购规格字段 + L2 净菜类型(含切配参数、出净率) |
| **餐品总库** `din-dish-all` | specs 基本正确 | 规格名称从份型字典读取,保持现有数据模型 |
| **采供管理** `farm-purchase` | 规格自由文本 | 从食材目录 L1 自动带出,不可自由输入 |
| **毛菜验收秤** | 14种单位混用 | 采购规格从订单 L1 带出;实收规格默认跟随,允许修正;区分重量/容器/计数三类单位 |
| **毛菜入库** `sup-in-raw` | 7种固定下拉 | 从采购订单继承 L1,无需重选 |
| **净菜入库** `sup-in-cleanin` | 净菜类型+入库规格分开选 | 从 L2+L3 字典联动选择 |
| **净菜订单** `prod-clean-order` | nc 自由输克数 / cp 硬编码下拉 | nc 从 L3 包装规格字典选择;cp 从餐品总库 L4 动态拉取 |
| **外售/内供** | nc 自由输克数 | 同上,从 L3 选择 |
| **净菜组配** `prod-proc-combo` | 硬编码规格下拉 | 从餐品总库 L4 动态拉取 |
| **按单烹制** `prod-proc-cook` | 规格只读 + 硬编码 | 规格从 L4 带出,生熟比关联 L2 出净率 |
| **包装标签** `sup-pkg-label` | 纯数字输入 | 从 L3 选择 |
| **加工秤设置** `clean-veg-ratio-scale/03-settings` | 丝条/滚刀块/方丁独立配置 | 从 L2 切配参数字典读取,作为默认值可覆盖 |
---
## 七、需要新增/修改的文件
### 新增
| 文件 | 说明 |
|------|------|
| `web-admin/nutrition/din-dict-spec.html` | 规格字典管理页面(容器/切配/份型/组合) |
### 修改
| 文件 | 改造内容 |
|------|---------|
| `web-admin/nutrition/din-ingredient.html` | 增加 L1 采购规格字段、L2 净菜类型(含切配参数+出净率) |
| `web-admin/nutrition/din-dish-all.html` | 规格名称从份型字典读取 |
| `web-admin/nutrition/din-dish-add.html` | 规格名称下拉从份型字典读取 |
| `web-admin/nutrition/farm-purchase.html` | 规格从自由文本改为 L1 自动带出 |
| `web-admin/nutrition/sup-in-raw.html` | 入库规格从采购订单继承 L1 |
| `web-admin/nutrition/sup-in-cleanin.html` | 联动 L2+L3 字典 |
| `web-admin/nutrition/prod-clean-order.html` | nc 从 L3 选 / cp 从 L4 拉取 |
| `web-admin/nutrition/sup-clean-external.html` | nc 从 L3 选 / cp 从 L4 拉取 |
| `web-admin/nutrition/sup-clean-internal.html` | nc 从 L3 选 / cp 从 L4 拉取 |
| `web-admin/nutrition/sup-pkg-label.html` | 包装规格从 L3 选择 |
| `web-admin/nutrition/prod-proc-combo.html` | 餐品规格从 L4 动态拉取 |
| `web-admin/nutrition/prod-proc-cook.html` | 餐品规格从 L4 动态拉取 |
| `other-module/canteen-device/raw-veg-inspection-scale/01-verify-inspection.html` | 单位下拉分类重构 |
| `other-module/canteen-device/clean-veg-ratio-scale/03-settings.html` | 加工参数从 L2 读取 |
---
## 八、待讨论事项
1. **规格字典管理页面放在哪个菜单下?** —— 建议放在"营养用餐 > 字典管理"下的子页面,或新建 "基础数据 > 规格字典"
2. **历史数据兼容?** —— 如果已有真实生产数据,规格升级需要迁移脚本
3. **L1 采购规格的单位细分** —— 当前 14 种混用的 UNIT_OPTIONS 拆分后,是单独建表还是用标签分类?
4. **转换规则的计算精度** —— 出净率% → 净料重量 → 可包装份数 → 可产出份数,这条链上每一步的取整规则(向上/向下/四舍五入)需要明确