@golemio/pid
Version:
Golemio PID Module
73 lines (69 loc) • 4.36 kB
Markdown
# TCP DPP common state_position
- Data chodí na TCP-IG
- Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/tcp_dpp_bus.md) a [input_realtime_data/tcp_dpp_tram.md](../input_realtime_data/tcp_dpp_tram.md)
- Transport (TCP) Input Gateway
- Raw data se uloží na blob storage (1MB buffer)
- knihovnou `xml2js` transformují na JSON
- pošlou na Rabbita do fronty `saveTramRunsToDB/saveBusRunsToDB`
- saveTramRunsToDB/saveBusRunsToDB
- zprávy se uloží do DB
- následně se pošlou do fronty `updateRunsGTFSTripId`
- updateRunsGTFSTripId
- data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`)
- pokud je tramvaj, je `tracking 2`
- nebo pokud je autobus
- pokud vozidlo odeslalo zprávu `O`, je `tracking 2`
- pokud je vozidlo v první zastávce (dle `tjr` — plánovaný čas JŘ), nebo pokud vozidlo vyjelo z první zastávky (dle `takt` — čas události), je `tracking 2`
- nebo je `tjr` atribut větší než příjezd do první zastávky spoje, je `tracking 2`
- jinak je `tracking 0`
- Rovněž se podle kmenové linky a oběhu vytvoří následující spoje (stav je `unknown`, `tracking` je vždy 0)
- navíc se předchozímu spoji vytvoří nová pozice s `tracking 0`, všechny spoje se odešlou na `updateDelay`
- Pokud je spoj vyhodnocen jako neveřejný (např. mazačka, náhradní autobus), vytvoří se nový spoj a pozice se stavem `not_public`, tím processing končí
- updateDelay
- upsert asociovaných pozic
- opětovné načtení asociovaných pozic z DB
- určení trasy spoje podle GTFS shapes a stop times
- processing pozic, uložení do databáze
- Not tracking (`tracking` je `0`)
- pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`
- pokud vozidlo jede z garáže, je stav `invisible`
- jinak je stav `before_track`
- pokud je poslední známá pozice s `tracking 2`
- pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
- pokud vozidlo jede do garáže, je stav `invisible`
- jinak je stav `after_track`
- **zvláštní případ**: pokud má pozice `cis_last_stop_id = null`, stav se znovu nevyhodnocuje – pozice si zachovává poslední známý stav (zmrazení stavu); to zabraňuje nežádoucímu cyklování zpět do `untracked` pouze kvůli chybějící CIS zastávce
- Tracking (`tracking` je `2`)
- pokud je vozidlo 200 metrů od nejblizšího bodu na trase, stav je `off_track`
- pokud je vozidlo v zastávce, je stav `at_stop`
- pokud je vozidlo mimo zastávku a zároveň vozidlo poslalo zprávu `O` mimo poslední zastávku, je stav `on_track`
- pokud je vozidlo v zastávce, nebo poslalo zprávu `V`, nebo poslalo zprávu v poslední zastávce, nebo poslalo zprávu z `tjr` atributem větší než je příjezd do poslední zastávky, je stav `after_track`
- propagateDelay
- podle kmenové linky a oběhu vyhledáme navazující spoje
- podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track` nebo `invisible`
- přepsání stavu na `before_track_delayed`
```mermaid
flowchart TB;
A[TCP data]-->B[Transport TCP Input Gateway]--raw data 1MB buffer-->Blob[Azure Blob Storage];
B-->Qu{Datový zdroj?};
Qu--tram-->X1[AMQP saveTramRunsToDB]-->|oběhy| N[AMQP updateRunsGTFSTripId];
Qu--bus-->X2[AMQP saveBusRunsToDB]-->|oběhy| N;
X1--upsert-->runs[(DB runs)];
X2--upsert-->runs;
N-->Qn{Je neveřejný? Např. mazačka};
Qn--Ano-->X3[updateNotPublicRunTrip];
Qn--Ne-->X4[generateDelayMsg];
X3--upsert-->trips;
X3--upsert-->positions;
X4--vygenerované spoje s GTFS daty-->E[AMQP updateDelay];
X4--upsert-->trips;
X4--upsert-->positions;
E--upsert-->trips[(DB trips)];
E--upsert-->positions[(DB positions)];
E--select-->trips;
E--select-->positions;
E--uložené spoje-->F[AMQP propagateDelay];
F--select-->trips;
F--select-->positions;
F--upsert-->positions;
```