'use client' import { useState } from 'react' 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, components, suggestFMs, suggesting, suggestions, suggestSource, setSuggestions } = useFMEA(projectId) const [suggestComp, setSuggestComp] = useState(null) if (loading) { return (
) } return (
{/* Header */}

FMEA-Worksheet

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

{/* Info Box */} {/* KI-Vorschlag + Export */}
{/* Suggest Results */} {suggestions.length > 0 && (

KI-Vorschlaege ({suggestions.length}) — {suggestSource === 'llm' ? 'LLM-generiert' : 'Bibliothek'}

{suggestions.map((fm, i) => (
{fm.name_de}
{fm.effect}
S={fm.default_severity} O={fm.default_occurrence} D={fm.default_detection} RPZ={fm.default_severity * fm.default_occurrence * fm.default_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 AP 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} {row.ap} {rpzLabel(row.rpz)} {row.failureMode.detection_hint || '-'} ) } function FMEAInfoBox() { const [open, setOpen] = useState(false) return (
{open && (

FMEA (Fehlermoeglich- und Einflussanalyse) ist eine systematische Methode zur vorbeugenden Qualitaetssicherung nach AIAG-VDA (2019).

Bewertungsskalen (je 1-10):
  • S (Severity) — Schwere der Auswirkung: 1 = kaum merkbar, 10 = katastrophal (Lebensgefahr)
  • O (Occurrence) — Auftretenswahrscheinlichkeit: 1 = praktisch ausgeschlossen, 10 = sehr haeufig
  • D (Detection) — Entdeckbarkeit: 1 = sofort erkennbar, 10 = nicht erkennbar
Kennzahlen:
  • RPZ = S x O x D (1-1000). Ab RPZ > 100: Massnahme erforderlich.
  • AP (Action Priority) — AIAG-VDA Standard: H = sofort handeln, M = planen, L = beobachten
Beispiel: SPS-Steuerung → Kommunikationsausfall (S=8, O=3, D=5) → RPZ=120, AP=M → Massnahme: Redundante Kommunikation implementieren.
Workflow: 1. Komponente waehlen → 2. Fehlerart identifizieren → 3. S/O/D bewerten → 4. AP pruefen → 5. Bei H/M: Massnahme definieren → 6. Nach Massnahme: neu bewerten
)}
) } 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}
) }