Files
workspace/code/app/MEAL_ORDER_DESIGN.md
T
2026-06-29 17:40:26 +08:00

27 KiB

家庭点菜与餐食安排子模块设计文档

1. 背景

在现有家庭 App 中新增「点菜」子模块,用于维护家庭共享的菜品库,并支持家庭成员快速安排今日/明日餐食、发起点菜、处理点菜、驳回点菜、标记完成等协作流程。

本模块先按 App 内工具设计,不做营销页。界面重点应是菜品查找顺手、点菜动作明确、待处理状态清晰。

2. 目标

  • 录入菜品,形成家庭共享的菜品库。
  • 给菜品维护分类、标签、图片、食材、做法等信息。
  • 家庭成员可以从菜品库中点菜,形成待处理点菜记录。
  • 点菜支持通过、驳回、取消、标记完成等状态流转。
  • 可以快速设置今天、明天或指定日期的餐食安排,餐段由家庭自定义,方便家庭备餐。
  • 后续可扩展到一周餐食计划、采购清单、菜品偏好统计。

3. 非目标

第一期暂不做:

  • 外卖/餐厅下单。
  • 在线支付。
  • 商家、桌台、排队叫号。
  • 多家庭公开餐食分享。
  • AI 自动生成菜谱。
  • 自动营养分析和热量计算。
  • 库存扣减和复杂采购管理。
  • 严格厨师/管理员权限模型。
  • 菜品复杂 SKU,例如大小份、辣度、加料价格。

这些能力可以作为后续扩展,不进入第一版主流程。

4. 核心用户故事

菜品管理

  • 作为用户,我可以新增一道菜,上传图片,填写名称、分类、标签、食材、做法和备注。
  • 作为用户,我可以按分类、标签、关键词筛选菜品。
  • 作为用户,我可以编辑或删除已录入的菜品。
  • 作为用户,我可以停用不常做的菜,而不是必须删除。
  • 作为用户,我可以收藏或置顶常吃菜,方便快速点菜。

点菜管理

  • 作为用户,我可以从菜品库中选择一道或多道菜发起点菜。
  • 作为用户,我可以填写期望日期、餐段、份数、备注。
  • 作为用户,我可以查看自己点过的菜和当前处理状态。
  • 作为处理人,我可以通过点菜申请。
  • 作为处理人,我可以驳回点菜申请,并填写驳回原因。
  • 作为处理人,我可以把已通过的点菜标记为已完成。
  • 作为点菜人,我可以在未处理前取消自己的点菜。

餐食安排视图

  • 作为用户,我可以查看今天点了哪些菜。
  • 作为用户,我可以直接设置今天每个餐段吃什么。
  • 作为用户,我可以直接切到明天,设置明天各餐段的餐食安排。
  • 作为用户,我可以查看待处理、已通过、已驳回、已完成的点菜记录。
  • 作为用户,我可以按日期查看历史餐食安排。
  • 作为用户,我可以从历史餐食安排中再次点菜。

分类/标签管理

  • 作为用户,我可以维护菜品分类,例如家常菜、汤、主食、早餐、甜品、饮品。
  • 作为用户,我可以维护父子标签,例如父标签“口味”下有“微辣、清淡”,父标签“食材”下有“牛肉、鸡蛋”。
  • 作为用户,我可以给菜品添加多个标签,例如微辣、牛肉、蒸、儿童友好、快手菜。
  • 分类保持单层,标签支持两级父子结构。

5. 信息架构

建议一级入口叫「点菜」或「餐食」。技术命名使用 meal,避免使用 menu 造成概念和路由冲突。

模块内建议 4 个主视图:

  • 菜品:菜品列表、筛选、录入入口。
  • 今日:按今天/明天和家庭自定义餐段快速设置餐食安排。
  • 点菜:查看待处理点菜、处理通过或驳回。
  • 管理:菜品分类、父子标签维护。

第一期建议把「今日」作为默认首页,优先展示家庭当天餐食安排。用户进入模块后先看到当天启用的餐段卡片,可以一键加菜或调整。点菜处理放在第二入口,避免主流程过重。

