
餐饮预约点餐系统的核心目标,是把“点餐 + 预约 + 支付 + 出餐/履约”统一到一个闭环里,让用户可以更快完成下单,商家可以更高效处理订单。
从技术角度来看,本质就是一套“订单驱动系统 + 状态流转 + 多角色协同”的业务系统。
下面我们用一个更接近真实项目的方式,从0到1拆解,并给出关键代码示例。

一个标准餐饮系统通常包含四个核心模块:
核心思想只有一句话:
所有业务都围绕“订单状态流转”展开
先定义订单结构,这是整个系统的“中枢”。
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()
};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
});
});支付是订单状态的分水岭。
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");
});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 });
});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("该时间段已满");
}
}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);
});
}订单流转:
创建订单
↓
支付成功
↓
商家接单
↓
制作中
↓
(外卖)配送中 / (预约)等待到店
↓
完成外卖和预约不要做两套系统,本质只是:
否则会出现:
不要让“预约”“外卖”“堂食”成为独立系统

餐饮预约点餐系统的核心不是功能多,而是:
用一套订单系统,统一所有消费场景
代码只是实现方式,真正关键是把“预约”和“外卖”统一成同一个逻辑体系,这才是从0到1搭建系统的核心思路。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。