添加周期

This commit is contained in:
2026-07-07 10:18:22 +08:00
parent 5044c88946
commit 1a44a2f9e0
19 changed files with 556 additions and 87 deletions

View File

@@ -67,13 +67,13 @@ const tableStore = new TableStore({
column: [
{ field: 'index', title: '序号', width: '80', formatter: (row: any) => { return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1 } },
{ field: 'provinceCompany', title: '地级', minWidth: "150px", },
{ field: 'cityCompany', title: '供电公司', minWidth: "150px", },
{ field: 'provinceCompany', title: '地级', minWidth: "150px", },
/* { field: 'cityCompany', title: '供电公司', minWidth: "150px", },*/
{ field: 'subName', title: '变电站', minWidth: "150px", },
{ field: 'lineScale', title: '电压等级', minWidth: "120px", },
{ field: 'lineName', title: '监测点名称', minWidth: "150px", },
{ field: 'loadType', title: '干扰源类型', minWidth: "150px", },
{ field: 'lineObjectName', title: '监测点对象名称', minWidth: "180px", formatter: (row: any) => { return row.cellValue == null ? '/' : row.cellValue } },
{ field: 'lineName', title: '监测点名称', minWidth: "150px", },
{ field: 'lineScale', title: '电压等级', minWidth: "120px", },
{ field: 'loadType', title: '干扰源类型', minWidth: "150px", },
{ field: 'overDay', title: '超标天数', minWidth: "80px", },
{ field: 'freqOverDay', title: '频率偏差', minWidth: "100px", },
{ field: 'volDevOverDay', title: '电压偏差', minWidth: "100px", },

View File

@@ -159,18 +159,19 @@
</template>
</vxe-column>
<vxe-column field="cit" title="所在地市" minWidth="110px"></vxe-column>
<vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column v-if="!IS_LN" field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="deviceName" title="终端名称" minWidth="130px"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column>
<vxe-column v-if="VITE_FLAG" field="objName" title="监测对象" minWidth="130px"></vxe-column>
<vxe-column
field="lineName"
title="监测点名称"
:formatter="formatter"
minWidth="130px"
></vxe-column>
<vxe-column v-if="VITE_FLAG" field="objName" title="监测对象" minWidth="130px"></vxe-column>
<vxe-column field="runFlag" title="运行状态" width="90px">
<template #default="{ row }">
<el-tag
@@ -211,14 +212,14 @@
<script setup lang="ts">
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { onMounted, provide, ref, watch } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { getMonitorVerifyDay } from '@/api/device-boot/dataVerify'
const IS_LN = import.meta.env.VITE_NAME == 'LN' || import.meta.env.VITE_NAME == 'LNqr'
defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData'
})

View File

@@ -157,12 +157,12 @@
</template>
</vxe-column>
<vxe-column field="cit" title="所在地市" width="110px"></vxe-column>
<vxe-column field="company" title="供电公司" minWidth="110px"></vxe-column>
<vxe-column field="subStation" title="变电站" minWidth="110px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="110px"></vxe-column>
<vxe-column field="deviceName" title="终端名称" minWidth="130px"></vxe-column>
<vxe-column v-if="!IS_LN" field="company" title="供电公司" minWidth="100px"></vxe-column>
<vxe-column field="subStation" title="变电站" minWidth="100px"></vxe-column>
<vxe-column field="manufacturer" title="终端厂家" minWidth="90px"></vxe-column>
<vxe-column field="deviceName" title="终端名称" minWidth="100px"></vxe-column>
<vxe-column field="ip" title="终端IP" :formatter="formatter" width="120px"></vxe-column>
<vxe-column field="timeID" title="最新数据时间" :formatter="formatter" width="160px"></vxe-column>
<vxe-column field="runFlag" title="运行状态" width="90px">
<template #default="{ row }">
<el-tag
@@ -182,6 +182,19 @@
</el-tag>
</template>
</vxe-column>
<vxe-column field="comFlag" title="通讯状态" width="90px">
<template #default="{ row }">
<el-tag
:type="
row.comFlag == '正常'
? 'success'
: 'danger'
"
>
{{ row.comFlag }}
</el-tag>
</template>
</vxe-column>
<vxe-column field="onlineRate" title="在线率(%)" width="90px"></vxe-column>
</vxe-table>
</div>
@@ -201,16 +214,14 @@
</template>
<script setup lang="ts">
// import '@/assets/font/iconfont.css'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { onMounted, provide, ref } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { getMonitorVerifyDay } from '@/api/device-boot/dataVerify'
const IS_LN = import.meta.env.VITE_NAME == 'LN' || import.meta.env.VITE_NAME == 'LNqr'
defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData'
})

