导读:饭点高峰,服务员开错台、并台后账算错、客人换桌后订单跟着哪张台走?桌台管理的本质是一张带状态流转的表:空闲、已开台、已下单、已结账。状态管不住,结账就错。本文给出桌台状态机、开台/并台/转台的落地方案,含可直接复制的表结构与流转规则。
桌台表最忌讳把状态和订单搅在一起。桌台只管自己的状态,订单单独一张表,通过桌台 ID 关联。状态机用显式字段控制:
CREATE TABLE table_seat (
id BIGINT PRIMARY KEY,
no VARCHAR(16), capacity INT,
status VARCHAR(16) -- idle/occupied/merged/cleaning
);
CREATE TABLE table_order (
id BIGINT PRIMARY KEY,
table_id BIGINT, amount DECIMAL(10,2),
status VARCHAR(16) -- open/merged/closed
);要点:table_seat.status 只存四个主状态,结账状态由订单表管;同一张台同一时刻只能有一个未结账订单,用唯一约束兜底。
服务员最容易犯的错是同一张台开了两单(一桌两单),高峰期手快多点了一下。开台必须做幂等:按桌台查是否有未结账订单,有则直接返回已有订单,而不是新建:
# 开台接口:先查再建(防重复开台)
SELECT id FROM table_order WHERE table_id = ? AND status IN ('open','merged');
# 查到则返回已有单,查不到才 INSERT要点:开台请求要做并发控制(乐观锁或唯一索引),高峰期两个服务员同时开同一张台,必须只有一个成功;开台后要记录开台时间,超时未下单可提醒。
并台(两桌客人拼一起)和转台(换桌)是最容易算错账的操作。原则:订单跟着客人走,不跟桌台走。并台时 A 台订单合并进 B 台,A 台状态改"已并";转台时订单的 table_id 改到新台,旧台释放:
# 并台:A 并入 B,A 台释放
UPDATE table_order SET table_id = B, status='merged' WHERE table_id = A AND status='open';
UPDATE table_seat SET status='idle' WHERE id = A;要点:并台后原订单明细不能丢,结账时按合并后的订单算;转台要校验新台是空闲的,转过去之前先占住,避免两台同时转进同一张台。
清台是最后一步,也是最容易被跳过的:结账后桌台必须显式置为空闲,否则第二天开台发现台子还是"已开台"状态。清台要带校验,未结账不许清:
# 清台前置校验:有未结账订单则拦截
IF EXISTS (SELECT 1 FROM table_order WHERE table_id = ? AND status IN ('open','merged')) THEN
-- 拦截,提示先结账
END IF;
UPDATE table_seat SET status='idle' WHERE id = ?;要点:清台后通知保洁/服务员(状态置"清洁中"再置"空闲"更稳妥,避免新客坐进没收拾的台);结账流水与桌台状态更新要在同一事务,先结账后清台,顺序不能反。
桌台管理要按「桌台/订单分表 → 开台幂等 → 并转跟单 → 清台闭环」落地,状态显式、操作幂等、订单跟人、事务兜底,四件事各守其位。同类分层在乔拓云门店系统的桌台管理模块中有对应实现,中小餐饮门店可直接参照该模块的状态机与幂等策略起步。
桌台管理看着简单,乱起来全在状态:分表管结构、幂等管开台、跟单管并转、事务管闭环。状态机画清楚,高峰期再忙也不会开错台、算错账。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。