修改冀北问题

This commit is contained in:
guanj
2025-12-09 20:04:55 +08:00
parent 8c41a8fc77
commit 0fe2d2b911
49 changed files with 6357 additions and 5917 deletions

View File

@@ -2,7 +2,7 @@
<div>
<TableHeader date-picker area ref="TableHeaderRef">
<template v-slot:select>
<el-form-item label="对象类型">
<!-- <el-form-item label="对象类型">
<el-select
v-model="tableStore.table.params.objType"
clearable
@@ -16,7 +16,7 @@
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form-item> -->
<el-form-item label="终端厂家:">
<el-select
v-model="tableStore.table.params.manufacturer"
@@ -136,7 +136,7 @@
/>
</el-form-item>
<el-form-item class="form_but">
<el-button type="primary" @click="MonitorVerify" icon="el-icon-Refresh">更新</el-button>
<el-button type="primary" @click="MonitorVerify" icon="el-icon-Search">查询</el-button>
<el-button type="primary" @click="onExport" icon="el-icon-Download">导出</el-button>
</el-form-item>
</el-form>

View File

@@ -1,143 +1,151 @@
<template>
<el-dialog draggable width="1350px" class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<div style="display: flex">
<div :style="height1" class="mr10 box" style="width: 500px">
<vxe-table
height="auto"
:data="TableData"
v-bind="defaultAttribute"
ref="tableRef"
:row-config="{ isCurrent: true, isHover: true }"
@current-change="currentChangeEvent"
>
<vxe-column type="seq" title="序号" width="60px"></vxe-column>
<vxe-column field="date" title="日期"></vxe-column>
<vxe-column field="bdName" title="所属电站(场站)" width="120px"></vxe-column>
<vxe-column field="monitorName" title="监测点名称" width="120px"></vxe-column>
<vxe-column field="timeSum" title="告警时间(分钟)" width="80px"></vxe-column>
</vxe-table>
</div>
<div :style="height" style="width: 820px" v-loading="loading1">
<vxe-table
height="auto"
:data="TableData1.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
v-bind="defaultAttribute"
>
<vxe-column type="seq" title="序号" width="80px">
<template #default="{ rowIndex }">
<span>{{ (pageNum - 1) * pageSize + rowIndex + 1 }}</span>
</template>
</vxe-column>
<vxe-column field="time" title="时间" :formatter="formatter"></vxe-column>
<vxe-column field="targetName" title="指标类型" min-width="100px"></vxe-column>
<vxe-column field="phaseType" title="相别" width="80px">
<template v-slot="{ row }">
{{ row.phaseType == 'T' ? '/' : row.phaseType }}
</template>
</vxe-column>
<vxe-column field="type" title="数据类型" width="105px" :formatter="formatter"></vxe-column>
<vxe-column field="val" title="值" width="85px" :formatter="formatter"></vxe-column>
</vxe-table>
<div class="table-pagination">
<el-pagination
v-model:currentPage="pageNum"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
background
layout="sizes,total, ->, prev, pager, next, jumper"
:total="TableData1.length"
></el-pagination>
</div>
</div>
</div>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { useDictData } from '@/stores/dictData'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ElMessage } from 'element-plus'
import { monitorLimitTable, monitorLimitTableDetail } from '@/api/device-boot/dataVerify'
import { mainHeight } from '@/utils/layout'
const dictData = useDictData()
const StatisList = dictData.getBasicData('Steady_Statis')
const dialogVisible = ref(false)
const height1 = mainHeight(-110, 2)
const height = mainHeight(10, 2)
const tableRef = ref()
const title = ref('')
const loading1 = ref(false)
const TableData = ref([])
const TableData1 = ref([])
const pageNum = ref(1)
const pageSize = ref(20)
const numKey = ref(0)
const targetKey = ref('')
const clickRow = ref({})
const open = (data: anyObj, time: string[], num: number) => {
// title.value = (num == 0 ? data.targetName : data.monitorName) + '_告警详情展示'
title.value = '告警监测点详情'
numKey.value = num
targetKey.value = data.key
TableData.value = []
monitorLimitTable({
monitorIds: num == 0 ? data.ids : [data.monitorId],
targetKey: num == 0 ? data.key : '',
searchBeginTime: time[0],
searchEndTime: time[1]
}).then(res => {
TableData.value = res.data
tableRef.value.setCurrentRow(TableData.value[0])
currentChangeEvent()
})
dialogVisible.value = true
}
const currentChangeEvent = () => {
loading1.value = true
clickRow.value = tableRef.value.getCurrentRecord()
TableData1.value = []
monitorLimitTableDetail({
monitorIds: [clickRow.value.monitorId],
searchBeginTime: clickRow.value.date,
targetKey: numKey.value == 0 ? targetKey.value : ''
})
.then(res => {
TableData1.value = res.data
loading1.value = false
pageNum.value = 1
})
.catch(() => {
loading1.value = false
})
}
const formatter = (row: any) => {
if (row.column.field == 'time') {
return clickRow.value.date + ' ' + row.cellValue
} else if (row.column.field == 'type') {
return row.cellValue === 'null' ? '/' : row.cellValue
} else {
return row.cellValue == null ? '/' : (row.cellValue - 0).toFixed(2)
}
}
defineExpose({ open })
</script>
<style lang="scss" scoped>
.table-pagination {
height: 58px;
box-sizing: border-box;
width: 100%;
max-width: 100%;
background-color: var(--ba-bg-color-overlay);
padding: 13px 15px;
border-left: 1px solid #e4e7e9;
border-right: 1px solid #e4e7e9;
border-bottom: 1px solid #e4e7e9;
}
:deep(.box) {
.row--current {
background-color: var(--el-color-primary-light-8) !important;
}
}
</style>
<template>
<el-dialog draggable width="1350px" class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<div style="display: flex" v-loading="loading">
<div :style="height1" class="mr10 box" style="width: 500px">
<vxe-table
height="auto"
:data="TableData"
v-bind="defaultAttribute"
ref="tableRef"
:row-config="{ isCurrent: true, isHover: true }"
@current-change="currentChangeEvent"
>
<vxe-column type="seq" title="序号" width="60px"></vxe-column>
<vxe-column field="date" title="日期"></vxe-column>
<vxe-column field="bdName" title="所属电站(场站)" width="120px"></vxe-column>
<vxe-column field="monitorName" title="监测点名称" width="120px"></vxe-column>
<vxe-column field="timeSum" title="告警时间(分钟)" width="80px"></vxe-column>
</vxe-table>
</div>
<div :style="height" style="width: 820px" v-loading="loading1">
<vxe-table
height="auto"
:data="TableData1.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
v-bind="defaultAttribute"
>
<vxe-column type="seq" title="序号" width="80px">
<template #default="{ rowIndex }">
<span>{{ (pageNum - 1) * pageSize + rowIndex + 1 }}</span>
</template>
</vxe-column>
<vxe-column field="time" title="时间" :formatter="formatter"></vxe-column>
<vxe-column field="targetName" title="指标类型" min-width="100px"></vxe-column>
<vxe-column field="phaseType" title="相别" width="80px">
<template v-slot="{ row }">
{{ row.phaseType == 'T' ? '/' : row.phaseType }}
</template>
</vxe-column>
<vxe-column field="type" title="数据类型" width="105px" :formatter="formatter"></vxe-column>
<vxe-column field="val" title="值" width="85px" :formatter="formatter"></vxe-column>
<vxe-column field="overLimitValue" title="限值" width="85px" :formatter="formatter"></vxe-column>
</vxe-table>
<div class="table-pagination">
<el-pagination
v-model:currentPage="pageNum"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
background
layout="sizes,total, ->, prev, pager, next, jumper"
:total="TableData1.length"
></el-pagination>
</div>
</div>
</div>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { useDictData } from '@/stores/dictData'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ElMessage } from 'element-plus'
import { monitorLimitTable, monitorLimitTableDetail } from '@/api/device-boot/dataVerify'
import { mainHeight } from '@/utils/layout'
const dictData = useDictData()
const StatisList = dictData.getBasicData('Steady_Statis')
const dialogVisible = ref(false)
const height1 = mainHeight(-110, 2)
const height = mainHeight(10, 2)
const tableRef = ref()
const title = ref('')
const loading = ref(false)
const loading1 = ref(false)
const TableData = ref([])
const TableData1 = ref([])
const pageNum = ref(1)
const pageSize = ref(20)
const numKey = ref(0)
const targetKey = ref('')
const clickRow = ref({})
const open = (data: anyObj, time: string[], num: number) => {
// title.value = (num == 0 ? data.targetName : data.monitorName) + '_告警详情展示'
loading.value = true
title.value = '告警监测点详情'
numKey.value = num
targetKey.value = data.key
TableData.value = []
monitorLimitTable({
monitorIds: num == 0 ? data.ids : [data.monitorId],
targetKey: num == 0 ? data.key : '',
searchBeginTime: time[0],
searchEndTime: time[1]
})
.then(res => {
TableData.value = res.data
tableRef.value.setCurrentRow(TableData.value[0])
currentChangeEvent()
loading.value = false
})
.catch(() => {
loading.value = false
})
dialogVisible.value = true
}
const currentChangeEvent = () => {
loading1.value = true
clickRow.value = tableRef.value.getCurrentRecord()
TableData1.value = []
monitorLimitTableDetail({
monitorIds: [clickRow.value.monitorId],
searchBeginTime: clickRow.value.date,
targetKey: numKey.value == 0 ? targetKey.value : ''
})
.then(res => {
TableData1.value = res.data
loading1.value = false
pageNum.value = 1
})
.catch(() => {
loading1.value = false
})
}
const formatter = (row: any) => {
if (row.column.field == 'time') {
return clickRow.value.date + ' ' + row.cellValue
} else if (row.column.field == 'type') {
return row.cellValue === 'null' ? '/' : row.cellValue
} else {
return row.cellValue == null ? '/' : (row.cellValue - 0).toFixed(2)
}
}
defineExpose({ open })
</script>
<style lang="scss" scoped>
.table-pagination {
height: 58px;
box-sizing: border-box;
width: 100%;
max-width: 100%;
background-color: var(--ba-bg-color-overlay);
padding: 13px 15px;
border-left: 1px solid #e4e7e9;
border-right: 1px solid #e4e7e9;
border-bottom: 1px solid #e4e7e9;
}
:deep(.box) {
.row--current {
background-color: var(--el-color-primary-light-8) !important;
}
}
</style>

