feat(data-tools): 新增入库类型选择功能并优化数据工具界面

- 在补数任务面板中添加入库类型单选按钮组,支持 MySQL 和 InfluxDB
- 更新 AddData 接口定义,添加 StorageType 相关类型和选项接口
- 修改补数 API 请求逻辑,根据入库类型动态调整接口路径前缀
- 重构台账设备表单,统一使用装置网络参数作为 MAC 和 NDID 的单一数据源
- 优化台账线路表单,仅当存在 ID 时才设置 lineId 字段,避免空值传递
- 添加入库类型列表获取接口和相关数据处理逻辑
- 更新台账字典代码常量,新增终端型号字典码
- 优化台账树节点添加逻辑,增加前置条件验证和禁用原因提示
- 添加 InfluxDB 配置文件到额外资源目录
- 更新稳定数据分析视图,优化台账树数据结构处理和样式布局
- 完善 API 调试契约检查,确保设备和线路数据映射正确性
- 优化趋势查询性能,禁用全局加载状态提升用户体验
This commit is contained in:
2026-05-21 14:07:10 +08:00
parent f1eaabae0e
commit b9ddfb5275
23 changed files with 2462 additions and 180 deletions

View File

@@ -1,6 +1,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
const isSelectableLineNode = (node: SteadyDataView.SteadyLedgerNode) => {
@@ -25,6 +27,7 @@ export const collectSelectedLineIds = (nodes: SteadyDataView.SteadyLedgerNode[])
export const collectLeafIndicators = (nodes: SteadyDataView.SteadyIndicatorNode[]) => {
const indicators: SteadyDataView.SteadyIndicatorNode[] = []
const seenIndicatorKeys = new Set<string>()
const collect = (node: SteadyDataView.SteadyIndicatorNode) => {
if (node.children?.length) {
@@ -32,9 +35,11 @@ export const collectLeafIndicators = (nodes: SteadyDataView.SteadyIndicatorNode[
return
}
if (node.indicatorCode) {
indicators.push(node)
}
const indicatorKey = node.indicatorCode || node.treeKey || node.id
if (!indicatorKey || seenIndicatorKeys.has(indicatorKey)) return
seenIndicatorKeys.add(indicatorKey)
indicators.push(node)
}
nodes.forEach(collect)
@@ -92,7 +97,7 @@ export const resolveAvailableStats = (indicators: SteadyDataView.SteadyIndicator
export const estimateTrendSeriesCount = (
lineIds: string[],
indicators: SteadyDataView.SteadyIndicatorNode[],
statTypes: SteadyDataView.SteadyTrendStatType[],
statType: SteadyDataView.SteadyTrendStatType,
harmonicOrders: number[]
) => {
const harmonicMultiplier = hasHarmonicIndicator(indicators) ? Math.max(harmonicOrders.length, 1) : 1
@@ -101,14 +106,11 @@ export const estimateTrendSeriesCount = (
const phaseCount = indicator.phaseCodes?.length || 1
const fieldCount = Math.max(indicator.seriesFields?.length || indicator.baseFields?.length || 1, 1)
return count + lineIds.length * phaseCount * Math.max(statTypes.length, 1) * fieldCount * harmonicMultiplier
return count + lineIds.length * phaseCount * (statType ? 1 : 0) * fieldCount * harmonicMultiplier
}, 0)
}
export const validateHarmonicOrders = (
indicators: SteadyDataView.SteadyIndicatorNode[],
harmonicOrders: number[]
) => {
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 个'
@@ -119,20 +121,22 @@ export const validateHarmonicOrders = (
export const validateTrendSelection = (params: {
lineIds: string[]
indicators: SteadyDataView.SteadyIndicatorNode[]
statTypes: SteadyDataView.SteadyTrendStatType[]
statType: SteadyDataView.SteadyTrendStatType
harmonicOrders: number[]
}) => {
const { lineIds, indicators, statTypes, harmonicOrders } = params
const { lineIds, indicators, statType, harmonicOrders } = params
if (!lineIds.length) return '请选择监测点'
if (!indicators.length) return '请选择趋势指标'
if (lineIds.length > 1 && indicators.length > 1) return '多监测点查询时只能选择 1 个指标'
if (!statTypes.length) return '请选择统计类型'
if (lineIds.length > MAX_SELECTED_LINE_COUNT) return '监测点最多选择 6 个'
if (indicators.length > MAX_SELECTED_INDICATOR_COUNT) return '趋势指标最多选择 6 个'
if (!statType) return '请选择统计类型'
const harmonicError = validateHarmonicOrders(indicators, harmonicOrders)
if (harmonicError) return harmonicError
const seriesCount = estimateTrendSeriesCount(lineIds, indicators, statTypes, harmonicOrders)
const seriesCount = estimateTrendSeriesCount(lineIds, indicators, statType, harmonicOrders)
if (seriesCount > MAX_TREND_SERIES_COUNT) {
return '趋势曲线数量不能超过 24 条,请缩小监测点、指标或统计类型范围'
}