实时数据-实时趋势

This commit is contained in:
zhujiyan
2024-10-14 20:39:01 +08:00
parent d18e4a9bf5
commit 70666d4c86
3 changed files with 121 additions and 58 deletions

View File

@@ -263,7 +263,11 @@
<!-- 实时数据-实时录波组件 --> <!-- 实时数据-实时录波组件 -->
<recordWoves v-if="!realTimeFlag && sonTab == 0"></recordWoves> <recordWoves v-if="!realTimeFlag && sonTab == 0"></recordWoves>
<!-- 实时数据-实时趋势组件 --> <!-- 实时数据-实时趋势组件 -->
<realTrend v-show="!realTimeFlag && sonTab == 1" ref="realTrendRef"></realTrend> <realTrend
v-show="!realTimeFlag && sonTab == 1"
ref="realTrendRef"
@changeTrendType="changeTrendType"
></realTrend>
<!-- 实时数据-谐波频谱组件 --> <!-- 实时数据-谐波频谱组件 -->
<harmonicSpectrum <harmonicSpectrum
v-show="!realTimeFlag && sonTab == 2" v-show="!realTimeFlag && sonTab == 2"
@@ -372,26 +376,38 @@ const handleRecordWaves = () => {
const realTrendRef = ref() const realTrendRef = ref()
//谐波频谱 //谐波频谱
const harmonicSpectrumRef = ref() const harmonicSpectrumRef = ref()
const changeTrendType = (val: any) => {
activeTrendName.value = val * 1
handleTrend()
}
//实时趋势 //实时趋势
const handleTrend = () => { const activeTrendName: any = ref(0)
const handleTrend = async () => {
realTimeFlag.value = false realTimeFlag.value = false
sonTab.value = 1 sonTab.value = 1
clearInterval(timer.value) clearInterval(timer.value)
clearInterval(realDataTimer.value) clearInterval(realDataTimer.value)
getHarmRealData(lineId.value, 0).then((res: any) => { await getHarmRealData(lineId.value, activeTrendName.value).then((res: any) => {
if (res.code == 'A0000') { if (res.code == 'A0000') {
ElMessage.success('装置应答成功')
mqttRef.value.on('message', (topic: any, message: any) => { mqttRef.value.on('message', (topic: any, message: any) => {
// console.log('mqtt接收到消息', message,topic) // console.log('mqtt接收到消息', message,topic)
console.log('mqtt接收到消息', JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message))))) console.log('mqtt接收到消息', JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))))
let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))) let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))) || {}
realTrendRef.value && realTrendRef.value.setRealTrendData(obj) realTrendRef.value && realTrendRef.value.setRealTrendData(obj)
}) })
} else {
ElMessage.success('装置应答失败')
} }
}) })
getOverLimitData(lineId.value).then((res: any) => { await getOverLimitData(lineId.value).then((res: any) => {
console.log(res, '获取国标限制') console.log(res, '获取国标限制')
if(res.code=='A0000'){
realTrendRef.value && realTrendRef.value.setOverLimitData(res.data)
}
}) })
realTrendRef.value && realTrendRef.value.open({ devId: deviceId.value, lineId: lineId.value }) realTrendRef.value &&
realTrendRef.value.open({ devId: deviceId.value, lineId: lineId.value, activeTrendName: activeTrendName.value })
} }
//谐波频谱 //谐波频谱
const handleHarmonicSpectrum = () => { const handleHarmonicSpectrum = () => {
@@ -607,14 +623,18 @@ const handleClick = async (tab?: any) => {
//新的实时数据 //新的实时数据
//1.调用接口 mqtt推送数据 //1.调用接口 mqtt推送数据
await getBasicRealData(lineId.value).then((res: any) => { await getBasicRealData(lineId.value).then((res: any) => {
console.log(res, '获取基础实时数据') if (res.code == 'A0000') {
ElMessage.success('装置应答成功')
} else {
ElMessage.success('装置应答失败')
}
}) })
//2.建立mqtt通讯 //2.建立mqtt通讯
const mqttMessage = ref<any>({}) const mqttMessage = ref<any>({})
//每隔30s调用一下接口通知后台推送mqtt消息 //每隔30s调用一下接口通知后台推送mqtt消息
realDataTimer.value = setInterval(() => { realDataTimer.value = setInterval(() => {
getBasicRealData(lineId.value).then((res: any) => { getBasicRealData(lineId.value).then((res: any) => {
console.log(res, '获取基础实时数据') console.log(res, '获取基础实时数据')
}) })
@@ -629,6 +649,7 @@ const handleClick = async (tab?: any) => {
}) })
mqttRef.value.on('message', (topic: any, message: any) => { mqttRef.value.on('message', (topic: any, message: any) => {
mqttMessage.value = {}
// console.log('mqtt接收到消息', message,topic) // console.log('mqtt接收到消息', message,topic)
console.log('mqtt接收到消息', JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message))))) console.log('mqtt接收到消息', JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))))
let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))) let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message))))

