25 Commits

Author SHA1 Message Date
guanj
48472bdb85 微调 2026-04-03 14:48:10 +08:00
guanj
fafc5f82c4 修改itic点击波形图 2026-03-26 14:53:34 +08:00
cdf
93ee7e4034 通用台账查询页面调整 2026-03-23 09:19:43 +08:00
guanj
7d2ce51510 修改问题 2026-03-17 08:43:51 +08:00
guanj
9202da17f1 微调 2026-03-05 15:42:15 +08:00
guanj
30eddd0572 修改用户台账管理接口 2026-03-05 11:08:36 +08:00
sjl
15bd1ac6d2 事件报告导出 2026-03-02 15:35:29 +08:00
sjl
f5c76c1b7a 报告模版配置 2026-02-27 14:46:19 +08:00
sjl
b25515b5db 系统相关配置 2026-02-27 08:49:57 +08:00
guanj
bfa061fb03 冀北数据总览添加导出功能 2026-02-06 14:45:15 +08:00
sjl
15e3d4aec8 微调 2026-02-06 10:10:24 +08:00
sjl
59489aaafa 微调 2026-01-30 15:01:19 +08:00
guanj
5d0421dd40 Merge branch 'master' of http://192.168.1.22:3000/Web/admin-sjzx 2026-01-29 14:10:32 +08:00
guanj
6d7ef7cf5d 修改终端型号 2026-01-29 14:10:18 +08:00
sjl
8d9ccf97a7 前置管理分配终端 2026-01-29 13:44:12 +08:00
sjl
7188e3e681 微调 2026-01-28 14:33:42 +08:00
sjl
a9fc77eb8b 区域概览未关联暂降次数和已关联处理事件合并 2026-01-28 10:33:59 +08:00
sjl
87af11288d 微调 2026-01-28 08:45:38 +08:00
sjl
0763187744 前置管理重启,稳态统计报表重置 2026-01-23 13:46:00 +08:00
sjl
ae641604ba 区域概览表格sarfi9总计 2026-01-23 09:20:57 +08:00
sjl
564e6ef4ab Merge branch 'master' of http://192.168.1.22:3000/Web/admin-sjzx
# Conflicts:
#	src/views/pqs/voltageSags/Region/components/echart.vue
2026-01-23 09:07:11 +08:00
sjl
c84c5dae3b 微调 2026-01-23 09:04:08 +08:00
guanj
c902dabb73 微调 2026-01-23 09:03:37 +08:00
guanj
8d1497032f Merge branch 'master' of http://192.168.1.22:3000/Web/admin-sjzx 2026-01-23 08:51:12 +08:00
guanj
6aeac753ef 修改触发类型 2026-01-23 08:51:03 +08:00
109 changed files with 29416 additions and 25021 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,6 @@
import createAxios from '@/utils/request' import createAxios from '@/utils/request'
// 密码规则修改 // 密码规则修改
export function ruleUpdate(data) { export function ruleUpdate(data) {
return createAxios({ return createAxios({
@@ -24,3 +25,77 @@ export function unlockRoot(data) {
data data
}) })
} }
//根据客户端名查询信息
export function getClientInfoByPath() {
return createAxios({
url: '/user-boot/authClient/getAuthClientByName/njcn',
method: 'GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
//客户端会话配置更新
export function updateClientSessionConfig(data) {
return createAxios({
url: '/user-boot/authClient/sessionConfigUpdate',
method: 'post',
data
})
}
//获取用户配置
export function getUserConfig() {
return createAxios({
url: '/user-boot/password/getUserStrategyList',
method: 'post'
})
}
//查询系统列表
export function getSystemList() {
return createAxios({
url: '/system-boot/config/getSysConfigData',
method: 'get'
})
}
//激活系统配置
export function activeSystemConfig(data) {
return createAxios({
url: '/system-boot/config/updateSysConfig',
method: 'post',
data
})
}
//删除系统配置
export function deleteSystemConfig( data) {
return createAxios({
url: '/system-boot/config/removeSysConfigById',
method: 'get',
params: data
})
}
//新增系统配置
export function addSystemConfig(data) {
return createAxios({
url: '/system-boot/config/addSysConfig',
method: 'post',
data
})
}
//修改系统配置
export function updateSystemConfig(data) {
return createAxios({
url: '/system-boot/config/updateSysConfig',
method: 'post',
data
})
}

View File

@@ -129,7 +129,7 @@ export function queryAllByType(params: any) {
//获取用户 //获取用户
export function selectUserList(data: any) { export function selectUserList(data: any) {
return createAxios({ return createAxios({
url: '/supervision-boot/userReport/selectUserList', url: '/device-boot/userReport/selectUserList',
method: 'post', method: 'post',
data data
}) })
@@ -206,3 +206,11 @@ export function exportTerminalBase() {
responseType: 'blob' responseType: 'blob'
}) })
} }
//一键分配终端
export function allotTerminal(data: any) {
return createAxios({
url: '/device-boot/nodeDevice/oneKeyDistribution',
method: 'post',
params: data
})
}

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

@@ -31,4 +31,13 @@ export function getDevTypeList() {
method: 'post', method: 'post',
}) })
}
export const getDeviceTypeList = (params: any) => {
return createAxios({
url: '/device-boot/devType/pageDevTypeList',
method: 'POST',
data: params
})
} }

View File

@@ -0,0 +1,103 @@
import request from '@/utils/request'
// 新增敏感用户
export function saveUser(data: any) {
return request({
url: '/device-boot/pqSensitiveUser/save',
method: 'post',
data: data
})
}
// 修改敏感用户
export function updateUser(data: any) {
return request({
url: '/device-boot/pqSensitiveUser/update',
method: 'post',
data: data
})
}
// 删除敏感用户
export function deleteUser(data: any) {
return request({
url: '/device-boot/pqSensitiveUser/delete',
method: 'post',
data: data
})
}
/**
* 干扰源接入功能删除流程
*/
export const deleteUserReport = (data: any) => {
return request({
url: '/device-boot/userReport/deleteUserReport',
method: 'POST',
data
})
}
/**
* 提交表单数据
*/
export const submitFormData = (data: any) => {
return request({
url: '/device-boot/userReport/add',
method: 'POST',
data: data
})
}
// 根据id获取用户档案录入的详细数据
export const getById = (data: any) => {
return request({
url: '/device-boot/userReport/getById',
method: 'get',
params: data
})
}
/**
* 提交表单数据
*/
export const addEditor = (data: any) => {
return request({
url: '/device-boot/userReportRenewal/addEditor',
method: 'POST',
data: data
})
}
// 根据id获取用户档案录入的详细数据
export const getByDeptDevLine = (params: any) => {
return request({
url: '/device-boot/line/getByDeptDevLine',
method: 'get',
params
})
}
/**
* 根据id获取用户档案录入的详细数据
*/
export const getUserReportUpdateById = (id: any) => {
return request({
url: '/device-boot/userReportRenewal/getUserReportUpdateById?businessId='+id,
method: 'POST',
})
}
// 根据id获取用户档案录入的详细数据
export const getUserReportById = (id: any) => {
return request({
url: '/device-boot/userReport/getUserReportById?id='+id,
method: 'get'
})
}
// 根据id查询文件信息集合
export const getFileById = (params: any) => {
return request({
url: '/device-boot/fileUrl/getFileById',
method: 'get',
params
})
}

View File

