冀北数据总览添加导出功能

This commit is contained in:
guanj
2026-02-06 14:45:15 +08:00
parent 15e3d4aec8
commit bfa061fb03
12 changed files with 2276 additions and 466 deletions

View File

@@ -45,3 +45,13 @@ export const getLineOverLimitData = (id: string) => {
method: 'post' method: 'post'
}) })
} }
//导出数据总览
export function dataVerifyExcel(params: any) {
return request({
url: '/device-boot/dataVerify/dataVerifyExcel',
method: 'get',
params,
responseType: 'blob'
})
}

View File

@@ -1,106 +1,114 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getTypeIdData(data: any) { export function getTypeIdData(data: any) {
return request({ return request({
url: '/system-boot/dictData/getTypeIdData', url: '/system-boot/dictData/getTypeIdData',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function getOnlineRateData2(data:any) { export function getOnlineRateData2(data:any) {
return request({ return request({
url: '/harmonic-boot/onlineRateData/getOnlineRateData', url: '/harmonic-boot/onlineRateData/getOnlineRateData',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function getAreaDept() { export function getAreaDept() {
return request({ return request({
url: '/user-boot/dept/loginDeptTree', url: '/user-boot/dept/loginDeptTree',
method: 'post' method: 'post'
}) })
} }
export function getOnlineRateDataCensus(data:any) { // 承载能力评估去除前缀
return request({ export function getAreaDeptRemoveMode(params) {
url: '/device-boot/terminalOnlineRateData/getOnlineRateDataCensus', return request({
method: 'post', url: '/user-boot/dept/loginDeptTree',
data: data method: 'GET',
}) params: params
} })
export function IntegrityIcon(data:any) { }
return request({ export function getOnlineRateDataCensus(data:any) {
url: '/harmonic-boot/integrity/getIntegrityIcon', return request({
method: 'post', url: '/device-boot/terminalOnlineRateData/getOnlineRateDataCensus',
data: data method: 'post',
}) data: data
} })
export function getDeptIdAreaTree() { }
return request({ export function IntegrityIcon(data:any) {
url: '/system-boot/area/getDeptIdAreaTree', return request({
method: 'post' url: '/harmonic-boot/integrity/getIntegrityIcon',
}) method: 'post',
} data: data
export function getOnlineRateData(data:any) { })
return request({ }
url: '/device-boot/terminalOnlineRateData/getOnlineRateData', export function getDeptIdAreaTree() {
method: 'post', return request({
data: data url: '/system-boot/area/getDeptIdAreaTree',
}) method: 'post'
} })
export function getSubstationInfoById(data:any) { }
return request({ export function getOnlineRateData(data:any) {
url: '/harmonic-boot/PollutionSubstation/getSubstationInfoById', return request({
method: 'post', url: '/device-boot/terminalOnlineRateData/getOnlineRateData',
data: data method: 'post',
}) data: data
} })
export function getLineInfoById(data:any) { }
return request({ export function getSubstationInfoById(data:any) {
url: '/harmonic-boot/PollutionSubstation/getLineInfoById', return request({
method: 'post', url: '/harmonic-boot/PollutionSubstation/getSubstationInfoById',
data: data method: 'post',
}) data: data
} })
export function getLineRank(data:any) { }
return request({ export function getLineInfoById(data:any) {
url: '/harmonic-boot/PollutionSubstation/getLineRank', return request({
method: 'post', url: '/harmonic-boot/PollutionSubstation/getLineInfoById',
data: data method: 'post',
}) data: data
} })
export function deptInfo(data:any) { }
return request({ export function getLineRank(data:any) {
url: '/harmonic-boot/detailAnalysis/deptInfo', return request({
method: 'post', url: '/harmonic-boot/PollutionSubstation/getLineRank',
data: data method: 'post',
}) data: data
} })
export function getXbLineInfoById(data:any) { }
return request({ export function deptInfo(data:any) {
url: '/harmonic-boot/detailAnalysis/getXbLineInfoById', return request({
method: 'post', url: '/harmonic-boot/detailAnalysis/deptInfo',
data: data method: 'post',
}) data: data
} })
export function getSubInfoById(data:any) { }
return request({ export function getXbLineInfoById(data:any) {
url: '/harmonic-boot/detailAnalysis/getSubInfoById', return request({
method: 'post', url: '/harmonic-boot/detailAnalysis/getXbLineInfoById',
data: data method: 'post',
}) data: data
} })
export function getXbLineRank(data:any) { }
return request({ export function getSubInfoById(data:any) {
url: '/harmonic-boot/detailAnalysis/getXbLineRank', return request({
method: 'post', url: '/harmonic-boot/detailAnalysis/getSubInfoById',
data: data method: 'post',
}) data: data
} })
// 数据补招 }
export function FullRecall(data:any) { export function getXbLineRank(data:any) {
return request({ return request({
url: '/data-processing-boot/data/FullRecall', url: '/harmonic-boot/detailAnalysis/getXbLineRank',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 数据补招
export function FullRecall(data:any) {
return request({
url: '/data-processing-boot/data/FullRecall',
method: 'post',
data: data
})
}

View File

@@ -6,29 +6,40 @@
</div> </div>
<el-tabs type="border-card"> <el-tabs type="border-card">
<el-tab-pane label="暂态波形上送" :style="'height:' + vhh"> <el-tab-pane label="暂态波形上送" :style="'height:' + vhh">
<el-table stripe :data="Data" :height="height" border style="width: 100%" <vxe-table
header-cell-class-name="table_header"> stripe
<el-table-column align="center" prop="number" label="事件段"></el-table-column> :data="Data"
<el-table-column align="center" prop="number" label="波形起始点相位(°)"> :height="height"
<el-table-column align="center" prop="number" label="A相"></el-table-column> border
<el-table-column align="center" prop="number" label="B相"></el-table-column> style="width: 100%"
<el-table-column align="center" prop="number" label="C相"></el-table-column> header-cell-class-name="table_header"
</el-table-column> >
<el-table-column align="center" prop="number" label="跳变段电压变化率(V/ms)"> <vxe-column align="center" field="number" title="事件段"></vxe-column>
<el-table-column align="center" prop="number" label="A相"></el-table-column> <vxe-colgroup align="center" field="number1" title="波形起始点相位(°)">
<el-table-column align="center" prop="number" label="B相"></el-table-column> <vxe-column align="center" field="number2" title="A相"></vxe-column>
<el-table-column align="center" prop="number" label="C相"></el-table-column> <vxe-column align="center" field="number3" title="B相"></vxe-column>
</el-table-column> <vxe-column align="center" field="number4" title="C相"></vxe-column>
<el-table-column align="center" prop="number" label="相位跳变(°)"> </vxe-colgroup>
<el-table-column align="center" prop="number" label="A相"></el-table-column> <vxe-colgroup align="center" field="number" title="跳变段电压变化率(V/ms)">
<el-table-column align="center" prop="number" label="B相"></el-table-column> <vxe-column align="center" field="number5" title="A相"></vxe-column>
<el-table-column align="center" prop="number" label="C相"></el-table-column> <vxe-column align="center" field="number6" title="B相"></vxe-column>
</el-table-column> <vxe-column align="center" field="number7" title="C相"></vxe-column>
<el-table-column align="center" prop="number" label="总分段数目"></el-table-column> </vxe-colgroup>
<el-table-column align="center" prop="number" label="三相电压不平衡度(%)" width="180"></el-table-column> <vxe-colgroup align="center" field="number" title="相位跳变(°)">
<el-table-column align="center" prop="number" label="触发类型"></el-table-column> <vxe-column align="center" field="number8" title="A相"></vxe-column>
<el-table-column align="center" prop="number" label="暂降原因"></el-table-column> <vxe-column align="center" field="number9" title="B相"></vxe-column>
</el-table> <vxe-column align="center" field="number10" title="C相"></vxe-column>
</vxe-colgroup>
<vxe-column align="center" field="number11" title="总分段数目"></vxe-column>
<vxe-column
align="center"
field="number12"
title="三相电压不平衡度(%)"
width="180"
></vxe-column>
<vxe-column align="center" field="number13" title="触发类型"></vxe-column>
<vxe-column align="center" field="number14" title="暂降原因"></vxe-column>
</vxe-table>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
@@ -73,7 +84,25 @@ export default {
subName: '', subName: '',
waveDatas: [], waveDatas: [],
Data: [], Data: [
{
number: 1,
number1: 0,
number2: 0,
number3: 0,
number4: 0,
number5: 0,
number6: 0,
number7: 0,
number8: 0,
number9: 0,
number10: 0,
number11: 1,
number12: 0,
number13: '其他',
number14: '其他'
}
],
height: null, height: null,
vhh: null, vhh: null,
ptpass: '', ptpass: '',
@@ -88,7 +117,7 @@ export default {
zoom: '' zoom: ''
} }
}, },
created() { }, created() {},
watch: { watch: {
value: function (a, b) { value: function (a, b) {
if (a == 2) { if (a == 2) {
@@ -116,10 +145,10 @@ export default {
this.zoom = 1 / document.body.style.zoom this.zoom = 1 / document.body.style.zoom
if (this.flag) { if (this.flag) {
// console.log(123); // console.log(123);
this.vh = mainHeight(250).height this.vh = mainHeight(280).height
} else { } else {
// console.log(3333); // console.log(3333);
this.vh = mainHeight(270).height this.vh = mainHeight(305).height
} }
}, },
query() { query() {
@@ -197,6 +226,8 @@ export default {
'#FF9999' '#FF9999'
] ]
} }
console.log('🚀 ~ this.boxoList:', this.boxoList)
var option = { var option = {
tooltip: { tooltip: {
top: '10px', top: '10px',
@@ -239,7 +270,7 @@ export default {
title: { title: {
left: 'center', left: 'center',
text: '发生时刻:' + this.boxoList.startTime + ' PT变化:' + this.boxoList.measurementPointName, text: '发生时刻:' + this.boxoList.startTime + ' PT变化:' + this.boxoList.pt,
textStyle: { textStyle: {
fontSize: 16, fontSize: 16,
color: _this.DColor ? '#fff' : echartsColor.WordColor color: _this.DColor ? '#fff' : echartsColor.WordColor
@@ -378,6 +409,33 @@ export default {
} }
], ],
series: [ series: [
{
name: '跳变期',
type: 'line',
data: [],
showSymbol: true, // 强制显示标记
symbol: 'rect', // 标记形状为方块
symbolSize: 10, // 方块大小
itemStyle: {
color: '#888888', // 方块颜色为灰色
borderWidth: 0
},
markArea: {
silent: true, // 不响应交互
itemStyle: { color: '#ccc' },
data: [
[
{ xAxis: '0' }, // 第一个跳变期起始
{ xAxis: '5' } // 第一个跳变期结束
],
[
{ xAxis: '210' }, // 第二个跳变期起始
{ xAxis: '220' } // 第二个跳变期结束
]
]
}
},
{ {
name: 'A相', name: 'A相',
type: 'line', type: 'line',

File diff suppressed because it is too large Load Diff

View File

@@ -1,286 +1,337 @@
//指标类型 //指标类型
export const indexOptions = [ export const indexOptions = [
{ {
label: '电压趋势', label: '电压趋势',
options: [ options: [
{ {
value: '10', value: '10',
label: '相电压有效值' label: '相电压有效值'
}, },
{ {
value: '11', value: '11',
label: '线电压有效值' label: '线电压有效值'
}, },
{ {
value: '12', value: '12',
label: '电压偏差' label: '电压偏差'
}, },
{ {
value: '13', value: '13',
label: '三相电压不平衡' label: '三相电压不平衡'
}, },
{ {
value: '14', value: '14',
label: '电压不平衡' label: '电压不平衡'
}, },
{ {
value: '15', value: '15',
label: '电压总谐波畸变率' label: '电压总谐波畸变率'
} }
] ]
}, },
{ {
label: '电流趋势', label: '电流趋势',
options: [ options: [
{ {
value: '20', value: '20',
label: '电流有效值' label: '电流有效值'
}, },
{ {
value: '21', value: '21',
label: '电流总谐波畸变率' label: '电流总谐波畸变率'
}, },
{ {
value: '22', value: '22',
label: '负序电流' label: '负序电流'
} }
] ]
}, },
{ {
label: '频率趋势', label: '频率趋势',
options: [ options: [
{ {
value: '30', value: '30',
label: '频率' label: '频率'
} }
] ]
}, },
{ {
label: '谐波趋势', label: '谐波趋势',
options: [ options: [
{ {
value: '40', value: '40',
label: '谐波电压含有率' label: '谐波电压含有率'
}, },
{ {
value: '43', value: '43',
label: '谐波电流幅值' label: '谐波电流幅值'
}, },
{ {
value: '44', value: '44',
label: '谐波电压相角' label: '谐波电压相角'
}, },
{ {
value: '45', value: '45',
label: '谐波电流相角' label: '谐波电流相角'
}, },
{ {
value: '46', value: '46',
label: '间谐波电压含有率' label: '间谐波电压含有率'
}, },
// { // {
// value: '47', // value: '47',
// label: '间谐波电流含有率' // label: '间谐波电流含有率'
// }, // },
// { // {
// value: '48', // value: '48',
// label: '间谐波电压幅值' // label: '间谐波电压幅值'
// }, // },
{ {
value: '49', value: '49',
label: '间谐波电流幅值' label: '间谐波电流幅值'
} }
] ]
}, },
{ {
label: '功率趋势', label: '功率趋势',
options: [ options: [
{ {
value: '50', value: '50',
label: '谐波有功功率' label: '谐波有功功率'
}, },
{ {
value: '51', value: '51',
label: '谐波无功功率' label: '谐波无功功率'
}, },
{ {
value: '52', value: '52',
label: '谐波视在功率' label: '谐波视在功率'
}, },
{ {
value: '53', value: '53',
label: '三相有功功率' label: '三相有功功率'
}, },
{ {
value: '54', value: '54',
label: '三相无功功率' label: '三相无功功率'
}, },
{ {
value: '55', value: '55',
label: '三相视在功率' label: '三相视在功率'
}, },
{ {
value: '56', value: '56',
label: '三相总有功功率' label: '三相总有功功率'
}, },
{ {
value: '57', value: '57',
label: '三相总无功功率' label: '三相总无功功率'
}, },
{ {
value: '58', value: '58',
label: '三相总视在功率' label: '三相总视在功率'
}, },
{ {
value: '59', value: '59',
label: '视在功率因数' label: '视在功率因数'
}, },
{ {
value: '591', value: '591',
label: '位移功率因数' label: '位移功率因数'
}, },
{ {
value: '592', value: '592',
label: '总视在功率因数' label: '总视在功率因数'
}, },
{ {
value: '593', value: '593',
label: '总位移功率因数' label: '总位移功率因数'
} }
] ]
}, },
{ {
label: '闪变趋势', label: '闪变趋势',
options: [ options: [
{ {
value: '60', value: '60',
label: '短时电压闪变' label: '短时电压闪变'
}, },
{ {
value: '61', value: '61',
label: '长时电压闪变' label: '长时电压闪变'
}, },
{ {
value: '62', value: '62',
label: '电压波动' label: '电压波动'
} }
] ]
} }
] ]
//谐波次数 //谐波次数
export const harmonicOptions = [ export const harmonicOptions = [
{ label: '基波', value: 1 }, { label: '基波', value: 1 },
{ label: '2次', value: 2 }, { label: '2次', value: 2 },
{ label: '3次', value: 3 }, { label: '3次', value: 3 },
{ label: '4次', value: 4 }, { label: '4次', value: 4 },
{ label: '5次', value: 5 }, { label: '5次', value: 5 },
{ label: '6次', value: 6 }, { label: '6次', value: 6 },
{ label: '7次', value: 7 }, { label: '7次', value: 7 },
{ label: '8次', value: 8 }, { label: '8次', value: 8 },
{ label: '9次', value: 9 }, { label: '9次', value: 9 },
{ label: '10次', value: 10 }, { label: '10次', value: 10 },
{ label: '11次', value: 11 }, { label: '11次', value: 11 },
{ label: '12次', value: 12 }, { label: '12次', value: 12 },
{ label: '13次', value: 13 }, { label: '13次', value: 13 },
{ label: '14次', value: 14 }, { label: '14次', value: 14 },
{ label: '15次', value: 15 }, { label: '15次', value: 15 },
{ label: '16次', value: 16 }, { label: '16次', value: 16 },
{ label: '17次', value: 17 }, { label: '17次', value: 17 },
{ label: '18次', value: 18 }, { label: '18次', value: 18 },
{ label: '19次', value: 19 }, { label: '19次', value: 19 },
{ label: '20次', value: 20 }, { label: '20次', value: 20 },
{ label: '21次', value: 21 }, { label: '21次', value: 21 },
{ label: '22次', value: 22 }, { label: '22次', value: 22 },
{ label: '23次', value: 23 }, { label: '23次', value: 23 },
{ label: '24次', value: 24 }, { label: '24次', value: 24 },
{ label: '25次', value: 25 }, { label: '25次', value: 25 },
{ label: '26次', value: 26 }, { label: '26次', value: 26 },
{ label: '27次', value: 27 }, { label: '27次', value: 27 },
{ label: '28次', value: 28 }, { label: '28次', value: 28 },
{ label: '29次', value: 29 }, { label: '29次', value: 29 },
{ label: '30次', value: 30 }, { label: '30次', value: 30 },
{ label: '31次', value: 31 }, { label: '31次', value: 31 },
{ label: '32次', value: 32 }, { label: '32次', value: 32 },
{ label: '33次', value: 33 }, { label: '33次', value: 33 },
{ label: '34次', value: 34 }, { label: '34次', value: 34 },
{ label: '35次', value: 35 }, { label: '35次', value: 35 },
{ label: '36次', value: 36 }, { label: '36次', value: 36 },
{ label: '37次', value: 37 }, { label: '37次', value: 37 },
{ label: '38次', value: 38 }, { label: '38次', value: 38 },
{ label: '39次', value: 39 }, { label: '39次', value: 39 },
{ label: '40次', value: 40 }, { label: '40次', value: 40 },
{ label: '41次', value: 41 }, { label: '41次', value: 41 },
{ label: '42次', value: 42 }, { label: '42次', value: 42 },
{ label: '43次', value: 43 }, { label: '43次', value: 43 },
{ label: '44次', value: 44 }, { label: '44次', value: 44 },
{ label: '45次', value: 45 }, { label: '45次', value: 45 },
{ label: '46次', value: 46 }, { label: '46次', value: 46 },
{ label: '47次', value: 47 }, { label: '47次', value: 47 },
{ label: '48次', value: 48 }, { label: '48次', value: 48 },
{ label: '49次', value: 49 }, { label: '49次', value: 49 },
{ label: '50次', value: 50 } { label: '50次', value: 50 }
] ]
//简谐波次数 export const harmonicOptions1 = [
export const inharmonicOptions = [ { label: '2次', value: 2 },
{ label: '0.5次', value: 1 }, { label: '3次', value: 3 },
{ label: '1.5次', value: 2 }, { label: '4次', value: 4 },
{ label: '2.5次', value: 3 }, { label: '5次', value: 5 },
{ label: '3.5次', value: 4 }, { label: '6次', value: 6 },
{ label: '4.5次', value: 5 }, { label: '7次', value: 7 },
{ label: '5.5次', value: 6 }, { label: '8次', value: 8 },
{ label: '6.5次', value: 7 }, { label: '9次', value: 9 },
{ label: '7.5次', value: 8 }, { label: '10次', value: 10 },
{ label: '8.5次', value: 9 }, { label: '11次', value: 11 },
{ label: '9.5次', value: 10 }, { label: '12次', value: 12 },
{ label: '10.5次', value: 11 }, { label: '13次', value: 13 },
{ label: '11.5次', value: 12 }, { label: '14次', value: 14 },
{ label: '12.5次', value: 13 }, { label: '15次', value: 15 },
{ label: '13.5次', value: 14 }, { label: '16次', value: 16 },
{ label: '14.5次', value: 15 }, { label: '17次', value: 17 },
{ label: '15.5次', value: 16 }, { label: '18次', value: 18 },
{ label: '16.5次', value: 17 }, { label: '19次', value: 19 },
{ label: '17.5次', value: 18 }, { label: '20次', value: 20 },
{ label: '18.5次', value: 19 }, { label: '21次', value: 21 },
{ label: '19.5次', value: 20 }, { label: '22次', value: 22 },
{ label: '20.5次', value: 21 }, { label: '23次', value: 23 },
{ label: '21.5次', value: 22 }, { label: '24次', value: 24 },
{ label: '22.5次', value: 23 }, { label: '25次', value: 25 },
{ label: '23.5次', value: 24 }, { label: '26次', value: 26 },
{ label: '24.5次', value: 25 }, { label: '27次', value: 27 },
{ label: '25.5次', value: 26 }, { label: '28次', value: 28 },
{ label: '26.5次', value: 27 }, { label: '29次', value: 29 },
{ label: '27.5次', value: 28 }, { label: '30次', value: 30 },
{ label: '28.5次', value: 29 }, { label: '31次', value: 31 },
{ label: '29.5次', value: 30 }, { label: '32次', value: 32 },
{ label: '30.5次', value: 31 }, { label: '33次', value: 33 },
{ label: '31.5次', value: 32 }, { label: '34次', value: 34 },
{ label: '32.5次', value: 33 }, { label: '35次', value: 35 },
{ label: '33.5次', value: 34 }, { label: '36次', value: 36 },
{ label: '34.5次', value: 35 }, { label: '37次', value: 37 },
{ label: '35.5次', value: 36 }, { label: '38次', value: 38 },
{ label: '36.5次', value: 37 }, { label: '39次', value: 39 },
{ label: '37.5次', value: 38 }, { label: '40次', value: 40 },
{ label: '38.5次', value: 39 }, { label: '41次', value: 41 },
{ label: '39.5次', value: 40 }, { label: '42次', value: 42 },
{ label: '40.5次', value: 41 }, { label: '43次', value: 43 },
{ label: '41.5次', value: 42 }, { label: '44次', value: 44 },
{ label: '42.5次', value: 43 }, { label: '45次', value: 45 },
{ label: '43.5次', value: 44 }, { label: '46次', value: 46 },
{ label: '44.5次', value: 45 }, { label: '47次', value: 47 },
{ label: '45.5次', value: 46 }, { label: '48次', value: 48 },
{ label: '46.5次', value: 47 }, { label: '49次', value: 49 },
{ label: '47.5次', value: 48 }, { label: '50次', value: 50 }
{ label: '48.5次', value: 49 }, ]
{ label: '49.5次', value: 50 }, //简谐波次数
export const inharmonicOptions = [
{ label: '0.5次', value: 1 },
{ label: '1.5次', value: 2 },
] { label: '2.5次', value: 3 },
{ label: '3.5次', value: 4 },
//值类型 { label: '4.5次', value: 5 },
export const typeOptions = [ { label: '5.5次', value: 6 },
{ label: '平均值', value: 1 }, { label: '6.5次', value: 7 },
{ label: '最小值', value: 2 }, { label: '7.5次', value: 8 },
{ label: '最大值', value: 3 }, { label: '8.5次', value: 9 },
{ label: 'cp95值', value: 4 } { label: '9.5次', value: 10 },
] { label: '10.5次', value: 11 },
{ label: '11.5次', value: 12 },
{ label: '12.5次', value: 13 },
{ label: '13.5次', value: 14 },
{ label: '14.5次', value: 15 },
{ label: '15.5次', value: 16 },
{ label: '16.5次', value: 17 },
{ label: '17.5次', value: 18 },
{ label: '18.5次', value: 19 },
{ label: '19.5次', value: 20 },
{ label: '20.5次', value: 21 },
{ label: '21.5次', value: 22 },
{ label: '22.5次', value: 23 },
{ label: '23.5次', value: 24 },
{ label: '24.5次', value: 25 },
{ label: '25.5次', value: 26 },
{ label: '26.5次', value: 27 },
{ label: '27.5次', value: 28 },
{ label: '28.5次', value: 29 },
{ label: '29.5次', value: 30 },
{ label: '30.5次', value: 31 },
{ label: '31.5次', value: 32 },
{ label: '32.5次', value: 33 },
{ label: '33.5次', value: 34 },
{ label: '34.5次', value: 35 },
{ label: '35.5次', value: 36 },
{ label: '36.5次', value: 37 },
{ label: '37.5次', value: 38 },
{ label: '38.5次', value: 39 },
{ label: '39.5次', value: 40 },
{ label: '40.5次', value: 41 },
{ label: '41.5次', value: 42 },
{ label: '42.5次', value: 43 },
{ label: '43.5次', value: 44 },
{ label: '44.5次', value: 45 },
{ label: '45.5次', value: 46 },
{ label: '46.5次', value: 47 },
{ label: '47.5次', value: 48 },
{ label: '48.5次', value: 49 },
{ label: '49.5次', value: 50 },
]
//值类型
export const typeOptions = [
{ label: '平均值', value: 1 },
{ label: '最小值', value: 2 },
{ label: '最大值', value: 3 },
{ label: 'cp95值', value: 4 }
]

View File

@@ -183,7 +183,7 @@ import TableHeader from '@/components/table/header/index.vue'
import MyEChart from '@/components/echarts/MyEchart.vue' import MyEChart from '@/components/echarts/MyEchart.vue'
import { useMonitoringPoint } from '@/stores/monitoringPoint' import { useMonitoringPoint } from '@/stores/monitoringPoint'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { harmonicOptions } from '@/utils/dictionary' import { harmonicOptions1 } from '@/utils/dictionary'
import { Select } from '@element-plus/icons-vue' import { Select } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { import {
@@ -202,7 +202,7 @@ import html2canvas from 'html2canvas'
import { yMethod } from '@/utils/echartMethod' import { yMethod } from '@/utils/echartMethod'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
const props = defineProps(['rowList']) const props = defineProps(['rowList'])
const harmonic = harmonicOptions.filter(item => item.value < 26) const harmonic = harmonicOptions1.filter(item => item.value < 26)
const currentLod = ref(false) const currentLod = ref(false)
const monitoringPoint = useMonitoringPoint() const monitoringPoint = useMonitoringPoint()
const size = ref(19) const size = ref(19)

View File

@@ -157,7 +157,7 @@ const tableStore: any = new TableStore({
}, },
{ {
name: 'del', name: 'del',
text: '禁止接入', text: '删除',
type: 'danger', type: 'danger',
icon: 'el-icon-Delete', icon: 'el-icon-Delete',
render: 'confirmButton', render: 'confirmButton',
@@ -165,11 +165,11 @@ const tableStore: any = new TableStore({
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
confirmButtonType: 'danger', confirmButtonType: 'danger',
title: '确定禁止接入' title: '确定删除'
}, },
click: row => { click: row => {
remove({ ids: row.id }).then(() => { remove({ ids: row.id }).then(() => {
ElMessage.success('禁止接入成功') ElMessage.success('删除成功')
tableStore.index() tableStore.index()
}) })
} }

View File

@@ -57,9 +57,15 @@
<el-form-item label="区域" prop="regionList"> <el-form-item label="区域" prop="regionList">
<!-- <el-cascader v-model="form.regionList" style="width: 100%" :props="props" :options="areaList" /> --> <!-- <el-cascader v-model="form.regionList" style="width: 100%" :props="props" :options="areaList" /> -->
<el-cascader v-model="form.regionList" :props="props" :options="areaList" style="width: 100%" placeholder="请选择区域" /> <el-cascader
v-model="form.regionList"
:props="props"
:options="areaList"
style="width: 100%"
placeholder="请选择区域"
/>
</el-form-item> </el-form-item>
<el-form-item label="详细地址:" prop="area"> <el-form-item label="详细地址:" prop="area">
<el-input <el-input
clearable clearable
@@ -95,7 +101,7 @@ import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import equipment from './equipment.vue' import equipment from './equipment.vue'
import { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity' import { addUse, updateUse, removeUse } from '@/api/advance-boot/bearingCapacity'
import { getAreaDept } from '@/api/harmonic-boot/area' import { getAreaDept, getAreaDeptRemoveMode } from '@/api/harmonic-boot/area'
defineOptions({ defineOptions({
name: 'estimate/photovoltaic' name: 'estimate/photovoltaic'
@@ -108,8 +114,9 @@ const disabled = ref(false)
const TableHeaderRef = ref() const TableHeaderRef = ref()
const equipmentRef = ref() const equipmentRef = ref()
const title = ref('') const title = ref('')
const VITE_FLAG = import.meta.env.VITE_NAME == 'removeMode'
//const areaList: any = dictData.areaSelect() //const areaList: any = dictData.areaSelect()
const areaList = ref([]) const areaList: any = ref([])
const userShow: any = ref('Power_Station_Users') const userShow: any = ref('Power_Station_Users')
const form = ref({ const form = ref({
@@ -187,7 +194,8 @@ const tableStore: any = new TableStore({
{ field: 'createBy', title: '创建者' }, { field: 'createBy', title: '创建者' },
{ field: 'createTime', title: '创建日期' }, { field: 'createTime', title: '创建日期' },
{ {
title: '操作',fixed: 'right', title: '操作',
fixed: 'right',
width: '180', width: '180',
render: 'buttons', render: 'buttons',
buttons: [ buttons: [
@@ -258,9 +266,7 @@ const tableStore: any = new TableStore({
} }
], ],
loadCallback: () => { loadCallback: () => {}
}
}) })
tableStore.table.params.userType = '' tableStore.table.params.userType = ''
@@ -268,8 +274,6 @@ tableStore.table.params.userType = ''
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {
tableStore.index() tableStore.index()
}) })
const useChange = (e: string) => { const useChange = (e: string) => {
userShow.value = uesrList.filter(item => item.id == e)[0].code userShow.value = uesrList.filter(item => item.id == e)[0].code
@@ -278,10 +282,14 @@ const useChange = (e: string) => {
const add = async () => { const add = async () => {
disabled.value = false disabled.value = false
title.value = '新增承载能力待评估用户' title.value = '新增承载能力待评估用户'
if (VITE_FLAG) {
areaList.value = dictData.state.areaTree
} else {
await getAreaDept().then(res => {
areaList.value = JSON.parse(JSON.stringify(res.data))
})
}
await getAreaDept().then(res => {
areaList.value = JSON.parse(JSON.stringify(res.data))
})
dialogVisible.value = true dialogVisible.value = true
} }
// 保存 // 保存

View File

@@ -54,6 +54,9 @@
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键字筛选:">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input>
</el-form-item>
</template> </template>
<template #operation> <template #operation>
<el-button type="primary" icon="el-icon-Tickets" @click="makeUp" v-if="!VITE_FLAG">补招</el-button> <el-button type="primary" icon="el-icon-Tickets" @click="makeUp" v-if="!VITE_FLAG">补招</el-button>
@@ -285,7 +288,7 @@ const tableStore = new TableStore({
// tableStore.table.params.searchEndTime = tableHeaderRef.value.datePickerRef.timeValue[1] // tableStore.table.params.searchEndTime = tableHeaderRef.value.datePickerRef.timeValue[1]
}, },
loadCallback: () => { loadCallback: () => {
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) tableStore.table.data = tree2List(filterTreeByKeyword( tableStore.table.data,tableStore.table.params.searchValue), Math.random() * 1000)
tableStore.table.column[0].title = formData.value.statisticalType.name tableStore.table.column[0].title = formData.value.statisticalType.name
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
@@ -305,6 +308,7 @@ const tableStore = new TableStore({
tableStore.table.params.deptIndex = '' tableStore.table.params.deptIndex = ''
tableStore.table.params.filterName = '' tableStore.table.params.filterName = ''
tableStore.table.params.searchValue = ''
tableStore.table.params.statisticalType = [] tableStore.table.params.statisticalType = []
tableStore.table.params.scale = [] tableStore.table.params.scale = []
tableStore.table.params.manufacturer = [] tableStore.table.params.manufacturer = []
@@ -339,6 +343,78 @@ const tree2List = (list: any, id?: string) => {
return arr return arr
} }
/**
* 树形结构按名称筛选:保留匹配节点+所有上级+所有下级,保持原树形层级
* @param {Array} treeData - 原始嵌套树形数据(根节点数组)
* @param {string} keyword - 筛选关键词name包含该关键词即匹配
* @returns {Array} 筛选后的嵌套树形数据,保持原层级
*/
function filterTreeByKeyword(treeData, keyword) {
// 关键词为空,直接返回原树(深拷贝,避免修改原数据)
if (!keyword || keyword.trim() === '') {
return JSON.parse(JSON.stringify(treeData));
}
const targetKey = keyword.trim();
// 存储需要保留的节点ID匹配节点+所有上级+所有下级)
const keepIdSet = new Set();
// 第一步递归遍历树形标记所有需要保留的节点ID
const markKeepNodes = (node, parentNodes = []) => {
// 1. 若当前节点名称包含关键词,标记自身+所有上级+所有下级
const isMatch = node.name && node.name.includes(targetKey);
if (isMatch) {
// 标记自身
keepIdSet.add(node.id);
// 标记所有上级父节点
parentNodes.forEach(pNode => keepIdSet.add(pNode.id));
// 标记所有下级子节点(递归)
const markChildren = (childNode) => {
keepIdSet.add(childNode.id);
if (childNode.children && childNode.children.length) {
childNode.children.forEach(markChildren);
}
};
if (node.children && node.children.length) {
node.children.forEach(markChildren);
}
}
// 2. 递归遍历子节点传递当前节点的上级链parentNodes + 当前节点)
if (node.children && node.children.length) {
node.children.forEach(child => markKeepNodes(child, [...parentNodes, node]));
}
};
// 遍历根节点,开始标记
treeData.forEach(rootNode => markKeepNodes(rootNode));
// 第二步:递归重构树形,只保留标记过的节点,保持层级
const rebuildTree = (node) => {
// 若当前节点无需保留直接返回null
if (!keepIdSet.has(node.id)) {
return null;
}
// 深拷贝当前节点,避免修改原数据
const newNode = { ...node };
// 递归处理子节点,过滤掉无需保留的,只保留有效子节点
if (newNode.children && newNode.children.length) {
const newChildren = newNode.children.map(child => rebuildTree(child)).filter(Boolean);
newNode.children = newChildren;
} else {
newNode.children = [];
}
return newNode;
};
// 重构根节点过滤掉null的根节点
const filteredTree = treeData.map(rootNode => rebuildTree(rootNode)).filter(Boolean);
return filteredTree;
}
// 禁用超过当前日期的选择 // 禁用超过当前日期的选择
const disabledDate = (date: Date) => { const disabledDate = (date: Date) => {
return date > new Date() // 如果日期大于当前日期,则禁用 return date > new Date() // 如果日期大于当前日期,则禁用

View File

@@ -102,6 +102,13 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键字筛选:">
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="请输入关键字"
></el-input>
</el-form-item>
</template> </template>
</TableHeader> </TableHeader>
</div> </div>
@@ -132,7 +139,6 @@ import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import charts from './components/charts.vue' import charts from './components/charts.vue'
defineOptions({ defineOptions({
name: 'device-boot/getOnlineRateData' name: 'device-boot/getOnlineRateData'
}) })
@@ -153,7 +159,6 @@ const treeData = ref([])
const idArr = ref([]) const idArr = ref([])
const activeName = ref(0) const activeName = ref(0)
const getTreeData = async () => { const getTreeData = async () => {
await getAreaDept().then(res => { await getAreaDept().then(res => {
var data = res.data var data = res.data
data.forEach(element => { data.forEach(element => {
@@ -205,7 +210,8 @@ const tableStore = new TableStore({
{ {
title: '网络参数', title: '网络参数',
field: 'ip', field: 'ip',
align: 'center' ,width:'120px', align: 'center',
width: '120px',
formatter: function (row) { formatter: function (row) {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -257,7 +263,7 @@ const tableStore = new TableStore({
formatter: function (row) { formatter: function (row) {
return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue.toFixed(2) return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue.toFixed(2)
} }
}, }
// { // {
// title: '评估', // title: '评估',
// field: 'valueOver', // field: 'valueOver',
@@ -299,23 +305,26 @@ const tableStore = new TableStore({
// let treeData = [] // let treeData = []
// treeData = tree2List(tableStore.table.data) // treeData = tree2List(tableStore.table.data)
// tableStore.table.data = JSON.parse(JSON.stringify(treeData)) // tableStore.table.data = JSON.parse(JSON.stringify(treeData))
tableStore.table.data = tree2List(tableStore.table.data, Math.random() * 1000) tableStore.table.data = tree2List(
filterTreeByKeyword(tableStore.table.data, tableStore.table.params.searchValue),
Math.random() * 1000
)
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params) chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
setTimeout(() => { setTimeout(() => {
activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true) activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true)
}, 0) }, 0)
}, },
resetCallback: () => { resetCallback: () => {
// 重置表单数据到默认值 // 重置表单数据到默认值
formData.value.statisticalType = classificationData[0] formData.value.statisticalType = classificationData[0]
formData.value.deptIndex = treeData.value[0]?.id formData.value.deptIndex = treeData.value[0]?.id
formData.value.scale = voltageleveloption formData.value.scale = voltageleveloption
formData.value.manufacturer = terminaloption formData.value.manufacturer = terminaloption
formData.value.loadType = interfereoption formData.value.loadType = interfereoption
} }
}) })
tableStore.table.params.searchValue = ''
tableStore.table.params.deptIndex = '' tableStore.table.params.deptIndex = ''
tableStore.table.params.statisticalType = [] tableStore.table.params.statisticalType = []
tableStore.table.params.scale = [] tableStore.table.params.scale = []
@@ -342,7 +351,73 @@ const tree2List = (list: any, id?: string) => {
}) })
// 返回结果数组 // 返回结果数组
return arr return arr
}
/**
* 树形结构按名称筛选:保留匹配节点+所有上级+所有下级,保持原树形层级
* @param {Array} treeData - 原始嵌套树形数据(根节点数组)
* @param {string} keyword - 筛选关键词name包含该关键词即匹配
* @returns {Array} 筛选后的嵌套树形数据,保持原层级
*/
function filterTreeByKeyword(treeData, keyword) {
// 关键词为空,直接返回原树(深拷贝,避免修改原数据)
if (!keyword || keyword.trim() === '') {
return JSON.parse(JSON.stringify(treeData))
}
const targetKey = keyword.trim()
// 存储需要保留的节点ID匹配节点+所有上级+所有下级)
const keepIdSet = new Set()
// 第一步递归遍历树形标记所有需要保留的节点ID
const markKeepNodes = (node, parentNodes = []) => {
// 1. 若当前节点名称包含关键词,标记自身+所有上级+所有下级
const isMatch = node.name && node.name.includes(targetKey)
if (isMatch) {
// 标记自身
keepIdSet.add(node.id)
// 标记所有上级父节点
parentNodes.forEach(pNode => keepIdSet.add(pNode.id))
// 标记所有下级子节点(递归)
const markChildren = childNode => {
keepIdSet.add(childNode.id)
if (childNode.children && childNode.children.length) {
childNode.children.forEach(markChildren)
}
}
if (node.children && node.children.length) {
node.children.forEach(markChildren)
}
}
// 2. 递归遍历子节点传递当前节点的上级链parentNodes + 当前节点)
if (node.children && node.children.length) {
node.children.forEach(child => markKeepNodes(child, [...parentNodes, node]))
}
}
// 遍历根节点,开始标记
treeData.forEach(rootNode => markKeepNodes(rootNode))
// 第二步:递归重构树形,只保留标记过的节点,保持层级
const rebuildTree = node => {
// 若当前节点无需保留直接返回null
if (!keepIdSet.has(node.id)) {
return null
}
// 深拷贝当前节点,避免修改原数据
const newNode = { ...node }
// 递归处理子节点,过滤掉无需保留的,只保留有效子节点
if (newNode.children && newNode.children.length) {
const newChildren = newNode.children.map(child => rebuildTree(child)).filter(Boolean)
newNode.children = newChildren
} else {
newNode.children = []
}
return newNode
}
// 重构根节点过滤掉null的根节点
const filteredTree = treeData.map(rootNode => rebuildTree(rootNode)).filter(Boolean)
return filteredTree
} }
onMounted(() => {}) onMounted(() => {})

View File

@@ -11,7 +11,9 @@
></DatePicker> ></DatePicker>
</el-form-item> </el-form-item>
</template> </template>
<template v-slot:operation></template> <template v-slot:operation>
<el-button type="primary" icon="el-icon-Download" @click="exportTemplate">导出</el-button>
</template>
</TableHeader> </TableHeader>
<GridLayout <GridLayout
@@ -68,9 +70,12 @@ import { useRouter, useRoute } from 'vue-router'
import { View } from '@element-plus/icons-vue' import { View } from '@element-plus/icons-vue'
import { useTimeCacheStore } from '@/stores/timeCache' import { useTimeCacheStore } from '@/stores/timeCache'
import { adminBaseRoutePath } from '@/router/static' import { adminBaseRoutePath } from '@/router/static'
import { useAdminInfo } from '@/stores/adminInfo'
import { dataVerifyExcel } from '@/api/device-boot/line'
const { push } = useRouter() const { push } = useRouter()
const datePickerRef = ref() const datePickerRef = ref()
const router = useRouter() const router = useRouter()
const adminInfo = useAdminInfo()
const route = useRoute() const route = useRoute()
const timeCacheStore = useTimeCacheStore() const timeCacheStore = useTimeCacheStore()
@@ -288,7 +293,29 @@ const fetchLayoutData = async () => {
// 可以添加错误提示逻辑 // 可以添加错误提示逻辑
} }
} }
// 导出
const exportTemplate = () => {
console.log(123)
dataVerifyExcel({
deptId: adminInfo.$state.deptId,
searchBeginTime: datePickerRef.value?.timeValue[0],
searchEndTime: datePickerRef.value?.timeValue[1]
}).then((res: any) => {
let blob = new Blob([res], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
// link.download = "电压暂降事件分析报告"; // 设置下载的文件名
link.download = '数据总览' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
}
// 窗口大小变化处理 - 使用防抖 // 窗口大小变化处理 - 使用防抖
const handleResize = useDebounceFn(() => { const handleResize = useDebounceFn(() => {
initRowHeight() initRowHeight()

View File

@@ -33,10 +33,10 @@
style="width: 100%" style="width: 100%"
></el-input-number> ></el-input-number>
</el-form-item> </el-form-item>
<el-form-item label="会话超时时间(分钟):" prop="sessionTime"> <el-form-item label="会话超时时间():" prop="sessionTime">
<el-input-number v-model.number="form.sessionTime" :min="10" style="width: 100%"></el-input-number> <el-input-number v-model.number="form.sessionTime" :min="10" style="width: 100%"></el-input-number>
</el-form-item> </el-form-item>
<el-form-item label="token刷新时间(分钟):" prop="sessionRefreshTime"> <el-form-item label="token刷新时间():" prop="sessionRefreshTime">
<el-input-number <el-input-number
v-model.number="form.sessionRefreshTime" v-model.number="form.sessionRefreshTime"
:min="10" :min="10"