Ми розробляємо портали для логістичних компаній — не просто сайти з формою заявки, а повноцінні робочі інструменти для управління перевезеннями. Через такий портал клієнти відстежують вантажі в реальному часі, диспетчери призначають машини, водії отримують маршрути, а бухгалтерія вивантажує накладні. Наприклад, один з клієнтів зекономив 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) — основні вимоги до накладних.







