云设备录入

This commit is contained in:
sjl
2025-10-11 10:35:25 +08:00
parent 2e58e58c73
commit a3b6a5c0be
23 changed files with 9302 additions and 3827 deletions

View File

@@ -0,0 +1,80 @@
<template>
<TableHeader datePicker ref="refheader" showExport>
<template v-slot:select>
<el-form-item label="关键词">
<el-input maxlength="32" show-word-limit v-model.trim="tableStore.table.params.searchValue" placeholder="请输入前置服务器名称ip" />
</el-form-item>
</template>
</TableHeader>
<!-- <div style="height: 300px;"> -->
<Table ref="tableRef" :isGroup="true" />
<!-- </div> -->
</template>
<script setup lang="ts">
import { ref, onMounted, provide } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { mainHeight } from '@/utils/layout'
const props = defineProps(['deviceTree'])
const refheader = ref()
const tableStore = new TableStore({
url: '/cs-harmonic-boot/eventUser/frontWarnInfo',
method: 'POST',
exportName: '前置告警',
publicHeight: 65,
column: [
{
title: '序号',
width: 80,
formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '前置服务器名称', field: 'lineId', align: 'center' },
{ title: '前置服务器ip', field: 'wavePath', align: 'center' },
{ title: '进程号', field: 'clDid', align: 'center' },
{ title: '发生时刻', field: 'startTime', align: 'center', minWidth: 80, sortable: true },
{
title: '事件描述',
field: 'tag',
minWidth: 350
},
{
title: '告警代码',
field: 'code',
align: 'center',
formatter: (row: any) => {
return row.cellValue ? row.cellValue : '/'
},
sortable: true
},
],
beforeSearchFun: () => {}
})
provide('tableStore', tableStore)
tableStore.table.params.searchValue = ''
const deviceTreeOptions = ref<any>(props.deviceTree)
deviceTreeOptions.value.map((item: any, index: any) => {
if (item.children.length == 0) {
deviceTreeOptions.value.splice(index, 1)
}
})
onMounted(() => {
tableStore.index()
})
setTimeout(() => {
// tableStore.table.height = mainHeight(200).height as any
}, 0)
</script>
<style></style>

View File

@@ -4,14 +4,17 @@
<el-tab-pane label="设备告警" name="1">
<Device v-if="activeName == '1'" :deviceTree="deviceTree" :key="key" />
</el-tab-pane>
<el-tab-pane label="稳态越限告警" name="2">
<Steady v-if="activeName == '2'" :deviceTree="deviceTree" :key="key" />
<el-tab-pane label="前置告警" name="2">
<Front v-if="activeName == '2'" :deviceTree="deviceTree" :key="key" />
</el-tab-pane>
<el-tab-pane label="暂态事件" name="3">
<Transient v-if="activeName == '3'" :deviceTree="deviceTree" :key="key" />
<el-tab-pane label="稳态越限告警" name="3">
<Steady v-if="activeName == '3'" :deviceTree="deviceTree" :key="key" />
</el-tab-pane>
<el-tab-pane label="异常事件" name="4">
<Abnormal v-if="activeName == '4'" :deviceTree="deviceTree" :key="key" />
<el-tab-pane label="暂态事件" name="4">
<Transient v-if="activeName == '4'" :deviceTree="deviceTree" :key="key" />
</el-tab-pane>
<el-tab-pane label="异常事件" name="5">
<Abnormal v-if="activeName == '5'" :deviceTree="deviceTree" :key="key" />
</el-tab-pane>
</el-tabs>
</div>
@@ -22,6 +25,7 @@ import Steady from './Steady.vue'
import Transient from './Transient.vue'
import Device from './Device.vue'
import Abnormal from './Abnormal.vue'
import Front from './Front.vue'
import { getDeviceTree } from '@/api/cs-device-boot/csLedger'
defineOptions({
name: 'govern/alarm/index'

File diff suppressed because it is too large Load Diff

View File

@@ -732,14 +732,14 @@ const handleHarmonicSpectrum = async () => {
// getRealDataMqttMsg()
await getBasicRealData(lineId.value).then((res: any) => {
if (res.code == 'A0000') {
// ElMessage.success('装置应答成功')
ElMessage.success('装置应答成功')
// mqttMessage.value = {}
realDataTimer.value = window.setInterval(() => {
if (!dataSet.value.includes('_realtimedata')) return
getBasicRealData(lineId.value).then((res: any) => {
// console.log(res, '获取基础实时数据')
console.log(res, '获取基础实时数据')
})
}, 30000)
}

View File

@@ -269,10 +269,21 @@ const childRefs: any = {}
const init = () => {
loading.value = true
//循环渲染图表
xAixsTimeList.value.push(mqttMessage.value.dataTime.split(" ")[1])
// 限制x轴数据点数量避免过多数据点导致性能问题和显示重复
if (xAixsTimeList.value.length > 50) {
xAixsTimeList.value.shift()
}
searchForm.value.index.map((item: any, index: any) => {
item?.children.map((vv: any, vvs: any) => {
if (mqttMessage.value[vv.name] != undefined) {
// 清空当前时间点的数据(如果存在),防止重复
const currentTime = mqttMessage.value.dataTime.split(" ")[1];
vv.yMethodList = vv.yMethodList.filter((point: any) => point[0] !== currentTime);
item.data.push({
// time: mqttMessage.value.dataTime,
value: mqttMessage.value[vv.name],
@@ -280,14 +291,16 @@ const init = () => {
})
allDataList.value.push(mqttMessage.value[vv.name])
vv.data.push(mqttMessage.value[vv.name])
vv.yMethodList.push([mqttMessage.value.dataTime.split(" ")[1], mqttMessage.value[vv.name] + '', vv.phase])
// 更新yMethodList数据确保与xAixsTimeList保持同步
vv.yMethodList.push([currentTime, mqttMessage.value[vv.name] + '', vv.phase])
// 限制数据点数量,避免过多数据点导致性能问题和显示重复
if (vv.yMethodList.length > 50) {
vv.yMethodList.shift()
}
}
})
})
//循环渲染图表
xAixsTimeList.value.push(mqttMessage.value.dataTime.split(" ")[1])
searchForm.value.index.map((item: any, index: any) => {
@@ -378,7 +391,7 @@ defineExpose({ resetData, setHarmonicSpectrumData })
.harmonic {
width: 100%;
// height: 100%;
display: flex;
display: 'flex';
flex-direction: column;
position: relative;
@@ -416,4 +429,4 @@ defineExpose({ resetData, setHarmonicSpectrumData })
}
}
}
</style>
</style>

View File

@@ -141,17 +141,17 @@
<el-form-item label="设备类型:" prop="devType" class="top">
<el-select v-model.trim="form.devType" placeholder="请选择" @change="formDevTypeChange" clearable>
<el-option
v-for="item in devTypeOptions"
v-for="item in formDevTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
:label="item.label || item.name"
:value="item.value || item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备型号:" prop="devModel" class="top">
<el-select v-model.trim="form.devModel" filterable placeholder="请选择" clearable>
<el-option
v-for="item in formDevModelOptionsFilter"
v-for="item in formDevModelOptionsFilter "
:key="item.value"
:label="item.label"
:value="item.value"
@@ -159,7 +159,7 @@
</el-select>
</el-form-item>
<el-form-item label="通讯协议:" prop="devAccessMethod" class="top">
<el-select v-model.trim="form.devAccessMethod" placeholder="请选择" clearable>
<el-select v-model.trim="form.devAccessMethod" placeholder="请选择" clearable disabled>
<el-option label="MQTT" value="MQTT"></el-option>
<el-option label="CLD" value="CLD"></el-option>
</el-select>
@@ -219,6 +219,8 @@ defineOptions({
})
const showQrCode = ref(false)
const devTypeOptions: any = ref([])
const devTypeOptions2: any = ref([])
const devModelOptions2: any = ref([])
const deivce: any = ref({})
const ruleFormRef = ref()
const form = reactive({
@@ -246,37 +248,54 @@ const dialogTitle = ref('新增设备')
const loading = ref<boolean>(false)
const devModelOptions: any = ref([])
const queryTheDictionary = () => {
queryByCode('Device_Type').then(async res => {
const id = res.data.id
await queryCsDictTree(id).then(res => {
devTypeOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
queryByCode('DEV_CLD').then(res => {
devTypeOptions2.value = res.data
return queryCsDictTree(res.data.id).then(res => {
devModelOptions2.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
// let index = devTypeOptions.value.findIndex((item: any) => {
// return item.name == '网关'
// })
// devTypeOptions.value.splice(index, 1)
}).then(() => {
queryByCode('Device_Type').then(async res => {
const id = res.data.id
await queryCsDictTree(id).then(res => {
devTypeOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
// let index = devTypeOptions.value.findIndex((item: any) => {
// return item.name == '网关'
// })
// devTypeOptions.value.splice(index, 1)
})
await queryByid(id).then(res => {
res.data.map((item: any, index: any) => {
if (item.pid == id) {
res.data.splice(index, 1)
}
})
devModelOptions.value = res.data.map((item: any, index: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
await tableStore.index()
})
}).catch(error => {
console.error('查询过程中出现错误:', error)
})
await queryByid(id).then(res => {
res.data.map((item: any, index: any) => {
if (item.pid == id) {
res.data.splice(index, 1)
}
})
devModelOptions.value = res.data.map((item: any, index: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
await tableStore.index()
})
}
const devModelOptionsFilter = computed(() => {
return devModelOptions.value.filter((item: any) => {
@@ -287,15 +306,39 @@ const devModelOptionsFilter = computed(() => {
}
})
})
const formDevModelOptionsFilter = computed(() => {
return devModelOptions.value.filter((item: any) => {
if (form.devType) {
return item.pid == form.devType
} else {
return true
}
})
if(form.devAccessMethod === 'CLD'){
return devModelOptions2.value.filter((item: any) => {
if (form.devType) {
return item.pid == form.devType
} else {
return true
}
})
}else{
return devModelOptions.value.filter((item: any) => {
if (form.devType) {
return item.pid == form.devType
} else {
return true
}
})
}
})
const formDevTypeOptions = computed(() => {
// 如果协议是CLD使用devTypeOptions2否则使用devTypeOptions
if (form.devAccessMethod === 'CLD') {
// 对于devTypeOptions2使用id和name字段
return [devTypeOptions2.value]
} else {
// 对于devTypeOptions使用value和label字段
return devTypeOptions.value
}
})
const tableStore = new TableStore({
url: '/cs-device-boot/EquipmentDelivery/list',
method: 'POST',
@@ -314,21 +357,29 @@ const tableStore = new TableStore({
},
{ title: '设备名称', field: 'name', minWidth: 120 },
{ title: '网络设备ID', field: 'ndid', minWidth: 120 },
{
title: '设备类型',
field: 'devType',
formatter: row => {
return devTypeOptions.value.find((item: any) => item.value == row.cellValue).label
if (row.row.devAccessMethod === 'CLD') {
// 遍历devTypeOptions2查找匹配
return devTypeOptions2.value.name
}
// 如果是MQTT协议使用devTypeOptions查找
else if (row.row.devAccessMethod === 'MQTT') {
const item = devTypeOptions.value.find((item: any) => item.value == row.cellValue);
return item ? item.label : '/';
}
},
minWidth: 120
},
{
title: '设备型号',
field: 'devModel',
formatter: row => {
return devModelOptions.value.find((item: any) => item.value == row.cellValue).label
const options = row.row.devAccessMethod === 'MQTT' ? devModelOptions.value : devModelOptions2.value
const item = options.find((item: any) => item.value == row.cellValue);
return item ? item.label : '/';
},
minWidth: 120
},
@@ -690,6 +741,7 @@ const tableStore = new TableStore({
: ''
}
})
console.log('🚀 ~ loadCallback ~ tableStore.table:', tableStore.table)
tableKey.value += 1
}
})