This commit is contained in:
team3
2026-07-13 02:10:05 +02:00
parent 4fcbefc4a6
commit 7ee425f7fa
2 changed files with 18 additions and 10 deletions

View File

@@ -125,6 +125,18 @@ async def lauf_stop(topic: str):
return {"ok": True}
def _befunde_aktuell(topic: str) -> list[dict]:
"""Offene Befunde des jeweils jüngsten Laufs je Ebene — in zwei billigen Pässen."""
neueste = db.query(
"SELECT b.ebene, MAX(b.run_id) AS run_id FROM befunde b"
" JOIN runs r ON r.id=b.run_id WHERE r.topic=? GROUP BY b.ebene", (topic,))
out: list[dict] = []
for ne in neueste:
out += db.query("SELECT * FROM befunde WHERE run_id=? AND ebene=?"
" AND status='offen' ORDER BY id", (ne["run_id"], ne["ebene"]))
return out
@app.get("/api/topics/{topic}/state")
def state(topic: str):
t = db.one("SELECT * FROM topics WHERE name=?", (topic,))
@@ -153,16 +165,11 @@ def state(topic: str):
"bausteine": db.query(
"SELECT b.*, s.stage FROM bausteine b LEFT JOIN sections s ON s.baustein_id=b.id"
" WHERE b.topic=? ORDER BY b.ord", (topic,)),
# Je Ebene nur der JÜNGSTE Messstand: offene Befunde älterer Läufe sind
# veraltete Momentaufnahmen (aak: 1244 Anker-Leichen bei 0 echten) — der
# letzte Lauf, der die Ebene gemessen hat, ist die Wahrheit.
"befunde": db.query(
"SELECT b.* FROM befunde b JOIN runs r ON r.id=b.run_id"
" WHERE r.topic=? AND b.status='offen'"
" AND b.run_id = (SELECT MAX(b2.run_id) FROM befunde b2"
" JOIN runs r2 ON r2.id=b2.run_id"
" WHERE r2.topic=? AND b2.ebene=b.ebene)"
" ORDER BY b.id", (topic, topic)),
# Je Ebene nur der JÜNGSTE Messstand (veraltete Läufe sind Momentaufnahmen).
# ENTKORRELIERT: erst MAX(run_id) je Ebene, dann gezielte Lookups — der
# korrelierte Subquery brauchte 874 ms und staute hinter db._lock den
# ganzen Server (state wird bei jedem Poll/WS-Push gerufen).
"befunde": _befunde_aktuell(topic),
"agenten": agents.aktive_agenten(),
}