LEAG-COALLOG/docs/app-kommunikation.md
2026-04-24 11:32:38 +02:00

103 lines
3.6 KiB
Markdown

# App-Kommunikation
Dieses Diagramm zeigt die Kommunikation zwischen Browser, FastAPI-Backend,
Job-Ablage und der Python-Optimierungspipeline.
```mermaid
flowchart LR
user[Benutzer im Browser]
frontend[React Frontend<br/>Vite Build / App.jsx]
backend[FastAPI Backend<br/>webapp/backend/main.py]
jobs[(var/jobs<br/>Job-Status, Uploads, Logs, Outputs)]
preprocess[Preprocessing<br/>src/preprocessing/exploration_preprocess.py]
optimization[Optimierung<br/>src/optimization/run_optimization.py]
model[Pyomo Modell<br/>src/optimization/model_builder.py]
solver[Solver<br/>HiGHS / Gurobi / SCIP]
processed[(processed Parquet<br/>Job-Verzeichnis)]
output[(output.xlsx<br/>warmstart.json)]
user --> frontend
frontend -->|POST /api/run<br/>Excel + Parameter + optional Warmstart| backend
backend -->|Job-Verzeichnis anlegen| jobs
backend -->|Subprozess starten| preprocess
preprocess -->|liest Excel<br/>schreibt vorbereitete Tabellen| processed
backend -->|Subprozess starten| optimization
optimization -->|lädt Tabellen| processed
optimization --> model
model --> solver
solver -->|Lösung| model
optimization -->|Excel + Warmstart exportieren| output
backend -->|Status completed / failed / cancelled| jobs
frontend -->|GET /api/jobs/{job_id}| backend
frontend -->|GET /api/jobs/{job_id}/logs/{name}| backend
frontend -->|GET /api/jobs/{job_id}/monthly-flows| backend
frontend -->|GET /api/jobs/{job_id}/capacity-timeseries| backend
frontend -->|GET /api/jobs/{job_id}/output| backend
frontend -->|GET /api/jobs/{job_id}/warmstart| backend
frontend -->|POST /api/jobs/{job_id}/cancel| backend
backend -->|liest job.json / Logs| jobs
backend -->|liest output.xlsx| output
backend -->|liest processed Parquet| processed
```
## Ablauf eines Optimierungslaufs
```mermaid
sequenceDiagram
participant U as Benutzer
participant F as React Frontend
participant B as FastAPI Backend
participant P as Preprocessing
participant O as Optimierung
participant S as Solver
participant V as var/jobs
U->>F: Excel-Datei und Solver-Parameter auswaehlen
F->>B: POST /api/run
B->>V: Job-Verzeichnis, input.xlsx, job.json anlegen
B-->>F: job_id zurueckgeben
B->>P: exploration_preprocess.py als Subprozess
P->>V: processed/*.parquet und preprocess.log schreiben
B->>O: run_optimization.py als Subprozess
O->>S: Pyomo-Modell loesen
S-->>O: Loesung / Status
O->>V: output.xlsx, warmstart.json, optimization.log schreiben
B->>V: job.json auf completed/failed/cancelled setzen
loop Polling waehrend der Laufzeit
F->>B: GET /api/jobs/{job_id}
B-->>F: Status
F->>B: GET /api/jobs/{job_id}/logs/optimization
B-->>F: Logtext
end
F->>B: GET /api/jobs/{job_id}/monthly-flows
B-->>F: Monatsfluesse fuer Plotly
F->>B: GET /api/jobs/{job_id}/capacity-timeseries
B-->>F: Kapazitaets-Zeitreihen fuer Plotly
F->>B: GET /api/jobs/{job_id}/output
B-->>F: output.xlsx Download
```
## Deployment-Sicht
```mermaid
flowchart TB
subgraph docker[Docker Container leag-coallog]
nginxless[FastAPI / Uvicorn<br/>Port 8080]
static[React Static Build<br/>webapp/frontend/dist]
python[Python Runtime<br/>Preprocessing + Optimierung]
gurobi[Gurobi / HiGHS / SCIP]
end
browser[Browser] -->|HTTP :8080| nginxless
nginxless -->|liefert statische Dateien| static
nginxless -->|API-Aufrufe /api/*| python
python --> gurobi
python --> volume[(Host Volume ./var:/app/var)]
license[(Host ./licenses:/app/licenses:ro<br/>oder GRB_WLS*)] --> gurobi
```