fix: 问题修复,记忆文件同步

This commit is contained in:
fengpu
2026-08-05 11:13:12 +08:00
parent 4fd44f1005
commit 6c812f8e64
5 changed files with 54 additions and 16 deletions
+3 -3
View File
@@ -1,11 +1,11 @@
_Last synced: 2026-08-06 | Base commit: `6a505f2`_
_Last synced: 2026-08-05 | Base commit: `4fd44f1`_
# 记忆索引
| 文件 | 描述 | 类型 | 最后更新 |
|------|------|------|----------|
| project_overview.md | 项目技术栈、架构与模块结构 | project | 2026-05-14 |
| project_progress.md | 各模块原型开发进度 | project | 2026-08-06 |
| decisions.md | 关键设计决策与架构约定 | project | 2026-06-15 |
| project_progress.md | 各模块原型开发进度 | project | 2026-08-05 |
| decisions.md | 关键设计决策与架构约定 | project | 2026-08-05 |
| feedback.md | 协作规范与用户纠正记录 | feedback | 2026-06-15 |
| user_profile.md | 用户角色与偏好 | user | 2026-04-21 |
| lint_report.md | 记忆健康检查报告 | lint | 2026-08-06 |
+36
View File
@@ -74,3 +74,39 @@ body {
- **日期**2026-06-12
- **首次落地**:餐线营养秤 9 页 + canteen-device/index.htmlcommit 2373704
## 规格体系统一化改造(跨设备端 + Web 端 + 辅助页)
**结论**:设备端重量字段统一「克存储 + 展示层兼容显示斤」;切配规格 / 包装规格多形态字符串统一为结构化对象;建立跨页共享 `localStorage['dish_specs_v1']` + `nutri_sync_log_v1` 机制;分析页与字典页字段语义对齐权威字典。
**Why**:原状态字段散落各页面,重量单位(斤/克)混用、`cutSpec` / `packSpec` 既有 `"20mm×1mm×1mm · 细丝 · 平刀"` 字符串又有 `"500g"` `"大份800g"` 等多形态字符串,导致:
- 数据沉淀(localStorage)口径不一致,跨页读写不可靠
- 设备端复用同一食材数据需要重复换算
- 营养质控同步逻辑只能"toast 假落地",无法真正写回餐品总库
- 分析页字典语义与权威字典 (`spec_cut_shape` / `pack_method`) 错位
**How to apply**
- **存储层**:所有重量字段统一存「克」,展示层通过 `formatGram(g)` / `formatGramForCanteen(g)` 自动还原"斤"显示(如 2000g → "4 斤"
- **字段结构化**
- `cutSpec`:字符串 → `{length, width, height, shape, technique}` 对象
- `packSpec`:字符串 → `{baseGram, unit, portion?}` 对象
- 兼容老数据:`parseLegacyCutSpec()` / `parseLegacyPackSpec()` 解析旧字符串
- 渲染统一走 `formatSpec(specObj)` / `formatCutSpec(cutObj)`
- **跨页共享**
- 餐品总库 `localStorage['dish_specs_v1']` 作为权威源
- 营养质控同步日志 `localStorage['nutri_sync_log_v1']`(按时间倒序最多 100 条)
- 缺省回退:`FALLBACK_DISH_DATA` / `FALLBACK_SYNC_DATA`
- **字典语义对齐**`spec_cut_shape`(丝/片/丁/块/段/末/泥/条 — 形状名词而非"切丝/切片"动作);`pack_method`(真空/气调/普通/冷鲜/保鲜盒/散装托盘)独立于 `packSpec`
- **设备端墨刀兼容**:工具函数内联到每个 HTML 页面(不引入外部 JS)
- **权威源参考**`web-admin/nutrition/doc/spec-utils-reference.md`
**改造分阶段记录**(详见 `web-admin/nutrition/doc/规格体系统一化改造任务清单.md`):
- 阶段一~三:Web 端档案/字典/数据沉淀类页面(已先期完成)
- 阶段四(commit 4fd44f1):设备端 9 任务 14 文件全部完成
- 阶段五(commit 4fd44f1):辅助页 3 任务 6 文件全部完成(质控真同步落地 + 字典语义修正 + 净菜进柜 spec 多形态结构化)
**See Also**
- [[feedback.md]](暂无直接关联条目,后续若新增规格体系相关规范在此补引用)
- **日期**2026-08-05
- **首次全阶段落地**commit 4fd44f1
+4 -2
View File
@@ -2,8 +2,8 @@
name: 项目进度
description: 各模块原型开发进度与里程碑
type: project
last_updated: 2026-08-06
commit: 6a505f2
last_updated: 2026-08-05
commit: 4fd44f1
---
# 项目进度
@@ -105,6 +105,8 @@ Web 管理端和员工端 APP 的其余模块(系统管理、运动管理、
- 覆盖模块:18 个(含三端+其他终端)
## 近期里程碑
- 2026-08-05:规格体系统一化改造阶段四(设备端)+ 阶段五(辅助页)全部完成(commit 4fd44f1)——阶段四覆盖设备端 9 任务 14 文件:①毛菜验收秤 `verifyType` 字段(weight/count+ UNIT_OPTIONS 分类;②毛菜加工秤 4 页存储层斤→克、`formatGram` 展示层兼容、`yieldRate` 字段、04-history 语法错误修复;③净菜加工秤设置页删除"重量单位"select、滚刀块 cm→mm;④净菜包装贴标秤 3 页(最复杂)5 个工具函数内联、`cutSpec`/`packSpec` 全部结构化、`portions``packSize` 重命名;⑤净菜组配秤 3 页工具函数内联 + `localStorage['dish_specs_v1']` 跨页共享 + `resolvePackSpec` 兜底。阶段五覆盖辅助页 3 任务 6 文件:①营养质控 3 页(confirmSync 真落地写入餐品总库、菜品下拉跨页共享、同步日志驱动);②分析页字典语义修正(`sup-process-analysis` 切配线"切丝"→"丝"形状名词、新增独立 `pack_method` 字典;`sup-biz-analysis` 投料/产出吨→kg 对齐);③净菜进柜 `prod-proc-cabinet``spec` 多形态字符串结构化(含决策点 #10`'6份/箱'` 理解为 6 个份型单位装一箱)。新增权威源 `doc/spec-utils-reference.md`、改造任务清单与研发同步说明。阶段四+五完成标志着规格体系统一化五个阶段全部完成。
- 2026-08-05:体重管理新增 `eat-exercise-detail-v2.html`(饮食运动详情 v2);西安中心应急大屏迭代至 `index-v4.html`
- 2026-08-06:营养管理后台「批量充值」从 `din-user-mgmt.html` 弹窗抽离为独立原型页 `din-user-recharge.html`(用户筛选/候选用户表/充值配置区/汇总栏),原页面清理相关 CSS/JS/HTML 共 ≈800 行,操作栏「批量充值」按钮改为 `<a href>` 跳转;`index.html` SITE_MAP 在「用户管理」后追加入口。同日 `din-user-account.html` 充值弹窗支付方式精简为微信/现金/支付宝三种;小程序 `me-account.html` 姓名行增加可编辑态(与手机号行一致)。
- 2026-08-05/06:营养管理后台餐品档案定价区与成本核算交互改造——`din-dish-add/own/all.html` 三页同步:餐品定价区去特殊化(原蓝色渐变卡片改为普通 `.info-section`)、定价字段精简为「称重基础价/利润率/食材成本/成本核算按钮」、新增「🧮 成本核算」按钮 + `calcCostPrice()` 计算「每百克成本 = 食材成本 ÷ 熟重 × 100」+ 小问号明细浮窗 + 「应用到称重基础价」按钮;四大项营养指标样式精简(四色渐变改为统一浅灰);移除「营养等级」字段。`din-dish-add.html` 修复「成本核算」按钮无响应问题(增加演示数据 fallback)。
- 2026-08-04:营养管理后台餐品档案 4 项核心改造同步落地——①宣传视频多视频上传(`promoVideoEnabled` boolean 字段废弃,改用 `promoVideos: [{name,size,enabled}]` 数组);②营养指标自动计算(由食材清单累加,新增 `recalcAddNutri()`,4 大卡 + 16 项折叠);③烹饪工艺精简(删除「用油量/用盐量/出品量」3 字段,步骤数 9→6);④餐品定价独立分区(DISHES 数据新增 `pricing: {basePrice, ingredientCost, per100gCost, profitRate}` 嵌套对象)。
@@ -223,16 +223,16 @@
/* ===== 餐品数据映射(模拟后端) ===== */
var DISH_MAP = {
1: { name: '&#x7EA2;&#x70E7;&#x8089;', price: 5, kcal: 480, colors: ['#8B3A2A', '#D4764E', '#C05030'] },
2: { name: '&#x5BAB;&#x4FDD;&#x9E21;&#x4E01;', price: 5, kcal: 420, colors: ['#C87030', '#E8A040', '#D08028'] },
3: { name: '&#x9EBB;&#x5A46;&#x8C46;&#x8150;', price: 4, kcal: 280, colors: ['#706040', '#B89060', '#807050'] },
4: { name: '&#x6E05;&#x7092;&#x65F6;&#x852C;', price: 3, kcal: 120, colors: ['#306028', '#50A040', '#408030'] },
5: { name: '&#x9999;&#x714E;&#x5E26;&#x9C7C;', price: 6, kcal: 320, colors: ['#805020', '#B88040', '#A06830'] },
6: { name: '&#x7CD6;&#x918B;&#x6392;&#x9AA8;', price: 7, kcal: 520, colors: ['#802018', '#C05030', '#A03820'] },
7: { name: '&#x849C;&#x8338;&#x897F;&#x5170;&#x82B1;', price: 3, kcal: 110, colors: ['#207040', '#40A868', '#308848'] },
8: { name: '&#x7C73;&#x996D;', price: 1.5, kcal: 260, colors: ['#D0D0C0', '#E8E8D8', '#E0E0C8'] },
9: { name: '&#x7D2B;&#x83DC;&#x86CB;&#x82B1;&#x6C64;', price: 2, kcal: 80, colors: ['#503028', '#805040', '#603830'] },
10: { name: '&#x897F;&#x7EA2;&#x67FF;&#x7092;&#x86CB;', price: 4, kcal: 180, colors: ['#E8A030', '#F0C040', '#D89020'] }
1: { name: '红烧肉', price: 5, kcal: 480, colors: ['#8B3A2A', '#D4764E', '#C05030'] },
2: { name: '宫保鸡丁', price: 5, kcal: 420, colors: ['#C87030', '#E8A040', '#D08028'] },
3: { name: '麻婆豆腐', price: 4, kcal: 280, colors: ['#706040', '#B89060', '#807050'] },
4: { name: '清炒时蔬', price: 3, kcal: 120, colors: ['#306028', '#50A040', '#408030'] },
5: { name: '香煎带鱼', price: 6, kcal: 320, colors: ['#805020', '#B88040', '#A06830'] },
6: { name: '糖醋排骨', price: 7, kcal: 520, colors: ['#802018', '#C05030', '#A03820'] },
7: { name: '蒜蓉西兰花', price: 3, kcal: 110, colors: ['#207040', '#40A868', '#308848'] },
8: { name: '米饭', price: 1.5, kcal: 260, colors: ['#D0D0C0', '#E8E8D8', '#E0E0C8'] },
9: { name: '紫菜蛋花汤', price: 2, kcal: 80, colors: ['#503028', '#805040', '#603830'] },
10: { name: '西红柿炒蛋', price: 4, kcal: 180, colors: ['#E8A030', '#F0C040', '#D89020'] }
};
/* ===== 解析 URL 参数 ===== */
@@ -306,7 +306,7 @@
document.getElementById('settingsBtn').addEventListener('click', function(e) {
e.preventDefault();
if (!isEmployee) {
showToast('&#x26A0;&#xFE0F; &#x975E;&#x9910;&#x5385;&#x5458;&#x5DE5;&#xFF0C;&#x65E0;&#x6743;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;', 2000);
showToast('⚠️ 非餐厅员工,无权操作系统', 2000);
return;
}
window.location.href = '04-settings.html';
Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB