From 7fabcb7f0f91cc1ced7802ed3a96542e71c13788 Mon Sep 17 00:00:00 2001 From: guanj Date: Tue, 8 Jul 2025 08:44:13 +0800 Subject: [PATCH] =?UTF-8?q?Web=E7=AB=AF=E6=B7=BB=E5=8A=A0=E6=B2=BB?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E3=80=81=E6=A8=A1=E5=9D=97=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E3=80=81=E4=B8=BB=E5=8A=A8=E8=AF=A2=E9=97=AE?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cs-device-boot/EquipmentDelivery.ts | 18 +- src/components/echarts/MyEchart.vue | 13 +- src/components/form/datePicker/index.vue | 2 +- src/components/tree/govern/pointTree.vue | 44 +- src/components/tree/point.vue | 104 ++- src/views/govern/device/control/index.vue | 814 +++++++++++------- .../govern/device/control/moduleData.vue | 216 +++++ src/views/govern/manage/factory.vue | 52 +- src/views/govern/mxgraph/graphList/index.vue | 2 +- 9 files changed, 859 insertions(+), 406 deletions(-) create mode 100644 src/views/govern/device/control/moduleData.vue diff --git a/src/api/cs-device-boot/EquipmentDelivery.ts b/src/api/cs-device-boot/EquipmentDelivery.ts index 43ee428..ddcafb8 100644 --- a/src/api/cs-device-boot/EquipmentDelivery.ts +++ b/src/api/cs-device-boot/EquipmentDelivery.ts @@ -121,8 +121,24 @@ export function getById(data?: any) { //测试项日志修改 export function updateRecordData(data?: any) { return createAxios({ - url: 'cs-device-boot/wlRecord/updateRecordData', + url: '/cs-device-boot/wlRecord/updateRecordData', method: 'POST', data }) } +//模块数据 +export function allModelData(data?: any) { + return createAxios({ + url: '/cs-harmonic-boot/data/allModelData', + method: 'POST', + data + }) +} +//刷新状态 +export function getModuleState(data?: any) { + return createAxios({ + url: '/cs-harmonic-boot/data/getModuleState', + method: 'POST', + params: data + }) +} diff --git a/src/components/echarts/MyEchart.vue b/src/components/echarts/MyEchart.vue index 982da03..86a6b31 100644 --- a/src/components/echarts/MyEchart.vue +++ b/src/components/echarts/MyEchart.vue @@ -51,13 +51,7 @@ const initChart = () => { }, tooltip: { trigger: 'axis', - axisPointer: { - type: 'shadow', - label: { - color: '#fff', - fontSize: 16 - } - }, + textStyle: { color: '#fff', fontStyle: 'normal', @@ -66,7 +60,7 @@ const initChart = () => { }, backgroundColor: 'rgba(0,0,0,0.55)', borderWidth: 0, - confine: true, + // confine: true, ...(props.options?.tooltip || null) }, toolbox: { @@ -109,6 +103,7 @@ const initChart = () => { type: 'inside', height: 13, start: 0, + bottom: '20px', end: 100 }, @@ -117,7 +112,7 @@ const initChart = () => { height: 13, bottom: '20px', end: 100 - }, + } // { // show: true, // yAxisIndex: 0, diff --git a/src/components/form/datePicker/index.vue b/src/components/form/datePicker/index.vue index c3e308e..aa6a07c 100644 --- a/src/components/form/datePicker/index.vue +++ b/src/components/form/datePicker/index.vue @@ -417,7 +417,7 @@ const setTime = (flag = 0, e = 0) => { let data = '' - if ((dd < 4 || dd == 0) && interval.value != 4 && !props.theCurrentTime) { + if ((dd < 2 || dd == 0) && interval.value != 4 && !props.theCurrentTime) { data = window.XEUtils.toDateString(new Date().getTime() - (e + dd) * 3600 * 1000 * 24, 'yyyy-MM-dd') } else { data = window.XEUtils.toDateString(new Date().getTime() - e * 3600 * 1000 * 24, 'yyyy-MM-dd') diff --git a/src/components/tree/govern/pointTree.vue b/src/components/tree/govern/pointTree.vue index f4d9adc..c4cecdf 100644 --- a/src/components/tree/govern/pointTree.vue +++ b/src/components/tree/govern/pointTree.vue @@ -12,11 +12,9 @@ import { useDictData } from '@/stores/dictData' // const props = defineProps(['template']) interface Props { template?: boolean - } const props = withDefaults(defineProps(), { - template: false, - + template: false }) defineOptions({ name: 'govern/deviceTree' @@ -29,29 +27,25 @@ const dictData = useDictData() const treRef = ref() const width = ref('') - - - - - const info = () => { + tree.value = [] + let arr1: any[] = [] + let arr2: any[] = [] getLineTree().then(res => { - let arr1: any[] = [] - let arr2: any[] = [] //治理设备 res.data.map((item: any) => { if (item.name == '治理设备') { item.children.forEach((item: any) => { item.icon = 'el-icon-HomeFilled' - item.level=1 + item.level = 1 item.color = config.getColorVal('elementUiPrimary') item.children.forEach((item2: any) => { item2.icon = 'el-icon-List' - item2.level=1 + item2.level = 1 item2.color = config.getColorVal('elementUiPrimary') item2.children.forEach((item3: any) => { item3.icon = 'el-icon-Platform' - item3.level=1 + item3.level = 1 item3.color = item3.comFlag === 2 ? config.getColorVal('elementUiPrimary') : '#e26257 !important' item3.children.forEach((item4: any) => { @@ -71,13 +65,15 @@ const info = () => { item.color = item.comFlag === 2 ? config.getColorVal('elementUiPrimary') : '#e26257 !important' item.children.forEach((item2: any) => { item2.icon = 'el-icon-Platform' - item2.color = item2.comFlag === 2 ? config.getColorVal('elementUiPrimary') : '#e26257 !important' + item2.color = + item2.comFlag === 2 ? config.getColorVal('elementUiPrimary') : '#e26257 !important' arr2.push(item2) }) }) } }) tree.value = res.data + nextTick(() => { if (arr1.length) { //初始化选中 @@ -98,7 +94,6 @@ const info = () => { // }) // } else { - emit('init', arr2[0]) } }) @@ -108,17 +103,16 @@ const changePointType = (val: any, obj: any) => { emit('pointTypeChange', val, obj) } if (props.template) { - getTemplateByDept({ id: dictData.state.area[0].id }).then((res: any) => { - emit('Policy', res.data) - info() - - }).catch(err => { - info() - }) + getTemplateByDept({ id: dictData.state.area[0].id }) + .then((res: any) => { + emit('Policy', res.data) + info() + }) + .catch(err => { + info() + }) } else { info() } -onMounted(() => { - -}) +onMounted(() => {}) diff --git a/src/components/tree/point.vue b/src/components/tree/point.vue index 9e9c2ba..84a0c6e 100644 --- a/src/components/tree/point.vue +++ b/src/components/tree/point.vue @@ -1,9 +1,16 @@ - + v-if="props.canExpand && route.path != '/admin/govern/reportCore/statistics/index'" + /> - + + ref="treeRef1" + :props="defaultProps" + highlight-current + :filter-node-method="filterNode" + node-key="id" + default-expand-all + v-bind="$attrs" + :data="zlDeviceData" + style="overflow: auto" + > @@ -35,13 +63,24 @@ + ref="treeRef2" + :props="defaultProps" + highlight-current + default-expand-all + :filter-node-method="filterNode" + node-key="id" + :data="bxsDeviceData" + v-bind="$attrs" + style="overflow: auto" + > @@ -97,12 +136,23 @@ watch( item.children.map((vv: any) => { zlDeviceData.value.push(vv) }) + // console.log('🚀 ~ item.children.map ~ zlDeviceData.value:', zlDeviceData.value) } else if (item.name == '便携式设备') { item.children.map((vv: any) => { bxsDeviceData.value.push(vv) }) } }) + if (zlDeviceData.value.length != 0) { + activeName.value = '0' + } + if (zlDeviceData.value.length === 0 && bxsDeviceData.value.length != 0) { + activeName.value = '1' + } + if (!zlDeviceData.value && !bxsDeviceData.value) { + activeName.value = '' + } + changeDevice(activeName.value) } }, { @@ -162,14 +212,12 @@ const filterNode = (value: string, data: any, node: any) => { if (!value) return true // return data.name.includes(value) if (data.name) { - return chooseNode(value, data, node) } } // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符. const chooseNode = (value: string, data: any, node: any) => { - if (data.name.indexOf(value) !== -1) { return true } @@ -200,18 +248,10 @@ const treeRef1 = ref>() const treeRef2 = ref>() defineExpose({ treeRef1, treeRef2 }) onMounted(() => { - setTimeout(() => { - if (zlDeviceData.value.length != 0) { - activeName.value = '0' - } - if (zlDeviceData.value.length === 0 && bxsDeviceData.value.length != 0) { - activeName.value = '1' - } - if (!zlDeviceData.value && !bxsDeviceData.value) { - activeName.value = '' - } - changeDevice(activeName.value) - }, 500) + // nextTick(() => { + // // setTimeout(() => { + // // }, 500) + // }) }) diff --git a/src/views/govern/device/control/index.vue b/src/views/govern/device/control/index.vue index bd29c47..c7346e0 100644 --- a/src/views/govern/device/control/index.vue +++ b/src/views/govern/device/control/index.vue @@ -1,6 +1,10 @@ {{ devData.name || '/' }} - - {{ devData.lineInterval }}分钟 - - - {{ devData.volGrade }}kV - + {{ devData.lineInterval }}分钟 + {{ devData.volGrade }}kV - {{ devData.conType == 0 ? '星型接线' : devData.conType == 1 ? '角型接线' : devData.conType == 2 ? 'V型接线' : - '/' }} + {{ + devData.conType == 0 + ? '星型接线' + : devData.conType == 1 + ? '角型接线' + : devData.conType == 2 + ? 'V型接线' + : '/' + }} - + - + -
+

数据时间:{{ trendDataTime }} 数据时间:{{ mqttMessage.dataTime }}

- + 返回
@@ -189,33 +269,51 @@ >
-->
-
-
+
+
统计时间:{{ tableData[0]?.time || '' }}
- - + -
- - + :style="{ height: tableHeightBox }" + > + @@ -229,37 +327,49 @@
- + MAX {{ item.children[0].maxValue === 3.1415956 || - typeof item.children[0].maxValue != 'number' + typeof item.children[0].maxValue != 'number' ? '暂无数据' : item.children[0].maxValue }}
- + AVG {{ item.children[0].avgValue === 3.1415956 || - typeof item.children[0].avgValue != 'number' + typeof item.children[0].avgValue != 'number' ? '暂无数据' : item.children[0].avgValue }}
- + MIN {{ item.children[0].minValue === 3.1415956 || - typeof item.children[0].minValue != 'number' + typeof item.children[0].minValue != 'number' ? '暂无数据' : item.children[0].minValue }} @@ -350,15 +460,20 @@
-
+
-
+
返回
@@ -366,23 +481,41 @@ - - + - - +
-
+
-
+
+ +
+ +
@@ -405,8 +538,8 @@ import { getHarmRealData, getOverLimitData, queryDictType, - getById - + getById, + allModelData } from '@/api/cs-device-boot/EquipmentDelivery' import { deviceHisData, deviceRtData, realTimeData, getTestData } from '@/api/cs-device-boot/csGroup' import { ref, reactive, onMounted, onUnmounted, inject, nextTick, onBeforeUnmount } from 'vue' @@ -421,11 +554,12 @@ import offLineDataImport from './offLineDataImport/index.vue' import Event from './tabs/event.vue' import nearRealTimeData from './nearRealTimeData.vue' import testItemRecords from './testItemRecords.vue' +import moduleData from './moduleData.vue' import { useDictData } from '@/stores/dictData' import { useRouter } from 'vue-router' import TableHeader from '@/components/table/header/index.vue' import { useAdminInfo } from '@/stores/adminInfo' -import { Histogram, TrendCharts, DataLine, DataAnalysis, Odometer, Monitor, Timer, Back } from '@element-plus/icons-vue' +import { Histogram, TrendCharts, DataLine, DataAnalysis, Odometer, Monitor, Timer, Back ,Refresh} from '@element-plus/icons-vue' import analysisList from './analysisList/index.vue' import mqtt from 'mqtt' defineOptions({ @@ -439,6 +573,7 @@ const getGroupLoading = ref(false) const deviceData = ref(null) const dataSet = ref('') const testItemRecordsRef = ref() +const moduleDataRef = ref() const nearRealTimeDataRef = ref() const devTypeOptions = ref([]) const devModelOptions = ref([]) @@ -464,28 +599,29 @@ const formInline = reactive({ dataLevel: 'Secondary' }) -const dataSourceList = [{ - id: '0', - name: '补召' -}, { - id: '1', - name: '在线监测' -}] +const dataSourceList = [ + { + id: '0', + name: '补召' + }, + { + id: '1', + name: '在线监测' + } +] const oddAndEvenList = [ { value: '3', - label: '全部', + label: '全部' }, { value: '1', - label: '奇次', + label: '奇次' }, { value: '2', - label: '偶次', - }, - - + label: '偶次' + } ] const detail = ref(null) //是否显示实时数据默认内容 @@ -634,15 +770,14 @@ const handleSearch = () => { }) if (oddAndEvenFlag.value) { list = list.filter((item: any) => { - let str = item.otherName.split("次")[0] - queryListName[0].name == '间谐波电压含有率' ? str = str - 0.5 : '' + let str = item.otherName.split('次')[0] + queryListName[0].name == '间谐波电压含有率' ? (str = str - 0.5) : '' if (oddAndEven.value == '1') { // 奇次 if (str % 2 != 0) { return item } - } else if (oddAndEven.value == '2') { // 偶次 if (str % 2 == 0) { @@ -651,14 +786,10 @@ const handleSearch = () => { } else { return item } - - }) } - nearRealTimeDataRef.value?.setData(list, queryListName) - } const getDeviceDataTrend = (e: any) => { @@ -696,15 +827,11 @@ const lineId: any = ref('') const dataLevel: any = ref('') const dataSource = ref([]) const nodeClick = async (e: anyObj) => { - // console.log("🚀 ~ nodeClick ~ e:", e) - - if (e == undefined || e.level == 2) { - return loading.value = false + return (loading.value = false) } searchValue.value = '' - deviceId.value = e?.pid lineId.value = e?.id TrendList.value = e @@ -729,7 +856,6 @@ const nodeClick = async (e: anyObj) => { await getDeviceData(e.level == 3 ? e.pid : e.id, 'history', e.level == 3 ? e.id : e.children[0].id) .then((res: any) => { getById({ lineId: e.level == 3 ? e.id : e.children[0].id }).then((res: any) => { - devData.value = res.data }) @@ -744,7 +870,6 @@ const nodeClick = async (e: anyObj) => { tableData.value = [] loading.value = false } else { - res.data.dataSetList.forEach((item: any) => { //历史 if (item.type === 'history') { @@ -766,6 +891,10 @@ const nodeClick = async (e: anyObj) => { if (item.type === 'items') { item.id = item.id + '_items' } + // 模块数据 + if (item.type === 'moduleData') { + item.id = item.id + '_moduleData' + } }) res.data.dataSetList = res.data.dataSetList.filter((item: any) => item.name != '历史统计数据') //便携式设备默认二次值 @@ -813,7 +942,6 @@ const connectMqtt = () => { password: 'njcnpqs' } - mqttRef.value = mqtt.connect(url, options) } const getRealDataMqttMsg = async () => { @@ -826,180 +954,181 @@ const getRealDataMqttMsg = async () => { } //新的实时数据 //1.调用接口 mqtt推送数据 - await getBasicRealData(lineId.value).then((res: any) => { - if (res.code == 'A0000') { - ElMessage.success('装置应答成功') - mqttMessage.value = {} + await getBasicRealData(lineId.value) + .then((res: any) => { + if (res.code == 'A0000') { + ElMessage.success('装置应答成功') + mqttMessage.value = {} - realDataTimer.value = window.setInterval(async () => { - if (!dataSet.value.includes('_realtimedata')) return - await getBasicRealData(lineId.value).then((res: any) => { - // console.log(res, '获取基础实时数据') + realDataTimer.value = window.setInterval(async () => { + if (!dataSet.value.includes('_realtimedata')) return + await getBasicRealData(lineId.value).then((res: any) => { + // console.log(res, '获取基础实时数据') + }) + }, 30000) + mqttRef.value.on('message', (topic: any, message: any) => { + // 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("🚀 ~ mqttRef.value.on ~ obj:", obj) + if (lineId.value != obj.lineId && adminInfo.userIndex != obj.userId) return + // console.log("🚀 ~ mqttRef.value.on ~ obj:", obj) + // console.log("🚀 ~ mqttRef.value.on ~ formInline.dataLevel:", obj.dataLevel, formInline.dataLevel) + + //处理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.vRmsB * obj.pt) / 1000, + vRmsC: (obj.vRmsC * obj.pt) / 1000, + // 电流有效值 + iRmsA: obj.iRmsA * obj.ct, + iRmsB: obj.iRmsB * obj.ct, + iRmsC: obj.iRmsC * 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') { + obj = { + ...obj, + // 电压有效值 + vRmsA: (obj.vRmsA / obj.pt) * 1000, + vRmsB: (obj.vRmsB / obj.pt) * 1000, + vRmsC: (obj.vRmsC / obj.pt) * 1000, + // 电流有效值 + iRmsA: obj.iRmsA / obj.ct, + iRmsB: obj.iRmsB / obj.ct, + iRmsC: obj.iRmsC / 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) + } + } + if (obj.hasOwnProperty('pA') && obj.hasOwnProperty('pB')) { + mqttMessage.value = obj + //更新实时数据主页面值 + realTimeFlag.value && realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value) + tableLoading.value = false + //更新实时趋势折线图数据 + if (sonTab.value == 2) { + !realTimeFlag.value && + sonTab.value == 2 && + harmonicSpectrumRef.value && + harmonicSpectrumRef.value.setHarmonicSpectrumData(mqttMessage.value) + } + } + + //更新谐波频谱数据 + // !realTimeFlag.value && + // sonTab.value == 1 && + // realTrendRef.value && + // realTrendRef.value.setRealTrendData(obj) }) - }, 30000) - mqttRef.value.on('message', (topic: any, message: any) => { - // 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("🚀 ~ mqttRef.value.on ~ obj:", obj) - if (lineId.value != obj.lineId && adminInfo.userIndex != obj.userId) return - // console.log("🚀 ~ mqttRef.value.on ~ obj:", obj) - // console.log("🚀 ~ mqttRef.value.on ~ formInline.dataLevel:", obj.dataLevel, formInline.dataLevel) + //2.建立mqtt通讯 + //每隔30s调用一下接口,通知后台推送mqtt消息 - //处理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.vRmsB * obj.pt)) / 1000, - vRmsC: ((obj.vRmsC * obj.pt)) / 1000, - // 电流有效值 - iRmsA: (obj.iRmsA * obj.ct), - iRmsB: (obj.iRmsB * obj.ct), - iRmsC: (obj.iRmsC * 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') { - obj = { - ...obj, - // 电压有效值 - vRmsA: (obj.vRmsA / obj.pt) * 1000, - vRmsB: (obj.vRmsB / obj.pt) * 1000, - vRmsC: (obj.vRmsC / obj.pt) * 1000, - // 电流有效值 - iRmsA: obj.iRmsA / obj.ct, - iRmsB: obj.iRmsB / obj.ct, - iRmsC: obj.iRmsC / 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) - } - } - if (obj.hasOwnProperty('pA') && obj.hasOwnProperty('pB')) { - mqttMessage.value = obj - //更新实时数据主页面值 - realTimeFlag.value && realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value) - tableLoading.value = false - //更新实时趋势折线图数据 - if (sonTab.value == 2) { - !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() + }) - - //更新谐波频谱数据 - // !realTimeFlag.value && - // sonTab.value == 1 && - // realTrendRef.value && - // realTrendRef.value.setRealTrendData(obj) - }) - //2.建立mqtt通讯 - //每隔30s调用一下接口,通知后台推送mqtt消息 - - mqttRef.value.on('error', (error: any) => { - console.log('mqtt连接失败...', error) - mqttRef.value.end() - }) - - mqttRef.value.on('close', function () { - console.log('mqtt客户端已断开连接.....') - }) - } else { - ElMessage.success('装置应答失败') - tableLoading.value = false - } - }).catch(e => { - setTimeout(() => { - tableLoading.value = false - }, 0) - }) + mqttRef.value.on('close', function () { + console.log('mqtt客户端已断开连接.....') + }) + } else { + ElMessage.success('装置应答失败') + tableLoading.value = false + } + }) + .catch(e => { + setTimeout(() => { + tableLoading.value = false + }, 0) + }) } //tab点击事件 @@ -1111,11 +1240,11 @@ const handleClick = async (tab?: any) => { tableData.value = res.data formInline.total = res.data.total tableLoading.value = false - setTimeout(() => { //targetType - testItemRecordsRef.value?.setData(res.data,) + setTimeout(() => { + //targetType + testItemRecordsRef.value?.setData(res.data) }, 500) setTimeout(() => { - loading.value = false }, 1500) }) @@ -1126,7 +1255,36 @@ const handleClick = async (tab?: any) => { }) }, 100) } - + //模块数据 + if (dataSet.value.includes('_moduleData')) { + ;(await datePickerRef.value) && datePickerRef.value?.setInterval(5) + let obj = { + // devId: deviceId.value, //e.id + lineId: lineId.value, //e.pid + startTime: datePickerRef.value && datePickerRef.value.timeValue[0], + endTime: datePickerRef.value && datePickerRef.value.timeValue[1] + } + await setTimeout(() => { + allModelData(obj) + .then((res: any) => { + tableData.value = res.data + formInline.total = res.data.total + tableLoading.value = false + setTimeout(() => { + //targetType + moduleDataRef.value?.setData(res.data) + }, 500) + setTimeout(() => { + loading.value = false + }, 1500) + }) + .catch(e => { + setTimeout(() => { + tableLoading.value = false + }, 1500) + }) + }, 0) + } //查询当前指标 if (!dataSet.value.includes('_')) { @@ -1144,15 +1302,14 @@ const handleClick = async (tab?: any) => { }) if (oddAndEvenFlag.value) { list = list.filter((item: any) => { - let str = item.otherName.split("次")[0] - queryListName[0].name == '间谐波电压含有率' ? str = str - 0.5 : '' + let str = item.otherName.split('次')[0] + queryListName[0].name == '间谐波电压含有率' ? (str = str - 0.5) : '' if (oddAndEven.value == '1') { // 奇次 if (str % 2 != 0) { return item } - } else if (oddAndEven.value == '2') { // 偶次 if (str % 2 == 0) { @@ -1161,12 +1318,11 @@ const handleClick = async (tab?: any) => { } else { return item } - - }) } - setTimeout(() => { //targetType + setTimeout(() => { + //targetType nearRealTimeDataRef.value?.setData(list, queryListName) tableLoading.value = false }, 500) @@ -1193,17 +1349,23 @@ const handleClick = async (tab?: any) => { } } } +// 刷新状态 +const refreshTheState = () => { + + moduleDataRef.value.getModule(deviceData.value.ndid) +} //模版下载 -const handleDownLoadTemplate = () => { } +const handleDownLoadTemplate = () => {} //补召日志 const analysisListRef = ref() //打开补召日志 const handleAnalysisList = () => { - analysisListRef.value && analysisListRef.value.open({ - lineId: lineId.value, - deviceData: deviceData.value, - deviceId: deviceId.value, - }) + analysisListRef.value && + analysisListRef.value.open({ + lineId: lineId.value, + deviceData: deviceData.value, + deviceId: deviceId.value + }) } //离线数据导入 const offLineDataImportRef = ref() @@ -1232,7 +1394,6 @@ queryByCode('Device_Type').then(res => { }) }) const handleTargetTypeChange = () => { - if (queryList.value.filter((item: any) => item.id == formInline.targetType)[0].name != '基本数据') { oddAndEvenFlag.value = true } else { @@ -1245,7 +1406,7 @@ const echoName = (value: any, arr: any[]) => { return value ? arr.find(item => item.value == value)?.label : '/' } -onMounted(() => { }) +onMounted(() => {}) onBeforeUnmount(() => { clearInterval(realDataTimer.value) clearInterval(trendTimer.value) @@ -1314,8 +1475,6 @@ onBeforeUnmount(() => { background-image: linear-gradient(var(--el-color-primary), var(--el-color-primary-light-3)); .box-card-content { - - height: 100%; display: flex; flex-direction: column; @@ -1323,12 +1482,9 @@ onBeforeUnmount(() => { } } } - - } } - .box-card-div { display: grid; // grid-template-columns: repeat(3, 1fr); @@ -1337,12 +1493,10 @@ onBeforeUnmount(() => { } .box-card-new { - min-height: 110px !important; .el-card__body { overflow-y: auto; - } } diff --git a/src/views/govern/device/control/moduleData.vue b/src/views/govern/device/control/moduleData.vue new file mode 100644 index 0000000..1b5e970 --- /dev/null +++ b/src/views/govern/device/control/moduleData.vue @@ -0,0 +1,216 @@ + + + diff --git a/src/views/govern/manage/factory.vue b/src/views/govern/manage/factory.vue index 2d73dea..6cc2119 100644 --- a/src/views/govern/manage/factory.vue +++ b/src/views/govern/manage/factory.vue @@ -3,11 +3,21 @@