From 4214dca4af22dfe3fdf58aa0f8b7ee765036b5eb Mon Sep 17 00:00:00 2001 From: shishengliang Date: Sat, 24 Oct 2026 13:37:09 +0800 Subject: [PATCH] feat(faults): add severity dimension and detail column --- src/modules/assets/faults/FaultAnalysisModal.tsx | 4 ++-- src/modules/assets/faults/FaultManagement.tsx | 2 +- src/modules/assets/faults/analysis-model.ts | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/modules/assets/faults/FaultAnalysisModal.tsx b/src/modules/assets/faults/FaultAnalysisModal.tsx index 2f3accc..3516443 100644 --- a/src/modules/assets/faults/FaultAnalysisModal.tsx +++ b/src/modules/assets/faults/FaultAnalysisModal.tsx @@ -43,7 +43,7 @@ export function FaultAnalysisModal({ metric, onClose, source }: { metric: FaultO }, [metric, revision, source?.url]); const records = useMemo(() => data?.rows || [], [data]); const handlerLabels = useMemo(() => new Map(records.flatMap(row => row.handlers.map(h => [h.value, h.label] as const))), [records]); - const label = (d: FaultAnalysisDimension, value: string) => d === 'plate' ? value : d === 'faultStatus' ? FAULT_CLOSURE_LABELS[value] || value : d === 'handler' ? handlerLabels.get(value) || '未指派' : d === 'customer' ? data?.customerLabels[value] || '未关联客户' : getDimensionValueLabel(d, value); + const label = (d: FaultAnalysisDimension, value: string) => d === 'plate' ? value : d === 'faultStatus' ? FAULT_CLOSURE_LABELS[value] || value : d === 'handler' ? handlerLabels.get(value) || '未指派' : d === 'level' ? value || '未标注' : d === 'customer' ? data?.customerLabels[value] || '未关联客户' : getDimensionValueLabel(d, value); const options = available.map(key => { const otherFilters = { ...filters }; delete otherFilters[key]; const counts = new Map(); @@ -78,7 +78,7 @@ export function FaultAnalysisModal({ metric, onClose, source }: { metric: FaultO
{error ?
{error}
: !data ? : group ? <>
{groupLabel(group)} · {details.length.toLocaleString()} 单
-
{['车牌 / 故障单号', '运维处置人', '故障描述', '状态', '提报时间', '解决时间', '运营城市', '客户 / 部门'].map(h => )}{details.slice(0, limit).map(row => )}
{h}
{row.plate || '未关联车辆'}{row.code || '未编号'}{row.handlers.map(h => h.label).join('、') || '未指派'}{row.description || '—'}{row.status}{row.reportedAt || '—'}{row.archivedAt || '—'}{row.city}{row.customerLabel}{row.department}
+
{['车牌 / 故障单号', '故障程度', '运维处置人', '故障描述', '状态', '提报时间', '解决时间', '运营城市', '客户 / 部门'].map(h => )}{details.slice(0, limit).map(row => )}
{h}
{row.plate || '未关联车辆'}{row.code || '未编号'}{row.level || '未标注'}{row.handlers.map(h => h.label).join('、') || '未指派'}{row.description || '—'}{row.status}{row.reportedAt || '—'}{row.archivedAt || '—'}{row.city}{row.customerLabel}{row.department}
{!details.length &&

没有符合条件的故障明细

} {details.length > limit && } : <> diff --git a/src/modules/assets/faults/FaultManagement.tsx b/src/modules/assets/faults/FaultManagement.tsx index d6dd581..d06b010 100644 --- a/src/modules/assets/faults/FaultManagement.tsx +++ b/src/modules/assets/faults/FaultManagement.tsx @@ -50,7 +50,7 @@ export default function FaultManagement(){
实时统计
{data.distributions.region[0]?`本期关注:${data.distributions.region[0].label}故障量最高,共 ${data.distributions.region[0].reported} 单;当前 ${t?.overdue} 单在办故障已逾期。`:'所选条件下暂无本期故障,可调整日期或筛选范围。'}按数量描述,不代表故障发生率。
- {tab==='多维分析'&&

组合维度,追溯故障

支持运维处置人、车牌、工单状态、车型、区域、客户等 12 个维度,多选筛选与明细下钻。

} + {tab==='多维分析'&&

组合维度,追溯故障

支持运维处置人、车牌、故障程度、工单状态、车型、区域、客户等 13 个维度,多选筛选与明细下钻。

}
diff --git a/src/modules/assets/faults/analysis-model.ts b/src/modules/assets/faults/analysis-model.ts index 2a60299..002fd60 100644 --- a/src/modules/assets/faults/analysis-model.ts +++ b/src/modules/assets/faults/analysis-model.ts @@ -2,10 +2,10 @@ import type { AssetAnalysisDimension } from '../../../shared/assets/analytics'; import type { FaultAnalysisRecord } from '../../../shared/assets/faults'; import { DIMENSION_LABELS, getAvailableDimensions } from '../analytics-model'; -export type FaultAnalysisDimension = AssetAnalysisDimension | 'handler' | 'plate' | 'faultStatus'; +export type FaultAnalysisDimension = AssetAnalysisDimension | 'handler' | 'plate' | 'faultStatus' | 'level'; export type FaultAnalysisFilters = Partial>; -export const FAULT_ANALYSIS_DIMENSIONS: FaultAnalysisDimension[] = getAvailableDimensions('assets').flatMap(d => d === 'type' ? [d, 'handler', 'plate', 'faultStatus'] : [d]); -export const FAULT_ANALYSIS_LABELS = { ...DIMENSION_LABELS, handler: '运维处置人', plate: '车牌', faultStatus: '故障工单状态' }; +export const FAULT_ANALYSIS_DIMENSIONS: FaultAnalysisDimension[] = getAvailableDimensions('assets').flatMap(d => d === 'type' ? [d, 'handler', 'plate', 'faultStatus', 'level'] : [d]); +export const FAULT_ANALYSIS_LABELS = { ...DIMENSION_LABELS, handler: '运维处置人', plate: '车牌', faultStatus: '故障工单状态', level: '故障程度' }; export const FAULT_CLOSURE_LABELS: Record = { closed: '已闭环', unclosed: '未闭环' }; export interface FaultAnalysisGroup { key: string; values: Partial>; @@ -14,6 +14,7 @@ export interface FaultAnalysisGroup { export function faultDimensionValues(row: FaultAnalysisRecord, dimension: FaultAnalysisDimension): string[] { if (dimension === 'plate') return [row.plate?.trim() || '未关联车辆']; if (dimension === 'faultStatus') return [row.status === '已归档' ? 'closed' : 'unclosed']; + if (dimension === 'level') return [row.level?.trim() || '未标注']; return dimension === 'handler' ? [...new Set(row.handlers.length ? row.handlers.map(h => h.value) : ['unassigned'])] : [row.cell[dimension]]; } export function filterFaultRecords(rows: FaultAnalysisRecord[], filters: FaultAnalysisFilters = {}): FaultAnalysisRecord[] {