跑腿業務看似簡單,但真正落到系統層面,會涉及下單、計價、調度、接單、配送、結算等一整套閉環邏輯。本文結合一套典型的開源跑腿系統源碼,從整體架構入手,完整拆解“從用户下單到騎手配送完成”的核心流程,並通過代碼示例説明關鍵實現方式。
一、整體系統架構設計
在源碼層面,成熟的跑腿系統通常採用前後端分離 + 模塊化設計,整體架構可以拆分為以下幾層:
- 接入層:用户端、騎手端、管理後台
- 業務層:訂單服務、騎手服務、計價服務、調度服務
- 基礎服務層:支付、消息推送、地圖與距離計算
- 數據層:MySQL、Redis、消息隊列
客户端(用户 / 騎手)
↓
API 網關
↓
業務服務層(訂單 / 調度 / 計價)
↓
數據存儲 & 消息系統
這種架構的好處在於: 業務解耦清晰,方便後期擴展外賣、同城配送、即時服務等能力。
二、下單流程:訂單是如何產生的
跑腿系統的第一步,是用户提交跑腿需求。通常包含以下信息:
- 取件地址 / 收件地址
- 跑腿類型(代買、代送、代辦)
- 備註説明
- 預估費用
訂單創建接口示例
@PostMapping("/order/create")
public Result create(@RequestBody RunOrderDTO dto) {
RunOrder order = new RunOrder();
order.setUserId(dto.getUserId());
order.setPickupAddress(dto.getPickupAddress());
order.setDeliveryAddress(dto.getDeliveryAddress());
order.setType(dto.getType());
order.setRemark(dto.getRemark());
order.setStatus(OrderStatus.WAITING);
order.setCreateTime(LocalDateTime.now());
runOrderService.save(order);
return Result.success(order.getId());
}
在實際源碼中,下單階段還會疊加:
- 距離計算
- 價格規則匹配
- 下單頻率限制
三、計價邏輯:費用是如何算出來的
跑腿計價通常由基礎價 + 距離價 + 加價規則構成,源碼中一般會獨立成一個計價服務。
public BigDecimal calculatePrice(double distanceKm) {
BigDecimal basePrice = new BigDecimal("5.00");
BigDecimal perKmPrice = new BigDecimal("2.00");
return basePrice.add(
perKmPrice.multiply(BigDecimal.valueOf(distanceKm))
);
}
將計價邏輯獨立出來,有兩個好處:
- 不同城市可配置不同規則
- 後期支持夜間、雨天等動態加價
四、訂單調度與騎手接單流程
當訂單創建完成後,系統會進入待接單狀態,並通過消息推送或 WebSocket 通知騎手。
訂單推送(示意)
public void pushOrderToRiders(RunOrder order) {
List<Long> riderIds = riderService.findNearbyRiders(order.getPickupAddress());
riderIds.forEach(riderId -> {
messageService.send(riderId, "新跑腿訂單:" + order.getId());
});
}
騎手接單併發控制
這是跑腿系統中非常關鍵的一步,需要避免多騎手同時搶單。
@Transactional
public boolean acceptOrder(Long orderId, Long riderId) {
RunOrder order = runOrderMapper.selectForUpdate(orderId);
if (!OrderStatus.WAITING.equals(order.getStatus())) {
return false;
}
order.setStatus(OrderStatus.ACCEPTED);
order.setRiderId(riderId);
order.setAcceptTime(LocalDateTime.now());
runOrderMapper.update(order);
return true;
}
通過數據庫鎖或 Redis 分佈式鎖,確保訂單隻會被成功接一次。
五、配送流程與狀態流轉
訂單被接單後,會進入配送階段,常見狀態包括:
已接單 已取件 配送中 已完成
public void updateStatus(Long orderId, OrderStatus status) {
RunOrder order = runOrderMapper.selectById(orderId);
order.setStatus(status);
order.setUpdateTime(LocalDateTime.now());
runOrderMapper.update(order);
}
每一次狀態變更,都會同步通知用户端,保證信息實時可見。
六、為什麼整體架構比功能更重要
很多人看跑腿系統,只關注“有沒有下單、有沒有接單”,但真正決定系統能否長期運行的,是整體架構是否合理:
能否支持多城市擴展 能否承載併發接單 能否靈活調整業務規則 能否快速接入新場景
而這些,正是開源跑腿系統源碼的價值所在。
七、結語
從下單到配送,跑腿系統並不只是幾個接口的組合,而是一套完整的業務閉環。通過理解開源跑腿系統源碼的整體架構和關鍵流程,才能真正把系統“跑起來”,並在此基礎上持續擴展更多同城服務能力。