5.1 已确认/暂定规则

  • 子模块默认是家庭共享,不做个人私有餐食安排。
  • 数据保存优先使用现有公共接口,例如 data/loadData、data/saveData。
  • 不新增点菜专用后端接口;只有通用接口明显无法覆盖一致性或事务要求时,再单独讨论。
  • 所有业务数据必须关联 family_id。
  • 菜品图片必须上传,不允许无图菜品。
  • 菜品食材建议保存为结构化明细,支持食材名、数量、单位、规格和备注。
  • 食材明细第一版选填,不阻塞菜品保存。
  • 做法第一版仍可使用文本保存,避免录入过重。
  • 分类由用户自行创建,不做强制默认初始化。
  • 分类保持单层,不做父子结构。
  • 标签由用户自行创建,支持两级父子结构。
  • 父标签用于分组,例如口味、食材、烹饪方式、适合人群;子标签用于实际标记菜品。
  • 菜品可以没有分类和标签。
  • 点菜记录必须关联菜品。
  • 点菜记录可以包含期望日期,默认是当天。
  • 餐段由家庭自定义,不写死为上午/中午/晚上。
  • 系统可以在首次进入时提供建议餐段,例如早餐、午餐、晚餐;用户确认后一键创建,后续可以修改、排序、停用或新增。
  • 餐食日期入口优先提供今天、明天两个快捷选项,再提供日期选择。
  • 快速设置今天/明天餐食安排时,不进入审批,直接生成已安排记录。
  • 明确从“点菜”入口提交的记录才进入待处理,支持通过、驳回、取消。
  • 一次点菜允许选择多道菜。
  • 点菜记录支持设置做饭人 cook_by。
  • 不做预计用餐人数字段。
  • 支持从点菜或已完成记录通过小按钮进入记账模块,快速记录食材/餐饮支出。
  • 点菜状态第一期使用固定状态流转。
  • 第一版不做严格权限;家庭成员都可以处理点菜。后续如果家庭角色完善,再限制为家庭管理员或指定处理人。
  • 驳回点菜时必须填写驳回原因。
  • 删除菜品时,如果存在点菜历史,默认软删除或停用菜品,不物理删除历史引用。

5.2 简化操作原则

点菜模块以家庭日常使用为中心,第一版优先保证操作少、入口直观:

  • 首页默认展示「今天」,顶部提供「今天 / 明天」快捷切换。
  • 每天按家庭启用的餐段展示餐食区块。
  • 每个区块直接提供“加菜”入口,不要求用户先进入复杂表单。
  • 选择菜品后默认数量为 1,可以直接保存。
  • 点菜备注、数量、驳回原因等字段只在需要时展开。
  • 菜品录入必须填写菜名并上传图片,食材、做法、标签可以后续补充。
  • 分类和标签管理放到管理页,不打断日常点菜和排餐。

5.3 点菜状态流转

第一版状态建议:

  • 0 草稿:预留状态,第一版可以不暴露。
  • 1 待处理:用户提交点菜后进入此状态。
  • 2 已通过/已安排:处理人确认可以做,或用户直接设置到餐食安排。
  • 3 已驳回:处理人驳回,需要记录驳回原因。
  • 4 已完成:菜已经做完或已安排完成。
  • 5 已取消:点菜人主动取消。

推荐流转:

  • 待处理 -> 已通过。
  • 待处理 -> 已驳回。
  • 待处理 -> 已取消。
  • 已通过/已安排 -> 已完成。
  • 已通过/已安排 -> 已取消。

第一版不建议支持从已驳回、已完成回退状态,避免历史记录混乱。后续如果需要,可以通过新增操作日志表达更复杂的撤回和重开。

6. 数据对象草案

菜品 b_meal_dish

字段草案:

  • id
  • family_id
  • name
  • image_file_key
  • category_id
  • ingredient_summary
  • steps
  • cooking_time_minutes
  • difficulty
  • remark
  • status
  • sort_number
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • family_id:菜品属于家庭空间。
  • image_file_key:菜品图片,走现有 S3 规则。
  • image_file_key 必填。
  • ingredient_summary:食材摘要,选填,用于列表或详情快速展示;真正的食材和规格保存到 b_meal_dish_ingredient。
  • steps:做法说明,第一版可用文本保存。
  • cooking_time_minutes:预计用时,单位分钟,选填。
  • difficulty:难度,建议 1 简单、2 普通、3 复杂。
  • status:建议 1 启用,0 停用。

