diff --git a/.claude/memory/MEMORY.md b/.claude/memory/MEMORY.md
index 0b1c274..0a81896 100644
--- a/.claude/memory/MEMORY.md
+++ b/.claude/memory/MEMORY.md
@@ -1,4 +1,4 @@
-_Last synced: 2026-08-05 | Base commit: `4fd44f1`_
+_Last synced: 2026-08-05 | Base commit: `d00208a`_
# 记忆索引
| 文件 | 描述 | 类型 | 最后更新 |
diff --git a/.claude/memory/lint_report.md b/.claude/memory/lint_report.md
index f031663..9b01543 100644
--- a/.claude/memory/lint_report.md
+++ b/.claude/memory/lint_report.md
@@ -2,12 +2,12 @@
name: 记忆健康检查报告
description: memory-lint 最新一次执行的检查结果与待处理项
type: lint
-last_updated: 2026-08-06
+last_updated: 2026-08-05
---
# 记忆健康检查报告
-> _执行时间: 2026-08-06 | Base commit: `6a505f2` | Last synced: 2026-08-06_
+> _执行时间: 2026-08-05 | Base commit: `d00208a` | Last synced: 2026-08-05_
## 健康概览
@@ -18,20 +18,11 @@ last_updated: 2026-08-06
| 引用存在性检测(3A) | ✅ | 0 | 0 |
| 双链对称性检测(3B) | ✅ | 0 | 0 |
| 内容矛盾检测 | ✅ | — | 0 |
-| 过期检测 | ⚠ | — | 4 待处理 |
-| 可推断内容污染 | ✅ | — | 0 |
-| 索引日期一致性 | ✅ | 1 | — |
+| 过期检测 | ⚠ | — | 2 待处理 |
+| 可推断内容污染 | ⚠ | — | 1 待处理 |
+| frontmatter 完整性 | ⚠ | — | 4 待处理 |
-**AUTO-FIX 已执行 1 项 | NEED-HUMAN 待处理 4 项**
-
----
-
-## AUTO-FIX 已执行清单
-
-### [AUTO-FIX] MEMORY.md 索引日期与实际文件日期不一致
-
-- **问题**:`MEMORY.md` 表格中 `project_progress.md` 显示「最后更新 2026-07-24」,实际文件已更新至 2026-08-06;头部 `_Last synced_` 锚点为 `aa3d439`(2026-08-03),落后于当前 HEAD `6a505f2`。
-- **修复**:刷新 `_Last synced_` 为 `2026-08-06 | 6a505f2`;表格中 `project_progress.md` 日期更新为 `2026-08-06`。
+**AUTO-FIX 已执行 0 项 | NEED-HUMAN 待处理 7 项**
---
@@ -39,27 +30,34 @@ last_updated: 2026-08-06
### [ERROR] 严重过期 — user_profile.md
-- **文件**:`user_profile.md`(last_updated: 2026-04-21,距今 107 天,超过 90 天 ERROR 阈值)
+- **文件**:`user_profile.md`(last_updated: 2026-04-21,距今 106 天,超过 90 天 ERROR 阈值)
- **建议**:确认用户角色/偏好是否有变化,执行 `/memory-update` 更新。
-### [WARN] 过期 — project_overview.md
-
-- **文件**:`project_overview.md`(last_updated: 2026-05-14,距今 84 天)
-- **建议**:确认技术栈、三端架构描述是否需要更新。
-
-### [WARN] 过期 — decisions.md
-
-- **文件**:`decisions.md`(last_updated: 2026-06-15,距今 52 天)
-- **建议**:确认是否有新增关键决策需要记录。
-
### [WARN] 过期 — feedback.md
-- **文件**:`feedback.md`(last_updated: 2026-06-15,距今 52 天)
+- **文件**:`feedback.md`(last_updated: 2026-06-15,距今 51 天,超 30 天 WARN 阈值)
- **建议**:确认是否有新的协作规范需要记录。
+### [WARN] 可推断内容污染 — project_progress.md
+
+- **文件**:`project_progress.md` 第 110~145 行「近期里程碑」区段
+- **问题**:含具体文件路径列表(如 `canteen-nutrition-scale/02-dish-display.html`、`prod-clean-order`/`sup-clean-external`/`sup-clean-internal`)和 commit message 风格描述,按 memory-update 规则「Git 历史(可用 git log 查)」不应写入记忆文件
+- **建议**:保留里程碑结论,删除具体文件路径与 commit message 流水,让用户能通过 `git log` 自查细节。
+
+### [WARN] frontmatter 缺失 — 4 个文件
+
+- **文件**:
+ - `decisions.md` — 无 frontmatter
+ - `feedback.md` — 无 frontmatter
+ - `project_overview.md` — 无 frontmatter
+ - `user_profile.md` — 无 frontmatter
+- **问题**:按 memory-update 规则,记忆文件应有 `name/description/type/last_updated/commit` 五字段 frontmatter;目前仅 `project_progress.md` 与 `lint_report.md` 有 frontmatter,其余四文件以一级标题起首
+- **建议**:判断是否需要补全 frontmatter 以便跨会话检索。MEMORY.md 索引已含类型与日期,可视为冗余备份;如无需统一可忽略。
+
---
## 交叉引用验证清单
-- `decisions.md` → `[[feedback.md#PAD 终端页面内禁止可见滚动条]]` ✅ 目标存在,双向闭环
-- `feedback.md` → `[[decisions.md#餐厅终端设备 PAD 居中外壳设计模式]]` ✅ 目标存在,双向闭环
+- `decisions.md#餐厅终端设备 PAD 居中外壳设计模式` → `[[feedback.md#PAD 终端页面内禁止可见滚动条]]` ✅ 目标存在,双向闭环
+- `feedback.md#PAD 终端页面内禁止可见滚动条` → `[[decisions.md#餐厅终端设备 PAD 居中外壳设计模式]]` ✅ 目标存在,双向闭环
+- `decisions.md#规格体系统一化改造` → `[[feedback.md]]` ✅ 目标存在(占位引用「暂无直接关联条目」)
diff --git a/.claude/memory/project_progress.md b/.claude/memory/project_progress.md
index fbe4618..2c8ddfc 100644
--- a/.claude/memory/project_progress.md
+++ b/.claude/memory/project_progress.md
@@ -3,7 +3,7 @@ name: 项目进度
description: 各模块原型开发进度与里程碑
type: project
last_updated: 2026-08-05
-commit: 4fd44f1
+commit: d00208a
---
# 项目进度
@@ -105,6 +105,7 @@ Web 管理端和员工端 APP 的其余模块(系统管理、运动管理、
- 覆盖模块:18 个(含三端+其他终端)
## 近期里程碑
+- 2026-08-05:餐线营养秤菜品展示页新增视频演示模式 + 净菜订单/申领三页统一订单金额字段(commit d00208a)——①`canteen-nutrition-scale/02-dish-display.html` 新增演示模式切换 pill(常规/视频)与视频模式布局(上视频+下信息卡,680px 16:9 视频播放器含播放按钮/控制条,下方菜品名+营养指标信息卡),通过 `main-area.mode-video` 状态类控制 CSS 布局切换;②`web-admin/nutrition` 净菜三页(`prod-clean-order`/`sup-clean-external`/`sup-clean-internal`)统一增加订单金额字段:订单明细 `lines[]` 每项新增 `price` 与 `subtotal` 字段、列表表头新增「订单金额」列、弹窗移除「汇总预览」表格改为底部灰底「订单总金额」栏(`#orderTotalAmount`/`#extTotalAmount`/`#claimTotalAmount`)、新增 `calcOrderTotal(o)` 与 `formatMoney(n)` 工具函数(`¥1,234.5` 千分位 + 最多 2 位小数)。
- 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 行,操作栏「批量充值」按钮改为 `` 跳转;`index.html` SITE_MAP 在「用户管理」后追加入口。同日 `din-user-account.html` 充值弹窗支付方式精简为微信/现金/支付宝三种;小程序 `me-account.html` 姓名行增加可编辑态(与手机号行一致)。
diff --git a/.claude/memory/screenshots/din-dish-add-pricing-after.png b/.claude/memory/screenshots/din-dish-add-pricing-after.png
new file mode 100644
index 0000000..6f830a0
Binary files /dev/null and b/.claude/memory/screenshots/din-dish-add-pricing-after.png differ
diff --git a/.claude/memory/screenshots/din-dish-add-pricing-v2.png b/.claude/memory/screenshots/din-dish-add-pricing-v2.png
new file mode 100644
index 0000000..c757488
Binary files /dev/null and b/.claude/memory/screenshots/din-dish-add-pricing-v2.png differ
diff --git a/web-admin/nutrition/din-dish-add.html b/web-admin/nutrition/din-dish-add.html
index b8e6992..8994347 100644
--- a/web-admin/nutrition/din-dish-add.html
+++ b/web-admin/nutrition/din-dish-add.html
@@ -208,21 +208,41 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.input-with-btn{display:flex;gap:8px;align-items:center;}
.input-with-btn .form-input{flex:1;min-width:0;}
.input-with-btn__btn{flex-shrink:0;height:36px;font-size:var(--font-sm);white-space:nowrap;}
+/* 食材成本后的小问号图标 */
+.cost-help-icon{flex-shrink:0;width:22px;height:22px;border-radius:50%;border:1px solid var(--border);color:var(--text-secondary);font-size:var(--font-xs);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;background:#fff;transition:all .15s;user-select:none;}
+.cost-help-icon:hover{border-color:var(--primary);color:var(--primary);}
+/* 食材成本缺失提示 */
+.cost-missing-hint{margin-top:6px;font-size:var(--font-xs);color:#FA541C;line-height:1.4;display:none;}
+.cost-missing-hint.is-visible{display:block;}
-/* 成本核算:成本价行 + 小问号弹窗 */
-.cost-result{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:var(--font-sm);color:var(--text-secondary);}
-.cost-result__value{font-size:var(--font-base);font-weight:600;color:var(--primary);}
-.cost-result__hint{font-size:var(--font-xs);color:var(--text-placeholder);margin-left:6px;}
-.cost-help{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background:var(--primary);color:#fff;font-size:10px;cursor:pointer;user-select:none;margin-left:4px;}
-.cost-detail-pop{position:absolute;display:none;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:0 4px 16px rgba(0,0,0,.12);padding:14px 16px;z-index:50;min-width:340px;font-size:var(--font-sm);top:100%;left:0;margin-top:6px;}
-.cost-detail-pop.open{display:block;}
-.cost-detail-pop__title{font-weight:600;color:var(--text-primary);margin-bottom:10px;font-size:var(--font-sm);}
-.cost-detail-pop__table{width:100%;border-collapse:collapse;}
-.cost-detail-pop__table th,.cost-detail-pop__table td{padding:6px 8px;font-size:var(--font-xs);text-align:left;border-bottom:1px solid #F0F0F0;}
-.cost-detail-pop__table th{color:var(--text-secondary);font-weight:500;background:#FAFBFC;}
-.cost-detail-pop__table tr:last-child td{border-bottom:none;}
-.cost-detail-pop__total{margin-top:10px;padding-top:8px;border-top:1px solid var(--border);display:flex;justify-content:space-between;font-size:var(--font-sm);}
-.cost-detail-pop__total strong{color:var(--primary);}
+/* 成本核算:左右布局(左食材明细+总成本,右成本价+状态+应用按钮) */
+.cost-result{display:flex;gap:16px;margin-top:12px;padding:14px 16px;background:#FAFBFC;border:1px solid var(--border);border-radius:var(--radius-md);font-size:var(--font-sm);color:var(--text-secondary);align-items:stretch;}
+.cost-result__left{flex:1;min-width:0;display:flex;flex-direction:column;gap:10px;}
+.cost-result__right{flex-shrink:0;width:240px;display:flex;flex-direction:column;gap:14px;padding-left:16px;border-left:1px dashed var(--border);}
+.cost-result__head{display:flex;flex-direction:column;gap:8px;}
+.cost-result__price-line{display:flex;align-items:baseline;gap:4px;flex-wrap:wrap;}
+.cost-result__value{font-size:22px;font-weight:600;color:var(--primary);line-height:1.2;}
+.cost-result__hint{font-size:var(--font-xs);color:var(--text-placeholder);}
+.cost-result__apply{width:100%;height:32px;font-size:var(--font-sm);margin-top:auto;}
+/* 核算状态徽标 */
+.cost-status{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:11px;font-size:var(--font-xs);font-weight:500;line-height:1.4;width:fit-content;}
+.cost-status::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;}
+.cost-status--missing{background:#FFF1F0;color:#FA541C;}
+.cost-status--success{background:#F6FFED;color:#52C41A;}
+/* 食材成本明细块(直接展示,非弹窗) */
+.cost-detail-block{display:flex;flex-direction:column;gap:8px;}
+.cost-detail-block__title{font-weight:600;color:var(--text-primary);font-size:var(--font-sm);}
+.cost-detail-block__table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;}
+.cost-detail-block__table th,.cost-detail-block__table td{padding:8px 12px;font-size:var(--font-xs);text-align:left;border-bottom:1px solid #F0F0F0;}
+.cost-detail-block__table th{color:var(--text-secondary);font-weight:500;background:#FAFBFC;}
+.cost-detail-block__table tr:last-child td{border-bottom:none;}
+.cost-detail-block__table th:nth-child(2),.cost-detail-block__table th:nth-child(3),.cost-detail-block__table th:nth-child(4),
+.cost-detail-block__table td:nth-child(2),.cost-detail-block__table td:nth-child(4){text-align:right;}
+.cost-detail-block__table td:nth-child(3){text-align:right;padding:6px 12px;}
+.cost-detail__unit-input{width:90px;height:28px;padding:2px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-xs);text-align:right;color:var(--text-primary);}
+.cost-detail__unit-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 2px rgba(24,144,255,0.1);}
+.cost-detail-block__total{display:flex;justify-content:flex-end;align-items:center;gap:6px;padding-top:6px;font-size:var(--font-sm);}
+.cost-detail-block__total strong{color:var(--primary);font-size:var(--font-base);font-weight:600;}
/* 宣传视频列表(多视频) */
.promo-video-list{display:flex;flex-direction:column;gap:10px;margin-top:10px;}
@@ -337,10 +357,11 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
| 规格(克重/份型) | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 默认 | 操作 |
|---|---|---|---|---|---|
350g/标准份 | 15.00 | 10.00 | 下架 | 默认 | |
200g/小份 | 10.00 | 7.00 | 下架 | 默认 | |
| + 添加规格 | |||||
| 规格(克重/份型) | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 默认 | 操作 |
|---|---|---|---|---|---|
| + 添加规格 | |||||
| 规格 | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 状态 |
|---|
| 规格 | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 状态 |
|---|
| 规格 | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 状态 |
|---|
| 规格 | 餐品售价(元/份) | 净菜包售价(元/份) | 外售净菜包 | 状态 |
|---|