电压暂降表及密度

This commit is contained in:
仲么了
2024-02-26 14:36:47 +08:00
parent 016442ff7f
commit 2bd18e0934
8 changed files with 1160 additions and 16 deletions

View File

@@ -7,4 +7,58 @@ export function getPlot(data: any) {
method: 'post',
data
})
}
//电压暂降表及密度 DISDIP 获取数据
export function IEC411(data) {
return request({
url: '/event-boot/monitor/IEC411',
method: 'post',
data
})
}
//电压暂降表及密度 IEC61000 获取数据
export function IEC28(data: any) {
return request({
url: '/event-boot/monitor/IEC28',
method: 'post',
data
})
}
//电压暂降表及密度 IEC61000 获取数据
export function eventDisdip(data: any) {
return request({
url: '/event-boot/monitor/eventDisdip',
method: 'post',
data
})
}
//电压暂降表及密度 暂降密度图 获取数据
export function getCoords(data: any) {
return request({
url: '/event-boot/monitor/getCoords',
method: 'post',
data
})
}
// 暂降分布统计 左 获取数据
export function getReasonTypeTime(data: any) {
return request({
url: '/event-boot/monitor/getReasonTypeTime',
method: 'post',
data
})
}
// 暂降分布统计 右 获取数据
export function getStatistic(data: any) {
return request({
url: '/event-boot/monitor/getStatistic',
method: 'post',
data
})
}

View File

@@ -1 +1,2 @@
dialog 弹框标准模版
表格模版参照 /views/userList/index.vue

View File

