From 39547a8bb64ba5c72e5c5301e3413371be712e4e Mon Sep 17 00:00:00 2001 From: fengpu <18691763612@163.com> Date: Mon, 14 Sep 2026 15:45:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A4=90=E5=93=81=E5=AE=9A=E4=BB=B7?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E6=8B=86=E5=88=86=E4=B8=BA=E9=A4=90=E5=93=81?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E4=B8=8E=E9=A4=90=E5=93=81=E5=87=80=E8=8F=9C?= =?UTF-8?q?=E5=8C=85=E8=A7=84=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- web-admin/nutrition/din-dish-add.html | 84 ++++++++++++++++++++------- web-admin/nutrition/din-dish-all.html | 30 +++++++--- web-admin/nutrition/din-dish-own.html | 24 +++++--- web-admin/nutrition/doc/CHANGELOG.md | 13 +++++ 4 files changed, 116 insertions(+), 35 deletions(-) diff --git a/web-admin/nutrition/din-dish-add.html b/web-admin/nutrition/din-dish-add.html index 36f3ca8..15896be 100644 --- a/web-admin/nutrition/din-dish-add.html +++ b/web-admin/nutrition/din-dish-add.html @@ -607,9 +607,16 @@ var STEP_HTML = [
📐 餐品规格
- + - + + +
规格(克重/份型)餐品售价(元/份)净菜包毛利率(%)净菜包售价(元/份)外售净菜包默认操作
规格(克重/份型)餐品售价(元/份)上架状态默认操作
+ 添加规格
+ 添加规格
+
🥬 餐品净菜包规格
+ + + +
规格(克重/份型)净菜包毛利率(%)净菜包售价(元/份)上架状态默认操作
+ 添加净菜包规格
`, @@ -733,10 +740,17 @@ function buildPortionOptions(selected){ return html; } function addSpecRow(addRow){ - if(document.querySelector('.spec-edit-row')) return; + if(document.querySelector('#specBody .spec-edit-row')) return; var tr=document.createElement('tr'); tr.className='spec-edit-row'; - tr.innerHTML='
下架
'; + tr.innerHTML='
下架
'; + addRow.parentNode.insertBefore(tr,addRow); +} +function addCleanSpecRow(addRow){ + if(document.querySelector('#cleanSpecBody .spec-edit-row')) return; + var tr=document.createElement('tr'); + tr.className='spec-edit-row'; + tr.innerHTML='
下架
'; addRow.parentNode.insertBefore(tr,addRow); } function confirmSpec(btn){ @@ -745,21 +759,35 @@ function confirmSpec(btn){ var gramInput=group.querySelector('input[type="number"]'); var sel=group.querySelector('select'); var priceInput=row.querySelectorAll('input[type="number"]')[1]; - var cleanMarginInput=row.querySelectorAll('input[type="number"]')[2]; - var cleanPriceInput=row.querySelectorAll('input[type="number"]')[3]; var portion=sel?sel.value:''; var gram=gramInput?gramInput.value.trim():''; var price=priceInput?priceInput.value.trim():''; - var cleanMargin=cleanMarginInput?cleanMarginInput.value.trim():''; - var cleanPrice=cleanPriceInput?cleanPriceInput.value.trim():''; if(!portion||portion==='请选择'||!gram||!price){alert('请填写完整信息');return;} - var cleanMarginText = cleanMargin ? parseFloat(cleanMargin).toFixed(1)+'%' : '—'; - var cleanPriceText = cleanPrice ? parseFloat(cleanPrice).toFixed(2) : '—'; var saleActive = !!row.querySelector('.sale-toggle.active'); var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; var specViewHtml='
'+parseFloat(gram)+'g/'+portion+'
'; row.className=''; - row.innerHTML=''+specViewHtml+''+parseFloat(price).toFixed(2)+''+cleanMarginText+''+cleanPriceText+''+saleHtml+'
默认
'; + row.innerHTML=''+specViewHtml+''+parseFloat(price).toFixed(2)+''+saleHtml+'
默认
'; +} +function confirmCleanSpec(btn){ + var row=btn.closest('tr'); + var group=row.querySelector('.spec-input-group'); + var gramInput=group.querySelector('input[type="number"]'); + var sel=group.querySelector('select'); + var cleanMarginInput=row.querySelectorAll('input[type="number"]')[1]; + var cleanPriceInput=row.querySelectorAll('input[type="number"]')[2]; + var portion=sel?sel.value:''; + var gram=gramInput?gramInput.value.trim():''; + var cleanMargin=cleanMarginInput?cleanMarginInput.value.trim():''; + var cleanPrice=cleanPriceInput?cleanPriceInput.value.trim():''; + if(!portion||portion==='请选择'||!gram||!cleanMargin||!cleanPrice){alert('请填写完整信息');return;} + var cleanMarginText = parseFloat(cleanMargin).toFixed(1)+'%'; + var cleanPriceText = parseFloat(cleanPrice).toFixed(2); + var saleActive = !!row.querySelector('.sale-toggle.active'); + var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; + var specViewHtml='
'+parseFloat(gram)+'g/'+portion+'
'; + row.className=''; + row.innerHTML=''+specViewHtml+''+cleanMarginText+''+cleanPriceText+''+saleHtml+'
默认
'; } function toggleCleanSale(el){ var active = el.classList.toggle('active'); @@ -1011,13 +1039,13 @@ function recalcAfterIngredientChange(){ } function cancelSpec(btn){btn.closest('tr').remove();} function toggleDefault(el){ - var tbody=document.getElementById('specBody'); + var tbody=el.closest('tbody'); if(tbody){tbody.querySelectorAll('.spec-toggle').forEach(function(t){t.classList.remove('active');});} el.classList.add('active'); } function removeSpec(btn){ - var row=btn.closest('tr');var wasDefault=row.querySelector('.spec-toggle.active');row.remove(); - if(wasDefault){var first=document.querySelector('#specBody tr:not(.spec-add-row):not(.spec-edit-row) .spec-toggle');if(first)first.classList.add('active');} + var row=btn.closest('tr');var tbody=row.closest('tbody');var wasDefault=row.querySelector('.spec-toggle.active');row.remove(); + if(wasDefault){var first=tbody.querySelector('tr:not(.spec-add-row):not(.spec-edit-row) .spec-toggle');if(first)first.classList.add('active');} } /* 食材清单数据:每个食材含 code + 多个净菜(netName 净菜形式,本身可含-分隔符) + 净菜规格别名(aliases 多规格时需先选净菜再选规格) */ @@ -1251,7 +1279,8 @@ var EDIT_DATA = { pricing:{basePrice:'6.00',ingredientCost:4.80,per100gCost:2.40,profitRate:150,suggestedPrice:'6.00'}, promoVideos:[{title:'红烧肉宣传片',duration:'1分30秒',size:'48MB',enabled:true},{title:'制作工艺展示',duration:'2分15秒',size:'72MB',enabled:false}], crowd:[{name:'成人',level:'推荐'},{name:'高血脂人群',level:'慎食'},{name:'高血压人群',level:'适量'}], - specs:[{portion:'标准份',baseGram:200,unit:'份',price:12,cleanMargin:55.0,cleanPrice:9,cleanSale:false,isDefault:true},{portion:'小份',baseGram:120,unit:'份',price:8,cleanMargin:50.0,cleanPrice:6,cleanSale:false,isDefault:false},{portion:'大份',baseGram:300,unit:'份',price:18,cleanMargin:58.0,cleanPrice:13,cleanSale:false,isDefault:false}], + specs:[{portion:'标准份',baseGram:200,unit:'份',price:12,sale:true,isDefault:true},{portion:'小份',baseGram:120,unit:'份',price:8,sale:true,isDefault:false},{portion:'大份',baseGram:300,unit:'份',price:18,sale:false,isDefault:false}], + cleanSpecs:[{portion:'标准份',baseGram:200,unit:'份',cleanMargin:55.0,cleanPrice:9,cleanSale:false,cleanDefault:true},{portion:'小份',baseGram:120,unit:'份',cleanMargin:50.0,cleanPrice:6,cleanSale:false,cleanDefault:false},{portion:'大份',baseGram:300,unit:'份',cleanMargin:58.0,cleanPrice:13,cleanSale:false,cleanDefault:false}], cookedWeight:200, composition:[{code:'YQ-001',name:'猪五花肉',netName:'红烧块',amount:150,type:'主材'},{code:'YQ-023',name:'冰糖',netName:'糖浆',amount:20,type:'调料'},{code:'YQ-017',name:'生抽',netName:'调味汁',amount:15,type:'调料'},{code:'YQ-020',name:'料酒',netName:'料酒汁',amount:10,type:'调料'}], cook:{mainMethod:'炖',subMethod:'煎',heat:'中火→小火',duration:45,temp:100,steps:6,desc:'1.五花肉切块焯水;2.锅中煎至金黄;3.加冰糖炒色;4.加酱油料酒;5.加水小火炖40分钟;6.大火收汁'}, @@ -1294,7 +1323,8 @@ if(pageMode==='convert' && INNOV){ EDIT_DATA.tag = INNOV.tag; EDIT_DATA.status = '上架'; EDIT_DATA.crowd = []; - EDIT_DATA.specs = [{portion:'标准份',baseGram:350,unit:'份',price:15,cleanMargin:52.0,cleanPrice:10,cleanSale:false,isDefault:true},{portion:'小份',baseGram:200,unit:'份',price:10,cleanMargin:48.0,cleanPrice:7,cleanSale:false,isDefault:false}]; + EDIT_DATA.specs = [{portion:'标准份',baseGram:350,unit:'份',price:15,sale:true,isDefault:true},{portion:'小份',baseGram:200,unit:'份',price:10,sale:false,isDefault:false}]; + EDIT_DATA.cleanSpecs = [{portion:'标准份',baseGram:350,unit:'份',cleanMargin:52.0,cleanPrice:10,cleanSale:false,cleanDefault:true},{portion:'小份',baseGram:200,unit:'份',cleanMargin:48.0,cleanPrice:7,cleanSale:false,cleanDefault:false}]; EDIT_DATA.cookedWeight = INNOV.cookedWeight || 200; EDIT_DATA.composition = INNOV.composition; EDIT_DATA.cook = INNOV.cook; @@ -1422,19 +1452,33 @@ function fillEditData(){ if(inputs[1]) inputs[1].value = d.pricing.profitRate||''; if(inputs[2]) inputs[2].value = (d.pricing.ingredientCost||0).toFixed(2); } - // 预填规格表 + // 预填餐品规格表 var specBody = container.querySelector('#specTable tbody'); if(specBody){ specBody.innerHTML = ''; - d.specs.forEach(function(s){ + (d.specs||[]).forEach(function(s){ + var tr = document.createElement('tr'); + var saleActive = s.sale === true; + var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; + var portionVal = s.portion || s.spec || ''; + var gramVal = s.baseGram!==undefined?s.baseGram:(s.weight!==undefined?s.weight:''); + tr.innerHTML = '
'+saleHtml+'删除'; + specBody.appendChild(tr); + }); + } + // 预填餐品净菜包规格表 + var cleanSpecBody = container.querySelector('#cleanSpecTable tbody'); + if(cleanSpecBody){ + cleanSpecBody.innerHTML = ''; + (d.cleanSpecs||[]).forEach(function(s){ var tr = document.createElement('tr'); var saleActive = s.cleanSale === true; var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; var portionVal = s.portion || s.spec || ''; var gramVal = s.baseGram!==undefined?s.baseGram:(s.weight!==undefined?s.weight:''); var cleanMarginVal = s.cleanMargin!==undefined?s.cleanMargin:''; - tr.innerHTML = '
'+saleHtml+'删除'; - specBody.appendChild(tr); + tr.innerHTML = '
'+saleHtml+'删除'; + cleanSpecBody.appendChild(tr); }); } } else if(currentStep===3){ diff --git a/web-admin/nutrition/din-dish-all.html b/web-admin/nutrition/din-dish-all.html index 397d436..755dec0 100644 --- a/web-admin/nutrition/din-dish-all.html +++ b/web-admin/nutrition/din-dish-all.html @@ -454,7 +454,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}