refactor: 将位移看板命名从振动重命名为位移

将 displacementBoard 模块中的变量、组件、类型、样式及 API 调用等由 vibration 统一重命名为 displacement,消除语义混淆;同时将 onMounted 中的串行请求优化为并行。
main
zch 4 weeks ago
parent 7e980242ca
commit 906be3335c

@ -1,19 +1,19 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-alert type="info" :closable="false" show-icon class="section-tip" :title="bandTip" />
@ -31,7 +31,7 @@
<div ref="sankeyChartRef" class="chart-container-xl" />
</el-card>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :xl="12">
<el-card shadow="never" class="chart-card">
<template #header>
@ -54,16 +54,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementAdvancedData as getVibrationAdvancedData, type VibrationAdvancedPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementAdvancedData, type DisplacementAdvancedPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { ADVANCED_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { toNumber, vibrationMetricOptions } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { toNumber, displacementMetricOptions } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardAdvanced' });
defineOptions({ name: 'DisplacementBoardAdvanced' });
const sankeyChartRef = ref<HTMLElement>();
const treemapChartRef = ref<HTMLElement>();
@ -81,11 +81,11 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const advancedData = ref<VibrationAdvancedPageVO>({
const advancedData = ref<DisplacementAdvancedPageVO>({
sankeyNodes: [],
sankeyLinks: [],
treemapItems: [],
@ -226,7 +226,7 @@ const renderCharts = () => {
}
parallelChart.setOption(
{
color: [...vibrationMetricOptions.map((item) => item.color), '#8b5cf6', '#64748b'] as string[],
color: [...displacementMetricOptions.map((item) => item.color), '#8b5cf6', '#64748b'] as string[],
tooltip: {
trigger: 'item'
},
@ -273,7 +273,7 @@ const renderCharts = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationAdvancedData(buildQuery());
const { data } = await getDisplacementAdvancedData(buildQuery());
advancedData.value = data || {
sankeyNodes: [],
sankeyLinks: [],
@ -288,12 +288,14 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
</style>

@ -1,6 +1,6 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
@ -40,7 +40,7 @@
</el-form>
</el-card>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="12" :md="6">
<el-card shadow="never" class="kpi-card">
<div class="kpi-label">高风险事件</div>
@ -71,9 +71,9 @@
</el-col>
</el-row>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-card shadow="never" class="chart-card">
@ -89,7 +89,7 @@
<div ref="eventChartRef" class="chart-container" />
</el-card>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :xl="12">
<el-card shadow="never" class="table-card">
<template #header>
@ -187,16 +187,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementAnomalyData as getVibrationAnomalyData, type VibrationAnomalyPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementAnomalyData, type DisplacementAnomalyPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { ANOMALY_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { toNumber } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { toNumber } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardAnomaly' });
defineOptions({ name: 'DisplacementBoardAnomaly' });
const eventChartRef = ref<HTMLElement>();
const { getChart } = useChartResize(eventChartRef);
@ -212,19 +212,19 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
resetAnomalyThresholds,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const anomalyData = ref<VibrationAnomalyPageVO>({
const anomalyData = ref<DisplacementAnomalyPageVO>({
highEvents: [],
continuousEvents: [],
rapidRiseEvents: [],
jitterEvents: []
});
const applyThresholdDefaults = (data?: VibrationAnomalyPageVO) => {
const applyThresholdDefaults = (data?: DisplacementAnomalyPageVO) => {
if (!data) {
return;
}
@ -297,13 +297,13 @@ const renderEventChart = () => {
const handleMetricChange = (_value: string) => {
//
resetAnomalyThresholds();
setVibrationParam('vibrationDisplacement');
setDisplacementParam('vibrationDisplacement');
};
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationAnomalyData(buildQuery());
const { data } = await getDisplacementAnomalyData(buildQuery());
anomalyData.value = data || {
highEvents: [],
continuousEvents: [],
@ -318,14 +318,13 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
.threshold-form {
display: flex;
@ -363,3 +362,6 @@ onMounted(async () => {
}
}
</style>

@ -1,19 +1,24 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree
:loading="treeLoading"
:tree-data="monitorTreeOptions"
:tree-props="treeProps"
@node-click="handleTreeNodeClick"
/>
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-alert
@ -24,7 +29,7 @@
title="对比分析建议选择设备组或全部位移设备,这样横向排名与散点聚类才更有参考价值。"
/>
<el-row :gutter="16" class="vibration-grid">
<el-row :gutter="16" class="displacement-grid">
<el-col :xs="24" :xl="12">
<el-card shadow="never" class="chart-card">
<template #header>
@ -61,16 +66,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementComparisonData as getVibrationComparisonData, type VibrationComparisonPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementComparisonData, type DisplacementComparisonPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { COMPARISON_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { buildCategoryDataZoom, getVibrationMetricOption, toNumber, vibrationMetricOptions } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { buildCategoryDataZoom, getDisplacementMetricOption, toNumber, displacementMetricOptions } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardComparison' });
defineOptions({ name: 'DisplacementBoardComparison' });
const rankChartRef = ref<HTMLElement>();
const scatterChartRef = ref<HTMLElement>();
@ -87,13 +92,13 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const comparisonData = ref<VibrationComparisonPageVO>({ rankItems: [], scatterItems: [] });
const metricColorMap = Object.fromEntries(vibrationMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getVibrationMetricOption(comparisonData.value.metricField || queryForm.value.vibrationParam));
const comparisonData = ref<DisplacementComparisonPageVO>({ rankItems: [], scatterItems: [] });
const metricColorMap = Object.fromEntries(displacementMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getDisplacementMetricOption(comparisonData.value.metricField || queryForm.value.vibrationParam));
const renderCharts = () => {
const rankChart = getChart(rankChartRef);
@ -248,7 +253,7 @@ const renderCharts = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationComparisonData(buildQuery());
const { data } = await getDisplacementComparisonData(buildQuery());
comparisonData.value = data || { rankItems: [], scatterItems: [] };
await nextTick();
//
@ -258,12 +263,14 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
</style>

@ -1,13 +1,13 @@
export const vibrationMetricOptions = [
export const displacementMetricOptions = [
// 位移专属看板本轮只保留一个业务指标,避免前端继续暴露无效的多指标切换入口。
{ field: 'vibrationDisplacement', label: '位移', unit: 'um', color: '#5b8ff9' }
] as const;
export const vibrationMetricMap = Object.fromEntries(vibrationMetricOptions.map((item) => [item.field, item]));
export const displacementMetricMap = Object.fromEntries(displacementMetricOptions.map((item) => [item.field, item]));
export const vibrationHeatmapColors = ['#0f766e', '#0ea5a4', '#38bdf8', '#fde68a', '#fb923c', '#ef4444'];
export const displacementHeatmapColors = ['#0f766e', '#0ea5a4', '#38bdf8', '#fde68a', '#fb923c', '#ef4444'];
export const getVibrationMetricOption = (field?: string) => vibrationMetricMap[field || ''] || vibrationMetricOptions[0];
export const getDisplacementMetricOption = (field?: string) => displacementMetricMap[field || ''] || displacementMetricOptions[0];
export const toNumber = (value: number | string | undefined, fallback = 0) => {
const numberValue = Number(value);
@ -50,3 +50,4 @@ export const createDefaultTimeRange = () => {
const start = new Date(end.getTime() - 24 * 3600 * 1000);
return [formatDateTime(start), formatDateTime(end)];
};

@ -2,7 +2,7 @@ import { onBeforeUnmount, onMounted, type Ref } from 'vue';
import * as echarts from 'echarts';
/**
* ECharts
* ECharts
* window
*/
export function useChartResize(...chartRefs: Ref<HTMLElement | undefined>[]) {
@ -56,3 +56,4 @@ export function useChartResize(...chartRefs: Ref<HTMLElement | undefined>[]) {
disposeAll
};
}

@ -17,14 +17,14 @@ type DisplacementBoardQueryForm = {
};
type BuildQueryOptions = {
includeVibrationParam?: boolean;
includeDisplacementParam?: boolean;
};
const createDefaultQueryForm = (defaultMetric = 'vibrationDisplacement'): VibrationBoardQueryForm => ({
const createDefaultQueryForm = (defaultMetric = 'vibrationDisplacement'): DisplacementBoardQueryForm => ({
compareScope: 'all',
monitorId: '',
monitorIds: [],
selectionLabel: '全部振动设备',
selectionLabel: '全部位移设备',
samplingInterval: 5,
vibrationParam: defaultMetric,
highThreshold: undefined,
@ -43,7 +43,7 @@ const sharedState = reactive({
queryForm: createDefaultQueryForm()
});
export function useVibrationBoardQueryState(defaultMetric = 'vibrationDisplacement') {
export function useDisplacementBoardQueryState(defaultMetric = 'vibrationDisplacement') {
const localState = reactive({
loading: false,
treeLoading: false,
@ -95,7 +95,7 @@ export function useVibrationBoardQueryState(defaultMetric = 'vibrationDisplaceme
queryForm.value.samplingInterval = value;
};
const setVibrationParam = (value: string) => {
const setDisplacementParam = (value: string) => {
// 位移专属看板不再允许切换指标,这里强制收敛为位移,避免旧页面残留调用把状态带偏。
queryForm.value.vibrationParam = 'vibrationDisplacement';
};
@ -122,7 +122,7 @@ export function useVibrationBoardQueryState(defaultMetric = 'vibrationDisplaceme
deviceDisplayMap.value = buildDeviceDisplayMap(monitorTreeOptions.value);
sharedState.treeLoaded = true;
if (!queryForm.value.monitorIds.length && !queryForm.value.monitorId) {
applySelection(buildSelection(getLeafNodes(monitorTreeOptions.value), '全部振动设备', 'all'));
applySelection(buildSelection(getLeafNodes(monitorTreeOptions.value), '全部位移设备', 'all'));
}
} finally {
treeLoading.value = false;
@ -138,7 +138,7 @@ export function useVibrationBoardQueryState(defaultMetric = 'vibrationDisplaceme
applySelection(buildSelection([data], data.label, 'single'));
};
const buildQuery = (options?: BuildQueryOptions): VibrationBoardQuery => ({
const buildQuery = (options?: BuildQueryOptions): DisplacementBoardQuery => ({
samplingInterval: queryForm.value.samplingInterval,
// 位移专属看板统一固定为 vibrationDisplacement前端不再暴露可切换口径。
vibrationParam: 'vibrationDisplacement',
@ -172,9 +172,10 @@ export function useVibrationBoardQueryState(defaultMetric = 'vibrationDisplaceme
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
resetAnomalyThresholds,
buildQuery,
getMonitorDisplayName
};
}

@ -1,22 +1,22 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-row :gutter="16" class="vibration-grid">
<el-row :gutter="16" class="displacement-grid">
<el-col :xs="24" :xl="12">
<el-card shadow="never" class="chart-card">
<template #header>
@ -79,16 +79,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementDistributionData as getVibrationDistributionData, type VibrationDistributionPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementDistributionData, type DisplacementDistributionPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { DISTRIBUTION_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { getVibrationMetricOption, toNumber, vibrationHeatmapColors } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { getDisplacementMetricOption, toNumber, displacementHeatmapColors } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardDistribution' });
defineOptions({ name: 'DisplacementBoardDistribution' });
const intervalChartRef = ref<HTMLElement>();
const histogramChartRef = ref<HTMLElement>();
@ -107,17 +107,17 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const distributionData = ref<VibrationDistributionPageVO>({
const distributionData = ref<DisplacementDistributionPageVO>({
intervalBuckets: [],
histogramBuckets: [],
calendarHeatmap: [],
hourlyHeatmap: []
});
const activeMetric = computed(() => getVibrationMetricOption(distributionData.value.metricField || queryForm.value.vibrationParam));
const activeMetric = computed(() => getDisplacementMetricOption(distributionData.value.metricField || queryForm.value.vibrationParam));
const clearCharts = () => {
getChart(intervalChartRef)?.clear();
@ -236,7 +236,7 @@ const renderCharts = () => {
left: 'center',
bottom: 0,
textStyle: { color: '#475569' },
inRange: { color: vibrationHeatmapColors }
inRange: { color: displacementHeatmapColors }
},
calendar: {
top: 24,
@ -291,7 +291,7 @@ const renderCharts = () => {
left: 'center',
bottom: 8,
textStyle: { color: '#475569' },
inRange: { color: vibrationHeatmapColors }
inRange: { color: displacementHeatmapColors }
},
series: [
{
@ -316,7 +316,7 @@ const renderCharts = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationDistributionData(buildQuery());
const { data } = await getDisplacementDistributionData(buildQuery());
distributionData.value = data || {
intervalBuckets: [],
histogramBuckets: [],
@ -330,12 +330,14 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
</style>

@ -1,17 +1,17 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="12" :sm="12" :md="6">
<el-card shadow="never" class="kpi-card">
<div class="kpi-label">采样记录数</div>
@ -42,7 +42,7 @@
</el-col>
</el-row>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :sm="12" :xl="6" v-for="item in overviewData.metricCards || []" :key="item.field">
<el-card shadow="never" class="metric-card" :style="{ borderTop: `4px solid ${metricColorMap[item.field || ''] || '#5b8ff9'}` }">
<div class="kpi-label">{{ item.label }}</div>
@ -55,12 +55,12 @@
</el-col>
</el-row>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-row :gutter="16" class="vibration-grid">
<el-row :gutter="16" class="displacement-grid">
<el-col :xs="24" :xl="12">
<el-card shadow="never" class="chart-card">
<template #header>
@ -69,7 +69,7 @@
<div class="card-title">仪表盘总览</div>
<div class="card-subtitle">围绕位移关键统计值做快速巡检适合先判断当前风险边界再决定是否深入排查</div>
</div>
<HelpButton title="振动总览" :content="OVERVIEW_HELP" />
<HelpButton title="位移总览" :content="OVERVIEW_HELP" />
</div>
</template>
<div ref="gaugeChartRef" class="chart-container-lg" />
@ -103,23 +103,23 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementOverviewData as getVibrationOverviewData, type VibrationOverviewPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementOverviewData, type DisplacementOverviewPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { OVERVIEW_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import {
buildCategoryDataZoom,
formatMetricValue,
formatPercentValue,
getVibrationMetricOption,
getDisplacementMetricOption,
toNumber,
vibrationMetricOptions
} from '../components/vibrationBoardShared';
displacementMetricOptions
} from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardOverview' });
defineOptions({ name: 'DisplacementBoardOverview' });
const gaugeChartRef = ref<HTMLElement>();
const rankChartRef = ref<HTMLElement>();
@ -137,13 +137,13 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const overviewData = ref<VibrationOverviewPageVO>({ metricCards: [], gaugeItems: [], deviceRanks: [] });
const metricColorMap = Object.fromEntries(vibrationMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getVibrationMetricOption(overviewData.value.metricField || queryForm.value.vibrationParam));
const overviewData = ref<DisplacementOverviewPageVO>({ metricCards: [], gaugeItems: [], deviceRanks: [] });
const metricColorMap = Object.fromEntries(displacementMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getDisplacementMetricOption(overviewData.value.metricField || queryForm.value.vibrationParam));
const buildGaugeCenters = (count: number) => {
if (count <= 1) {
@ -179,7 +179,7 @@ const renderCharts = () => {
formatter: (params: any) => `${params.seriesName}<br/>当前值: <b>${formatMetricValue(params.value)} ${unit}</b>`
},
series: gaugeItems.map((item, index) => {
const gaugeColor = vibrationMetricOptions[index]?.color || currentMetricColor;
const gaugeColor = displacementMetricOptions[index]?.color || currentMetricColor;
return {
name: item.name,
type: 'gauge',
@ -361,7 +361,7 @@ const renderCharts = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationOverviewData(buildQuery());
const { data } = await getDisplacementOverviewData(buildQuery());
overviewData.value = data || { metricCards: [], gaugeItems: [], deviceRanks: [] };
await nextTick();
// DOM
@ -371,16 +371,18 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
.kpi-metric {
font-size: clamp(18px, 1.6vw, 24px);
}
</style>

@ -1,22 +1,22 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-row :gutter="16" class="vibration-grid">
<el-row :gutter="16" class="displacement-grid">
<el-col :xs="12" :md="8">
<el-card shadow="never" class="kpi-card">
<div class="kpi-label">采样记录数</div>
@ -59,16 +59,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementQualityData as getVibrationQualityData, type VibrationQualityPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementQualityData, type DisplacementQualityPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { QUALITY_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { buildCategoryDataZoom, formatPercentValue, toNumber } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { buildCategoryDataZoom, formatPercentValue, toNumber } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardQuality' });
defineOptions({ name: 'DisplacementBoardQuality' });
const qualityChartRef = ref<HTMLElement>();
const { getChart } = useChartResize(qualityChartRef);
@ -84,11 +84,11 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const qualityData = ref<VibrationQualityPageVO>({ metricQualityItems: [] });
const qualityData = ref<DisplacementQualityPageVO>({ metricQualityItems: [] });
const renderChart = () => {
const chart = getChart(qualityChartRef);
@ -184,7 +184,7 @@ const renderChart = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationQualityData(buildQuery());
const { data } = await getDisplacementQualityData(buildQuery());
qualityData.value = data || { metricQualityItems: [] };
await nextTick();
renderChart();
@ -193,12 +193,14 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
</style>

@ -1,19 +1,19 @@
<template>
<div v-loading="loading" class="app-container vibration-board-page">
<VibrationBoardFilter
<div v-loading="loading" class="app-container displacement-board-page">
<DisplacementBoardFilter
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@update:vibration-param="setDisplacementParam"
@query="handleQuery"
/>
<el-row :gutter="16" class="mt-4 vibration-grid">
<el-row :gutter="16" class="mt-4 displacement-grid">
<el-col :xs="24" :lg="7" :xl="6">
<VibrationBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
<DisplacementBoardDeviceTree :loading="treeLoading" :tree-data="monitorTreeOptions" :tree-props="treeProps" @node-click="handleTreeNodeClick" />
</el-col>
<el-col :xs="24" :lg="17" :xl="18">
<el-card shadow="never" class="chart-card">
@ -54,16 +54,16 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementTrendData as getVibrationTrendData, type VibrationTrendPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
import { getDisplacementTrendData, type DisplacementTrendPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/DisplacementHelpButton.vue';
import DisplacementBoardFilter from '../components/DisplacementBoardFilter.vue';
import DisplacementBoardDeviceTree from '../components/DisplacementBoardDeviceTree.vue';
import { TREND_HELP } from '../components/helpContent';
import { useChartResize } from '../components/useChartResize';
import { useVibrationBoardQueryState } from '../components/useVibrationBoardQueryState';
import { buildCategoryDataZoom, getVibrationMetricOption, toNumber, vibrationMetricOptions } from '../components/vibrationBoardShared';
import { useDisplacementBoardQueryState } from '../components/useDisplacementBoardQueryState';
import { buildCategoryDataZoom, getDisplacementMetricOption, toNumber, displacementMetricOptions } from '../components/displacementBoardShared';
defineOptions({ name: 'VibrationBoardTrend' });
defineOptions({ name: 'DisplacementBoardTrend' });
const trendChartRef = ref<HTMLElement>();
const hourlyChartRef = ref<HTMLElement>();
@ -80,13 +80,13 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
setDisplacementParam,
buildQuery
} = useVibrationBoardQueryState();
} = useDisplacementBoardQueryState();
const trendData = ref<VibrationTrendPageVO>({ series: [], hourlyItems: [] });
const metricColorMap = Object.fromEntries(vibrationMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getVibrationMetricOption(trendData.value.metricField || queryForm.value.vibrationParam));
const trendData = ref<DisplacementTrendPageVO>({ series: [], hourlyItems: [] });
const metricColorMap = Object.fromEntries(displacementMetricOptions.map((item) => [item.field, item.color]));
const activeMetric = computed(() => getDisplacementMetricOption(trendData.value.metricField || queryForm.value.vibrationParam));
const renderCharts = () => {
const trendChart = getChart(trendChartRef);
@ -222,7 +222,7 @@ const renderCharts = () => {
const handleQuery = async () => {
loading.value = true;
try {
const { data } = await getVibrationTrendData(buildQuery());
const { data } = await getDisplacementTrendData(buildQuery());
trendData.value = data || { series: [], hourlyItems: [] };
await nextTick();
//
@ -232,12 +232,14 @@ const handleQuery = async () => {
}
};
onMounted(async () => {
await loadTree();
await handleQuery();
onMounted(() => {
void Promise.all([loadTree(), handleQuery()]);
});
</script>
<style scoped lang="scss">
@import '../components/vibrationBoardReport.scss';
@import '../components/displacementBoardReport.scss';
</style>

@ -4,10 +4,8 @@
:selection-label="queryForm.selectionLabel"
:time-range="daterangeRecordTime"
:sampling-interval="queryForm.samplingInterval"
:vibration-param="queryForm.vibrationParam"
@update:time-range="setTimeRange"
@update:sampling-interval="setSamplingInterval"
@update:vibration-param="setVibrationParam"
@query="handleQuery"
/>
@ -59,7 +57,7 @@
<script setup lang="ts">
import * as echarts from 'echarts';
import { getDisplacementQualityData as getVibrationQualityData, type VibrationQualityPageVO } from '@/api/ems/report/displacementBoard';
import { getDisplacementQualityData, type DisplacementQualityPageVO } from '@/api/ems/report/displacementBoard';
import HelpButton from '../components/HelpButton.vue';
import VibrationBoardFilter from '../components/VibrationBoardFilter.vue';
import VibrationBoardDeviceTree from '../components/VibrationBoardDeviceTree.vue';
@ -84,11 +82,10 @@ const {
handleTreeNodeClick,
setTimeRange,
setSamplingInterval,
setVibrationParam,
buildQuery
} = useVibrationBoardQueryState();
const qualityData = ref<VibrationQualityPageVO>({ metricQualityItems: [] });
const qualityData = ref<DisplacementQualityPageVO>({ metricQualityItems: [] });
const renderChart = () => {
const chart = getChart(qualityChartRef);
@ -184,8 +181,9 @@ const renderChart = () => {
const handleQuery = async () => {
loading.value = true;
try {
//
const { data } = await getVibrationQualityData(buildQuery({ includeVibrationParam: false }));
// vibration_displacement
// includeVibrationParam
const { data } = await getDisplacementQualityData(buildQuery());
qualityData.value = data || { metricQualityItems: [] };
await nextTick();
renderChart();

Loading…
Cancel
Save