View File

@@ -38,7 +38,7 @@
<el-tab-pane label="告警数据统计" name="5" lazy v-if="!isReload && VITE_FLAG">
<Gaojingshujutongji v-if="activeName == '5'" />
</el-tab-pane>
<el-tab-pane label="监测点运行状态" name="6" lazy v-if="!isReload">
<el-tab-pane label="监测点运行状态" name="6" lazy v-if="!isReload && !VITE_FLAG1 && !IS_LNQR">
<Yunxingzhuangtai v-if="activeName == '6'" />
</el-tab-pane>
<el-tab-pane label="实时数据" name="7" lazy v-if="!isReload && !VITE_FLAG1 && !IS_LNQR">

View File

@@ -14,8 +14,8 @@
<template v-slot:select>
<el-form-item >
<el-radio-group v-model="isStatisticData" @change="onStatisticDataChange">
<el-radio-button value="1">统计数据</el-radio-button>
<el-radio-button value="0">分钟数据</el-radio-button>
<el-radio-button value="0">统计数据</el-radio-button>
<el-radio-button value="1">分钟数据</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="模板策略">
@@ -79,7 +79,7 @@ const dotList: any = ref({})
const Template: any = ref({})
const reportForm: any = ref('')
const name = ref('')
const isStatisticData = ref('1')
const isStatisticData = ref('0')
const templatePolicy: any = ref([])
const reportFormList: any = ref([
{
@@ -103,8 +103,8 @@ const tableStore = new TableStore({
tableStore.table.params.tempId = Template.value.id
tableStore.table.params.lineId = dotList.value.id
name.value = dotList.value.name
if (Number(isStatisticData.value) === 0) {
tableStore.table.params.isStatisticData = 0
if (Number(isStatisticData.value) === 1) {
tableStore.table.params.isStatisticData = 1
} else {
delete tableStore.table.params.isStatisticData
}
@@ -163,7 +163,7 @@ const changetype = (val: any) => {
const onStatisticDataChange = () => {
TableHeaderRef.value?.setTheDate(3)
if (dotList.value?.id) {
// tableStore.index()
}
}
const selectChange = () => {

View File

@@ -4,45 +4,46 @@
<template #select>
<el-form-item label="运行状态">
<el-select filterable multiple collapse-tags v-model="tableStore.table.params.runFlag" clearable
placeholder="请选择运行状态">
placeholder="请选择运行状态">
<el-option v-for="item in runFlagList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="通讯状态">
<el-select v-model="tableStore.table.params.comFlag" filterable multiple collapse-tags clearable
placeholder="请选择通讯状态">
placeholder="请选择通讯状态">
<el-option v-for="item in communicationstatus" :key="item.value" :label="item.label"
:value="item.value"></el-option>
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="电压等级">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
placeholder="请选择电压等级" value-key="id">
placeholder="请选择电压等级" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name"
:value="item"></el-option>
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags
clearable placeholder="请选择终端厂家" value-key="id">
clearable placeholder="请选择终端厂家" value-key="id">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name"
:value="item"></el-option>
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id">
placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name"
:value="item"></el-option>
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据筛选">
<el-input style="width: 240px" placeholder="电站名称,终端编号,监测点名称、电压等级、终端厂家、干扰源类型"
v-model="tableStore.table.params.searchValue" clearable maxlength="32"
show-word-limit></el-input>
<el-input style="width: 240px"
placeholder="电站名称,终端编号,监测点名称、电压等级、终端厂家、干扰源类型"
v-model="tableStore.table.params.searchValue" clearable maxlength="32"
show-word-limit></el-input>
</el-form-item>
</template>
@@ -51,6 +52,9 @@
</template>
</TableHeader>
<Table ref="tableRef" />
<!-- 限值查看弹框 -->
<LimitDialog ref="limitDialogRef" />
</div>
</template>
<script setup lang="ts">
@@ -58,14 +62,16 @@ import { ref, onMounted, provide, nextTick, watch } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import LimitDialog from './monitorLimit.vue'
import { useDictData } from '@/stores/dictData'
const dictData = useDictData()
const TableHeaderRef = ref()
const areaOptionList = dictData.getBasicData('jibei_area')
const IS_LN = import.meta.env.VITE_NAME == 'LN' || import.meta.env.VITE_NAME == 'LNqr'
const interfereoption = dictData.getBasicData('Interference_Source')
const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const limitDialogRef = ref()
const tableStore = new TableStore({
url: '/device-boot/runManage/getLineLedgerComm',
method: 'POST',
@@ -79,13 +85,22 @@ const tableStore = new TableStore({
}
},
{
field: 'areaName',
title: '省公司',
minWidth: 100
},
{
visible: !IS_LN,
field: 'areaName',
title: '省公司',
minWidth: 100
},
{ field: 'gdName', title: '市公司', minWidth: 150 },
{ visible: IS_LN,
field: 'gdName', title: '市公司', minWidth: 150, formatter: (row: any) => {
if (IS_LN) {
return row.cellValue.replace('国网', '').replace('供电公司', '')
} else {
return row.cellValue
}
}
},
{
field: 'bdName',
title: '所属变电站',
@@ -100,7 +115,7 @@ const tableStore = new TableStore({
}
},
{ field: 'lineName', title: '监测点名称', minWidth: 130 },
{ field: 'scale', title: '监测点电压等级', minWidth: 120 },
{ field: 'scale', title: '监测点电压等级', minWidth: 80 },
{ field: 'loadType', title: '干扰源类型', minWidth: 120 },
@@ -139,52 +154,53 @@ const tableStore = new TableStore({
{
field: 'shortCapacity',
title: '最小短路容量(MVA)',
minWidth: 150
minWidth: 100
},
{
field: 'devCapacity',
title: '供电设备容量(MVA )',
minWidth: 160
minWidth: 100
},
{
field: 'dealCapacity',
title: '用户协议容量(MVA)',
minWidth: 150
minWidth: 100
},
{ field: 'id', title: '监测点序号', minWidth: 90 },
{ field: 'id', title: '监测点序号', minWidth: 70 },
{ field: 'devName', title: '监测终端编号 ', minWidth: 140 },
{ field: 'ptType', title: '监测终端接线方式', minWidth: 140 },
{
field: 'voltageDev',
title: '电压偏差上限(%)',
minWidth: 140
minWidth: 80
},
{
field: 'uvoltageDev',
title: '电压偏差下限(%)',
minWidth: 140
}
minWidth: 80
},
/* {
title: '操作',fixed: 'right',
minWidth: 150,
{
title: '操作',
minWidth: 80,
fixed: 'right',
render: 'buttons',
buttons: [
{
name: 'productSetting',
title: '流程详情',
title: '查看限值',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
// 打开限值查看弹框
limitDialogRef.value?.open(row)
}
}
]
}*/
}
],
beforeSearchFun: () => {
@@ -209,7 +225,7 @@ tableStore.table.params.loadType = []
const runFlagList = [
{ id: 0, name: '投运' },
{ id: 1, name: '检修' },
{ id: 2, name: '停运' },
{ id: 2, name: '停运' }
]
@@ -224,5 +240,4 @@ onMounted(() => {
})
</script>

View File

@@ -0,0 +1,163 @@
<template>
<el-dialog
v-model="dialogVisible"
title="限值查看"
width="800px"
:close-on-click-modal="false"
destroy-on-close
>
<!-- 基本信息 -->
<div class="basic-info" style="margin-bottom: 20px; padding: 16px; background: #f5f7fa; border-radius: 4px;">
<el-row :gutter="20">
<el-col :span="8">
<div><strong>监测点名称</strong>{{ currentRow?.lineName || '-' }}</div>
</el-col>
<el-col :span="8">
<div><strong>监测对象名称</strong>{{ currentRow?.objName || '-' }}</div>
</el-col>
<el-col :span="8">
<div><strong>所属变电站</strong>{{ currentRow?.bdName || '-' }}</div>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 10px;">
<el-col :span="8">
<div><strong>电压等级</strong>{{ currentRow?.scale || '-' }}</div>
</el-col>
<el-col :span="8">
<div><strong>干扰源类型</strong>{{ currentRow?.loadType || '-' }}</div>
</el-col>
<el-col :span="8">
<div><strong>终端厂家</strong>{{ currentRow?.manufacturer || '-' }}</div>
</el-col>
</el-row>
</div>
<el-tabs v-model="activeTab">
<el-tab-pane label="电能质量限值" name="powerQuality">
<el-table :data="limitData" border style="width: 100%" max-height="400">
<el-table-column prop="name" label="参数名称" width="300" fixed />
<el-table-column prop="value" label="限值" width="300">
<template #default="{ row }">
<span>{{ row.value !== null && row.value !== undefined ? row.value + '%' : '-' }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="谐波电压限值" name="harmonicVoltage">
<el-table :data="harmonicVoltageData" border style="width: 100%" max-height="400">
<el-table-column prop="harmonic" label="谐波次数" width="300" />
<el-table-column prop="limit" label="限值(%)" width="300">
<template #default="{ row }">
<span>{{ row.limit || '-' }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="谐波电流限值" name="harmonicCurrent">
<el-table :data="harmonicCurrentData" border style="width: 100%" max-height="400">
<el-table-column prop="harmonic" label="谐波次数" width="300" />
<el-table-column prop="limit" label="限值(%)" width="300">
<template #default="{ row }">
<span>{{ row.limit || '-' }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const dialogVisible = ref(false)
const activeTab = ref('powerQuality')
const currentRow = ref<any>(null)
// 电能质量限值数据
const limitData = ref([
{ name: '频率偏差', value: 0.2 },
{ name: '电压偏差上限', value: null },
{ name: '电压偏差下限', value: null },
{ name: '电压不平衡度', value: 2 },
{ name: '闪变', value: 1 },
{ name: '电压波变', value: 3 },
{ name: '间谐波电压', value: 0.16 },
{ name: '负序电流', value: null },
])
// 谐波电压数据2-25次
const harmonicVoltageData = ref(
Array.from({ length: 24 }, (_, i) => {
const harmonicNumber = i + 2
let limit = 0
if (harmonicNumber <= 3) limit = 2.4
else if (harmonicNumber <= 5) limit = 1.2
else if (harmonicNumber <= 7) limit = 0.8
else if (harmonicNumber <= 9) limit = 0.6
else if (harmonicNumber <= 11) limit = 0.5
else if (harmonicNumber <= 13) limit = 0.4
else if (harmonicNumber <= 15) limit = 0.3
else if (harmonicNumber <= 17) limit = 0.2
else if (harmonicNumber <= 19) limit = 0.18
else limit = 0.15
return {
harmonic: `${harmonicNumber}`,
limit: limit
}
})
)
// 谐波电流数据2-25次
const harmonicCurrentData = ref(
Array.from({ length: 24 }, (_, i) => {
const harmonicNumber = i + 2
const limits = {
2: 16, 3: 13, 4: 8.1, 5: 13, 6: 5.4, 7: 9.3, 8: 4.1, 9: 4.3,
10: 3.3, 11: 5.9, 12: 2.7, 13: 5, 14: 2.3, 15: 2.6, 16: 2, 17: 3.8,
18: 1.8, 19: 3.4, 20: 1.6, 21: 1.9, 22: 1.5, 23: 2.8, 24: 1.4, 25: 2.6
}
return {
harmonic: `${harmonicNumber}`,
limit: limits[harmonicNumber as keyof typeof limits] || 0
}
})
)
// 打开弹框
const open = (row: any) => {
currentRow.value = row
// 更新电能质量限值数据
limitData.value.forEach(item => {
if (item.name === '电压偏差上限') {
item.value = row.voltageDev !== undefined ? row.voltageDev : null
} else if (item.name === '电压偏差下限') {
item.value = row.uvoltageDev !== undefined ? row.uvoltageDev : null
} else if (item.name === '负序电流') {
item.value = row.ineg !== undefined ? row.ineg : null
}
})
dialogVisible.value = true
}
defineExpose({
open
})
</script>
<style scoped lang="scss">
.dialog-footer {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -128,6 +128,7 @@ const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Ty
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const interfereoption = dictData.getBasicData('Interference_Source')
const IS_LN = import.meta.env.VITE_NAME == 'LN' || import.meta.env.VITE_NAME == 'LNqr'
const communicationstatus = [
{ value: 0, label: '中断' },
@@ -150,8 +151,21 @@ const tableStore = new TableStore({
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ field: 'areaName', title: '区域', minWidth: 90 },
{ field: 'gdName', title: '市公司', minWidth: 110 },
{
visible: !IS_LN,
field: 'areaName',
title: '省公司',
minWidth: 100
},
{ visible: IS_LN,
field: 'gdName', title: '市公司', minWidth: 120, formatter: (row: any) => {
if (IS_LN) {
return row.cellValue.replace('国网', '').replace('供电公司', '')
} else {
return row.cellValue
}
}
},
{
field: 'bdName',
title: '变电站',