/** * MYP Platform - Erweiterte Optimierungs- und Batch-Funktionen * Implementiert Auto-Optimierung und Batch-Planung für 3D-Druckaufträge */ class OptimizationManager { constructor() { this.isAutoOptimizationEnabled = false; this.isBatchModeEnabled = false; this.selectedJobs = new Set(); this.optimizationSettings = { algorithm: 'round_robin', // 'round_robin', 'load_balance', 'priority_based' considerDistance: true, minimizeChangeover: true, maxBatchSize: 10, timeWindow: 24 // Stunden }; this.init(); } init() { this.setupEventListeners(); this.loadSavedSettings(); this.updateUI(); } setupEventListeners() { // Keyboard shortcuts document.addEventListener('keydown', (e) => { if (e.ctrlKey && e.altKey && e.key === 'O') { this.toggleAutoOptimization(); e.preventDefault(); } if (e.ctrlKey && e.altKey && e.key === 'B') { this.toggleBatchMode(); e.preventDefault(); } }); } /** * Auto-Optimierung ein-/ausschalten * Diese Funktion optimiert automatisch die Druckreihenfolge basierend auf verschiedenen Faktoren */ toggleAutoOptimization() { this.isAutoOptimizationEnabled = !this.isAutoOptimizationEnabled; const button = document.getElementById('auto-opt-toggle'); if (button) { this.updateAutoOptimizationButton(button); } // Settings speichern localStorage.setItem('myp-auto-optimization', this.isAutoOptimizationEnabled); // Notification anzeigen this.showOptimizationNotification( this.isAutoOptimizationEnabled ? 'aktiviert' : 'deaktiviert', 'auto-optimization' ); // Wenn aktiviert, sofortige Optimierung durchführen if (this.isAutoOptimizationEnabled) { this.performAutoOptimization(); } // UI aktualisieren this.updateUI(); } updateAutoOptimizationButton(button) { const span = button.querySelector('span'); const icon = button.querySelector('svg'); if (this.isAutoOptimizationEnabled) { button.classList.remove('btn-secondary'); button.classList.add('btn-primary'); span.textContent = 'Auto-Optimierung AN'; // Button-Animation button.style.transform = 'scale(1.05)'; setTimeout(() => { button.style.transform = ''; }, 200); // Icon-Animation icon.style.animation = 'spin 1s ease-in-out'; setTimeout(() => { icon.style.animation = ''; }, 1000); } else { button.classList.remove('btn-primary'); button.classList.add('btn-secondary'); span.textContent = 'Auto-Optimierung'; } } /** * Batch-Modus ein-/ausschalten * Ermöglicht die Auswahl mehrerer Jobs für Batch-Operationen */ toggleBatchMode() { this.isBatchModeEnabled = !this.isBatchModeEnabled; const button = document.getElementById('batch-toggle'); if (button) { this.updateBatchModeButton(button); } // Batch-Funktionalität aktivieren/deaktivieren this.toggleBatchSelection(); // Settings speichern localStorage.setItem('myp-batch-mode', this.isBatchModeEnabled); // Notification anzeigen this.showOptimizationNotification( this.isBatchModeEnabled ? 'aktiviert' : 'deaktiviert', 'batch-mode' ); // UI aktualisieren this.updateUI(); } updateBatchModeButton(button) { const span = button.querySelector('span'); if (this.isBatchModeEnabled) { button.classList.remove('btn-secondary'); button.classList.add('btn-warning'); span.textContent = `Batch-Modus (${this.selectedJobs.size})`; // Button-Animation button.style.transform = 'scale(1.05)'; setTimeout(() => { button.style.transform = ''; }, 200); } else { button.classList.remove('btn-warning'); button.classList.add('btn-secondary'); span.textContent = 'Mehrfachauswahl'; // Auswahl zurücksetzen this.selectedJobs.clear(); } } toggleBatchSelection() { const jobCards = document.querySelectorAll('.job-card, [data-job-id]'); jobCards.forEach(card => { if (this.isBatchModeEnabled) { this.enableBatchSelection(card); } else { this.disableBatchSelection(card); } }); } enableBatchSelection(card) { // Checkbox hinzufügen let checkbox = card.querySelector('.batch-checkbox'); if (!checkbox) { checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.className = 'batch-checkbox absolute top-3 left-3 w-5 h-5 rounded border-2 border-gray-300 text-blue-600 focus:ring-blue-500'; checkbox.style.zIndex = '10'; // Event Listener für Checkbox checkbox.addEventListener('change', (e) => { const jobId = card.dataset.jobId; if (e.target.checked) { this.selectedJobs.add(jobId); card.classList.add('selected-for-batch'); } else { this.selectedJobs.delete(jobId); card.classList.remove('selected-for-batch'); } this.updateBatchCounter(); }); // Checkbox in die Karte einfügen card.style.position = 'relative'; card.appendChild(checkbox); } checkbox.style.display = 'block'; card.classList.add('batch-selectable'); } disableBatchSelection(card) { const checkbox = card.querySelector('.batch-checkbox'); if (checkbox) { checkbox.style.display = 'none'; } card.classList.remove('batch-selectable', 'selected-for-batch'); } updateBatchCounter() { const button = document.getElementById('batch-toggle'); if (button && this.isBatchModeEnabled) { const span = button.querySelector('span'); span.textContent = `Batch-Modus (${this.selectedJobs.size})`; } } /** * Automatische Optimierung durchführen */ async performAutoOptimization() { try { const response = await fetch('/api/optimization/auto-optimize', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': this.getCSRFToken() }, body: JSON.stringify({ settings: this.optimizationSettings, enabled: this.isAutoOptimizationEnabled }) }); const data = await response.json(); if (data.success) { this.showSuccessMessage(`Optimierung erfolgreich: ${data.optimized_jobs} Jobs optimiert`); this.refreshCurrentView(); } else { this.showErrorMessage(`Optimierung fehlgeschlagen: ${data.error}`); } } catch (error) { console.error('Auto-Optimierung Fehler:', error); this.showErrorMessage('Netzwerkfehler bei der Auto-Optimierung'); } } /** * Batch-Operationen durchführen */ async performBatchOperation(operation) { if (this.selectedJobs.size === 0) { this.showWarningMessage('Keine Jobs für Batch-Operation ausgewählt'); return; } const jobIds = Array.from(this.selectedJobs); try { const response = await fetch('/api/jobs/batch-operation', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': this.getCSRFToken() }, body: JSON.stringify({ job_ids: jobIds, operation: operation }) }); const data = await response.json(); if (data.success) { this.showSuccessMessage(`Batch-Operation "${operation}" erfolgreich auf ${jobIds.length} Jobs angewendet`); this.selectedJobs.clear(); this.updateBatchCounter(); this.refreshCurrentView(); } else { this.showErrorMessage(`Batch-Operation fehlgeschlagen: ${data.error}`); } } catch (error) { console.error('Batch-Operation Fehler:', error); this.showErrorMessage('Netzwerkfehler bei der Batch-Operation'); } } /** * Optimierungs-Einstellungen konfigurieren */ showOptimizationSettings() { this.createOptimizationModal(); } createOptimizationModal() { const modal = document.createElement('div'); modal.id = 'optimization-settings-modal'; modal.className = 'fixed inset-0 bg-black/60 backdrop-blur-sm z-50 flex items-center justify-center p-4'; modal.innerHTML = `
Konfigurieren Sie die automatische Optimierung für maximale Effizienz