Ми розробляємо портали для логістичних компаній — не просто сайти з формою заявки, а повноцінні робочі інструменти для управління перевезеннями. Через такий портал клієнти відстежують вантажі в реальному часі, диспетчери призначають машини, водії отримують маршрути, а бухгалтерія вивантажує накладні. Наприклад, один з клієнтів зекономив 1 200 000 грн за перший рік використання порталу — це у 3 рази більше, ніж витрати на розробку. Розробка порталу логістичної компанії під ключ включає трекінг вантажів в реальному часі, розрахунок доставки та інтеграцію з 1С. Кожна роль отримує персоналізований інтерфейс з розмежуванням доступу. Типові проблеми: втрата вантажів через відсутність трекінгу, неефективне планування маршрутів, ручне заповнення документів та нестача прозорості для клієнтів. Ми вирішуємо їх за допомогою GPS-трекерів, автоматизації документообігу та гнучкої системи тарифів. Наш досвід — 5+ років та більше 30 реалізованих проектів для транспортної галузі, середня економія операційних витрат після впровадження — 15–25%. Завдяки автоматизації документообігу, час підготовки накладної скорочується з 30 хвилин до 5 хвилин — у 6 разів швидше, ніж вручну. Компанія заснована у 2016 році, наша команда — 15 сертифікованих розробників (Laravel, React), гарантія 12 місяців на розробку.
Які функціональні модулі входять до порталу?
Типовий портал для транспортно-логістичної компанії складається з декількох незалежних модулів, які з'єднуються через спільну базу даних та API.
Особистий кабінет клієнта — реєстрація, історія замовлень, поточний статус доставки, документи (CMR, TTH, рахунки), запит нового перевезення. Клієнт бачить лише свої дані.
Панель диспетчера — вхідні заявки, призначення водіїв та транспортних засобів, відстеження позицій на карті в реальному часі, зміна статусів, чат з водієм.
Мобільний додаток водія (або PWA) — поточне замовлення, маршрут, зміна статусів (забрав/в дорозі/доставив), фотофіксація при видачі, підпис отримувача на екрані.
Адміністративна панель — управління довідниками (міста, тарифи, типи транспорту), звіти, управління користувачами.
Як працює трекінг вантажів?
Реальне положення транспортних засобів — один з ключових елементів. Є декілька підходів:
GPS-трекери з власним сервером. Пристрої типу Teltonika FMB920 надсилають координати за протоколом MQTT або через власний TCP-сервер. Дані надходять кожні 30–60 секунд:
# Приклад обробки вхідних даних з GPS-трекера через MQTT import paho.mqtt.client as mqtt import json from datetime import datetime def on_message(client, userdata, message): data = json.loads(message.payload.decode()) vehicle_id = data['device_id'] lat = data['lat'] lng = data['lng'] speed = data['speed'] ts = datetime.fromtimestamp(data['timestamp']) # Зберігаємо в TimescaleDB (PostgreSQL з розширенням для часових рядів) db.execute(""" INSERT INTO vehicle_positions (vehicle_id, lat, lng, speed, recorded_at) VALUES (%s, %s, %s, %s, %s) """, (vehicle_id, lat, lng, speed, ts)) # Публікуємо в Redis для real-time оновлень на карті redis.publish(f'vehicle:{vehicle_id}', json.dumps({ 'lat': lat, 'lng': lng, 'speed': speed })) Мобільний додаток з геолокацією. Водій вмикає відстеження через браузер або додаток. Дешевше в інфраструктурі, але залежить від заряду телефону та наявності інтернету.
Інтеграція із зовнішніми системами. Яндекс.Транспорт, Wialon, Omnicomm — готові платформи моніторингу з API.
| Метод | Інфраструктура | Надійність | Вартість впровадження |
|---|---|---|---|
| GPS-трекери | Власний сервер + MQTT | Висока (автономний модуль) | Середня (пристрої + хостинг) |
| Мобільний додаток | Без сервера телематики | Залежить від пристрою | Низька |
| Зовнішні платформи | API-ключ | Висока (підтримка вендора) | Щомісячна підписка |
Як реалізувати карту в реальному часі?
Для відображення позицій використовується WebSocket — сервер пушить оновлення клієнту без опитування:
// Фронтенд: підключення до WebSocket та оновлення маркерів на карті const socket = new WebSocket('wss://ws.example.com/dispatch'); // Замініть на ваш ральний URL socket.addEventListener('message', (event) => { const { vehicleId, lat, lng, speed, status } = JSON.parse(event.data); if (markers[vehicleId]) { markers[vehicleId].setLatLng([lat, lng]); markers[vehicleId].setPopupContent( `<b>${vehicleId}</b><br>Швидкість: ${speed} км/год<br>Статус: ${status}` ); } else { markers[vehicleId] = L.marker([lat, lng]) .addTo(map) .bindPopup(`<b>${vehicleId}</b>`); } }); Для карти — Leaflet з тайлами від OpenStreetMap (безкоштовно) або Яндекс.Карти / Google Maps (платно, але краще geocoding для СНД).
Що входить в роботу?
- Технічна документація: опис архітектури, UML-діаграми, специфікація API.
- Налаштований репозиторій з CI/CD (GitLab CI, GitHub Actions).
- Доступ до проміжного середовища для приймального тестування.
- Навчання команди замовника роботі з порталом.
- Технічна підтримка протягом місяця після запуску.
Як розрахувати вартість перевезення?
Тарифікація у логістичних компаній буває складною: залежить від ваги, об'єму, відстані, типу вантажу, терміновості, страховки. Рекомендується винести логіку в окремий сервіс:
class FreightCalculator { public function calculate(FreightRequest $request): FreightQuote { $distance = $this->distanceMatrix->calculate( $request->originCity, $request->destinationCity ); $baseRate = $this->rateRepository->findRate( $request->cargoType, $request->vehicleType, $distance->zone ); $weightCharge = max($request->weight, $request->volumetricWeight()) * $baseRate->perKg; $distanceCharge = $distance->km * $baseRate->perKm; $insurance = $request->declaredValue * 0.002; // 0.2% $total = ($weightCharge + $distanceCharge + $insurance) * $request->urgencyMultiplier() * $this->seasonalCoefficient(); return new FreightQuote( base: $weightCharge + $distanceCharge, insurance: $insurance, total: round($total, 2), currency: 'UAH', validUntil: now()->addHours(24), ); } } Як автоматизувати документообіг?
Транспортна накладна, CMR, експедиторська розписка — все це повинно генеруватися автоматично з даних замовлення. Використовується бібліотека типу TCPDF або Snappy (wkhtmltopdf) для PHP, або Puppeteer для Node.js.
Підпис отримувача збирається через Canvas API в браузері та зберігається як зображення, прикріплене до накладної:
const canvas = document.getElementById('signature-pad'); const signaturePad = new SignaturePad(canvas, { backgroundColor: 'rgb(255, 255, 255)', penColor: 'rgb(0, 0, 0)', }); document.getElementById('save-signature').addEventListener('click', () => { if (!signaturePad.isEmpty()) { const dataUrl = signaturePad.toDataURL('image/png'); // Відправляємо на сервер разом з підтвердженням доставки fetch('/api/deliveries/' + deliveryId + '/confirm', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ signature: dataUrl, confirmed_at: new Date().toISOString() }), }); } }); Які інтеграції із зовнішніми системами?
Логістичний портал рідко живе ізольовано. Типові інтеграції:
- 1С — вивантаження накладних, синхронізація контрагентів, завантаження оплат
- Діадок / СБІС — електронний документообіг, підписання документів ЕЦП
- Транспортні біржі (ATI.SU, Deliver) — автоматична публікація заявок на перевезення
- Страхові компанії — оформлення страхування вантажу через API
Покрокова інструкція: запуск інтеграції з 1С
- Аналіз — вивчаємо поточні документи та реквізити, узгоджуємо формати обміну (XML, JSON).
- Розробка — пишемо модуль синхронізації на стороні порталу, налаштовуємо вивантаження контрагентів та замовлень.
- Тестування — перевіряємо коректність даних на тестовій базі 1С, виправляємо помилки.
- Введення в експлуатацію — запускаємо у фоновому режимі, моніторимо логи.
- Супровід — протягом місяця після запуску фіксимо зауваження та навчаємо бухгалтерів.
Продуктивність при масштабі
Зазначимо: коли в системі тисячі активних перевезень, наївні запити до БД починають гальмувати. Декілька конкретних рішень:
Геопросторові індекси в PostgreSQL з розширенням PostGIS:
CREATE INDEX idx_vehicle_positions_location ON vehicle_positions USING GIST (ST_SetSRID(ST_MakePoint(lng, lat), 4326)); -- Вибірка всіх машин в радіусі 50 км від точки SELECT vehicle_id, lat, lng FROM vehicle_positions vp JOIN ( SELECT vehicle_id, MAX(recorded_at) as last_seen FROM vehicle_positions GROUP BY vehicle_id ) latest ON vp.vehicle_id = latest.vehicle_id AND vp.recorded_at = latest.last_seen WHERE ST_DWithin( ST_SetSRID(ST_MakePoint(lng, lat), 4326)::geography, ST_SetSRID(ST_MakePoint(37.6173, 55.7558), 4326)::geography, 50000 ); Партиціонування таблиці позицій за датою — через місяць дані архівуються і не заважають основним запитам.
Строки та етапи розробки
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та проектування | 1–2 тижні | ТЗ, архітектура, прототип UI |
| Реалізація MVP | 6–8 тижнів | Особистий кабінет, трекінг, документи |
| Повноцінна система | 4–6 місяців | Всі модулі, інтеграції, навчання |
Бюджет такого проекту зазвичай становить від 1 до 5 мільйонів гривень залежно від функціоналу. Середній ROI — 300% за 2 роки. Отримайте консультацію з архітектури порталу — зв'яжіться з нами, щоб обговорити ваш проект.
Таким чином, розробка порталу логістичної компанії забезпечує комплексне рішення для управління перевезеннями, підвищуючи прозорість та ефективність.
Чек-лист для запуску порталу
- Перевірка інтеграції з GPS-трекерами (чи працює WebSocket). - Тестування сценаріїв: клієнт → диспетчер → водій → підпис отримувача. - Навантажувальне тестування при 1000+ одночасних треків. - Навчання персоналу (не менше 2 тренінгів). - Моніторинг помилок через Sentry або аналог.Конвенція про договір міжнародного дорожнього перевезення вантажів (CMR) — основні вимоги до накладних.







