From 137b53d1862aedac8eed730e631ed31ba087c9bd Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Sun, 19 Jan 2025 16:03:09 +0100 Subject: [PATCH] =?UTF-8?q?Die=20H=C3=A4ufigkeiten=20von=20Zugversp=C3=A4t?= =?UTF-8?q?ungen=20werden=20nun=20in=20der=20DB=20gespeichert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- init.sql | 13 ++++++++++++- main.go | 47 +++++++++++++++++++++++++++++++++++++--------- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7ab6609..c6b8e0e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: - MAX_RESULTS=200 - DURATION=240 - DELETE_AFTER_MINUTES=30 - - UPDATE_INTERVAL_MINUTES=3 + - UPDATE_INTERVAL_MINUTES=1 # Hildesheim HBF, Braunschweig HBF, Hannover HBF - STATION_IDS=8000169,8000049,8000152 restart: always diff --git a/init.sql b/init.sql index b63bc61..0e0360a 100644 --- a/init.sql +++ b/init.sql @@ -5,5 +5,16 @@ CREATE TABLE IF NOT EXISTS trips ( timestamp DATETIME, train_name VARCHAR(50), fahrt_nr VARCHAR(20), - trip_id VARCHAR(255) + trip_id VARCHAR(255), + planned_timestamp DATETIME, + delay INT +); + +CREATE TABLE IF NOT EXISTS delay_stats ( + id VARCHAR(36) PRIMARY KEY, + fahrt_nr VARCHAR(255), + total_trips INT, + delayed_trips INT, + avg_delay FLOAT, + last_updated DATETIME ); diff --git a/main.go b/main.go index 3873ccd..df1bad2 100644 --- a/main.go +++ b/main.go @@ -19,9 +19,11 @@ import ( ) type Departure struct { - TripId string `json:"tripId"` - When string `json:"when"` - Line struct { + TripId string `json:"tripId"` + When string `json:"when"` + PlannedWhen string `json:"plannedWhen"` + Delay int `json:"delay"` + Line struct { Name string `json:"name"` FahrtNr string `json:"fahrtNr"` } `json:"line"` @@ -191,6 +193,12 @@ func savePosition(db *sql.DB, dep Departure, apiBaseURL string) { return } + plannedWhenTime, err := time.Parse(time.RFC3339, dep.PlannedWhen) + if err != nil { + log.Printf("Fehler beim Parsen der geplanten Zeit für TripID %s: %v\n", dep.TripId, err) + return + } + today := whenTime.Format("2006-01-02") var existingID string @@ -198,24 +206,44 @@ func savePosition(db *sql.DB, dep Departure, apiBaseURL string) { if err == sql.ErrNoRows { id := uuid.New().String() - _, err = db.Exec("INSERT INTO trips (id, timestamp, train_name, fahrt_nr, trip_id, latitude, longitude) VALUES (?, ?, ?, ?, ?, ?, ?)", - id, whenTime, dep.Line.Name, dep.Line.FahrtNr, dep.TripId, latitude, longitude) + _, err = db.Exec("INSERT INTO trips (id, timestamp, planned_timestamp, delay, train_name, fahrt_nr, trip_id, latitude, longitude) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", + id, whenTime, plannedWhenTime, dep.Delay, dep.Line.Name, dep.Line.FahrtNr, dep.TripId, latitude, longitude) if err != nil { log.Printf("Fehler beim Speichern der neuen Position für TripID %s: %v\n", dep.TripId, err) } else { - log.Printf("Neue Position gespeichert (ID: %s, Zug: %s, FahrtNr: %s, Lat: %f, Lon: %f)\n", id, dep.Line.Name, dep.Line.FahrtNr, latitude, longitude) + log.Printf("Neue Position gespeichert (ID: %s, Zug: %s, FahrtNr: %s, Lat: %f, Lon: %f, Verspätung: %d)\n", id, dep.Line.Name, dep.Line.FahrtNr, latitude, longitude, dep.Delay) } } else if err == nil { - _, err = db.Exec("UPDATE trips SET timestamp = ?, train_name = ?, trip_id = ?, latitude = ?, longitude = ? WHERE id = ?", - whenTime, dep.Line.Name, dep.TripId, latitude, longitude, existingID) + _, err = db.Exec("UPDATE trips SET timestamp = ?, planned_timestamp = ?, delay = ?, train_name = ?, trip_id = ?, latitude = ?, longitude = ? WHERE id = ?", + whenTime, plannedWhenTime, dep.Delay, dep.Line.Name, dep.TripId, latitude, longitude, existingID) if err != nil { log.Printf("Fehler beim Aktualisieren der Position für TripID %s: %v\n", dep.TripId, err) } else { - log.Printf("Position aktualisiert (ID: %s, Zug: %s, FahrtNr: %s, Lat: %f, Lon: %f)\n", existingID, dep.Line.Name, dep.Line.FahrtNr, latitude, longitude) + log.Printf("Position aktualisiert (ID: %s, Zug: %s, FahrtNr: %s, Lat: %f, Lon: %f, Verspätung: %d)\n", existingID, dep.Line.Name, dep.Line.FahrtNr, latitude, longitude, dep.Delay) } } else { log.Printf("Fehler bei der Überprüfung des existierenden Eintrags für TripID %s: %v\n", dep.TripId, err) } + + updateDelayStats(db, dep.Line.FahrtNr, dep.Delay) +} + +func updateDelayStats(db *sql.DB, fahrtNr string, delay int) { + var id string + err := db.QueryRow("SELECT id FROM delay_stats WHERE fahrt_nr = ?", fahrtNr).Scan(&id) + + if err == sql.ErrNoRows { + id = uuid.New().String() + _, err = db.Exec("INSERT INTO delay_stats (id, fahrt_nr, total_trips, delayed_trips, avg_delay, last_updated) VALUES (?, ?, 1, ?, ?, NOW())", + id, fahrtNr, delay > 300, delay) + } else if err == nil { + _, err = db.Exec("UPDATE delay_stats SET total_trips = total_trips + 1, delayed_trips = delayed_trips + ?, avg_delay = ((avg_delay * total_trips) + ?) / (total_trips + 1), last_updated = NOW() WHERE id = ?", + delay > 300, delay, id) + } + + if err != nil { + log.Printf("Fehler beim Aktualisieren der Verspätungsstatistiken für FahrtNr %s: %v\n", fahrtNr, err) + } } func calculateCurrentPosition(trip *TripDetails, currentTime time.Time) (float64, float64) { @@ -298,3 +326,4 @@ func logDatabaseStats(db *sql.DB) { } log.Printf("Aktuelle Anzahl der Einträge in der Datenbank: %d\n", count) } +