Fullständig teknisk rapport över systemets arkitektur, funktionalitet och teknik
RouteAI är ett AI-drivet system för ruttoptimering och fordonsflotthantering, byggt för logistikföretag. Systemet kombinerar avancerade optimeringsalgoritmer, realtidsspårning, hållbarhetsanalys och AI-assistans i en enhetlig plattform.
Systemet är byggt som en TypeScript-monorepo med React-frontend, Express-backend, PostgreSQL-databas och WebSocket-kommunikation i realtid.
RouteAI Monorepo (pnpm workspace)
├── artifacts/
│ ├── api-server/ — Express 5 REST API + WebSocket-server
│ └── route-ai/ — React + Vite frontend-applikation
├── lib/
│ ├── api-spec/ — OpenAPI-specifikation + Orval-kodgenerering
│ ├── api-client-react/ — Autogenererad React Query-klient
│ ├── api-zod/ — Autogenererade Zod-valideringsscheman
│ └── db/ — Drizzle ORM databasschema
└── scripts/ — Verktyg och migrations-skript
| Lager | Teknologi |
|---|---|
| Språk | TypeScript 5.9, Node.js 24 |
| Frontend | React 19, Vite 7, Tailwind CSS 4, Radix UI, Framer Motion |
| Backend | Express 5, WebSocket (ws) |
| Databas | PostgreSQL med Drizzle ORM |
| AI/ML | OpenAI GPT-5-mini (chatt), Whisper-1 (röst) |
| Kartor | Leaflet, React Leaflet, OSRM (routing-motor) |
| Diagram | Recharts |
| Validering | Zod (v4) med Drizzle-Zod-integration |
| API-design | OpenAPI 3.0 med Orval-kodgenerering |
| Routing (frontend) | Wouter |
| Datahantering | TanStack React Query |
| i18n | i18next (svenska + engelska) |
Systemet använder 14 databastabeller:
organizations — Fleranvändarstöd (multi-tenant)
id(UUID),name,email,created_at- Alla övriga tabeller har en
organization_id-referens hit
users — Systemanvändare med rollbaserad åtkomstkontroll
id,organization_id,name,emailrole: admin, dispatcher eller driverdriver_profile_id: valfri koppling till förarprofil
vehicles — Fordon i flottan
- Identifiering:
name,license_plate - Typ:
vehicle_type(fossil / electric) - Kapacitet:
capacity_kg,capacity_volume(m³) - EV-specifikt:
battery_capacity_kwh,current_battery_percent,range_km - Status:
is_active
drivers — Förarprofiler
name,phone,emailvehicle_id: tilldelat fordonis_active: tillgänglighetsstatus
driver_preferences — Förarönskemål och nöjdhetspoäng
- Arbetstidspreferenser:
preferred_start_time,preferred_end_time - Körregler:
max_driving_hours_per_day,break_frequency_minutes avoid_night_driving: undviker nattarbetehappiness_score: automatiskt beräknad nöjdhetspoäng (0–100%)
routes — Leveransrutter
vehicle_id,name,datestatus: draft → optimized → in_progress → completed / cancelled- Mätvärden:
total_distance_km,total_duration_min,total_stops,co2_emissions_kg
stops — Enskilda leveranspunkter
- Position:
latitude,longitude,address - Tidsfönster:
time_window_start,time_window_end - Last:
weight_kg,volume_m3,service_duration_min status: pending → in_progress → completed / failed / skippedsequence_order: ordning i ruttentracking_code: unik kod för kundspårning
customers — Mottagare av leveranser
name,email,phone,address
route_templates — Sparade ruttmallar
stop_data(JSONB): stoppdata för återanvändningvehicle_type: fordonstyp mallen gäller för
route_history — Arkiv för slutförda rutter
stops_snapshot(JSONB): ögonblicksbild av alla stopp- Prestandamätvärden för historisk analys
geofence_events — Automatisk loggning av fordons ankomst/avgång
event_type: entered / exited- Kopplingar:
vehicle_id,stop_id,route_id
notifications — Systemvarningar för operatörer
type,title,message,is_read
delivery_notifications — Kundkommunikation
type: approaching, delivered, etc.channel: kommunikationskanal
energy_prices — Elpriscache
price_area(SE1–SE4),timestamp,price_eur_mwh- Automatisk uppdatering var 6:e timme
Hjärtat i systemet. Implementerar Adaptive Large Neighborhood Search (ALNS), en metaheuristisk optimeringsalgoritm.
Hur det fungerar:
- Initial lösning genereras med Clarke-Wright Savings-algoritmen
- 30-sekunders tidsbudget för iterativ förbättring
- Varje iteration: välj en förstörelseoperator → reparationsoperator → utvärdera
Förstörelseoperatorer (tar bort stopp från rutter):
- Random Removal — slumpmässigt urval
- Worst Removal — tar bort stopp med högst kostnad
- Shaw Removal — tar bort liknande/närliggande stopp
- Charging Station Removal — optimerar laddstationer
Reparationsoperatorer (sätter tillbaka stopp i bästa position):
- Greedy Insertion — billigaste insättning
- Regret-2 Insertion — beaktar alternativkostnad
- Charging Station Insertion — infogar laddstationer vid behov
Flermålsoptimering — Kostnadsfunktionen balanserar:
- Avstånd/körkostnad
- CO₂-utsläpp
- ETA-precision (tidsfönsterpålitlighet)
EV-laddningsstöd:
- 10 inbyggda laddstationspositioner i Stockholmsområdet
- Laddstationer behandlas som fullvärdiga ALNS-insättningsbara noder
- Stöd för delvis laddning baserat på batterinivå och fordonets räckvidd
Avståndmatris-cache: Undviker omberäkning vid upprepade optimeringar.
Bakgrundsprocess som kör ALNS i 100ms-mikroiterationer med setImmediate för att inte blockera serverns event loop.
- Auto-stoppar efter 5 minuter utan förbättring eller 30 minuter totalt
- Förbättringar broadcastas via WebSocket (
optimization:improvement) - Starta/stoppa via API
Genererar trafikprognos-heatmapdata för Stockholms vägnät:
- Tidsberoende rusningsmodeller (morgon- och kvällstrafik)
- Kända trafikhotspots: T-Centralen, Norrmalm, Södermalm, Slussen, m.fl.
- Returnerar rutnätsceller med kongestionspoäng, förväntad försening och konfidensnivå
- WebSocket-broadcast var 30:e sekund
Beräknar miljöpåverkan utöver CO₂:
Bullermodell (calculateNoiseImpact):
- Poängsättning 0–100 baserat på tid på dygnet
- Natt (22:00–06:00): baspoäng 40 + 15 per nattimme
- Bostadsområdesdetektering via stoppaddresser (svenska/engelska nyckelord)
- Bostadsbonus: +20 nattetid, +5 dagtid
Partikelmodell (estimateParticleEmissions):
- PM2.5-uppskattning per fordonstyp
- Elbil: däck- och bromsslitage (0.012 g/km)
- Fossil: däck + bromsar + avgaser (0.014 + 0.045 g/km)
- Hastighetsfaktor: låg hastighet (<20 km/h) = 40% högre utsläpp
- Bromsfaktor: 2 bromshändelser per stopp × 0.002g per händelse
Miljöpoäng (calculateEnvironmentalScore):
- Viktad sammanslagning: CO₂ 50%, buller 25%, PM2.5 25%
- Skala 0–100 där 100 = minimal miljöpåverkan
Integration med nordiska elmarknaden:
- Stöd för prisområden SE1–SE4
- ENTSO-E API-integration (UTC-format
YYYYMMDDHHMM) - Fallback-prisgenerering när API saknas
- Databaslagring med automatisk uppdatering var 6:e timme
getOptimalChargingWindow(): beräknar billigaste laddfönstret
- Beräknar tidsfönstermarginaler per stopp
- Spårar i-tid- vs försenade leveranser
- Medelleveranstid och total ruttsstatistik
- Regelbaserade kontroller: förseningsrisker, effektiviseringsmöjligheter
- AI-berikade rekommendationer via OpenAI
- Prioriterade insikter med typ och allvarlighetsgrad
Systemet exponerar 50+ REST-ändpunkter plus WebSocket:
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /vehicles |
Lista alla fordon |
| GET | /vehicles/:id |
Hämta ett fordon |
| POST | /vehicles |
Skapa nytt fordon |
| PUT | /vehicles/:id |
Uppdatera fordon |
| DELETE | /vehicles/:id |
Ta bort fordon |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /stops |
Lista stopp (filtrering per rutt/organisation) |
| GET | /stops/:id |
Hämta ett stopp |
| POST | /stops |
Skapa nytt stopp |
| POST | /stops/import |
Bulkimport från Excel/CSV |
| PUT | /stops/:id |
Uppdatera stopp |
| DELETE | /stops/:id |
Ta bort stopp |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /routes |
Lista rutter (statusfilter) |
| GET | /routes/:id |
Hämta rutt |
| GET | /routes/:id/stops |
Stopp i sekvensordning |
| GET | /routes/:id/export |
CSV-export |
| GET | /routes/:id/comparison |
Planerat vs faktiskt resultat |
| POST | /routes |
Skapa rutt |
| POST | /routes/:id/reschedule-failed |
Omboka misslyckade stopp |
| PUT | /routes/:id |
Uppdatera rutt |
| PUT | /routes/:id/reorder-stops |
Ändra stoppordning |
| DELETE | /routes/:id |
Ta bort rutt |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| POST | /optimize |
Kör ALNS-optimering |
| POST | /optimize/reoptimize |
Inkrementell omoptimering |
| POST | /optimize/continuous/start |
Starta bakgrundsoptimering |
| POST | /optimize/continuous/stop |
Stoppa bakgrundsoptimering |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| POST | /ai/chat |
AI-chatt (SSE-streaming) |
| GET | /insights |
AI-berikade insikter |
| POST | /voice/transcribe |
Rösttranskribering (Whisper) |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /drivers |
Lista förare |
| GET | /drivers/:id |
Hämta förare |
| GET | /drivers/:id/stats |
Prestandastatistik + nöjdhetspoäng |
| GET | /drivers/:id/preferences |
Hämta förarönskemål |
| POST | /drivers |
Lägg till förare |
| PUT | /drivers/:id |
Uppdatera förare |
| PUT | /drivers/:id/preferences |
Uppdatera önskemål |
| DELETE | /drivers/:id |
Ta bort förare |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /sustainability/stats |
Miljömätvärden (CO₂, buller, PM2.5) |
| GET | /energy/prices |
Elprishistorik per område |
| GET | /energy/current |
Aktuellt spotpris |
| GET | /energy/optimal-window |
Optimalt laddfönster |
| Metod | Sökväg | Beskrivning |
|---|---|---|
| GET | /dashboard/stats |
Dashboard-aggregat |
| GET | /analytics |
Historisk analys med datumfilter |
| GET | /notifications |
Systemnotifikationer |
| GET | /track/:code |
Offentlig kundspårning |
| GET | /osrm/route |
Vägföljande ruttgeometrier (OSRM-proxy) |
| GET | /healthz |
Serverstatus, DB-latens, minnesanvändning |
Realtidskommunikation per organisation:
vehicle:position— Fordonspositionsuppdateringarroute:status— Ruttstatusändringarstop:completed— Leveranser slutfördadisruption— Störningar (traffic_delay, vehicle_breakdown, stop_added, stop_cancelled)routes:reoptimized— Resultat av automatisk omoptimeringoptimization:improvement— Kontinuerlig optimeringsframstegtraffic:predictions— Trafikprediktion-heatmap (var 30:e sekund)
- Nyckeltal: totalt avstånd, CO₂, aktiva förare/fordon, väntande stopp
- Aktiva rutter med statusindikatorer
- AI-drivna insikter och rekommendationer
- Fullskärms interaktiv karta (Leaflet + OpenStreetMap)
- Fordonspositioner i realtid med riktning och batterinivå
- Kluster-gruppering vid utzoomning
- Trafikprediktion-heatmap (toggle-knapp)
- Ruttpolylinjer färgade efter status
- Tilldela stopp till fordon
- Kör ALNS-optimering
- Visuell karta med rutt- och stoppöverlagring
- Trafikprediktion-toggle
- Gantt-tidslinje för förarscheman
- Karta + tidslinje delad vy
- Drag-and-drop stoppomtilldelning mellan förare
- Ruttkort med fordon, förare, avstånd, tid
- Miljöpoäng-badge (grön/gul/röd) per rutt
- Live-optimeringswidget (start/stopp, iterationer, förbättring %)
- CSV-export och PDF-rapporter
- Karta med alla stopp och ruttlinje
- Stoppsekvens med tidsfönster
- Ruttmätvärden: avstånd, tid, CO₂
- Planerat vs faktiskt: KPI-deltakort
- Dubbla polylinjer på kartan
- Stoppnedbrytningsdiagram
- CO₂-översikt: Total, fossil, EV, hybrid med cirkeldiagram
- Optimeringsmått: ALNS-algoritm, CO₂-besparing, antal rutter
- Elprisoptimering: 24h priskurva (SE1–SE4), KPI-kort, optimalt laddfönster
- ETA-precision: Tidsfönsterslack, i-tid/försenat, medellängd
- Miljöpåverkan utöver CO₂:
- SVG-mätare för miljöpoäng (0–100)
- Bullernivåstaplar med bostadsområdesvarning
- PM2.5-panel med WHO-jämförelse
- Trädmotsvarighet: CO₂-besparingar uttryckt i planterade träd
- Lista och hantera fordon
- EV-specifika fält: batteri, räckvidd
- Förarlista med tilldelat fordon
- Förarprestation: nöjdhetspoäng, önskemålsformulär
- Cirkulär mätare för Happiness Score
- Hantering av leveranspunkter
- Bulkimport från Excel/CSV med kolumnmatchning
- Touch-vänligt gränssnitt
- Aktuellt stopp, navigering, ruttframsteg
- Nöjdhetspoäng-badge
- Kompakt önskemålsredigering
- Röstinmatning till AI-chatt
- Ingen inloggning krävs
- Leveransstatus i realtid
- Beräknad ankomsttid
- Historisk prestandadata
- Datumfilter och trenddiagram
- Nedbrytning per fordonstyp
- PDF-exportfunktion
- Arkiv över slutförda rutter
- Prestandaöversikt per rutt
- Modell: OpenAI GPT-5-mini
- Strömmande svar via Server-Sent Events (SSE)
- Flottkontext: Assistenten har tillgång till aktuell data om fordon, rutter, stopp och insikter
- Tvåspråkig: Svarar på svenska och engelska
- Integration: Flytande chattfönster tillgängligt på alla sidor
- Modell: OpenAI Whisper-1
- Mediaformat: WebM, WAV, MP4
- Flöde: Mikrofon → MediaRecorder → Multipart upload → Whisper → Text → AI-chatt
- UI-feedback: Pulserande ring vid inspelning, spinner vid transkribering
- Språk: Automatisk detektering (svenska/engelska)
- Regelbaserade kontroller körs kontinuerligt
- AI-berikade rekommendationer med prioritering
- Insiktskategorier: förseningsrisker, kapacitetsvarningar, effektiviseringsförslag
- Per-organisationsprenumerationer
- Automatisk disruptions-pipeline:
- Mottar störning (trafikförsening, fordonsfel, nytt stopp)
- 5-sekunders debounce
- Automatisk omoptimering via ALNS
- Broadcast av resultatet
- Systemnotifikation skapas
- Automatisk detektering av fordons ankomst/avgång vid stopp
- Baserat på GPS-position och stoppradie
- Uppdaterar stoppstatus automatiskt (pending → in_progress → completed)
- Loggas i
geofence_events-tabellen
- Heatmap broadcastas var 30:e sekund
- Rutnätsceller med kongestionspoäng, försening och konfidens
- Visualiseras som färgade rektanglar på Leaflet-kartan
- Tillgänglig på livekarta och ruttplanerare
| Aspekt | Implementering |
|---|---|
| Multi-tenant | Alla data scopas per organisation via organization_id |
| RBAC | Tre roller: admin, dispatcher, driver |
| Rate limiting | Per-tenant begränsningar på API-anrop |
| Säkerhetsheaders | Helmet.js konfigurerat |
| CORS | Konfigurerat för tillåtna origins |
| Miljövariabler | Centraliserad Zod-validering |
| Validering | Zod-scheman på alla API-ingångar och -utgångar |
OpenAPI-specifikation (lib/api-spec/openapi.yaml)
↓ Orval
┌───────────────────────────────┐
│ lib/api-client-react/ │ → React Query hooks & TypeScript-typer
│ lib/api-zod/ │ → Zod-valideringsscheman
└───────────────────────────────┘
En central OpenAPI-specifikation definierar alla API-kontrakt. Orval genererar automatiskt:
- React Query hooks med fullständiga TypeScript-typer
- Zod-valideringsscheman för runtime-validering
- Ingen manuell typsynkronisering behövs mellan frontend och backend
- Ramverk: i18next med react-i18next
- Språk: Svenska (standard) och engelska
- Omfattning: Alla UI-texter, navigering, felmeddelanden, enheter
- Växling: Språkväxlare i sidopanelen (SV/EN)
| Mätvärde | Värde |
|---|---|
| Antal källkodsfiler | ~460 TypeScript/TSX-filer |
| ALNS-optimerare | 1 131 rader |
| Databastabeller | 14 stycken |
| API-ändpunkter | 50+ REST + WebSocket |
| Frontend-sidor | 18 sidor |
| Backend-tjänster | 7 specialtjänster |
| Stödda språk | 2 (svenska, engelska) |
| Fordonstyper | 3 (fossil, electric, hybrid) |
| Optimeringsoperatorer | 4 förstörelse + 3 reparation |
| Elområden | 4 (SE1–SE4) |
| Laddstationer | 10 (Stockholm) |
- ALNS Ruttoptimering — Adaptiv metaheuristik med 30s tidsbudget
- Kontinuerlig bakgrundsoptimering — 100ms-iterationer utan att blockera servern
- Inkrementell omoptimering — Hanterar störningar i realtid
- EV-laddningsplanering — Automatisk infogning av laddstationer
- Trafikprediktion-heatmap — Stockholms vägnät med kongestionsdata
- Realtidsflottspårning — WebSocket-baserade fordonspositioner
- Geofencing — Automatisk ankomst/avgångsdetektering
- CO₂-hållbarhetspanel — Utsläppspårning per fordonstyp
- Miljöpoäng — Sammanvägt buller, PM2.5 och CO₂ per rutt
- Bullermodellering — Nattruttsdetektering + bostadsområdesanalys
- PM2.5-partikelutsläpp — Hastighets- och bromsfaktorbaserat
- Elprisoptimering — ENTSO-E-priser (SE1–SE4) med optimalt laddfönster
- AI-chattassistent — GPT-5-mini med flottkontext och SSE-streaming
- Röststyrning — OpenAI Whisper med MediaRecorder
- Proaktiva AI-insikter — Regelbaserade + AI-berikade rekommendationer
- Förarpreferenser — Önskemål och automatisk nöjdhetspoäng (Happiness Score)
- Dispatch Gantt-tidslinje — Drag-and-drop stoppomtilldelning
- Excel/CSV-import — Bulkimport med kolumnmatchning
- CSV/PDF-export — Rutter, analys och förarrapporter
- Ruttjämförelse — Planerat vs faktiskt med deltakort
- Ruttmallar — Spara och återanvänd ruttmönster
- Kundspårning — Publik sida utan inloggning
- Leveransnotifikationer — Automatiska statusuppdateringar
- Rutthistorik — Arkiv med prestandaöversikt
- Return Handling — Omboka misslyckade stopp till nästa dag
- Kommandopalett — Ctrl+K snabbsökning
- Mörkt/ljust tema — Temabyte med localStorage
- Rollbaserad åtkomst — Admin, dispatcher, driver
- Multi-tenant — Organisationsisolering
- Mobilanpassad förarvy — Touch-vänlig leveranslista
Rapport genererad 2026-03-15 RouteAI v1.0 — Stockholm Logistics AB