菜品分类 b_meal_category

字段草案:

  • id
  • family_id
  • name
  • sort_number
  • status
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • 分类只用于菜品。
  • 分类保持单层,不设置 parent_id。
  • 示例:家常菜、汤、主食、早餐、甜品、饮品。

菜品食材 b_meal_dish_ingredient

字段草案:

  • id
  • family_id
  • dish_id
  • name
  • quantity
  • unit
  • spec
  • remark
  • sort_number
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • 一道菜可以维护多条食材。
  • name:食材名称,例如土豆、牛肉、鸡蛋。
  • quantity:数量,选填,建议用 NUMERIC,例如 2、300、0.5。
  • unit:单位,选填,例如 个、克、斤、勺、适量。
  • spec:规格,选填,例如 去皮、切块、五花肉、带骨、约 200g/个。
  • remark:补充说明,选填,例如 可替换成鸡腿肉。
  • 第一版不做独立食材库,不要求把“土豆”维护成主数据,减少录入成本。
  • 第一版不做库存扣减。
  • 后续生成采购清单时,可以按 name + unit + spec 聚合,再由用户手动确认合并。

标签 b_meal_tag

字段草案:

  • id
  • family_id
  • parent_id
  • name
  • icon
  • sort_number
  • status
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • parent_id 为空表示父标签,例如口味、食材、烹饪方式、适合人群。
  • parent_id 指向父标签时表示子标签,例如微辣、牛肉、蒸、儿童友好。
  • 第一版只支持两级结构,不做无限层级。
  • 菜品一般关联子标签;如果用户只建了父标签,也允许直接关联父标签,降低操作门槛。
  • icon 第一版可选,用于保存 iconfont/lucide 图标名;不建议用表情作为主要 UI 图标。

菜品标签关联 b_meal_dish_tag

字段草案:

  • id
  • family_id
  • dish_id
  • tag_id
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • 一道菜可以有多个标签。
  • 查询菜品列表时可以通过该表做标签筛选。

点菜记录 b_meal_order

字段草案:

  • id
  • family_id
  • source_type
  • order_date
  • meal_slot_id
  • status
  • remark
  • reject_reason
  • requested_by
  • cook_by
  • handled_by
  • handled_time
  • completed_time
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • source_type:来源类型,建议 0 快速排餐、1 点菜申请。
  • order_date:期望吃这顿的日期,默认当天。
  • meal_slot_id:餐段 ID,指向 b_meal_slot。
  • status:点菜记录状态。
  • remark:点菜人备注。
  • reject_reason:驳回原因,仅驳回时必填。
  • requested_by:点菜人,通常等于 create_by,单独保存便于查询。
  • cook_by:做饭人,选填,指向家庭成员用户。
  • handled_by:通过或驳回的人。
  • handled_time:通过或驳回时间。
  • completed_time:标记完成时间。

餐段 b_meal_slot

字段草案:

  • id
  • family_id
  • name
  • sort_number
  • status
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • 餐段属于家庭空间,可自定义。
  • 示例:早餐、午餐、晚餐、夜宵、加餐、周末早午餐。
  • status:建议 1 启用,0 停用。
  • 第一版不要求设置开始/结束时间,只按排序展示。
  • 不强制初始化默认数据;没有餐段时,前端提供“创建推荐餐段”快捷操作。
  • 如果后续需要按时间自动推荐餐段,可以再增加 start_time、end_time。

点菜明细 b_meal_order_item

字段草案:

  • id
  • family_id
  • order_id
  • dish_id
  • quantity
  • remark
  • sort_number
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • 一个点菜记录可以包含多道菜。
  • quantity 第一版表示份数或数量,默认 1。
  • 明细独立保存,方便一次点多道菜。

点菜操作记录 b_meal_order_log

字段草案:

  • id
  • family_id
  • order_id
  • action
  • from_status
  • to_status
  • reason
  • operator_id
  • create_time
  • update_time
  • create_by
  • update_by