View File

@@ -1,9 +1,9 @@
<!-- 实时数据 - 实时趋势 --> <!-- 实时数据 - 实时趋势 -->
<template> <template>
<div class="realtrend"> <div class="realtrend" v-loading="loading">
<el-tabs type="border-card" v-model="activeName" @tab-click="handleClick"> <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
<el-tab-pane v-for="(item, index) in tabsList" :label="item.groupName" :name="index" :key="index"> <el-tab-pane v-for="(item, index) in tabsList" :label="item.groupName" :name="index" :key="index">
<div v-loading="loading"> <div>
<div class="realtrend_top"> <div class="realtrend_top">
<!-- <div class="thead"> <!-- <div class="thead">
<ul v-for="(table, tableIndex) in newTableList" :key="tableIndex"> <ul v-for="(table, tableIndex) in newTableList" :key="tableIndex">
@@ -17,30 +17,27 @@
<span v-for="(key, keys) in table"> <span v-for="(key, keys) in table">
<li v-if="keys != 0"> <li v-if="keys != 0">
{{ key?.value }} {{ key?.value }}
</li> </li>
</span> </span>
</ul> </ul>
</div> --> </div> -->
<div class="realtrend_table"> <div class="realtrend_table" v-if="Object.keys(tableData).length != 0">
<div class="thead_left"> <div class="thead_left">
<p>次数</p> <p>次数</p>
<p>{{ item.groupName }}</p> <p>{{ item.groupName }}</p>
</div> </div>
<div class="thead_right"> <div class="thead_right">
<div class="right_cell" v-for="(value, key, index) in tableData" :key="index"> <div class="right_cell" v-for="(value, key, index) in tableData" :key="index">
<p style="color: red; margin: 0 10px"> <p>
<span style="color: green"> <span>{{ String(key).replace('data', ' ') }}</span>
{{ String(key).replace('data', ' ') }}
</span>
</p> </p>
<p style="color: red; margin: 0 10px"> <p>
<span <span
v-if=" v-if="
String(key).includes('data') && String(key).includes('data') &&
String(key) != 'dataLevel' && String(key) != 'dataLevel' &&
String(key) != 'dataTime' String(key) != 'dataTime'
" "
style="color: green"
> >
{{ value }} {{ value }}
</span> </span>
@@ -49,18 +46,19 @@
</div> </div>
</div> </div>
</div> </div>
<div class="tab_info"> <div class="tab_info" v-if="Object.keys(tableData).length != 0">
<div class="charts"> <div class="charts">
<MyEchart ref="barCharts" :options="echartsData"></MyEchart> <MyEchart ref="barCharts" :options="echartsData"></MyEchart>
</div> </div>
</div> </div>
<el-empty v-else style="margin: 0 auto" />
</div> </div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, onMounted, reactive, nextTick } from 'vue' import { ref, onMounted, reactive, nextTick, defineEmits } from 'vue'
import { VxeGridProps, VxeGridPropTypes } from 'vxe-table' import { VxeGridProps, VxeGridPropTypes } from 'vxe-table'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import MyEchart from '@/components/echarts/MyEchart.vue' import MyEchart from '@/components/echarts/MyEchart.vue'
@@ -68,7 +66,7 @@ import { Platform, TrendCharts, DataLine } from '@element-plus/icons-vue'
import { getDeviceTrendDataGroup, getDeviceTrendData } from '@/api/cs-device-boot/EquipmentDelivery.ts' import { getDeviceTrendDataGroup, getDeviceTrendData } from '@/api/cs-device-boot/EquipmentDelivery.ts'
import Index from '@/components/wangEditor/index.vue' import Index from '@/components/wangEditor/index.vue'
const activeName = ref(0) const activeName = ref(0)
const emit = defineEmits(['changeTrendType'])
const tableList: any = [] const tableList: any = []
interface RowVO { interface RowVO {
[key: string]: any [key: string]: any
@@ -91,23 +89,23 @@ const myColumns: any = ref([
// { field: 'value', title: '谐波电压含有率(%)' } // { field: 'value', title: '谐波电压含有率(%)' }
]) ])
const yAxisUnit: any = ref('')
const myData = tableList const myData = tableList
const tabsList = ref([]) const tabsList = ref([])
//接收参数 //接收参数
const params = ref({}) const params = ref({})
const open = (val: any) => { const open = (val: any) => {
//获取指标tab //获取指标tab
loading.value = true
getDeviceTrendDataGroup().then(res => { getDeviceTrendDataGroup().then(res => {
tabsList.value = res.data tabsList.value = res.data
if (tabsList.value.length != 0) { if (tabsList.value.length != 0) {
// activeName.value = tabsList.value[0]?.id // activeName.value = tabsList.value[0]?.id
activeName.value = 0 activeName.value = val.activeTrendName || 0
} }
params.value = { groupId: tabsList.value[activeName.value]?.id, ...val } params.value = { groupId: tabsList.value[activeName.value]?.id, ...val }
findRealTrendDataByGroupId(params.value) loading.value = false
}) })
init()
return return
} }
const newTableList: any = ref([]) const newTableList: any = ref([])
@@ -117,7 +115,7 @@ const loading: any = ref(false)
const chartsData: any = ref([]) const chartsData: any = ref([])
const chartsYxiasData: any = ref([]) const chartsYxiasData: any = ref([])
const findRealTrendDataByGroupId = (obj: any) => { const findRealTrendDataByGroupId = (obj: any) => {
loading.value = true return
chartsData.value = [] chartsData.value = []
chartsYxiasData.value = [] chartsYxiasData.value = []
getDeviceTrendData(obj).then(res => { getDeviceTrendData(obj).then(res => {
@@ -161,7 +159,6 @@ const findRealTrendDataByGroupId = (obj: any) => {
if (item.list.length != 0) { if (item.list.length != 0) {
const maxCount1 = Math.max(...countList.map((item: any) => item.count)) const maxCount1 = Math.max(...countList.map((item: any) => item.count))
const maxCount2 = Math.max(...item.list.map((item: any) => item.count)) const maxCount2 = Math.max(...item.list.map((item: any) => item.count))
console.log(maxCount2, maxCount1)
if (maxCount2 < maxCount1) { if (maxCount2 < maxCount1) {
for (let i = 0; i < maxCount1 - maxCount2; i++) { for (let i = 0; i < maxCount1 - maxCount2; i++) {
item.list.push({ item.list.push({
@@ -215,6 +212,24 @@ const barCharts = ref()
//加载echarts //加载echarts
const init = () => { const init = () => {
console.log(tableData.value, '++++++++')
let trendData: any = []
for (let key in tableData.value) {
console.log(key, ',,,,,')
trendData.push({
name: key,
value: tableData.value[key],
count: String(key).replace('data', '')
})
}
let gbData: any = []
for (let key in limitData.value) {
gbData.push({
name: key,
value: limitData.value[key]
})
}
console.log(trendData, 'mmmmm', gbData)
let xAxisList: any = [] let xAxisList: any = []
chartsData.value.map((item: any, index: any) => { chartsData.value.map((item: any, index: any) => {
chartsYxiasData.value.map((vv: any, vvs: any) => { chartsYxiasData.value.map((vv: any, vvs: any) => {
@@ -274,7 +289,9 @@ const init = () => {
}, },
xAxis: { xAxis: {
name: '次数', name: '次数',
data: xAxisList, data: trendData.map((item: any) => {
return item.count+'次'
}),
axisLine: { axisLine: {
show: true, //隐藏X轴轴线 show: true, //隐藏X轴轴线
lineStyle: { lineStyle: {
@@ -297,7 +314,7 @@ const init = () => {
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: chartsData?.value[0]?.unit ? '单位(' + chartsData?.value[0]?.unit + ')' : '', name: '',
splitLine: { splitLine: {
show: false show: false
}, },
@@ -315,22 +332,19 @@ const init = () => {
series: [] series: []
} }
} }
let list: any = [] let list: any = [
list = [] gbData.map((item: any) => {
chartsYxiasData.value.map((item: any) => { return item.value
// console.log(item.gbList, 'guobialist340') }),
if (item.gbList.length != 0) { trendData.map((item: any) => {
list.push({ phase: item.phase, title: '国标限值', list: item.gbList }) return item.value
} })
if (item.phaseList.length != 0) { ]
list.push({ phase: item.phase, title: item.title, list: item.phaseList }) let legendList = ['国标限值', tabsList.value[activeName.value]?.groupName]
} echartsData.value.options.legend.data = legendList
})
const colorList = ['#0e8780', '#FFCC00', '#009900', '#CC0000']
list.map((item: any, index: any) => { list.map((item: any, index: any) => {
echartsData.value.options.legend.data.push(item.title)
echartsData.value.options.series.push({ echartsData.value.options.series.push({
name: item.title, name: legendList[index],
type: 'bar', type: 'bar',
barMaxWidth: 16, //使用的 y 轴的 index在单个图表实例中存在多个 y轴的时候有用 barMaxWidth: 16, //使用的 y 轴的 index在单个图表实例中存在多个 y轴的时候有用
itemStyle: { itemStyle: {
@@ -340,39 +354,50 @@ const init = () => {
// }e // }e
color: colorList[index] color: colorList[index]
}, },
data: item.list data: item
}) })
}) })
// nextTick(() => {
if (barCharts.value) { if (barCharts.value) {
console.log(barCharts.value, '+++++++++++++++++++#@!')
barCharts.value[activeName.value]?.initChart() barCharts.value[activeName.value]?.initChart()
} }
// })
return return
} }
const handleClick = (tab: any, event: any) => { const handleClick = (tab: any, event: any) => {
params.value.groupId = tabsList.value[tab.index].id params.value.groupId = tabsList.value[tab.index].id
findRealTrendDataByGroupId(params.value) emit('changeTrendType', tab.index)
activeName.value = tab.index
init() init()
} }
//获取mqtt传送的实时数据 //获取mqtt传送的实时数据
const mqttMessage: any = ref() const mqttMessage: any = ref()
const tableData: any = ref({}) const tableData: any = ref({})
const colorList = ['#0e8780', '#FFCC00', '#009900', '#CC0000']
const setRealTrendData = (val: any) => { const setRealTrendData = (val: any) => {
console.log(val, '7777777777773555') tableData.value = {}
mqttMessage.value = val mqttMessage.value = val
loading.value = true
for (let key in val) { for (let key in val) {
if (String(key).includes('data') && String(key) != 'dataLevel' && String(key) != 'dataTime') { if (String(key).includes('data') && String(key) != 'dataLevel' && String(key) != 'dataTime') {
console.log(val[key], '0000000')
tableData.value[key] = val[key] tableData.value[key] = val[key]
delete tableData.value.data1
}
}
loading.value = false
init()
}
//获取国标限值
const limitData: any = ref()
const setOverLimitData = (val: any) => {
limitData.value = {}
for (let key in val) {
if (String(key).includes('uharm')) {
limitData.value[key] = val[key]
} }
} }
console.log(tableData.value, 'kkkkjjjjjsssslllmmmmmssdddd')
} }
onMounted(() => {}) onMounted(() => {})
defineExpose({ open, setRealTrendData }) defineExpose({ open, setRealTrendData, setOverLimitData })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.realtrend { .realtrend {
@@ -462,23 +487,34 @@ defineExpose({ open, setRealTrendData })
.realtrend_table { .realtrend_table {
width: 100%; width: 100%;
height: 100px; height: auto;
max-height: 150px;
display: flex; display: flex;
border: 2px solid green; border: 2px solid #eee;
cursor: pointer;
.thead_left { .thead_left {
width: 120px; width: 150px;
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
line-height: 50px; line-height: 50px;
font-weight: 800;
p {
width: 100%;
height: 100%;
text-align: center;
border: 1px solid #eee;
line-height: 50px;
margin: 0 !important;
}
} }
.thead_right { .thead_right {
flex: 1; flex: 1;
align-items: center; align-items: center;
overflow-x: auto; overflow-x: auto;
border: 2px solid yellowgreen; overflow-y: hidden;
display: flex; display: flex;
.right_cell { .right_cell {
width: 100%; width: 100%;
@@ -486,9 +522,15 @@ defineExpose({ open, setRealTrendData })
flex-direction: column; flex-direction: column;
p { p {
flex: none; flex: none;
width: 40px; width: 90px;
height: 100%; height: 100%;
text-align: center;
border: 1px solid #eee;
line-height: 50px; line-height: 50px;
margin: 0 !important;
}
p:nth-child(1) {
font-weight: 800;
} }
} }
} }

View File

@@ -500,7 +500,7 @@ const init = () => {
startAngle: 180, startAngle: 180,
endAngle: 0, endAngle: 0,
min: 0, min: 0,
max: 300, max: 450,
radius: '150%', radius: '150%',
center: ['55%', '76%'], center: ['55%', '76%'],
splitNumber: 3, //刻度数量 splitNumber: 3, //刻度数量