B: Explizite lineare Druck-Warteschlange + Formatwechsel-Bestaetigung

Schema (bootstrap):
- jobs.position (float) = explizite lineare Reihenfolge; machines.pending_format = vom Agent angefordertes naechstes Format
- Service-Rechte: jobs.update +position, machines.update +pending_format

Einreihen (skrift-orders): enqueue/enqueue-bulk vergeben position (ans Ende je Maschine)

Board (produktion) Warteschlange: EINE lineare Liste je Maschine (nicht mehr nach
Format gebuendelt), Hoch/Runter/Anfang/Ende-Umsortieren, Formatwechsel-Marker,
laufende Jobs, Banner "Format einlegen -> bestaetigen" (setzt current_format, leert pending)

Uebersicht (Mitarbeiter): Maschinen-Panel mit Bestaetigen/Starten + Vorschau der
kommenden Format-Segmente; jobs nach position sortiert

ACHTUNG Deploy: Bootstrap VOR Directus-Neustart UND vor Agent-Update (neue Felder/Rechte).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-10-01 13:41:12 +02:00
parent a1a2a615cc
commit 0f7f9c3bd9
4 changed files with 193 additions and 78 deletions

View File

@@ -404,6 +404,10 @@ const collections = [
// format-Schlüssel und springt nie selbstständig auf ein anderes Format.
// Leer = Maschine wartet, bis im Board ein Format als eingelegt gewählt wird.
f('current_format', 'string', { interface: 'input', note: 'Aktuell eingelegtes Format (Agent druckt nur passende Jobs). Leer = wartet auf Formatwahl.' }),
// Vom Agent angefordertes NÄCHSTES Format (lineare Warteschlange): der nächste
// geplante Job braucht ein anderes Format → Agent pausiert und setzt dies, das
// Board zeigt „Format einlegen → bestätigen" (setzt current_format, leert dies).
f('pending_format', 'string', { interface: 'input', note: 'Angefordertes nächstes Format (wartet auf Bestätigung im Board).' }),
f('notes', 'text', { interface: 'input-multiline' }),
] },
@@ -471,6 +475,9 @@ const collections = [
f('format_label', 'string', { interface: 'input', note: 'Lesbare Formatbezeichnung für die Warteschlangen-Ansicht.' }),
dropdown('status', ['queued', 'printing', 'printed', 'failed', 'shipped'], { default: 'queued' }),
f('priority', 'integer', { interface: 'input', default: 0, note: 'Höher = zuerst. Direktdruck bekommt hohe Priorität.' }),
// Explizite lineare Reihenfolge der Plan-Warteschlange (klein = zuerst). Ein
// Format darf mehrfach an verschiedenen Positionen stehen; im Board umsortierbar.
f('position', 'float', { interface: 'input', default: 0, note: 'Lineare Position in der Warteschlange (klein = zuerst).' }),
// Pro-Druck-Übersteuerung der Template-Maße (Breite/Höhe/X/Y/Scale/Rot).
// Vom Druck-Popup gesetzt; leer = Template-Werte verwenden.
f('params', 'json', { interface: 'input-code', note: 'Maß-Übersteuerung {width,height,xpos,ypos,scale,rotation} (leer = Template).' }),
@@ -1296,9 +1303,9 @@ async function applyPermissions() {
['status', 'artifact_path', 'payment_status', 'payment_ref', 'production_status', 'brief_gedruckt', 'kuvert_gedruckt']);
await ensurePermission(svcPol.id, 'jobs', 'create');
// Agent meldet Druckfortschritt zurück.
await ensurePermission(svcPol.id, 'jobs', 'update', ['status', 'priority', 'error']);
// Agent meldet Maschinenzustand (Heartbeat).
await ensurePermission(svcPol.id, 'machines', 'update', ['status', 'last_seen']);
await ensurePermission(svcPol.id, 'jobs', 'update', ['status', 'priority', 'error', 'position']);
// Agent meldet Maschinenzustand (Heartbeat) + fordert Formatwechsel an.
await ensurePermission(svcPol.id, 'machines', 'update', ['status', 'last_seen', 'pending_format']);
await ensurePermission(svcPol.id, 'status_history', 'create');
// Hochgeladene Druckdateien lesen (Backend führt PDFs für den Charge-Sammeldruck
// zusammen und lädt sie dafür über /assets).