Xizmatlar Tovarlar Maqolalar

Admin paneli uchun kerak bo'ladigan, kuryerlarga marshrutni avtomatik bo'lib berish (Assign Route)

Dasturiy ta'minot yechimlari
← Barcha maqolalar

Admin paneli uchun kerak bo'ladigan, kuryerlarga marshrutni avtomatik bo'lib berish (Assign Route)

18.02.2026

Logistika tizimida Admin Panel uchun kuryerlarga marshrutlarni avtomatik taqsimlash (Auto-Dispatch) eng murakkab va intellektual qism hisoblanadi. Bu jarayonni professional backend tizimida qanday amalga oshirishni ko‘rib chiqamiz.

Ushbu jarayon logistikada VRP (Vehicle Routing Problem) deb ataladi. Biz buni 3 bosqichda ko‘rib chiqamiz: Algoritm mantiqi, Ma’lumotlar to‘plami va Laravel (yoki PHP) orqali amalga oshirish.


1. Avtomatik Taqsimlash Algoritmi Mantiqi

Algoritm quyidagi mezonlar (constraints) asosida ishlashi kerak:

  1. Geolokatsiya: Eng yaqin kuryerni aniqlash.

  2. Yuklama (Capacity): Kuryerning mashinasiga yuk sig'ishi.

  3. Holat (Status): Kuryer hozir bo'sh yoki ishda ekanligi.

  4. Vaqt (Time Window): Yukni yetkazish muddati (Express yoki Standard).


2. Backend Logikasi: "Smart Assign" Servisi

Keling, ushbu mantiqni Laravel doirasida Service Pattern yordamida ko‘ramiz.

A. Kuryerlarni Filtrlash (Selection Logic)

Bizga hozirgi kunda ishda bo‘lgan va yuklamasi kam kuryerlar ro‘yxati kerak.

PHP

// app/Services/DispatchService.php

namespace App\Services;

use App\Models\Courier;
use App\Models\Shipment;
use App\Models\Route;
use App\Models\RouteStop;
use Illuminate\Support\Facades\DB;

class DispatchService {

    public function autoAssignShipments($cityId) {
        // 1. Kutayotgan (PENDING) yuklarni olish
        $pendingShipments = Shipment::where('status', 'ACCEPTED_AT_HUB')
                                    ->where('city_id', $cityId)
                                    ->get();

        foreach ($pendingShipments as $shipment) {
            // 2. Eng mos kuryerni topish
            $bestCourier = $this->findBestCourier($shipment);

            if ($bestCourier) {
                $this->assignToCourier($shipment, $bestCourier);
            }
        }
    }

    private function findBestCourier($shipment) {
        // Geofencing va yuklamani hisobga olgan holda kuryerlarni olish
        return Courier::where('is_active', true)
            ->where('city_id', $shipment->city_id)
            ->withCount('activeStops')
            ->orderBy('active_stops_count', 'asc') // Eng kam yuklangan kuryer
            ->first();
    }
}

3. Murakkab Algoritm: "Cluster-based Routing"

Agar bizda yuzlab yuk bo‘lsa, har birini alohida kuryerga berish samarasiz. Buning o‘rniga yuklarni hududlar bo‘yicha klasterlarga bo‘lish kerak.

Qadamlar:

  1. K-Means Clustering: Yuklarning koordinatalari asosida ularni hududiy guruhlarga bo‘lish.

  2. Distance Matrix API: Google Maps yoki OSRM (Open Source Routing Machine) orqali kuryer va yuklar orasidagi aniq masofa va vaqtni hisoblash.

  3. Assigning: Har bir klaster uchun bitta marshrut (Route) yaratish va uni kuryerga biriktirish.


4. Admin Panel uchun API Endpoint: POST /admin/routes/auto-dispatch

Admin "Avtomatik taqsimlash" tugmasini bosganda ishlaydigan endpoint:

PHP

// app/Http/Controllers/Api/Admin/DispatchController.php

public function autoDispatch(Request $request) {
    $cityId = $request->city_id;
    
    // DispatchService'ni chaqiramiz
    $dispatchService = new DispatchService();
    $dispatchService->autoAssignShipments($cityId);

    return response()->json([
        'success' => true,
        'message' => "Marshrutlar muvaffaqiyatli optimallashtirildi va kuryerlarga biriktirildi."
    ]);
}

5. Kuryer Ilovasi bilan Real-Vaqt Aloqasi (WebSockets)

Kuryerga marshrut biriktirilganda, uning telefoniga Real-time xabar borishi kerak. Buning uchun Laravel Echo va Pusher (yoki Soketi) ishlatiladi.

PHP

// Marshrut biriktirilganda hodisani (Event) tarqatish
event(new RouteAssignedEvent($courier, $route));

Professional Maslahat:

Agar loyihangiz "Musbat" kabi jiddiy bo'lsa va yuklar soni kuniga minglab bo'lsa, marshrutlash algoritmini PHP da yozish biroz sekinlik qilishi mumkin. Bunday holda, marshrutlash mantiqini Python (Google OR-Tools) yoki Go (Golang) tilida yozilgan alohida mikroservisga topshirgan ma'qul. Ular matematik hisob-kitoblarni millisekundlarda bajaradi.

© 2026 Musbat. Barcha huquqlar himoyalangan.