From 8971e33a507083b9f2306f1f95a16315e9fe916d Mon Sep 17 00:00:00 2001 From: zhujiyan <17812234322@163.com> Date: Sat, 12 Oct 2024 11:40:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E6=97=B6=E6=95=B0=E6=8D=AE-=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=B0=83=E6=95=B4&=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E8=AF=95&=E6=95=B0=E6=8D=AE=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cs-device-boot/EquipmentDelivery.ts | 18 +- src/views/govern/device/control/index.vue | 231 +++++++++++-- .../govern/device/control/tabs/realtime.vue | 305 ++++++++++++------ 3 files changed, 430 insertions(+), 124 deletions(-) diff --git a/src/api/cs-device-boot/EquipmentDelivery.ts b/src/api/cs-device-boot/EquipmentDelivery.ts index 481a767..64911d5 100644 --- a/src/api/cs-device-boot/EquipmentDelivery.ts +++ b/src/api/cs-device-boot/EquipmentDelivery.ts @@ -1,7 +1,7 @@ import createAxios from '@/utils/request' // 装置基础数据和模板数据 -export function getDeviceData(deviceId: string, type: string, lineId:string) { +export function getDeviceData(deviceId: string, type: string, lineId: string) { let form = new FormData() form.append('deviceId', deviceId) form.append('lineId', lineId) @@ -25,6 +25,22 @@ export function getTabsDataByType(data: any) { }) } +/**** 获取基础实施数据 ****/ +export function getBasicRealData(id: any) { + return createAxios({ + url: `/cs-harmonic-boot/realData/getBaseRealData?lineId=${id}`, + method: 'POST' + }) +} + +/**** 获取谐波实时数据 ****/ +export function getHarmRealData(target: any) { + return createAxios({ + url: `/cs-harmonic-boot/realData/getHarmRealData?lineId=${id}&target=${target}`, + method: 'POST' + }) +} + //获取实时数据列表数据 export function getRealTimeTableList() { return createAxios({ diff --git a/src/views/govern/device/control/index.vue b/src/views/govern/device/control/index.vue index f39fe44..2101992 100644 --- a/src/views/govern/device/control/index.vue +++ b/src/views/govern/device/control/index.vue @@ -110,6 +110,12 @@ 查询 + + 实时趋势 + + + 谐波频谱 +
-
- + 实时趋势 谐波频谱 -
+
-->
- 返回 + 返回
@@ -288,9 +294,9 @@ import Detail from './detail.vue' import PointTree from '@/components/tree/govern/pointTree.vue' import { mainHeight } from '@/utils/layout' import { queryByCode, queryByid, queryCsDictTree } from '@/api/system-boot/dictTree' -import { getDeviceData, getTabsDataByType } from '@/api/cs-device-boot/EquipmentDelivery' +import { getDeviceData, getTabsDataByType, getBasicRealData } from '@/api/cs-device-boot/EquipmentDelivery' import { deviceHisData, deviceRtData, getGroup } from '@/api/cs-device-boot/csGroup' -import { ref, reactive, nextTick, onMounted, watch } from 'vue' +import { ref, reactive, nextTick, onMounted, watch, onUnmounted } from 'vue' import { ElMessage } from 'element-plus' import DatePicker from '@/components/form/datePicker/index.vue' import Trend from './tabs/trend.vue' //趋势数据 @@ -301,6 +307,7 @@ import recordWoves from './tabs/components/recordwoves.vue' //实时数据-实 import offLineDataImport from './offLineDataImport/index.vue' import Event from './tabs/event.vue' import { useRouter } from 'vue-router' +import TableHeader from '@/components/table/header/index.vue' import { defineConfig, loadEnv } from 'vite' import type { UserConfig, ConfigEnv } from 'vite' import { @@ -312,9 +319,11 @@ import { DataAnalysis, Odometer, Monitor, - Timer + Timer, + Back } from '@element-plus/icons-vue' import analysisList from './analysisList/index.vue' +import mqtt from 'mqtt' defineOptions({ name: 'govern/device/control' }) @@ -472,23 +481,42 @@ const pointTypeChange = (val: any, obj: any) => { nodeClick(obj) } const realTimeRef: any = ref() -const intRealTime = async (val: any) => { - await getTabsDataByType(val).then(res => { - realTimeRef.value && realTimeRef.value.getRealTimeData(res.data) - }) - timer.value = window.setInterval(async () => { - await getTabsDataByType(val).then(res => { - realTimeRef.value && realTimeRef.value.getRealTimeData(res.data) - }) - }, 5000) -} + //趋势数据组件 const trendRef: any = ref() //暂态事件组件 const eventRef: any = ref() const timer: any = ref() + +const mqttRef = ref() + +const connectMqtt = () => { + if (mqttRef.value) { + if (mqttRef.value.connected) { + return + } + } + const options: any = { + protocolId: 'MQTT', + qos: 2, + clean: true, + connectTimeout: 30 * 1000, + clientId: 'mqttjs' + Math.random(), + username: 't_user', + password: 'njcnpqs' + } + // 线上 + // const url = 'wss://pqmcn.com:8087/mqtt' + const url = 'ws://192.168.1.24:8085/mqtt' + mqttRef.value = mqtt.connect(url, options) +} //tab点击事件 + +const realDataTimer: any = ref() const handleClick = async (tab?: any) => { + if (realDataTimer.value) { + window.clearInterval(realDataTimer.value) + } tableLoading.value = true //点击tab时更新dataSet最新值 if (tab && tab.props && tab.props.name && dataSet.value != tab.props.name) { @@ -548,6 +576,7 @@ const handleClick = async (tab?: any) => { } //查询实时数据 if (dataSet.value.includes('_realtimedata')) { + console.log(66666) //查询实时数据显示实时录波、实时趋势、谐波频谱 realTimeFlag.value = true let obj = { @@ -556,10 +585,163 @@ const handleClick = async (tab?: any) => { devId: deviceId.value, //e.id lineId: lineId.value //e.pid } - intRealTime(obj) setTimeout(() => { tableLoading.value = false }, 1500) + + //新的实时数据 + //1.调用接口 + getBasicRealData(lineId.value).then((res: any) => { + console.log(res, '获取基础实时数据') + }) + //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) => { + // 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)))) + console.log(obj, '620=================>') + //处理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] = 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客户端已断开连接.....') + }) } //查询暂态事件 if (dataSet.value.includes('_event')) { @@ -598,6 +780,13 @@ const handleClick = async (tab?: any) => { }, 1500) }) } + if (!dataSet.value.includes('_realtimedata')) { + clearInterval(timer.value) + clearInterval(realDataTimer.value) + if (mqttRef.value) { + mqttRef.value.end() + } + } } //模版下载 const handleDownLoadTemplate = () => {} @@ -663,6 +852,10 @@ const openGroup = () => { } onMounted(() => {}) +onUnmounted(() => { + clearInterval(timer.value) + clearInterval(realDataTimer.value) +})