Admin paneli uchun kerak bo'ladigan, kuryerlarga marshrutni avtomatik bo'lib berish (Assign Route)
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:
Geolokatsiya: Eng yaqin kuryerni aniqlash.
Yuklama (Capacity): Kuryerning mashinasiga yuk sig'ishi.
Holat (Status): Kuryer hozir bo'sh yoki ishda ekanligi.
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:
K-Means Clustering: Yuklarning koordinatalari asosida ularni hududiy guruhlarga bo‘lish.
Distance Matrix API: Google Maps yoki OSRM (Open Source Routing Machine) orqali kuryer va yuklar orasidagi aniq masofa va vaqtni hisoblash.
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.