/** * Ядро системы ПЛГ — Контроль лётной годности * 5 подсистем: ДЛГ (AD), Бюллетени (SB), Ресурсы, Программы ТО, Компоненты * * ВК РФ ст. 36, 37, 37.2; ФАП-148; ФАП-145; EASA Part-M; ICAO Annex 6/8 */ 'use client'; import { useState, useEffect, useCallback } from 'react'; import { PageLayout, DataTable, StatusBadge, Modal, EmptyState } from '@/components/ui'; type Tab = 'directives' | 'bulletins' | 'life-limits' | 'maint-programs' | 'components'; const TABS: { id: Tab; label: string; icon: string; basis: string }[] = [ { id: 'directives', label: 'ДЛГ / AD', icon: '⚠️', basis: 'ВК РФ ст. 37; ФАП-148 п.4.3' }, { id: 'bulletins', label: 'Бюллетени SB', icon: '📢', basis: 'ФАП-148 п.4.5; EASA Part-21' }, { id: 'life-limits', label: 'Ресурсы', icon: '⏱️', basis: 'ФАП-148 п.4.2; EASA Part-M.A.302' }, { id: 'maint-programs', label: 'Программы ТО', icon: '📋', basis: 'ФАП-148 п.3; ICAO Annex 6' }, { id: 'components', label: 'Компоненты', icon: '🔩', basis: 'ФАП-145 п.A.42; EASA Part-M.A.501' }, ]; export default function AirworthinessCorePage() { const [tab, setTab] = useState('directives'); const [data, setData] = useState>({}); const [loading, setLoading] = useState(false); const [showAddModal, setShowAddModal] = useState(false); const api = useCallback(async (endpoint: string, opts?: RequestInit) => { const res = await fetch(`/api/v1/airworthiness-core/${endpoint}`, opts); return res.json(); }, []); useEffect(() => { setLoading(true); const endpoint = tab === 'life-limits' ? 'life-limits' : tab === 'maint-programs' ? 'maintenance-programs' : tab; api(endpoint).then(d => { setData(prev => ({ ...prev, [tab]: d })); setLoading(false); }); }, [tab, api]); const currentTab = TABS.find(t => t.id === tab)!; const items = data[tab]?.items || []; const statusColors: Record = { open: 'bg-red-500', complied: 'bg-green-500', incorporated: 'bg-green-500', not_applicable: 'bg-gray-400', deferred: 'bg-yellow-500', serviceable: 'bg-green-500', unserviceable: 'bg-red-500', overhauled: 'bg-blue-500', scrapped: 'bg-gray-400', mandatory: 'bg-red-500', alert: 'bg-orange-500', recommended: 'bg-blue-500', info: 'bg-gray-400', }; const statusLabels: Record = { open: 'Открыта', complied: 'Выполнена', incorporated: 'Внедрён', not_applicable: 'Неприменимо', deferred: 'Отложена', serviceable: 'Исправен', unserviceable: 'Неисправен', overhauled: 'После ремонта', scrapped: 'Списан', mandatory: 'Обязат.', alert: 'Важный', recommended: 'Рекоменд.', info: 'Информ.', }; return ( setShowAddModal(true)} className="btn-primary text-sm px-4 py-2 rounded">+ Добавить}>
Ядро системы ПЛГ. ВК РФ ст. 36, 37, 37.2; ФАП-148; ФАП-145; EASA Part-M; ICAO Annex 6/8. Модуль обеспечивает непрерывный контроль лётной годности ВС.
{/* Tabs */}
{TABS.map(t => ( ))}
{loading ?
⏳ Загрузка...
: ( <> {/* DIRECTIVES (AD/ДЛГ) */} {tab === 'directives' && ( items.length > 0 ? ( v?.join(', ') || '—' }, { key: 'compliance_type', label: 'Тип', render: (v: string) => }, { key: 'effective_date', label: 'Дата', render: (v: string) => v ? new Date(v).toLocaleDateString('ru-RU') : '—' }, { key: 'status', label: 'Статус', render: (v: string) => }, ]} data={items} /> ) : )} {/* BULLETINS (SB) */} {tab === 'bulletins' && ( items.length > 0 ? ( }, { key: 'estimated_manhours', label: 'Трудоёмк. (ч)', render: (v: number) => v || '—' }, { key: 'status', label: 'Статус', render: (v: string) => }, ]} data={items} /> ) : )} {/* LIFE LIMITS */} {tab === 'life-limits' && ( items.length > 0 ? ( { if (!v) return '—'; const parts = []; if (v.hours !== undefined) parts.push(`${v.hours}ч`); if (v.cycles !== undefined) parts.push(`${v.cycles}цикл`); if (v.days !== undefined) parts.push(`${v.days}дн`); const isLow = Object.values(v).some((val: any) => typeof val === 'number' && val < 100); return {parts.join(' / ') || '—'}; }}, { key: 'critical', label: '⚠️', render: (v: boolean) => v ? КРИТИЧ. : '✅' }, ]} data={items} /> ) : )} {/* MAINTENANCE PROGRAMS */} {tab === 'maint-programs' && ( items.length > 0 ? (
{items.map((m: any) => (
{m.name}
{m.aircraft_type} · {m.revision}
{m.approved_by &&
Утв.: {m.approved_by}
}
{m.tasks?.length || 0} задач
))}
) : )} {/* COMPONENTS */} {tab === 'components' && ( items.length > 0 ? ( }, { key: 'certificate_type', label: 'Сертификат' }, ]} data={items} /> ) : )} )} {/* Legal basis footer */}
{currentTab.basis} · © АО «REFLY»
); }