refactor(ems):优化计量设备监控与报表功能

- 统一使用 el-date-picker 替换第三方日期选择器组件
- 修复日期时间范围选择器的初始化赋值问题
- 调整表单引用名称以符合最新规范
- 移除未使用的异常类型筛选表单项
- 恢复并优化报警规则的增删改功能按钮
-图表 改进蒸汽曲线的 Y 轴标签-格式化显示 增强图表数据加载逻辑,避免重复提交和渲染错误
-修正树形结构下拉选项的数据绑定问题
- 更新样式穿透写法以适配新版 Element Plus
- 引入缺失的 Treeselect 样式文件
- 优化无数据时的图表处理逻辑,提升用户体验
master
zangch@mesnac.com 3 months ago
parent b8a775b736
commit 36f4db56f3

@ -1,6 +1,6 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="计量设备编号" prop="monitorCode"> <el-form-item label="计量设备编号" prop="monitorCode">
<el-input v-model="queryParams.monitorCode" placeholder="请输入计量设备编号" clearable <el-input v-model="queryParams.monitorCode" placeholder="请输入计量设备编号" clearable
@keyup.enter="handleQuery" /> @keyup.enter="handleQuery" />
@ -111,7 +111,7 @@
<!-- 添加或修改计量设备信息对话框 --> <!-- 添加或修改计量设备信息对话框 -->
<el-dialog :title="dialogTitle" v-model="dialogOpen" width="500px" append-to-body> <el-dialog :title="dialogTitle" v-model="dialogOpen" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="父级编号" prop="parentId"> <el-form-item label="父级编号" prop="parentId">
<treeselect v-model="form.parentId" :options="baseMonitorInfoOptions" :normalizer="normalizer" <treeselect v-model="form.parentId" :options="baseMonitorInfoOptions" :normalizer="normalizer"
placeholder="请选择父级编号" /> placeholder="请选择父级编号" />
@ -183,6 +183,7 @@ import { ref, reactive, getCurrentInstance, ComponentInternalInstance, toRefs, o
import type { FormInstance } from 'element-plus'; import type { FormInstance } from 'element-plus';
import { listBaseMonitorInfo, getBaseMonitorInfo, delBaseMonitorInfo, addBaseMonitorInfo, updateBaseMonitorInfo } from "@/api/ems/base/baseMonitorInfo"; import { listBaseMonitorInfo, getBaseMonitorInfo, delBaseMonitorInfo, addBaseMonitorInfo, updateBaseMonitorInfo } from "@/api/ems/base/baseMonitorInfo";
import Treeselect from 'vue3-treeselect'; import Treeselect from 'vue3-treeselect';
import 'vue3-treeselect/dist/vue3-treeselect.css';
import { getBaseEnergyTypeList } from '@/api/ems/base/baseEnergyType' import { getBaseEnergyTypeList } from '@/api/ems/base/baseEnergyType'
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;

@ -26,7 +26,7 @@
<!-- >--> <!-- >-->
<!-- </el-date-picker>--> <!-- </el-date-picker>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="异常类型" prop="alarmType"> <!-- <el-form-item label="异常类型" prop="alarmType">
<el-select v-model="queryParams.alarmType" placeholder="请选择异常类型" clearable> <el-select v-model="queryParams.alarmType" placeholder="请选择异常类型" clearable>
<el-option <el-option
v-for="dict in alarm_type" v-for="dict in alarm_type"
@ -35,7 +35,7 @@
:value="dict.value" :value="dict.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>-->
<el-form-item label="异常状态" prop="alarmStatus"> <el-form-item label="异常状态" prop="alarmStatus">
<el-select v-model="queryParams.alarmStatus" placeholder="请选择异常状态" clearable> <el-select v-model="queryParams.alarmStatus" placeholder="请选择异常状态" clearable>
<el-option <el-option

@ -34,41 +34,38 @@
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">--> <el-col :span="1.5">
<!-- <el-button--> <el-button
<!-- type="primary"--> type="primary"
<!-- plain--> plain
<!-- icon="Plus"--> icon="Plus"
<!-- --> @click="handleAdd"
<!-- @click="handleAdd"-->
<!-- v-hasPermi="['ems:record:recordAlarmRule:add']"--> >新增
<!-- >新增--> </el-button>
<!-- </el-button>--> </el-col>
<!-- </el-col>--> <el-col :span="1.5">
<!-- <el-col :span="1.5">--> <el-button
<!-- <el-button--> type="success"
<!-- type="success"--> plain
<!-- plain--> icon="Edit"
<!-- icon="Edit"--> :disabled="single"
<!-- --> @click="handleUpdate"
<!-- :disabled="single"-->
<!-- @click="handleUpdate"--> >修改
<!-- v-hasPermi="['ems:record:recordAlarmRule:edit']"--> </el-button>
<!-- >修改--> </el-col>
<!-- </el-button>--> <el-col :span="1.5">
<!-- </el-col>--> <el-button
<!-- <el-col :span="1.5">--> type="danger"
<!-- <el-button--> plain
<!-- type="danger"--> icon="Delete"
<!-- plain--> :disabled="multiple"
<!-- icon="Delete"--> @click="handleDelete"
<!-- -->
<!-- :disabled="multiple"--> >删除
<!-- @click="handleDelete"--> </el-button>
<!-- v-hasPermi="['ems:record:recordAlarmRule:remove']"--> </el-col>
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button <el-button
type="warning" type="warning"
@ -139,7 +136,7 @@
<el-dialog :title="dialogTitle" v-model="dialogOpen" width="500px" append-to-body> <el-dialog :title="dialogTitle" v-model="dialogOpen" width="500px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="150px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="150px">
<el-form-item label="规则编号" prop="ruleId"> <el-form-item label="规则编号" prop="ruleId">
<el-input v-model="form.ruleId" placeholder="请输入规则编号" disabled/> <el-input v-model="form.ruleId" placeholder="请输入规则编号" />
</el-form-item> </el-form-item>
<el-form-item label="规则名称" prop="ruleName"> <el-form-item label="规则名称" prop="ruleName">
<el-input v-model="form.ruleName" placeholder="请输入规则名称"/> <el-input v-model="form.ruleName" placeholder="请输入规则名称"/>
@ -160,7 +157,7 @@
<!-- <el-input v-model="form.energyType" placeholder="请输入能源类型"/>--> <!-- <el-input v-model="form.energyType" placeholder="请输入能源类型"/>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="触发规则" prop="triggerRule"> <el-form-item label="触发规则" prop="triggerRule">
<el-radio-group v-model="form.triggerRule" disabled> <el-radio-group v-model="form.triggerRule">
<el-radio <el-radio
v-for="dict in trigger_rule" v-for="dict in trigger_rule"
:key="dict.value" :key="dict.value"

@ -32,16 +32,16 @@
label-width="100px" label-width="100px"
> >
<el-form-item label="记录时间"> <el-form-item label="记录时间">
<date-picker <el-date-picker
v-model="daterangeRecordTime" v-model="daterangeRecordTime"
range type="datetimerange"
type="datetime" range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-type="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="['开始时间', '结束时间']" style="width: 400px"
:lang="lang" />
style="width: 340px"
></date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -97,8 +97,6 @@ import Chart from '@/components/chart.vue'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import {pointSteamInstantList} from "@/api/ems/report/reportPointSteam"; import {pointSteamInstantList} from "@/api/ems/report/reportPointSteam";
import {listRecordSteamInstant, steamInstantList} from "@/api/ems/record/recordSteamInstant"; import {listRecordSteamInstant, steamInstantList} from "@/api/ems/record/recordSteamInstant";
import DatePicker from 'vue-datepicker-next';
import 'vue-datepicker-next/index.css';
export default { export default {
name: 'currentSteamCurve', name: 'currentSteamCurve',
@ -110,13 +108,10 @@ export default {
}, },
components: { components: {
Chart, Chart,
Treeselect, Treeselect
DatePicker
}, },
data() { data() {
return { return {
//List
baseMonitorInfoOptions: [],
//List //List
monitorInfoOptions: [], monitorInfoOptions: [],
workUnitName: undefined, workUnitName: undefined,
@ -194,12 +189,6 @@ export default {
{ key: 11, label: `记录时间`, visible: true }, { key: 11, label: `记录时间`, visible: true },
{ key: 12, label: `计量设备名称`, visible: true } { key: 12, label: `计量设备名称`, visible: true }
], ],
lang: {
formatLocale: {
firstDayOfWeek: 1
},
monthBeforeYear: false
},
// //
powerOutageSummary: { powerOutageSummary: {
count: 0, count: 0,
@ -222,14 +211,17 @@ export default {
const yesterday = parseTime(lastDate, '{y}-{m}-{d}') const yesterday = parseTime(lastDate, '{y}-{m}-{d}')
console.log(today,yesterday) console.log(today,yesterday)
this.daterangeRecordTime[0] = yesterday+ ' 08:00:00' //
this.daterangeRecordTime[1] = today + ' 08:00:00' this.daterangeRecordTime = [yesterday + ' 08:00:00', today + ' 08:00:00']
// //
this.initBaseChartOptions() this.initBaseChartOptions()
this.getTreeselect() //
this.getTreeMonitorInfo() this.getTreeMonitorInfo()
this.getList() //
setTimeout(() => {
this.getList()
}, 100)
}, },
watch: { watch: {
// //
@ -243,7 +235,7 @@ export default {
this.baseChartOptions = { this.baseChartOptions = {
grid: { grid: {
top: '40', top: '40',
bottom: '10%', bottom: '20%',
left: '10%', left: '10%',
right: '3%' right: '3%'
}, },
@ -415,13 +407,6 @@ export default {
URL.revokeObjectURL(link.href); URL.revokeObjectURL(link.href);
}, },
/** 查询计量设备信息下拉树结构 */
getTreeselect() {
getMonitorInfoTree({ monitorType: 4 }).then(response => {
this.monitorInfoOptions = response.data
})
},
/** 筛选节点 */ /** 筛选节点 */
filterNode(value, data) { filterNode(value, data) {
if (!value) return true if (!value) return true
@ -668,6 +653,29 @@ export default {
color: '#000000' color: '#000000'
}; };
const formatYAxisLabel = (value) => {
const num = Number(value);
if (!Number.isFinite(num)) {
return value;
}
if (Math.abs(num) >= 10000) {
return (num / 1000).toFixed(1) + 'k';
}
if (Math.abs(num) >= 1) {
return num.toFixed(1);
}
return num.toFixed(3);
};
option.yAxis.axisLabel = {
...(option.yAxis.axisLabel || {}),
formatter: formatYAxisLabel,
margin: 14
};
option.yAxis.splitNumber = option.yAxis.splitNumber || 5;
option.yAxis.axisLabel.showMaxLabel = true;
// Y0 // Y0
if (name === '瞬时流量' || name === '压力' || name === '温度') { if (name === '瞬时流量' || name === '压力' || name === '温度') {
option.yAxis.min = 0; option.yAxis.min = 0;
@ -759,10 +767,7 @@ export default {
this.hasChartData = data && data.length > 0; this.hasChartData = data && data.length > 0;
if (!this.hasChartData) { if (!this.hasChartData) {
// //
this.$refs.Chart1.setData({});
this.$refs.Chart2.setData({});
this.$refs.Chart3.setData({});
return; return;
} }
@ -798,10 +803,28 @@ export default {
'#fac858' '#fac858'
); );
// DOM 访
await this.$nextTick()
//
if (!this.$refs.Chart1 || !this.$refs.Chart2 || !this.$refs.Chart3) {
console.error('图表组件未渲染')
return
}
this.$refs.Chart1.setData(option1) this.$refs.Chart1.setData(option1)
this.$refs.Chart2.setData(option2) this.$refs.Chart2.setData(option2)
this.$refs.Chart3.setData(option3) this.$refs.Chart3.setData(option3)
// chart
await this.$nextTick()
//
if (!this.$refs.Chart1.chart || !this.$refs.Chart2.chart || !this.$refs.Chart3.chart) {
console.error('图表实例未初始化')
return
}
echarts.connect(this.$refs.Chart1.chart, this.$refs.Chart2.chart, this.$refs.Chart3.chart) echarts.connect(this.$refs.Chart1.chart, this.$refs.Chart2.chart, this.$refs.Chart3.chart)
// //
@ -842,7 +865,7 @@ export default {
/** 查询树形结构 */ /** 查询树形结构 */
getTreeMonitorInfo() { getTreeMonitorInfo() {
getMonitorInfoTree({ monitorType: 4 }).then(response => { getMonitorInfoTree({ monitorType: 4 }).then(response => {
this.baseMonitorInfoOptions = this.handleTree(response.data, "id", "parentId") this.monitorInfoOptions = this.handleTree(response.data, "id", "parentId")
}) })
} }
} }

@ -39,16 +39,16 @@
/> />
</el-form-item>--> </el-form-item>-->
<el-form-item label="记录时间"> <el-form-item label="记录时间">
<date-picker <el-date-picker
v-model="daterangeRecordTime" v-model="daterangeRecordTime"
range type="datetimerange"
type="datetime" range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-type="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="['开始时间', '结束时间']" style="width: 400px"
:lang="lang" />
style="width: 340px"
></date-picker>
</el-form-item> </el-form-item>
<!-- <el-form-item label="采集日期范围"> <!-- <el-form-item label="采集日期范围">
@ -102,8 +102,6 @@ import { parseTime } from '@/utils/ruoyi'
import Chart from '@/components/chart.vue' import Chart from '@/components/chart.vue'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import {pointSteamInstantList} from "@/api/ems/report/reportPointSteam"; import {pointSteamInstantList} from "@/api/ems/report/reportPointSteam";
import DatePicker from 'vue-datepicker-next';
import 'vue-datepicker-next/index.css';
export default { export default {
name: 'currentSteamCurve', name: 'currentSteamCurve',
@ -116,7 +114,6 @@ export default {
components: { components: {
Chart, Chart,
Treeselect, Treeselect,
DatePicker
}, },
data() { data() {
return { return {
@ -191,12 +188,6 @@ export default {
{ key: 11, label: `更新时间`, visible: false }, { key: 11, label: `更新时间`, visible: false },
{ key: 12, label: `计量设备名称`, visible: true } { key: 12, label: `计量设备名称`, visible: true }
], ],
lang: {
formatLocale: {
firstDayOfWeek: 1
},
monthBeforeYear: false
},
hasChartData: false, hasChartData: false,
} }
}, },
@ -209,8 +200,7 @@ export default {
const yesterday = parseTime(lastDate, '{y}-{m}-{d}') const yesterday = parseTime(lastDate, '{y}-{m}-{d}')
console.log(today,yesterday) console.log(today,yesterday)
this.daterangeRecordTime[0] = yesterday+ ' 08:00:00' this.daterangeRecordTime = [yesterday + ' 08:00:00', today + ' 08:00:00']
this.daterangeRecordTime[1] = today + ' 08:00:00'
/* this.daterangeCollectTime[0] = parseTime(yesterday, '{y}-{m}-{d}') ; /* this.daterangeCollectTime[0] = parseTime(yesterday, '{y}-{m}-{d}') ;
this.daterangeCollectTime[1] = parseTime(today, '{y}-{m}-{d}') ;*/ this.daterangeCollectTime[1] = parseTime(today, '{y}-{m}-{d}') ;*/
@ -251,7 +241,7 @@ export default {
this.queryParams.params['beginRecordTime'] = this.daterangeCollectTime[0] + ' ' + this.timerangeRecordTime[0]; this.queryParams.params['beginRecordTime'] = this.daterangeCollectTime[0] + ' ' + this.timerangeRecordTime[0];
this.queryParams.params['endRecordTime'] = this.daterangeCollectTime[1] + ' ' + this.timerangeRecordTime[1]; this.queryParams.params['endRecordTime'] = this.daterangeCollectTime[1] + ' ' + this.timerangeRecordTime[1];
}*/ }*/
if (null != this.daterangeRecordTime && '' != this.daterangeRecordTime) { if (Array.isArray(this.daterangeRecordTime) && this.daterangeRecordTime.length === 2) {
this.queryParams.params['beginRecordTime'] = this.daterangeRecordTime[0] ; this.queryParams.params['beginRecordTime'] = this.daterangeRecordTime[0] ;
this.queryParams.params['endRecordTime'] = this.daterangeRecordTime[1] ; this.queryParams.params['endRecordTime'] = this.daterangeRecordTime[1] ;
} }

@ -39,16 +39,16 @@
<!-- />--> <!-- />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="开始时间"> <el-form-item label="开始时间">
<date-picker <el-date-picker
v-model="daterangeBeginTime" v-model="daterangeBeginTime"
range type="datetimerange"
type="datetime" range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-type="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="['开始时间', '结束时间']" style="width: 400px"
:lang="lang" />
style="width: 340px"
></date-picker>
</el-form-item> </el-form-item>
<!-- <el-form-item label="采集日期范围"> <!-- <el-form-item label="采集日期范围">
<el-date-picker <el-date-picker
@ -350,12 +350,6 @@ const columns = ref([
{ key: 12, label: `计量设备名称`, visible: true } { key: 12, label: `计量设备名称`, visible: true }
]); ]);
const lang = {
formatLocale: {
firstDayOfWeek: 1
},
monthBeforeYear: false
};
// //
watch(filterBoxName, (val) => { watch(filterBoxName, (val) => {
@ -503,8 +497,8 @@ onMounted(() => {
lastDate.setDate(nowDate.getDate() - 1); lastDate.setDate(nowDate.getDate() - 1);
const yesterday = parseTime(lastDate, '{y}-{m}-{d}'); const yesterday = parseTime(lastDate, '{y}-{m}-{d}');
daterangeBeginTime.value[0] = yesterday + ' 08:00:00'; //
daterangeBeginTime.value[1] = today + ' 08:00:00'; daterangeBeginTime.value = [yesterday + ' 08:00:00', today + ' 08:00:00'];
getTreeselect(); getTreeselect();
getList(); getList();
@ -513,7 +507,7 @@ onMounted(() => {
<style scoped> <style scoped>
/* 选中节点的样式 */ /* 选中节点的样式 */
/deep/ .el-tree .el-tree-node.is-current > .el-tree-node__content { :deep(.el-tree .el-tree-node.is-current > .el-tree-node__content) {
background-color: #67C23A !important; /* 选中节点的背景色 */ background-color: #67C23A !important; /* 选中节点的背景色 */
color: #303133 !important; /* 选中节点的文字颜色 */ color: #303133 !important; /* 选中节点的文字颜色 */
padding: 0; /* 清除内边距 */ padding: 0; /* 清除内边距 */

Loading…
Cancel
Save