Die Dateien wurden in mehreren Bereichen des Backend-Systems aktualisiert und hinzugefügt:

1. 'backend/'
   - 'startup_test.log', 'startup_test2.log' (neue Logdateien)
   - 'imprint.html', 'legal.html', 'legal_complex.html.backup' (Dateiänderungen)
   - 'utils/job_queue_system.py', 'utils/utilities
This commit is contained in:
2025-06-19 23:43:43 +02:00
parent db88620d0c
commit 1b13ef3157
589 changed files with 2518 additions and 600 deletions

View File

@ -219,6 +219,107 @@ class ConflictManager:
except Exception as e:
job_logger.error(f"Fehler bei alternativer Zeitfindung: {e}")
return None
def detect_conflicts(self, job_data: dict, db_session) -> List[dict]:
"""
Erkennt Konflikte für einen geplanten Job.
Args:
job_data: Dictionary mit Job-Informationen (printer_id, start_time, end_time, priority, etc.)
db_session: Datenbank-Session
Returns:
List[dict]: Liste der erkannten Konflikte
"""
try:
from models import Job, Printer
conflicts = []
printer_id = job_data.get('printer_id')
start_time = job_data.get('start_time')
end_time = job_data.get('end_time')
priority = job_data.get('priority', 'normal')
if not all([printer_id, start_time, end_time]):
job_logger.warning("Unvollständige Job-Daten für Konflikt-Erkennung")
return conflicts
# Prüfe Drucker-Verfügbarkeit
printer = db_session.query(Printer).filter(Printer.id == printer_id).first()
if not printer:
conflicts.append({
'type': ConflictType.RESOURCE_CONFLICT,
'severity': ConflictSeverity.CRITICAL,
'message': f'Drucker {printer_id} nicht gefunden',
'printer_id': printer_id,
'affected_resource': 'printer'
})
return conflicts
if not printer.active:
conflicts.append({
'type': ConflictType.RESOURCE_CONFLICT,
'severity': ConflictSeverity.HIGH,
'message': f'Drucker {printer.name} ist deaktiviert',
'printer_id': printer_id,
'affected_resource': 'printer_status'
})
# Prüfe zeitliche Überschneidungen
conflicting_jobs = db_session.query(Job).filter(
Job.printer_id == printer_id,
Job.status.in_(['pending', 'printing', 'scheduled']),
Job.start_at < end_time,
Job.end_at > start_time
).all()
for existing_job in conflicting_jobs:
# Bestimme Schweregrad basierend auf Priorität
if priority == 'urgent' and existing_job.priority != 'urgent':
severity = ConflictSeverity.MEDIUM # Urgent jobs können andere verdrängen
elif existing_job.priority == 'urgent':
severity = ConflictSeverity.HIGH # Urgent jobs sind schwer zu verdrängen
else:
severity = ConflictSeverity.HIGH # Standard-Zeitkonflikt
conflicts.append({
'type': ConflictType.TIME_OVERLAP,
'severity': severity,
'message': f'Zeitüberschneidung mit Job "{existing_job.name}"',
'printer_id': printer_id,
'conflicting_job_id': existing_job.id,
'conflicting_job_name': existing_job.name,
'conflicting_start': existing_job.start_at.isoformat() if existing_job.start_at else None,
'conflicting_end': existing_job.end_at.isoformat() if existing_job.end_at else None,
'conflicting_priority': existing_job.priority,
'overlap_start': max(start_time, existing_job.start_at).isoformat() if existing_job.start_at else None,
'overlap_end': min(end_time, existing_job.end_at).isoformat() if existing_job.end_at else None
})
# Prüfe Drucker-spezifische Verfügbarkeit (z.B. Wartung)
if hasattr(printer, 'maintenance_until') and printer.maintenance_until:
if printer.maintenance_until > start_time:
conflicts.append({
'type': ConflictType.RESOURCE_CONFLICT,
'severity': ConflictSeverity.HIGH,
'message': f'Drucker {printer.name} ist in Wartung bis {printer.maintenance_until}',
'printer_id': printer_id,
'affected_resource': 'maintenance',
'maintenance_until': printer.maintenance_until.isoformat()
})
job_logger.debug(f"Konflikt-Erkennung für Drucker {printer_id}: {len(conflicts)} Konflikte gefunden")
return conflicts
except Exception as e:
job_logger.error(f"Fehler bei Konflikt-Erkennung: {e}")
return [{
'type': ConflictType.RESOURCE_CONFLICT,
'severity': ConflictSeverity.CRITICAL,
'message': f'Fehler bei Konflikt-Analyse: {str(e)}',
'printer_id': job_data.get('printer_id'),
'affected_resource': 'system_error'
}]
# ===== TIMER MANAGER =====