spec.md 5.0 KB

扫码桌号点餐需求文档

Feature Branch: 004-qr-table-order Created: 2026-04-30 Status: Draft Input: 用户扫码点餐,下单时订单关联餐桌码,商家根据桌号送餐

背景

餐桌码(table_qrcode)功能已实现(spec 002),包含码的创建、管理、扫码入口。本需求完成扫码到下单的最后一环:扫桌码后订单自动关联餐桌码,商家可看到桌号并送餐到对应餐桌。

用户场景与测试

用户故事 1 - 扫档口码点餐下单 (Priority: P1)

用户在摊位餐桌上扫描档口码,APP 进入该摊位菜单页,用户选商品下单,订单自动关联到该餐桌码,商家看到桌号后送餐。

Why this priority: 这是最核心的扫码点餐流程,覆盖最常见场景。

Independent Test: 创建一个档口码,扫码进入菜单,下单后检查订单是否包含正确的 tableId 和 tableNum。

Acceptance Scenarios:

  1. Given 一个已启用的档口码(type=0)存在, When 用户扫码进入菜单并下单, Then 订单的 tableId 关联到该码,tableNum 为码记录中的桌号,订单 type=2(堂食)
  2. Given 一个已停用的档口码, When 用户扫码后尝试下单, Then 系统拒绝并提示餐桌码已停用

用户故事 2 - 扫通用码点餐下单 (Priority: P2)

用户在夜市公共餐桌上扫描通用码,APP 显示该夜市所有摊位,用户选择摊位后进入菜单,下单时订单关联到该公共餐桌码。

Why this priority: 夜市公共餐桌场景,用户需要额外选择摊位步骤,是第二常见的流程。

Independent Test: 创建一个通用码(type=1),扫码进入摊位列表,选择摊位下单,检查订单包含正确的 tableId。

Acceptance Scenarios:

  1. Given 一个已启用的通用码(type=1)存在, When 用户扫码、选择摊位、下单, Then 订单的 tableId 关联到该通用码,tableNum 为码记录中的桌号
  2. Given 通用码关联的夜市下有多个摊位, When 用户选择不同摊位分别下单, Then 每个订单的 tableId 都指向同一个通用码

用户故事 3 - 商家查看堂食订单桌号 (Priority: P3)

商家在订单列表中看到堂食订单的桌号信息,据此送餐到对应餐桌。

Why this priority: 这是商家侧的必要展示,但实现简单(数据已有,只需前端展示)。

Independent Test: 创建一个带桌号的堂食订单,商家端查看该订单,确认桌号正确显示。

Acceptance Scenarios:

  1. Given 存在一个带桌号的堂食订单, When 商家查看订单详情, Then 订单中显示桌号(如"A01")
  2. Given 存在一个非堂食订单(外送/自取), When 商家查看订单详情, Then 订单中桌号字段为空,不显示桌号

Edge Cases

  • 用户扫了一个已被删除的餐桌码的二维码:下单时应报错"餐桌码不存在"
  • 用户扫码后中途退出 APP 再回来:前端丢失 tableId 参数,按普通下单处理(tableId 为空)
  • 同一桌多人各自扫码下单:每次独立下单,各自订单都带同一个 tableId,不做合并或冲突检测

需求

功能需求

  • FR-001: 下单接口 MUST 接受可选的 tableId 参数,关联到 table_qrcode 记录
  • FR-002: 当 tableId 不为空时,系统 MUST 校验该码存在且未停用,不存在或已停用则拒绝下单
  • FR-003: 当 tableId 不为空时,系统 MUST 以码记录中的 tableNo 作为订单的 tableNum,忽略前端传入值,确保数据一致性
  • FR-004: 当 tableId 为空时,按现有流程正常下单,不做额外校验
  • FR-005: 商家端订单详情 MUST 展示堂食订单的桌号信息

关键实体

  • PosOrder(订单): 新增 tableId 字段,关联餐桌码记录。已有 tableNum 字段存储桌号。
  • OrderParent(父订单): 同样新增 tableId 字段,与子订单保持一致。
  • TableQrcode(餐桌码): 已有实体,本需求不改动其结构。

成功标准

可衡量结果

  • SC-001: 扫桌码下单后,订单的 tableId 和 tableNum 正确关联到对应餐桌码记录
  • SC-002: 非扫码下单(tableId 为空)不受影响,现有流程正常运作
  • SC-003: 传入无效或已停用的 tableId 时,系统在 1 秒内返回明确的错误提示
  • SC-004: 商家端能正确显示堂食订单的桌号

假设

  • 用户必须已下载 APP 并登录才能扫码点餐(不做 H5/游客模式)
  • 前端负责在扫码后的整个点餐流程中携带 tableId,直到下单时传入
  • 不做餐桌状态管理(不追踪占用/空闲)
  • 不做多次加餐/拼单功能
  • 不做按桌号分组查询,只在订单上显示桌号
  • 现有下单接口(/system/userOrder/createOrder)已处理 tableNum,本需求新增 tableId

不在范围内

  • 餐桌占用状态管理
  • 多次加餐、拼单、合并订单
  • 按桌号分组的订单视图
  • 扫码频率限制
  • C 端扫码页面开发(仅后端接口改动)