View File

@@ -254,7 +254,7 @@ onMounted(() => {
const dom = document.getElementById('navigation-splitpanes')
setTimeout(() => {
if (dom) {
size.value = Math.round((180 / dom.offsetHeight) * 100)
size.value = Math.round((180 / dom.offsetHeight) * 120)
}
}, 100)
})

View File

@@ -2,7 +2,7 @@
<div>
<TableHeader date-picker area ref="TableHeaderRef">
<template v-slot:select>
<el-form-item label="对象类型">
<!-- <el-form-item label="对象类型">
<el-select
v-model="tableStore.table.params.objType"
clearable
@@ -16,7 +16,7 @@
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form-item> -->
<el-form-item label="终端厂家:">
<el-select v-model="tableStore.table.params.manufacturer" clearable placeholder="请选择终端厂家">
<el-option
@@ -60,8 +60,8 @@
{{
isNaN((monitoringPoints.abnormalNum / monitoringPoints.runNum) * 100)
? 0
: Math.floor((monitoringPoints.abnormalNum / monitoringPoints.runNum) * 10000) /
100
: Math.floor((monitoringPoints.abnormalNum / monitoringPoints.runNum) * 10000) /
100
}}%
</div>
</div>
@@ -99,13 +99,13 @@
</el-segmented>
</div>
<div class="header">
<span style="width: 170px; text-align: left">指标名称</span>
<span style="width: 165px; text-align: left">指标名称</span>
<span style="flex: 1">合理范围</span>
<span style="width: 90px">异常测点数</span>
<span style="width: 80px">异常测点数</span>
</div>
<div :style="indicatorHeight" style="overflow-y: auto">
<div v-for="o in abnormal.filter(item => item.remark == segmented)" class="abnormal mb10">
<span style="width: 170px; height: 24px" class="iconDiv">
<span style="width: 165px; height: 24px" class="iconDiv">
<div :style="{ backgroundColor: o.ids.length > 0 ? '#FF9100' : '' }"></div>
{{ o.targetName }}
</span>
@@ -113,7 +113,7 @@
<!-- 合理范围 -->
<span style="color: #388e3c" class="text">{{ o.rangeDesc }}</span>
</span>
<span style="width: 90px; text-align: center">
<span style="width: 80px; text-align: center">
<span
style="color: #388e3c"
:class="` ${o.ids.length > 0 ? 'text-red' : ''}`"
@@ -173,26 +173,26 @@
</span>
</template>
</vxe-column>
<vxe-column field="monitorName" title="监测点名称"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家"></vxe-column>
<vxe-column field="devName" title="所属终端名称"></vxe-column>
<vxe-column field="monitorName" title="监测点名称" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="devName" title="所属终端名称" minWidth="110px"></vxe-column>
<vxe-column field="ip" title="IP">
<template #default="{ row }">
{{ decryptFromBase64(row.ip) }}
</template>
</vxe-column>
<vxe-column field="stationName" title="所属电站"></vxe-column>
<vxe-column field="objType" title="监测对象类型" :formatter="formatter"></vxe-column>
<vxe-column field="objName" title="监测对象名称" :formatter="formatter"></vxe-column>
<vxe-column field="voltageLevel" title="电压等级"></vxe-column>
<vxe-column field="abnormalDay" title="异常天数">
<vxe-column field="stationName" title="所属电站" minWidth="110px"></vxe-column>
<vxe-column field="objType" title="监测对象类型" :formatter="formatter" minWidth="110px"></vxe-column>
<vxe-column field="objName" title="监测对象名称" :formatter="formatter" minWidth="110px"></vxe-column>
<vxe-column field="voltageLevel" title="电压等级" minWidth="80px"></vxe-column>
<vxe-column field="abnormalDay" title="异常天数" width="80px">
<template #default="{ row }">
<span class="table_name" @click="quantityClick(row, 1)">
{{ row.abnormalDay }}
</span>
</template>
</vxe-column>
<vxe-column field="abnormalDay" title="严重度">
<vxe-column field="abnormalDay" title="严重度" width="80px">
<template #default="{ row }">
<el-tag type="warning" v-if="row.severity == 0">预警</el-tag>
<el-tag type="danger" v-if="row.severity == 1">告警</el-tag>
@@ -518,7 +518,7 @@ tableStore.table.params.name = ''
provide('tableStore', tableStore)
</script>
<style lang="scss" scoped>
@import '@/assets/font/iconfont.css';
@import '@/assets/font/iconfont.css';
.card-list {
display: flex;
.monitoringPoints {

View File

@@ -1,6 +1,6 @@
<template>
<el-dialog draggable width="1550px" class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<div style="display: flex">
<div style="display: flex" v-loading="loading">
<div :style="height1" class="mr10 box" style="width: 600px">
<vxe-table
height="auto"
@@ -100,6 +100,7 @@ const height1 = mainHeight(-110, 2)
const height = mainHeight(10, 2)
const tableRef = ref()
const title = ref('')
const loading = ref(false)
const loading1 = ref(false)
const TableData = ref([])
const TableData1 = ref([])
@@ -110,6 +111,7 @@ const targetKey = ref('')
const showColumn = ref(true)
const open = (data: anyObj, time: string[], num: number) => {
// title.value = (num == 0 ? data.targetName : data.monitorName) + '_异常监测点详情'
loading.value = true
title.value = '异常监测点详情'
TableData.value = []
numKey.value = num
@@ -123,6 +125,9 @@ const open = (data: anyObj, time: string[], num: number) => {
TableData.value = res.data
tableRef.value.setCurrentRow(TableData.value[0])
currentChangeEvent()
loading.value = false
}).catch(() => {
loading.value = false
})
dialogVisible.value = true
}

View File

@@ -1,6 +1,6 @@
<template>
<div class="default-main">
<TableHeader date-picker ref="TableHeaderRef" >
<TableHeader date-picker ref="TableHeaderRef">
<template v-slot:select>
<el-form-item label="运行状态">
<el-select v-model="tableStore.table.params.lineRunFlag" clearable placeholder="请选择运行状态">
@@ -12,8 +12,8 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选">
<el-input v-model="tableStore.table.params.filterName" placeholder="输入关键字筛选" />
<el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入终端名称" />
</el-form-item>
</template>
@@ -86,22 +86,22 @@
</span>
<!-- -->
<span
style="flex: 1; color: #ff9100"
style="flex: 1; color: #388e3c"
class="text"
:class="` ${o.integrity < 90 ? 'text-red' : ''}`"
:class="` ${o.integrity < 90 ? 'text-red' : ''}`"
>
{{ o.integrity }}
</span>
<span
style="width: 80px; color: #388e3c"
:class="` ${o.online < 90 ? 'text-red' : ''}`"
:class="` ${o.online < 90 ? 'text-red' : ''}`"
class="text"
>
{{ o.online }}
</span>
<span
style="width: 80px; color: #388e3c"
:class="` ${o.qualified < 90 ? 'text-red' : ''}`"
:class="` ${o.qualified > 10 ? 'text-red' : ''}`"
class="text"
>
{{ o.qualified }}
@@ -138,12 +138,12 @@
</span>
</template>
</vxe-column>
<vxe-column field="cit" title="所在地市" width="110px"></vxe-column>
<vxe-column field="company" title="供电公司"></vxe-column>
<vxe-column field="subName" title="变电站"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家"></vxe-column>
<vxe-column field="name" title="终端名称"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="130px"></vxe-column>
<vxe-column field="cit" title="所在地市" minWidth="110px"></vxe-column>
<vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column field="subName" title="变电站" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="name" title="终端名称" minWidth="110px"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="130px" ></vxe-column>
<vxe-column field="runFlag" title="运行状态" width="100px">
<template #default="{ row }">
<el-tag
@@ -269,9 +269,13 @@ const tableStore = new TableStore({
statisticsList.value.checkNum = totalData.value.filter(item => item.runFlag === '调试').length
statisticsList.value.stopRunNum = totalData.value.filter(item => item.runFlag === '停运').length
abnormal.value = tableStore.table.data.filter(
(k: any) => k.name != '上送国网' && k.name != '非上送国网'
)
abnormal.value = tableStore.table.data.filter((k: any) => {
if (tableStore.table.params.statisticalType.name == '终端厂家') {
return k.count != 0
} else {
return k.name != '上送国网' && k.name != '非上送国网'
}
})
// 合并子集数据 并去重
totalTable(101, '')
@@ -406,7 +410,8 @@ const echart = () => {
}
}
tableStore.table.params.deptIndex = dictData.state.area[0].id
tableStore.table.params.lineRunFlag = ''
tableStore.table.params.lineRunFlag = 0
tableStore.table.params.searchValue = ''
const formatter = (row: any) => {
return row.cellValue || '/'
@@ -425,7 +430,7 @@ const totalTable = (num: number, t: string) => {
}
const change = (e: string) => {
title.value = e==''?'' : e+'_'
title.value = e == '' ? '' : e + '_'
loading.value = true
pageNum.value = 1
dataList.value = []