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

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

View File

@@ -6,14 +6,6 @@
circle
@click="emit('update:collapsed', !collapsed)"
/>
<button
v-if="collapsed"
class="indicator-collapsed-trigger"
type="button"
@click="emit('update:collapsed', false)"
>
{{ collapsedLabel }}
</button>
<div v-show="!collapsed" class="indicator-panel-body">
<SteadyIndicatorTree
:key="selectorResetKey"
@@ -49,8 +41,6 @@ const emit = defineEmits<{
refresh: []
change: [nodes: SteadyDataView.SteadyIndicatorNode[]]
}>()
const collapsedLabel = '\u7a33\u6001\u6307\u6807'
</script>
<style scoped lang="scss">
@@ -60,12 +50,12 @@ const collapsedLabel = '\u7a33\u6001\u6307\u6807'
right: 12px;
bottom: 12px;
z-index: 2;
width: 360px;
width: 300px;
transition: width 0.2s ease;
}
.indicator-floating-panel.is-collapsed {
width: 44px;
width: 0;
}
.indicator-toggle {
@@ -85,33 +75,13 @@ const collapsedLabel = '\u7a33\u6001\u6307\u6807'
box-shadow: var(--el-box-shadow-light);
}
.indicator-collapsed-trigger {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
padding: 8px 0;
border: 1px solid var(--el-border-color-light);
border-radius: 4px;
background: var(--el-bg-color);
box-shadow: var(--el-box-shadow-light);
color: var(--el-text-color-primary);
cursor: pointer;
font-size: 13px;
font-weight: 600;
line-height: 1.2;
writing-mode: vertical-rl;
}
.indicator-collapsed-trigger:hover {
border-color: var(--el-color-primary-light-5);
color: var(--el-color-primary);
.indicator-floating-panel.is-collapsed .indicator-panel-body {
display: none;
}
@media (max-width: 1360px) {
.indicator-floating-panel {
width: 320px;
width: 280px;
}
}
</style>

View File

@@ -96,7 +96,6 @@ watch(
padding: 12px;
}
.panel-header,
.tree-node {
display: flex;
align-items: center;
@@ -104,6 +103,13 @@ watch(
gap: 8px;
}
.panel-header {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 14px;
}
.panel-title {
font-size: 14px;
font-weight: 600;

View File

@@ -34,8 +34,8 @@
<span class="node-name">{{ data.name }}</span>
</span>
<span class="node-count">
<template v-if="Number(data.deviceCount) || Number(data.lineCount)">
{{ Number(data.deviceCount || 0) }} / {{ Number(data.lineCount || 0) }}
<template v-if="shouldShowLedgerCount(data)">
{{ resolveLedgerCountText(data) }}
</template>
</span>
</div>
@@ -91,6 +91,18 @@ const resolveLedgerIcon = (value: unknown) => {
return ledgerIcons[normalizeLedgerLevel(value)]
}
const shouldShowLedgerCount = (data: SteadyDataView.SteadyLedgerNode) => {
return Number(data.level) < 3 && (Number(data.deviceCount) > 0 || Number(data.lineCount) > 0)
}
const resolveLedgerCountText = (data: SteadyDataView.SteadyLedgerNode) => {
if (normalizeLedgerLevel(data.level) === 2) {
return String(Number(data.lineCount || 0))
}
return `${Number(data.deviceCount || 0)} / ${Number(data.lineCount || 0)}`
}
const handleKeywordChange = (value: string) => {
emit('search', value)
}

View File

@@ -1,11 +1,8 @@
<template>
<section class="card trend-chart-panel" v-loading="loading">
<div class="panel-header">
<span class="panel-title">趋势图</span>
<div v-if="trendResult" class="panel-header">
<span class="panel-meta">
<template v-if="trendResult">
{{ trendResult.bucket || '-' }} / {{ trendResult.displayPointCount || 0 }}
</template>
{{ trendResult.bucket || '-' }} / {{ trendResult.displayPointCount || 0 }}
</span>
</div>
@@ -41,6 +38,7 @@ const chartOptions = computed(() => buildSteadyTrendChartOptions(props.trendResu
flex-direction: column;
min-width: 0;
min-height: 0;
overflow: hidden;
padding: 12px;
}
@@ -48,16 +46,11 @@ const chartOptions = computed(() => buildSteadyTrendChartOptions(props.trendResu
display: flex;
flex: none;
align-items: center;
justify-content: space-between;
justify-content: flex-end;
gap: 10px;
margin-bottom: 10px;
}
.panel-title {
font-size: 14px;
font-weight: 600;
}
.panel-meta {
color: var(--el-text-color-secondary);
font-size: 12px;

View File

@@ -118,7 +118,7 @@ const handleTimeBaseDateChange = (value: Date) => {
<style scoped lang="scss">
.trend-toolbar {
display: grid;
grid-template-columns: minmax(312px, 1.4fr) repeat(2, minmax(178px, 0.8fr)) auto;
grid-template-columns: repeat(4, minmax(0, 1fr)) auto;
gap: 10px;
align-items: center;
padding: 12px;
@@ -132,7 +132,7 @@ const handleTimeBaseDateChange = (value: Date) => {
}
.toolbar-field--time {
min-width: 312px;
min-width: 0;
}
.toolbar-field__label {
@@ -149,15 +149,16 @@ const handleTimeBaseDateChange = (value: Date) => {
.trend-toolbar__time {
flex: 1 1 0;
min-width: 260px;
min-width: 0;
}
.harmonic-select {
grid-column: span 2;
grid-column: auto;
}
.toolbar-actions {
display: flex;
grid-column: 5;
justify-content: flex-end;
gap: 8px;
}

View File

@@ -107,6 +107,7 @@ const indicatorPanelCollapsedProxy = computed({
.selector-column {
display: grid;
min-height: 0;
overflow: hidden;
}
.trend-main {
@@ -115,12 +116,14 @@ const indicatorPanelCollapsedProxy = computed({
gap: 12px;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.trend-content {
position: relative;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.trend-content :deep(.trend-chart-panel) {