אנו מפתחים פורטלים לחברות לוגיסטיקה — לא רק אתרים עם טופס פנייה, אלא כלי עבודה מלאים לניהול הובלות. דרך פורטל כזה, לקוחות עוקבים אחר מטען בזמן אמת, דיספאצ'רים מקצים רכבים, נהגים מקבלים מסלולים, וחשבונאות מייצאת שטרי מטען. כל תפקיד מקבל ממשק מותאם אישית עם בקרת גישה. בעיות טיפוסיות: מטען שאבד עקב חוסר מעקב, תכנון מסלולים לא יעיל, הזנת מסמכים ידנית וחוסר שקיפות ללקוחות. אנו פותרים אותן עם רכבי GPS, אוטומציה של זרימת מסמכים ומערכת תעריפים גמישה. הניסיון שלנו — 5+ שנים ויותר מ-30 פרויקטים שהושלמו לתעשיית התחבורה, חיסכון ממוצע בעלויות תפעול לאחר היישום — 15–25% (לדוגמה, לקוח חסך $18k–26k בשנה לאחר השקת פורטל מלא בעלות של $22k–32k).
מודולים פונקציונליים של הפורטל
פורטל טיפוסי לחברת תחבורה ולוגיסטיקה מורכב מכמה מודולים עצמאיים שמתחברים דרך מסד נתונים משותף ו-API.
חשבון אישי ללקוח — רישום, היסטוריית הזמנות, סטטוס משלוח עדכני, מסמכים (CMR, TTH, חשבוניות), בקשת הובלה חדשה. הלקוח רואה רק את הנתונים שלו.
פאנל דיספאצ'ר — בקשות נכנסות, הקצאת נהגים ורכבים, מעקב מיקום בזמן אמת על מפה, שינויי סטטוס, צ'אט עם נהג.
אפליקציית נהג לנייד (או PWA) — הזמנה נוכחית, מסלול, שינויי סטטוס (נאסף/בדרך/נמסר), צילום תמונה במסירה, חתימת מקבל על המסך.
פאנל אדמין — ניהול ספריות (ערים, תעריפים, סוגי רכבים), דוחות, ניהול משתמשים.
מדוע מעקב מטען הוא הבסיס לפורטל מודרני?
מיקום רכב בזמן אמת הוא אחד המרכיבים המרכזיים. ישנן כמה גישות:
רכבי GPS עם שרת מותאם אישית. מכשירים כמו Teltonika FMB920 שולחים קואורדינטות דרך פרוטוקול MQTT או דרך שרת TCP ייעודי. נתונים מגיעים כל 30–60 שניות — זה פי 3 יותר תכוף מעדכונים טיפוסיים של אפליקציות ניידות:
# Пример обработки входящих данных с 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
}))אפליקציה ניידת עם גיאולוקציה. הנהג מפעיל מעקב דרך דפדפן או אפליקציה. זול יותר בתשתית אך תלוי בסוללת הטלפון ובחיבור האינטרנט.
אינטגרציה עם מערכות חיצוניות. Yandex.Transport, Wialon, Omnicomm — פלטפורמות ניטור מוכנות עם API.
| שיטה | תשתית | אמינות | עלות יישום |
|---|---|---|---|
| רכבי GPS | שרת מותאם אישית + MQTT | גבוהה (מודול עצמאי) | בינונית (מכשירים + אחסון) |
| אפליקציה ניידת | ללא שרת טלמטיקה | תלוי במכשיר | נמוכה |
| פלטפורמות חיצוניות | מפתח API | גבוהה (תמיכת ספק) | מנוי חודשי |
כיצד אנו מיישמים מפה בזמן אמת?
להצגת מיקומים, אנו משתמשים ב-WebSocket — השרת דוחף עדכונים ללקוח ללא שאילתות (50% פחות השהיה מ-REST):
// Фронтенд: подключение к WebSocket и обновление маркеров на карте
const socket = new WebSocket('wss://api.example.com/ws/dispatch');
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 (חינם) או Yandex.Maps / Google Maps (בתשלום אך גיאוקודינג טוב יותר לחבר העמים).
מה כלול בעבודה?
- תיעוד טכני: תיאור ארכיטקטורה, דיאגרמות UML, מפרט API.
- מאגר מוגדר עם CI/CD (GitLab CI, GitHub Actions).
- גישה לסביבת staging לבדיקות קבלה.
- הדרכת צוות הלקוח לשימוש בפורטל (לפחות 2 מפגשים).
- תמיכה טכנית לחודש לאחר ההשקה, עם זמן תגובה מובטח של 4 שעות.
חישוב עלות הובלה
תעריפים בחברות לוגיסטיקה יכולים להיות מורכבים: תלוי במשקל, נפח, מרחק, סוג מטען, דחיפות, ביטוח. מומלץ להוציא את הלוגיקה לשירות נפרד:
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: 'USD',
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()
}),
});
}
}); אינטגרציות עם מערכות חיצוניות
פורטל לוגיסטי rarely חי בבידוד. אינטגרציות טיפוסיות:
- 1C — ייצוא שטרי מטען, סנכרון צדדים, טעינת תשלומים
- Diadoc / SBIS — זרימת מסמכים אלקטרונית, חתימת מסמכים בחתימה דיגיטלית
- בורסות תחבורה (ATI.SU, Deliver) — פרסום אוטומטי של בקשות הובלה
- חברות ביטוח — ביטוח מטען דרך API
מדריך שלב אחר שלב: כיצד אנו משיקים אינטגרציה עם 1C
- ניתוח — אנו לומדים מסמכים ופרטים נוכחיים, מסכימים על פורמטי החלפה (XML, JSON).
- פיתוח — אנו כותבים מודול סנכרון בצד הפורטל, מגדירים ייצוא של צדדים והזמנות.
- בדיקות — אנו בודקים נכונות נתונים על מסד נתונים 1C לבדיקה, מתקנים שגיאות.
- פריסה — אנו משיקים במצב רקע, עוקבים אחר לוגים.
- תמיכה — תוך חודש מההשקה, אנו מתקנים בעיות ומכשירים רואי חשבון.
ביצועים בקנה מידה
הערה: כאשר למערכת יש אלפי משלוחים פעילים, שאילתות מסד נתונים נאיביות מתחילות להאט. כמה פתרונות ספציפיים:
אינדקסים גיאו-מרחביים ב-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 שבועות | TOR, ארכיטקטורה, אב טיפוס UI |
| יישום MVP | 6–8 שבועות | חשבון אישי, מעקב, מסמכים |
| מערכת מלאה | 4–6 חודשים | כל המודולים, אינטגרציות, הדרכה |
| התקציב לפרויקט כזה נע בדרך כלל בין $10k–50k בהתאם לפונקציונליות. קבלו ייעוץ על ארכיטקטורת הפורטל — צרו קשר כדי לדון בפרויקט שלכם. |
רשימת בדיקה להשקת פורטל
- בדוק אינטגרציה עם רכבי GPS (WebSocket עובד). - בדוק תרחישים: לקוח → דיספאצ'ר → נהג → חתימת מקבל. - בדיקת עומס עם 1000+ מסלולים במקביל. - הדרכת צוות (לפחות 2 מפגשים). - ניטור שגיאות דרך Sentry או דומה.אמנת החוזה להובלת סחורות בינלאומית בדרכים (CMR) — דרישות בסיסיות לשטרי מטען.







