联调 有功功率趋势分析

This commit is contained in:
GGJ
2024-08-29 15:58:30 +08:00
parent 1fa628044f
commit 3ac62fc98c
4 changed files with 251 additions and 149 deletions

View File

@@ -24,3 +24,21 @@ export function getTargetByTime(data: any) {
data: data
})
}
// 导出报告参数
export function exportExcelListTemplate(data: any) {
return request({
url: '/harmonic-boot/powerStatistics/exportExcelListTemplate',
method: 'POST',
data: data,
responseType: 'blob'
})
}
// 导出区间数据
export function exportExcelRangTemplate(data: any) {
return request({
url: '/harmonic-boot/powerStatistics/exportExcelRangTemplate',
method: 'POST',
data: data,
responseType: 'blob'
})
}

View File

@@ -107,7 +107,9 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
response.data.type === 'application/json' ||
Array.isArray(response.data) ||
response.data.size ||
response.config.url == '/harmonic-boot/exportmodel/exportModelJB'
response.config.url == '/harmonic-boot/exportmodel/exportModelJB' ||
response.config.url == '/harmonic-boot/powerStatistics/exportExcelListTemplate' ||
response.config.url == '/harmonic-boot/powerStatistics/exportExcelRangTemplate'
// ||
// response.data.type === 'application/octet-stream' ||
// response.data.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

View File