说明:

  • action 建议记录 submit、approve、reject、cancel、complete。
  • 第一版可以先建表并写入关键操作,方便后续做时间线。
  • 如果第一期工期紧,可以暂缓页面展示操作记录,但保存记录仍有价值。

7. 第一版流程

新增菜品

  1. 进入「点菜」的「菜品」页。
  2. 点击新增。
  3. 填写菜名并上传图片。
  4. 可选填写分类、标签、食材明细、做法、预计用时、备注。
  5. 保存菜品。
  6. 返回菜品列表并刷新。

校验规则:

  • 菜名必填。
  • 图片必填。
  • 分类可以为空。
  • 标签可以为空。
  • 食材明细可以为空。
  • 预计用时如果填写,必须大于 0。

快速设置餐食安排

  1. 进入「今日」页。
  2. 默认选中今天。
  3. 页面按家庭启用餐段展示餐食区块。
  4. 点击某个区块的加菜。
  5. 从菜品库选择一道或多道菜。
  6. 直接保存到该日期和餐段。
  7. 可选设置做饭人。
  8. 切换到明天,可以用同样方式设置明天餐食。

校验规则:

  • 至少选择 1 道菜。
  • 日期默认今天,也可以快捷切换明天。
  • 餐段必填,来自家庭自定义餐段。
  • 数量默认 1,不强制用户填写。
  • 快速设置餐食生成 source_type = 0 的记录,状态直接为已通过/已安排。

新增菜品并加入餐食安排

  1. 在某个日期/餐段区块点击加菜。
  2. 如果菜品库里没有目标菜,可以点击新增菜品。
  3. 填写菜名并上传图片。
  4. 保存菜品。
  5. 新菜品自动加入当前日期/餐段餐食安排。

校验规则:

  • 菜名必填。
  • 图片必填。
  • 分类可以为空。
  • 标签可以为空。

发起点菜

  1. 进入菜品列表。
  2. 选择一道或多道菜。
  3. 点击点菜。
  4. 默认选择今天和当前推荐餐段,也可以切到明天或其他餐段。
  5. 可选填写份数、做饭人和备注。
  6. 提交后生成点菜记录和点菜明细。
  7. 点菜记录状态为待处理。

校验规则:

  • 至少选择 1 道菜。
  • 期望日期必填,默认当天。
  • 餐段必填,默认选择当前推荐餐段或第一个启用餐段。
  • 每个明细数量必须大于 0。
  • 点菜申请生成 source_type = 1 的记录,状态为待处理。

处理点菜

  1. 进入「点菜」或「今日」页。
  2. 查看待处理点菜。
  3. 点击通过,状态变为已通过。
  4. 点击驳回,需要填写驳回原因,状态变为已驳回。
  5. 已通过的点菜可以标记完成。

校验规则:

  • 驳回原因必填。
  • 已驳回、已完成的点菜不允许再次处理。
  • 操作后写入点菜操作记录。

取消点菜

  1. 点菜人进入自己的点菜记录。
  2. 对待处理或已通过的点菜点击取消。
  3. 状态变为已取消。
  4. 写入点菜操作记录。

校验规则:

  • 已完成的点菜不允许取消。
  • 已驳回的点菜不需要取消。

今日/明日餐食安排

  1. 进入「今日」页。
  2. 默认按家庭启用餐段展示今天餐食安排。
  3. 顶部切换到明天,按同样餐段展示明天餐食安排。
  4. 支持继续打开日期选择器查看其他日期。
  5. 每个餐段区块支持加菜、移除菜、再次点菜。
  6. 可从历史记录中再次点菜。

快速记账

  1. 在点菜详情或已完成记录上点击记账按钮。
  2. 弹出或跳转到现有记账新增能力。
  3. 默认带入菜品名称、餐段和备注,例如“餐食:番茄炒蛋、排骨汤”。
  4. 保存成功后返回点菜详情或今日页。

校验规则:

  • 记账入口只是快捷入口,不强制每条点菜记录都记账。
  • 记账保存逻辑复用现有记账模块。

8. MVP 范围建议

