From dcf2757863f809fc8f9955f14d021f834abd6357 Mon Sep 17 00:00:00 2001 From: lenovo Date: Thu, 11 Jun 2026 10:30:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A4=90=E7=BA=BF=E8=90=A5=E5=85=BB?= =?UTF-8?q?=E7=A7=A48=E9=A1=B5=E5=85=A8=E6=B5=81=E7=A8=8B=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E2=80=94=E5=BC=80=E9=A4=90=E8=B7=B3=E8=BD=AC02?= =?UTF-8?q?=E3=80=81=E9=87=87=E6=A0=B7=E5=8F=96=E6=B6=88=E5=9B=9E02?= =?UTF-8?q?=E3=80=81=E5=85=A8=E5=B1=80=E8=BF=94=E5=9B=9Ehistory.back()?= =?UTF-8?q?=E3=80=8102/03=E9=A4=90=E5=93=81=E7=82=B9=E5=87=BB=E8=BF=9B?= =?UTF-8?q?=E5=85=A501=E3=80=8104=E6=96=B0=E5=A2=9E=E5=BC=80=E9=A4=90/?= =?UTF-8?q?=E9=87=87=E6=A0=B7=E5=8E=86=E5=8F=B2=E5=85=A5=E5=8F=A3=E3=80=81?= =?UTF-8?q?=E9=9D=9E=E5=91=98=E5=B7=A5=E8=AE=BE=E7=BD=AE=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E3=80=81=E5=BD=93=E5=A4=A9=E9=A4=90=E8=B0=B1=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=99=E9=80=89=E3=80=81=E8=87=AA=E5=8A=A8=E4=BA=BA=E8=84=B8?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .../01-meal-start.html | 926 ++++++++++++++++++ .../02-dish-display.html | 297 ++++++ .../03-meal-pickup-dual-large.html | 289 ++++++ .../03-meal-pickup-dual-small.html | 172 ++++ .../03-meal-pickup.html | 523 ++++++++++ .../canteen-nutrition-scale/04-settings.html | 508 ++++++++++ .../05-dish-sampling.html | 628 ++++++++++++ .../06-sampling-history.html | 537 ++++++++++ .../canteen-nutrition-scale/doc/FLOW.md | 401 ++++++++ .../canteen-nutrition-scale/doc/PRD.md | 747 ++++++++++++++ .../canteen-nutrition-scale/index.html | 148 +++ 11 files changed, 5176 insertions(+) create mode 100644 other-module/canteen-device/canteen-nutrition-scale/01-meal-start.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/02-dish-display.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-large.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-small.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/04-settings.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/05-dish-sampling.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/06-sampling-history.html create mode 100644 other-module/canteen-device/canteen-nutrition-scale/doc/FLOW.md create mode 100644 other-module/canteen-device/canteen-nutrition-scale/doc/PRD.md create mode 100644 other-module/canteen-device/canteen-nutrition-scale/index.html diff --git a/other-module/canteen-device/canteen-nutrition-scale/01-meal-start.html b/other-module/canteen-device/canteen-nutrition-scale/01-meal-start.html new file mode 100644 index 0000000..890a308 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/01-meal-start.html @@ -0,0 +1,926 @@ + + + + + + 开餐界面 - 蚁熊智能餐养平台 + + + + + +
+ + 开餐界面 + +
+ + +
+ + +
+
📷 餐品识别
+
+ 摄像头预览区域 +
+
+
+
+
+
+
+ + 识别完成 +
+ +
+ + +
+
🍽️ 选择餐品
+ + +
+ + +
+
🍗
+
+
宫保鸡丁
+
荤菜 · 鸡肉 · 420kcal
+
+
+ + + + + +
+
+ 智能识别候选 +
+
+ +
+
+ +
+
+ + +
+
⚖️ 秤重读数
+
+
当前重量
+
285
+
+ + +
+ +
+ + +
+ + + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/02-dish-display.html b/other-module/canteen-device/canteen-nutrition-scale/02-dish-display.html new file mode 100644 index 0000000..1b67919 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/02-dish-display.html @@ -0,0 +1,297 @@ + + + + + + 取餐界面 - 蚁熊智能餐养平台 + + + + +
+ Phone-192.168.1.165:5555 +
+ + + + + +
+ + +
+ +
+
先识别 后取餐
+
+ + +
+
+
+
+ 宫保鸡丁 + (单价 5 元/100克) +
+
+ 热量 158.66 千卡/100克 +
+
点击菜品信息 → 进入开餐界面
+
+
+
+ + + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-large.html b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-large.html new file mode 100644 index 0000000..73c33ec --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-large.html @@ -0,0 +1,289 @@ + + + + + + 取餐信息屏(大屏)- 蚁熊智能餐养平台 + + + +
+
+ +
+
+
👤
+
+
张三
+
ID: 98369
+
+ 推荐热量 + 720 + 千卡 +
+
+ +
+
+ +
+
+
+
+
+
+ 宫保鸡丁 + (单价 5 元/100克) +
+
+ 热量 158.66 千卡/100克 +
+
+
+
+
+
+ +
+
+
+ 餐品名称 + 重量(克) + 小计(元) +
+
+
+ 宫保鸡丁1869.30 +
+
+ 大米饭2003.00 +
+
+ 清炒时蔬1203.60 +
+
+ 紫菜蛋花汤2505.00 +
+
+ +
+
+
+
+ + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-small.html b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-small.html new file mode 100644 index 0000000..b79f09a --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup-dual-small.html @@ -0,0 +1,172 @@ + + + + + + 取餐营养屏(小屏)- 蚁熊智能餐养平台 + + + +
+
+ 📊 本餐次摄入 + + 当前餐次:早餐 + 06:00 ~ 10:19 + +
+
+ +
+
1070千卡
+ + + + + + + + + + + + + 🔥 + +
热量
+
+ +
+
68
+ + + + + + + + + + + + + 🍚 + +
主食
+
+ +
+
68
+ + + + + + + + + + + + + 🥗 + +
果蔬
+
+ +
+
68
+ + + + + + + + + + + + + 🥩 + +
肉蛋
+
+
+
+ + diff --git a/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup.html b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup.html new file mode 100644 index 0000000..d44280b --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/03-meal-pickup.html @@ -0,0 +1,523 @@ + + + + + + 取餐界面 - 蚁熊智能餐养平台 + + + + + +
+ + +
+ + +
+ + +
+
+
👤
+
+
张三
+
ID: 98369
+
+
+
推荐热量
+
720 千卡
+
+
+
+
+
+
宫保鸡丁
+
单价 5 元/100克  |  热量 158.66 千卡/100克
+
+
+
+ + +
+ 📊 本餐次摄入 + + 当前餐次:早餐 + 06:00 ~ 10:19 + +
+ + +
+
+ + +
+
1070千卡
+ + + + + + + + + + + + + 🔥 + +
热量
+
+ + +
+
68
+ + + + + + + + + + + + + 🍚 + +
主食
+
+ + +
+
68
+ + + + + + + + + + + + + 🥗 + +
果蔬
+
+ + +
+
68
+ + + + + + + + + + + + + 🥩 + +
肉蛋
+
+ +
+
+ +
+ + +
+ +
+
+ + +
+
+
+ 餐品名称 + 重量(克) + 小计(元) +
+
+
+ 宫保鸡丁 + 186 + 9.30 +
+
+ 大米饭 + 200 + 3.00 +
+
+ 清炒时蔬 + 120 + 3.60 +
+
+ 紫菜蛋花汤 + 250 + 5.00 +
+
+ +
+
+ +
+
+ + + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/04-settings.html b/other-module/canteen-device/canteen-nutrition-scale/04-settings.html new file mode 100644 index 0000000..6c973f4 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/04-settings.html @@ -0,0 +1,508 @@ + + + + + + 设置界面 - 蚁熊智能餐养平台 + + + + +
+ ◀ 返回 + 设置 +
+ + +
+ + + 🍴 +
+
开始开餐
+
进入开餐界面,开始打菜售卖
+
+ +
+ + + + 📸 +
+
餐品采样
+
菜品拍照采集、营养数据录入与 AI 识别匹配
+
+ +
+ + + + 📋 +
+
采样历史
+
查看/管理已采样餐品的图片记录
+
+ +
+ + +
+ ⚖️ +
+
容器减重
+
0 克
+
+ +
+ + +
+ 🥣 +
+
勺具减重
+
0 克
+
+ +
+
+ + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/other-module/canteen-device/canteen-nutrition-scale/05-dish-sampling.html b/other-module/canteen-device/canteen-nutrition-scale/05-dish-sampling.html new file mode 100644 index 0000000..023614b --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/05-dish-sampling.html @@ -0,0 +1,628 @@ + + + + + +餐品采样界面 - 蚁熊智能餐养平台 + + + + + +
+ ◀ 返回 + 餐品采样 + 📝 查看采样历史 +
+ +
+ +
+
+ 🍕 餐品选择 +
+ + + + + +
+ 全部 + 荤菜 + 素菜 + 主食 + 汤品 + 饮品 +
+ + +
+
+ + +
+ +
+
🍳
+
+
请选择一个餐品
+
点击左侧列表中的餐品进行采样
+
+
+ + +
+
+ 摄像头预览区域 + 预览 +
+
+
+
+
+
+ +
+ + +
+
+ 📋 采集结果 + 0/9 +
+
+
+ + +
+ + + + +
+
+
+ + +
+ + + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/06-sampling-history.html b/other-module/canteen-device/canteen-nutrition-scale/06-sampling-history.html new file mode 100644 index 0000000..8bdefd4 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/06-sampling-history.html @@ -0,0 +1,537 @@ + + + + + +采样历史 - 蚁熊智能餐养平台 + + + + + +
+ ◀ 返回 + 采样历史 + +
+ + +
+ + +
+
🔍 快捷查找
+ + + + + +
+
📁 按类目筛选
+
+ 全部 + 荤菜 + 素菜 + 主食 + 汤品 + 饮品 +
+
+ + +
+ 共 8 条记录 +
+
+ + +
+
+
+ +
+ + + + + +
+ + + + diff --git a/other-module/canteen-device/canteen-nutrition-scale/doc/FLOW.md b/other-module/canteen-device/canteen-nutrition-scale/doc/FLOW.md new file mode 100644 index 0000000..588c436 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/doc/FLOW.md @@ -0,0 +1,401 @@ +# 餐线营养秤 — 流程流转文档 + +> 本文档记录各页面之间的流程关系、触发条件、页面职责,用于后续生成流程图和 PRD 文档。 + +--- + +## 一、页面清单 + +| 编号 | 文件名 | 页面名称 | 使用角色 | 状态 | +|------|--------|----------|----------|------| +| 编号 | 文件名 | 页面名称 | 使用角色 | 状态 | +|------|--------|----------|----------|------| +| 01 | `01-meal-start.html` | 开餐界面 | 食堂工作人员 | 已完成 | +| 02 | `02-dish-display.html` | 餐品展示界面 | 就餐用户 | 已完成 | +| 03 | `03-meal-pickup.html` | 取餐界面 | 就餐用户 | 已完成 | +| 04 | `04-settings.html` | 设置界面 | 食堂工作人员 | 已完成 | +| 05 | `05-dish-sampling.html` | 餐品采样界面 | 食堂工作人员 | 已完成 | + +--- + +## 二、角色定义 + +| 角色 | 说明 | 权限 | +|------|------|------| +| 员工 | 食堂工作人员,系统通过人脸识别判定 | 工作时间:切换环境、餐品采集、加餐、打餐、更换餐品 | +| 客户 | 就餐用户 | 仅可浏览餐品、取餐 | + +**非员工权限拦截:** 非员工点击任何操作按钮时,Toast 提示:"您不是管理员,无权进行系统操作" + +--- + +## 二.一 开机默认行为 + +``` +设备开机 / 重启 + │ + ▼ +自动进入 01-开餐界面(默认待机态) + │ + └─ 等待食堂工作人员操作 + ├─ 放入菜品 → 打餐/开餐流程(见 2.1) + └─ 无操作 → 保持开餐界面待机 +``` + +**关键逻辑:** +- 开机后不经过任何引导页或过渡页,直接进入 01 开餐界面 +- 01 为系统默认首页,用于工作人员快速开始操作 +- 就餐用户需在 02 餐品展示界面通过人脸识别进入,不属于开机默认流程 + +--- + +## 二、主流程(员工侧 — 工作时间内) + +### 2.1 打餐(开餐)流程 + +> 打餐 = 员工将餐品倒入秤中 → 系统识别 → 开餐 → 进入正常售卖状态 + +``` +进入 01-开餐界面 + │ + ├─ 秤体检测:等待菜品放入 + │ │ + │ └─ 重量 > 0 且数据稳定 → 触发 AI 图像识别 + │ │ + │ ├─ 识别置信度 ≥ 阈值 → 自动开餐 + │ │ │ + │ │ ├─ 自动提交 1 张图片到采样库(用于后续 AI 训练) + │ │ └─ 进入正常售卖状态 + │ │ + │ ├─ 识别置信度 < 阈值 → 返回候选列表(5个) + │ │ │ + │ │ ├─ 员工点击选择候选菜品 → 确认 → 开餐 + │ │ └─ 自动提交 1 张图片到采样库 + │ │ + │ └─ 未识别到菜品 → 显示"未识别"态 + │ │ + │ └─ 点击"餐品采集" → 跳转 05-餐品采样 + │ + └─ 辅助:搜索栏手动搜索菜品(始终可用) +``` + +**关键逻辑:** +- 重量稳定判定:秤体重量 > 0 且持续 N 秒波动 < 阈值 → 视为稳定 +- 自动开餐:AI 识别置信度超过阈值时,无需人工确认,自动完成开餐 +- 手动选择:置信度不足时,展示候选列表供员工确认 +- 开餐成功后自动提交 1 张图片到采样库,用于 AI 模型迭代 +- AI 未识别时,走 05 餐品采样 → 保存后返回 01(URL 携带 `sampleDishId` 参数) +- 01 页面收到 `sampleDishId` 后自动选中该菜品并启用开餐 + +### 2.2 餐品采集流程 + +> 餐品采集 = 员工将餐品倒入秤中 → 拍照采样 → 保存到采样库 + +``` +触发条件:01 开餐界面 AI 未识别到菜品 → 点击"餐品采集" + ▼ +进入 05-餐品采样界面 + │ + ├─ 左侧:选择已有餐品(分类/搜索/筛选) + │ 或新建餐品(待补充) + │ + ├─ 秤体重量判定: + │ ├─ 重量 > 0 且数据稳定 → 启用"拍照"和"保存"按钮 + │ └─ 重量 = 0 → "拍照"和"保存"按钮禁用 + │ + ├─ 右侧:摄像头拍照采集(最多9张) + │ + └─ 保存采集 → 携带 sampleDishId 返回 01-开餐界面 + │ + └─ 01 收到参数后自动选中该菜品 +``` + +### 2.3 加餐流程 + +> 加餐 = 售卖过程中,秤体重量增加 → 系统反算加餐重量 → Toast 通知 + +``` +正常售卖状态中 + │ + └─ 秤体重量检测: + │ + └─ 重量有增加 且数据稳定 → 反算加餐重量 + │ + ├─ 自动记录到补餐表(时间/餐品/加餐重量) + │ + └─ Toast 提示:"✅ 补餐成功,补餐重量 *** 克" +``` + +**关键逻辑:** +- 加餐判定:当前重量 > 上次稳定重量 + 阈值,且持续 N 秒波动 < 阈值 +- 自动记录:无需人工操作,系统自动写入补餐记录 +- Toast 通知:即时反馈加餐结果 + +### 2.4 更换餐品流程 + +``` +员工在 03-取餐界面 → 点击餐品信息区域 + │ + ▼ +跳转至 01-开餐界面 + │ + └─ 重新执行打餐/开餐流程(同 2.1) + │ + └─ 开餐成功后 → 返回 03-取餐界面,展示新餐品 +``` + +### 2.5 设置流程 + +``` +从任意页面 → 点击设置入口 + │ + ▼ +进入 04-设置界面 + │ + ├─ 容器减重:打开容器减重弹窗 + │ + └─ 勺具减重:打开勺具减重弹窗 +``` + +### 2.6 默认减重流程 + +> 默认减重 = 设置空盘子重量 → 后续开餐时系统自动减去皮重 + +``` +04-设置界面 → 点击"默认减重"入口 + │ + ▼ +打开减重弹窗 + │ + ├─ 提示语:"请将空盘子放在秤上,待重量稳定后点击确认" + │ + ├─ 秤体重量实时显示 + │ │ + │ ├─ 重量 = 0 → 等待放置盘子 + │ │ + │ ├─ 重量 > 0 且检测中 → "检测中,请等待重量稳定..." + │ │ + │ └─ 重量稳定 → 按钮启用 → 显示"重量已稳定,可以确认" + │ + └─ 点击"确认" → 保存减重值(localStorage) + │ + ├─ Toast 提示:"✅ 默认减重已设置为 ** 克" + │ + └─ 后续开餐时:系统自动从秤体重量中减去皮重 +``` + +**关键逻辑:** +- 减重值持久化存储在 localStorage 中 +- 每次开餐/打餐时,系统自动从当前秤体重量中减去已设置的皮重 +- 净重 = 秤体重量 - 默认减重 +- 非员工用户点击默认减重时,Toast 拦截:"您不是管理员,无权进行系统操作" + +--- + +## 三、主流程(客户侧 — 就餐用户) + +### 3.1 取餐流程 + +``` +用户走到设备前 + │ + ▼ +进入 02-餐品展示界面(待机态) + │ + ├─ 左上摄像头:人脸识别 + │ │ + │ ├─ 等待面向 → 黄色标签 + 黄色人脸框 + │ ├─ 正在识别 → 青色脉冲标签 + 青色人脸框 + │ ├─ 识别成功 → 绿色标签 + 绿色人脸框 → 跳转 03-取餐界面 + │ └─ 识别失败 → 红色标签 + 红色人脸框 → 循环重试 + │ + ├─ 中央:引导文案"先识别 后取餐" + │ + └─ 底部:当前菜品信息展示(图片、名称、单价、热量) + │ + └─ 识别成功后自动跳转至 03 +``` + +### 3.2 员工身份判断逻辑 + +``` +进入 03-取餐界面 + │ + ├─ 系统判断用户身份(员工 / 非员工) + │ │ + │ ├─ 非员工 → 右上角身份标签显示"来访者"(黄色) + │ │ │ + │ │ └─ 点击任何操作按钮 → Toast 拦截:"您不是管理员,无权进行系统操作" + │ │ + │ └─ 员工 → 右上角身份标签显示"员工"(蓝色) + │ │ + │ ├─ 判断当前是否在工作时间内 + │ │ │ + │ │ ├─ 是 → 显示完整员工操作入口 + │ │ │ └─ 加餐时 Toast:"✅ 补餐成功,补餐重量 *** 克" + │ │ │ + │ │ └─ 否 → 仅浏览,操作按钮受限 + +▼ +进入 03-取餐界面 + │ + ├─ 左列(辅助信息): + │ ├─ 识别人像区:摄像头实时画面 + 人脸检测框 + 识别状态 + 身份标签 + │ ├─ 用户信息区:头像 + 昵称/ID + 推荐热量 + │ └─ 餐品信息区:餐品图标 + 名称 + 单价/热量 + │ + ├─ 中列(核心展示): + │ ├─ 营养标题行:"本餐次摄入" + 当前餐次信息 + 时间段 + │ └─ 营养核心展示区(视图形式): + │ ├─ 已摄入热量(大字 + 环形进度图) + │ └─ 四分类进度条(热量/主食/果蔬/肉蛋豆,带百分比进度条) + │ + └─ 右列: + └─ 取餐记录区:餐品名称/重量/小计 + 合计行 + │ + └─ 右上角:设置按钮(跳转 04-设置界面) +``` + +**关键逻辑:** +- 03 是取餐前的识别引导页,通过人脸识别确认用户身份 +- 识别成功后自动跳转至 03,无需手动操作 +- 04 是取餐确认页,展示订单详情和营养摄入统计 +- 员工身份通过系统判定,在工作时间内可执行加餐/更换餐品等操作 +- 非员工点击任何操作按钮时被拦截,Toast 提示:"您不是管理员,无权进行系统操作" + +--- + +## 四、页面跳转关系总览 + +### 4.1 员工侧(工作时间内) + +``` +┌──────────────┐ ┌────────────────────┐ +│ 01 开餐界面 │──未识别时──→│ 05 餐品采样界面 │ +│ ·打餐/开餐 │ │ ·选择/新建餐品 │ +│ ·AI识别/候选 │◀─保存返回────│ ·重量>0稳定才可拍照 │ +│ ·称重/自动开餐│ (sampleDishId)│ ·拍照采集(9张) │ +│ ·设置入口 │ └────────────────────┘ +└──────┬───────┘ ▲ + │ 开餐成功后 │ + ▼ │ 设置完成返回 +┌──────────────┐ │ +│ 04 设置界面 │────┘ +│ ·容器减重弹窗 │ +│ ·勺具减重弹窗 │ +└──────┬───────┘ + │ 返回 + ▼ +┌────────────────────┐ +│ 03 取餐界面 │ +│ ·营养核心展示 │ +│ ·补餐检测(重量稳定) │ +│ ·点击餐品→回01换菜 │ +└────────────────────┘ +``` + +### 4.2 客户侧 + +``` +┌────────────────────┐ 人脸识别成功 ┌──────────────────────────────────────┐ +│ 02 餐品展示界面 │ ────────────→ │ 03 取餐界面 │ +│ ·人脸识别引导 │ │ ·左侧:人像识别 + 用户信息 + 餐品信息 │ +│ ·菜品信息展示 │ │ ·中央:营养摄入可视化(环形图+进度条) │ +└────────────────────┘ │ ·右侧:取餐记录 + 合计 │ + │ ·非员工操作按钮 → Toast 拦截 │ + └──────────────────────────────────────┘ +``` + +--- + +## 五、状态机 + +### 5.1 01 开餐界面状态机(打餐/开餐) + +``` +[IDLE 空闲等待] + │ 秤体检测到重量 > 0 且数据稳定 + ▼ +[WEIGHT_STABLE 重量稳定] + │ 触发 AI 图像识别 + ▼ +[RECOGNIZING 识别中] + │ AI 返回结果 + ├─ 置信度 ≥ 阈值 → [AUTO_START 自动开餐] + │ │ + │ ├─ 自动提交 1 张图片到采样库 + │ └─ [MEAL_STARTED 开餐成功/售卖中] + │ + ├─ 置信度 < 阈值 → [HAS_CANDIDATES 有候选] + │ │ 用户点击选择 + │ ▼ + │ [DISH_SELECTED 已选菜品] + │ │ 确认开餐 + │ ▼ + │ [READY_TO_START 可开餐] ──→ 点击开餐 ──→ [MEAL_STARTED 开餐成功] + │ + └─ 未识别 → [NO_RESULT 未识别] + │ 点击"餐品采集" + ▼ + 跳转 05 采样 +``` + +### 5.2 02 餐品展示界面状态机 + +``` +[WAIT 等待面向] + │ 检测到用户 + ▼ +[SCANNING 正在识别] + │ AI 返回结果 + ├─ 成功 → [SUCCESS 识别成功] ──→ 自动跳转 03 + └─ 失败 → [FAIL 识别失败] ──→ 返回 WAIT +``` + +### 5.3 03 取餐界面状态机 + +``` +[PICKUP_IDLE 取餐待机] + │ + ├─ 秤体重量增加且稳定 → [MEAL_REPLENISH 加餐中] + │ │ + │ ├─ 反算加餐重量 → 记录补餐表 + │ ├─ Toast 通知 + │ └─ 返回 PICKUP_IDLE + │ + └─ 点击餐品信息 → [CHANGE_DISH 更换餐品] + │ + └─ 跳转 01-开餐界面 → 开餐成功后返回 PICKUP_IDLE +``` + +### 5.4 05 餐品采样界面状态机 + +``` +[NO_DISH 未选餐品] + │ 用户选择/新建餐品 + ▼ +[DISH_SELECTED 已选餐品] + │ + ├─ 重量 = 0 → 拍照/保存按钮禁用 + │ + └─ 重量 > 0 且稳定 → 拍照/保存按钮启用 + │ 拍照采集 + ▼ + [CAPTURING 采集中] ──→ 达到上限(9张) → [CAPTURE_COMPLETE 采集完成] + │ │ 保存 + │ ▼ + └────────────────────────────────── 返回 01 (携带 sampleDishId) +``` + +--- + +## 六、待确认事项 + +1. **03 取餐后续流程** — 订单确认后的后续操作(生成营养报告、结算等)待补充 +2. **02 → 03 跳转** — 识别成功后是否需要过渡动画或确认步骤 +3. **重量稳定阈值** — 秤体重量稳定的判定标准(波动范围 g、持续时间 s)待确认 +4. **AI 识别阈值** — 自动开餐的置信度阈值(如 85%)待确认 +5. **用户身份来源** — 02/03 人脸识别匹配的用户数据来源(会员系统/临时用户),以及员工身份的判定标准 +6. **工作时间段配置** — 当前默认三餐时间段,是否需要支持自定义配置 +7. **菜品信息展示** — 03 底部展示的菜品信息是否为当日所有菜品,轮播还是固定展示 +8. **加餐阈值** — 触发加餐判定的最小重量增量待确认 diff --git a/other-module/canteen-device/canteen-nutrition-scale/doc/PRD.md b/other-module/canteen-device/canteen-nutrition-scale/doc/PRD.md new file mode 100644 index 0000000..97f7223 --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/doc/PRD.md @@ -0,0 +1,747 @@ +# 餐线营养秤 — 产品需求文档 + +> 模块位置:`other-module/canteen-device/canteen-nutrition-scale/` + +--- + +## 一、模块概述 + +餐线营养秤是食堂档口终端设备(1280×720),核心功能覆盖秤体初始化、餐品采样、采样信息维护、开餐打菜、AI 菜品识别、补餐检测、取餐引导、营养数据可视化展示等。 + +### 1.1 整体流程总览 + +``` +设备开机 + │ + ▼ +进入 01-开餐界面(待机态) + │ + ▼ +【员工端工作流】(按顺序执行,但初始化步骤非强制) + ├─ ① 初始化秤体(容器减重 / 勺具减重,按需选择,非强制) + ├─ ② 餐品采样(选择已有菜品 → 拍照采集 → 关联图片到采样库) + ├─ ③ 采样信息维护(查看采样历史 / 删除图片 / 新增采样) + ├─ ④ 开餐(放入菜品 → AI 识别 → 确认菜品 → 进入售卖状态) + │ │ + │ └─ 开餐成功后 → 跳转 02-待取餐界面(买家端) + │ │ + │ └─ 买家取餐后 → 回到 01(待机态,等待下一次开餐) + └─ ⑤ 补餐(售卖/取餐过程中,重量增加 → 自动记录补餐) +``` + +### 1.2 开机默认页 + +> 营养秤开机后默认进入 **01-开餐界面**(待机态),不经过任何引导页或欢迎页。 + +### 1.3 页面导航结构 + +``` +01 开餐界面 ──┬── AI 识别成功 + 确认开餐 ──→ 02 待取餐界面(买家端) + ├── AI 未识别 ──→ 05 餐品采样界面 + ├── 搜索/候选选择 ──→ 开餐 + └── 设置入口 ──→ 04 设置界面 + +02 待取餐界面 ──┬── 人脸识别成功(站在设备前自动触发)──→ 03 取餐界面 + ├── 点击底部菜品信息区域 ──→ 01 开餐界面 + └── 设置按钮 ──→ 04 设置界面(非员工拦截) + +03 取餐界面 ──┬── 大屏:取餐信息 + 营养可视化 + ├── 小屏:营养摄入柱状图 + ├── 设置按钮 ──→ 04 设置界面 + ├── 点击餐品信息卡片 ──→ 01 开餐界面 + └── 取餐完成 ──→ 01 开餐界面(待机态) + +04 设置界面 ──┬── 开始开餐 ──→ 01 开餐界面 + ├── 餐品采样 ──→ 05 餐品采样界面 + ├── 采样历史 ──→ 06 采样历史界面 + ├── 容器减重 ──→ 弹窗 + ├── 勺具减重 ──→ 弹窗 + └── 返回 ──→ 01 开餐界面(从哪来回哪去) + +05 餐品采样界面 ──┬── 保存采集 ──→ 02 待取餐界面(携带 dishId) + ├── 保存并继续 ──→ 留在 05 继续采集下一个餐品 + ├── 取消 ──→ 02 待取餐界面 + └── 查看采样历史 ──→ 06 采样历史界面 + +06 采样历史界面 ──┬── 补充采集 ──→ 05 餐品采样界面(携带 resampleDishId) + └── 返回 ──→ 05 餐品采样界面(从哪来回哪去) +``` + +### 1.4 全局返回路径规则 + +> **核心原则**:从哪来回哪去。 + +- 所有页面的返回按钮必须指向进入该页面的来源页 +- 若页面有多个入口(如 06 可从 05 或 04 进入),返回按钮使用浏览器 `history.back()` 实现 +- 采样页面(05)的「取消」操作统一回到 02 待取餐界面(无论从何进入) +- 采样页面(05)的「保存采集」操作统一跳转 02 待取餐界面(携带 dishId) + +### 1.3 状态流转 + +```mermaid +stateDiagram-v2 + [*] --> 01_开餐界面: 开机 + 01_开餐界面 --> 04_设置界面: 设置入口 + 04_设置界面 --> 01_开餐界面: 开始开餐/返回 + 04_设置界面 --> 05_餐品采样: 餐品采样 + 04_设置界面 --> 06_采样历史: 采样历史 + 01_开餐界面 --> 05_餐品采样: AI未识别 + 05_餐品采样 --> 02_待取餐界面: 保存采集/取消 + 05_餐品采样 --> 05_餐品采样: 保存并继续 + 01_开餐界面 --> 02_待取餐界面: AI识别成功+确认开餐 + 02_待取餐界面 --> 03_取餐界面: 人脸识别成功(自动触发) + 02_待取餐界面 --> 01_开餐界面: 点击菜品信息 + 03_取餐界面 --> 01_开餐界面: 取餐完成/点击餐品信息 + 03_取餐界面 --> 04_设置界面: 设置按钮 + 05_餐品采样 --> 06_采样历史: 查看采样历史 + 06_采样历史 --> 05_餐品采样: 补充采集 + 06_采样历史 --> 05_采样历史: 返回(从哪来回哪去) +``` + +--- + +## 二、角色定义 + +| 角色 | 说明 | 权限 | +|------|------|------| +| **员工** | 食堂工作人员,通过人脸识别 + 排班表匹配判定 | 初始化秤体、餐品采样、采样信息维护、开餐、补餐 | +| **买家** | 就餐用户,通过人脸识别判定 | 查看待取餐界面、取餐确认(结算支付在其他硬件中完成,不在本文档范围内) | + +### 2.1 员工身份判定逻辑 + +> **判定方式**:人脸识别 + 排班表匹配 +> **触发方式**:用户站在设备摄像头前自动触发,无需手动点击摄像头入口。 + +``` +用户面向设备摄像头(自动检测) + │ + ▼ +人脸识别服务 + │ + ├─ 识别成功 → 获取用户标识(工号/ID) + │ │ + │ ▼ + │ 查询后端排班表(默认早 09:00 ~ 晚 18:00) + │ │ + │ ├─ 当前时间在排班内 → 判定为「员工」 + │ │ │ + │ │ └─ 进入 01-开餐界面,展示员工操作入口 + │ │ + │ └─ 当前时间不在排班内 → 判定为「买家」 + │ │ + │ └─ 进入 02-待取餐界面 + │ + └─ 识别失败 → 循环重试,超时后进入默认待机态 +``` + +**关键规则**: +- 排班表由后端维护,本文档阶段仅使用默认配置(工作日 09:00~18:00) +- 排班角色区分功能暂不实现,仅做「在班/不在班」二元判定 +- 排班角色细分(如打餐员、补餐员、管理员等)后期再做 + +### 2.2 非员工权限拦截 + +非员工点击任何员工操作按钮时,Toast 提示:「您不是管理员,无权进行系统操作」 +- 非员工点击设置按钮时,Toast 提示:「⚠️ 非餐厅员工,无权操作系统」,阻止跳转 +- 适用页面:01 开餐界面、02 待取餐界面、03 取餐界面等所有含设置入口的页面 + +### 2.3 全局按钮反馈规则 + +> 所有用户可交互按钮,无论操作成功或失败,均需通过 Toast 给予明确的反馈提示。 + +- **成功操作**:Toast 提示操作结果(如「✅ 采集数据已保存」) +- **操作失败**:Toast 提示失败原因(如「⚠️ 请先选择一个餐品」) +- **无操作状态**:若未进行任何操作就点击按钮,Toast 提示当前状态(如「无需取消,未进行任何操作」) + +--- + +## 三、员工端流程详解 + +员工操作严格按以下流程顺序执行: + +``` +① 初始化秤体 → ② 餐品采样 → ③ 采样信息维护 → ④ 开餐 → ⑤ 补餐 +``` + +> **说明**:步骤 ①(初始化秤体)为非强制操作,员工可根据实际情况选择是否执行。但步骤 ②~⑤ 为按序执行的必经流程。 + +### 3.1 ① 初始化秤体 + +> **目的**:设置秤体的去皮重参数,确保后续称重数据准确。 + +#### 3.1.1 两种减重方式 + +| 减重类型 | 减重对象 | 性质 | 说明 | +|---------|---------|------|------| +| **容器减重** | 盛放食物的容器(食物盆) | 一次性 | 设置后在整个开餐周期内生效,后续每次开餐系统自动减去该皮重 | +| **勺具减重** | 取餐勺子 | 多次(动态) | 每次取餐时勺子拿起/放下都会自动扣除勺子重量 | + +#### 3.1.2 减重方式差异对比 + +> **关键差异**:两种减重不仅在减重对象上不同,其工作原理和生效时机也完全不同。 + +| 对比维度 | 容器减重 | 勺具减重 | +|---------|---------|---------| +| **减重对象** | 盛放食物的容器 | 取餐勺子 | +| **生效性质** | 设置后持久生效,直到更换容器 | 每次取餐循环动态扣除 | +| **扣除时机** | 称重时从总重中扣除 | 取餐时:勺子拿起 → 称重 → 勺子放下 → 反算净重 | +| **重量变化检测** | 开餐瞬间:`净重 = 当前重量 - 容器皮重` | 取餐过程中:`取走重量 = 勺子放下后重量 - 勺子拿起时重量 - 勺具皮重` | +| **设置持久化** | `localStorage` 持久存储,重启后仍有效 | `localStorage` 持久存储,重启后仍有效 | +| **重新设置** | 更换不同容器时需重新设置 | 更换不同勺子时需重新设置 | + +#### 3.1.3 设置界面入口 + +04 设置界面可通过以下方式进入: +- 01-开餐界面 → 顶部右上角设置按钮 +- 02-待取餐界面 → 右上角设置按钮(非员工拦截) +- 03-取餐界面 → 取餐记录区设置按钮(非员工拦截) + +#### 3.1.4 容器减重流程 + +``` +04-设置界面 → 点击「容器减重」 + │ + ▼ +打开容器减重弹窗 + │ + ├─ 提示语:「将盛放食物的容器(食物盆)放在秤上,待重量稳定后点击『确认』」 + │ + ├─ 秤体重量实时显示 + │ │ + │ ├─ 重量 = 0 → 「等待放置容器...」 + │ ├─ 重量 > 0 且检测中 → 「检测中,请等待重量稳定...」 + │ └─ 重量稳定 → 按钮启用 → 「重量已稳定,可以确认」 + │ + └─ 点击「确认」→ 保存减重值 + │ + ├─ Toast:「✅ 容器减重已设置为 ** 克」 + └─ 后续开餐时:系统自动从秤体重量中减去容器皮重 +``` + +**稳定判定标准**:重量波动 < 5g,持续 3 秒。 + +#### 3.1.5 勺具减重流程 + +``` +04-设置界面 → 点击「勺具减重」 + │ + ▼ +打开勺具减重弹窗 + │ + ├─ 提示语:「将取餐勺子放在秤上,待重量稳定后点击『确认』。设置后每次取餐时勺子拿起放下都会自动扣除勺子重量。」 + │ + ├─ 秤体重量实时显示 + │ │ + │ ├─ 重量 = 0 → 「等待放置勺子...」 + │ ├─ 重量 > 0 且检测中 → 「检测中,请等待重量稳定...」 + │ └─ 重量稳定 → 按钮启用 → 「重量已稳定,可以确认」 + │ + └─ 点击「确认」→ 保存减重值 + │ + ├─ Toast:「✅ 勺具减重已设置为 ** 克」 + └─ 每次取餐时:系统自动在勺子拿起/放下循环中扣除勺子皮重 +``` + +**稳定判定标准**:重量波动 < 5g,持续 3 秒。 + +#### 3.1.6 非强制规则 + +- 容器减重和勺具减重均为**按需选择**,非强制操作 +- 员工可以只做容器减重、只做勺具减重、两者都做、或都不做 +- 未设置减重时,系统以秤体原始重量进行计算(`净重 = 当前重量`) +- 已设置减重时,系统自动扣除:`净重 = 当前重量 - 容器皮重 - 勺具皮重` + +### 3.2 ② 餐品采样 + +> **目的**:将后台数据库中已有的菜品与实际菜品图片关联在一起,为 AI 摄像头识别提供训练样本。 + +#### 3.2.1 触发入口 + +- 01-开餐界面:AI 未识别到菜品 → 点击「餐品采集」→ 跳转 05-餐品采样 + +#### 3.2.2 采样流程 + +``` +进入 05-餐品采样界面 + │ + ├─ 左侧:选择已有餐品(分类 Tab / 搜索 / 列表) + │ │ + │ └─ 点击已有餐品 → 选中 → 启用右侧拍照区 + │ 餐品列表由后端数据库提供,不支持新建餐品 + │ + ├─ 右侧:摄像头拍照采集(最多 9 张) + │ │ + │ ├─ 点击「拍照采集」→ 拍照 → 图片进入采集结果网格 + │ └─ 点击网格中的图片 → 可删除该张图片 + │ + └─ 底部操作按钮 + │ + ├─ 点击「取消」→ Toast 反馈 → 跳转至 02-待取餐界面 + │ + ├─ 点击「重新采样」→ 删除该餐品全部已采图片,清空表单,保留餐品选中状态,Toast 反馈 + │ + ├─ 点击「保存采集」→ 提交数据 → 跳转至 02-待取餐界面(携带 dishId) + │ (补充采集模式下隐藏此按钮) + │ + └─ 点击「保存并继续」→ 提交数据 → 重置表单继续采集下一个餐品,Toast 反馈 + (补充采集模式下隐藏此按钮) +``` + +#### 3.2.3 采样前置条件 + +| 条件 | 说明 | +|------|------| +| 已选中餐品 | 左侧列表必须选中一个餐品 | +| 至少采集 1 张图片 | 采集结果网格不能为空 | + +#### 3.2.4 重新采样 vs 补充采集 + +> 两者操作对象不同,不可混淆。 + +| 操作 | 触发位置 | 行为 | 结果 | +|------|---------|------|------| +| **重新采样** | 05-餐品采样界面 → 点击「重新采样」 | 删除该餐品已采集的**全部**图片,清空采集结果网格,保留餐品选中状态 | 覆盖式重新采集,之前采样的图片全部作废 | +| **补充采集** | 06-采样历史 → 点击「补充采集」 | 跳转 05 并携带 `resampleDishId`,页面**自动选中该餐品**并加载已有图片,用户可直接追加拍照 | 追加式采集,最多 9 张,满额后不可追加 | + +#### 3.2.5 底部按钮差异 + +| 按钮 | 正常采样模式 | 补充采集模式 | 行为 | +|------|------------|------------|------| +| 取消 | 显示 | 显示 | 清空当前操作状态 | +| 重新采样 | 显示 | 显示 | 清空该餐品全部已采图片 | +| 保存采集 | 显示 | 显示 | 提交数据 → 跳转至 02-待取餐界面 | +| 保存并继续 | 显示 | **隐藏** | 提交数据 → 重置表单继续采集下一个餐品 | + +#### 3.2.6 餐品字段说明(后端预置) + +> 餐品信息由后端数据库预置,采样页面仅做选择关联,不提供新建功能。 + +| 字段 | 类型 | 说明 | +|------|------|------| +| 餐品 ID | number | 唯一标识 | +| 餐品名称 | string | 如「红烧肉」、「宫保鸡丁」 | +| 餐品分类 | string | 热菜 / 凉菜 / 主食 / 汤羹 / 饮品 / 水果 / 其他 | +| 主食材 | string | 如「猪肉」、「鸡肉」、「豆腐」 | +| 热量(kcal) | number | 每 100 克热量 | +| 单价(元/100 克) | number | 每 100 克价格,保留 2 位小数 | + +### 3.3 ③ 采样信息维护 + +> **目的**:管理已采样的菜品记录,包括查看、删除图片、补充采集。 + +#### 3.3.1 入口 + +- 05-餐品采样界面 → 顶部右上角「📝 查看采样历史」→ 跳转 06-采样历史 +- 04-设置界面 → 「采样历史」卡片 → 跳转 06-采样历史 + +#### 3.3.2 采样历史列表展示 + +``` +进入 06-采样历史界面 + │ + └─ 餐品卡片列表 + │ + ├─ 每张卡片展示:菜品图片 + 名称 + │ + └─ 点击卡片 → 弹出详情弹窗 + │ + ├─ 详情内容:已采集图片网格(最多 9 格) + ├─ 副标题:品类 · 主食材 · 热量 + ├─ 采样数量:置于弹窗右上角,仿 01 页面识别率徽章样式(数字 + 「张」横向排列) + ├─ 采样时间:置于采样数量右侧,日期和时间分两行显示 + ├─ 每张图片底部悬浮显示采样时间 + └─ 支持操作: + ├─ 单张图片删除(点击「✕」按钮) + ├─ 全部清空 + └─ 补充采集(跳转 05,携带 dishId) +``` + +#### 3.3.3 操作权限 + +| 操作 | 是否允许 | 说明 | +|------|---------|------| +| 查看采样记录 | ✅ | 浏览已采样菜品及图片 | +| 删除单张图片 | ✅ | 从详情弹窗中删除单张采集图片 | +| 清空全部图片 | ✅ | 删除该菜品的所有采集图片 | +| 补充采集 | ✅ | 跳转 05-餐品采样,为已有菜品追加采集 | +| **编辑字段** | ❌ | 品类、主食材、热量、单价等字段均不可编辑 | +| **删除整条采样记录** | ❌ | 采样记录一旦建立,不可删除整条记录 | +| **全部清空** | ❌ | 不提供全部清空操作 | + +### 3.4 ④ 开餐 + +> **目的**:员工将菜品放入秤中,系统通过 AI 图像识别判定菜品,完成开餐并进入售卖状态。 + +#### 3.4.1 开餐前置条件 + +| 条件 | 说明 | +|------|------| +| 员工身份已确认 | 人脸识别 + 排班表匹配通过 | +| 秤体重量 > 0 且数据稳定 | 菜品已放在秤上 | +| AI 识别完成 或 手动选择菜品 | 系统已识别或员工已选中菜品 | + +#### 3.4.2 开餐流程 + +``` +进入 01-开餐界面 + │ + ├─ 秤体检测:等待菜品放入 + │ │ + │ └─ 重量 > 0 且数据稳定(波动 < 5g 持续 3 秒)→ 触发 AI 图像识别 + │ │ + │ ├─ 识别置信度 ≥ 阈值(≥ 80%)→ 自动选中识别率最高的菜品 → 启用开餐按钮 + │ │ │ + │ │ └─ 点击「开餐」→ 开餐成功 + │ │ │ + │ │ ├─ 自动提交 1 张图片到采样库(localStorage 暂存) + │ │ └─ 跳转 02-待取餐界面(携带 dishId) + │ │ + │ ├─ 识别置信度 < 阈值 → 展示 5 个候选菜品 + │ │ │ + │ │ ├─ 员工点击选择候选菜品 → 默认选中识别率最高的 → 启用开餐按钮 + │ │ │ │ + │ │ │ └─ 点击「开餐」→ 开餐成功 → 自动提交采样库 → 跳转 02 + │ │ │ + │ │ └─ 自动提交 1 张图片到采样库 + │ │ + │ └─ 未识别到菜品 → 显示「未识别」态 + │ │ + │ └─ 点击「餐品采集」→ 跳转 05-餐品采样 + │ │ + │ └─ 保存后携带 sampleDishId 返回 01 → 自动选中该餐品 → 启用开餐 + │ + └─ 辅助:搜索栏手动搜索菜品(始终可用) + │ + └─ 搜索后默认选中搜索结果中第一个餐品 → 启用开餐按钮 +``` + +#### 3.4.3 开餐成功后行为 + +1. 系统记录开餐信息(时间、菜品、重量、操作员) +2. 自动提交 1 张图片到采样库(用于 AI 模型迭代训练) +3. **跳转至 02-待取餐界面**,展示当前开餐绑定的菜品信息 +4. 买家只能在开餐成功后的 02 界面进行人脸识别取餐 + +#### 3.4.4 关键业务规则 + +| 规则 | 说明 | +|------|------| +| 一秤一菜 | 一个秤体上只放置一种菜品,不存在多菜品共存场景 | +| 开餐绑定菜品 | 开餐时选定的菜品,即为买家取餐时获取的菜品 | +| 净重计算 | `净重 = 秤体重量 - 容器皮重 - 勺具皮重`(未设置的皮重项为 0) | +| 重量稳定判定 | 重量波动 < 5g,持续 3 秒 | +| AI 识别阈值 | 置信度 ≥ 80% 时自动选中菜品并启用开餐按钮 | +| 自动选中(AI 识别) | 识别到菜品时,默认选中识别率最高的那个 | +| 候选餐品范围 | 默认读取当天餐谱中的餐品作为候选列表,非全量展示;仅当用户主动搜索时才进行全量搜索 | +| 自动选中(手动搜索) | 搜索后默认选中搜索结果中第一个餐品 | +| 自动选中(采样返回) | 从 05 页面携带 `sampleDishId` 返回 01 时,自动选中该餐品并启用开餐 | +| 开餐自动提交采样库 | 每次开餐成功自动提交 1 张图片到采样库(localStorage 暂存) | +| 开餐页面跳转 | 开餐成功后跳转至 02-待取餐界面(携带 dishId) | +| 01 开餐界面入口 | 共 4 个入口:①开机默认进入 ②02/03 点击菜品信息进入 ③04 设置页「开始开餐」按钮进入 ④05 采样页保存后跳转到 02(不直接回 01) | + +### 3.5 ⑤ 补餐 + +> **目的**:售卖/取餐过程中,当秤体重量增加时,系统自动检测并记录补餐。 + +#### 3.5.1 补餐流程 + +``` +正常售卖/取餐状态中(02 或 03 界面) + │ + └─ 秤体重量检测: + │ + └─ 重量有增加 且数据稳定 → 反算补餐重量 + │ + ├─ 自动记录到补餐表(时间 / 餐品 / 补餐重量) + │ + └─ Toast 提示:「✅ 补餐成功,补餐重量 *** 克」 +``` + +#### 3.5.2 补餐判定逻辑 + +| 规则 | 说明 | +|------|------| +| 触发条件 | 当前重量 > 上次稳定重量 + 100g | +| 稳定判定 | 重量波动 < 5g,持续 3 秒 | +| 归属判定 | 一秤一菜,补餐重量直接归属当前开餐绑定的菜品 | +| 自动记录 | 无需人工操作,系统自动写入补餐记录 | +| Toast 通知 | 即时反馈补餐结果 | + +#### 3.5.3 补餐记录 + +补餐记录表包含以下字段: + +| 字段 | 类型 | 说明 | +|------|------|------| +| 补餐时间 | timestamp | 补餐发生的具体时间 | +| 餐品 ID | number | 当前开餐绑定的菜品 ID | +| 补餐重量(g) | number | 增加的净重(已扣除皮重) | +| 操作员 | string | 执行开餐的员工 ID | + +--- + +## 四、买家端流程详解 + +> **说明**:买家的结算支付环节在其他硬件中完成,不在本文档范围内。本文档仅描述取餐前的引导流程。 + +### 4.1 02-待取餐界面 + +> **定位**:开餐成功后的待机页面,引导买家进行人脸识别取餐。 + +#### 4.1.1 页面展示 + +| 区域 | 内容 | +|------|------| +| 中央 | 引导文案:「先识别 后取餐」(大字展示) | +| 底部 | 当前开餐绑定的菜品信息:图片、名称、单价(元/100克)、热量 | + +#### 4.1.2 进入条件 + +- 01-开餐界面 → 开餐成功 → 自动跳转至 02(携带 dishId) +- 05-餐品采样界面 → 保存采集 / 取消 → 跳转至 02 +- 02 展示的开餐菜品即为 01 中确认的菜品 + +#### 4.1.3 页面交互 + +- 买家站在设备前 → 自动触发人脸识别 → 识别成功 → 跳转 03-取餐界面(无需手动点击) +- 点击底部菜品信息区域 → 跳转 01-开餐界面(员工端入口) +- 点击右上角设置按钮 → 员工跳转 04-设置界面;非员工 Toast 提示「⚠️ 非餐厅员工,无权操作系统」 + +### 4.2 03-取餐界面 + +> **定位**:人脸识别成功后展示取餐信息、营养摄入可视化、取餐记录。 + +#### 4.2.1 进入条件 + +- 02-待取餐界面 → 人脸识别成功 → 自动跳转至 03 + +#### 4.2.2 页面展示 + +| 区域 | 内容 | +|------|------| +| 左列 | 识别人像区 + 用户信息区 + 餐品信息区(点击可进入 01 开餐界面) | +| 中列 | 营养摄入可视化(环形图 + 四分类进度条) | +| 右列 | 取餐记录区(餐品名称 / 重量 / 小计 + 合计行)+ 设置按钮(非员工拦截) | + +#### 4.2.3 取餐完成 + +- 买家取走菜品后,系统记录取餐数据 +- 结算支付在其他硬件中完成 +- 取餐完成后,系统回到 01-开餐界面(待机态) + +#### 4.2.4 页面交互 + +- 点击餐品信息卡片 → 跳转 01-开餐界面 +- 点击设置按钮 → 员工跳转 04-设置界面;非员工 Toast 提示「⚠️ 非餐厅员工,无权操作系统」 + +--- + +## 五、页面清单 + +| 编号 | 文件名 | 页面名称 | 使用角色 | 状态 | +|------|--------|----------|----------|------| +| 01 | `01-meal-start.html` | 开餐界面 | 员工 | 已完成 | +| 02 | `02-dish-display.html` | 待取餐界面 | 买家 | 已完成 | +| 03 | `03-meal-pickup.html` | 取餐界面(单屏) | 买家 | 已完成 | +| 03-L | `03-meal-pickup-dual-large.html` | 取餐界面(双屏·大屏 1280×720) | 买家 | 已完成 | +| 03-S | `03-meal-pickup-dual-small.html` | 取餐界面(双屏·小屏 480×320) | 买家 | 已完成 | +| 04 | `04-settings.html` | 设置界面 | 员工 | 已完成 | +| 05 | `05-dish-sampling.html` | 餐品采样界面 | 员工 | 已完成 | +| 06 | `06-sampling-history.html` | 采样历史界面 | 员工 | 已完成 | + +--- + +## 六、状态机 + +### 6.1 设备全局状态机 + +```mermaid +stateDiagram-v2 + [*] --> IDLE: 开机 + IDLE --> INIT_SCALE: 员工选择初始化 + INIT_SCALE --> IDLE: 初始化完成(非强制,可随时跳过) + IDLE --> SAMPLING: 员工进入采样 + SAMPLING --> IDLE: 采样保存返回 + IDLE --> MEAL_STARTED: 开餐成功 + MEAL_STARTED --> WAIT_PICKUP: 进入待取餐界面 + WAIT_PICKUP --> PICKUP: 人脸识别成功 + PICKUP --> MEAL_STARTED: 补餐检测(重量增加) + PICKUP --> IDLE: 取餐完成 +``` + +### 6.2 01 开餐界面状态机 + +``` +[IDLE 空闲等待] + │ 秤体检测到重量 > 0 且数据稳定 + ▼ +[WEIGHT_STABLE 重量稳定] + │ 触发 AI 图像识别 + ▼ +[RECOGNIZING 识别中] + │ AI 返回结果 + ├─ 置信度 ≥ 阈值 → [AUTO_START 自动开餐] + │ │ + │ ├─ 自动提交 1 张图片到采样库 + │ └─ [MEAL_STARTED 开餐成功] → 跳转 02 + │ + ├─ 置信度 < 阈值 → [HAS_CANDIDATES 有候选] + │ │ 员工点击选择 + │ ▼ + │ [DISH_SELECTED 已选菜品] → 启用开餐按钮 + │ │ + │ └─ 点击开餐 → [MEAL_STARTED] → 跳转 02 + │ + └─ 未识别 → [NO_RESULT 未识别] + │ 点击「餐品采集」 + ▼ + 跳转 05 采样 +``` + +### 6.3 05 餐品采样界面状态机 + +``` +[NO_DISH 未选餐品] + │ 用户从列表中选择餐品 + ▼ +[DISH_SELECTED 已选餐品] + │ + ├─ 重量 = 0 → 拍照/保存按钮禁用 + │ + └─ 重量 > 0 且稳定 → 拍照/保存按钮启用 + │ 拍照采集 + ▼ + [CAPTURING 采集中] ──→ 达到上限(9张) → [CAPTURE_COMPLETE 采集完成] + │ │ 保存采集 + │ ├─→ 跳转 02 (携带 dishId) + │ │ 保存并继续 + │ ├─→ 留在 05 (重置表单) + │ └─→ 取消 + │ 跳转 02 +``` + +### 6.4 03 取餐界面状态机 + +``` +[PICKUP_IDLE 取餐待机] + │ + ├─ 秤体重量增加且稳定 → [MEAL_REPLENISH 补餐中] + │ │ + │ ├─ 反算补餐重量 → 记录补餐表 + │ ├─ Toast 通知 + │ └─ 返回 PICKUP_IDLE + │ + └─ 取餐完成 → [PICKUP_DONE] + │ + └─ 跳转 01-开餐界面(待机态) +``` + +--- + +## 七、数据字段表 + +### 7.1 餐品数据(后端预置,采样页面仅做选择关联) + +| 字段 | 类型 | 说明 | +|------|------|------| +| 餐品 ID | number | 唯一标识 | +| 餐品名称 | string | 如「红烧肉」、「宫保鸡丁」 | +| 餐品分类 | string | 热菜 / 凉菜 / 主食 / 汤羹 / 饮品 / 水果 / 其他 | +| 主食材 | string | 如「猪肉」、「鸡肉」、「豆腐」 | +| 热量(kcal) | number | 每 100 克热量 | +| 单价(元/100 克) | number | 每 100 克价格,保留 2 位小数 | + +### 7.2 容器减重(04-设置界面) + +| 字段 | 类型 | 必填 | 校验规则 | +|------|------|------|---------| +| 皮重(克) | number | 是 | 由秤体自动读取,≥ 0 | +| 稳定判定 | boolean | 是 | 重量波动 < 5g 持续 3 秒 | + +### 7.3 勺具减重(04-设置界面) + +| 字段 | 类型 | 必填 | 校验规则 | +|------|------|------|---------| +| 皮重(克) | number | 是 | 由秤体自动读取,≥ 0 | +| 稳定判定 | boolean | 是 | 重量波动 < 5g 持续 3 秒 | + +### 7.4 采样保存提交 + +> 员工在 05-餐品采样界面点击「保存采集」时提交的数据。 + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| 餐品 ID | number | 是 | 当前选中餐品的 ID | +| 采集图片列表 | array<string> | 是 | 已拍摄的图片数据(URL 或 Base64) | +| 采样时间 | timestamp | 是 | 保存时的时间戳 | +| 操作员工 ID | string | 是 | 执行采样的员工标识 | +| 菜品重量(g) | number | 是 | 采样时秤体的净重(已扣除皮重) | + +### 7.5 补餐记录(系统自动写入) + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| 补餐时间 | timestamp | 是 | 补餐发生的具体时间 | +| 餐品 ID | number | 是 | 当前开餐绑定的菜品 ID | +| 补餐重量(g) | number | 是 | 增加的净重(已扣除皮重) | +| 操作员 | string | 是 | 执行开餐的员工 ID | + +--- + +## 八、采样库核心规则 + +### 8.1 反样本机制 + +> 目的:防止误操作导致无效图片污染采样库,提升 AI 训练数据质量。 + +| 反样本类型 | 说明 | 处理方式 | +|-----------|------|---------| +| **空秤图片** | 秤体上无任何菜品,重量 = 0 | 禁止拍照采集,Toast:「秤体上无菜品,无法采样」 | +| **纯水图片** | 仅放置水杯/液体,无固体菜品 | 标记为反样本,单独存储,不纳入正常训练集 | +| **异常物体** | 明显非菜品的物品(餐具、手机等) | 标记为反样本 | +| **极端遮挡** | 菜品被容器/盖子遮挡超过 70% | 提示:「请确保菜品完全可见后再采样」 | +| **重复帧** | 连续两张图片相似度 > 98% | 自动丢弃后一张,Toast:「图片过于相似,已跳过」 | + +**反样本存储策略**: +- 反样本图片单独存放在 `anti_sample/` 目录 +- 数据库中标记 `is_anti_sample: true` +- 采样历史界面以不同样式展示(灰色边框 + 「反样本」标签) + +### 8.2 图片存储上限与覆盖策略 + +| 参数 | 值 | 说明 | +|------|-----|------| +| **单菜品图片上限** | 50 张 | 超过此数量后触发覆盖逻辑 | +| **覆盖策略** | 相似度覆盖 | 新图片与已有图片对比,覆盖相似度最低的那张 | +| **相似度算法** | 余弦相似度(特征向量) | 通过图片特征提取模型计算 | +| **覆盖前确认** | 弹窗确认 | 展示将被覆盖的图片,员工确认后执行 | + +--- + +## 九、关键技术参数 + +| 参数 | 当前值 | 状态 | +|------|--------|------| +| 重量稳定判定:波动阈值 | < 5g | 已确认 | +| 重量稳定判定:持续时间 | 3 秒 | 已确认 | +| AI 识别置信度阈值(自动开餐) | ≥ 80% | 已确认 | +| 补餐触发最小重量增量 | 100g | 已确认 | +| 人脸识别超时时间 | 无限制 | 已确认 | +| 排班表时间段配置 | 工作日 09:00~18:00 | 后端默认,前端暂不配置 | + +--- + +## 十、变更日志 + +| 日期 | 版本 | 变更内容 | +|------|------|---------| +| 2026-06-10 | v1.0 | 初始创建,覆盖 6 个页面的基础需求描述 | +| 2026-06-10 | v1.0 | 新增采样库核心规则:反样本机制 + 50 张上限与相似度覆盖策略 | +| 2026-06-10 | v2.0 | 重构 PRD:按员工端流程重写(初始化秤体 → 采样 → 采样维护 → 开餐 → 补餐),明确两种减重方式差异,明确买家取餐流程与开餐绑定关系,明确采样历史仅支持删除+新增、不可编辑 | +| 2026-06-11 | v2.1 | 去掉「新建餐品」功能:餐品全部由后端数据库预置,采样页面仅做选择关联;设置页去掉环境切换和餐品采样入口,仅保留两个减重入口;身份判定逻辑明确为「排班表+人脸匹配」,排班角色细分后期实现;买家取餐每次均需重新人脸识别;补餐最小增量 100g;设置页减重卡片副标题去掉「一次性/多次」提示,初始显示 0 克 | +| 2026-06-11 | v2.2 | 采样保存提交字段确认:餐品 ID + 采集图片列表 + 采样时间 + 操作员工 ID + 菜品重量;明确重新采样(清空全部图片覆盖式重采)与补充采集(追加式,最多 9 张)的区别;修复 06 采样历史页面补充采集跳转路径 Bug(06→05);补充采集自动选中餐品无需手动选择;去掉「全部清空」操作 | +| 2026-06-11 | v2.3 | 采样页面新增「保存并继续」按钮(提交后留在当前页继续采集下一个餐品);「保存采集」按钮改为跳转至 02-待取餐界面(携带 dishId);补充采集模式隐藏「保存并继续」按钮;新增全局按钮 Toast 反馈规则(所有按钮操作均需 Toast 反馈成功/失败状态) | +| 2026-06-11 | v2.4 | 06 采样历史详情弹窗重新布局:餐品信息(品类·主食材·热量)放左侧,采样数量仿 01 识别率徽章样式置于右上角,采样时间单独置于最右侧 | +| 2026-06-11 | v2.5 | 06 采样历史详情弹窗优化:采样数量徽章由纵向排列改为横向排列(数字 + 「张」同行显示);采样时间由单行改为日期 / 时间两行显示 | +| 2026-06-11 | v2.6 | 01 开餐界面流程补全:开餐成功自动提交 1 张图片到采样库并跳转至 02-待取餐界面(携带 dishId);修复采样页面返回时 sampleDishId 参数未处理导致不自动选中的 BUG;新增非员工点击设置按钮拦截(Toast 提示「非餐厅员工,无权操作系统」);明确自动选中规则(AI 识别选中识别率最高、搜索选中第一个结果、采样返回自动选中对应餐品);补全重量稳定判定(波动 < 5g 持续 3 秒)到开餐流程描述;明确营养秤开机默认进入 01-开餐界面 | +| 2026-06-11 | v2.7 | 全局返回路径规则:从哪来回哪去;04 设置界面新增「开始开餐」按钮和「采样历史」入口,返回按钮改为回 01;05 采样页「取消」操作改为回到 02 待取餐界面,「保存采集」同样跳转 02;05/06 返回按钮改为 history.back()(遵循从哪来回哪去);02/03 页面餐品信息区域增加点击进入 01 开餐界面的交互;02 页面补全 dishId 参数处理 + 自动人脸识别触发(站在设备前自动识别)+ 识别成功跳转 03 + 新增设置按钮(非员工拦截);03 设置按钮修复跳转 04 + 非员工拦截;06 采样历史新增 04 设置页面入口;人脸识别明确为自动触发,无需手动摄像头入口;01 开餐界面候选餐品默认读取当天餐谱,搜索时才全量搜索 | diff --git a/other-module/canteen-device/canteen-nutrition-scale/index.html b/other-module/canteen-device/canteen-nutrition-scale/index.html new file mode 100644 index 0000000..705158d --- /dev/null +++ b/other-module/canteen-device/canteen-nutrition-scale/index.html @@ -0,0 +1,148 @@ + + + + + + 餐线营养秤 - 蚁熊智能餐养平台 + + + + +
+ ◀ 返回 + 餐线营养秤 +
+ +
+ + 🍽️ +
+
开餐界面
+
开餐操作、今日菜品概览与就餐引导
+
+ +
+ + 📋 +
+
餐品展示界面
+
菜品详情、营养成分与热量展示
+
+ +
+ + 🧾 +
+
取餐界面(单屏)
+
取餐确认、订单生成与营养报告
+
+ +
+ + 🖥️ +
+
取餐界面(双屏·大屏 1280×720)
+
大屏取餐信息展示、用户信息与取餐记录
+
+ +
+ + 📊 +
+
取餐界面(双屏·小屏 480×320)
+
小屏营养摄入柱状图与推荐热量展示
+
+ +
+ + ⚙️ +
+
设置界面
+
环境切换、设备参数配置
+
+ +
+ + 📸 +
+
餐品采样界面
+
菜品拍照采集、营养数据录入与 AI 识别匹配
+
+ +
+ + 📝 +
+
采样历史
+
历史采样记录查看、采集图片管理
+
+ +
+
+ + +