From 10b87108328ee0470bf1aee06733a1099dbca601 Mon Sep 17 00:00:00 2001 From: zhujiyan <17812234322@163.com> Date: Wed, 16 Oct 2024 16:57:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=90=E6=B3=A2=E9=A2=91=E8=B0=B1=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/govern/device/control/index.vue | 351 ++++++++++-------- .../control/supplementaryRecruitment.vue | 35 +- .../tabs/components/harmonicSpectrum.vue | 287 ++++++++++++-- .../control/tabs/components/recordwoves.vue | 10 +- .../govern/device/control/tabs/realtime.vue | 2 +- .../govern/device/control/tabs/trend.vue | 124 ++++--- 6 files changed, 522 insertions(+), 287 deletions(-) diff --git a/src/views/govern/device/control/index.vue b/src/views/govern/device/control/index.vue index 166fe03..c625e58 100644 --- a/src/views/govern/device/control/index.vue +++ b/src/views/govern/device/control/index.vue @@ -12,9 +12,20 @@ - 离线补召 - 在线补召 - 补招日志 + + 离线补召 + + + 在线补召 + + + 补招日志 + {{ deviceData.name ? deviceData.name : '/' }} @@ -373,8 +384,6 @@ const handleRecordWaves = () => { } //实时趋势 const realTrendRef = ref() -//谐波频谱 -const harmonicSpectrumRef = ref() const changeTrendType = (val: any) => { activeTrendName.value = val * 1 handleTrend() @@ -409,12 +418,17 @@ const handleTrend = async () => { realTrendRef.value.open({ devId: deviceId.value, lineId: lineId.value, activeTrendName: activeTrendName.value }) } //谐波频谱 +const harmonicSpectrumRef = ref() +//谐波频谱 const handleHarmonicSpectrum = () => { realTimeFlag.value = false - sonTab.value = 2 - harmonicSpectrumRef.value && - harmonicSpectrumRef.value.getHarmonicSpectrumParams({ devId: deviceId.value, lineId: lineId.value }) + // harmonicSpectrumRef.value && + // harmonicSpectrumRef.value.getHarmonicSpectrumParams({ devId: deviceId.value, lineId: lineId.value }) window.clearInterval(timer.value) + clearInterval(realDataTimer.value) + realTimeFlag.value = false + sonTab.value = 2 + getRealDataMqttMsg() } //返回 const handleReturn = () => { @@ -542,9 +556,172 @@ const connectMqtt = () => { } mqttRef.value = mqtt.connect(url, options) } +const getRealDataMqttMsg = async () => { + //新的实时数据 + //1.调用接口 mqtt推送数据 + await getBasicRealData(lineId.value).then((res: any) => { + if (res.code == 'A0000') { + ElMessage.success('装置应答成功') + } else { + ElMessage.success('装置应答失败') + } + }) + //2.建立mqtt通讯 + //每隔30s调用一下接口,通知后台推送mqtt消息 + realDataTimer.value = await setInterval(() => { + getBasicRealData(lineId.value).then((res: any) => { + console.log(res, '获取基础实时数据') + }) + }, 30000) + connectMqtt() + mqttRef.value.on('connect', (e: any) => { + // ElMessage.success('连接mqtt服务器成功!') + console.log('mqtt客户端已连接....') + // mqttRef.value.subscribe('/Web/Progress') + mqttRef.value.subscribe('/Web/RealData/+') + //假数据 + }) + + mqttRef.value.on('message', (topic: any, message: any) => { + mqttMessage.value = {} + // console.log('mqtt接收到消息', message,topic) + 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)))) + //处理mqtt数据 1转2除 2转1乘 + //如果消息返回值是二次值,下拉框是二次值只需要单位换算 除以1000 + //如果消息返回值是一次值,下拉框是一次值只需要单位换算 除以1000 + if (obj.dataLevel == formInline.dataLevel) { + obj = { + ...obj, + // 电压有效值 + vRmsA: obj.vRmsA / 1000, + vRmsB: obj.vRmsB / 1000, + vRmsC: obj.vRmsC / 1000, + //基波电压幅值 + v1A: obj.v1A / 1000, + v1B: obj.v1B / 1000, + v1C: obj.v1C / 1000, + //有功功率 + pA: obj.pA / 1000, + pB: obj.pB / 1000, + pC: obj.pC / 1000, + pTot: obj.pTot / 1000, + //无功功率 + qA: obj.qA / 1000, + qB: obj.qB / 1000, + qC: obj.qC / 1000, + qTot: obj.qTot / 1000, + //视在功率 + sA: obj.sA / 1000, + sB: obj.sB / 1000, + sC: obj.sC / 1000, + sTot: obj.sTot / 1000 + } + } + //如果消息返回值是二次值,下拉框是一次值需要单位换算 除以1000 并且乘以pt ct + if (obj.dataLevel == 'Secondary' && formInline.dataLevel == 'Primary') { + obj = { + ...obj, + // 电压有效值 + vRmsA: (obj.vRmsA * obj.pt) / 1000, + vRmsB: (obj.vRmsA * obj.pt) / 1000, + vRmsC: (obj.vRmsA * obj.pt) / 1000, + // 电流有效值 + iRmsA: obj.iRmsA * obj.ct, + iRmsB: obj.iRmsA * obj.ct, + iRmsC: obj.iRmsA * obj.ct, + //基波电压幅值 + v1A: (obj.v1A * obj.pt) / 1000, + v1B: (obj.v1B * obj.pt) / 1000, + v1C: (obj.v1C * obj.pt) / 1000, + //基波电流幅值 + i1A: obj.i1A * obj.ct, + i1B: obj.i1B * obj.ct, + i1C: obj.i1C * obj.ct, + //有功功率 + pA: (obj.pA * obj.pt * obj.ct) / 1000, + pB: (obj.pB * obj.pt * obj.ct) / 1000, + pC: (obj.pC * obj.pt * obj.ct) / 1000, + pTot: (obj.pTot * obj.pt * obj.ct) / 1000, + //无功功率 + qA: (obj.qA * obj.pt * obj.ct) / 1000, + qB: (obj.qB * obj.pt * obj.ct) / 1000, + qC: (obj.qC * obj.pt * obj.ct) / 1000, + qTot: (obj.qTot * obj.pt * obj.ct) / 1000, + //视在功率 + sA: (obj.sA * obj.pt * obj.ct) / 1000, + sB: (obj.sB * obj.pt * obj.ct) / 1000, + sC: (obj.sC * obj.pt * obj.ct) / 1000, + sTot: (obj.sTot * obj.pt * obj.ct) / 1000 + } + } + //如果消息返回值是一次值,下拉框是二次值需要单位换算 乘以1000 并且除以pt ct + if (obj.dataLevel == 'Primary' && formInline.dataLevel == 'Secondary') { + console.log(6666) + obj = { + ...obj, + // 电压有效值 + vRmsA: (obj.vRmsA / obj.pt) * 1000, + vRmsB: (obj.vRmsA / obj.pt) * 1000, + vRmsC: (obj.vRmsA / obj.pt) * 1000, + // 电流有效值 + iRmsA: obj.iRmsA / obj.ct, + iRmsB: obj.iRmsA / obj.ct, + iRmsC: obj.iRmsA / obj.ct, + //基波电压幅值 + v1A: (obj.v1A / obj.pt) * 1000, + v1B: (obj.v1B / obj.pt) * 1000, + v1C: (obj.v1C / obj.pt) * 1000, + //基波电流幅值 + i1A: obj.i1A / obj.ct, + i1B: obj.i1B / obj.ct, + i1C: obj.i1C / obj.ct, + //有功功率 + pA: (obj.pA / obj.pt / obj.ct) * 1000, + pB: (obj.pB / obj.pt / obj.ct) * 1000, + pC: (obj.pC / obj.pt / obj.ct) * 1000, + pTot: (obj.pTot / obj.pt / obj.ct) * 1000, + //无功功率 + qA: (obj.qA / obj.pt / obj.ct) * 1000, + qB: (obj.qB / obj.pt / obj.ct) * 1000, + qC: (obj.qC / obj.pt / obj.ct) * 1000, + qTot: (obj.qTot / obj.pt / obj.ct) * 1000, + //视在功率 + sA: (obj.sA / obj.pt / obj.ct) * 1000, + sB: (obj.sB / obj.pt / obj.ct) * 1000, + sC: (obj.sC / obj.pt / obj.ct) * 1000, + sTot: (obj.sTot / obj.pt / obj.ct) * 1000 + } + } + //保留两位小数 + for (var i in obj) { + if (typeof obj[i] == 'number' && obj[i] != 0 && Math.abs(obj[i]) % 1 != 0) { + obj[i] = obj[i].toFixed(2) + } + } + mqttMessage.value = obj + //更新实时数据值 + realTimeFlag.value && realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value) + //更新谐波频谱数据 + !realTimeFlag.value && + sonTab.value == 2 && + harmonicSpectrumRef.value && + harmonicSpectrumRef.value.setHarmonicSpectrumData(mqttMessage.value) + }) + + mqttRef.value.on('error', (error: any) => { + console.log('mqtt连接失败...', error) + mqttRef.value.end() + }) + + mqttRef.value.on('close', function () { + console.log('mqtt客户端已断开连接.....') + }) +} //tab点击事件 const realDataTimer: any = ref() +const mqttMessage = ref({}) const handleClick = async (tab?: any) => { if (realDataTimer.value) { window.clearInterval(realDataTimer.value) @@ -614,163 +791,7 @@ const handleClick = async (tab?: any) => { tableLoading.value = false }, 1500) - //新的实时数据 - //1.调用接口 mqtt推送数据 - await getBasicRealData(lineId.value).then((res: any) => { - if (res.code == 'A0000') { - ElMessage.success('装置应答成功') - } else { - ElMessage.success('装置应答失败') - } - }) - //2.建立mqtt通讯 - - const mqttMessage = ref({}) - - //每隔30s调用一下接口,通知后台推送mqtt消息 - realDataTimer.value = setInterval(() => { - getBasicRealData(lineId.value).then((res: any) => { - console.log(res, '获取基础实时数据') - }) - }, 30000) - connectMqtt() - mqttRef.value.on('connect', (e: any) => { - // ElMessage.success('连接mqtt服务器成功!') - console.log('mqtt客户端已连接....') - // mqttRef.value.subscribe('/Web/Progress') - mqttRef.value.subscribe('/Web/RealData/+') - //假数据 - }) - - mqttRef.value.on('message', (topic: any, message: any) => { - mqttMessage.value = {} - // console.log('mqtt接收到消息', message,topic) - 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)))) - //处理mqtt数据 1转2除 2转1乘 - //如果消息返回值是二次值,下拉框是二次值只需要单位换算 除以1000 - //如果消息返回值是一次值,下拉框是一次值只需要单位换算 除以1000 - if (obj.dataLevel == formInline.dataLevel) { - obj = { - ...obj, - // 电压有效值 - vRmsA: obj.vRmsA / 1000, - vRmsB: obj.vRmsB / 1000, - vRmsC: obj.vRmsC / 1000, - //基波电压幅值 - v1A: obj.v1A / 1000, - v1B: obj.v1B / 1000, - v1C: obj.v1C / 1000, - //有功功率 - pA: obj.pA / 1000, - pB: obj.pB / 1000, - pC: obj.pC / 1000, - pTot: obj.pTot / 1000, - //无功功率 - qA: obj.qA / 1000, - qB: obj.qB / 1000, - qC: obj.qC / 1000, - qTot: obj.qTot / 1000, - //视在功率 - sA: obj.sA / 1000, - sB: obj.sB / 1000, - sC: obj.sC / 1000, - sTot: obj.sTot / 1000 - } - } - //如果消息返回值是二次值,下拉框是一次值需要单位换算 除以1000 并且乘以pt ct - if (obj.dataLevel == 'Secondary' && formInline.dataLevel == 'Primary') { - obj = { - ...obj, - // 电压有效值 - vRmsA: (obj.vRmsA * obj.pt) / 1000, - vRmsB: (obj.vRmsA * obj.pt) / 1000, - vRmsC: (obj.vRmsA * obj.pt) / 1000, - // 电流有效值 - iRmsA: obj.iRmsA * obj.ct, - iRmsB: obj.iRmsA * obj.ct, - iRmsC: obj.iRmsA * obj.ct, - //基波电压幅值 - v1A: (obj.v1A * obj.pt) / 1000, - v1B: (obj.v1B * obj.pt) / 1000, - v1C: (obj.v1C * obj.pt) / 1000, - //基波电流幅值 - i1A: obj.i1A * obj.ct, - i1B: obj.i1B * obj.ct, - i1C: obj.i1C * obj.ct, - //有功功率 - pA: (obj.pA * obj.pt * obj.ct) / 1000, - pB: (obj.pB * obj.pt * obj.ct) / 1000, - pC: (obj.pC * obj.pt * obj.ct) / 1000, - pTot: (obj.pTot * obj.pt * obj.ct) / 1000, - //无功功率 - qA: (obj.qA * obj.pt * obj.ct) / 1000, - qB: (obj.qB * obj.pt * obj.ct) / 1000, - qC: (obj.qC * obj.pt * obj.ct) / 1000, - qTot: (obj.qTot * obj.pt * obj.ct) / 1000, - //视在功率 - sA: (obj.sA * obj.pt * obj.ct) / 1000, - sB: (obj.sB * obj.pt * obj.ct) / 1000, - sC: (obj.sC * obj.pt * obj.ct) / 1000, - sTot: (obj.sTot * obj.pt * obj.ct) / 1000 - } - } - //如果消息返回值是一次值,下拉框是二次值需要单位换算 乘以1000 并且除以pt ct - if (obj.dataLevel == 'Primary' && formInline.dataLevel == 'Secondary') { - console.log(6666) - obj = { - ...obj, - // 电压有效值 - vRmsA: (obj.vRmsA / obj.pt) * 1000, - vRmsB: (obj.vRmsA / obj.pt) * 1000, - vRmsC: (obj.vRmsA / obj.pt) * 1000, - // 电流有效值 - iRmsA: obj.iRmsA / obj.ct, - iRmsB: obj.iRmsA / obj.ct, - iRmsC: obj.iRmsA / obj.ct, - //基波电压幅值 - v1A: (obj.v1A / obj.pt) * 1000, - v1B: (obj.v1B / obj.pt) * 1000, - v1C: (obj.v1C / obj.pt) * 1000, - //基波电流幅值 - i1A: obj.i1A / obj.ct, - i1B: obj.i1B / obj.ct, - i1C: obj.i1C / obj.ct, - //有功功率 - pA: (obj.pA / obj.pt / obj.ct) * 1000, - pB: (obj.pB / obj.pt / obj.ct) * 1000, - pC: (obj.pC / obj.pt / obj.ct) * 1000, - pTot: (obj.pTot / obj.pt / obj.ct) * 1000, - //无功功率 - qA: (obj.qA / obj.pt / obj.ct) * 1000, - qB: (obj.qB / obj.pt / obj.ct) * 1000, - qC: (obj.qC / obj.pt / obj.ct) * 1000, - qTot: (obj.qTot / obj.pt / obj.ct) * 1000, - //视在功率 - sA: (obj.sA / obj.pt / obj.ct) * 1000, - sB: (obj.sB / obj.pt / obj.ct) * 1000, - sC: (obj.sC / obj.pt / obj.ct) * 1000, - sTot: (obj.sTot / obj.pt / obj.ct) * 1000 - } - } - //保留两位小数 - for (var i in obj) { - if (typeof obj[i] == 'number' && obj[i] != 0) { - obj[i].toFixed(2) - } - } - mqttMessage.value = obj - realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value) - }) - - mqttRef.value.on('error', (error: any) => { - console.log('mqtt连接失败...', error) - mqttRef.value.end() - }) - - mqttRef.value.on('close', function () { - console.log('mqtt客户端已断开连接.....') - }) + getRealDataMqttMsg() } //查询暂态事件 if (dataSet.value.includes('_event')) { diff --git a/src/views/govern/device/control/supplementaryRecruitment.vue b/src/views/govern/device/control/supplementaryRecruitment.vue index c68b566..fb360fe 100644 --- a/src/views/govern/device/control/supplementaryRecruitment.vue +++ b/src/views/govern/device/control/supplementaryRecruitment.vue @@ -1,47 +1,36 @@ diff --git a/src/views/govern/device/control/tabs/realtime.vue b/src/views/govern/device/control/tabs/realtime.vue index d9500fb..b661699 100644 --- a/src/views/govern/device/control/tabs/realtime.vue +++ b/src/views/govern/device/control/tabs/realtime.vue @@ -643,7 +643,7 @@ onMounted(() => { } .view_bot { min-height: 300px; - margin: 10px 0 20px 0; + margin: 10px 0 0 0; overflow: auto !important; flex: 1 !important; padding-bottom: 200px !important; diff --git a/src/views/govern/device/control/tabs/trend.vue b/src/views/govern/device/control/tabs/trend.vue index 09fc6bb..e6ed74f 100644 --- a/src/views/govern/device/control/tabs/trend.vue +++ b/src/views/govern/device/control/tabs/trend.vue @@ -9,20 +9,43 @@ - - + +
- - - - + + +
@@ -32,7 +55,6 @@ 查询 -
@@ -192,14 +214,14 @@ const init = async () => { let unitList: any = [] let groupedData = chartsList.reduce((acc, item) => { - let key = item.anotherName; + let key = item.anotherName if (!acc[key]) { - acc[key] = []; + acc[key] = [] } - acc[key].push(item); - return acc; + acc[key].push(item) + return acc }, {}) - let result = Object.values(groupedData); + let result = Object.values(groupedData) if (chartsList.length > 0) { unitList = result.map((item: any) => { return item[0].unit @@ -208,7 +230,6 @@ const init = async () => { echartsData.value = { legend: { - itemWidth: 20, itemHeight: 10, itemGap: 15, @@ -236,18 +257,15 @@ const init = async () => { backgroundColor: 'rgba(0,0,0,0.35)', borderWidth: 0, formatter(params) { - const xname = params[0].value[0]; - let str = `${xname}
`; + const xname = params[0].value[0] + let str = `${xname}
` params.forEach((el, index) => { - str += `${el.marker}${el.seriesName.split('(')[0]}:${el.value[1]}${el.value[2]}
`; - }); - return str; - }, - - - - - + str += `${el.marker}${el.seriesName.split('(')[0]}:${el.value[1]}${ + el.value[2] + }
` + }) + return str + } }, color: ['#FFCC00', '#009900', '#CC0000', ...color], xAxis: { @@ -260,14 +278,10 @@ const init = async () => { } } }, - yAxis: [{ - - }], + yAxis: [{}], options: { - series: [ - - ] + series: [] } } if (chartsList.length > 0) { @@ -275,7 +289,7 @@ const init = async () => { unitList.forEach((item: any, index: any) => { let right = { position: 'right', - offset: (index - 1) * 80, + offset: (index - 1) * 80 } echartsData.value.yAxis.push({ name: item, @@ -283,8 +297,7 @@ const init = async () => { splitNumber: 5, minInterval: 1, splitLine: { - show: false, - + show: false }, ...(index > 0 ? right : null) }) @@ -293,26 +306,26 @@ const init = async () => { result.forEach((item: any, index: any) => { let yMethodList: any = [] - let ABCList = Object.values(item.reduce((acc, item) => { - let key = item.phase; - if (!acc[key]) { - acc[key] = []; - } - acc[key].push(item); - return acc; - }, {})); - ABCList.forEach((kk: any,) => { + let ABCList = Object.values( + item.reduce((acc, item) => { + let key = item.phase + if (!acc[key]) { + acc[key] = [] + } + acc[key].push(item) + return acc + }, {}) + ) + ABCList.forEach((kk: any) => { let seriesList: any = [] kk.forEach((cc: any) => { if (cc.statisticalData) { yMethodList.push(cc.statisticalData?.toFixed(2) - 0) - } - seriesList.push([cc.time, cc.statisticalData?.toFixed(2),cc.unit]) + seriesList.push([cc.time, cc.statisticalData?.toFixed(2), cc.unit]) }) - echartsData.value.options.series.push({ name: kk[0].phase + '相' + item[0].anotherName, type: 'line', @@ -320,17 +333,11 @@ const init = async () => { symbol: 'none', data: seriesList, yAxisIndex: index - }) - - }) let [min, max] = yMethod(yMethodList) echartsData.value.yAxis[index].min = min echartsData.value.yAxis[index].max = max - - - }) } loading.value = false @@ -350,7 +357,6 @@ const selectChange = (flag: boolean) => { } else { pageHeight.value = mainHeight(290) } - } //导出 const historyChart = ref() @@ -521,7 +527,7 @@ const onCountChange = (val: any, index: any) => { countData.value[index].count = [countData.value[index].countOptions[0]] } } -const onIndexChange = (val: any,) => { +const onIndexChange = (val: any) => { if (val.length == 0) { searchForm.value.index = [indexOptions.value[0].id] } @@ -551,7 +557,7 @@ watch( } ) // watch( -// () => trendRequestData.value, +// () => trendRequestData.value, // (val: any, oldval: any) => { // if (val) { // init()