@@ -2,13 +2,35 @@ import createAxios from '@/utils/request'
import { genFileId, ElMessage, ElNotification } from 'element-plus' import { genFileId, ElMessage, ElNotification } from 'element-plus'
//事件报告 //事件报告
// export function getEventReport(data) {
// return createAxios({
// url: '/event-boot/report/getEventReport',
// method: 'post',
// data
// })
// }
export function getEventReport(data) { export function getEventReport(data) {
return createAxios({ return createAxios({
url: '/event-boot/report/getEventReport', url: '/event-boot/report/createEventReport',
method: 'post', method: 'post',
data data,
responseType: 'blob'
}).then(async res => {
let load: any = await readJsonBlob(res)
if (load.code) {
if (load.data.code == 'A0011') {
ElMessage.warning('下载失败!')
} else {
ElMessage.warning(load.data.message)
}
} else {
return res
}
}) })
} }
// 生成报告 // 生成报告
export function getAreaReport(data) { export function getAreaReport(data) {
return createAxios({ return createAxios({

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

@@ -0,0 +1,42 @@
import request from "@/utils/request";
//查询所有模板
export function getList(data: any) {
return request({
url: "/system-boot/EventTemplate/getList",
method: "post",
data,
});
}
//字典树
export function getDictTree(data: any) {
return request({
url: "/system-boot/reportDict/DictTree",
method: "post",
params:data
});
}
//新增模板
export function addData(data: any) {
return request({
url: "/system-boot/EventTemplate/add",
method: "post",
data,
});
}
//修改模板
export function updateData(data: any) {
return request({
url: "/system-boot/EventTemplate/update",
method: "post",
data,
});
}
//删除模板
export function deleteData(data: any) {
return request({
url: "/system-boot/EventTemplate/delete",
method: "post",
data,
});
}

View File

@@ -0,0 +1,43 @@
import request from '@/utils/request'
//获取字典树数据
export function getDictTree(data) {
return request({
url: "/system-boot/reportDict/DictTree",
method: "post",
params:data
});
}
//查询字典列表
export function getReportDictList(data: any) {
return request({
url: "/system-boot/reportDict/getReportDictList",
method: "post",
data
});
}
//新增字典表
export function addDict(data: any) {
return request({
url: "/system-boot/reportDict/addDict",
method: "post",
data
});
}
//更新字典表
export function updateDict(data: any) {
return request({
url: "/system-boot/reportDict/updateDict",
method: "put",
data
});
}
//删除字典表
export function deleteDict(data: any) {
return request({
url: "/system-boot/reportDict/deleteDict",
method: "delete",
params:data
});
}

View File

@@ -0,0 +1,37 @@
import request from '@/utils/request'
//区域树形表格接口
export function areaTree(data: any) {
return request({
url: '/system-boot/area/areaTree',
method: 'post',
params: data,
})
}
export function areaAdd(data: any) {
return request({
url: '/system-boot/area/add',
method: 'post',
data: data,
})
}
export function areaDelete(data: any) {
return request({
url: '/system-boot/area/delete',
method: 'post',
data: data,
})
}
export function update(data: any) {
return request({
url: '/system-boot/area/update',
method: 'post',
data: data,
})
}
export function selectPid(data: any) {
return request({
url: '/system-boot/area/selectPid',
method: 'post',
data: data,
})
}

BIN
src/assets/logo/海南.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
src/assets/logo/灿能.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/logo/电网.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

BIN
src/assets/logo/电网1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

View File

@@ -17,6 +17,7 @@ const config = useConfig()
// import { nextTick } from 'process' // import { nextTick } from 'process'
const emit = defineEmits(['triggerPoint', 'group', 'echartClick']) const emit = defineEmits(['triggerPoint', 'group', 'echartClick'])
color[0] = config.layout.elementUiPrimary[0] color[0] = config.layout.elementUiPrimary[0]
const chartRef = ref<HTMLDivElement>() const chartRef = ref<HTMLDivElement>()
const props = defineProps(['options', 'isInterVal', 'pieInterVal']) const props = defineProps(['options', 'isInterVal', 'pieInterVal'])

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -16,18 +16,12 @@
:value="item.value" :value="item.value"
></el-option> ></el-option>
</el-select> </el-select>
<!-- <el-button v-if="view2 && senior" class="ml10" type="primary" <!-- <el-button v-if="view2 && senior" class="ml10" type="primary" @click="AdvancedAnalytics">
@click="AdvancedAnalytics">高级分析</el-button> --> 高级分析
</el-button> -->
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-button <el-button @click="backbxlb" icon="el-icon-Back" style="float: right">返回</el-button>
@click="backbxlb"
class="el-icon-refresh-right"
icon="el-icon-Back"
style="float: right"
>
返回
</el-button>
</el-col> </el-col>
</el-row> </el-row>
<div v-loading="loading" style="height: calc(100vh - 190px)"> <div v-loading="loading" style="height: calc(100vh - 190px)">
@@ -108,12 +102,12 @@ const options = ref([
const shushiboxiRef = ref() const shushiboxiRef = ref()
const bxecharts = ref(mainHeight(95).height as any) const bxecharts = ref(mainHeight(95).height as any)
const view2 = ref(true) const view2 = ref(true)
const boxoList = ref(null) const boxoList: any = ref(null)
const wp = ref(null) const wp = ref(null)
const showBoxi = ref(true) const showBoxi = ref(true)
const view3 = ref(false) const view3 = ref(false)
const view4 = ref(false) const view4 = ref(false)
const GJList = ref([]) const GJList = ref({})
const open = async (row: any) => { const open = async (row: any) => {
loading.value = true loading.value = true
@@ -122,6 +116,7 @@ const open = async (row: any) => {
row.loading = false row.loading = false
if (res != undefined) { if (res != undefined) {
boxoList.value = row boxoList.value = row
boxoList.value.pt = res.data.pt
wp.value = res.data wp.value = res.data
loading.value = false loading.value = false
view4.value = true view4.value = true
@@ -129,6 +124,7 @@ const open = async (row: any) => {
}) })
.catch(() => { .catch(() => {
loading.value = false loading.value = false
backbxlb()
}) })
} }
const bxhandleClick = (tab: any) => { const bxhandleClick = (tab: any) => {
@@ -168,10 +164,13 @@ const AdvancedAnalytics = () => {
analysis({ analysis({
eventIndex: boxoList.value.eventId eventIndex: boxoList.value.eventId
}).then(res => { }).then(res => {
GJList.value = res.data // GJList.value = res.data
view3.value = true // view3.value = true
view2.value = false // view2.value = false
}) })
GJList.value = {}
view3.value = true
view2.value = false
} }
const changeView = () => { const changeView = () => {
if (shushiboxiRef.value) shushiboxiRef.value.backbxlb() if (shushiboxiRef.value) shushiboxiRef.value.backbxlb()

View File

@@ -264,7 +264,7 @@ const setTheDate = (val: any) => {
} }
// 导出 // 导出
const onExport = () => { const onExport = () => {
tableStore.onTableAction('export', { showAllFlag: true }) tableStore.onTableAction('export', { showAllFlag: true })
} }

View File

@@ -79,7 +79,7 @@ const init = async () => {
// 设置消息接收回调 // 设置消息接收回调
mqttClient.onMessage((topic, message) => { mqttClient.onMessage((topic, message) => {
const msg = JSON.parse(message.toString()) const msg = JSON.parse(message.toString())
console.log('🚀 ~ init ~ msg:', msg) // console.log('🚀 ~ init ~ msg:', msg)
if (msg.deptList.includes(adminInfo.$state.deptId)) { if (msg.deptList.includes(adminInfo.$state.deptId)) {
drawer.value = true drawer.value = true
isLoading.value = true isLoading.value = true
@@ -90,7 +90,7 @@ const init = async () => {
} }
}) })
} catch (error) { } catch (error) {
console.error('MQTT 初始化失败:', error) // console.error('MQTT 初始化失败:', error)
} }
} }
onMounted(() => { onMounted(() => {

View File

@@ -122,7 +122,7 @@ const onFullScreen = () => {
}) })
} }
const handleCommand = (key: string) => { const handleCommand = async(key: string) => {
console.log(key) console.log(key)
switch (key) { switch (key) {
case 'adminInfo': case 'adminInfo':
@@ -132,10 +132,17 @@ const handleCommand = (key: string) => {
popupPwd.value.open() popupPwd.value.open()
break break
case 'layout': case 'layout':
navTabs.closeTabs() await window.location.reload()
window.localStorage.clear() setTimeout(() => {
adminInfo.reset() navTabs.closeTabs()
router.push({ name: 'login' }) window.localStorage.clear()
adminInfo.reset()
router.push({ name: 'login' })
}, 0)
// navTabs.closeTabs()
// window.localStorage.clear()
// adminInfo.reset()
// router.push({ name: 'login' })
break break
default: default:
break break

View File

@@ -1,246 +1,246 @@
import { reactive } from 'vue' import { reactive } from 'vue'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { STORE_CONFIG } from '@/stores/constant/cacheKey' import { STORE_CONFIG } from '@/stores/constant/cacheKey'
import type { Layout } from '@/stores/interface' import type { Layout } from '@/stores/interface'
export const useConfig = defineStore( export const useConfig = defineStore(
'config', 'config',
() => { () => {
const layout: Layout = reactive({ const layout: Layout = reactive({
/* 全局 */ /* 全局 */
showDrawer: false, showDrawer: false,
// 是否收缩布局(小屏终端) // 是否收缩布局(小屏终端)
shrink: false, shrink: false,
// 后台布局方式,可选值<Default|Classic|Streamline|Double> // 后台布局方式,可选值<Default|Classic|Streamline|Double>
layoutMode: 'Classic', layoutMode: 'Classic',
// 后台主页面切换动画,可选值<slide-right|slide-left|el-fade-in-linear|el-fade-in|el-zoom-in-center|el-zoom-in-top|el-zoom-in-bottom> // 后台主页面切换动画,可选值<slide-right|slide-left|el-fade-in-linear|el-fade-in|el-zoom-in-center|el-zoom-in-top|el-zoom-in-bottom>
mainAnimation: 'slide-right', mainAnimation: 'slide-right',
// 是否暗黑模式 // 是否暗黑模式
isDark: false, isDark: false,
elementUiPrimary: ['#002B6A', '#002B6A'], elementUiPrimary: ['#002B6A', '#002B6A'],
tableHeaderBackground: ['#F3F6F9', '#F3F6F9'], tableHeaderBackground: ['#F3F6F9', '#F3F6F9'],
tableHeaderColor: ['#111', '#fff'], tableHeaderColor: ['#111', '#fff'],
tableCurrent: ['#F3F6F9', '#F3F6F9'], tableCurrent: ['#F3F6F9', '#F3F6F9'],
/* 侧边菜单 */ /* 侧边菜单 */
// 侧边菜单背景色 // 侧边菜单背景色
menuBackground: ['#002B6A', '#1d1e1f'], menuBackground: ['#002B6A', '#1d1e1f'],
// 侧边菜单文字颜色 // 侧边菜单文字颜色
menuColor: ['#FFFFFF', '#CFD3DC'], menuColor: ['#FFFFFF', '#CFD3DC'],
// 侧边菜单激活项背景色 // 侧边菜单激活项背景色
menuActiveBackground: ['#002255', '#1d1e1f'], menuActiveBackground: ['#002255', '#1d1e1f'],
// 侧边菜单激活项文字色 // 侧边菜单激活项文字色
menuActiveColor: ['#409eff', '#3375b9'], menuActiveColor: ['#409eff', '#3375b9'],
// 侧边菜单顶栏背景色 // 侧边菜单顶栏背景色
menuTopBarBackground: ['#002B6A', '#1d1e1f'], menuTopBarBackground: ['#002B6A', '#1d1e1f'],
// 侧边菜单宽度(展开时)单位px // 侧边菜单宽度(展开时)单位px
menuWidth: 260, menuWidth: 260,
// 侧边菜单项默认图标 // 侧边菜单项默认图标
menuDefaultIcon: 'fa fa-circle-o', menuDefaultIcon: 'fa fa-circle-o',
// 是否水平折叠收起菜单 // 是否水平折叠收起菜单
menuCollapse: false, menuCollapse: false,
// 是否只保持一个子菜单的展开(手风琴) // 是否只保持一个子菜单的展开(手风琴)
menuUniqueOpened: false, menuUniqueOpened: false,
// 显示菜单栏顶栏(LOGO) // 显示菜单栏顶栏(LOGO)
menuShowTopBar: true, menuShowTopBar: true,
/* 顶栏 */ /* 顶栏 */
// 顶栏文字色 // 顶栏文字色
headerBarTabColor: ['#FFFFFF', '#CFD3DC'], headerBarTabColor: ['#FFFFFF', '#CFD3DC'],
// // 顶栏激活项背景色 // // 顶栏激活项背景色
headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'], headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
// 顶栏激活项文字色 // 顶栏激活项文字色
headerBarTabActiveColor: ['#000000', '#409EFF'], headerBarTabActiveColor: ['#000000', '#409EFF'],
// 顶栏背景色 // 顶栏背景色
headerBarBackground: ['#002B6A', '#1d1e1f'], headerBarBackground: ['#002B6A', '#1d1e1f'],
// 顶栏悬停时背景色 // 顶栏悬停时背景色
headerBarHoverBackground: ['#f5f5f5', '#18222c'] headerBarHoverBackground: ['#f5f5f5', '#18222c']
}) })
const lang = reactive({ const lang = reactive({
// 默认语言,可选值<zh-cn|en> // 默认语言,可选值<zh-cn|en>
defaultLang: 'zh-cn', defaultLang: 'zh-cn',
// 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译 // 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
fallbackLang: 'zh-cn', fallbackLang: 'zh-cn',
// 支持的语言列表 // 支持的语言列表
langArray: [ langArray: [
{ name: 'zh-cn', value: '中文简体' }, { name: 'zh-cn', value: '中文简体' },
{ name: 'en', value: 'English' } { name: 'en', value: 'English' }
] ]
}) })
function menuWidth() { function menuWidth() {
if (layout.shrink) { if (layout.shrink) {
return layout.menuCollapse ? '0px' : layout.menuWidth + 'px' return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
} }
// 菜单是否折叠 // 菜单是否折叠
return layout.menuCollapse ? '64px' : layout.menuWidth + 'px' return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
} }
function setLang(val: string) { function setLang(val: string) {
lang.defaultLang = val lang.defaultLang = val
} }
function onSetLayoutColor(data = layout.layoutMode) { function onSetLayoutColor(data = layout.layoutMode) {
// 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值 // 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
const tempValue = layout.isDark const tempValue = layout.isDark
? { idx: 1, color: '#1d1e1f', newColor: '#141414' } ? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
: { idx: 0, color: '#ffffff', newColor: '#f5f5f5' } : { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
if ( if (
data == 'Classic' && data == 'Classic' &&
layout.headerBarBackground[tempValue.idx] == tempValue.color && layout.headerBarBackground[tempValue.idx] == tempValue.color &&
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
) { ) {
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
} else if ( } else if (
data == 'Default' && data == 'Default' &&
layout.headerBarBackground[tempValue.idx] == tempValue.color && layout.headerBarBackground[tempValue.idx] == tempValue.color &&
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
) { ) {
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
} }
} }
function setLayoutMode(data: string) { function setLayoutMode(data: string) {
layout.layoutMode = data layout.layoutMode = data
onSetLayoutColor(data) onSetLayoutColor(data)
} }
const setLayout = (name: keyof Layout, value: any) => { const setLayout = (name: keyof Layout, value: any) => {
layout[name] = value as never layout[name] = value as never
} }
const getColorVal = function (name: keyof Layout): string { const getColorVal = function (name: keyof Layout): string {
const colors = layout[name] as string[] const colors = layout[name] as string[] || ['#082E6C', '#0e8780']
if (layout.isDark) { if (layout.isDark) {
return colors[1] return colors[1]
} else { } else {
return colors[0] return colors[0]
} }
} }
return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor } return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
}, },
// () => { // () => {
// //
// console.log('🚀 ~ subject:', subject) // console.log('🚀 ~ subject:', subject)
// const layout: Layout = reactive({ // const layout: Layout = reactive({
// /* 全局 */ // /* 全局 */
// showDrawer: false, // showDrawer: false,
// // 是否收缩布局(小屏终端) // // 是否收缩布局(小屏终端)
// shrink: false, // shrink: false,
// // 后台布局方式,可选值<Default|Classic|Streamline|Double> // // 后台布局方式,可选值<Default|Classic|Streamline|Double>
// layoutMode: 'Classic', // layoutMode: 'Classic',
// // 后台主页面切换动画,可选值<slide-right|slide-left|el-fade-in-linear|el-fade-in|el-zoom-in-center|el-zoom-in-top|el-zoom-in-bottom> // // 后台主页面切换动画,可选值<slide-right|slide-left|el-fade-in-linear|el-fade-in|el-zoom-in-center|el-zoom-in-top|el-zoom-in-bottom>
// mainAnimation: subject.mainAnimation, // mainAnimation: subject.mainAnimation,
// // 是否暗黑模式 // // 是否暗黑模式
// isDark: false, // isDark: false,
// elementUiPrimary: JSON.parse(subject.elementUiPrimary), // elementUiPrimary: JSON.parse(subject.elementUiPrimary),
// tableHeaderBackground: JSON.parse(subject.tableHeaderBackground), // tableHeaderBackground: JSON.parse(subject.tableHeaderBackground),
// tableHeaderColor:JSON.parse(subject.tableHeaderColor), // tableHeaderColor:JSON.parse(subject.tableHeaderColor),
// tableCurrent: JSON.parse(subject.tableCurrent), // tableCurrent: JSON.parse(subject.tableCurrent),
// /* 侧边菜单 */ // /* 侧边菜单 */
// // 侧边菜单背景色 // // 侧边菜单背景色
// menuBackground: JSON.parse(subject.menuBackground), // menuBackground: JSON.parse(subject.menuBackground),
// // 侧边菜单文字颜色 // // 侧边菜单文字颜色
// menuColor:JSON.parse(subject.menuColor), // menuColor:JSON.parse(subject.menuColor),
// // 侧边菜单激活项背景色 // // 侧边菜单激活项背景色
// menuActiveBackground:JSON.parse(subject.menuActiveBackground), // menuActiveBackground:JSON.parse(subject.menuActiveBackground),
// // 侧边菜单激活项文字色 // // 侧边菜单激活项文字色
// menuActiveColor:JSON.parse(subject.menuActiveColor), // menuActiveColor:JSON.parse(subject.menuActiveColor),
// // 侧边菜单顶栏背景色 // // 侧边菜单顶栏背景色
// menuTopBarBackground: JSON.parse(subject.menuTopBarBackground), // menuTopBarBackground: JSON.parse(subject.menuTopBarBackground),
// // 侧边菜单宽度(展开时)单位px // // 侧边菜单宽度(展开时)单位px
// menuWidth: 260, // menuWidth: 260,
// // 侧边菜单项默认图标 // // 侧边菜单项默认图标
// menuDefaultIcon: 'fa fa-circle-o', // menuDefaultIcon: 'fa fa-circle-o',
// // 是否水平折叠收起菜单 // // 是否水平折叠收起菜单
// menuCollapse: false, // menuCollapse: false,
// // 是否只保持一个子菜单的展开(手风琴) // // 是否只保持一个子菜单的展开(手风琴)
// menuUniqueOpened: false, // menuUniqueOpened: false,
// // 显示菜单栏顶栏(LOGO) // // 显示菜单栏顶栏(LOGO)
// menuShowTopBar: true, // menuShowTopBar: true,
// /* 顶栏 */ // /* 顶栏 */
// // 顶栏文字色 // // 顶栏文字色
// headerBarTabColor:JSON.parse(subject.headerBarTabColor), // headerBarTabColor:JSON.parse(subject.headerBarTabColor),
// // // 顶栏激活项背景色 // // // 顶栏激活项背景色
// headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'], // headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
// // 顶栏激活项文字色 // // 顶栏激活项文字色
// headerBarTabActiveColor: ['#000000', '#409EFF'], // headerBarTabActiveColor: ['#000000', '#409EFF'],
// // 顶栏背景色 // // 顶栏背景色
// headerBarBackground: JSON.parse(subject.headerBarBackground), // headerBarBackground: JSON.parse(subject.headerBarBackground),
// // 顶栏悬停时背景色 // // 顶栏悬停时背景色
// headerBarHoverBackground: ['#f5f5f5', '#18222c'] // headerBarHoverBackground: ['#f5f5f5', '#18222c']
// }) // })
// // console.log(123, window.localStorage.getItem('getTheme')) // // console.log(123, window.localStorage.getItem('getTheme'))
// const lang = reactive({ // const lang = reactive({
// // 默认语言,可选值<zh-cn|en> // // 默认语言,可选值<zh-cn|en>
// defaultLang: 'zh-cn', // defaultLang: 'zh-cn',
// // 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译 // // 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
// fallbackLang: 'zh-cn', // fallbackLang: 'zh-cn',
// // 支持的语言列表 // // 支持的语言列表
// langArray: [ // langArray: [
// { name: 'zh-cn', value: '中文简体' }, // { name: 'zh-cn', value: '中文简体' },
// { name: 'en', value: 'English' } // { name: 'en', value: 'English' }
// ] // ]
// }) // })
// function menuWidth() { // function menuWidth() {
// if (layout.shrink) { // if (layout.shrink) {
// return layout.menuCollapse ? '0px' : layout.menuWidth + 'px' // return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
// } // }
// // 菜单是否折叠 // // 菜单是否折叠
// return layout.menuCollapse ? '64px' : layout.menuWidth + 'px' // return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
// } // }
// function setLang(val: string) { // function setLang(val: string) {
// lang.defaultLang = val // lang.defaultLang = val
// } // }
// function onSetLayoutColor(data = layout.layoutMode) { // function onSetLayoutColor(data = layout.layoutMode) {
// // 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值 // // 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
// const tempValue = layout.isDark // const tempValue = layout.isDark
// ? { idx: 1, color: '#1d1e1f', newColor: '#141414' } // ? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
// : { idx: 0, color: '#ffffff', newColor: '#f5f5f5' } // : { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
// if ( // if (
// data == 'Classic' && // data == 'Classic' &&
// layout.headerBarBackground[tempValue.idx] == tempValue.color && // layout.headerBarBackground[tempValue.idx] == tempValue.color &&
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color // layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
// ) { // ) {
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor // layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
// } else if ( // } else if (
// data == 'Default' && // data == 'Default' &&
// layout.headerBarBackground[tempValue.idx] == tempValue.color && // layout.headerBarBackground[tempValue.idx] == tempValue.color &&
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor // layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
// ) { // ) {
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color // layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
// } // }
// } // }
// function setLayoutMode(data: string) { // function setLayoutMode(data: string) {
// layout.layoutMode = data // layout.layoutMode = data
// onSetLayoutColor(data) // onSetLayoutColor(data)
// } // }
// const setLayout = (name: keyof Layout, value: any) => { // const setLayout = (name: keyof Layout, value: any) => {
// layout[name] = value as never // layout[name] = value as never
// } // }
// const getColorVal = function (name: keyof Layout): string { // const getColorVal = function (name: keyof Layout): string {
// const colors = layout[name] as string[] // const colors = layout[name] as string[]
// if (layout.isDark) { // if (layout.isDark) {
// return colors[1] // return colors[1]
// } else { // } else {
// return colors[0] // return colors[0]
// } // }
// } // }
// return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor } // return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
// }, // },
{ {
persist: { persist: {
key: STORE_CONFIG key: STORE_CONFIG
} }
} }
) )

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

@@ -50,13 +50,17 @@ class MQTT {
if (this.client) { if (this.client) {
throw new Error('MQTT 客户端已初始化') throw new Error('MQTT 客户端已初始化')
} }
const mqttUrl = localStorage.getItem('MqttUrl')
console.log('MQTT URL:', mqttUrl)
if (!mqttUrl || mqttUrl === 'null') {
return Promise.resolve()
}
try { try {
const mqttUrl = // const mqttUrl =
localStorage.getItem('MqttUrl') == 'null' // localStorage.getItem('MqttUrl') == 'null'
? 'ws://192.168.1.68:8083/mqtt' // ? 'ws://192.168.1.68:8083/mqtt'
: localStorage.getItem('MqttUrl') // : localStorage.getItem('MqttUrl')
if (mqttUrl == 'null'||mqttUrl == null) return
this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions) this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions)
this.setupEventListeners() this.setupEventListeners()
@@ -77,12 +81,12 @@ class MQTT {
this.client?.on('error', error => { this.client?.on('error', error => {
clearTimeout(timeout) clearTimeout(timeout)
console.error('MQTT 连接错误:', error) console.log('MQTT 连接错误:', error)
reject(error) reject(error)
}) })
}) })
} catch (error) { } catch (error) {
console.error('初始化 MQTT 失败:', error) // console.log('初始化 MQTT 失败:', error)
throw error throw error
} }
} }
@@ -131,7 +135,7 @@ class MQTT {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.client?.subscribe(this.topic, { qos: this.defaultOptions.qos, ...subscribeOptions }, error => { this.client?.subscribe(this.topic, { qos: this.defaultOptions.qos, ...subscribeOptions }, error => {
if (error) { if (error) {
console.error('订阅失败:', error) console.log('订阅失败:', error)
reject(error) reject(error)
} else { } else {
console.log('订阅成功') console.log('订阅成功')
@@ -153,7 +157,7 @@ class MQTT {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.client?.unsubscribe(this.topic, error => { this.client?.unsubscribe(this.topic, error => {
if (error) { if (error) {
console.error('取消订阅失败:', error) console.log('取消订阅失败:', error)
reject(error) reject(error)
} else { } else {
console.log('取消订阅成功') console.log('取消订阅成功')
@@ -188,7 +192,7 @@ class MQTT {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.client?.publish(this.topic, message, { qos: this.defaultOptions.qos, ...options }, error => { this.client?.publish(this.topic, message, { qos: this.defaultOptions.qos, ...options }, error => {
if (error) { if (error) {
console.error('消息发布失败:', error) console.log('消息发布失败:', error)
reject(error) reject(error)
} else { } else {
console.log('消息发布成功') console.log('消息发布成功')

View File

@@ -104,11 +104,11 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
if (token) { if (token) {
;(config.headers as anyObj).Authorization = token ;(config.headers as anyObj).Authorization = token
} else { } else {
config.headers.Authorization = 'Basic bmpjbnRlc3Q6bmpjbnBxcw==' config.headers.Authorization = 'Basic bmpjbjpuamNucHFz'
} }
} }
if (config.url == '/user-boot/user/generateSm2Key' || config.url == '/pqs-auth/oauth/token') { if (config.url == '/user-boot/user/generateSm2Key' || config.url == '/pqs-auth/oauth/token') {
config.headers.Authorization = 'Basic bmpjbnRlc3Q6bmpjbnBxcw==' config.headers.Authorization = 'Basic bmpjbjpuamNucHFz'
} }
return config return config
@@ -145,12 +145,14 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
return refreshToken() return refreshToken()
.then(res => { .then(res => {
adminInfo.setToken(res.data.access_token, 'auth') adminInfo.setToken(res.data.access_token, 'auth')
adminInfo.setToken(res.data.refresh_token, 'refresh')
window.requests.forEach(cb => cb(res.data.access_token)) window.requests.forEach(cb => cb(res.data.access_token))
window.requests = [] window.requests = []
return Axios(response.config) return Axios(response.config)
}) })
.catch(err => { .catch(err => {
window.location.reload()
adminInfo.removeToken() adminInfo.removeToken()
router.push({ name: 'login' }) router.push({ name: 'login' })
return Promise.reject(err) return Promise.reject(err)

View File

@@ -77,6 +77,7 @@ export default class TableStore {
} }
index() { index() {
this.table.beforeSearchFun && this.table.beforeSearchFun() this.table.beforeSearchFun && this.table.beforeSearchFun()
this.table.data = [] this.table.data = []
this.table.loading = true this.table.loading = true
@@ -97,10 +98,12 @@ export default class TableStore {
url: this.url, url: this.url,
method: this.method method: this.method
}, },
requestPayload(this.method, this.table.params, this.paramsPOST) requestPayload(this.method, this.table.params, this.paramsPOST)
) )
) )
.then((res: any) => { .then((res: any) => {
if (res.data) { if (res.data) {
this.table.data = res.data.records || res.data this.table.data = res.data.records || res.data
this.table.total = res.data?.total || res.data.length || 0 this.table.total = res.data?.total || res.data.length || 0
@@ -129,13 +132,15 @@ export default class TableStore {
* @param data 携带数据 * @param data 携带数据
*/ */
onTableAction = (event: string, data: anyObj) => { onTableAction = (event: string, data: anyObj) => {
const actionFun = new Map([ const actionFun = new Map([
[ [
'search', 'search',
() => { () => {
this.table.params.pageNum = 1 this.table.params.pageNum = 1
this.index() this.index()
} }
], ],
[ [
@@ -201,9 +206,10 @@ export default class TableStore {
[ [
'export', 'export',
() => { () => {
this.table.exportLoading = true this.table.exportLoading = true
// this.index() // this.index()
//console.log('export')
let params = { ...this.table.params, pageNum: 1, pageSize: this.table.total } let params = { ...this.table.params, pageNum: 1, pageSize: this.table.total }
createAxios( createAxios(
Object.assign( Object.assign(
@@ -219,7 +225,7 @@ export default class TableStore {
this.table.exportProcessingData && this.table.exportProcessingData() this.table.exportProcessingData && this.table.exportProcessingData()
this.table.allFlag = data.showAllFlag || true this.table.allFlag = data.showAllFlag || true
this.table.exportLoading = false this.table.exportLoading = false
}) })
.catch(() => { .catch(() => {
this.table.exportLoading = false this.table.exportLoading = false

View File

@@ -38,6 +38,7 @@ const tableStore = new TableStore({
echarts.value.Grade(tableStore.table.data.voltageStatistics) echarts.value.Grade(tableStore.table.data.voltageStatistics)
echarts.value.Relation(tableStore.table.data.monthlyStatistics) echarts.value.Relation(tableStore.table.data.monthlyStatistics)
table.value.info(tableStore.table.data) table.value.info(tableStore.table.data)
} }
}) })
provide('tableStore', tableStore) provide('tableStore', tableStore)

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)
@@ -844,7 +844,7 @@ onMounted(() => {
} }
.btnBox { .btnBox {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
:deep(.vxe-table--header thead tr:first-of-type th:first-of-type) { :deep(.vxe-table--header thead tr:first-of-type th:first-of-type) {

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

@@ -1,163 +1,163 @@
<template> <template>
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" title="设备"> <el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" title="设备">
<div class="formBox mb10"><el-button icon="el-icon-Plus" type="primary" @click="add">新增</el-button></div> <div class="formBox mb10"><el-button icon="el-icon-Plus" type="primary" @click="add">新增</el-button></div>
<vxe-table v-bind="defaultAttribute" v-loading="loading" height="500px" ref="xTable" :data="userData"> <vxe-table v-bind="defaultAttribute" v-loading="loading" height="500px" ref="xTable" :data="userData">
<vxe-column field="devName" title="设备名称"></vxe-column> <vxe-column field="devName" title="设备名称"></vxe-column>
<vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column> <vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column>
<vxe-column field="protocolCapacity" title="设备容量(MVA)"></vxe-column> <vxe-column field="protocolCapacity" title="设备容量(MVA)"></vxe-column>
<vxe-column title="操作" width="120px"> <vxe-column title="操作" width="120px">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" size="small" link @click="revise(row)">修改</el-button> <el-button type="primary" size="small" link @click="revise(row)">修改</el-button>
<el-popconfirm @confirm="deleteD(row)" title="确认删除设备?"> <el-popconfirm @confirm="deleteD(row)" title="确认删除设备?">
<template #reference> <template #reference>
<el-button type="danger" size="small" link>删除</el-button> <el-button type="danger" size="small" link>删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
</el-dialog> </el-dialog>
<el-dialog draggable v-model="addShow" width="400px" :title="title" :before-close="handleClose"> <el-dialog draggable v-model="addShow" width="400px" :title="title" :before-close="handleClose">
<el-form :model="form" ref="formRef" :rules="rules" label-width="auto"> <el-form :model="form" ref="formRef" :rules="rules" label-width="auto">
<el-form-item label="设备名称" prop="devName"> <el-form-item label="设备名称" prop="devName">
<el-input <el-input
v-model.trim="form.devName" v-model.trim="form.devName"
placeholder="请输入设备名称" placeholder="请输入设备名称"
maxlength="32" maxlength="32"
show-word-limit show-word-limit
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="电压等级" prop="devScale"> <el-form-item label="电压等级" prop="devScale">
<el-select v-model="form.devScale" clearable placeholder="请选择电压等级"> <el-select v-model="form.devScale" clearable placeholder="请选择电压等级">
<el-option v-for="item in levelList" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in levelList" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="设备容量(MVA)" prop="protocolCapacity"> <el-form-item label="设备容量(MVA)" prop="protocolCapacity">
<el-input-number <el-input-number
v-model="form.protocolCapacity" v-model="form.protocolCapacity"
style="width: 100%" style="width: 100%"
:min="0" :min="0"
:max="10000000" :max="10000000"
placeholder="请选择设备容量" placeholder="请选择设备容量"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="handleClose">取消</el-button> <el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button> <el-button type="primary" @click="submitForm">确定</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref } from 'vue'
import { queyDeviceList, addDev, updateDev, removeDev } from '@/api/advance-boot/bearingCapacity' import { queyDeviceList, addDev, updateDev, removeDev } from '@/api/advance-boot/bearingCapacity'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
const dictData = useDictData() const dictData = useDictData()
const levelList = dictData.getBasicData('Dev_Voltage_Stand') const levelList = dictData.getBasicData('Dev_Voltage_Stand')
const dialogVisible = ref(false) const dialogVisible = ref(false)
const addShow = ref(false) const addShow = ref(false)
const loading = ref(false) const loading = ref(false)
const userData = ref([]) const userData = ref([])
const rowList = ref([]) const rowList = ref([])
const title = ref('') const title = ref('')
const formRef = ref() const formRef = ref()
const form: any = ref({ const form: any = ref({
devName: '', devName: '',
devScale: '', devScale: '',
protocolCapacity: 0, protocolCapacity: 0,
userId: '' userId: ''
}) })
const rules = { const rules = {
devName: [{ required: true, message: '请输入设备名称', trigger: 'blur' }], devName: [{ required: true, message: '请输入设备名称', trigger: 'blur' }],
devScale: [{ required: true, message: '请输入设备名称', trigger: 'change' }], devScale: [{ required: true, message: '请输入设备名称', trigger: 'change' }],
protocolCapacity: [{ required: true, message: '请输入设备名称', trigger: 'blur' }] protocolCapacity: [{ required: true, message: '请输入设备名称', trigger: 'blur' }]
} }
const open = (row: any) => { const open = (row: any) => {
dialogVisible.value = true dialogVisible.value = true
loading.value = true loading.value = true
rowList.value = row rowList.value = row
queyDeviceList({ queyDeviceList({
userId: row.userId userId: row.userId
}).then(res => { }).then(res => {
loading.value = false loading.value = false
userData.value = res.data userData.value = res.data
}) })
} }
// 新增 // 新增
const add = () => { const add = () => {
addShow.value = true addShow.value = true
title.value = '新增设备' title.value = '新增设备'
} }
// 过滤数据 // 过滤数据
const formatter = (row: any) => { const formatter = (row: any) => {
if (row.column.field == 'devScale') { if (row.column.field == 'devScale') {
return levelList.filter(item => item.id == row.cellValue)[0].name return levelList.filter(item => item.id == row.cellValue)[0].name
} else { } else {
return row.cellValue return row.cellValue
} }
} }
// 修改 // 修改
const revise = (row: any) => { const revise = (row: any) => {
form.value = JSON.parse(JSON.stringify(row)) form.value = JSON.parse(JSON.stringify(row))
title.value = '修改设备' title.value = '修改设备'
addShow.value = true addShow.value = true
} }
// 关闭弹框 // 关闭弹框
const handleClose = () => { const handleClose = () => {
addShow.value = false addShow.value = false
form.value = { form.value = {
devName: '', devName: '',
devScale: '', devScale: '',
protocolCapacity: 0, protocolCapacity: 0,
userId: '' userId: ''
} }
formRef.value.resetFields() formRef.value.resetFields()
} }
// 新增设备 // 新增设备
const submitForm = async () => { const submitForm = async () => {
await formRef.value.validate(valid => { await formRef.value.validate(valid => {
if (valid) { if (valid) {
if (title.value == '新增设备') { if (title.value == '新增设备') {
form.value.userId = rowList.value.userId form.value.userId = rowList.value.userId
addDev(form.value).then(res => { addDev(form.value).then(res => {
ElMessage.success('新增成功!') ElMessage.success('新增成功!')
open(rowList.value) open(rowList.value)
handleClose() handleClose()
}) })
} else { } else {
updateDev(form.value).then(res => { updateDev(form.value).then(res => {
ElMessage.success('修改成功!') ElMessage.success('修改成功!')
open(rowList.value) open(rowList.value)
handleClose() handleClose()
}) })
} }
} }
}) })
} }
// 删除设备 // 删除设备
const deleteD = row => { const deleteD = row => {
removeDev({ devIds: row.devId }).then(res => { removeDev({ devIds: row.devId }).then(res => {
ElMessage.success('删除设备成功!') ElMessage.success('删除设备成功!')
open(rowList.value) open(rowList.value)
}) })
} }
defineExpose({ open }) defineExpose({ open })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.formBox{ .formBox{
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
</style> </style>

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: () => {}
console.log(tableStore.table.data)
}
}) })
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

@@ -40,7 +40,14 @@
></Table> ></Table>
</div> </div>
<div class="pd10" style="width: 400px" v-loading="loading"> <div class="pd10" style="width: 400px" v-loading="loading">
<el-input v-model="filterText" placeholder="请输入内容" clearable maxlength="32" show-word-limit @input="change"> <el-input
v-model="filterText"
placeholder="请输入内容"
clearable
maxlength="32"
show-word-limit
@input="change"
>
<template #prefix> <template #prefix>
<Icon name="el-icon-Search" style="font-size: 16px" /> <Icon name="el-icon-Search" style="font-size: 16px" />
</template> </template>
@@ -141,7 +148,7 @@
</el-form-item> </el-form-item>
<el-form-item label="最大终端数:" prop="nodeDevNum" class="top"> <el-form-item label="最大终端数:" prop="nodeDevNum" class="top">
<el-input <el-input
v-model="formData.nodeDevNum" v-model.trim.number="formData.nodeDevNum"
onkeyup="value = value.replace(/[^0-9]/g,'')" onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5" maxlength="5"
placeholder="请输入最大终端数" placeholder="请输入最大终端数"
@@ -149,7 +156,7 @@
</el-form-item> </el-form-item>
<el-form-item label="最大进程数:" prop="maxProcessNum" class="top"> <el-form-item label="最大进程数:" prop="maxProcessNum" class="top">
<el-input <el-input
v-model="formData.maxProcessNum" v-model.trim.number="formData.maxProcessNum"
onkeyup="value = value.replace(/[^0-9]/g,'')" onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5" maxlength="5"
placeholder="请根据监测点规模填写合适进程数1个进程最大可承载200个监测点" placeholder="请根据监测点规模填写合适进程数1个进程最大可承载200个监测点"
@@ -209,7 +216,8 @@ import {
updateNode, updateNode,
nodeDeviceTree, nodeDeviceTree,
updateDeviceProcess, updateDeviceProcess,
askRestartProcess askRestartProcess,
allotTerminal
} from '@/api/device-boot/Business' } from '@/api/device-boot/Business'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
@@ -272,7 +280,7 @@ const tableStore = new TableStore({
method: 'POST', method: 'POST',
column: [ column: [
{ title: '名称', field: 'name' }, { title: '名称', field: 'name' },
{ title: 'IP', field: 'ip' ,width:'120px' }, { title: 'IP', field: 'ip', width: '120px' },
{ {
title: '等级', title: '等级',
field: 'nodeGrade', field: 'nodeGrade',
@@ -289,7 +297,7 @@ const tableStore = new TableStore({
} }
}, },
{ {
title: '最大监测点数量', title: '最大终端数量',
field: 'nodeDevNum' field: 'nodeDevNum'
}, },
{ {
@@ -316,7 +324,8 @@ const tableStore = new TableStore({
{ title: '描述', field: 'remark' }, { title: '描述', field: 'remark' },
{ {
title: '操作',fixed: 'right', title: '操作',
fixed: 'right',
align: 'center', align: 'center',
width: '180', width: '180',
render: 'buttons', render: 'buttons',
@@ -351,7 +360,7 @@ const tableStore = new TableStore({
}, },
click: row => { click: row => {
askRestartProcess({ askRestartProcess({
deviceRebootType: null, deviceRebootType: 1,
nodeId: row.id, nodeId: row.id,
processNo: 1 processNo: 1
}).then(res => { }).then(res => {
@@ -375,8 +384,8 @@ const tableStore = new TableStore({
}, },
click: row => { click: row => {
if (hasDevices.value) { if (hasDevices.value) {
ElMessage.warning('此前置机绑定了设备,无法删除!'); ElMessage.warning('此前置机绑定了设备,无法删除!')
return; return
} }
delNode(row.id).then(res => { delNode(row.id).then(res => {
@@ -384,6 +393,31 @@ const tableStore = new TableStore({
tableStore.index() tableStore.index()
}) })
} }
},
{
name: 'edit',
title: '分配终端',
type: 'primary',
icon: 'InfoFilled',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'primary',
title: '确定分配终端吗?'
},
click: row => {
// if (!hasDevices.value) {
// ElMessage.warning('此前置机下无设备,无法分配终端!')
// return
// }
allotTerminal({
nodeId: row.id
}).then(res => {
ElMessage.success(res.message)
tableStore.index()
})
}
} }
] ]
} }
@@ -422,26 +456,25 @@ const currentChangeEvent = () => {
// 检查返回的数据是否存在且不为空 // 检查返回的数据是否存在且不为空
if (res.data && res.data.processDeviceList) { if (res.data && res.data.processDeviceList) {
// 检查是否有设备绑定 // 检查是否有设备绑定
const hasAnyDevices = res.data.processDeviceList.some(item => const hasAnyDevices = res.data.processDeviceList.some(
item.deviceInfoList && item.deviceInfoList.length > 0 item => item.deviceInfoList && item.deviceInfoList.length > 0
); )
hasDevices.value = hasAnyDevices; hasDevices.value = hasAnyDevices
dataSource.value = res.data.processDeviceList.filter(item => { dataSource.value = res.data.processDeviceList.filter(item => {
item.name = item.processNo + ''; item.name = item.processNo + ''
return true; // 保持原有的过滤逻辑 return true // 保持原有的过滤逻辑
}); })
} else { } else {
dataSource.value = [] dataSource.value = []
hasDevices.value = false; hasDevices.value = false
} }
loading.value = false loading.value = false
}) })
.catch(() => { .catch(() => {
// 添加错误处理,确保 loading 状态也能关闭 // 添加错误处理,确保 loading 状态也能关闭
dataSource.value = [] dataSource.value = []
hasDevices.value = false; hasDevices.value = false
loading.value = false loading.value = false
}) })
@@ -450,11 +483,11 @@ const currentChangeEvent = () => {
// 重启进程 // 重启进程
const restart = (data: any) => { const restart = (data: any) => {
// console.log('🚀 ~ restart ~ data:', data) // console.log('🚀 ~ restart ~ data:', data)
askRestartProcess({ askRestartProcess({
deviceRebootType: data.processNo, deviceRebootType: null,
nodeId: nodeId.value, nodeId: nodeId.value,
processNo: 2 processNo: data.processNo
}).then(res => { }).then(res => {
ElMessage.success('重启成功') ElMessage.success('重启成功')
currentChangeEvent() currentChangeEvent()
@@ -492,7 +525,7 @@ const filterNode = (value: string, data: any, node: any) => {
// 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配则返回该节点以及其下的所有子节点如果参数是子节点则返回该节点的父节点。name是中文字符enName是英文字符. // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配则返回该节点以及其下的所有子节点如果参数是子节点则返回该节点的父节点。name是中文字符enName是英文字符.
const chooseNode = (value: string, data: any, node: any) => { const chooseNode = (value: string, data: any, node: any) => {
if (data.name.indexOf(value) !== -1) { if ((data.subName + data.name).indexOf(value) !== -1) {
return true return true
} }
const level = node.level const level = node.level
@@ -603,7 +636,7 @@ const addMenu = () => {}
:deep(.default) { :deep(.default) {
display: flex; display: flex;
.row--current { .row--current {
// background-color: var(--el-color-primary-light-8) !important; // background-color: var(--el-color-primary-light-8) !important;
} }
} }
.custom-tree-node { .custom-tree-node {

View File

@@ -3,7 +3,7 @@
<TableHeader> <TableHeader>
<template #select> <template #select>
<el-form-item label="终端型号"> <el-form-item label="终端型号">
<el-select v-model="tableStore.table.params.teriminal" clearable placeholder="请选择终端型号"> <el-select v-model="tableStore.table.params.devType" clearable placeholder="请选择终端型号">
<el-option <el-option
v-for="item in teriminaloption" v-for="item in teriminaloption"
:key="item.id" :key="item.id"
@@ -13,7 +13,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端状态"> <el-form-item label="终端状态">
<el-select v-model="tableStore.table.params.teriminalstatus" clearable placeholder="请选择终端状态"> <el-select v-model="tableStore.table.params.runFlag" clearable placeholder="请选择终端状态">
<el-option <el-option
v-for="item in teriminalstatusoption" v-for="item in teriminalstatusoption"
:key="item.id" :key="item.id"
@@ -23,7 +23,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="通讯状态"> <el-form-item label="通讯状态">
<el-select v-model="tableStore.table.params.state" clearable placeholder="请选择通讯状态"> <el-select v-model="tableStore.table.params.comFlag" clearable placeholder="请选择通讯状态">
<el-option <el-option
v-for="item in stateoption" v-for="item in stateoption"
:key="item.id" :key="item.id"
@@ -42,7 +42,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="筛选数据"> <!-- <el-form-item label="筛选数据">
<el-input <el-input
v-model="tableStore.table.params.filterName" v-model="tableStore.table.params.filterName"
@keyup="searchEvent" @keyup="searchEvent"
@@ -50,7 +50,7 @@
show-word-limit show-word-limit
placeholder="输入关键字筛选" placeholder="输入关键字筛选"
/> />
</el-form-item> </el-form-item> -->
</template> </template>
<!-- <template #operation> <!-- <template #operation>
<el-button icon="el-icon-Download" @click="add">导出</el-button> <el-button icon="el-icon-Download" @click="add">导出</el-button>
@@ -252,9 +252,9 @@ const tableStore = new TableStore({
}, 0) }, 0)
} }
}) })
tableStore.table.params.teriminal = '' tableStore.table.params.devType = ''
tableStore.table.params.teriminalstatus = '' tableStore.table.params.runFlag = ''
tableStore.table.params.state = '' tableStore.table.params.comFlag = ''
tableStore.table.params.program = '' tableStore.table.params.program = ''
tableStore.table.params.searchEvent = '' tableStore.table.params.searchEvent = ''
tableStore.table.params.filterName = '' tableStore.table.params.filterName = ''

View File

@@ -1740,8 +1740,8 @@ const optionarr = ref([
]) ])
/**母线类型 */ /**母线类型 */
const busBarType = ref([ const busBarType = ref([
{ name: '母线', value: 0 }, { name: '实母线', value: 1 },
{ name: '虚拟母线', value: 1 } { name: '虚拟母线', value: 0 }
]) ])
const bigList: any = ref([]) const bigList: any = ref([])
const smallList: any = ref([]) const smallList: any = ref([])
@@ -1811,7 +1811,7 @@ const busBarDetail = ref({
/**电压等级 */ /**电压等级 */
scale: '', scale: '',
/**母线类型 */ /**母线类型 */
model: 0, model: 1,
/**母线id */ /**母线id */
subvIndex: '', subvIndex: '',
/**监测点 */ /**监测点 */

View File

@@ -0,0 +1,107 @@
<template>
<el-dialog class="cn-operate-dialog" width="600px" v-model.trim="dialogVisible" :title="title">
<el-form :model="form" class="form-one" label-width="auto" ref="formRef" :rules="rules">
<el-form-item label="所属厂站名称" prop="substationName">
<el-input v-model.trim="form.substationName" placeholder="请输入所属厂站名称"></el-input>
</el-form-item>
<el-form-item label="敏感用户名称" prop="name">
<el-input v-model.trim="form.name" placeholder="请输入敏感用户名称"></el-input>
</el-form-item>
<el-form-item label="敏感负荷类型" prop="loadType">
<el-select v-model.trim="form.loadType" filterable clearable placeholder="请选择数据分类">
<el-option
v-for="item in DataTypeSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户协议容量(MVA)" prop="userAgreementCapacity">
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.userAgreementCapacity" placeholder="请输入用户协议容量"></el-input-number>
</el-form-item>
<el-form-item label="装机容量(MW)" prop="installedCapacity">
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.installedCapacity" placeholder="请输入装机容量"></el-input-number>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.sort" placeholder="请输入排序"></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref,inject } from 'vue'
import { reactive } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import { queryByCode, queryCsDictTree } from '@/api/system-boot/dictTree'
import { saveUser, updateUser } from '@/api/device-boot/sensitiveLoadMange'
import { useDictData } from '@/stores/dictData'
const TypeOptions = ref()
const dictData = useDictData()
const DataTypeSelect = dictData.getBasicData('Interference_Source')
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
const form = reactive<any>({
loadType: [],
substationName: null,
installedCapacity: null,
name: null,
userAgreementCapacity:null,
id: null,
sort:100
})
const rules = {
substationName: [{ required: true, message: '请输入所属厂站名称', trigger: 'blur' }],
name: [{ required: true, message: '请输入敏感用户名称', trigger: 'blur' }],
loadType: [{ required: true, message: '请输入请选择敏感负荷类型', trigger: 'blur' }],
installedCapacity: [{ required: true, message: '请输入用户协议容量', trigger: 'blur' }],
userAgreementCapacity: [{ required: true, message: '请输入装机容量', trigger: 'blur' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
}
const dialogVisible = ref(false)
const title = ref('新增')
const open = (text: string, data?: anyObj) => {
formRef.value?.resetFields()
title.value = text
dialogVisible.value = true
if (data) {
for (let key in form) {
form[key] = data[key]
}
} else {
for (let key in form) {
form[key] = null
form.sort = 100
}
}
}
const submit = () => {
formRef.value.validate(async (valid: boolean) => {
if (valid) {
if (form.id) {
await updateUser(form)
} else {
await saveUser(form)
}
ElMessage.success('操作成功')
tableStore.index()
dialogVisible.value = false
}
})
}
defineExpose({ open })
</script>

View File

@@ -0,0 +1,117 @@
<template>
<div class="default-main">
<TableHeader :showReset="false" showExport>
<template #select>
<el-form-item label="关键字筛选">
<el-input
maxlength="32"
show-word-limit
style="width: 240px"
v-model.trim="tableStore.table.params.searchValue"
clearable
placeholder="请输入敏感负荷名称"
/>
</el-form-item>
</template>
<template #operation>
<el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增</el-button>
</template>
</TableHeader>
<Table ref="tableRef" />
<detail ref="detail"></detail>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import Detail from './detail.vue'
import { ElMessage } from 'element-plus'
import { deleteUser } from '@/api/device-boot/sensitiveLoadMange'
import { Plus } from '@element-plus/icons-vue'
import { useDictData } from '@/stores/dictData'
defineOptions({
name: 'govern/sensitiveLoadMange/index'
})
const detail = ref()
const dictData = useDictData()
const interferenceType = dictData.getBasicData('Interference_Source')
const tableStore: any = new TableStore({
url: '/device-boot/pqSensitiveUser/getList',
method: 'POST',
column: [
{
title: '序号',
width: 80,
formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '所属厂站名称', field: 'substationName', minWidth: 180 },
{ title: '敏感用户名称', field: 'name', minWidth: 180 },
{
title: '敏感负荷类型',
field: 'loadType',
minWidth: 120,
formatter: row => {
return interferenceType.filter(item => item.id == row.cellValue)[0]?.name
}
},
{ title: '用户协议容量(MVA)', field: 'userAgreementCapacity', minWidth: 100 },
{ title: '装机容量(MW)', field: 'installedCapacity', minWidth: 100 },
{
title: '操作', fixed: 'right',
align: 'center',
width: '180',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
detail.value.open('编辑', row)
}
},
{
name: 'del',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
deleteUser([row.id]).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
loadCallback: () => {}
})
tableStore.table.params.searchValue = ''
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
const addMenu = () => {
detail.value.open('新增')
}
</script>

View File

@@ -604,56 +604,74 @@ const maintenanceData = reactive({
//上节点选择 //上节点选择
const checkLeft = (checkedNodes: any, checkedKeys: any) => { const checkLeft = (checkedNodes: any, checkedKeys: any) => {
maintenanceData.upNode = checkedNodes.id maintenanceData.upNode = checkedNodes.id
if (maintenanceData.upNode === maintenanceData.downNode) { if (maintenanceData.upNode === maintenanceData.downNode) {
menuTreeRight.value?.setCheckedKeys([]) menuTreeRight.value?.setCheckedKeys([])
maintenanceData.downNode = '' maintenanceData.downNode = ''
} }
if (checkedKeys.checkedKeys.length > 1) { if (checkedKeys.checkedKeys.length > 1) {
menuTreeLeft.value?.setCheckedKeys([checkedNodes.id]) menuTreeLeft.value?.setCheckedKeys([checkedNodes.id])
} }
} }
//下节点选择 //下节点选择
const checkRight = (checkedNodes: any, checkedKeys: any) => { const checkRight = (checkedNodes: any, checkedKeys: any) => {
maintenanceData.downNode = checkedNodes.id maintenanceData.downNode = checkedNodes.id
if (maintenanceData.downNode === maintenanceData.upNode) {
menuTreeLeft.value?.setCheckedKeys([]) if (maintenanceData.downNode === maintenanceData.upNode) {
maintenanceData.upNode = '' menuTreeLeft.value?.setCheckedKeys([])
} maintenanceData.upNode = ''
if (checkedKeys.checkedKeys.length > 1) { }
menuTreeRight.value?.setCheckedKeys([checkedNodes.id]) if (checkedKeys.checkedKeys.length > 1) {
} menuTreeRight.value?.setCheckedKeys([checkedNodes.id])
}
} }
//节点维护提交 //节点维护提交
const maintenanceOnsubmit = () => { const maintenanceOnsubmit = () => {
for (let i = 0; i < bind.value.length; i++) {
if (bind.value[i][0] == maintenanceData.upNode) { if(maintenanceData.downNode == '' || maintenanceData.upNode == '') {
for (let j = 0; j < bind.value.length; j++) { ElMessage({
if (bind.value[j][1] == maintenanceData.downNode) { type: 'warning',
ElMessage({ message: '请确保上下节点各自选择一个母线!'
type: 'warning', })
message: '上下节点无法选择相同母线!!!' return
})
return
}
}
return
}
} }
if (bindLevel.value != 5) {
for (let i = 0; i < bind.value.length; i++) {
if (maintenanceData.upNode == bind.value[i][1] && maintenanceData.downNode == bind.value[i][0]) {
ElMessage({
type: 'warning',
message: '上下节点无法选择相同母线!!!'
})
return
}
}
}
if (maintenanceData.upNode == maintenanceData.downNode) {
ElMessage({
type: 'warning',
message: '上下节点无法选择相同母线!'
})
}
// for (let i = 0; i < bind.value.length; i++) {
// if (bind.value[i] == maintenanceData.upNode) {
// for (let j = 0; j < bind.value.length; j++) {
// if (bind.value[j] == maintenanceData.downNode) {
// ElMessage({
// type: 'warning',
// message: '上下节点无法选择相同母线!!!'
// })
// return
// }
// }
// return
// }
// }
// if (bindLevel.value != 5) {
// for (let i = 0; i < bind.value.length; i++) {
// if (maintenanceData.upNode == bind.value[i] && maintenanceData.downNode == bind.value[i]) {
// ElMessage({
// type: 'warning',
// message: '上下节点无法选择相同母线!!!'
// })
// return
// }
// }
// }
nodeMaintenance(maintenanceData).then((res: any) => { nodeMaintenance(maintenanceData).then((res: any) => {
if (res.code == 'A0000') { if (res.code == 'A0000') {
ElMessage({ ElMessage({

View File

@@ -53,12 +53,12 @@
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
<div class="box"> <div class="box">
<el-form :model="form" label-width="100px" ref="ruleFormRef"> <el-form :model="form" label-width="100px" ref="ruleFormRef" :rules="rules">
<el-form-item label="名称:"> <el-form-item label="名称:" prop="tpName">
<el-input v-model="form.tpName" placeholder="请输入" maxlength="32" show-word-limit clearable></el-input> <el-input v-model="form.tpName" placeholder="请输入" maxlength="32" show-word-limit clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="描述:" class="mt20"> <el-form-item label="描述:" class="mt20">
<el-input v-model="form.tfDescribe" placeholder="请输入" maxlength="32" show-word-limit clearable></el-input> <el-input v-model="form.tfDescribe" placeholder="请输入" ></el-input>
</el-form-item> </el-form-item>
<el-form-item class="mt20 ml20"> <el-form-item class="mt20 ml20">
<el-button @click="dialogFormVisible = false">取消</el-button> <el-button @click="dialogFormVisible = false">取消</el-button>
@@ -122,13 +122,8 @@ const menuTree = ref()
const TableHeaderRef = ref() const TableHeaderRef = ref()
const rules = reactive({ const rules = reactive({
name: [{ required: true, message: '名称不可为空', trigger: 'blur' }], tpName: [{ required: true, message: '名称不可为空', trigger: 'blur' }],
ip: [{ required: true, message: 'ip不可为空', trigger: 'blur' }],
nodeGrade: [{ required: true, message: '等级不可为空', trigger: 'blur' }],
nodeDevNum: [{ required: true, message: '最大终端数不可为空', trigger: 'blur' }],
maxProcessNum: [{ required: true, message: '最大进程数不可为空', trigger: 'blur' }],
sort: [{ required: true, message: '排序不可为空', trigger: 'blur' }],
remark: [{ required: true, message: '描述不可为空', trigger: 'blur' }]
}) })
const dialogFormVisible = ref(false) const dialogFormVisible = ref(false)

View File

@@ -400,13 +400,12 @@ import { uploadFile } from '@/api/system-boot/file'
import { import {
submitFormData, submitFormData,
getById, getById,
updateFormData,
addEditor, addEditor,
resend, getByDeptDevLine,
getByDeptDevLine getUserReportUpdateById
} from '@/api/supervision-boot/interfere/index' } from '@/api/device-boot/sensitiveLoadMange'
import { getSubstationSelect } from '@/api/device-boot/line' import { getSubstationSelect } from '@/api/device-boot/line'
import { getUserReportUpdateById } from '@/api/supervision-boot/userReport/form' // import { getUserReportUpdateById } from '@/api/supervision-boot/userReport/form'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()

View File

@@ -1,217 +1,225 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<div v-if="detailLoading" class="loading"> <div v-if="detailLoading" class="loading">
<el-spin description="加载中..." /> <el-spin description="加载中..." />
</div> </div>
<div v-else> <div v-else>
<el-descriptions :column="2" border> <el-descriptions :column="2" border label-width="200px">
<el-descriptions-item label="所在地市"> <el-descriptions-item label="所在地市">
{{ detailData.city }} {{ detailData.city }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="项目名称"> <el-descriptions-item label="项目名称">
{{ detailData.projectName }} {{ detailData.projectName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="工程预期投产日期"> <el-descriptions-item label="工程预期投产日期">
{{ formatDate(detailData.expectedProductionDate, 'YYYY-MM-DD') }} {{ formatDate(detailData.expectedProductionDate, 'YYYY-MM-DD') }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="经纬度"> <el-descriptions-item label="经纬度">
{{ detailData.longitude }}  {{ detailData.latitude }} {{ detailData.longitude }}  {{ detailData.latitude }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="用户性质"> <el-descriptions-item label="用户性质">
{{ {{
userTypeList.find(item => { userTypeList.find(item => {
return item.value == detailData.userType return item.value == detailData.userType
})?.label })?.label
}} }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="归口管理部门"> <el-descriptions-item label="归口管理部门">
{{ detailData.responsibleDepartment }} {{ detailData.responsibleDepartment }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="用户状态"> <el-descriptions-item label="用户状态">
{{ {{
userStateList.find(item => { userStateList.find(item => {
return item.value == detailData.userStatus return item.value == detailData.userStatus
})?.label })?.label
}} }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="厂站名称"> <el-descriptions-item label="厂站名称">
{{ detailData.substation }} {{ detailData.substation }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="电压等级"> <el-descriptions-item label="电压等级">
{{ {{
voltageLevelList.find(item => { voltageLevelList.find(item => {
return item.id == detailData.voltageLevel return item.id == detailData.voltageLevel
})?.name })?.name
}} }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="非线性终端类型" v-if="detailData.userType == 0 || detailData.userType == 1"> <el-descriptions-item
{{ proviteData.nonlinearDeviceType ? proviteData.nonlinearDeviceType : '-' }} label="非线性终端类型"
</el-descriptions-item> v-if="detailData.userType == 0 || detailData.userType == 1"
<el-descriptions-item label="预测评估单位"> >
{{ detailData.evaluationDept }} {{ proviteData.nonlinearDeviceType ? proviteData.nonlinearDeviceType : '-' }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="预测评估结论" :span="2"> <el-descriptions-item label="预测评估单位">
{{ detailData.evaluationConclusion }} {{ detailData.evaluationDept }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item <el-descriptions-item label="预测评估结论" :span="2">
:label=" {{ detailData.evaluationConclusion }}
detailData.userType == '4' || detailData.userType == '5' ? '非线性设备类型: ' : '非线性负荷类型:' </el-descriptions-item>
" <el-descriptions-item
v-if=" :label="
detailData.userType == '2' || detailData.userType == '4' || detailData.userType == '5'
detailData.userType == '3' || ? '非线性设备类型: '
detailData.userType == '4' || : '非线性负荷类型:'
detailData.userType == '5' "
"
>
{{ proviteData.nonlinearLoadType }}
</el-descriptions-item>
<el-descriptions-item label="是否需要治理">
<span v-if="detailData.userType == 0 || detailData.userType == 1">
{{ proviteData.needGovernance == 0 ? '否' : '是' }}
</span>
<span
v-if=" v-if="
detailData.userType == 2 || detailData.userType == '2' ||
detailData.userType == 3 || detailData.userType == '3' ||
detailData.userType == 4 || detailData.userType == '4' ||
detailData.userType == 5 detailData.userType == '5'
" "
> >
{{ proviteData.needGovernance == 0 ? '否' : '是' }} {{ proviteData.nonlinearLoadType }}
</span> </el-descriptions-item>
<span v-if="detailData.userType == 6">{{ proviteData.needGovernance == 0 ? '否' : '是' }}</span> <el-descriptions-item label="是否需要治理">
</el-descriptions-item> <span v-if="detailData.userType == 0 || detailData.userType == 1">
<el-descriptions-item label="是否开展背景测试"> {{ proviteData.needGovernance == 0 ? '否' : '是' }}
<span v-if="detailData.userType == 0 || detailData.userType == 1"> </span>
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }} <span
</span> v-if="
<span detailData.userType == 2 ||
detailData.userType == 3 ||
detailData.userType == 4 ||
detailData.userType == 5
"
>
{{ proviteData.needGovernance == 0 ? '否' : '是' }}
</span>
<span v-if="detailData.userType == 6">{{ proviteData.needGovernance == 0 ? '否' : '是' }}</span>
</el-descriptions-item>
<el-descriptions-item label="是否开展背景测试">
<span v-if="detailData.userType == 0 || detailData.userType == 1">
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }}
</span>
<span
v-if="
detailData.userType == 2 ||
detailData.userType == 3 ||
detailData.userType == 4 ||
detailData.userType == 5
"
>
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }}
</span>
<span v-if="detailData.userType == 6">
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }}
</span>
</el-descriptions-item>
<el-descriptions-item label="是否开展抗扰度测试" v-if="detailData.userType == 6">
<span>
{{ proviteData.antiInterferenceTest == 0 ? '否' : '是' }}
</span>
</el-descriptions-item>
<el-descriptions-item
label="用户协议容量MVA"
v-if="detailData.userType == 0 || detailData.userType == 1"
>
{{ proviteData.agreementCapacity }}
</el-descriptions-item>
<el-descriptions-item label="装机容量MW">
{{ detailData?.ratePower }}
</el-descriptions-item>
<el-descriptions-item
label="PCC供电设备容量MVA"
v-if=" v-if="
detailData.userType == 2 || detailData.userType == '2' ||
detailData.userType == 3 || detailData.userType == '3' ||
detailData.userType == 4 || detailData.userType == '4' ||
detailData.userType == 5 detailData.userType == '5'
" "
> >
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }} {{ proviteData.pccEquipmentCapacity }}
</span> </el-descriptions-item>
<span v-if="detailData.userType == 6"> <el-descriptions-item
{{ proviteData.backgroundTestPerformed == 0 ? '否' : '是' }} label="基准短路容量MVA"
</span> v-if="
</el-descriptions-item> detailData.userType == '2' ||
detailData.userType == '3' ||
<el-descriptions-item label="是否开展抗扰度测试" v-if="detailData.userType == 6"> detailData.userType == '4' ||
<span> detailData.userType == '5'
{{ proviteData.antiInterferenceTest == 0 ? '否' : '是' }} "
</span> >
</el-descriptions-item> {{ proviteData.baseShortCircuitCapacity }}
<el-descriptions-item </el-descriptions-item>
label="用户协议容量MVA" <el-descriptions-item
v-if="detailData.userType == 0 || detailData.userType == 1" label="系统最小短路容量MVA"
> v-if="
{{ proviteData.agreementCapacity }} detailData.userType == '2' ||
</el-descriptions-item> detailData.userType == '3' ||
<el-descriptions-item label="装机容量MW"> detailData.userType == '4' ||
{{ detailData?.ratePower }} detailData.userType == '5'
</el-descriptions-item> "
<el-descriptions-item >
label="PCC供电设备容量MVA" {{ proviteData?.minShortCircuitCapacity }}
v-if=" </el-descriptions-item>
detailData.userType == '2' || <el-descriptions-item
detailData.userType == '3' || label="用户用电协议容量MVA"
detailData.userType == '4' || v-if="
detailData.userType == '5' detailData.userType == '2' ||
" detailData.userType == '3' ||
> detailData.userType == '4' ||
{{ proviteData.pccEquipmentCapacity }} detailData.userType == '5'
</el-descriptions-item> "
<el-descriptions-item >
label="基准短路容量MVA" {{ proviteData?.userAgreementCapacity }}
v-if=" </el-descriptions-item>
detailData.userType == '2' || <el-descriptions-item label="PCC点" v-if="detailData.userType != 0 && detailData.userType != 1">
detailData.userType == '3' || {{ proviteData?.pccPoint }}
detailData.userType == '4' || </el-descriptions-item>
detailData.userType == '5' <el-descriptions-item label="评估类型" v-if="detailData.userType != 0 && detailData.userType != 1">
" {{
> evaluationTypeList.find(item => {
{{ proviteData.baseShortCircuitCapacity }} return item.id == proviteData?.evaluationType
</el-descriptions-item> })?.name
<el-descriptions-item }}
label="系统最小短路容量MVA" </el-descriptions-item>
v-if=" <el-descriptions-item
detailData.userType == '2' || label="预测评估评审单位"
detailData.userType == '3' || v-if="detailData.userType != 0 && detailData.userType != 1"
detailData.userType == '4' || >
detailData.userType == '5' {{ proviteData?.evaluationChekDept }}
" </el-descriptions-item>
> <el-descriptions-item label="行业" v-if="detailData.userType == 6">
{{ proviteData?.minShortCircuitCapacity }} {{
</el-descriptions-item> industryList.find(item => {
<el-descriptions-item return item.id == proviteData.industry
label="用户用电协议容量MVA" })?.name
v-if=" }}
detailData.userType == '2' || </el-descriptions-item>
detailData.userType == '3' || <el-descriptions-item label="敏感终端名称" v-if="detailData.userType == 6">
detailData.userType == '4' || {{ proviteData.deviceName }}
detailData.userType == '5' </el-descriptions-item>
" <!-- <el-descriptions-item label="供电电源数量" v-if="detailData.userType == 6">-->
> <!-- {{ proviteData.powerSupplyCount }}-->
{{ proviteData?.userAgreementCapacity }} <!-- </el-descriptions-item>-->
</el-descriptions-item> <el-descriptions-item label="供电电源情况" v-if="detailData.userType == 6">
<el-descriptions-item label="PCC点" v-if="detailData.userType != 0 && detailData.userType != 1"> {{
{{ proviteData?.pccPoint }} powerSupplyInfoOptionList.find(item => {
</el-descriptions-item> return item.id == proviteData.powerSupplyInfo
<el-descriptions-item label="评估类型" v-if="detailData.userType != 0 && detailData.userType != 1"> })?.name
{{ }}
evaluationTypeList.find(item => { </el-descriptions-item>
return item.id == proviteData?.evaluationType <el-descriptions-item label="供电电源" :span="2" v-if="detailData.userType == 6">
})?.name {{ proviteData.powerSupply }}
}} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="负荷级别" v-if="detailData.userType == 6">
<el-descriptions-item label="预测评估评审单位" v-if="detailData.userType != 0 && detailData.userType != 1"> {{
{{ proviteData?.evaluationChekDept }} loadLevelOptionList.find(item => {
</el-descriptions-item> return item.id == proviteData.loadLevel
<el-descriptions-item label="行业" v-if="detailData.userType == 6"> })?.name
{{ }}
industryList.find(item => { </el-descriptions-item>
return item.id == proviteData.industry <el-descriptions-item label="敏感电能质量指标" v-if="detailData.userType == 6">
})?.name {{
}} energyQualityIndexList.find(item => {
</el-descriptions-item> return item.id == proviteData.energyQualityIndex
<el-descriptions-item label="敏感终端名称" v-if="detailData.userType == 6"> })?.name
{{ proviteData.deviceName }} }}
</el-descriptions-item> </el-descriptions-item>
<!-- <el-descriptions-item label="供电电源数量" v-if="detailData.userType == 6">--> </el-descriptions>
<!-- {{ proviteData.powerSupplyCount }}-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="供电电源情况" v-if="detailData.userType == 6">
{{
powerSupplyInfoOptionList.find(item => {
return item.id == proviteData.powerSupplyInfo
})?.name
}}
</el-descriptions-item>
<el-descriptions-item label="供电电源" :span="2" v-if="detailData.userType == 6">
{{ proviteData.powerSupply }}
</el-descriptions-item>
<el-descriptions-item label="负荷级别" v-if="detailData.userType == 6">
{{
loadLevelOptionList.find(item => {
return item.id == proviteData.loadLevel
})?.name
}}
</el-descriptions-item>
<el-descriptions-item label="敏感电能质量指标" v-if="detailData.userType == 6">
{{
energyQualityIndexList.find(item => {
return item.id == proviteData.energyQualityIndex
})?.name
}}
</el-descriptions-item>
</el-descriptions>
</div> </div>
</div> </div>
</template> </template>
@@ -220,14 +228,13 @@ import { onMounted, ref, reactive, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { getUserReportById, getUserReportUpdateById } from '@/api/supervision-boot/userReport/form' import { getById, getUserReportUpdateById, getByDeptDevLine, getFileById } from '@/api/device-boot/sensitiveLoadMange'
import { getDictTreeById } from '@/api/system-boot/dictTree' import { getDictTreeById } from '@/api/system-boot/dictTree'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { getFileNameAndFilePath } from '@/api/system-boot/file' import { getFileNameAndFilePath } from '@/api/system-boot/file'
import { Link, View } from '@element-plus/icons-vue' import { Link, View } from '@element-plus/icons-vue'
import PreviewFile from '@/components/PreviewFile/index.vue' import PreviewFile from '@/components/PreviewFile/index.vue'
import { getByDeptDevLine } from '@/api/supervision-boot/interfere/index' // import { addOrUpdateFile, getFileById } from '@/api/supervision-boot/interfere/index'
import { addOrUpdateFile, getFileById } from '@/api/supervision-boot/interfere/index'
defineOptions({ name: 'BpmUserReportDetail' }) defineOptions({ name: 'BpmUserReportDetail' })
const { query } = useRoute() // 查询参数 const { query } = useRoute() // 查询参数
@@ -340,9 +347,9 @@ const getInfo = async () => {
getProviteData() getProviteData()
}) })
} else { } else {
await getUserReportById(props.id || queryId).then(res => { await getById({ id: props.id || queryId }).then(res => {
detailData.value = res.data detailData.value = res.data
getProviteData() getProviteData()
}) })
} }
@@ -385,7 +392,6 @@ const preview = (val: any, url: any) => {
} }
//预测评估报告 //预测评估报告
if (val == 'predictionEvaluationReport') { if (val == 'predictionEvaluationReport') {
predictionEvaluationReportRef?.value.open(url) predictionEvaluationReportRef?.value.open(url)
} }
//预测评估评审意见报告 //预测评估评审意见报告
@@ -416,11 +422,11 @@ const preview = (val: any, url: any) => {
} }
const queryFiles = () => { const queryFiles = () => {
getFileById({ id: props.id }).then(res => { // getFileById({ id: props.id }).then(res => {
res.data.forEach((item: any) => { // res.data.forEach((item: any) => {
if (item.url.length > 0) getFileNamePaths(item.url, item.name) // if (item.url.length > 0) getFileNamePaths(item.url, item.name)
}) // })
}) // })
} }
//判断userType选择取用的对象 //判断userType选择取用的对象
const getProviteData = async () => { const getProviteData = async () => {

View File

@@ -34,11 +34,11 @@
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
<el-dialog title="详情" width="60%" v-model="dialogShow" v-if="dialogShow"> <el-dialog title="详情" width="1000px" v-model="dialogShow" v-if="dialogShow">
<DetailInfo :id="userId" :openType="'sourcesOfInterference'"></DetailInfo> <DetailInfo :id="userId" :openType="'sourcesOfInterference'"></DetailInfo>
</el-dialog> </el-dialog>
<!-- 批量导入 --> <!-- 批量导入
<sensitive-user-popup ref="sensitiveUserPopup" /> <sensitive-user-popup ref="sensitiveUserPopup" /> -->
<!-- 查看详情 detail 新增/修改 create--> <!-- 查看详情 detail 新增/修改 create-->
<addForm ref="addForms" @onSubmit="tableStore.index()" :openType="'sourcesOfInterference'"></addForm> <addForm ref="addForms" @onSubmit="tableStore.index()" :openType="'sourcesOfInterference'"></addForm>
@@ -57,7 +57,7 @@ import { useRouter } from 'vue-router'
import { downloadSensitiveReportTemplate } from '@/api/supervision-boot/userReport/form' import { downloadSensitiveReportTemplate } from '@/api/supervision-boot/userReport/form'
import DetailInfo from './components/detail.vue' import DetailInfo from './components/detail.vue'
import { cancelFormData, getUserReportById } from '@/api/supervision-boot/interfere/index' import { cancelFormData, getUserReportById } from '@/api/supervision-boot/interfere/index'
import { deleteUserReport } from '@/api/supervision-boot/delete/index' import { deleteUserReport } from '@/api/device-boot/sensitiveLoadMange'
const addForms = ref() const addForms = ref()
const dictData = useDictData() const dictData = useDictData()
const sensitiveUserPopup = ref() const sensitiveUserPopup = ref()
@@ -73,7 +73,7 @@ defineOptions({
//获取登陆用户姓名和部门 //获取登陆用户姓名和部门
const adminInfo = useAdminInfo() const adminInfo = useAdminInfo()
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/supervision-boot/userReport/getUserLedgerPage', url: '/device-boot/userReport/getUserLedgerPage',
// publicHeight: 65, // publicHeight: 65,
method: 'POST', method: 'POST',
column: [ column: [

View File

@@ -129,14 +129,22 @@ const tableStore = new TableStore({
{ field: 'subName', title: '变电站', minWidth: '150' }, { field: 'subName', title: '变电站', minWidth: '150' },
{ field: 'ip', title: '网络参数' ,width:'120px' }, { field: 'ip', title: '网络参数' ,width:'120px' },
{ field: 'scale', title: '电压等级', minWidth: '110' }, { field: 'scale', title: '电压等级', minWidth: '110' },
// { {
// field: 'advanceType', field: 'advanceType',
// title: '触发类型', title: '暂降类型',
// minWidth: '90', minWidth: '90',
// formatter: (row: any) => { formatter: (row: any) => {
// return row.cellValue || '其他' return row.cellValue || '其他'
// } }
// }, },
{
field: 'eventType',
title: '触发类型',
minWidth: '120',
formatter: (row: any) => {
return eventList.filter(item => item.id === row.cellValue)[0]?.name
}
},
{ {
field: 'advanceReason', field: 'advanceReason',
title: '暂降原因', title: '暂降原因',
@@ -145,14 +153,7 @@ const tableStore = new TableStore({
return row.cellValue || '其他' return row.cellValue || '其他'
} }
}, },
{
field: 'eventType',
title: '触发类型',
minWidth: '120',
formatter: (row: any) => {
return eventList.filter(item => item.id === row.cellValue)[0]?.name
}
},
// { // {
// field: 'severity', title: '严重度', minWidth: "80", formatter: (row: any) => { // field: 'severity', title: '严重度', minWidth: "80", formatter: (row: any) => {
// return row.cellValue.toFixed(2) // return row.cellValue.toFixed(2)

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() // 如果日期大于当前日期,则禁用
@@ -351,7 +427,9 @@ const makeUp = () => {
tableRef.value tableRef.value
.getRef() .getRef()
.getCheckboxRecords() .getCheckboxRecords()
.find((item: any) => item.level == '6') || [] .filter((item: any) => item.level == '6') || []
if (list.length == 0) { if (list.length == 0) {
return ElMessage({ return ElMessage({
@@ -359,6 +437,16 @@ const makeUp = () => {
type: 'warning' type: 'warning'
}) })
} }
// 检查是否有 comFlag 等于 0 的项
const hasOfflineDevice = list.some((item: any) => item.comFlag === 0)
if (hasOfflineDevice) {
return ElMessage({
message: '请选择在线监测点进行补招',
type: 'warning'
})
}
timeData.value = [] timeData.value = []
timePopUp.value = true timePopUp.value = true
} }

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

@@ -8,7 +8,7 @@
<TableHeader :showReset="false" ref="TableHeaderRef"> <TableHeader :showReset="false" ref="TableHeaderRef">
<template #select> <template #select>
<el-form-item label="关键字"> <el-form-item label="关键字">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" /> <el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" maxlength="32" show-word-limit/>
</el-form-item> </el-form-item>
</template> </template>
<template #operation> <template #operation>

View File

@@ -613,7 +613,7 @@ onMounted(() => {
.harmonicButton { .harmonicButton {
height: 42px; height: 42px;
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
align-items: center; align-items: center;
} }
:deep(.el-tabs__content) { :deep(.el-tabs__content) {

View File

@@ -158,7 +158,7 @@ onMounted(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.title { .title {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
align-items: center; align-items: center;
padding: 10px; padding: 10px;
font-size: 16px; font-size: 16px;

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

@@ -665,7 +665,7 @@ const initEcharts = (color: string, key: number, name: string) => {
startAngle: key == 0 ? 180 : 90, startAngle: key == 0 ? 180 : 90,
endAngle: key == 0 ? 90 : 0, endAngle: key == 0 ? 90 : 0,
min: 0, min: 0,
max: key == 0 ? 12 : 400, max: key == 0 ? 12 : 200,
radius: '180%', radius: '180%',
center: key == 0 ? ['70%', '95%'] : ['30%', '95%'], center: key == 0 ? ['70%', '95%'] : ['30%', '95%'],
splitNumber: 2, //刻度数量 splitNumber: 2, //刻度数量
@@ -744,6 +744,7 @@ const initEcharts = (color: string, key: number, name: string) => {
} }
//渲染echarts //渲染echarts
const init = () => { const init = () => {
loading.value = true
const url = localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/' const url = localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/'
echartsDataV1.value = initEcharts('#DAA520', 0, 'A相') echartsDataV1.value = initEcharts('#DAA520', 0, 'A相')
echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相') echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相')
@@ -758,6 +759,7 @@ const init = () => {
return return
} }
if (monitoringPoint.state.comFlag == 0) { if (monitoringPoint.state.comFlag == 0) {
loading.value = false
return ElMessage({ return ElMessage({
message: '所选监测点离线!', message: '所选监测点离线!',
type: 'warning' type: 'warning'
@@ -826,7 +828,7 @@ const init = () => {
] ]
spectrumRef.value?.init(data) spectrumRef.value?.init(data)
trendRef.value?.init(data) trendRef.value?.init(data)
loading.value = false
// console.log('🚀 ~ dataSocket.socketServe.registerCallBack ~ webMsgSend.value:', data) // console.log('🚀 ~ dataSocket.socketServe.registerCallBack ~ webMsgSend.value:', data)
setRealData() setRealData()
}) })
@@ -866,6 +868,22 @@ const setRealData = () => {
// webMsgSend.value[0].vRmsB == 0 ? 1 : Math.ceil(webMsgSend.value[0].vRmsB) // webMsgSend.value[0].vRmsB == 0 ? 1 : Math.ceil(webMsgSend.value[0].vRmsB)
// echartsDataV3.value.options.series[0].max = // echartsDataV3.value.options.series[0].max =
// webMsgSend.value[0].vRmsC == 0 ? 1 : Math.ceil(webMsgSend.value[0].vRmsC) // webMsgSend.value[0].vRmsC == 0 ? 1 : Math.ceil(webMsgSend.value[0].vRmsC)
let vMax =
Math.ceil(
(Math.max(
...[
Math.floor(webMsgSend.value[0].vRmsA * 100) / 100 || 10,
Math.floor(webMsgSend.value[0].vRmsB * 100) / 100 || 10,
Math.floor(webMsgSend.value[0].vRmsC * 100) / 100 || 10
]
) *
1.2) /
10
) * 10
echartsDataV1.value.options.series[0].max = vMax
echartsDataV2.value.options.series[0].max = vMax
echartsDataV3.value.options.series[0].max = vMax
echartsDataV1.value.options.series[0].data = [ echartsDataV1.value.options.series[0].data = [
{ {
name: ptName.value == 'star' ? 'A相' : 'AB相', //A相 name: ptName.value == 'star' ? 'A相' : 'AB相', //A相
@@ -894,6 +912,22 @@ const setRealData = () => {
// webMsgSend.value[0].iRmsB == 0 ? 1 : Math.ceil(webMsgSend.value[0].iRmsB) // webMsgSend.value[0].iRmsB == 0 ? 1 : Math.ceil(webMsgSend.value[0].iRmsB)
// echartsDataA3.value.options.series[0].max = // echartsDataA3.value.options.series[0].max =
// webMsgSend.value[0].iRmsC == 0 ? 1 : Math.ceil(webMsgSend.value[0].iRmsC) // webMsgSend.value[0].iRmsC == 0 ? 1 : Math.ceil(webMsgSend.value[0].iRmsC)
let aMax =
Math.ceil(
(Math.max(
...[
Math.floor(webMsgSend.value[0].iRmsA * 100) / 100 || 10,
Math.floor(webMsgSend.value[0].iRmsB * 100) / 100 || 10,
Math.floor(webMsgSend.value[0].iRmsC * 100) / 100 || 10
]
) *
1.2) /
10
) * 10
echartsDataA1.value.options.series[0].max = aMax
echartsDataA2.value.options.series[0].max = aMax
echartsDataA3.value.options.series[0].max = aMax
echartsDataA1.value.options.series[0].data = [ echartsDataA1.value.options.series[0].data = [
{ {
name: 'A相', name: 'A相',
@@ -919,6 +953,7 @@ const setRealData = () => {
defineExpose({ setRealData }) defineExpose({ setRealData })
onMounted(() => { onMounted(() => {
init() init()
initRadioCharts() initRadioCharts()
getLineDetail({ id: monitoringPoint.state.lineId }).then(res => { getLineDetail({ id: monitoringPoint.state.lineId }).then(res => {
ptName.value = connection.filter(item => item.value == res.data.ptType)[0].code || '' ptName.value = connection.filter(item => item.value == res.data.ptType)[0].code || ''

View File

@@ -1,357 +1,358 @@
<template> <template>
<div class="pt50"> <div class="pt50">
<el-button class="shutDown" icon="el-icon-Back" @click="emit('shutDown')">返回</el-button> <el-button class="shutDown" icon="el-icon-Back" @click="emit('shutDown')">返回</el-button>
<div class="select"> <div class="select">
<div class="mr10">谐波次数</div> <div class="mr10">谐波次数</div>
<el-select v-model="selectValue" style="width: 100px" @change="loading = true"> <el-select v-model="selectValue" style="width: 100px" @change="loading = true">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</div> </div>
<el-tabs type="border-card" v-model="activeName" @tab-change="handleClick" v-loading="loading"> <el-tabs type="border-card" v-model="activeName" @tab-change="handleClick" v-loading="loading">
<el-tab-pane v-for="(item, index) in tabsList" :label="item.groupName" :name="index" :key="index"> <el-tab-pane v-for="(item, index) in tabsList" :label="item.groupName" :name="index" :key="index">
<div> <div>
<div class="realtrend_top"> <div class="realtrend_top">
<div class="realtrend_table"> <div class="realtrend_table">
<div class="thead_left"> <div class="thead_left">
<p style="font-weight: 700; background-color: #f3f6f9">次数()</p> <p style="font-weight: 700; background-color: #f3f6f9">次数()</p>
<p>{{ item.groupName }}{{ item.unit ? '(' + item.unit + ')' : '' }}</p> <p>{{ item.groupName }}{{ item.unit ? '(' + item.unit + ')' : '' }}</p>
</div> </div>
<div class="thead_right"> <div class="thead_right">
<div <div
class="right_cell" class="right_cell"
v-for="i in selectValue == '1' v-for="i in selectValue == '1'
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 !== 0) ? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 !== 0)
: selectValue == '2' : selectValue == '2'
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 == 0) ? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 == 0)
: item.title" : item.title"
:key="index" :key="index"
> >
<p style="background-color: #f3f6f9"> <p style="background-color: #f3f6f9">
<span>{{ i }}次</span> <span>{{ i }}次</span>
</p> </p>
<p> <p>
<span>{{ item.data[`h${i}`] == 0 ? 0 : item.data[`h${i}`] || '/' }}</span> <span>{{ item.data[`h${i}`] == 0 ? 0 : item.data[`h${i}`] || '/' }}</span>
</p> </p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="mt10" :style="height"> <div class="mt10" :style="height">
<MyEchart ref="barCharts" :options="tabsList[0].echartsData"></MyEchart> <MyEchart ref="barCharts" :options="tabsList[0].echartsData"></MyEchart>
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import MyEchart from '@/components/echarts/MyEchart.vue' import MyEchart from '@/components/echarts/MyEchart.vue'
import { getOverLimitData } from '@/api/device-boot/communicate' import { getOverLimitData } from '@/api/device-boot/communicate'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { useMonitoringPoint } from '@/stores/monitoringPoint' import { useMonitoringPoint } from '@/stores/monitoringPoint'
const emit = defineEmits(['shutDown']) const emit = defineEmits(['shutDown'])
const monitoringPoint = useMonitoringPoint() const monitoringPoint = useMonitoringPoint()
const options = [ const options = [
{ {
value: '3', value: '3',
label: '全部' label: '全部'
}, },
{ {
value: '1', value: '1',
label: '奇次' label: '奇次'
}, },
{ {
value: '2', value: '2',
label: '偶次' label: '偶次'
} }
] ]
const height = mainHeight(315) const height = mainHeight(315)
const barCharts = ref() const barCharts = ref()
const loading = ref(true) const loading = ref(true)
const crossTheLine: any = ref({}) const crossTheLine: any = ref({})
const tabsList: any = ref([ const tabsList: any = ref([
{ {
id: '6d5470f509ca271d7108a86e83bb283f', id: '6d5470f509ca271d7108a86e83bb283f',
groupName: '谐波电压含有率', groupName: '谐波电压含有率',
thdDataVOS: null, thdDataVOS: null,
thdDataTdVODatas: null, thdDataTdVODatas: null,
unit: '%', unit: '%',
title: [ title: [
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
], ],
data: {}, data: {},
echartsData: {} echartsData: {}
}, },
{ {
id: 'ae31115b83f02f03a0d3bd65cb017121', id: 'ae31115b83f02f03a0d3bd65cb017121',
groupName: '间谐波电压含有率', groupName: '间谐波电压含有率',
thdDataVOS: null, thdDataVOS: null,
thdDataTdVODatas: null, thdDataTdVODatas: null,
unit: '%', unit: '%',
title: [ title: [
0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5,
19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, // 16.5, 17.5, 18.5,
37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5 // 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5,
], // 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5
data: {}, ],
echartsData: {} data: {},
}, echartsData: {}
{ },
id: '8dc260f16280184e2b57d26668dc00b1', {
groupName: '谐波电流幅值', id: '8dc260f16280184e2b57d26668dc00b1',
thdDataVOS: null, groupName: '谐波电流幅值',
thdDataTdVODatas: null, thdDataVOS: null,
unit: 'A', thdDataTdVODatas: null,
title: [ unit: 'A',
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, title: [
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
], 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
],
data: {},
echartsData: {} data: {},
} echartsData: {}
]) }
])
const selectValue = ref('1')
const activeName = ref(0) const selectValue = ref('1')
// 点击tab const activeName = ref(0)
const handleClick = (tab: any, event: any) => { // 点击tab
loading.value = true const handleClick = (tab: any, event: any) => {
} loading.value = true
const init = (row: any) => { }
let vData: any = {} const init = (row: any) => {
let iData: any = {} let vData: any = {}
let SvData: any = {} let iData: any = {}
for (let i = 1; i < 50; i++) { let SvData: any = {}
vData[`h${i + 1}`] = for (let i = 1; i < 50; i++) {
Math.floor( vData[`h${i + 1}`] =
Math.max(...[row.V.A[`V` + (i + 1)], row.V.B[`V` + (i + 1)], row.V.C[`V` + (i + 1)]].map(Number)) * 100 Math.floor(
) / 100 Math.max(...[row.V.A[`V` + (i + 1)], row.V.B[`V` + (i + 1)], row.V.C[`V` + (i + 1)]].map(Number)) * 100
) / 100
SvData[`h${i - 0.5}`] =
Math.floor(Math.max(...[row.V.A[`SV_` + (i-1)], row.V.B[`SV_` + (i-1)], row.V.C[`SV_` + (i-1)]].map(Number)) * 100) / SvData[`h${i - 0.5}`] =
100 Math.floor(Math.max(...[row.V.A[`SV_` + (i-1)], row.V.B[`SV_` + (i-1)], row.V.C[`SV_` + (i-1)]].map(Number)) * 100) /
iData[`h${i + 1}`] = 100
Math.floor( iData[`h${i + 1}`] =
Math.max(...[row.I.A[`I` + (i + 1)], row.I.B[`I` + (i + 1)], row.I.C[`I` + (i + 1)]].map(Number)) * 100 Math.floor(
) / 100 Math.max(...[row.I.A[`I` + (i + 1)], row.I.B[`I` + (i + 1)], row.I.C[`I` + (i + 1)]].map(Number)) * 100
} ) / 100
SvData[`h49.5`] = }
Math.floor(Math.max(...[row.V.A[`SV_49`], row.V.B[`SV_49`], row.V.C[`SV_49`]].map(Number)) * 100) / 100 SvData[`h49.5`] =
Math.floor(Math.max(...[row.V.A[`SV_49`], row.V.B[`SV_49`], row.V.C[`SV_49`]].map(Number)) * 100) / 100
tabsList.value[0].data = vData
tabsList.value[1].data = SvData tabsList.value[0].data = vData
tabsList.value[2].data = iData tabsList.value[1].data = SvData
tabsList.value[2].data = iData
let xData =
selectValue.value == '1' let xData =
? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 !== 0) selectValue.value == '1'
: selectValue.value == '2' ? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 !== 0)
? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 === 0) : selectValue.value == '2'
: tabsList.value[activeName.value].title ? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 === 0)
: tabsList.value[activeName.value].title
barCharts.value[activeName.value]?.setOptions({
title: { barCharts.value[activeName.value]?.setOptions({
text: tabsList.value[activeName.value].groupName title: {
}, text: tabsList.value[activeName.value].groupName
xAxis: { },
data: xData.map(num => `${num}次`) xAxis: {
}, data: xData.map(num => `${num}次`)
yAxis: { },
name: tabsList.value[activeName.value].unit // 更新Y轴单位 yAxis: {
}, name: tabsList.value[activeName.value].unit // 更新Y轴单位
series: [ },
{ series: [
name: tabsList.value[activeName.value].groupName + '(' + tabsList.value[activeName.value].unit + ')' , {
type: 'bar', name: tabsList.value[activeName.value].groupName + '(' + tabsList.value[activeName.value].unit + ')' ,
data: xData.map(num => { type: 'bar',
return tabsList.value[activeName.value].data[`h${num}`] data: xData.map(num => {
}) return tabsList.value[activeName.value].data[`h${num}`]
}, })
{ },
name: '国标限值(' + tabsList.value[activeName.value].unit + ')', // 更新series名称中的单位 {
type: 'bar', name: '国标限值(' + tabsList.value[activeName.value].unit + ')', // 更新series名称中的单位
data: xData.map(num => { type: 'bar',
return ( data: xData.map(num => {
crossTheLine.value[ return (
activeName.value == 0 crossTheLine.value[
? `uharm${num}` activeName.value == 0
: activeName.value == 1 ? `uharm${num}`
? `inuharm${num + 0.5}` : activeName.value == 1
: `iharm${num}` ? `inuharm${num + 0.5}`
] || '' : `iharm${num}`
) ] || ''
}) )
} })
] }
}) ]
loading.value = false })
} loading.value = false
// 设置ecartsData }
const echarts = (num: number) => { // 设置ecartsData
return { const echarts = (num: number) => {
title: { return {
text: '' title: {
}, text: ''
xAxis: { },
name: "次数", xAxis: {
data: [] name: "次数",
}, data: []
yAxis: {name: tabsList.value[num].unit}, },
color: ['#2E8B57', '#DAA520'], yAxis: {name: tabsList.value[num].unit},
options: { color: ['#2E8B57', '#DAA520'],
series: [ options: {
{ series: [
name: tabsList.value[num].groupName, {
type: 'bar', name: tabsList.value[num].groupName,
data: [] type: 'bar',
}, data: []
{ },
name: '国标限值('+ tabsList.value[num].unit +')', {
type: 'bar', name: '国标限值('+ tabsList.value[num].unit +')',
// label: { type: 'bar',
// normal: { // label: {
// position: 'top' // normal: {
// } // position: 'top'
// }, // }
data: [] // },
} data: []
] }
} ]
} }
} }
onMounted(() => { }
tabsList.value[0].echartsData = echarts(0) onMounted(() => {
tabsList.value[1].echartsData = echarts(1) tabsList.value[0].echartsData = echarts(0)
tabsList.value[2].echartsData = echarts(2) tabsList.value[1].echartsData = echarts(1)
console.log(tabsList.value) tabsList.value[2].echartsData = echarts(2)
getOverLimitData({ id: monitoringPoint.state.lineId }).then(res => { console.log(tabsList.value)
crossTheLine.value = res.data getOverLimitData({ id: monitoringPoint.state.lineId }).then(res => {
}) crossTheLine.value = res.data
}) })
defineExpose({ })
init defineExpose({
}) init
</script> })
<style lang="scss" scoped> </script>
.shutDown { <style lang="scss" scoped>
position: absolute; .shutDown {
right: 10px; position: absolute;
top: 10px; right: 10px;
} top: 10px;
.select { }
position: absolute; .select {
top: 10px; position: absolute;
display: flex; top: 10px;
align-items: center; display: flex;
font-size: 14px; align-items: center;
} font-size: 14px;
.realtrend_top { }
width: 100%; .realtrend_top {
height: auto; width: 100%;
display: flex; height: auto;
justify-content: space-between; display: flex;
align-items: center; justify-content: space-between;
align-items: center;
.table {
flex: 1; .table {
// min-height: 80px; flex: 1;
cursor: pointer; // min-height: 80px;
min-height: 90px; cursor: pointer;
max-height: 170px; min-height: 90px;
border: 1px solid #eee; max-height: 170px;
overflow-x: auto; border: 1px solid #eee;
overflow-y: hidden; overflow-x: auto;
position: relative; overflow-y: hidden;
position: relative;
ul {
width: auto; ul {
height: 40px; width: auto;
display: flex; height: 40px;
display: flex;
li {
flex: none; li {
width: 100px; flex: none;
line-height: 40px; width: 100px;
border: 1px solid #eee; line-height: 40px;
text-align: center; border: 1px solid #eee;
list-style: none; text-align: center;
} list-style: none;
} }
}
ul:nth-child(1) {
li { ul:nth-child(1) {
font-weight: 800; li {
background: #f4f6f9; font-weight: 800;
} background: #f4f6f9;
} }
} }
}
// .table::-webkit-scrollbar {
// display: none; // .table::-webkit-scrollbar {
// } // display: none;
// }
.realtrend_table {
width: 100%; .realtrend_table {
height: auto; width: 100%;
max-height: 150px; height: auto;
display: flex; max-height: 150px;
border: 2px solid #eee; display: flex;
cursor: pointer; border: 2px solid #eee;
font-size: 13px; cursor: pointer;
font-size: 13px;
.thead_left {
width: 150px; .thead_left {
height: 100%; width: 150px;
display: flex; height: 100%;
flex-direction: column; display: flex;
justify-content: space-between; flex-direction: column;
align-items: center; justify-content: space-between;
line-height: 50px; align-items: center;
line-height: 50px;
padding-bottom: 5px;
padding-bottom: 5px;
p {
width: 100%; p {
height: 100%; width: 100%;
text-align: center; height: 100%;
border: 1px solid #eee; text-align: center;
line-height: 38px; border: 1px solid #eee;
margin: 0 !important; line-height: 38px;
} margin: 0 !important;
} }
}
.thead_right {
flex: 1; .thead_right {
align-items: center; flex: 1;
overflow-x: auto; align-items: center;
overflow-y: hidden; overflow-x: auto;
display: flex; overflow-y: hidden;
padding-bottom: 5px; display: flex;
padding-bottom: 5px;
.right_cell {
width: 100%; .right_cell {
display: flex; width: 100%;
flex-direction: column; display: flex;
flex-direction: column;
p {
flex: none; p {
min-width: 60px; flex: none;
height: 100%; min-width: 60px;
text-align: center; height: 100%;
border: 1px solid #eee; text-align: center;
line-height: 38px; border: 1px solid #eee;
margin: 0 !important; line-height: 38px;
} margin: 0 !important;
}
p:nth-child(1) {
font-weight: 800; p:nth-child(1) {
} font-weight: 800;
} }
} }
} }
} }
</style> }
</style>

View File

@@ -103,7 +103,11 @@ const init = () => {
) )
} }
options.value = { options.value = {
title: {
text: formData.harmState == 0 ? '谐波电压频谱' : '谐波电流频谱'
},
xAxis: { xAxis: {
name: '次数', name: '次数',
type: 'category', type: 'category',
data: Array.from({ length: 49 }, (_, i) => `${i + 2}`) data: Array.from({ length: 49 }, (_, i) => `${i + 2}`)

View File

@@ -35,8 +35,8 @@ defineOptions({
name: 'harmonic-boot/reate/word' name: 'harmonic-boot/reate/word'
}) })
const dictData = useDictData() const dictData = useDictData()
//区域联级选择 //行业类型选择
const industry = dictData.getBasicData('Interference_Source') const industry = dictData.getBasicData('Business_Type')
//用户信息弹出框 //用户信息弹出框
const tableRef = ref() const tableRef = ref()

View File

@@ -116,7 +116,7 @@ const tableStore = new TableStore({
item.data[k.r][k.c].v ? (item.data[k.r][k.c] = k.v) : '' item.data[k.r][k.c].v ? (item.data[k.r][k.c] = k.v) : ''
}) })
}) })
console.log(tableStore.table.data)
setTimeout(() => { setTimeout(() => {
luckysheet.create({ luckysheet.create({
container: 'luckysheet', container: 'luckysheet',
@@ -129,6 +129,13 @@ const tableStore = new TableStore({
data: tableStore.table.data data: tableStore.table.data
}) })
}, 10) }, 10)
},
resetCallback: () => {
// 重置模板策略为第一个选项
if (templatePolicy.value && templatePolicy.value.length > 0) {
Template.value = templatePolicy.value[0]
reportForm.value = templatePolicy.value[0]?.reportForm
}
} }
}) })
const loading = ref(false) const loading = ref(false)
@@ -154,7 +161,7 @@ const changetype = (val: any) => {
reportForm.value = val.reportForm reportForm.value = val.reportForm
} }
const selectChange = () => { const selectChange = () => {
console.log('🚀 ~ selectChange ~ tableStore.table.data.lnegth :', tableStore.table.data.length) //console.log('🚀 ~ selectChange ~ tableStore.table.data.lnegth :', tableStore.table.data.length)
if (tableStore.table.data.length != 0) { if (tableStore.table.data.length != 0) {
setTimeout(() => { setTimeout(() => {
luckysheet && luckysheet?.resize() luckysheet && luckysheet?.resize()
@@ -165,6 +172,13 @@ const selectChange = () => {
const handleNodeClick = (data: any, node: any) => { const handleNodeClick = (data: any, node: any) => {
if (data.level == 6) { if (data.level == 6) {
dotList.value = data dotList.value = data
TableHeaderRef.value.setTheDate(3)
// 重置模板策略为第一个选项
if (templatePolicy.value && templatePolicy.value.length > 0) {
Template.value = templatePolicy.value[0]
reportForm.value = templatePolicy.value[0]?.reportForm
}
tableStore.index() tableStore.index()
} }
} }

View File

@@ -134,7 +134,7 @@ const exportEvent = () => {
form.append('type', '0') form.append('type', '0')
form.append('startTime', TableHeaderRef.value.datePickerRef.timeValue[0]) form.append('startTime', TableHeaderRef.value.datePickerRef.timeValue[0])
form.append('endTime', TableHeaderRef.value.datePickerRef.timeValue[1]) form.append('endTime', TableHeaderRef.value.datePickerRef.timeValue[1])
console.log('🚀 ~ exportEvent ~ uploadList.value:', uploadList.value?.raw) //console.log('🚀 ~ exportEvent ~ uploadList.value:', uploadList.value?.raw)
form.append('file', uploadList.value?.raw || '') form.append('file', uploadList.value?.raw || '')
// 特殊字符正则表达式 // 特殊字符正则表达式
const specialCharRegex = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/ const specialCharRegex = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/

View File

@@ -1,156 +1,276 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader area ref="TableHeaderRef" showExport>
<TableHeader area showExport>
<template #select> <template #select>
<!-- <el-form-item label="统计类型:"> <el-form-item label="运行状态">
<el-select v-model="tableStore.table.params.statisticalType" placeholder="请选择统计类型" value-key="id"> <el-select
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="item"> filterable
</el-option> multiple
collapse-tags
v-model="tableStore.table.params.runFlag" clearable placeholder="请选择运行状态">
<el-option
v-for="item in runFlagList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> --> </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-form-item>
<el-form-item label="通讯状态:">
<el-select
v-model="tableStore.table.params.comFlag"
filterable
multiple
collapse-tags
clearable
placeholder="请选择通讯状态"
>
<el-option
v-for="item in communicationstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="电压等级:"> <el-form-item label="电压等级:">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable <el-select
placeholder="请选择电压等级" value-key="id"> v-model="tableStore.table.params.scale"
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item"> filterable
</el-option> multiple
collapse-tags
clearable
placeholder="请选择电压等级"
value-key="id"
>
<el-option
v-for="item in voltageleveloption"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家:">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags <el-select
clearable placeholder="请选择终端厂家" value-key="id"> v-model="tableStore.table.params.manufacturer"
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item"> filterable
</el-option> multiple
collapse-tags
clearable
placeholder="请选择终端厂家"
value-key="id"
>
<el-option
v-for="item in terminaloption"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型:">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable <el-select
placeholder="请选择干扰源类型" value-key="id"> v-model="tableStore.table.params.loadType"
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item"> filterable
</el-option> multiple
collapse-tags
clearable
placeholder="请选择干扰源类型"
value-key="id"
>
<el-option
v-for="item in interfereoption"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="通讯状态:">
<el-select v-model="tableStore.table.params.comFlag" filterable multiple collapse-tags clearable
placeholder="请选择通讯状态">
<el-option v-for="item in communicationstatus" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端状态:">
<el-select v-model="tableStore.table.params.runFlag" filterable multiple collapse-tags clearable
placeholder="请选择终端状态">
<el-option v-for="item in terminalstatus" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="评价筛选">
<el-input v-model="tableStore.table.params.evaluate" clearable placeholder="输入关键字筛选" maxlength="32" show-word-limit />
</el-form-item>
</template> </template>
<template #operation>
<!-- <el-button icon="el-icon-Download" type="primary">导出</el-button> -->
</template>
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, provide } from 'vue' import { ref, onMounted, provide, nextTick, watch } from 'vue'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import { useDictData } from '@/stores/dictData'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData() import { useDictData } from '@/stores/dictData'
defineOptions({
name: 'harmonic-boot/run/devicemessage'
})
const view = ref(true)
const classificationData = dictData.getBasicData('Statistical_Type', ["Report_Type"])
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const interfereoption = dictData.getBasicData('Interference_Source')
const communicationstatus = [ const dictData = useDictData()
{ value: 0, label: "中断" }, const TableHeaderRef = ref()
{ value: 1, label: "正常" }, const areaOptionList = dictData.getBasicData('jibei_area')
] const interfereoption = dictData.getBasicData('Interference_Source')
const terminalstatus = [ const terminaloption = dictData.getBasicData('Dev_Manufacturers')
{ value: 0, label: "投运" }, const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
{ value: 1, label: "检修" },
{ value: 2, label: "停运" },
]
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/device-boot/runManage/getLineLedger', url: '/device-boot/runManage/getLineLedgerComm',
method: 'POST', method: 'POST',
isWebPaging: true, filename: '监测点台账',
column: [ column: [
{ {
field: 'index',
title: '序号', title: '序号',
width: '80', width: 80,
formatter: (row: any) => { formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1 return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
} }
}, },
{ field: 'areaName', title: '区域',minWidth: 100 },
{ field: 'gdName', title: '地级区' ,minWidth: 100}, {
field: 'areaName',
title: '省公司',
minWidth: 100
},
{ field: 'gdName', title: '市公司', minWidth: 150 },
{ {
field: 'bdName', field: 'bdName',
title: '供电公司', title: '所属变电站',
minWidth: 100 minWidth: 150
}, },
{ field: 'objName', title: '对象名称' , minWidth: 240}, {
{ field: 'lineName', title: '监测点名称' , minWidth: 100}, field: 'objName',
{ field: 'manufacturer', title: '厂家' , minWidth: 100}, title: '监测对象名称',
{ field: 'scale', title: '电压等级' , minWidth: 100}, minWidth: 150,
{ field: 'businessType', title: '行业类型' , minWidth: 100}, formatter: (row: any) => {
return row.cellValue ? row.cellValue : '/'
}
},
{ field: 'lineName', title: '监测点名称', minWidth: 130 },
{ field: 'scale', title: '监测点电压等级', minWidth: 120 },
{ field: 'devName', title: '终端名称', minWidth: 80 }, { field: 'loadType', title: '干扰源类型', minWidth: 120 },
{ field: 'ip', title: '网络参数' ,width:'120px'},
// { field: 'comFlag', title: '通讯状态' , minWidth: 100}, {
field: 'manufacturer',
title: '终端厂家',
minWidth: 100,
formatter: (row: any) => {
return row.cellValue ? row.cellValue : '/'
}
},
{
field: 'runFlag',
title: '运行状态',
minWidth: 80,
render: 'tag',
custom: {
投运: 'success',
停运: 'danger',
检修: 'warning',
调试: 'warning',
退运: 'danger'
}
},
{ {
field: 'comFlag', field: 'comFlag',
title: '通讯状态', title: '通讯状态',
render: 'tag', render: 'tag',
minWidth: 100,
// effect: 'dark', // effect: 'dark',
minWidth: 70,
custom: { custom: {
'正常': 'success', 正常: 'success',
'中断': 'danger', 中断: 'danger'
}
},
}, },
{ field: 'loadType', title: '干扰源类型' , minWidth: 100}, {
field: 'shortCapacity',
title: '最小短路容量(MVA)',
minWidth: 150
},
{
field: 'devCapacity',
title: '供电设备容量(MVA )',
minWidth: 160
},
{
field: 'dealCapacity',
title: '用户协议容量(MVA)',
minWidth: 150
},
{ field: 'id', title: '监测点序号', minWidth: 90 },
{ field: 'devName', title: '监测终端编号 ', minWidth: 140 },
{ field: 'ptType', title: '监测终端接线方式', minWidth: 140 },
{
field: 'voltageDev',
title: '电压偏差上限(%)',
minWidth: 140
},
{
field: 'uvoltageDev',
title: '电压偏差下限(%)',
minWidth: 140
}
/* {
title: '操作',fixed: 'right',
minWidth: 150,
fixed: 'right',
render: 'buttons',
buttons: [
{
name: 'productSetting',
title: '流程详情',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
}
}
]
}*/
], ],
loadCallback: () => { beforeSearchFun: () => {
tableStore.table.data.map((item: any) => { tableStore.table.params.serverName = 'harmonic-boot'
item.onlineEvaluate == 3.14159 ? item.onlineEvaluate = '/' : item.onlineEvaluate <= 0.6 ? item.onlineEvaluate = '差' : item.onlineEvaluate <= 0.9 ? item.onlineEvaluate = '良' : item.onlineEvaluate <= 1 ? item.onlineEvaluate = '优' : '/' tableStore.table.params.statisticalType = {
}) name: '电网拓扑',
code: 'Power_Network'
}
} }
}) })
tableStore.table.params.statisticalType = classificationData[0]
tableStore.table.params.serverName = "harmonic-boot"
tableStore.table.params.comFlag = []
tableStore.table.params.runFlag = [] tableStore.table.params.runFlag = []
tableStore.table.params.evaluate = '' tableStore.table.params.comFlag = []
tableStore.table.params.powerFlag = 2 tableStore.table.params.powerFlag = 2
tableStore.table.params.monitorFlag = 2 tableStore.table.params.monitorFlag = 2
tableStore.table.params.searchValue = ''
tableStore.table.params.scale = [] tableStore.table.params.scale = []
tableStore.table.params.manufacturer = [] tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = [] tableStore.table.params.loadType = []
const wp = ref({}) const runFlagList = [
{ id: 0, name: '投运' },
{ id: 1, name: '检修' },
{ id: 2, name: '停运' },
]
const communicationstatus = [
{ value: 0, label: '中断' },
{ value: 1, label: '正常' }
]
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {
@@ -159,6 +279,4 @@ onMounted(() => {
</script> </script>

View File

@@ -1,32 +1,15 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader area showExport> <TableHeader area ref="TableHeaderRef" showExport>
<template #select> <template #select>
<!-- <el-form-item label="统计类型:"> <!-- <el-form-item label="统计类型:">
<el-select v-model="tableStore.table.params.statisticalType" placeholder="请选择统计类型" value-key="id"> <el-select v-model="tableStore.table.params.statisticalType" placeholder="请选择统计类型" value-key="id">
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="item"> <el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="item">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="电压等级:">
<el-select
v-model="tableStore.table.params.scale"
filterable
multiple
collapse-tags
clearable
placeholder="请选择电压等级"
value-key="id"
>
<el-option
v-for="item in voltageleveloption"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家:"> <el-form-item label="终端厂家:">
<el-select <el-select
v-model="tableStore.table.params.manufacturer" v-model="tableStore.table.params.manufacturer"
@@ -45,6 +28,44 @@
></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-form-item>
<el-form-item label="通讯状态:">
<el-select
v-model="tableStore.table.params.comF"
filterable
multiple
collapse-tags
clearable
placeholder="请选择通讯状态"
>
<el-option
v-for="item in communicationstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="终端状态:">
<el-select
v-model="tableStore.table.params.runF"
filterable
multiple
collapse-tags
clearable
placeholder="请选择终端状态"
>
<el-option
v-for="item in terminalstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型:"> <el-form-item label="干扰源类型:">
<el-select <el-select
v-model="tableStore.table.params.loadType" v-model="tableStore.table.params.loadType"
@@ -63,59 +84,39 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="电压等级:">
<el-select
v-model="tableStore.table.params.scale"
filterable
multiple
collapse-tags
clearable
placeholder="请选择电压等级"
value-key="id"
>
<el-option
v-for="item in voltageleveloption"
:key="item.id"
:label="item.name"
:value="item"
></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="请选择通讯状态"
>
<el-option
v-for="item in communicationstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="终端状态:">
<el-select
v-model="tableStore.table.params.runFlag"
filterable
multiple
collapse-tags
clearable
placeholder="请选择终端状态"
>
<el-option
v-for="item in terminalstatus"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="评价筛选">
<el-input v-model="tableStore.table.params.evaluate" clearable placeholder="输入关键字筛选" />
</el-form-item>
</template> </template>
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, provide } from 'vue' import { ref, onMounted, provide, nextTick } from 'vue'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import { useDictData } from '@/stores/dictData'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData'
const dictData = useDictData() const dictData = useDictData()
defineOptions({
name: 'harmonic-boot/run/terminalmessage'
})
const view = ref(true) const view = ref(true)
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type', 'Voltage_Level', 'Load_Type']) const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type', 'Voltage_Level', 'Load_Type'])
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
@@ -134,37 +135,41 @@ const terminalstatus = [
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '/device-boot/runManage/getRuntimeData', url: '/device-boot/runManage/getRuntimeData',
method: 'POST', method: 'POST',
isWebPaging: true,
column: [ column: [
{ {
field: 'index', field: 'index',
title: '序号', title: '序号',
width: '80', width: '70',
formatter: (row: any) => { formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1 return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
} }
}, },
{ field: 'areaName', title: '区域', minWidth: 100 }, { field: 'areaName', title: '区域', minWidth: 90 },
{ field: 'gdName', title: '地级区', minWidth: 100 }, { field: 'gdName', title: '市公司', minWidth: 110 },
{ {
field: 'bdName', field: 'bdName',
title: '供电公司', title: '变电站',
minWidth: 100 minWidth: 110
},
{
field: 'objName',
title: '用户对象',
minWidth: 110
}, },
{ field: 'manufacturer', title: '厂家', minWidth: 100 }, { field: 'manufacturer', title: '厂家', minWidth: 100 },
{ field: 'devName', title: '终端名称', minWidth: 80 }, { field: 'devName', title: '终端名称', minWidth: 100 },
{ field: 'ip', title: '网络参数' ,width:'120px' }, { field: 'ip', title: '网络参数' ,width:110 },
{ field: 'loginTime', title: '投运时间', minWidth: 100 }, { field: 'loginTime', title: '投运时间', minWidth: 90 },
{ field: 'devType', title: '终端型号', minWidth: 100 }, { field: 'devType', title: '终端型号', minWidth: 100 },
{ field: 'port', title: '端口', minWidth: 100 }, { field: 'port', title: '端口', minWidth: 60 },
{ field: 'updateTime', title: '最新数据', minWidth: 100 }, { field: 'updateTime', title: '最新数据', minWidth: 110 },
{ {
field: 'runFlag', field: 'runFlag',
title: '终端状态', title: '终端状态',
// effect: 'dark', // effect: 'dark',
render: 'tag', render: 'tag',
minWidth: 100, minWidth: 70,
custom: { custom: {
投运: 'success', 投运: 'success',
检修: 'warning', 检修: 'warning',
@@ -176,56 +181,45 @@ const tableStore = new TableStore({
title: '通讯状态', title: '通讯状态',
render: 'tag', render: 'tag',
// effect: 'dark', // effect: 'dark',
minWidth: 100, minWidth: 70,
custom: { custom: {
正常: 'success', 正常: 'success',
中断: 'danger' 中断: 'danger'
} }
}, },
{
field: 'onlineEvaluate',
title: '在线率评价',
render: 'tag',
// effect: 'dark',
minWidth: 100,
custom: {
'/': 'info',
: 'success',
: 'warning',
: 'danger'
}
}
], ],
loadCallback: () => { beforeSearchFun: () => {
tableStore.table.webPagingData.map((item1: any) => { tableStore.table.params.serverName = 'harmonic-boot'
item1.map((item: any) => { tableStore.table.params.statisticalType = {
item.onlineEvaluate == 3.14159 name: '电网拓扑',
? (item.onlineEvaluate = '/') code: 'Power_Network'
: item.onlineEvaluate <= 0.6 }
? (item.onlineEvaluate = '差')
: item.onlineEvaluate <= 0.9
? (item.onlineEvaluate = '良')
: item.onlineEvaluate <= 1
? (item.onlineEvaluate = '优')
: '/'
})
})
tableStore.table.params.runFlag = []
if (tableStore.table.params.runF != null && tableStore.table.params.runF != '') {
tableStore.table.params.runFlag = [tableStore.table.params.runF]
}
tableStore.table.params.comFlag = []
if (tableStore.table.params.comF != null&&tableStore.table.params.comF != '') {
tableStore.table.params.comFlag = [tableStore.table.params.comF]
}
} }
}) })
tableStore.table.params.runF = ''
tableStore.table.params.comF = ''
tableStore.table.params.statisticalType = classificationData[0] tableStore.table.params.statisticalType = classificationData[0]
tableStore.table.params.serverName = 'harmonic-boot' tableStore.table.params.serverName = 'harmonic-boot'
tableStore.table.params.comFlag = [] tableStore.table.params.comFlag = []
tableStore.table.params.runFlag = [] tableStore.table.params.runFlag = []
tableStore.table.params.evaluate = '' tableStore.table.params.searchValue = ''
tableStore.table.params.powerFlag = 2 tableStore.table.params.powerFlag = 2
tableStore.table.params.monitorFlag = 2 tableStore.table.params.monitorFlag = 2
tableStore.table.params.scale = [] tableStore.table.params.scale = []
tableStore.table.params.manufacturer = [] tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = [] tableStore.table.params.loadType = []
const wp = ref({})
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {

View File

@@ -8621,6 +8621,91 @@ const 葫芦岛 = [
] ]
] ]
const = [
[
{ lng: 110.106525, lat:20.026851},
{ lng: 110.161895, lat:19.977693},
{ lng: 110.143932, lat:19.889106},
{ lng: 110.186246, lat:19.864193},
{ lng: 110.228283, lat:19.753767},
{ lng: 110.208468, lat:19.716679},
{ lng: 110.222357, lat:19.67974},
{ lng: 110.262449, lat:19.687318},
{ lng: 110.314208, lat:19.697421},
{ lng: 110.340041, lat:19.720625},
{ lng: 110.393373, lat:19.698053},
{ lng: 110.372633, lat:19.654004},
{ lng: 110.401151, lat:19.606626},
{ lng: 110.455687, lat:19.574559},
{ lng: 110.486705, lat:19.593357},
{ lng: 110.519297, lat:19.563341},
{ lng: 110.540223, lat:19.535532},
{ lng: 110.611518, lat:19.526841},
{ lng: 110.641333, lat:19.549122},
{ lng: 110.636148, lat:19.593989},
{ lng: 110.672814, lat:19.647214},
{ lng: 110.623463, lat:19.664109},
{ lng: 110.623, lat:19.735461},
{ lng: 110.670314, lat:19.812776},
{ lng: 110.704665, lat:19.805992},
{ lng: 110.699573, lat:19.861512},
{ lng: 110.676147, lat:19.860092},
{ lng: 110.675314, lat:19.907868},
{ lng: 110.634666, lat:19.965401},
{ lng: 110.598, lat:19.98305},
{ lng: 110.526612, lat:20.075206},
{ lng: 110.495039, lat:20.077253},
{ lng: 110.387355, lat:20.11347},
{ lng: 110.318467, lat:20.109061},
{ lng: 110.293282, lat:20.059614},
{ lng: 110.24319, lat:20.077568},
{ lng: 110.144395, lat:20.074418},
{ lng: 110.106525, lat:20.026851}
]
]
const =[
[
{ lng: 108.932374, lat:18.335288},
{ lng: 108.956448, lat:18.307433},
{ lng: 109.006632, lat:18.323032},
{ lng: 109.108298, lat:18.323828},
{ lng: 109.138668, lat:18.267791},
{ lng: 109.174686, lat:18.260149},
{ lng: 109.28811, lat:18.264925},
{ lng: 109.355887, lat:18.214922},
{ lng: 109.441349, lat:18.199153},
{ lng: 109.4632, lat:18.177171},
{ lng: 109.527366, lat:18.169046},
{ lng: 109.561718, lat:18.143554},
{ lng: 109.63792, lat:18.171595},
{ lng: 109.72616, lat:18.177808},
{ lng: 109.749863, lat:18.19326},
{ lng: 109.783381, lat:18.337516},
{ lng: 109.805418, lat:18.347543},
{ lng: 109.785048, lat:18.426622},
{ lng: 109.809955, lat:18.459388},
{ lng: 109.781159, lat:18.51107},
{ lng: 109.725234, lat:18.493102},
{ lng: 109.710882, lat:18.426462},
{ lng: 109.665883, lat:18.391462},
{ lng: 109.539866, lat:18.396713},
{ lng: 109.515607, lat:18.429008},
{ lng: 109.536996, lat:18.490717},
{ lng: 109.535237, lat:18.53142},
{ lng: 109.506163, lat:18.551291},
{ lng: 109.423386, lat:18.574657},
{ lng: 109.405146, lat:18.623443},
{ lng: 109.332832, lat:18.575451},
{ lng: 109.313295, lat:18.517429},
{ lng: 109.246537, lat:18.558921},
{ lng: 109.203574, lat:18.553517},
{ lng: 109.185056, lat:18.507095},
{ lng: 109.195148, lat:18.469407},
{ lng: 109.072557, lat:18.452231},
{ lng: 109.015243, lat:18.422645},
{ lng: 108.932374, lat:18.335288}
]
]
export default { export default {
zjkJSON, zjkJSON,
lfJSON, lfJSON,
@@ -8640,5 +8725,7 @@ export default {
, ,
, ,
, ,
,
,
} }

View File

@@ -32,7 +32,7 @@
<div class="statistics-box"> <div class="statistics-box">
<MyEChart style="height: 250px" :options="picEChart1" /> <MyEChart style="height: 250px" :options="picEChart1" />
<el-table size="small" height="250px" :data="resembleData"> <el-table size="small" height="250px" :data="resembleData">
<el-table-column prop="name" label="触发类型" width="80px" align="center" /> <el-table-column prop="name" label="暂降类型" width="80px" align="center" />
<el-table-column prop="value" label="暂降次数" width="80px" align="center" /> <el-table-column prop="value" label="暂降次数" width="80px" align="center" />
</el-table> </el-table>
</div> </div>

View File

@@ -53,6 +53,10 @@
</div> </div>
<div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div> <div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div>
</div> </div>
<baidu-map <baidu-map
class="map" class="map"
:style="height" :style="height"
@@ -329,6 +333,16 @@ const boundaryList: any = ref([
orgName: '鞍山', orgName: '鞍山',
LngLat: [122.808845, 40.840049], LngLat: [122.808845, 40.840049],
boundary: mapJson['鞍山'] boundary: mapJson['鞍山']
},
{
orgName: '海口',
LngLat: [110.32, 20.03],
boundary: mapJson['海口']
},
{
orgName: '三亚',
LngLat: [109.51, 18.25],
boundary: mapJson['三亚']
} }
]) ])
@@ -338,8 +352,10 @@ const siteList = ref<any>([])
const polyline = ref<any>([]) const polyline = ref<any>([])
const lineId = ref('') const lineId = ref('')
const center = ref({ const center = ref({
lng: 122.42588, lng: 122.42588,
lat: 40.810977 lat: 40.810977
// lng: 109.5, // 海南经度
// lat: 18.5 // 海南纬度
}) })
const infoWindowPoint = ref<anyObj>({ const infoWindowPoint = ref<anyObj>({
lng: 0, lng: 0,

View File

@@ -363,7 +363,7 @@ defineExpose({
.actionButtons { .actionButtons {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
.loading-container { .loading-container {

View File

@@ -28,6 +28,7 @@
</el-collapse-item> </el-collapse-item>
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3"> <el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
<div style="height: 200px"> <div style="height: 200px">
<vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute" v-loading="item.loading"> <vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute" v-loading="item.loading">
<vxe-column type="seq" title="序号" width="80px"></vxe-column> <vxe-column type="seq" title="序号" width="80px"></vxe-column>
<vxe-column <vxe-column

View File

@@ -32,7 +32,7 @@
<el-form-item label="用户名称" prop="assessName"> <el-form-item label="用户名称" prop="assessName">
<el-input <el-input
v-model="form.assessName" v-model="form.assessName"
placeholder="用户名称" placeholder="请输入用户名称"
clearable clearable
show-word-limit show-word-limit
maxlength="32" maxlength="32"
@@ -127,7 +127,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="变电站电压等级" prop="powerstationScale"> <el-form-item label="变电站电压等级" prop="powerstationScale">
<el-select v-model="form.powerstationScale" disabled clearable placeholder="请选择变电站"> <el-select v-model="form.powerstationScale" disabled clearable placeholder="请选择变电站电压等级">
<el-option <el-option
v-for="item in voltageleveloption" v-for="item in voltageleveloption"
:key="item.id" :key="item.id"
@@ -147,7 +147,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="母线电压等级" prop="busScale"> <el-form-item label="母线电压等级" prop="busScale">
<el-select v-model="form.busScale" disabled clearable placeholder="请选择母线"> <el-select v-model="form.busScale" disabled clearable placeholder="请选择母线电压等级">
<el-option <el-option
v-for="item in voltageleveloption" v-for="item in voltageleveloption"
:key="item.id" :key="item.id"
@@ -189,7 +189,7 @@
</el-form-item> </el-form-item>
<el-form-item label="导线类型" prop="linetypeId"> <el-form-item label="导线类型" prop="linetypeId">
<el-select v-model="form.linetypeId" clearable placeholder="请选择变电站"> <el-select v-model="form.linetypeId" clearable placeholder="请选择导线类型">
<el-option <el-option
v-for="item in linetypeList" v-for="item in linetypeList"
:key="item.linetypeId" :key="item.linetypeId"
@@ -404,7 +404,7 @@ const info = async (id?: string) => {
const getUserList = async (e?: any) => { const getUserList = async (e?: any) => {
selectUserAssessMentList({ orgId: form.value.deptId, secondAssessmentId: form.value.assessId || '' }).then(res => { selectUserAssessMentList({ orgId: form.value.deptId, secondAssessmentId: form.value.assessId || '' }).then(res => {
userList.value = res.data userList.value = res.data
console.log('🚀 ~ getUserList ~ e:', e)
if (e) { if (e) {
assessMentId.value = res.data.filter(item => item.secondAssessmentId == form.value.assessId)[0]?.id || '' assessMentId.value = res.data.filter(item => item.secondAssessmentId == form.value.assessId)[0]?.id || ''
} else { } else {
@@ -454,7 +454,7 @@ onMounted(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.actionButtons { .actionButtons {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
:deep(.el-collapse-item__header) { :deep(.el-collapse-item__header) {
// font-family: AlimamaDongFangDaKai; // font-family: AlimamaDongFangDaKai;

View File

@@ -102,7 +102,7 @@ import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
import { cableList, batchDel } from '@/api/advance-boot/assess' import { cableList, batchDel } from '@/api/advance-boot/assess'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import Form from './form.vue' import Form from './form.vue'
import { selectUserList, bindAssessmentId } from '@/api/device-boot/Business' import { bindAssessmentId } from '@/api/device-boot/Business'
import { forEach } from 'min-dash' import { forEach } from 'min-dash'
defineOptions({ defineOptions({
name: 'runManage/addUser' name: 'runManage/addUser'

View File

@@ -467,6 +467,7 @@ const dictionary = () => {
} }
onBeforeMount(async () => { onBeforeMount(async () => {
await dictionary() await dictionary()
info(0) // 变压器参数维护 info(0) // 变压器参数维护
info(1) // 电容器参数维护 info(1) // 电容器参数维护

View File

@@ -1,231 +1,231 @@
<template> <template>
<div :style="height" style="overflow-y: auto" class="pd10"> <div :style="height" style="overflow-y: auto" class="pd10">
<!-- <MyEChart :options="options" /> --> <!-- <MyEChart :options="options" /> -->
<div v-for="(item, index) in List"> <div v-for="(item, index) in List">
<div class="box" @mouseenter="item.flag = false" @mouseleave="item.flag = true"> <div class="box" @mouseenter="item.flag = false" @mouseleave="item.flag = true">
<div class="div">{{ item.name }} <span>({{ item.count }})</span></div> <div class="div">{{ item.name }} <span>({{ item.count }})</span></div>
<!-- <el-progress style="flex: 1" :percentage="(item.count / total).toFixed(2) * 100"> <!-- <el-progress style="flex: 1" :percentage="(item.count / total).toFixed(2) * 100">
<span>{{ item.count }}</span> <span>{{ item.count }}</span>
</el-progress> --> </el-progress> -->
<el-progress style="flex: 1" :percentage="item.score" :color="ratingColor(item.score)"> <el-progress style="flex: 1" :percentage="item.score" :color="ratingColor(item.score)">
<span v-if="item.flag" :style="`color:${ratingColor(item.score)}`"> <span v-if="item.flag" :style="`color:${ratingColor(item.score)}`">
{{ ratingName(item.score) }} {{ ratingName(item.score) }}
</span> </span>
<span v-else :style="`color:${ratingColor(item.score)}`">{{ item.score }}</span> <span v-else :style="`color:${ratingColor(item.score)}`">{{ item.score }}</span>
</el-progress> </el-progress>
</div> </div>
<el-divider /> <el-divider />
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import MyEChart from '@/components/echarts/MyEchart.vue' import MyEChart from '@/components/echarts/MyEchart.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { areaTerminalStatistic } from '@/api/device-boot/runEvaluate' import { areaTerminalStatistic } from '@/api/device-boot/runEvaluate'
const height = mainHeight(220, 1.5) const height = mainHeight(220, 1.5)
const props = defineProps({ const props = defineProps({
params: { params: {
type: Object, type: Object,
default: () => {} default: () => {}
} }
}) })
const List: any = ref([]) const List: any = ref([])
const total: any = ref(0) const total: any = ref(0)
const options = ref({}) const options = ref({})
const format = percentage => percentage + '分' const format = percentage => percentage + '分'
const info = () => { const info = () => {
areaTerminalStatistic(props.params).then(res => { areaTerminalStatistic(props.params).then(res => {
total.value = res.data.reduce((sum, item) => sum + Number(item.count), 0) total.value = res.data.reduce((sum, item) => sum + Number(item.count), 0)
List.value = res.data List.value = res.data
List.value.forEach(item => { List.value.forEach(item => {
item.flag = true item.flag = true
}) })
}) })
// let dataSource = [ // let dataSource = [
// { value: '90', name: '张家口' }, // { value: '90', name: '张家口' },
// { value: '80', name: '廊坊' }, // { value: '80', name: '廊坊' },
// { value: '70', name: '秦皇岛' }, // { value: '70', name: '秦皇岛' },
// { value: '60', name: '唐山' }, // { value: '60', name: '唐山' },
// { value: '50', name: '承德' } // { value: '50', name: '承德' }
// ] // ]
// options.value = { // options.value = {
// grid: { // grid: {
// top: '10' // top: '10'
// }, // },
// toolbox: { // toolbox: {
// show: false // show: false
// }, // },
// options: { // options: {
// yAxis: { // yAxis: {
// type: 'category', // type: 'category',
// data: dataSource.map(item => item.name), // data: dataSource.map(item => item.name),
// // axisLabel: { // // axisLabel: {
// // color: '#fff' // // color: '#fff'
// // }, // // },
// splitLine: { // splitLine: {
// show: false // show: false
// } // }
// }, // },
// xAxis: { // xAxis: {
// type: 'value', // type: 'value',
// data: [1, 2, 3, 4], // data: [1, 2, 3, 4],
// axisLabel: { // axisLabel: {
// show: true // show: true
// // textStyle: { // // textStyle: {
// // color: '#FFF' // // color: '#FFF'
// // }, // // },
// // formatter: function (value) { // // formatter: function (value) {
// // } // // }
// }, // },
// splitLine: { // splitLine: {
// show: false // show: false
// }, // },
// axisTick: { // axisTick: {
// show: false // show: false
// }, // },
// axisLine: { // axisLine: {
// show: true // show: true
// } // }
// }, // },
// dataZoom: null, // dataZoom: null,
// series: [ // series: [
// { // {
// type: 'bar', // type: 'bar',
// itemStyle: { // itemStyle: {
// color: function (params) { // color: function (params) {
// return params.value >= 90 // return params.value >= 90
// ? '#00b07d' // ? '#00b07d'
// : params.value >= 80 // : params.value >= 80
// ? '#2b7fd3' // ? '#2b7fd3'
// : params.value >= 70 // : params.value >= 70
// ? '#ffcc33' // ? '#ffcc33'
// : '#c00' // : '#c00'
// } // }
// }, // },
// markLine: { // markLine: {
// silent: false, // silent: false,
// symbol: 'circle', // symbol: 'circle',
// data: [ // data: [
// { // {
// name: '', // name: '',
// yAxis: 100, // yAxis: 100,
// lineStyle: { // lineStyle: {
// color: '#2E8B57' // color: '#2E8B57'
// }, // },
// label: { // label: {
// show: true, // show: true,
// formatter: '优质', // formatter: '优质',
// color: '#2E8B57' // color: '#2E8B57'
// } // }
// }, // },
// { // {
// name: '', // name: '',
// yAxis: 90, // yAxis: 90,
// lineStyle: { // lineStyle: {
// color: '#77DA63' // color: '#77DA63'
// }, // },
// label: { // label: {
// show: true, // show: true,
// color: '#77DA63', // color: '#77DA63',
// formatter: '良好' // formatter: '良好'
// } // }
// }, // },
// { // {
// name: '', // name: '',
// yAxis: 60, // yAxis: 60,
// lineStyle: { // lineStyle: {
// color: '#DAA520' // color: '#DAA520'
// }, // },
// label: { // label: {
// show: true, // show: true,
// color: '#DAA520', // color: '#DAA520',
// formatter: '合格' // formatter: '合格'
// } // }
// } // }
// ] // ]
// }, // },
// data: dataSource.map(item => item.value) // data: dataSource.map(item => item.value)
// } // }
// ] // ]
// } // }
// } // }
} }
const ratingColor = (num: number) => { const ratingColor = (num: number) => {
if (num >= 90) { if (num >= 90) {
return '#00b07d' return '#00b07d'
} else if (num >= 80) { } else if (num >= 80) {
return '#2b7fd3' return '#2b7fd3'
} else if (num >= 70) { } else if (num >= 70) {
return '#ff8c00' return '#ff8c00'
} else { } else {
return '#c00' return '#c00'
} }
} }
const ratingName = (num: number) => { const ratingName = (num: number) => {
if (num >= 90) { if (num >= 90) {
return '优秀' return '优秀'
} else if (num >= 80) { } else if (num >= 80) {
return '良好' return '良好'
} else if (num >= 70) { } else if (num >= 70) {
return '一般' return '一般'
} else { } else {
return '较差' return '较差'
} }
} }
onMounted(() => { onMounted(() => {
// info() // info()
}) })
defineExpose({ defineExpose({
info info
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.btnsBox { .btnsBox {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
::v-deep .el-radio-button__inner { ::v-deep .el-radio-button__inner {
padding: 8px 18px; padding: 8px 18px;
background: var(--el-color-primary); background: var(--el-color-primary);
border: 1px solid #00fff4; border: 1px solid #00fff4;
border-radius: 0; border-radius: 0;
font-weight: normal; font-weight: normal;
color: #ffffff; color: #ffffff;
text-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.73); text-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.73);
opacity: 0.52; opacity: 0.52;
} }
::v-deep .el-radio-button:last-child .el-radio-button__inner { ::v-deep .el-radio-button:last-child .el-radio-button__inner {
border-radius: 0; border-radius: 0;
} }
::v-deep .el-radio-button:first-child .el-radio-button__inner { ::v-deep .el-radio-button:first-child .el-radio-button__inner {
border-radius: 0; border-radius: 0;
border-left: 1px solid #00fff4; border-left: 1px solid #00fff4;
} }
::v-deep .is-active { ::v-deep .is-active {
border: 1px solid #00fff4; border: 1px solid #00fff4;
opacity: 1 !important; opacity: 1 !important;
color: #ffffff; color: #ffffff;
background: var(--el-color-primary); background: var(--el-color-primary);
.el-radio-button__inner { .el-radio-button__inner {
opacity: 1 !important; opacity: 1 !important;
border-left: 1px solid #00fff4 !important; border-left: 1px solid #00fff4 !important;
} }
} }
.box { .box {
cursor: pointer; cursor: pointer;
// display: flex; // display: flex;
.div { .div {
// width: 100px; // width: 100px;
font-size: 16px; font-size: 16px;
span{ span{
font-size: 14px; font-size: 14px;
} }
} }
} }
:deep(.el-divider--horizontal) { :deep(.el-divider--horizontal) {
margin: 5px 0; margin: 5px 0;
} }
</style> </style>

View File

@@ -235,7 +235,7 @@ defineExpose({ open })
} }
.form { .form {
// display: flex; // display: flex;
// justify-content: end; // justify-content: flex-end;
// position: relative; // position: relative;
// .form_but { // .form_but {

View File

@@ -12,6 +12,16 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="通讯状态">
<el-select v-model="tableStore.table.params.comF" clearable placeholder="请选择通讯状态">
<el-option
v-for="item in comFlagList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据筛选"> <el-form-item label="数据筛选">
<el-input <el-input
style="width: 200px" style="width: 200px"
@@ -19,7 +29,7 @@
v-model="tableStore.table.params.searchValue" v-model="tableStore.table.params.searchValue"
clearable clearable
maxlength="32" maxlength="32"
show-word-limit show-word-limit
></el-input> ></el-input>
</el-form-item> </el-form-item>
</template> </template>
@@ -71,6 +81,7 @@ const tableStore = new TableStore({
{ field: 'bdName', title: '所属变电站', minWidth: 120 }, { field: 'bdName', title: '所属变电站', minWidth: 120 },
{ field: 'devName', title: '终端名称', minWidth: 110 }, { field: 'devName', title: '终端名称', minWidth: 110 },
{ field: 'loginTime', title: '投运时间', minWidth: 100 }, { field: 'loginTime', title: '投运时间', minWidth: 100 },
{ field: 'updateTime', title: '最新数据时间', minWidth: 150 },
{ {
field: 'manufacturer', field: 'manufacturer',
title: '厂家', title: '厂家',
@@ -79,7 +90,18 @@ const tableStore = new TableStore({
{ field: 'devType', title: '终端型号', minWidth: 100 }, { field: 'devType', title: '终端型号', minWidth: 100 },
{ field: 'ip', title: '终端网络参数', width: '120px' }, { field: 'ip', title: '终端网络参数', width: '120px' },
{ field: 'port', title: '端口号', minWidth: 40 }, { field: 'port', title: '端口号', minWidth: 70 },
{
field: 'comFlag',
title: '通讯状态',
minWidth: 80,
render: 'tag',
custom: {
正常: 'success',
中断: 'danger',
'/': 'primary'
}
},
{ {
field: 'runFlag', field: 'runFlag',
title: '运行状态', title: '运行状态',
@@ -125,10 +147,15 @@ const tableStore = new TableStore({
if (tableStore.table.params.runF != null) { if (tableStore.table.params.runF != null) {
tableStore.table.params.runFlag = [tableStore.table.params.runF] tableStore.table.params.runFlag = [tableStore.table.params.runF]
} }
tableStore.table.params.comFlag = []
if (tableStore.table.params.comF != null) {
tableStore.table.params.comFlag = [tableStore.table.params.comF]
}
} }
}) })
tableStore.table.params.runF = 0 tableStore.table.params.runF = 0
tableStore.table.params.comF = ''
tableStore.table.params.runFlag = [] tableStore.table.params.runFlag = []
tableStore.table.params.searchValue = '' tableStore.table.params.searchValue = ''
@@ -139,6 +166,10 @@ const runFlagList = [
{ id: 3, name: '调试' }, { id: 3, name: '调试' },
{ id: 4, name: '退运' } { id: 4, name: '退运' }
] ]
const comFlagList = [
{ name: '正常', id: 1 },
{ name: '中断', id: 0 }
]
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {

View File

@@ -220,6 +220,23 @@ const tableStore = new TableStore({
beforeSearchFun: () => { beforeSearchFun: () => {
tableStore.table.params.orgNo = tableStore.table.params.deptIndex tableStore.table.params.orgNo = tableStore.table.params.deptIndex
},
exportProcessingData: () => {
tableStore.table.allData = tableStore.table.allData.filter(item => {
item.userStatus =
item.userStatus == 0 ? '可研' : item.userStatus == 1 ? '建设' : item.userStatus == 2 ? '运行' : '退运'
item.status =
item.status == 0
? '待提交审批'
: item.status == 1
? '审批中'
: item.status == 2
? '审批通过'
: item.status == 3
? '审批不通过'
: '已取消'
return item
})
} }
}) })
tableStore.table.params.city = '' tableStore.table.params.city = ''

View File

@@ -169,6 +169,14 @@ const tableStore = new TableStore({
beforeSearchFun: () => { beforeSearchFun: () => {
tableStore.table.params.orgNo = tableStore.table.params.deptIndex tableStore.table.params.orgNo = tableStore.table.params.deptIndex
},
exportProcessingData: () => {
tableStore.table.allData = tableStore.table.allData.filter(item => {
item.userStatus =
item.userStatus == 0 ? '可研' : item.userStatus == 1 ? '建设' : item.userStatus == 2 ? '运行' : '退运'
return item
})
} }
}) })
tableStore.table.params.city = '' tableStore.table.params.city = ''

View File

@@ -357,6 +357,7 @@ import {
import { getAllDeptList } from '@/api/common' import { getAllDeptList } from '@/api/common'
import { getTerminalDetailsById } from '@/api/supervision-boot/terminal/index' import { getTerminalDetailsById } from '@/api/supervision-boot/terminal/index'
import { nodeAllList } from '@/api/device-boot/Business' import { nodeAllList } from '@/api/device-boot/Business'
import { getDeviceTypeList } from '@/api/device-boot/modelManage'
const emits = defineEmits(['onSubmit']) const emits = defineEmits(['onSubmit'])
const dictData = useDictData() const dictData = useDictData()
const dialogFormVisible = ref(false) const dialogFormVisible = ref(false)
@@ -377,7 +378,8 @@ const neutralPointWiringMethodList = dictData.getBasicData('Neutral_Point')
//字典获取厂家 //字典获取厂家
const manufacturerList = dictData.getBasicData('Dev_Manufacturers') const manufacturerList = dictData.getBasicData('Dev_Manufacturers')
//字典获取终端型号 //字典获取终端型号
const terminalTypeList = dictData.getBasicData('Dev_Type') //const terminalTypeList = dictData.getBasicData('Dev_Type')
const terminalTypeList = ref([])
//字典获取数据类型 //字典获取数据类型
const dataTypeList = [ const dataTypeList = [
{ {
@@ -432,7 +434,7 @@ const terminalModelList = [
const substationList: any = ref([]) const substationList: any = ref([])
//字典获取通讯类型 //字典获取通讯类型
const frontTypeList = dictData.getBasicData('Front_Type', ['CLD', '61850']) const frontTypeList = dictData.getBasicData('Front_Type', ['CLD', '61850'])
console.log("🚀 ~ frontTypeList:", frontTypeList) //console.log("🚀 ~ frontTypeList:", frontTypeList)
//定义通讯状态下拉框数据 //定义通讯状态下拉框数据
const communicationStatusList = [ const communicationStatusList = [
{ {
@@ -539,6 +541,7 @@ const getPowerCompanyList = async (flag: any) => {
getAllDeptList().then(res => { getAllDeptList().then(res => {
powerCompanyList.value = res.data[0].children[0].children powerCompanyList.value = res.data[0].children[0].children
if (flag) { if (flag) {
getSubstationVoltageLevel({ getSubstationVoltageLevel({
orgIds: [ orgIds: [
powerCompanyList.value.find( powerCompanyList.value.find(
@@ -1168,12 +1171,26 @@ const disabledDate = time => {
const importType = ref(null) const importType = ref(null)
const resendId = ref('') const resendId = ref('')
const open = async (row: any) => { const open = async (row: any) => {
console.log('🚀 ~ open ~ row:', row.row)
let flag = row.row ? true : false let flag = row.row ? true : false
importType.value = null importType.value = null
if (!flag) await getPowerCompanyList(false) if (!flag) await getPowerCompanyList(false)
title.value = row.title title.value = row.title
dialogFormVisible.value = true dialogFormVisible.value = true
const params = {
pageNum: 1,
pageSize: 100,
searchState: '',
searchValue: ''
}
await getDeviceTypeList(params).then((res: any) => {
terminalTypeList.value = res.data.records.map((item: any) => ({
id: item.id,
name: item.name
}))
})
if (row.row) { if (row.row) {
resendId.value = row.row.id resendId.value = row.row.id
importType.value = row.row.importType importType.value = row.row.importType

View File

@@ -384,7 +384,7 @@ const startRunTest = () => {
// 下载报告 // 下载报告
const downloadTheReport = (url: string) => { const downloadTheReport = (url: string) => {
getFileNameAndFilePath({ filePath: url }).then((res: any) => { getFileNameAndFilePath({ filePath: url }).then((res: any) => {
console.log(res.data.url, 'res') //console.log(res.data.url, 'res')
const link = document.createElement('a') const link = document.createElement('a')
link.href = res.data.url link.href = res.data.url
link.download = res.data.name link.download = res.data.name

View File

@@ -1,23 +1,37 @@
<template> <template>
<div class="flex"> <div class="flex">
<span style="width: 100px; margin-top: 3px">电压等级:</span> <span style="width: 100px; margin-top: 3px">电压等级:</span>
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" <el-checkbox
style="margin-right: 28px"> :indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="margin-right: 28px"
>
全选 全选
</el-checkbox> </el-checkbox>
<el-checkbox-group v-model="checkedVoltage" @change="handleCheckedVoltageChange" <el-checkbox-group
style="height: 72px; overflow-y: auto; flex: 1"> v-model="checkedVoltage"
@change="handleCheckedVoltageChange"
style="height: 72px; overflow-y: auto; flex: 1"
>
<el-checkbox v-for="(item, index) in grade" :label="item" :key="index">{{ item.name }}</el-checkbox> <el-checkbox v-for="(item, index) in grade" :label="item" :key="index">{{ item.name }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
<div class="flex"> <div class="flex">
<span style="width: 100px; margin-top: 3px">干扰源类型:</span> <span style="width: 100px; margin-top: 3px">干扰源类型:</span>
<el-checkbox :indeterminate="isIndeterminate1" v-model="checkAll1" @change="handleCheckAllChange1" <el-checkbox
style="margin-right: 28px"> :indeterminate="isIndeterminate1"
v-model="checkAll1"
@change="handleCheckAllChange1"
style="margin-right: 28px"
>
全选 全选
</el-checkbox> </el-checkbox>
<el-checkbox-group v-model="checkedSource" @change="handleCheckedSourceChange" <el-checkbox-group
style="height: 72px; overflow-y: auto; flex: 1"> v-model="checkedSource"
@change="handleCheckedSourceChange"
style="height: 72px; overflow-y: auto; flex: 1"
>
<el-checkbox v-for="(item, index) in type" :label="item" :key="index">{{ item.name }}</el-checkbox> <el-checkbox v-for="(item, index) in type" :label="item" :key="index">{{ item.name }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
@@ -28,7 +42,7 @@
<el-radio label="F47">F47</el-radio> <el-radio label="F47">F47</el-radio>
</el-radio-group> </el-radio-group>
</div> </div>
<my-echart class="bars_w" :options="echartList" /> <my-echart class="bars_w" :options="echartList" @echartClick="echartClick" />
<vxe-table class="dw" :data="TableData" height="50px" v-bind="defaultAttribute"> <vxe-table class="dw" :data="TableData" height="50px" v-bind="defaultAttribute">
<vxe-column field="name" title="名称" width="100px"></vxe-column> <vxe-column field="name" title="名称" width="100px"></vxe-column>
@@ -43,7 +57,7 @@ import MyEchart from '@/components/echarts/MyEchart.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { Bottom } from '@element-plus/icons-vue/dist/types' const emit = defineEmits(['viewWave'])
const dictData = useDictData() const dictData = useDictData()
const isIndeterminate = ref(false) const isIndeterminate = ref(false)
const isIndeterminate1 = ref(false) const isIndeterminate1 = ref(false)
@@ -340,7 +354,7 @@ const gongfunction = () => {
var index = datalist.value[i].lineId var index = datalist.value[i].lineId
var eventId = datalist.value[i].eventId var eventId = datalist.value[i].eventId
var lineName = datalist.value[i].lineName var lineName = datalist.value[i].lineName
point = [xx, yy, time, company, substation, index, eventId, lineName] point = [xx, yy, time, company, substation, index, eventId, lineName, datalist.value[i]]
if (xx <= 0.003) { if (xx <= 0.003) {
var line = 0 var line = 0
@@ -468,6 +482,10 @@ const gongfunction = () => {
} }
} }
} }
const echartClick = (params: any) => {
emit('viewWave', params.value[8])
}
defineExpose({ checkedVoltage, checkedSource, info }) defineExpose({ checkedVoltage, checkedSource, info })
const layout = mainHeight(320) as any const layout = mainHeight(320) as any

View File

@@ -46,6 +46,7 @@
import { ref, reactive, defineExpose, computed } from 'vue' import { ref, reactive, defineExpose, computed } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { Console } from 'console'
const areaData: any = ref([]) const areaData: any = ref([])
const levelData: any = ref([]) const levelData: any = ref([])
@@ -69,16 +70,23 @@ const tableHeaderLevel = ref<any[]>([
const frequency = ref<number>(875) const frequency = ref<number>(875)
const info = (list: any, searchBeginTime: any, searchEndTime: any,selectedAreaName: string) => { const info = (list: any, searchBeginTime: any, searchEndTime: any,selectedAreaName: string) => {
Time.value = [searchBeginTime, searchEndTime] Time.value = [searchBeginTime, searchEndTime]
frequency.value = list.areaStatistics.frequencySum frequency.value = list.areaStatistics.frequencySum
areaName.value = selectedAreaName // 更新区域名称 areaName.value = selectedAreaName // 更新区域名称
let allSarfi9 = 0
list.areaStatistics.areaCalculation.forEach((item: any) => {
allSarfi9 += item.sarfi9
})
areaData.value = [ areaData.value = [
{ {
areaName: '总计', areaName: '总计',
monitoringPoints: list.areaStatistics.monitoringPointSum, monitoringPoints: list.areaStatistics.monitoringPointSum,
frequency: list.areaStatistics.frequencySum, frequency: list.areaStatistics.frequencySum,
sarfi9: '/' sarfi9: allSarfi9,
}, },
...list.areaStatistics.areaCalculation ...list.areaStatistics.areaCalculation
] ]
@@ -91,19 +99,23 @@ const info = (list: any, searchBeginTime: any, searchEndTime: any,selectedAreaNa
}, },
...list.voltageStatistics.voltageLevelCalculation ...list.voltageStatistics.voltageLevelCalculation
] ]
let all = 0 let all = 0
list.monthlyStatistics.monthCalculation.forEach((item: any) => { list.monthlyStatistics.monthCalculation.forEach((item: any) => {
all += item.linked + item.notAssociated all += item.linked + item.notAssociated
}) })
shareData.value = [ shareData.value = [
{ {
month: '总计', month: '总计',
notAssociated: all.toFixed(2) notAssociated: all,
}, },
...list.monthlyStatistics.monthCalculation ...list.monthlyStatistics.monthCalculation.map((item: any) => ({
month: item.month,
notAssociated: item.notAssociated + item.linked
}))
] ]
} }

View File

@@ -1,5 +1,5 @@
<template> <template>
<span style="color: red; font-size: 12px">:触发类型仅统计暂降原因为短路故障事件</span> <span style="color: red; font-size: 12px">:暂降类型仅统计暂降原因为短路故障事件</span>
<div class="statistics-main"> <div class="statistics-main">
<template v-if="flag"> <template v-if="flag">
@@ -17,7 +17,7 @@
</div> </div>
<div> <div>
<vxe-table height="auto" auto-resize :data="resembleData" v-bind="defaultAttribute"> <vxe-table height="auto" auto-resize :data="resembleData" v-bind="defaultAttribute">
<vxe-column field="name" title="触发类型"></vxe-column> <vxe-column field="name" title="暂降类型"></vxe-column>
<vxe-column field="value" title="暂降次数"></vxe-column> <vxe-column field="value" title="暂降次数"></vxe-column>
</vxe-table> </vxe-table>
</div> </div>
@@ -86,7 +86,7 @@ const info = (res: any) => {
} }
resemble.value = { resemble.value = {
title: { title: {
text: '触发类型' text: '暂降类型'
}, },
legend: { legend: {
type: 'scroll', type: 'scroll',
@@ -109,7 +109,7 @@ const info = (res: any) => {
options: { options: {
series: [ series: [
{ {
name: '触发类型', name: '暂降类型',
type: 'pie', type: 'pie',
center: ['50%', '50%'], center: ['50%', '50%'],
selectedOffset: 30, selectedOffset: 30,

View File

@@ -22,11 +22,11 @@ const Processing = (list: any) => {
let echartsArr: string[] = [] let echartsArr: string[] = []
list.areaCalculation.forEach((item: any) => { list.areaCalculation.forEach((item: any) => {
echartsndArr.push(item.areaName) echartsndArr.push(item.areaName)
if (item.frequency == 0) { // if (item.frequency == 0) {
item.frequency = 1.1 // item.frequency = 1.1
} else if (item.frequency == 1) { // } else if (item.frequency == 1) {
item.frequency = 1.3 // item.frequency = 1.3
} // }
echartsArr.push(item.frequency) echartsArr.push(item.frequency)
}) })
areaStatistics.value = { areaStatistics.value = {
@@ -48,7 +48,7 @@ const Processing = (list: any) => {
return html return html
} }
}, },
color: ['#07CCCA'],
legend: { legend: {
data: ['暂降次数'] data: ['暂降次数']
}, },
@@ -68,7 +68,7 @@ const Processing = (list: any) => {
normal: { normal: {
//这里是颜色 //这里是颜色
color: function (params: any) { color: function (params: any) {
if (params.data == 1.1) { if (params.data == 0) {
return '#B3B3B3' return '#B3B3B3'
} else { } else {
return '#07CCCA ' return '#07CCCA '
@@ -90,11 +90,11 @@ const Grade = (list: any) => {
let echartsArr: string[] = [] let echartsArr: string[] = []
list.voltageLevelCalculation.forEach((item: any) => { list.voltageLevelCalculation.forEach((item: any) => {
echartsndArr.push(item.voltageLevel) echartsndArr.push(item.voltageLevel)
if (item.frequency == 0) { // if (item.frequency == 0) {
item.frequency = 1.1 // item.frequency = 1.1
} else if (item.frequency == 1) { // } else if (item.frequency == 1) {
item.frequency = 1.3 // item.frequency = 1.3
} // }
echartsArr.push(item.frequency) echartsArr.push(item.frequency)
}) })
@@ -117,7 +117,7 @@ const Grade = (list: any) => {
return html return html
} }
}, },
color: ['#07CCCA'],
legend: { legend: {
data: ['暂降次数'] data: ['暂降次数']
}, },
@@ -137,7 +137,7 @@ const Grade = (list: any) => {
normal: { normal: {
//这里是颜色 //这里是颜色
color: function (params: any) { color: function (params: any) {
if (params.data == 1.1) { if (params.data == 0) {
return '#B3B3B3' return '#B3B3B3'
} else { } else {
return '#07CCCA ' return '#07CCCA '
@@ -174,18 +174,21 @@ const Relation = (list: any, interval: number) => {
// item.linked = 3.14159; // item.linked = 3.14159;
// item.notAssociated = 3.14159; // item.notAssociated = 3.14159;
// } // }
if (item.linked == 0) { // if (item.linked == 0) {
item.linked = 1.1 // item.linked = 1.1
} else if (item.linked == 1) { // } else if (item.linked == 1) {
item.linked = 1.3 // item.linked = 1.3
} // }
echartsArr.push(item.linked) echartsArr.push(item.linked)
if (item.notAssociated == 0) { // if (item.notAssociated == 0) {
item.notAssociated = 1.1 // item.notAssociated = 1.1
} else if (item.notAssociated == 1) { // } else if (item.notAssociated == 1) {
item.notAssociated = 1.3 // item.notAssociated = 1.3
} // }
echartswArr.push(item.notAssociated) //echartswArr.push(item.notAssociated)
const total = item.notAssociated + item.linked
echartswArr.push(total)
}) })
monthlyStatistics.value = { monthlyStatistics.value = {
title: { title: {
@@ -208,9 +211,11 @@ const Relation = (list: any, interval: number) => {
}, },
legend: { legend: {
data: ['未关联暂降次数', '已关联处理事件'] data: ['暂降次数']
//data: ['未关联暂降次数', '已关联处理事件']
}, },
color: ['#07CCCA', '#Ff6600'], color: ['#07CCCA'],
//color: ['#07CCCA', '#Ff6600'],
xAxis: { xAxis: {
name: '月份', // 给X轴加单位 name: '月份', // 给X轴加单位
data: echartsndArr data: echartsndArr
@@ -221,11 +226,11 @@ const Relation = (list: any, interval: number) => {
options: { options: {
series: [ series: [
{ {
name: '未关联暂降次数', name: '暂降次数',
type: 'bar', type: 'bar',
barMaxWidth: 30, barMaxWidth: 30,
barMinHeight: 5, barMinHeight: 5,
data: echartswArr, data: echartswArr,
itemStyle: { itemStyle: {
normal: { normal: {
label: { label: {
@@ -238,7 +243,7 @@ const Relation = (list: any, interval: number) => {
} }
}, },
color: function (params: any) { color: function (params: any) {
if (params.data == 1.1) { if (params.data == 0) {
return '#B3B3B3' return '#B3B3B3'
} else { } else {
return '#07CCCA ' return '#07CCCA '
@@ -247,32 +252,32 @@ const Relation = (list: any, interval: number) => {
} }
} }
}, },
{ // {
name: '已关联处理事件', // name: '已关联处理事件',
type: 'bar', // type: 'bar',
barMaxWidth: 30, // barMaxWidth: 30,
data: echartsArr, // data: echartsArr,
itemStyle: { // itemStyle: {
normal: { // normal: {
label: { // label: {
// show: true, //数字开启显示 // // show: true, //数字开启显示
textStyle: { // textStyle: {
//数值样式 // //数值样式
color: '#fff', // color: '#fff',
fontSize: 14, // fontSize: 14,
fontWeight: 600 // fontWeight: 600
} // }
}, // },
color: function (params: any) { // color: function (params: any) {
if (params.data == 1.1) { // if (params.data == 0) {
return '#B3B3B3' // return '#B3B3B3'
} else { // } else {
return '#Ff6600' // return '#Ff6600'
} // }
} // }
} // }
} // }
} // }
] ]
} }
} }
@@ -291,3 +296,4 @@ const layout = mainHeight(150) as any
display: flex; display: flex;
} }
</style> </style>
>>>>>>> c902dabb73a92b43a23970969d750508558b5400

View File

@@ -39,6 +39,7 @@ const tableStore = new TableStore({
tableStore.table.params.searchEndTime, tableStore.table.params.searchEndTime,
currentAreaName.value // 传递当前区域名称 currentAreaName.value // 传递当前区域名称
) )
console.log('11111',tableStore.table.data)
echarts.value.Processing(tableStore.table.data.areaStatistics) echarts.value.Processing(tableStore.table.data.areaStatistics)
echarts.value.Grade(tableStore.table.data.voltageStatistics) echarts.value.Grade(tableStore.table.data.voltageStatistics)
echarts.value.Relation(JSON.parse(JSON.stringify(tableStore.table.data.monthlyStatistics))) echarts.value.Relation(JSON.parse(JSON.stringify(tableStore.table.data.monthlyStatistics)))

View File

@@ -85,6 +85,7 @@ const eliminate = (name: string) => {
// 地图数处理 // 地图数处理
const map = (res: any) => { const map = (res: any) => {
echartMapList.value = { echartMapList.value = {
name: '', name: '',
title: { title: {

View File

@@ -1,98 +1,125 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader date-picker area> <div v-show="view">
<template v-slot:select></template> <TableHeader date-picker area>
</TableHeader> <template v-slot:select></template>
<el-tabs v-model="activeName" type="border-card" @tab-change="handleClick" v-loading="tableStore.table.loading"> </TableHeader>
<el-tab-pane label="暂降原因及类型统计" name="1"> <el-tabs
<TypeStatistics ref="Statistics" /> v-model="activeName"
</el-tab-pane> type="border-card"
<el-tab-pane label="电压容忍度曲线兼容性统计" name="2"> @tab-change="handleClick"
<Compatibility ref="compatibility" /> v-loading="tableStore.table.loading"
</el-tab-pane> >
</el-tabs> <el-tab-pane label="暂降原因及类型统计" name="1">
</div> <TypeStatistics ref="Statistics" />
</template> </el-tab-pane>
<el-tab-pane label="电压容忍度曲线兼容性统计" name="2">
<!-- "area": "", <Compatibility ref="compatibility" @viewWave="viewWave" />
"city": "", </el-tab-pane>
"protocolCapacity": 0, </el-tabs>
"province": "", </div>
"region": "", <div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
"userName": "", <waveForm ref="waveFormRef" senior :boxoList="boxoList" :wp="wp" @backbxlb="backbxlb" />
"userType": "", </div>
"voltage": "" --> </div>
<script setup lang="ts"> </template>
import TableHeader from '@/components/table/header/index.vue'
<!-- "area": "",
import { useDictData } from '@/stores/dictData' "city": "",
import TableStore from '@/utils/tableStore' "protocolCapacity": 0,
import { onMounted, reactive, ref, provide } from 'vue' "province": "",
import TypeStatistics from '../components/TypeStatistics.vue' "region": "",
import Compatibility from '../components/Compatibility.vue' "userName": "",
import { mainHeight } from '@/utils/layout' "userType": "",
defineOptions({ "voltage": "" -->
name: 'Region/overview' <script setup lang="ts">
}) import TableHeader from '@/components/table/header/index.vue'
const activeName = ref('1') import waveForm from '@/components/echarts/waveForm.vue'
const Statistics = ref() import { useDictData } from '@/stores/dictData'
const compatibility = ref() import TableStore from '@/utils/tableStore'
const dictData = useDictData() import { onMounted, reactive, ref, provide } from 'vue'
import TypeStatistics from '../components/TypeStatistics.vue'
const tableStore = new TableStore({ import Compatibility from '../components/Compatibility.vue'
url: '/event-boot/areaAnalysis/getEventReason', import { mainHeight } from '@/utils/layout'
method: 'POST', defineOptions({
column: [], name: 'Region/overview'
beforeSearchFun: () => { })
if (activeName.value == '1') { const pageHeight = mainHeight(20)
tableStore.table.params.scale = null const activeName = ref('1')
tableStore.table.params.loadType = null const Statistics = ref()
} else { const compatibility = ref()
tableStore.table.params.scale = compatibility.value.checkedVoltage const dictData = useDictData()
tableStore.table.params.loadType = compatibility.value.checkedSource const view = ref(true)
} const view2 = ref(false)
}, const boxoList = ref({})
loadCallback: () => { const wp = ref({})
const tableStore = new TableStore({
url: '/event-boot/areaAnalysis/getEventReason',
if (activeName.value == '1') { method: 'POST',
Statistics.value.info(tableStore.table.data) column: [],
} else { beforeSearchFun: () => {
compatibility.value.info(tableStore.table.data.voltageToleranceCurveDataList) if (activeName.value == '1') {
} tableStore.table.params.scale = null
} tableStore.table.params.loadType = null
}) } else {
provide('tableStore', tableStore) tableStore.table.params.scale = compatibility.value.checkedVoltage
tableStore.table.params.loadType = compatibility.value.checkedSource
tableStore.table.params.statisticalType = dictData.getBasicData('Statistical_Type', ['Load_Type'])[3] }
tableStore.table.params.monitorFlag = 2 },
tableStore.table.params.powerFlag = 2 loadCallback: () => {
tableStore.table.params.serverName = 'event-boot' if (activeName.value == '1') {
onMounted(() => { Statistics.value.info(tableStore.table.data)
tableStore.index() } else {
}) compatibility.value.info(tableStore.table.data.voltageToleranceCurveDataList)
const handleClick = async (e: any) => { }
if (e == '1') { }
// tableStore.table.params.scale = null })
// tableStore.table.params.loadType = null provide('tableStore', tableStore)
tableStore.url = '/event-boot/areaAnalysis/getEventReason'
} else { tableStore.table.params.statisticalType = dictData.getBasicData('Statistical_Type', ['Load_Type'])[3]
// tableStore.table.params.scale = compatibility.value.checkedVoltage tableStore.table.params.monitorFlag = 2
// tableStore.table.params.loadType = compatibility.value.checkedSource tableStore.table.params.powerFlag = 2
tableStore.url = '/event-boot/areaAnalysis/getVoltageToleranceCurve' tableStore.table.params.serverName = 'event-boot'
} onMounted(() => {
await tableStore.onTableAction('search', {}) tableStore.index()
} })
const layout = mainHeight(123) as any const handleClick = async (e: any) => {
</script> if (e == '1') {
// tableStore.table.params.scale = null
<style lang="scss" scoped> // tableStore.table.params.loadType = null
.bars_w { tableStore.url = '/event-boot/areaAnalysis/getEventReason'
width: 100%; } else {
height: 500px; // tableStore.table.params.scale = compatibility.value.checkedVoltage
} // tableStore.table.params.loadType = compatibility.value.checkedSource
:deep(.el-tabs__content) { tableStore.url = '/event-boot/areaAnalysis/getVoltageToleranceCurve'
height: v-bind('layout.height'); }
overflow-y: auto; await tableStore.onTableAction('search', {})
} }
</style> const layout = mainHeight(123) as any
const backbxlb = () => {
view.value = true
view2.value = false
}
const waveFormRef = ref()
// 查看波形
const viewWave = (row: any) => {
view.value = false
setTimeout(() => {
waveFormRef.value.open({ ...row, startTime: row.time,
featureAmplitude:row.eventValue,
duration:row.persistTime
})
}, 100)
}
</script>
<style lang="scss" scoped>
.bars_w {
width: 100%;
height: 500px;
}
:deep(.el-tabs__content) {
height: v-bind('layout.height');
overflow-y: auto;
}
</style>

View File

@@ -240,7 +240,7 @@ const tableStore = new TableStore({
field: 'featureAmplitude', field: 'featureAmplitude',
title: '暂降(骤升)幅值(%)', title: '暂降(骤升)幅值(%)',
minWidth: '130', minWidth: '130',
formatter: ({ row }: any) => { formatter: (row: any) => {
return Math.floor(row.cellValue * 10000) / 100 return Math.floor(row.cellValue * 10000) / 100
} }
}, },

View File

@@ -29,6 +29,17 @@
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
<el-pagination
class="mt10"
:currentPage="form.pageNum"
:page-size="form.pageSize"
:page-sizes="[10, 20, 50, 100]"
background
:layout="'sizes,total, ->, prev, pager, next, jumper'"
:total="total"
@size-change="onTableSizeChange"
@current-change="onTableCurrentChange"
></el-pagination>
</el-dialog> </el-dialog>
</div> </div>
<div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view"> <div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
@@ -168,7 +179,12 @@ tableStore.table.params.searchValue = ''
const bxactiveName = ref('ssbx') const bxactiveName = ref('ssbx')
const boxoList = ref({}) const boxoList = ref({})
const wp = ref({}) const wp = ref({})
const form = ref({
pageSize: 20,
pageNum: 1,
id: ''
})
const total = ref(0)
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {
@@ -180,13 +196,47 @@ onMounted(() => {
}) })
}) })
//分析记录管理
const analysis1 = () => { // 分页
queryRelevantLogPage({}).then((res: any) => { const onTableSizeChange = (val: number) => {
form.value.pageSize = val
form.value.pageNum = 1 // 改变每页条数时回到第一页
loadAnalysisData() // 重新加载数据
}
const onTableCurrentChange = (val: number) => {
form.value.pageNum = val
loadAnalysisData() // 重新加载数据
}
// 封装数据加载逻辑
const loadAnalysisData = async () => {
try {
const params = {
pageNum: form.value.pageNum,
pageSize: form.value.pageSize
}
const res: any = await queryRelevantLogPage(params)
AnalysisData.value = res.data.records AnalysisData.value = res.data.records
}) total.value = res.data.total
} catch (error) {
console.error('获取分析记录失败:', error)
AnalysisData.value = []
total.value = 0
}
}
//分析记录管理
const analysis1 = async () => {
// 初始化分页参数
form.value.pageNum = 1
await loadAnalysisData()
dialogAnalysis.value = true dialogAnalysis.value = true
} }
// 启动关联分析 // 启动关联分析
const firing = () => { const firing = () => {
processEvents({ processEvents({
@@ -207,9 +257,8 @@ const details = (row: any) => {
type: 'success', type: 'success',
message: res.message message: res.message
}) })
queryRelevantLogPage({}).then((res: any) => { // 重新加载当前页的数据
AnalysisData.value = res.data.records loadAnalysisData()
})
}) })
} }
@@ -217,4 +266,6 @@ const backbxlb = () => {
view.value = true view.value = true
view2.value = false view2.value = false
} }
</script> </script>

View File

@@ -15,7 +15,7 @@
<el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item> <el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<div style="flex: 1" class="mt10"> <div style="flex: 1" class="mt10">
<my-echart :options="options" /> <my-echart :options="options" @echartClick="echartClick" />
</div> </div>
</div> </div>
</template> </template>
@@ -52,7 +52,7 @@ const init = () => {
data.gs = res.data.voltageToleranceCurveDataList.length data.gs = res.data.voltageToleranceCurveDataList.length
data.krr = gongData.pointI.length data.krr = gongData.pointI.length
data.bkrr = gongData.pointIun.length data.bkrr = gongData.pointIun.length
options.value = { options.value = {
// backgroundColor: "#f9f9f9", //地图背景色深蓝 // backgroundColor: "#f9f9f9", //地图背景色深蓝
title: { title: {
@@ -107,7 +107,7 @@ const init = () => {
name: '%' name: '%'
} }
], ],
color: ['#FF8C00', '#00BFFF', 'green', 'red'], color: ['#FF8C00', '#00BFFF', 'green', 'red'],
options: { options: {
dataZoom: null, dataZoom: null,
series: [ series: [
@@ -186,7 +186,7 @@ function gongfunction(arr: any) {
let time = arr[i].time let time = arr[i].time
let eventId = arr[i].eventId let eventId = arr[i].eventId
// let index =arr[i].eventDetailIndex; // let index =arr[i].eventDetailIndex;
point = [xx, yy, time, eventId] point = [xx, yy, time, eventId, arr[i]]
if (xx <= 0.003) { if (xx <= 0.003) {
let line = 0 let line = 0
@@ -324,9 +324,13 @@ function gongfunction(arr: any) {
pointFun pointFun
} }
} }
const emit = defineEmits(['viewWave'])
const echartClick = (params: any) => {
emit('viewWave', params.value[4])
}
onMounted(() => { onMounted(() => {
datePickerRef.value.setTheDate(1) datePickerRef.value.setTheDate(1)
init() init()
}) })
</script> </script>

View File

@@ -15,7 +15,7 @@
<el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item> <el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<div style="flex: 1" class="mt10"> <div style="flex: 1" class="mt10">
<my-echart :options="options" /> <my-echart :options="options" @echartClick="echartClick" />
</div> </div>
</div> </div>
</template> </template>
@@ -50,8 +50,8 @@ const init = () => {
getPlot(formData).then((res: any) => { getPlot(formData).then((res: any) => {
const gongData = gongfunction(res.data.voltageToleranceCurveDataList) const gongData = gongfunction(res.data.voltageToleranceCurveDataList)
data.gs = res.data.voltageToleranceCurveDataList.length data.gs = res.data.voltageToleranceCurveDataList.length
data.krr = gongData.pointI.length data.krr = gongData.pointF.length
data.bkrr = gongData.pointIun.length data.bkrr = gongData.pointFun.length
options.value = { options.value = {
// backgroundColor: "#f9f9f9", //地图背景色深蓝 // backgroundColor: "#f9f9f9", //地图背景色深蓝
@@ -172,7 +172,7 @@ function gongfunction(arr: any) {
let time = arr[i].time let time = arr[i].time
let eventId = arr[i].eventId let eventId = arr[i].eventId
// let index =arr[i].eventDetailIndex; // let index =arr[i].eventDetailIndex;
point = [xx, yy, time, eventId] point = [xx, yy, time, eventId, arr[i]]
if (xx <= 0.003) { if (xx <= 0.003) {
let line = 0 let line = 0
@@ -205,8 +205,6 @@ function gongfunction(arr: any) {
}) })
} }
} else if (xx <= 0.5) { } else if (xx <= 0.5) {
if (yy > 120 || yy < 70) { if (yy > 120 || yy < 70) {
unstandI++ unstandI++
pointIun.push({ pointIun.push({
@@ -312,9 +310,12 @@ function gongfunction(arr: any) {
pointFun pointFun
} }
} }
const emit = defineEmits(['viewWave'])
const echartClick = (params: any) => {
emit('viewWave', params.value[4])
}
onMounted(() => { onMounted(() => {
datePickerRef.value.setTheDate(1) datePickerRef.value.setTheDate(1)
init() init()
}) })
</script> </script>

View File

@@ -1,10 +1,10 @@
<template> <template>
<el-tabs v-model="activeName" type="border-card" class="event-statistics" tab-position="left" :style="height"> <el-tabs v-model="activeName" type="border-card" class="event-statistics" tab-position="left" :style="height">
<el-tab-pane lazy label="ITIC曲线分析" name="1"> <el-tab-pane lazy label="ITIC曲线分析" name="1">
<ITICquxianfenxi /> <ITICquxianfenxi @viewWave="viewWave"/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane lazy label="SEMI F47 分析" name="2"> <el-tab-pane lazy label="SEMI F47 分析" name="2">
<SEMIF47fenxi /> <SEMIF47fenxi @viewWave="viewWave"/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane lazy label="电压暂降表及密度" name="3"> <el-tab-pane lazy label="电压暂降表及密度" name="3">
<Dianyazanjiangbiaojimidu /> <Dianyazanjiangbiaojimidu />
@@ -35,12 +35,16 @@ const props = defineProps({
default: 0 default: 0
} }
}) })
const emit = defineEmits(['viewWave'])
const activeName = ref('1') const activeName = ref('1')
const height = ref(mainHeight(84 + props.externalHeight)) const height = ref(mainHeight(84 + props.externalHeight))
// onMounted(() => { // onMounted(() => {
// height.value = mainHeight(84 + props.externalHeight) // height.value = mainHeight(84 + props.externalHeight)
// console.log("🚀 ~ 84 + props.externalHeight:", 84 + props.externalHeight) // console.log("🚀 ~ 84 + props.externalHeight:", 84 + props.externalHeight)
// }) // })
const viewWave=(row:any)=>{
emit('viewWave',row)
}
</script> </script>
<style lang="scss"> <style lang="scss">
.event-statistics { .event-statistics {

View File

@@ -249,7 +249,7 @@ const initThird = () => {
backgroundColor: '#fff', //背景色, backgroundColor: '#fff', //背景色,
animation: false, animation: false,
title: { title: {
text: '触发类型', text: '暂降类型',
x: 'center' x: 'center'
}, },
@@ -277,7 +277,7 @@ const initThird = () => {
}, },
series: [ series: [
{ {
name: '触发类型', name: '暂降类型',
type: 'pie', type: 'pie',
radius: '65%', radius: '65%',
center: ['50%', '60%'], center: ['50%', '60%'],

View File

@@ -1,34 +1,39 @@
<template> <template>
<div class="default-main" style="position: relative"> <div class="default-main" style="position: relative">
<div v-show="view">
<el-tabs v-model="activeName" type="border-card" class="demo-tabs"> <el-tabs v-model="activeName" type="border-card" class="demo-tabs">
<el-tab-pane label="导航" name="1" :style="height" lazy> <el-tab-pane label="导航" name="1" :style="height" lazy>
<Navigation @changeTab="changeTab" ref="navigationRef" /> <Navigation @changeTab="changeTab" ref="navigationRef" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="事件统计" name="2" lazy v-if="!isReload"> <el-tab-pane label="事件统计" name="2" lazy v-if="!isReload">
<EventStatistics /> <EventStatistics @viewWave="viewWave" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="事件分析" name="3" lazy v-if="!isReload"> <el-tab-pane label="事件分析" name="3" lazy v-if="!isReload">
<EventStudy /> <EventStudy />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="运行情况" name="4" lazy :style="height" v-if="!isReload"> <el-tab-pane label="运行情况" name="4" lazy :style="height" v-if="!isReload">
<RunningCondition /> <RunningCondition />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="暂态报告" name="5" lazy v-if="VITE_FLAG"> <el-tab-pane label="暂态报告" name="5" lazy v-if="VITE_FLAG">
<TransientReport /> <TransientReport />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<div class="monitoring-point">当前位置{{ monitoringPoint.state.lineName }}</div> <div class="monitoring-point">当前位置{{ monitoringPoint.state.lineName }}</div>
</div>
<div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
<waveForm ref="waveFormRef" senior :boxoList="boxoList" :wp="wp" @backbxlb="backbxlb" />
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { defineOptions, nextTick, ref, watch } from 'vue' import { nextTick, ref, watch } from 'vue'
import Navigation from './navigation/index.vue' import Navigation from './navigation/index.vue'
import EventStatistics from './eventStatistics/index.vue' import EventStatistics from './eventStatistics/index.vue'
import EventStudy from './eventStudy/index.vue' import EventStudy from './eventStudy/index.vue'
import RunningCondition from './runningCondition/index.vue' import RunningCondition from './runningCondition/index.vue'
import TransientReport from './transientReport/index.vue' import TransientReport from './transientReport/index.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import waveForm from '@/components/echarts/waveForm.vue'
import router from '@/router' import router from '@/router'
import { useMonitoringPoint } from '@/stores/monitoringPoint' import { useMonitoringPoint } from '@/stores/monitoringPoint'
const VITE_FLAG = import.meta.env.VITE_NAME == 'jibei' const VITE_FLAG = import.meta.env.VITE_NAME == 'jibei'
@@ -37,14 +42,17 @@ defineOptions({
}) })
const isReload = ref(false) const isReload = ref(false)
const navigationRef = ref() const navigationRef = ref()
const pageHeight = mainHeight(20)
const monitoringPoint = useMonitoringPoint() const monitoringPoint = useMonitoringPoint()
const height = mainHeight(82) const height = mainHeight(82)
const activeName = ref('1') const activeName = ref('1')
const view = ref(true)
const view2 = ref(false)
const boxoList = ref({})
const wp = ref({})
watch( watch(
() => router.currentRoute.value.query.lineId, () => router.currentRoute.value.query.lineId,
(newLineId, oldLineId) => { (newLineId, oldLineId) => {
if (!newLineId) return if (!newLineId) return
// 在这里处理 lineId 的变化 // 在这里处理 lineId 的变化
console.log('newLineId') console.log('newLineId')
@@ -62,7 +70,6 @@ watch(
watch( watch(
() => monitoringPoint.state.lineId, () => monitoringPoint.state.lineId,
() => { () => {
// 刷新页面 // 刷新页面
isReload.value = true isReload.value = true
nextTick(() => { nextTick(() => {
@@ -70,8 +77,27 @@ watch(
}) })
} }
) )
const changeTab = (e: string,) => { const backbxlb = () => {
view.value = true
view2.value = false
}
const waveFormRef = ref()
// 查看波形
const viewWave = (row: any) => {
view.value = false
setTimeout(() => {
console.log(123, monitoringPoint.state)
waveFormRef.value.open({
...row,
lineName: monitoringPoint.state.lineName.split('>').pop(),
startTime: row.time,
featureAmplitude: row.eventValue / 100,
duration: row.persistTime
})
}, 100)
}
const changeTab = (e: string) => {
activeName.value = e activeName.value = e
} }
</script> </script>

View File

@@ -126,6 +126,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { BmlMarkerClusterer } from 'vue-baidu-map-3x' import { BmlMarkerClusterer } from 'vue-baidu-map-3x'
import { onMounted, ref, watch } from 'vue' import { onMounted, ref, watch } from 'vue'
import { getAreaLineInfo } from '@/api/event-boot/areaInfo' import { getAreaLineInfo } from '@/api/event-boot/areaInfo'
import DatePicker from '@/components/form/datePicker/index.vue' import DatePicker from '@/components/form/datePicker/index.vue'
@@ -241,19 +242,19 @@ const handler = async ({ BMap, map }: any) => {
siteList.value = list siteList.value = list
center.value.lng = list[0]?.lng || 0 center.value.lng = list[0]?.lng || 0
center.value.lat = list[0]?.lat + 0.01 || 0 center.value.lat = list[0]?.lat
watch( watch(
() => monitoringPoint.state.lineId, () => monitoringPoint.state.lineId,
(newLineId, oldLineId) => { (newLineId, oldLineId) => {
let value = areaLineInfo.value.find((item: any) => item.lineId == newLineId) let value = areaLineInfo.value.find((item: any) => item.lineId == newLineId)
if (value == undefined) return if (value == undefined) return
center.value.lng = value.lng center.value.lng = value.lng
center.value.lat = value.lat + 0.01 center.value.lat = value.lat
infoWindowPoint.value = value infoWindowPoint.value = value
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
monitoringPoint.setValue( monitoringPoint.setValue(
'lineName', 'lineName',
value.manufacturer + '>' + value.gdName + '>' + value.subName + '>' + value.lineName value.manufacturer + '>' + value.gdName + '>' + value.subName + '>' + value.lineName
@@ -273,7 +274,6 @@ const syncCenterAndZoom = (e: any) => {
const markerClick = (e: any) => { const markerClick = (e: any) => {
//console.log("🚀 ~ markerClick ~ e:", e) //console.log("🚀 ~ markerClick ~ e:", e)
infoWindowPoint.value = e infoWindowPoint.value = e
monitoringPoint.setValue('lineId', e.lineId)
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
} }
const changeTab = (e: string) => { const changeTab = (e: string) => {

View File

@@ -109,7 +109,7 @@
<el-row> <el-row>
<el-col :span="12" class="mTop"> <el-col :span="12" class="mTop">
<div class="grid-content"> <div class="grid-content">
<div class="divBox">触发类型</div> <div class="divBox">暂降类型</div>
</div> </div>
</el-col> </el-col>
<el-col :span="12" class="mTop"> <el-col :span="12" class="mTop">

View File

@@ -91,14 +91,19 @@
@click="markerClick(path)" @click="markerClick(path)"
></bm-marker> ></bm-marker>
</BmlMarkerClusterer> </BmlMarkerClusterer>
<bm-marker :position="infoWindowPoint" :icon="{ url: '1', size: { width: 0, height: 0 } }"> <bm-marker :position="infoWindowPoint" :icon="{ url: '1', size: { width: 0, height: 0 } }">
<bm-info-window :show="infoWindowPoint.show" @close="infoWindowPoint.show = false"> <bm-info-window :show="infoWindowPoint.show" @close="infoWindowPoint.show = false">
<el-descriptions :title="infoWindowPoint.lineName" :column="1" v-if="infoWindowPoint.lineId"> <el-descriptions :title="infoWindowPoint.lineName" :column="1" v-if="infoWindowPoint.lineId">
<el-descriptions-item label="供电公司">{{ infoWindowPoint.gdName }}</el-descriptions-item> <el-descriptions-item label="供电公司">
{{ infoWindowPoint.gdName }}
</el-descriptions-item>
<el-descriptions-item label="变电站(场站)"> <el-descriptions-item label="变电站(场站)">
{{ infoWindowPoint.subName }} {{ infoWindowPoint.subName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="母线">{{ infoWindowPoint.voltageName }}</el-descriptions-item> <el-descriptions-item label="母线">
{{ infoWindowPoint.voltageName }}
</el-descriptions-item>
<el-descriptions-item label="网络参数"> <el-descriptions-item label="网络参数">
{{ infoWindowPoint.ip }} {{ infoWindowPoint.ip }}
</el-descriptions-item> </el-descriptions-item>
@@ -292,7 +297,7 @@ const pointChange = (val: string) => {
let data = areaLineInfo.value.find((item: any) => item.lineId == val) let data = areaLineInfo.value.find((item: any) => item.lineId == val)
center.value.lng = data.lng center.value.lng = data.lng
center.value.lat = data.lat + 0.04 center.value.lat = data.lat
infoWindowPoint.value = data infoWindowPoint.value = data
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
zoom.value = 13 zoom.value = 13

View File

@@ -25,7 +25,11 @@
<vxe-column type="seq" title="序号" width="70px"></vxe-column> <vxe-column type="seq" title="序号" width="70px"></vxe-column>
<vxe-column field="startTime" title="发生时刻" width="200"></vxe-column> <vxe-column field="startTime" title="发生时刻" width="200"></vxe-column>
<vxe-column field="lineName" title="监测点" width="120"></vxe-column> <vxe-column field="lineName" title="监测点" width="120"></vxe-column>
<vxe-column field="featureAmplitude" title="暂降(骤升)幅值(%)"></vxe-column> <vxe-column field="featureAmplitude" title="暂降(骤升)幅值(%)">
<template #default="{ row }">
{{ (row.featureAmplitude * 100).toFixed(2) }}
</template>
</vxe-column>
<vxe-column field="duration" title="持续时间(s)"></vxe-column> <vxe-column field="duration" title="持续时间(s)"></vxe-column>
</vxe-table> </vxe-table>
</div> </div>
@@ -49,7 +53,6 @@ const props = defineProps({
const tableData = ref([]) const tableData = ref([])
const tableData1 = ref([]) const tableData1 = ref([])
getNoDealEvents(props.params).then(res => { getNoDealEvents(props.params).then(res => {
tableData.value = res.data tableData.value = res.data
}) })
getAreaOffDev(props.params).then(res => { getAreaOffDev(props.params).then(res => {

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader date-picker area showExport> <TableHeader date-picker area >
<template v-slot:select> <template v-slot:select>
<el-form-item label="统计类型"> <el-form-item label="统计类型">
<el-radio-group v-model="tableStore.table.params.comFlag"> <el-radio-group v-model="tableStore.table.params.comFlag">
@@ -23,7 +23,7 @@
<el-option v-for="item in sign" :key="item.id" :label="item.name" :value="item.algoDescribe" /> <el-option v-for="item in sign" :key="item.id" :label="item.name" :value="item.algoDescribe" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="网公司标志:"> <el-form-item label="网公司标志">
<el-select <el-select
v-model="tableStore.table.params.monitorFlag" v-model="tableStore.table.params.monitorFlag"
collapse-tags collapse-tags
@@ -48,7 +48,7 @@
</el-form-item> </el-form-item>
</template> </template>
<template #operation> <template #operation>
<!-- <el-button icon="el-icon-Download" type="primary" @click="exportEvent">导出</el-button> --> <el-button icon="el-icon-Download" type="primary" @click="exportEvent" :loading="loading">导出</el-button>
</template> </template>
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
@@ -61,6 +61,7 @@ import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { getEventReport } from '@/api/event-boot/report' import { getEventReport } from '@/api/event-boot/report'
import { ElMessage } from 'element-plus'
defineOptions({ defineOptions({
name: 'Operationmanagement/terminalmanagement' name: 'Operationmanagement/terminalmanagement'
@@ -70,7 +71,7 @@ const triggerType = dictData.getBasicData('Event_Statis')
const sign: any = dictData.getBasicData('power_flag') const sign: any = dictData.getBasicData('power_flag')
const tableRef = ref() const tableRef = ref()
const loading = ref(false)
const monitorList = [ const monitorList = [
{ value: 0, label: '非网公司' }, { value: 0, label: '非网公司' },
{ value: 1, label: '网公司' }, { value: 1, label: '网公司' },
@@ -130,6 +131,7 @@ const tableStore = new TableStore({
width: '140', width: '140',
formatter: (row: any) => { formatter: (row: any) => {
// return (row.cellValue * 100).toFixed(0) // return (row.cellValue * 100).toFixed(0)
return Math.floor(row.cellValue * 10000) / 100 return Math.floor(row.cellValue * 10000) / 100
} }
}, },
@@ -161,20 +163,48 @@ onMounted(() => {
tableStore.index() tableStore.index()
}) })
const exportEvent = () => { const exportEvent = () => {
let form: any = JSON.parse(JSON.stringify(tableStore.table.params)) // let form: any = JSON.parse(JSON.stringify(tableStore.table.params))
form.pageNum = 1 // form.pageNum = 1
form.pageSize = tableStore.table.total // form.pageSize = tableStore.table.total
getEventReport(form).then(res => { // getEventReport(form).then(res => {
tableRef.value.getRef().exportData({ // tableRef.value.getRef().exportData({
filename: '事件报告', // 文件名字 // filename: '事件报告', // 文件名字
sheetName: 'Sheet1', // sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv // type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true, // useStyle: true,
data: res.data.records, // 数据源 // 过滤那个字段导出 // data: res.data.records, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) { // columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0) // return !(column.$columnIndex === 0)
// }
// })
// })
const ids = tableStore.table.data.map((item: any) => item.eventId);
loading.value = true
ElMessage('生成报告中,请稍等!')
getEventReport(ids)
.then((res: any) => {
if (res == undefined) {
loading.value = false
return
} }
let blob = new Blob([res], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = '事件报告' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
loading.value = false
}) .catch(() => {
loading.value = false
}) })
})
} }
</script> </script>

View File

@@ -117,7 +117,7 @@
<el-row> <el-row>
<el-col :span="12" class="mTop"> <el-col :span="12" class="mTop">
<div class="grid-content"> <div class="grid-content">
<div class="divBox">触发类型</div> <div class="divBox">暂降类型</div>
</div> </div>
</el-col> </el-col>
<el-col :span="12" class="mTop"> <el-col :span="12" class="mTop">

View File

@@ -124,7 +124,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<div class="grid-content"> <div class="grid-content">
<div class="divBox">触发类型</div> <div class="divBox">暂降类型</div>
</div> </div>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">

View File

@@ -30,6 +30,7 @@ import { ref, onMounted, provide, nextTick } from 'vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import MyEchart from '@/components/echarts/MyEchart.vue' import MyEchart from '@/components/echarts/MyEchart.vue'
const dictData = useDictData() const dictData = useDictData()
const tableRef = ref() const tableRef = ref()
const options = ref({}) const options = ref({})
@@ -88,6 +89,7 @@ const tableStore = new TableStore({
text: '暂降原因统计', text: '暂降原因统计',
top: '20' top: '20'
}, },
legend: { legend: {
type: 'scroll', type: 'scroll',
orient: 'vertical', orient: 'vertical',

View File

@@ -35,44 +35,44 @@ const height = mainHeight(80).height
const activeName = ref('1') const activeName = ref('1')
const activeName1 = ref('1') const activeName1 = ref('1')
const list = ref([ const list = ref([
// { {
// name: '暂态严重度统计', name: '暂态严重度统计',
// id: '3', id: '3',
// isGroup: true, isGroup: true,
// url: '/event-boot/report/getSeverity', url: '/event-boot/report/getSeverity',
// column: [ column: [
// { {
// title: '暂态事件严重度(前二十)', title: '暂态事件严重度(前二十)',
// children: [ children: [
// { {
// field: 'index', field: 'index',
// title: '序号', title: '序号',
// width: '80', width: '80',
// formatter: (row: any) => { formatter: (row: any) => {
// return ( return (
// (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize +
// row.rowIndex + row.rowIndex +
// 1 1
// ) )
// } }
// }, },
// { field: 'startTime', title: '暂态事件发生时刻', width: '200' }, { field: 'startTime', title: '暂态事件发生时刻', width: '200' },
// { field: 'gdName', title: '供电公司' }, { field: 'gdName', title: '供电公司' },
// { field: 'subName', title: '变电站' }, { field: 'subName', title: '变电站' },
// { field: 'lineName', title: '监测点' }, { field: 'lineName', title: '监测点' },
// { field: 'voltageScale', title: '监测点电压等级' }, { field: 'voltageScale', title: '监测点电压等级' },
// { field: 'loadType', title: '干扰源类型' }, { field: 'loadType', title: '干扰源类型' },
// { {
// field: 'featureAmplitude', field: 'featureAmplitude',
// title: '暂降(骤升)幅值(%)', title: '暂降(骤升)幅值(%)',
// formatter: ({ row }: any) => (row.featureAmplitude * 100).toFixed(2) formatter: ({ row }: any) => (row.featureAmplitude * 100).toFixed(2)
// }, },
// { field: 'duration', title: '持续时间(s)' }, { field: 'duration', title: '持续时间(s)' },
// { field: 'severity', title: '暂态事件严重度' } { field: 'severity', title: '暂态事件严重度' }
// ] ]
// } }
// ] ]
// }, },
{ {
name: '暂降事件列表', name: '暂降事件列表',
id: '4', id: '4',
@@ -108,7 +108,7 @@ const list = ref([
} }
}, },
{ field: 'duration', title: '持续时间(s)', width: '120' }, { field: 'duration', title: '持续时间(s)', width: '120' },
{ field: 'advanceType', title: '触发类型(机器判断)', width: '150' } { field: 'advanceType', title: '暂降类型(机器判断)', width: '150' }
] ]
}, },
{ {

Some files were not shown because too many files have changed in this diff Show More