跑腿業務看似簡單,但真正落到系統層面,會涉及下單、計價、調度、接單、配送、結算等一整套閉環邏輯。本文結合一套典型的開源跑腿系統源碼,從整體架構入手,完整拆解“從用户下單到騎手配送完成”的核心流程,並通過代碼示例説明關鍵實現方式。

開源跑腿系統源碼整體架構解析:從下單到配送的完整流程_ide

一、整體系統架構設計

在源碼層面,成熟的跑腿系統通常採用前後端分離 + 模塊化設計,整體架構可以拆分為以下幾層:

  • 接入層:用户端、騎手端、管理後台
  • 業務層:訂單服務、騎手服務、計價服務、調度服務
  • 基礎服務層:支付、消息推送、地圖與距離計算
  • 數據層: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);
}

每一次狀態變更,都會同步通知用户端,保證信息實時可見。

六、為什麼整體架構比功能更重要

很多人看跑腿系統,只關注“有沒有下單、有沒有接單”,但真正決定系統能否長期運行的,是整體架構是否合理:

能否支持多城市擴展 能否承載併發接單 能否靈活調整業務規則 能否快速接入新場景

而這些,正是開源跑腿系統源碼的價值所在。

開源跑腿系統源碼整體架構解析:從下單到配送的完整流程_ide_02

七、結語

從下單到配送,跑腿系統並不只是幾個接口的組合,而是一套完整的業務閉環。通過理解開源跑腿系統源碼的整體架構和關鍵流程,才能真正把系統“跑起來”,並在此基礎上持續擴展更多同城服務能力。