feat(steady): 完善稳态数据视图功能

- 更新纵坐标刻度算法,优化小数趋势图范围显示
- 添加稳态趋势图全屏模式和共享工具组件
- 实现多图联动的鼠标悬停竖线同步功能
- 调整主线线宽分档策略,降低最大线宽限制
- 重构稳态趋势工具栏,优化谐波次数选择逻辑
- 添加周时间周期搜索支持和自定义时间范围选择
- 完善稳态数据表格和指示器浮动面板功能
- 优化稳态趋势图性能,添加LTB采样和动画控制
- 修复数据表格打开前的趋势数据验证问题
- 统一时间轴标签格式化和网格对齐处理
This commit is contained in:
2026-05-27 08:06:12 +08:00
parent b9ddfb5275
commit 055e69fff7
83 changed files with 9616 additions and 226 deletions

View File

@@ -3,7 +3,8 @@ import type { SteadyDataView } from '@/api/steady/steadyDataView/interface'
export const MAX_TREND_SERIES_COUNT = 24
export const MAX_SELECTED_LINE_COUNT = 6
export const MAX_SELECTED_INDICATOR_COUNT = 6
export const MAX_HARMONIC_ORDER_COUNT = 6
export const MAX_HARMONIC_ORDER_COUNT = 3
const STEADY_INDICATOR_GROUP_ORDER = ['电压趋势', '电流趋势']
const isSelectableLineNode = (node: SteadyDataView.SteadyLedgerNode) => {
return node.level === 3 && node.selectable !== false
@@ -47,6 +48,30 @@ export const collectLeafIndicators = (nodes: SteadyDataView.SteadyIndicatorNode[
return indicators
}
const resolveSteadyIndicatorGroupOrder = (node: SteadyDataView.SteadyIndicatorNode) => {
const orderName = String(node.name || '').trim()
const orderIndex = STEADY_INDICATOR_GROUP_ORDER.findIndex(name => orderName === name)
return orderIndex === -1 ? STEADY_INDICATOR_GROUP_ORDER.length : orderIndex
}
export const sortSteadyIndicatorTree = (
nodes: SteadyDataView.SteadyIndicatorNode[]
): SteadyDataView.SteadyIndicatorNode[] => {
return nodes
.map((node, index) => ({ node, index }))
.sort((left, right) => {
const leftOrder = resolveSteadyIndicatorGroupOrder(left.node)
const rightOrder = resolveSteadyIndicatorGroupOrder(right.node)
return leftOrder === rightOrder ? left.index - right.index : leftOrder - rightOrder
})
.map(({ node }) => ({
...node,
children: node.children?.length ? sortSteadyIndicatorTree(node.children) : node.children
}))
}
export const findFirstSelectableLedgerNode = (
nodes: SteadyDataView.SteadyLedgerNode[]
): SteadyDataView.SteadyLedgerNode | null => {
@@ -100,7 +125,8 @@ export const estimateTrendSeriesCount = (
statType: SteadyDataView.SteadyTrendStatType,
harmonicOrders: number[]
) => {
const harmonicMultiplier = hasHarmonicIndicator(indicators) ? Math.max(harmonicOrders.length, 1) : 1
void harmonicOrders
const harmonicMultiplier = 1
return indicators.reduce((count, indicator) => {
const phaseCount = indicator.phaseCodes?.length || 1
@@ -113,7 +139,7 @@ export const estimateTrendSeriesCount = (
export const validateHarmonicOrders = (indicators: SteadyDataView.SteadyIndicatorNode[], harmonicOrders: number[]) => {
if (!hasHarmonicIndicator(indicators)) return ''
if (!harmonicOrders.length) return '谐波指标必须选择谐波次数'
if (harmonicOrders.length > MAX_HARMONIC_ORDER_COUNT) return '谐波次数最多选择 6 个'
if (harmonicOrders.length > MAX_HARMONIC_ORDER_COUNT) return `谐波次数最多选择 ${MAX_HARMONIC_ORDER_COUNT}`
return ''
}