第一期建议做:

  • 菜品 CRUD。
  • 菜品分类自定义。
  • 菜品父子标签自定义。
  • 菜品图片上传,图片必填。
  • 菜品食材明细维护,支持数量、单位、规格。
  • 菜品列表关键词、分类、标签筛选。
  • 今天/明天餐食快捷设置。
  • 家庭自定义餐段。
  • 发起点菜,支持一次选择多道菜。
  • 点菜支持设置做饭人。
  • 点菜待处理列表。
  • 点菜通过、驳回、取消、完成。
  • 今日/明日餐食视图。
  • 点菜操作记录保存。
  • 点菜详情或已完成记录提供快速记账按钮。

第一期暂缓:

  • AI 菜谱生成。
  • 一周餐食自动规划。
  • 采购清单生成和食材合并。
  • 营养、热量、过敏原分析。
  • 严格权限控制。
  • 菜品评分和偏好统计。
  • 菜品复杂 SKU。
  • 点菜消息推送。
  • 餐段开始/结束时间和自动提醒。

9. 剩余待确认问题

  • 「点菜」是否需要只有家庭管理员或指定成员才能通过/驳回?
  • 是否需要把通过后的点菜自动加入一周餐食计划?

10. 初步技术建议

  • 数据库建议新增独立表,全部使用 b_meal_ 前缀。
  • 所有新业务表都包含审计字段,符合项目现有规则。
  • 菜品、食材明细、分类、父子标签、餐段、点菜记录、点菜明细、操作记录保存优先复用 data/saveData。
  • 查询优先使用 data/loadData 和 data/loadDataPage。
  • 今日/明日餐食可以用 loadDataBySql 做菜品、点菜记录、明细的聚合查询;第一版也可以前端分别查询后组合。
  • 删除菜品时优先软删除,避免破坏历史点菜记录。
  • 点菜通过/驳回/完成建议在前端用一次 saveData 批量更新点菜记录并插入操作日志。
  • 如果后续要求状态流转强一致和权限校验,再考虑增加通用状态流转 helper,不做点菜专用接口。
  • 图片上传复用现有 S3 上传接口。
  • 前端状态可以新增 meal store,负责菜品、分类、标签、点菜记录缓存。
  • 快速记账按钮复用现有记账模块新增能力,不在点菜模块内重复实现记账逻辑。
  • UI 使用 HeroUI Native、lucide-react-native、@legendapp/list、sonner-native;样式使用 Uniwind className。
  • 保存、处理、驳回、取消、完成等异步操作统一使用 useLoading + LoadingOverlay。

11. 页面建议

建议路由:

  • app-rn/src/app/meal/(tabs)/_layout.tsx
  • app-rn/src/app/meal/(tabs)/home/index.tsx
  • app-rn/src/app/meal/(tabs)/orders/index.tsx
  • app-rn/src/app/meal/(tabs)/manage/index.tsx
  • app-rn/src/app/meal/dish/edit/index.tsx
  • app-rn/src/app/meal/dish/detail/[id]/index.tsx
  • app-rn/src/app/meal/order/edit/index.tsx
  • app-rn/src/app/meal/order/detail/[id]/index.tsx

说明:

  • home:菜品库。
  • today:可以作为 home 页顶部默认区域,展示今天/明天餐食安排。
  • orders:点菜处理列表。
  • manage:分类和标签维护。
  • dish/edit:新增/编辑菜品。
  • order/edit:发起点菜。
  • order/detail:查看状态、通过、驳回、取消、完成。

12. 下一步

下一步可以进入:

  1. 确认点菜处理权限。
  2. 数据库表结构设计。
  3. 页面与交互流程设计。
  4. 公共接口调用方案设计。
  5. 第一版任务拆分。

13. 实施计划

说明:

  • 每一步完成后,把 [ ] 改成 [x]。
  • 严格按阶段推进,前一阶段没有确认前,不进入下一阶段。
  • 默认优先使用通用接口;遇到通用接口明显无法覆盖的场景,再单独讨论是否增加通用 helper。

