餐饮预约点餐系统的核心目标,是把“点餐 + 预约 + 支付 + 出餐/履约”统一到一个闭环里,让用户可以更快完成下单,商家可以更高效处理订单。
从技术角度来看,本质就是一套“订单驱动系统 + 状态流转 + 多角色协同”的业务系统。
下面我们用一个更接近真实项目的方式,从0到1拆解,并给出关键代码示例。
一、系统核心架构(先理解结构)
一个标准餐饮系统通常包含四个核心模块:
- 用户端(小程序 / H5)
- 商家端(管理后台)
- 订单中心(核心服务)
- 支付与履约服务(支付 + 配送 +预约)
核心思想只有一句话:
所有业务都围绕“订单状态流转”展开
二、订单数据结构设计(核心)
先定义订单结构,这是整个系统的“中枢”。
const OrderStatus = {
CREATED: "created", // 已创建
PAID: "paid", // 已支付
RESERVED: "reserved", // 已预约
PREPARING: "preparing", // 制作中
READY: "ready", // 已出餐
DELIVERING: "delivering", // 配送中
COMPLETED: "completed", // 已完成
CANCELED: "canceled" // 已取消
};
const OrderType = {
DINE_IN: "dine_in", // 到店预约
DELIVERY: "delivery" // 外卖配送
};
订单模型:
const order = {
orderId: "ORD123456",
userId: "U10001",
shopId: "S20001",
type: OrderType.DELIVERY, // 或 dine_in
items: [
{
productId: "P001",
name: "牛肉饭",
price: 28,
quantity: 2
}
],
totalAmount: 56,
reservationTime: null, // 到店预约才有
address: null, // 外卖才有
status: OrderStatus.CREATED,
createdAt: Date.now()
};
三、核心接口设计(Node.js示例)
1. 创建订单
app.post("/order/create", async (req, res) => {
const {
userId, shopId, items, type, reservationTime, address } = req.body;
const totalAmount = items.reduce((sum, item) => {
return sum + item.price * item.quantity;
}, 0);
const order = {
orderId: generateOrderId(),
userId,
shopId,
items,
type,
reservationTime: type === "dine_in" ? reservationTime : null,
address: type === "delivery" ? address : null,
totalAmount,
status: "created",
createdAt: Date.now()
};
await db.order.insert(order);
res.json({
success: true,
data: order
});
});
2. 支付成功回调(关键)
支付是订单状态的分水岭。
app.post("/payment/callback", async (req, res) => {
const {
orderId, payStatus } = req.body;
if (payStatus === "success") {
await db.order.update(orderId, {
status: "paid"
});
}
res.send("ok");
});
3. 商家接单与出餐
app.post("/order/accept", async (req, res) => {
const {
orderId } = req.body;
await db.order.update(orderId, {
status: "preparing"
});
res.json({
success: true });
});
出餐:
app.post("/order/ready", async (req, res) => {
const {
orderId } = req.body;
await db.order.update(orderId, {
status: "ready"
});
res.json({
success: true });
});
4. 配送状态更新(外卖)
app.post("/order/deliver", async (req, res) => {
const {
orderId } = req.body;
await db.order.update(orderId, {
status: "delivering"
});
res.json({
success: true });
});
四、预约逻辑(核心区别点)
预约本质不是订单,而是“时间资源占用”。
function checkReservation(shopId, timeSlot) {
const count = db.order.count({
shopId,
reservationTime: timeSlot,
status: {
$in: ["reserved", "paid", "preparing"] }
});
return count < MAX_TABLE_LIMIT;
}
创建预约订单:
if (type === "dine_in") {
const available = checkReservation(shopId, reservationTime);
if (!available) {
throw new Error("该时间段已满");
}
}
五、前端核心逻辑(简化示例)
1. 下单逻辑(统一入口)
function submitOrder() {
const orderType = this.type; // delivery / dine_in
const payload = {
items: this.cart,
type: orderType
};
if (orderType === "delivery") {
payload.address = this.address;
}
if (orderType === "dine_in") {
payload.reservationTime = this.timeSlot;
}
api.createOrder(payload).then(res => {
console.log("下单成功", res);
});
}
六、系统核心:状态流转图(逻辑关键)
订单流转:
创建订单
↓
支付成功
↓
商家接单
↓
制作中
↓
(外卖)配送中 / (预约)等待到店
↓
完成
七、系统设计重点(比代码更重要)
1. 一定要统一订单模型
外卖和预约不要做两套系统,本质只是:
- 时间不同
- 履约方式不同
2. 状态必须统一
否则会出现:
- 外卖一套状态
- 预约一套状态
- 商家端无法管理
3. 所有业务围绕订单
不要让“预约”“外卖”“堂食”成为独立系统
八、进阶优化方向(上线后必须做)
- 订单队列(高峰期削峰)
- 自动接单机制
- 桌位智能分配
- 配送路径优化
- 会员与复购体系
- 营销活动系统

结语
餐饮预约点餐系统的核心不是功能多,而是:
用一套订单系统,统一所有消费场景
代码只是实现方式,真正关键是把“预约”和“外卖”统一成同一个逻辑体系,这才是从0到1搭建系统的核心思路。