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:
@ -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 =====
|
||||
|
||||
|
Reference in New Issue
Block a user