卡牌单词好玩吗 卡牌单词玩法简介
2026-07-04 3380474
2026-07-04 0
外卖跑腿配送系统本质上是一个“多角色 实时调度 地理位置驱动”的同城即时履约系统,核心围绕四个端:用户端、商家端、骑手端、管理后台。
下面从业务流程到技术架构,再到核心代码实现,带你完整拆解一套可落地的系统设计。
外卖跑腿配送系统
一个标准外卖跑腿系统通常采用分层 微服务/模块化架构:
外卖跑腿系统的主链路:
用户下单商家接单系统派单(或抢单)骑手接单骑手取餐骑手配送完成订单结算与评价关键点在第3步:派单逻辑
订单是整个系统的核心数据结构。
CREATE TABLE orders (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT,merchant_id BIGINT,rider_id BIGINT,status VARCHAR(20),total_amount DECIMAL(10,2),create_time DATETIME,update_time DATETIME);
app.post("/order/create", async (req, res) => {const { userId, merchantId, items } = req.body;// 1. 计算金额const total = items.reduce((sum, item) => {return sum item.price * item.count;}, 0);// 2. 创建订单const order = await db.orders.create({user_id: userId,merchant_id: merchantId,total_amount: total,status: "PENDING"});// 3. 写入Redis用于派单await redis.lpush("order_queue", order.id);res.json({success: true,orderId: order.id});});
外卖系统“智能化”的核心就在这里:如何匹配最近骑手
// 骑手上线(存位置)await redis.geoadd("riders_location",longitude,latitude,riderId);
const riders = await redis.georadius("riders_location",orderLng,orderLat,3,// 3公里范围"km","WITHDIST","COUNT",5);
async function dispatchOrder(orderId, orderLng, orderLat) {const riders = await redis.georadius("riders_location",orderLng,orderLat,5,"km","WITHDIST");if (!riders.length) {throw new Error("暂无可用骑手");}// 按距离排序riders.sort((a, b) => a[1] - b[1]);const selectedRider = riders[0][0];// 更新订单await db.orders.update({where: { id: orderId },data: {rider_id: selectedRider,status: "DISPATCHED"}});// 通知骑手(WebSocket/MQTT)notifyRider(selectedRider, orderId);return selectedRider;}
骑手必须“秒级收到订单”
代码语言:javascript复制const WebSocket = require("ws");const wss = new WebSocket.Server({ port: 8080 });wss.on("connection", (ws) => {ws.on("message", (msg) => {const data = JSON.parse(msg);if (data.type === "rider_login") {ws.riderId = data.riderId;}});});// 推送订单function notifyRider(riderId, orderId) {wss.clients.forEach(client => {if (client.riderId === riderId) {client.send(JSON.stringify({type: "NEW_ORDER",orderId}));}});}
app.post("/rider/accept", async (req, res) => {const { riderId, orderId } = req.body;const order = await db.orders.findById(orderId);if (order.status !== "DISPATCHED") {return res.json({ success: false, msg: "订单已被接单" });}await db.orders.update({where: { id: orderId },data: {status: "ACCEPTED",rider_id: riderId}});res.json({ success: true });});
骑手位置需要持续上报:
代码语言:javascript复制setInterval(() => {navigator.geolocation.getCurrentPosition(async (pos) => {await fetch("/rider/location/update", {method: "POST",body: JSON.stringify({riderId,lng: pos.coords.longitude,lat: pos.coords.latitude})});});}, 5000);
app.post("/rider/location/update", async (req, res) => {const { riderId, lng, lat } = req.body;await redis.geoadd("riders_location", lng, lat, riderId);res.json({ success: true });});
const lock = await redis.set("order_lock_" orderId, riderId, "NX", "EX", 10);if (!lock) {return "订单已被抢";}
如果要做商业级系统,必须加:
智能派单(AI算法:距离 负载 评分)动态调度(订单合并配送)路径规划优化(A* / Dijkstra)风控系统(异常骑手检测)大数据分析(热区预测)
外卖跑腿配送系统
外卖跑腿配送系统的核心不是“下单”,而是:
真正的技术难点集中在三点:
派单算法实时通信高并发处理如果这三块做好,系统才算真正可商用。