阶段 1:数据库表结构

  • 设计 b_meal_dish 表结构。
  • 设计 b_meal_dish_ingredient 表结构,保存食材名称、数量、单位、规格。
  • 设计 b_meal_category 表结构。
  • 设计 b_meal_tag 表结构,包含 parent_id 支持父子标签。
  • 设计 b_meal_dish_tag 表结构。
  • 设计 b_meal_slot 表结构,支持家庭自定义餐段。
  • 设计 b_meal_order 表结构,包含 source_type、meal_slot_id、cook_by。
  • 设计 b_meal_order_item 表结构。
  • 设计 b_meal_order_log 表结构。
  • 补充索引设计,例如 family_id/status/order_date/meal_slot_id/sort_number。
  • 生成 SQL 文件并确认命名、字段类型、默认值。
  • 执行 SQL 到 dev 数据库并验证表已创建。

产出文件:

  • app-go/db/meal.sql

验收标准:

  • 表名全部使用 b_meal_ 前缀。
  • 所有业务表包含审计字段。
  • 点菜历史不会因为菜品删除而丢失。
  • 食材明细可以支持后续采购清单生成。
  • 状态字段能覆盖待处理、已通过、已驳回、已完成、已取消。
  • 快速排餐可以不经过审批,直接进入已通过/已安排状态。
  • 餐段可以按家庭自定义、排序和停用。

阶段 2:前端基础模型与公共接口封装

  • 新增菜品、食材明细、分类、父子标签、餐段、点菜记录、点菜明细、操作记录 TypeScript 类型。
  • 新增 meal store,管理点菜模块缓存。
  • 在 meal store 中封装基于公共接口的查询方法。
  • 在 meal store 中封装基于公共接口的保存方法。
  • 在 meal store 中封装图片上传复用逻辑。
  • 在 app-rn/src/store/index.ts 导出 meal store。
  • 不新增 services 层,避免重复封装。

产出文件:

  • app-rn/src/types/meal.ts
  • app-rn/src/store/meal.ts
  • app-rn/src/store/index.ts

验收标准:

  • 前端类型和数据库字段一致。
  • 查询和保存优先使用现有 loadData、loadDataPage、saveData。
  • 所有查询都按 family_id 过滤。

阶段 3:子应用入口与基础导航

  • 新增点菜应用图标。
  • 在 app-rn/src/configs/pages.ts 注册点菜子应用。
  • 新增 meal/(tabs)/_layout.tsx。
  • 新增菜品、点菜、管理底部 Tab,菜品页默认展示今天/明天餐食入口。
  • 确认子模块使用 ModuleLayout。

产出文件:

  • app-rn/src/components/iconfont/IconAppMeal.tsx
  • app-rn/src/components/iconfont/index.tsx
  • app-rn/src/configs/pages.ts
  • app-rn/src/app/meal/(tabs)/_layout.tsx

验收标准:

  • 首页工具列表可以进入点菜模块。
  • 点菜模块底部 Tab 能正常切换。

阶段 4:菜品管理

  • 新增菜品列表页。
  • 支持关键词搜索。
  • 支持按分类筛选。
  • 支持按标签筛选。
  • 新增菜品编辑页。
  • 支持菜品图片上传,图片必填。
  • 支持维护菜品食材明细。
  • 食材明细支持名称、数量、单位、规格、备注。
  • 支持创建或选择分类。
  • 支持创建或选择父子标签。
  • 支持编辑菜品。
  • 支持停用或删除菜品。
  • 删除已有点菜历史的菜品时使用软删除。

产出文件:

  • app-rn/src/app/meal/(tabs)/home/index.tsx
  • app-rn/src/app/meal/dish/edit/index.tsx
  • app-rn/src/app/meal/dish/detail/[id]/index.tsx
  • app-rn/src/components/meal/MealDishImage.tsx

验收标准:

  • 菜名必填。
  • 无图菜品不能保存。
  • 食材明细选填,但如果填写则食材名称必填。
  • 菜品列表筛选结果正确。
  • 删除菜品不会破坏历史点菜记录。

阶段 5:分类、父子标签管理

  • 在菜品编辑流程中支持快速新建分类。
  • 在菜品编辑流程中支持快速新建父标签。
  • 在菜品编辑流程中支持在父标签下新建子标签。
  • 独立管理页支持维护分类。
  • 独立管理页支持维护父标签。
  • 独立管理页支持维护子标签。
  • 支持父标签无子标签时直接用于菜品标记。

产出文件:

  • app-rn/src/app/meal/(tabs)/manage/index.tsx

