import type { ReactNode } from 'react'; import { Fragment, useCallback, useEffect, useState } from 'react'; import { ArrowUpRight, CheckCircle2, ClipboardList, Clock3, PlusCircle, RefreshCw } from 'lucide-react'; import { fetchJson } from '../../../auth/api-client'; import { FAULT_OVERVIEW_METRICS, type FaultOverview, type FaultOverviewMetric } from '../../../shared/assets/faults'; import { FaultAnalysisModal } from './FaultAnalysisModal'; import { FaultWeeklyReport } from './FaultWeeklyReport'; import { FaultTrendCard } from './FaultTrendCard'; import './fault-management.css'; export const FAULT_DEFINITIONS = { reported: '按今日提报时间统计', closed: '按今日解决时间统计', open: '当前在办 = 待处理 + 处理中', ledger: '全部有效故障台账', }; const icons = { reported: PlusCircle, closed: CheckCircle2, open: Clock3, ledger: ClipboardList }; const metrics = ['reported', 'closed', 'open', 'ledger'] as const; export function FaultOverview({ navigation }: { navigation: ReactNode }) { const [data, setData] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const [revision, setRevision] = useState(0); const [metric, setMetric] = useState(null); const close = useCallback(() => setMetric(null), []); useEffect(() => { const controller = new AbortController(); setLoading(true); setError(''); fetchJson('/api/asset-faults/overview', { signal: controller.signal }) .then(result => { if (!controller.signal.aborted) setData(result); }).catch(e => { if (!controller.signal.aborted) setError(e instanceof Error ? e.message : '加载失败'); }) .finally(() => { if (!controller.signal.aborted) setLoading(false); }); return () => controller.abort(); }, [revision]); return

羚牛氢能 BI / 故障分析

羚牛氢能-故障管理

实时掌握故障数量、闭环趋势与运维进展。

{data ? `更新时间:${new Date(data.updatedAt).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false })}` : '正在读取故障台账'}
{navigation} {error &&
{error}
}

故障数据实时汇总

{data?.date || '—'} · 北京时间
{metrics.map(key => { const Icon = icons[key]; return
{key === 'open' && <>
{(['waiting', 'processing'] as const).map((part, index) => {index > 0 && } )}
}
; })}

当前在办 = 待处理 + 处理中,逾期为在办子集,不重复累加;按处置截止时间统计,挂起停表,未设置截止时间不计入逾期。

{metric && }
; }