export const displacementMetricOptions = [ // 位移专属看板本轮只保留一个业务指标,避免前端继续暴露无效的多指标切换入口。 { field: 'vibrationDisplacement', label: '位移', unit: 'um', color: '#5b8ff9' } ] as const; export const displacementMetricMap = Object.fromEntries(displacementMetricOptions.map((item) => [item.field, item])); export const displacementHeatmapColors = ['#0f766e', '#0ea5a4', '#38bdf8', '#fde68a', '#fb923c', '#ef4444']; export const getDisplacementMetricOption = (field?: string) => displacementMetricMap[field || ''] || displacementMetricOptions[0]; export const toNumber = (value: number | string | undefined, fallback = 0) => { const numberValue = Number(value); return Number.isFinite(numberValue) ? numberValue : fallback; }; export const formatMetricValue = (value: number | string | undefined, digits = 2) => { if (value === null || value === undefined || value === '') { return '--'; } return toNumber(value).toFixed(digits); }; export const formatPercentValue = (value: number | string | undefined, digits = 1) => `${(toNumber(value) * 100).toFixed(digits)}%`; export const buildCategoryDataZoom = (length: number, axis: 'x' | 'y' = 'y') => { if (length <= 8) { return []; } const start = Math.max(0, 100 - Math.round((8 / length) * 100)); if (axis === 'x') { return [ { type: 'inside', xAxisIndex: 0, filterMode: 'none' }, { type: 'slider', xAxisIndex: 0, filterMode: 'none', start, end: 100, height: 14, bottom: 4 } ]; } return [ { type: 'inside', yAxisIndex: 0, filterMode: 'none' }, { type: 'slider', yAxisIndex: 0, filterMode: 'none', start, end: 100, width: 12, right: 4 } ]; }; export const formatDateTime = (date: Date) => { const p = (n: number) => n.toString().padStart(2, '0'); return `${date.getFullYear()}-${p(date.getMonth() + 1)}-${p(date.getDate())} ${p(date.getHours())}:${p(date.getMinutes())}:${p(date.getSeconds())}`; }; export const createDefaultTimeRange = () => { const end = new Date(); const start = new Date(end.getTime() - 24 * 3600 * 1000); return [formatDateTime(start), formatDateTime(end)]; };