验收标准:

  • 分类单层。
  • 标签支持两级父子结构。
  • 停用分类或标签后,不影响历史菜品展示。

阶段 5.5:餐段管理

  • 独立管理页支持维护餐段。
  • 支持新增餐段。
  • 支持编辑餐段名称。
  • 支持调整餐段排序。
  • 支持停用餐段。
  • 今日页按启用餐段排序展示。

产出文件:

  • app-rn/src/app/meal/(tabs)/manage/index.tsx

验收标准:

  • 餐段由家庭自定义,不写死。
  • 停用餐段后,不影响历史点菜记录展示。
  • 没有餐段时,引导用户先创建餐段。

阶段 6:发起点菜

  • 支持从菜品列表选择单道菜点菜。
  • 支持多选菜品后批量点菜。
  • 新增点菜编辑页或 BottomSheet。
  • 支持今天/明天快捷选择。
  • 支持选择家庭自定义餐段。
  • 支持填写每道菜数量。
  • 支持选择做饭人。
  • 支持填写点菜备注。
  • 提交后创建点菜记录和点菜明细。
  • 提交后写入点菜操作记录。

产出文件:

  • app-rn/src/app/meal/order/edit/index.tsx

验收标准:

  • 至少选择一道菜才能提交。
  • 数量必须大于 0。
  • 新提交点菜状态为待处理。
  • 保存中有 LoadingOverlay。

阶段 7:点菜处理

  • 新增点菜列表页。
  • 支持按状态筛选。
  • 支持按日期筛选。
  • 新增点菜详情页。
  • 支持通过点菜。
  • 支持驳回点菜。
  • 驳回时必须填写原因。
  • 支持取消点菜。
  • 支持标记完成。
  • 所有状态操作写入点菜操作记录。

产出文件:

  • app-rn/src/app/meal/(tabs)/orders/index.tsx
  • app-rn/src/app/meal/order/detail/[id]/index.tsx

验收标准:

  • 状态流转符合文档规则。
  • 已驳回、已完成记录不允许重复处理。
  • 驳回原因能在详情页展示。

阶段 8:今日/明日餐食安排

  • 新增今日/明日餐食区。
  • 默认展示今天餐食安排。
  • 支持今天/明天快捷切换。
  • 支持打开日期选择器查看其他日期。
  • 支持按家庭自定义餐段分组展示。
  • 支持在每个餐段区块直接加菜。
  • 支持从餐段区块移除菜。
  • 支持从历史餐食安排再次点菜。
  • 支持空状态。

产出文件:

  • app-rn/src/app/meal/(tabs)/home/index.tsx

验收标准:

  • 今天和明天餐食安排能按家庭自定义餐段清晰展示。
  • 切换日期后数据正确刷新。
  • 再次点菜能复用原菜品生成新点菜记录。

阶段 8.5:快速记账入口

  • 在点菜详情或已完成记录上增加记账按钮。
  • 点击后复用现有记账新增能力。
  • 默认带入菜品名称、餐段和备注。
  • 保存成功后返回点菜详情或今日页。

产出文件:

  • app-rn/src/app/meal/order/detail/[id]/index.tsx

验收标准:

  • 快速记账不影响点菜记录状态。
  • 记账保存逻辑与现有记账模块一致。

阶段 9:收尾与体验优化

  • 补充空状态。
  • 补充加载状态。
  • 补充保存中、处理中状态。
  • 补充错误提示。
  • 检查移动端小屏布局。
  • 检查图片加载失败兜底。
  • 跑 pnpm exec oxfmt --check。
  • 跑 pnpm lint。
  • 跑 pnpm exec tsc --noEmit。
  • 根据实际结果更新本文档完成状态。

验收标准:

  • 核心流程从新增菜品到发起点菜、通过/驳回、完成可完整走通。
  • 异常状态有明确反馈。
  • 文档计划状态和代码实现保持一致。

阶段 10:后置功能

  • 一周餐食计划。
  • 采购清单生成。
  • 菜品评分和家庭偏好统计。
  • 家庭角色权限控制。
  • 点菜消息推送。
  • AI 菜谱或餐食推荐。

验收标准:

  • 后置功能不影响第一版点菜主流程。
  • 每个后置功能开始前先单独确认范围。