'use client' import { useParams } from 'next/navigation' import { useFMEA, type FMEARow } from './_hooks/useFMEA' const COMP_TYPE_LABELS: Record = { mechanical: 'Mechanisch', electrical: 'Elektrisch', sensor: 'Sensor', actuator: 'Aktor', software: 'Software', firmware: 'Firmware', ai_model: 'KI-Modell', hmi: 'HMI', network: 'Netzwerk', hydraulic: 'Hydraulik', pneumatic: 'Pneumatik', safety: 'Sicherheit', } function rpzColor(rpz: number): string { if (rpz > 200) return 'bg-red-100 text-red-800 border-red-200' if (rpz > 100) return 'bg-orange-100 text-orange-800 border-orange-200' if (rpz > 50) return 'bg-yellow-100 text-yellow-800 border-yellow-200' return 'bg-green-100 text-green-800 border-green-200' } function rpzLabel(rpz: number): string { if (rpz > 200) return 'Kritisch' if (rpz > 100) return 'Handlungsbedarf' if (rpz > 50) return 'Beobachten' return 'Akzeptabel' } export default function FMEAPage() { const { projectId } = useParams<{ projectId: string }>() const { rows, loading, stats } = useFMEA(projectId) if (loading) { return (
) } return (
{/* Header */}

FMEA-Worksheet

Fehlermoeglich­keits- und Einflussanalyse — RPZ = Severity x Occurrence x Detection

{/* Stats */}
{/* RPZ Threshold Info */}
RPZ-Schwellen: Kritisch > 200 | Handlungsbedarf > 100 | Beobachten > 50 | Akzeptabel ≤ 50. Massnahmen sind erforderlich ab RPZ > 100.
{/* FMEA Table */} {rows.length === 0 ? (
Keine Failure Modes gefunden. Bitte zuerst Komponenten erfassen.
) : (
{rows.map((row, idx) => ( ))}
Komponente Typ Fehlerart Auswirkung S O D RPZ Bewertung Erkennung
)}
) } function FMEATableRow({ row }: { row: FMEARow }) { const color = rpzColor(row.rpz) return ( 100 ? 'bg-red-50/30 dark:bg-red-900/10' : ''}`}> {row.component.name} {COMP_TYPE_LABELS[row.component.component_type] || row.component.component_type}
{row.failureMode.name_de}
{row.failureMode.id}
{row.failureMode.effect} {row.severity} {row.occurrence} {row.detection} {row.rpz} {rpzLabel(row.rpz)} {row.failureMode.detection_hint || '-'} ) } function StatCard({ label, value, color }: { label: string; value: number; color: string }) { const colors: Record = { gray: 'bg-gray-50 text-gray-700 border-gray-200', red: 'bg-red-50 text-red-700 border-red-200', orange: 'bg-orange-50 text-orange-700 border-orange-200', green: 'bg-green-50 text-green-700 border-green-200', } return (
{value}
{label}
) }