Files
3d.lehrstun.de/docs/slotsystem.md

101 lines
4.0 KiB
Markdown
Raw Normal View History

2026-05-24 18:56:59 +02:00
---
type: konzept-modul
projekt: 3d.lehrstun.de
stand: 2026-05-23
tags: [konzept, slots, reservierung]
---
# Slot-System (Drucker-Reservierung)
> DB-Tabelle: [[datenmodell#slot]]. Routes: [[routen]]. Drucker-Status: [[druckerapi]].
## Ziel
Faire Verteilung der 4 Drucker auf 8-10 SuS, die unterschiedlich lange Drucke
fahren. Funktioniert auch bei Drucker-Ausfall ([[druckerapi]] kann brechen).
## Default: Windhund-Prinzip
- Wer zuerst kommt, bekommt den Slot.
- Jede:r SuS reserviert selbst über das Cockpit.
- Konflikt-Check: keine Überlappung mit aktiver/zukünftiger reservierter Reservierung
auf demselben Drucker.
## Override: Lehrer-Priorität
- Im [[routen#admin|Admin-Dashboard]] kann Herb/Herr Rechmann pro Slot `prioritaet`
2026-05-24 18:56:59 +02:00
setzen (Default 0, höher = wichtiger).
- Sortierung im UI: `ORDER BY prioritaet DESC, erstellt_am ASC`.
- Bei Konflikt durch Priorisierung: Site zeigt eine Warnung, verschiebt
nichts automatisch — Herb entscheidet.
## Slot-Granularität (Entscheidung **offen**)
Drei Optionen, siehe [[offene-fragen#slot-granularität]]:
| Option | Vorteil | Nachteil |
|---|---|---|
| **Freie Zeitspannen** (Start + Dauer) | flexibel, passt zu realer Druckzeit (15 Min - 8 h) | Konflikt-Check komplexer |
| **Feste Stunden-Slots** | einfach zu buchen, kalenderartig | unflexibel — 4-h-Druck blockiert 4 Slots |
| **Tages-Slots** (Vormittag/Nachmittag/Nacht) | passt zu langen Drucken | zu grob für kurze Drucke |
Empfehlung aus Recherche: **freie Zeitspannen**, weil Druckzeit stark variiert.
## Drucker-Ausfall-Handling
Wenn [[druckerapi]] meldet `status = failed` oder `offline` für > 10 Min:
```mermaid
flowchart TB
A[Drucker fällt aus] --> B{Aktive Slots betroffen?}
B -- ja --> C[Dashboard: rote Markierung]
C --> D[Vorschlag: Slot auf anderen Drucker verschieben]
D --> E[Admin: 1-Klick-Verschieben]
E --> F[Slot.drucker_id ändern]
F --> G[Cockpit-Notiz für betroffene SuS]
B -- nein --> H[Drucker als 'Wartung nötig' markieren]
```
## Konflikt-Erkennung
```sql
-- Neue Reservierung würde mit bestehender überlappen?
SELECT COUNT(*) FROM slot
WHERE drucker_id = :drucker_id
AND status IN ('reserviert', 'aktiv')
AND start_zeit < :neue_ende
AND ende_zeit > :neue_start;
```
Falls > 0 Treffer: Reservierung abgelehnt mit Liste der Konflikte.
## UI-Skizze (Cockpit-Slot-Buchung)
```
┌─ Drucker reservieren ──────────────────────────┐
│ │
│ Drucker: [ ▼ P1S #1 ] │
│ Start: [ Heute, 14:30 ] │
│ Dauer: [ 2 h 30 m ] (Schätzung aus 3MF) │
│ │
│ ┌─ Kalender ────────────────────────────────┐ │
│ │ P1S #1 ▓▓░░░░░░░░░░░░▓▓▓▓▓░░░░░░░░░░░ │ │
│ │ P1S #2 ░░░░░▓▓▓▓░░░░░░░░░░░░░░░▓▓▓░░░ │ │
│ │ X1C ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │ │
│ │ A1 mini ▓▓▓▓▓▓▓░░░░░░░░░░░▓▓░░░░░░░░░░ │ │
│ │ 09 11 13 15 17 19 21 23 │ │
│ └────────────────────────────────────────────┘ │
│ │
│ [ Reservieren ] │
└─────────────────────────────────────────────────┘
```
(Genaues Design folgt in [[etappen#etappe-6]].)
## Querverweise
- DB-Schema: [[datenmodell#slot]]
- Drucker-Live-Status (für Ausfall-Erkennung): [[druckerapi]]
- Routes: [[routen#profil]] + [[routen#admin]]
- Offene Frage zur Granularität: [[offene-fragen]]