Terminal im Geraetehaus mit Offline-Betrieb ergaenzen
Phase 4: eine eigene Oberflaeche unter /kiosk fuer das Wandtablet in der Fahrzeughalle — mit Handschuhen bedienbar und arbeitsfaehig, wenn das Netz weg ist. Datenmodell: Fahrt, Anwesenheit, Waescheabgabe, Inventurgang, Inventurposten, KioskVorgang und SyncKonflikt. Die Kennung eines Vorgangs erzeugt der Browser beim Einreihen und ist damit der Idempotenzschluessel; kommt derselbe Vorgang nach abgebrochener Uebertragung erneut an, erkennt ihn der Server wieder. Die Datenbank setzt vier Regeln selbst durch und verweigert UPDATE und DELETE auf kiosk_vorgang. Offline: von Hand geschriebener Service Worker, Warteschlange in der IndexedDB (Dexie), Fotos als Blob daneben, sichtbarer Zustand als Leiste ueber allem. Was sich beim Nachtragen nicht anwenden laesst, landet als Konflikt unter /terminal statt verworfen zu werden. Dazu: Anmeldung per Ausweis, PIN oder signierter QR-Marke vom Handy, Hallenmonitor mit optionalen DWD-Warnungen, Installation als App. Behoben: die Warteschlange zog ihren Wiederholungstakt bei jedem Rendern neu auf und haette einen liegen gebliebenen Vorgang nie ein zweites Mal geschickt. Gefunden vom Offline-E2E-Test. 31 neue Tests (20 Unit, 11 gegen eine echte Datenbank, 9 E2E je Browser). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d8d692098d
commit
791523027f
@@ -192,7 +192,7 @@ Zwei Dinge fielen erst beim Tun auf:
|
||||
|
||||
## Phase 4 — Kiosk-PWA
|
||||
|
||||
**Vergleichsaufwand: 16–22 PT**
|
||||
**Vergleichsaufwand: 16–22 PT** · **Tatsächlich: 3:00 h Sitzungszeit**
|
||||
|
||||
| Baustein | PT |
|
||||
|---|---:|
|
||||
@@ -211,6 +211,42 @@ unter Verbindungsabbruch, Doppelklick und parallelem Zugriff von zwei
|
||||
Terminals nichts verliert und nichts doppelt schreibt, ist die eigentliche
|
||||
Arbeit. Die Idempotenzschlüssel sind dafür der Schlüssel, nicht die Synchronisation.
|
||||
|
||||
**Rückblick.** Der Satz oben hat sich bestätigt, nur anders als gedacht. Die
|
||||
Outbox selbst war in einer halben Stunde geschrieben und mit zwölf Unit-Tests
|
||||
belegt. Zwei Stellen kosteten die Zeit, und keine davon steht in der
|
||||
Aufstellung:
|
||||
|
||||
- **Der Zeitgeber, der nie ablief.** Die Warteschlange hatte einen
|
||||
Wiederholungstakt von 20 Sekunden — und der wurde bei jedem Rendern neu
|
||||
aufgezogen, weil das Mutationsobjekt von React Query in den Abhängigkeiten
|
||||
stand. Alles sah richtig aus, alle Unit-Tests waren grün, und der liegen
|
||||
gebliebene Vorgang wäre im Gerätehaus trotzdem liegen geblieben. Gefunden hat
|
||||
das nur der Playwright-Test, der `context.setOffline(true)` setzt und dann
|
||||
wartet. Die 1,5 PT für „Playwright-Tests für den Offline-Fall" waren der
|
||||
bestangelegte Posten der Phase.
|
||||
- **Die Frage, wann ein Vorgang aus der Warteschlange darf.** Nicht „wenn
|
||||
erfolgreich", sondern „wenn er beim Server angekommen ist" — dazu gehört auch
|
||||
„bereits verarbeitet" und „in der Konfliktliste". Diese Unterscheidung ist die
|
||||
ganze Idempotenz; ohne sie kreist ein Vorgang für immer.
|
||||
|
||||
Billiger als angesetzt war die Anmeldung per RFID: die Aufstellung nennt WebHID,
|
||||
gebraucht wurde es nicht. Handelsübliche Leser geben die Kartenkennung als
|
||||
Tastatureingabe aus. Ein Zuhörer auf dem Fenster, der am Anschlagstempo
|
||||
erkennt, dass da keine Hand tippt, ersetzt eine ganze Geräteschnittstelle.
|
||||
|
||||
Billiger war auch der Service Worker — 80 Zeilen von Hand, ohne Workbox. Die
|
||||
Regeln sind einfach, solange man sie sich traut aufzuschreiben: Seiten aus dem
|
||||
Netz mit Ausweichseite, lesende Abfragen aus dem Zwischenspeicher mit
|
||||
Nachladen, schreibende **überhaupt nicht** anfassen. Eine Bibliothek hätte hier
|
||||
mehr Fragen aufgeworfen als beantwortet.
|
||||
|
||||
Teurer war die Terminaloberfläche selbst. Nicht die Kacheln, sondern die
|
||||
Zustände dahinter: Wer schon eingecheckt ist, sieht „Gehen" statt „Kommen". Wer
|
||||
mit einem Fahrzeug unterwegs ist, sieht „Fahrt beenden". Wer keine Rechte für
|
||||
die Inventur hat, sieht die Kachel nicht. Jede dieser Verzweigungen ist
|
||||
trivial — sechs davon in einem Schirm, der ohne Nachdenken bedienbar bleiben
|
||||
soll, sind es nicht.
|
||||
|
||||
## Phase 5 — Atemschutz nach FwDV 7
|
||||
|
||||
**Vergleichsaufwand: 14–18 PT**
|
||||
|
||||
Reference in New Issue
Block a user