@@ -45,8 +45,9 @@ const popupEditRef = ref()
const tableStore = new TableStore({
url: '/harmonic-boot/powerStatistics/getTargetByTime',
method: 'POST',
showPage: false,
column: [
{ title: '指标', field: 'name' },
{ title: '指标', field: 'anotherName' },
{
title: '最小值',
field: 'code',
@@ -86,23 +87,12 @@ const tableStore = new TableStore({
],
beforeSearchFun: () => {
tableStore.table.params.field = props.timePopUpBox.field
tableStore.table.params.lineId = props.timePopUpBox.lineId
tableStore.table.params.lineId = '6469e77fda42db12c7ca6620a092f03c' //props.timePopUpBox.lineId
tableStore.table.params.searchBeginTime = props.timePopUpBox.time
tableStore.table.params.searchEndTime = props.timePopUpBox.time
tableStore.table.params.statisticalId = radio2.value
},
loadCallback: () => {
tableStore.table.data = [
{ name: '电压偏差(%)', num: 0.0 },
{ name: '谐波电压(%)', num: 0.0 },
{ name: '谐波电流(%)', num: 0.0 },
{ name: '三相电压不平衡度(%)', num: 0.0 },
{ name: '电压波动(%)', num: 0.0 },
{ name: '闪变(%)', num: 0.0 },
{ name: '间谐波电压含有率(%)', num: 0.0 },
{ name: '电流不平衡度', num: 0.0 }
]
}
loadCallback: () => {}
})
provide('tableStore', tableStore)

View File

@@ -10,44 +10,8 @@
</pane>
<pane :style="height" style="background: #fff">
<TableHeader ref="TableHeaderRef" datePicker>
<template v-slot:select>
<!-- <el-form-item label="有功功率区间">
<el-select
v-model="power"
multiple
collapse-tags
collapse-tags-tooltip
filterable
placeholder="请选择有功功率区间"
>
<el-option
v-for="item in powerList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="各指标越限">
<el-select
v-model="index"
multiple
collapse-tags
collapse-tags-tooltip
filterable
placeholder="请选择各指标越限"
>
<el-option
v-for="item in indexList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item> -->
</template>
<template #operation>
<el-button icon="el-icon-Download" type="primary">生成报表</el-button>
<el-button icon="el-icon-Download" type="primary" @click="exportData">导出区间数据</el-button>
</template>
</TableHeader>
@@ -104,15 +68,22 @@
</el-card>
</div>
<el-card class="echart">
<my-echart :options="options" style="height: 238px" />
<h3>有功率区间占比</h3>
<my-echart :options="options" style="height: 208px" />
</el-card>
</div>
<div class="container mt10 ml10">
<el-card class="box">
<h3>功率区间稳态越限详情</h3>
<div :style="`height:calc(${heightB.height} - 25px)`" style="overflow-y: auto">
<vxe-table v-bind="defaultAttribute" ref="vxeRef" height="auto" :data="tableData">
<vxe-column field="num" title="时间" min-width="100px">
<vxe-table
v-bind="defaultAttribute"
ref="vxeRef"
height="auto"
:data="tableData"
v-loading="loading"
>
<vxe-column field="num" title="时间" width="180px">
<template #default="{ row }">
<el-link
type="primary"
@@ -129,7 +100,7 @@
<el-link
:type="row.voltageOffset == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.voltageOffset == '1' ? '越限' : '合格' }}
</el-link>
@@ -140,7 +111,7 @@
<el-link
:type="row.vtimes == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.vtimes == '1' ? '越限' : '合格' }}
</el-link>
@@ -151,7 +122,7 @@
<el-link
:type="row.itimes == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.itimes == '1' ? '越限' : '合格' }}
</el-link>
@@ -162,7 +133,7 @@
<el-link
:type="row.ubalance == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.ubalance == '1' ? '越限' : '合格' }}
</el-link>
@@ -173,7 +144,7 @@
<el-link
:type="row.voltageFluctuation == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.voltageFluctuation == '1' ? '越限' : '合格' }}
</el-link>
@@ -184,7 +155,7 @@
<el-link
:type="row.flicker == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.flicker == '1' ? '越限' : '合格' }}
</el-link>
@@ -195,7 +166,7 @@
<el-link
:type="row.interHarmonic == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.interHarmonic == '1' ? '越限' : '合格' }}
</el-link>
@@ -206,14 +177,14 @@
<el-link
:type="row.sequenceCurrentUnbalance == '1' ? 'danger' : 'success'"
class="percentage"
@click="timeClick(row)"
@click="detailClick(row)"
>
{{ row.sequenceCurrentUnbalance == '1' ? '越限' : '合格' }}
</el-link>
</template>
</vxe-column>
<vxe-column field="num3" title="操作">
<vxe-column field="num3" title="操作" width="80">
<template #default="{ row }">
<el-button type="primary" link @click="addTo(row)">添加</el-button>
</template>
@@ -226,13 +197,17 @@
<div :style="heightB" style="overflow-y: auto">
<div style="display: flex; justify-content: space-between">
<span style="font-size: 16px; font-weight: 700">报告参数</span>
<el-button icon="el-icon-Download" size="small" type="primary">生成报表</el-button>
<el-button icon="el-icon-Download" size="small" type="primary" @click="generateReports">
生成报表
</el-button>
</div>
<div>
<el-tree style="max-width: 600px" :data="dataSource" node-key="id" default-expand-all>
<template #default="{ node, data }">
<span class="custom-tree-node">
<span style="color: var(--el-color-primary)">{{ data.time }}</span>
<span :style="data.level != 0 ? 'color: var(--el-color-primary)' : ''">
{{ data.time }}
</span>
<Close
v-if="data.level != 0"
style="margin-left: 5px; height: 14px"
@@ -271,7 +246,13 @@ import { mainHeight } from '@/utils/layout'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import MyEchart from '@/components/echarts/MyEchart.vue'
import TimePopUpBox from './components/timePopUpBox.vue'
import { getDataByLineId, getTargetLimitById, getTargetByTime } from '@/api/harmonic-boot/newEnergyAnalysis'
import { ElMessage } from 'element-plus'
import {
getDataByLineId,
getTargetLimitById,
exportExcelRangTemplate,
exportExcelListTemplate
} from '@/api/harmonic-boot/newEnergyAnalysis'
import detail from './components/detail.vue'
import { Close } from '@element-plus/icons-vue'
defineOptions({
@@ -279,17 +260,17 @@ defineOptions({
})
const timePopUpBox = ref<anyObj | null>(null)
const flag = ref('0%~10%')
const radio2 = ref('1')
const height = mainHeight(20)
const heightB = mainHeight(395)
const size = ref(0)
const TableHeaderRef = ref()
const detailRef = ref()
const dotList: any = ref({})
const loading = ref(false)
const timePopUpBoxRef = ref()
const index = ref(0)
const treeList = ref([])
const powerList1: any = ref([
{
label: '0%~10%',
@@ -455,126 +436,106 @@ const remove = (node: any, data: any) => {
children.splice(index, 1)
dataSource.value = [...dataSource.value]
}
const options = ref({})
const tableStore = new TableStore({
url: '',
url: '/harmonic-boot/powerStatistics/getDataByLineId',
method: 'POST',
column: [],
beforeSearchFun: () => {},
loadCallback: () => {}
})
// 卡片点击变色
beforeSearchFun: () => {
treeList.value = dotList.value
tableStore.table.params.lineId = dotList.value.id
tableStore.table.params.searchBeginTime = TableHeaderRef.value.datePickerRef.timeValue[0]
tableStore.table.params.searchEndTime = TableHeaderRef.value.datePickerRef.timeValue[1]
},
loadCallback: () => {
let res = tableStore.table.data
// 点击时间
const timeClick = (row: any) => {
let data = {
...row,
field: index.value,
lineId: dotList.value.id
}
timePopUpBox.value = data
}
// 点击越限
const detailClick = (row: any) => {
detailRef.value.open()
}
// 获取有功功率趋势分析数据
const analyse = (e: any) => {
getDataByLineId({
lineId: e.id,
searchBeginTime: TableHeaderRef.value.datePickerRef.timeValue[0],
searchEndTime: TableHeaderRef.value.datePickerRef.timeValue[1]
}).then(res => {
let mun =
res.data.minsNum1 +
res.data.minsNum2 +
res.data.minsNum3 +
res.data.minsNum4 +
res.data.minsNum5 +
res.data.minsNum6 +
res.data.minsNum7 +
res.data.minsNum8 +
res.data.minsNum9
res.minsNum1 +
res.minsNum2 +
res.minsNum3 +
res.minsNum4 +
res.minsNum5 +
res.minsNum6 +
res.minsNum7 +
res.minsNum8 +
res.minsNum9
powerList1.value = [
{
label: '0%~10%',
quantity: res.data.minsNum0,
percentage: ((res.data.minsNum0 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot0,
quantity: res.minsNum0,
percentage: ((res.minsNum0 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot0,
value: '0%~10%'
},
{
label: '10%~20%',
quantity: res.data.minsNum1,
percentage: ((res.data.minsNum1 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot1,
quantity: res.minsNum1,
percentage: ((res.minsNum1 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot1,
value: '10%~10%'
},
{
label: '20%~30%',
quantity: res.data.minsNum2,
percentage: ((res.data.minsNum2 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot2,
quantity: res.minsNum2,
percentage: ((res.minsNum2 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot2,
value: '10%~30%'
},
{
label: '30%~40%',
quantity: res.data.minsNum3,
percentage: ((res.data.minsNum3 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot3,
quantity: res.minsNum3,
percentage: ((res.minsNum3 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot3,
value: '30%~40%'
},
{
label: '40%~50%',
quantity: res.data.minsNum4,
percentage: ((res.data.minsNum4 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot4,
quantity: res.minsNum4,
percentage: ((res.minsNum4 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot4,
value: '40%~50%'
}
]
powerList2.value = [
{
label: '50%~60%',
quantity: res.data.minsNum5,
percentage: ((res.data.minsNum5 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot5,
quantity: res.minsNum5,
percentage: ((res.minsNum5 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot5,
value: '50%~60%'
},
{
label: '60%~70%',
quantity: res.data.minsNum6,
percentage: ((res.data.minsNum6 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot6,
quantity: res.minsNum6,
percentage: ((res.minsNum6 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot6,
value: '60%~70%'
},
{
label: '70%~80%',
quantity: res.data.minsNum7,
percentage: ((res.data.minsNum7 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot7,
quantity: res.minsNum7,
percentage: ((res.minsNum7 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot7,
value: '70%~80%'
},
{
label: '80%~90%',
quantity: res.data.minsNum8,
percentage: ((res.data.minsNum8 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot8,
quantity: res.minsNum8,
percentage: ((res.minsNum8 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot8,
value: '80%~90%'
},
{
label: '90%~100%',
quantity: res.data.minsNum9,
percentage: ((res.data.minsNum9 / mun) * 100).toFixed(2) + '%',
crossTheLine: res.data.isOrNot9,
quantity: res.minsNum9,
percentage: ((res.minsNum9 / mun || 0) * 100).toFixed(2) + '%',
crossTheLine: res.isOrNot9,
value: '90%~100%'
}
]
options.value = {
title: {
text: '有功率区间占比',
left: '10px'
},
legend: {
show: false
},
@@ -625,20 +586,155 @@ const analyse = (e: any) => {
]
}
}
dataSource.value = [
{
id: 1,
level: 0,
time: '0%~10%',
children: []
},
{
id: 2,
level: 0,
time: '10%~20%',
children: []
},
{
id: 3,
level: 0,
time: '20%~30%',
children: []
},
{
id: 4,
level: 0,
time: '30%~40%',
children: []
},
{
id: 5,
level: 0,
time: '40%~50%',
children: []
},
{
id: 6,
level: 0,
time: '50%~60%',
children: []
},
{
id: 7,
level: 0,
time: '60%~70%',
children: []
},
{
id: 8,
level: 0,
time: '70%~80%',
children: []
},
{
id: 9,
level: 0,
time: '80%~90%',
children: []
},
{
id: 10,
level: 0,
time: '90%~100%',
children: []
}
]
analyseList(flag.value, index.value)
}
})
// 导出区间数据
const exportData = () => {
ElMessage('正在下载中,请稍等...')
exportExcelRangTemplate({
lineId: dotList.value.id,
searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime
}).then((res: any) => {
let blob = new Blob([res], {
type: 'application/vnd.ms-excel'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = treeList.value?.name + ' 0%-100% 区间数据' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
}
// 导出报告参数
const generateReports = () => {
let data: any = {
lineId: dotList.value.id,
searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime
}
dataSource.value.forEach((item: any, i: number) => {
// item.children
data[`time${i}`] = item.children.map((it: any) => it.time)
}),
exportExcelListTemplate(data).then((res: any) => {
let blob = new Blob([res], {
type: 'application/vnd.ms-excel'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = treeList.value?.name +' 报告' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
}
// 点击时间
const timeClick = (row: any) => {
let data = { ...row, field: index.value, lineId: dotList.value.id }
timePopUpBox.value = data
}
// 点击越限
const detailClick = (row: any) => {
detailRef.value.open()
}
// // 获取有功功率趋势分析数据
// const analyse = (e: any) => {
// getDataByLineId({
// lineId: e.id,
// searchBeginTime: tableStore.table.params.searchBeginTime,
// searchEndTime: tableStore.table.params.searchEndTime
// }).then(res => {})
// }
// 功率列表
const analyseList = (e: string, i: number) => {
flag.value = e
index.value = i
loading.value = true
getTargetLimitById({
lineId: dotList.value.id,
searchBeginTime: TableHeaderRef.value.datePickerRef.timeValue[0],
searchEndTime: TableHeaderRef.value.datePickerRef.timeValue[1],
searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime,
statisticalId: i
}).then(res => {
tableData.value = res.data
})
.then(res => {
loading.value = false
tableData.value = res.data
})
.catch(() => {
loading.value = false
})
}
provide('tableStore', tableStore)
@@ -649,16 +745,12 @@ onMounted(() => {
size.value = Math.round((180 / dom.offsetHeight) * 100)
}
})
let control = ref(true)
const handleNodeClick = (data: any, node: any) => {
console.log('🚀 ~ handleNodeClick ~ data:', data)
if (data.level == 6) {
dotList.value = data
analyse(data)
if (control.value) {
analyseList('0%~10%', 0)
control.value = false
}
tableStore.index()
}
}
</script>