const stateLabels = { online: '在线', offline: '离线', recovering: '恢复中', ready: '正常', unavailable: '不可用', idle: '无待回填', pending: '等待回填' } const eventLabels = { heartbeat_received: '首次心跳', heartbeat_timeout: '心跳超时', node_recovered: '心跳恢复', recovery_started: '开始恢复' } export function stateLabel(value) { return stateLabels[value] || value || '未知' } export function eventLabel(value) { return eventLabels[value] || value || '状态变化' } export function stateType(value) { return ({ online: 'success', offline: 'danger', recovering: 'warning', ready: 'success', unavailable: 'danger', idle: 'info', pending: 'warning' })[value] || 'info' } export function freshnessText(item) { if (!item?.lastHeartbeatAt) return '从未收到心跳' const seconds = Math.max(0, Number(item.freshnessSeconds) || 0) if (item.stale) return `已陈旧 ${durationText(seconds)}` return `${durationText(seconds)}前` } export function durationText(seconds) { const value = Math.max(0, Number(seconds) || 0) if (value < 60) return `${Math.floor(value)} 秒` if (value < 3600) return `${Math.floor(value / 60)} 分钟` if (value < 86400) return `${Math.floor(value / 3600)} 小时` return `${Math.floor(value / 86400)} 天` } export function buildEdgeNodeQuery(query) { return { pageIndex: Number(query.pageIndex) || 1, pageSize: Number(query.pageSize) || 10 } }