Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester), 8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker (3 geschlossen + 1 A1 mini). Konzept v2 (Reality-Check-Iteration 2026-05-24): - Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert) - Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek - Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest) - Cockpit progressiv: zeigt nur was zum Status passt - Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell) - Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6) - Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien) - Entscheidungen E-001 bis E-022 in docs/decisions.md Etappe 1 lauffaehig (~1800 Zeilen Code): - Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api, services/auth+bambu+datei - Komplettes Schema in database.py (14 Tabellen, idempotent) - Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue Arduino-Kurs der In-Memory-Dict nutzt) - Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen - Inline-Edit-Endpunkt mit Whitelist + Audit-Log - Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen - Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging) Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
101 lines
4.0 KiB
Markdown
101 lines
4.0 KiB
Markdown
---
|
|
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/Markus pro Slot `prioritaet`
|
|
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]]
|