@@ -1,5 +1,5 @@
<template>
<div style='display: flex;flex-direction: column;height: 100%'>
<div style='display: flex;flex-direction: column;height: 100%' v-loading='loading'>
<el-form :inline='true'>
<el-form-item label='时间间隔'>
<DatePicker ref='datePickerRef'></DatePicker>
@@ -25,13 +25,14 @@
</div>
</template>
<script setup lang='ts'>
import { onMounted, reactive, ref } from 'vue'
import { nextTick, onMounted, reactive, ref } from 'vue'
import DatePicker from '@/components/form/datePicker/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { useMonitoringPoint } from '@/views/pms/voltageSags/monitoringPoint/online/store'
import { getPlot } from '@/api/event-boot/monitor'
const datePickerRef = ref()
const loading = ref(true)
const monitoringPoint = useMonitoringPoint()
const formData = reactive({
lineIndex: monitoringPoint.state.lineId,
@@ -47,6 +48,7 @@ const data = reactive({
const options = ref({})
const init = () => {
loading.value = true
formData.startTime = datePickerRef.value.timeValue[0]
formData.endTime = datePickerRef.value.timeValue[1]
getPlot(formData).then(
@@ -59,7 +61,8 @@ const init = () => {
options.value = {
// backgroundColor: "#f9f9f9", //地图背景色深蓝
title: {
text: `ITIC曲线(总统计:${gongData.pointI.length + gongData.pointIun.length}个,可容忍:${gongData.pointI.length}个,不可容忍:${gongData.pointIun.length}个)`
// text: `ITIC曲线(总统计:${gongData.pointI.length + gongData.pointIun.length}个,可容忍:${gongData.pointI.length}个,不可容忍:${gongData.pointIun.length}个)`
text: `ITIC曲线`
},
legend: {
data: ['上限', '下限', '可容忍事件', '不可容忍事件'],
@@ -83,7 +86,7 @@ const init = () => {
},
backgroundColor: 'rgba(0,0,0,0.35)',
borderWidth: 0,
formatter: function(a:any) {
formatter: function(a: any) {
var relVal = ''
relVal =
'<font style=\'color:' +
@@ -119,11 +122,11 @@ const init = () => {
type: 'value',
splitNumber: 10,
minInterval: 3,
name: '%',
name: '%'
}
],
options: {
dataZoom:null,
dataZoom: null,
series: [
{
name: '上限',
@@ -174,6 +177,9 @@ const init = () => {
]
}
}
nextTick(() => {
loading.value = false
})
}
)
}

View File

@@ -1,10 +1,337 @@
<template>
<div class='default-main'>
<div style='display: flex;flex-direction: column;height: 100%'>
<el-form :inline='true'>
<el-form-item label='时间间隔'>
<DatePicker ref='datePickerRef'></DatePicker>
</el-form-item>
<el-form-item>
<el-button type='primary' @click='init'>查询</el-button>
</el-form-item>
</el-form>
<el-descriptions
class='mt2'
direction='vertical'
:column='4'
border
>
<el-descriptions-item align='center' label='名称'>{{ data.name }}</el-descriptions-item>
<el-descriptions-item align='center' label='事件总数'>{{ data.gs }}</el-descriptions-item>
<el-descriptions-item align='center' label='可容忍'>{{ data.krr }}</el-descriptions-item>
<el-descriptions-item align='center' label='不可容忍'> {{ data.bkrr }}</el-descriptions-item>
</el-descriptions>
<div style='flex: 1;' class='mt10'>
<my-echart :options='options' />
</div>
</div>
</template>
<script setup lang='ts'>
import { ref } from 'vue'
import { nextTick, onMounted, reactive, ref } from 'vue'
import DatePicker from '@/components/form/datePicker/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { useMonitoringPoint } from '@/views/pms/voltageSags/monitoringPoint/online/store'
import { getPlot } from '@/api/event-boot/monitor'
const datePickerRef = ref()
const monitoringPoint = useMonitoringPoint()
const loading = ref(true)
const formData = reactive({
lineIndex: monitoringPoint.state.lineId,
startTime: '',
endTime: ''
})
const data = reactive({
name: '事件个数',
gs: 0,
krr: 0,
bkrr: 0
})
const options = ref({})
const init = () => {
loading.value = true
formData.startTime = datePickerRef.value.timeValue[0]
formData.endTime = datePickerRef.value.timeValue[1]
getPlot(formData).then(
(res: any) => {
const gongData = gongfunction(res.data.voltageToleranceCurveDataList)
data.gs = res.data.voltageToleranceCurveDataList.length
data.krr = gongData.pointI.length
data.bkrr = gongData.pointIun.length
console.log(gongData)
options.value = {
// backgroundColor: "#f9f9f9", //地图背景色深蓝
title: {
text: `SEMI F47曲线`
},
legend: {
data: ['上限', '下限', '可容忍事件', '不可容忍事件'],
x: 'left'
},
tooltip: {
trigger: 'item',
show: true,
axisPointer: {
type: 'shadow',
label: {
color: '#fff',
fontSize: 16
}
},
textStyle: {
color: '#fff',
fontStyle: 'normal',
opacity: 0.35,
fontSize: 14
},
backgroundColor: 'rgba(0,0,0,0.35)',
borderWidth: 0,
formatter: function(a: any) {
var relVal = ''
relVal =
'<font style=\'color:' +
'\'>发生时间:' +
a.value[2] +
'</font><br/>'
relVal +=
'<font style=\'color:' +
'\'>持续时间:' +
a.value[0] +
's</font><br/>'
relVal +=
'<font style=\'color:' +
'\'>特征幅值:' +
a.value[1].toFixed(2) +
'%</font>'
return relVal
}
},
xAxis: [
{
type: 'log',
min: 0.001,
max: 1000,
splitLine: {
show: false
},
name: 's'
}
],
yAxis: [
{
type: 'value',
max: function(value: any) {
return value.max + 20
},
splitNumber: 10,
minInterval: 0.1,
name: '%'
}
],
options: {
dataZoom: null,
series: [
{
name: '边界线',
type: 'line',
data: [
[0.05, 0],
[0.05, 50],
[0.2, 50],
[0.2, 70],
[0.5, 70],
[0.5, 80],
[10, 80],
[1000, 80]
],
showSymbol: false,
tooltips: {
show: false
}
},
{
name: '可容忍事件',
type: 'scatter',
symbol: 'circle',
data: gongData.pointI
},
{
name: '不可容忍事件',
type: 'scatter',
symbol: 'circle',
data: gongData.pointIun
}
]
}
}
nextTick(() => {
loading.value = false
})
}
)
}
function gongfunction(arr: any) {
let standI = 0
let unstandI = 0
let standF = 0
let unstandF = 0
let total = 0
let pointIun = []
let pointI = []
let pointF = []
let pointFun = []
total = arr.length
if (total == 0) {
} else {
for (let i = 0; i < arr.length; i++) {
let point = []
let xx = arr[i].persistTime
let yy = arr[i].eventValue
let time = arr[i].time
let eventId = arr[i].eventId
// let index =arr[i].eventDetailIndex;
point = [xx, yy, time, eventId]
if (xx <= 0.003) {
let line = 0
line = 250 - 30000 * xx
if (yy > line) {
unstandI++
pointIun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
} else {
standI++
pointI.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
}
} else if (xx <= 0.02) {
if (yy > 120) {
unstandI++
pointIun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
} else {
standI++
pointI.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
}
} else if (xx <= 0.5) {
if (yy > 120 || yy < 70) {
unstandI++
pointIun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
} else {
standI++
pointI.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
}
} else if (xx <= 10) {
if (yy > 110 || yy < 80) {
unstandI++
pointIun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
} else {
standI++
pointI.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
}
} else {
if (yy > 110 || yy < 90) {
unstandI++
pointIun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
} else {
standI++
pointI.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
}
}
if (xx < 0.05) {
standF++
pointF.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
} else if (xx < 0.2) {
if (yy > 50) {
standF++
pointF.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
} else {
unstandF++
pointFun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
}
} else if (xx < 0.5) {
if (yy > 70) {
standF++
pointF.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
} else {
unstandF++
pointFun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
}
} else {
if (yy > 80) {
standF++
pointF.push({
value: point,
itemStyle: { normal: { color: 'green' } }
})
} else {
unstandF++
pointFun.push({
value: point,
itemStyle: { normal: { color: 'red' } }
})
}
}
}
}
return {
standI,
unstandI,
pointI,
pointIun,
standF,
unstandF,
pointF,
pointFun
}
}
onMounted(() => {
init()
})
</script>
<style></style>

View File

@@ -1,10 +1,242 @@
<template>
<div class='default-main'>
<div style='display: flex;flex-direction: column;height: 100%' v-loading='loading'>
<el-form :inline='true'>
<el-form-item label='时间间隔'>
<DatePicker ref='datePickerRef'></DatePicker>
</el-form-item>
<el-form-item>
<el-button type='primary' @click='init'>查询</el-button>
</el-form-item>
</el-form>
<div style='flex: 1;' class='mt10 dianyazanjiang'>
<div class='first'>
<div class='mb10'>DISDIP表格(国际发配电联盟UNIPEDE)</div>
<div style='flex: 1'>
<vxe-table
v-bind='defaultAttribute'
style='height: 100%'
size='mini'
:data='firstData'>
<vxe-colgroup title='剩余电压' field='name'></vxe-colgroup>
<vxe-colgroup title='持续事件'>
<vxe-column field='twentyMs' title='20ms'></vxe-column>
<vxe-column field='oneHundredMs' title='100ms'></vxe-column>
<vxe-column field='fiveHundredMs' title='500ms'></vxe-column>
<vxe-column field='oneS' title='1s'></vxe-column>
<vxe-column field='threeS' title='2s'></vxe-column>
<vxe-column field='twentyS' title='20s'></vxe-column>
<vxe-column field='sixtyS' title='60s'></vxe-column>
<vxe-column field='oneEightyS' title='180s'></vxe-column>
</vxe-colgroup>
</vxe-table>
</div>
</div>
<div class='second'>
<div class='mb10'>EC61000-4-11(用电终端的电压暂降抗度)</div>
<div style='flex: 1'>
<vxe-table
v-bind='defaultAttribute'
style='height: 100%'
size='mini'
:data='secondData'>
<vxe-colgroup title='剩余电压' field='name'></vxe-colgroup>
<vxe-colgroup title='持续事件'>
<vxe-column field='tenTwentyMs' title='10-20ms'></vxe-column>
<vxe-column field='twentyOneHundredMs' title='20-100ms'></vxe-column>
<vxe-column field='zeroPiontOneTwoS' title='0.1-0.2s'></vxe-column>
<vxe-column field='zeroPiontFive1S' title='0.2-0.5s'></vxe-column>
<vxe-column field='zeroPiontTwoFiveS' title='0.5-1s'></vxe-column>
<vxe-column field='role' title='>1s'></vxe-column>
</vxe-colgroup>
</vxe-table>
</div>
</div>
<div class='third'>
<div class='mb10'>IEC61000-2-8(公共用电暂降测量统计)</div>
<div style='flex: 1'>
<vxe-table
v-bind='defaultAttribute'
style='height: 100%'
size='mini'
:data='thirdData'>
<vxe-colgroup title='剩余电压' field='name'></vxe-colgroup>
<vxe-colgroup title='持续事件'>
<vxe-column field='q' title='0.01-0.1s' align='center'></vxe-column>
<vxe-column field='w' title='0.1-0.25s' align='center'></vxe-column>
<vxe-column field='e' title='0.25-0.5s' align='center'></vxe-column>
<vxe-column field='r' title='0.5-1s' align='center'></vxe-column>
<vxe-column field='t' title='1-3s' align='center'></vxe-column>
<vxe-column field='y' title='3-20s' align='center'></vxe-column>
<vxe-column field='u' title='20-60s' align='center'></vxe-column>
<vxe-column field='i' title='60-180s' align='center'></vxe-column>
</vxe-colgroup>
</vxe-table>
</div>
</div>
<div class='charts'>
<MyEchart :options='options' />
</div>
</div>
</div>
</template>
<script setup lang='ts'>
import { ref } from 'vue'
import { nextTick, onMounted, reactive, ref } from 'vue'
import DatePicker from '@/components/form/datePicker/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { useMonitoringPoint } from '@/views/pms/voltageSags/monitoringPoint/online/store'
import { eventDisdip, getCoords, IEC28, IEC411 } from '@/api/event-boot/monitor'
import { defaultAttribute } from '@/components/table/defaultAttribute'
const datePickerRef = ref()
const loading = ref(true)
const monitoringPoint = useMonitoringPoint()
const formData = reactive({
lineIndex: monitoringPoint.state.lineId,
startTime: '',
endTime: ''
})
const options = ref({})
const firstData = ref([])
const secondData = ref([])
const thirdData = ref([])
const chartsData = ref([])
const init = () => {
formData.startTime = datePickerRef.value.timeValue[0]
formData.endTime = datePickerRef.value.timeValue[1]
loading.value = true
Promise.all([
eventDisdip(formData),
IEC411(formData),
IEC28(formData),
getCoords(formData)
]).then(res => {
firstData.value = res[0].data
secondData.value = res[1].data
thirdData.value = res[2].data
chartsData.value = res[3].data
options.value = {
backgroundColor: '#fff',
tooltip: {
trigger: 'axis'
},
title: {
text: '暂降密度图',
x: 'center'
},
visualMap: {
max: 20,
show: false,
inRange: {
color: ['#313695', '#00BB00', '#ff8000', '#a50026']
}
},
xAxis3D: {
type: 'category',
name: '剩余电压(%)',
data: ['0-10', '10-20', '20-30', '30-40', '40-50', '50-60', '60-70', '70-80', '80-90', '90-100']
},
yAxis3D: {
type: 'category',
name: '持续时间(cyc)',
data: ['1cyc', '2cyc', '3cyc', '4cyc', '5cyc', '6~10cyc', '10~20cyc', '20~30cyc', '30~60cyc']
},
zAxis3D: {
type: 'value',
splitNumber: 10,
minInterval: 10,
name: '次数'
},
grid3D: {
boxWidth: 200,
boxDepth: 80,
light: {
main: {
intensity: 1.2
},
ambient: {
intensity: 0.3
}
}
},
series: [
{
type: 'bar3D',
data: chartsData.value.map(function(item: any) {
return {
value: [item[0], item[1], item[2]]
}
}),
shading: 'realistic',
label: {
show: false,
textStyle: {
fontSize: 16,
borderWidth: 1
}
},
itemStyle: {
opacity: 1
},
emphasis: {
label: {
textStyle: {
fontSize: 20,
color: '#900'
}
},
itemStyle: {
color: '#900'
}
}
}
]
}
loading.value = false
})
}
onMounted(() => {
init()
})
</script>
<style></style>
<style lang='scss'>
.dianyazanjiang {
display: grid;
grid-template-areas:
"first charts"
"second charts"
"third third "
"third third ";
grid-template-rows: 1fr 1fr 1fr 1fr;
grid-template-columns: 1fr 1fr;
grid-gap: 10px;
.first {
grid-area: first;
display: flex;
flex-direction: column;
overflow: hidden;
}
.second {
grid-area: second;
display: flex;
flex-direction: column;
overflow: hidden;
}
.third {
grid-area: third;
display: flex;
flex-direction: column;
overflow: hidden;
}
.charts {
grid-area: charts;
}
}
</style>

View File

@@ -4,7 +4,7 @@
<ITICquxianfenxi />
</el-tab-pane>
<el-tab-pane label='SEMI F47 分析' name='2' >
<SEMIF47fenxi />
<SEMIF47fenxi v-if='activeName === "2"' />
</el-tab-pane>
<el-tab-pane label='电压暂降表及密度' name='3' >
<Dianyazanjiangbiaojimidu />