@@ -432,8 +433,8 @@ function formatCutSpecNoShape(cut){
// 食物数据(对齐 yx_mater_base_material 表结构)
const FOODS = [
{name:'粳米(生)',code:'0101001',alias:'大米',firstClass:'谷薯类',secondClass:'稻米',icon:'🌾',edible:'100',waterRate:'13.3',dataSource:0,basePrice:'3.5',vegTypes:[
- {groupId:'g1',alias:'普洗组',specAlias:'洗净米',yieldRate:'97',cutSpec:{shape:'原状'}},
- {groupId:'g1',alias:'普洗组',specAlias:'免淘米',yieldRate:'95',cutSpec:{shape:'原状'}}
+ {groupId:'g1',alias:'普洗组',specAlias:'洗净米',yieldRate:'97',edibleRate:'100',cutSpec:{shape:'原状'}},
+ {groupId:'g1',alias:'普洗组',specAlias:'免淘米',yieldRate:'95',edibleRate:'100',cutSpec:{shape:'原状'}}
],
nutri:{calorie:346,protein:7.4,fat:0.8,carbohydrate:77.2,dietary_fiber:0.6,
vitamin_a:0,vitamin_b1:0.16,vitamin_b2:0.08,vitamin_b6:0.16,vitamin_b12:0,vitamin_c:0,vitamin_d:0,vitamin_e:0.46,vitamin_k:0,niacin:1.9,folic_acid:3.8,biotin:0,pantothenic_acid:0.6,total_choline:0,
@@ -452,10 +453,10 @@ const FOODS = [
{type:'编辑',title:'修订色泽描述',time:'2026-07-21 11:05',user:'李建国',role:'营养师',dept:'营养管理部',summary:'色泽描述语义化,补充感官评级。',changes:[{field:'色泽描述',old:'乳白色,半透明',new:'乳白色,半透明,颗粒饱满'},{field:'感官评级',old:'—',new:'优'}]}
]},
{name:'猪里脊肉',code:'0201001',alias:'里脊',firstClass:'畜禽肉类',secondClass:'猪肉',icon:'🥩',edible:'100',waterRate:'71.4',dataSource:0,basePrice:'18.8',vegTypes:[
- {groupId:'g1',alias:'里脊肉丝',specAlias:'细丝',yieldRate:'92',cutSpec:{shape:'丝',length:10,width:1,height:1,technique:'平刀'}},
- {groupId:'g1',alias:'里脊肉丝',specAlias:'粗丝',yieldRate:'90',cutSpec:{shape:'丝',length:10,width:2,height:2,technique:'直刀'}},
- {groupId:'g2',alias:'里脊肉片',specAlias:'薄片',yieldRate:'95',cutSpec:{shape:'片',length:3,width:1,height:5,technique:'平刀'}},
- {groupId:'g3',alias:'里脊肉块',specAlias:'方块',yieldRate:'92',cutSpec:{shape:'块',length:20,width:20,height:20,technique:'直刀'}}
+ {groupId:'g1',alias:'里脊肉丝',specAlias:'细丝',yieldRate:'92',edibleRate:'100',cutSpec:{shape:'丝',length:10,width:1,height:1,technique:'平刀'}},
+ {groupId:'g1',alias:'里脊肉丝',specAlias:'粗丝',yieldRate:'90',edibleRate:'100',cutSpec:{shape:'丝',length:10,width:2,height:2,technique:'直刀'}},
+ {groupId:'g2',alias:'里脊肉片',specAlias:'薄片',yieldRate:'95',edibleRate:'100',cutSpec:{shape:'片',length:3,width:1,height:5,technique:'平刀'}},
+ {groupId:'g3',alias:'里脊肉块',specAlias:'方块',yieldRate:'92',edibleRate:'100',cutSpec:{shape:'块',length:20,width:20,height:20,technique:'直刀'}}
],
nutri:{calorie:155,protein:20.2,fat:7.9,carbohydrate:0.7,dietary_fiber:0,
vitamin_a:6,vitamin_b1:0.54,vitamin_b2:0.1,vitamin_b6:0.33,vitamin_b12:0.6,vitamin_c:0,vitamin_d:0,vitamin_e:0.34,vitamin_k:0,niacin:5.3,folic_acid:3,biotin:0,pantothenic_acid:0.8,total_choline:0,
@@ -507,8 +508,8 @@ const FOODS = [
{type:'编辑',title:'补充碘含量',time:'2026-07-04 14:50',user:'王秀兰',role:'营养师',dept:'营养管理部',summary:'补充碘元素数据,完善矿物质维度。',changes:[{field:'碘',old:'—',new:'27.2 μg'}]}
]},
{name:'豆腐(北)',code:'0601001',alias:'北豆腐',firstClass:'豆及豆制品',secondClass:'豆制品',icon:'🧈',edible:'100',waterRate:'82.8',dataSource:1,basePrice:'5.0',vegTypes:[
- {groupId:'g1',alias:'块类组',specAlias:'大方块',yieldRate:'96',cutSpec:{shape:'块',length:30,width:30,height:20,technique:'直刀'}},
- {groupId:'g1',alias:'块类组',specAlias:'中方块',yieldRate:'98',cutSpec:{shape:'块',length:20,width:20,height:15,technique:'直刀'}}
+ {groupId:'g1',alias:'块类组',specAlias:'大方块',yieldRate:'96',edibleRate:'100',cutSpec:{shape:'块',length:30,width:30,height:20,technique:'直刀'}},
+ {groupId:'g1',alias:'块类组',specAlias:'中方块',yieldRate:'98',edibleRate:'100',cutSpec:{shape:'块',length:20,width:20,height:15,technique:'直刀'}}
],
nutri:{calorie:98,protein:12.2,fat:4.8,carbohydrate:1.5,dietary_fiber:0.4,
vitamin_a:0,vitamin_b1:0.07,vitamin_b2:0.04,vitamin_b6:0.05,vitamin_b12:0,vitamin_c:0,vitamin_d:0,vitamin_e:2.71,vitamin_k:0,niacin:0.1,folic_acid:37,biotin:0,pantothenic_acid:0.1,total_choline:0,
@@ -604,6 +605,8 @@ function renderBasicInfo(f){
var cutShape = cs.shape || '—';
var cutSpecTxt = formatCutSpecNoShape(item.cutSpec);
var specAlias = item.specAlias || '—';
+ /* 可食部为规格行级字段,随各规格独立维护 */
+ var edibleRate = (item.edibleRate!==undefined && item.edibleRate!=='') ? item.edibleRate+'%' : '—';
if(si===0){
rows += `
`;
rows += `| ${vegName} | `;
@@ -612,16 +615,18 @@ function renderBasicInfo(f){
rows += `${cutShape} | `;
rows += `${cutSpecTxt} | `;
rows += `${specAlias} | `;
+ rows += `${edibleRate} | `;
rows += `
`;
} else {
rows += `
`;
rows += `| ${cutSpecTxt} | `;
rows += `${specAlias} | `;
+ rows += `${edibleRate} | `;
rows += `
`;
}
});
});
- vegTypesValue = `
| 净菜标准名 | 净菜俗名 | 出净率 | 切配形状 | 切配规格 | 规格别名 |
${rows}
`;
+ vegTypesValue = `
| 净菜标准名 | 净菜俗名 | 出净率 | 切配形状 | 切配规格 | 规格别名 | 可食部(%) |
${rows}
`;
} else {
vegTypesValue = '—';
}
diff --git a/web-admin/nutrition/doc/CHANGELOG.md b/web-admin/nutrition/doc/CHANGELOG.md
index 5e626f7..21eb11e 100644
--- a/web-admin/nutrition/doc/CHANGELOG.md
+++ b/web-admin/nutrition/doc/CHANGELOG.md
@@ -1,5 +1,20 @@
# 营养用餐管理端 CHANGELOG
+## [2026-09-07] feat: 净菜类型拆分独立管理(新增净菜管理页 + 规格行级可食部字段)
+
+- `din-ingredient.html` 食物成分:
+ - 左侧列表操作区「食材分类管理」后新增「净菜管理」按钮,跳转新二级页
+ - 详情净菜类型表「规格别名」后新增「可食部(%)」列:规格行级字段,每个规格独立显示,不随组合并行合并
+- `din-ingredient-add.html` 新增/编辑食物:
+ - 净菜类型维护表「规格别名」后新增「可食部(%)」列,逐规格独立录入,新增规格行默认空值不继承
+- 新增 `din-clean-veg-mgmt.html` 净菜管理页:
+ - 统计卡片:净菜类型总数/覆盖食材数/切配规格总数/平均出净率
+ - 筛选区:食材名称(下拉搜索框,选中精确/手输模糊)、食材编码、净菜类型(命中净菜俗名/净菜标准名/规格俗名任一)、切配形状(不设食物分类筛选)
+ - 操作区:新增净菜 + 异步导出按钮组「导出列表数据」「查看导出任务」(样式对齐 farm-purchase 等列表页惯例,空结果不建任务)
+ - 分页列表:组级列(序号/食材/净菜标准名/净菜俗名/切配形状/出净率/操作)rowspan 合并;可食部(%)/规格别名/切配规格/刀工四列按规格逐行拆分(切配规格仅留尺寸、刀工独立成列),组内规格间虚线分隔、规格列组左侧纵向分隔线,组间实线
+ - 新增流程:先弹食材选择器(关键字搜索)→ 选定后回显该食材已有净菜类型 → 在其基础上新增或编辑;维护表结构对齐新增食物页(含行级可食部);支持按组删除(确认弹窗)
+- `index.html` SITE_MAP「营养用餐」新增「净菜管理」条目
+
## [2026-09-01] feat: 餐线营养秤四Tab分页 + 日期默认当天 + 人脸识别数据更名视频数据
- `din-terminal.html` 设备概览「餐线营养秤」: