Compare commits
25 Commits
56d65a6c17
...
2026-03
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48472bdb85 | ||
|
|
fafc5f82c4 | ||
| 93ee7e4034 | |||
|
|
7d2ce51510 | ||
|
|
9202da17f1 | ||
|
|
30eddd0572 | ||
|
|
15bd1ac6d2 | ||
|
|
f5c76c1b7a | ||
|
|
b25515b5db | ||
|
|
bfa061fb03 | ||
|
|
15e3d4aec8 | ||
|
|
59489aaafa | ||
|
|
5d0421dd40 | ||
|
|
6d7ef7cf5d | ||
|
|
8d9ccf97a7 | ||
|
|
7188e3e681 | ||
|
|
a9fc77eb8b | ||
|
|
87af11288d | ||
|
|
0763187744 | ||
|
|
ae641604ba | ||
|
|
564e6ef4ab | ||
|
|
c84c5dae3b | ||
|
|
c902dabb73 | ||
|
|
8d1497032f | ||
|
|
6aeac753ef |
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
@@ -1,5 +1,6 @@
|
||||
import createAxios from '@/utils/request'
|
||||
|
||||
|
||||
// 密码规则修改
|
||||
export function ruleUpdate(data) {
|
||||
return createAxios({
|
||||
@@ -24,3 +25,77 @@ export function unlockRoot(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
|
||||
})
|
||||
}
|
||||
@@ -129,7 +129,7 @@ export function queryAllByType(params: any) {
|
||||
//获取用户
|
||||
export function selectUserList(data: any) {
|
||||
return createAxios({
|
||||
url: '/supervision-boot/userReport/selectUserList',
|
||||
url: '/device-boot/userReport/selectUserList',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
@@ -206,3 +206,11 @@ export function exportTerminalBase() {
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
//一键分配终端
|
||||
export function allotTerminal(data: any) {
|
||||
return createAxios({
|
||||
url: '/device-boot/nodeDevice/oneKeyDistribution',
|
||||
method: 'post',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -45,3 +45,13 @@ export const getLineOverLimitData = (id: string) => {
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
//导出数据总览
|
||||
export function dataVerifyExcel(params: any) {
|
||||
return request({
|
||||
url: '/device-boot/dataVerify/dataVerifyExcel',
|
||||
method: 'get',
|
||||
params,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
@@ -31,4 +31,13 @@ export function getDevTypeList() {
|
||||
method: 'post',
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export const getDeviceTypeList = (params: any) => {
|
||||
return createAxios({
|
||||
url: '/device-boot/devType/pageDevTypeList',
|
||||
method: 'POST',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
103
src/api/device-boot/sensitiveLoadMange.ts
Normal file
103
src/api/device-boot/sensitiveLoadMange.ts
Normal 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
|
||||
})
|
||||
}
|
||||
@@ -2,13 +2,35 @@ import createAxios from '@/utils/request'
|
||||
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) {
|
||||
return createAxios({
|
||||
url: '/event-boot/report/getEventReport',
|
||||
url: '/event-boot/report/createEventReport',
|
||||
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) {
|
||||
return createAxios({
|
||||
|
||||
@@ -1,106 +1,114 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function getTypeIdData(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/dictData/getTypeIdData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getOnlineRateData2(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/onlineRateData/getOnlineRateData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getAreaDept() {
|
||||
return request({
|
||||
url: '/user-boot/dept/loginDeptTree',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function getOnlineRateDataCensus(data:any) {
|
||||
return request({
|
||||
url: '/device-boot/terminalOnlineRateData/getOnlineRateDataCensus',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function IntegrityIcon(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/integrity/getIntegrityIcon',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getDeptIdAreaTree() {
|
||||
return request({
|
||||
url: '/system-boot/area/getDeptIdAreaTree',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function getOnlineRateData(data:any) {
|
||||
return request({
|
||||
url: '/device-boot/terminalOnlineRateData/getOnlineRateData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getSubstationInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getSubstationInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getLineInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getLineInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getLineRank(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getLineRank',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function deptInfo(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/deptInfo',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getXbLineInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getXbLineInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getSubInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getSubInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getXbLineRank(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getXbLineRank',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
// 数据补招
|
||||
export function FullRecall(data:any) {
|
||||
return request({
|
||||
url: '/data-processing-boot/data/FullRecall',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function getTypeIdData(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/dictData/getTypeIdData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getOnlineRateData2(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/onlineRateData/getOnlineRateData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getAreaDept() {
|
||||
return request({
|
||||
url: '/user-boot/dept/loginDeptTree',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
// 承载能力评估去除前缀
|
||||
export function getAreaDeptRemoveMode(params) {
|
||||
return request({
|
||||
url: '/user-boot/dept/loginDeptTree',
|
||||
method: 'GET',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
export function getOnlineRateDataCensus(data:any) {
|
||||
return request({
|
||||
url: '/device-boot/terminalOnlineRateData/getOnlineRateDataCensus',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function IntegrityIcon(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/integrity/getIntegrityIcon',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getDeptIdAreaTree() {
|
||||
return request({
|
||||
url: '/system-boot/area/getDeptIdAreaTree',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function getOnlineRateData(data:any) {
|
||||
return request({
|
||||
url: '/device-boot/terminalOnlineRateData/getOnlineRateData',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getSubstationInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getSubstationInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getLineInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getLineInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getLineRank(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/PollutionSubstation/getLineRank',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function deptInfo(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/deptInfo',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getXbLineInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getXbLineInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getSubInfoById(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getSubInfoById',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
export function getXbLineRank(data:any) {
|
||||
return request({
|
||||
url: '/harmonic-boot/detailAnalysis/getXbLineRank',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
// 数据补招
|
||||
export function FullRecall(data:any) {
|
||||
return request({
|
||||
url: '/data-processing-boot/data/FullRecall',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
42
src/api/system-boot/MonitoringPoint.ts
Normal file
42
src/api/system-boot/MonitoringPoint.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
43
src/api/system-boot/ReportTemplate.ts
Normal file
43
src/api/system-boot/ReportTemplate.ts
Normal 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
|
||||
});
|
||||
}
|
||||
37
src/api/system-boot/area.ts
Normal file
37
src/api/system-boot/area.ts
Normal 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
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
BIN
src/assets/logo/灿能.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/logo/电网.png
Normal file
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
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
@@ -17,6 +17,7 @@ const config = useConfig()
|
||||
// import { nextTick } from 'process'
|
||||
const emit = defineEmits(['triggerPoint', 'group', 'echartClick'])
|
||||
color[0] = config.layout.elementUiPrimary[0]
|
||||
|
||||
const chartRef = ref<HTMLDivElement>()
|
||||
|
||||
const props = defineProps(['options', 'isInterVal', 'pieInterVal'])
|
||||
|
||||
@@ -6,29 +6,40 @@
|
||||
</div>
|
||||
<el-tabs type="border-card">
|
||||
<el-tab-pane label="暂态波形上送" :style="'height:' + vhh">
|
||||
<el-table stripe :data="Data" :height="height" border style="width: 100%"
|
||||
header-cell-class-name="table_header">
|
||||
<el-table-column align="center" prop="number" label="事件段"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="波形起始点相位(°)">
|
||||
<el-table-column align="center" prop="number" label="A相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="B相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="C相"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="number" label="跳变段电压变化率(V/ms)">
|
||||
<el-table-column align="center" prop="number" label="A相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="B相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="C相"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="number" label="相位跳变(°)">
|
||||
<el-table-column align="center" prop="number" label="A相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="B相"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="C相"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="number" label="总分段数目"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="三相电压不平衡度(%)" width="180"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="触发类型"></el-table-column>
|
||||
<el-table-column align="center" prop="number" label="暂降原因"></el-table-column>
|
||||
</el-table>
|
||||
<vxe-table
|
||||
stripe
|
||||
:data="Data"
|
||||
:height="height"
|
||||
border
|
||||
style="width: 100%"
|
||||
header-cell-class-name="table_header"
|
||||
>
|
||||
<vxe-column align="center" field="number" title="事件段"></vxe-column>
|
||||
<vxe-colgroup align="center" field="number1" title="波形起始点相位(°)">
|
||||
<vxe-column align="center" field="number2" title="A相"></vxe-column>
|
||||
<vxe-column align="center" field="number3" title="B相"></vxe-column>
|
||||
<vxe-column align="center" field="number4" title="C相"></vxe-column>
|
||||
</vxe-colgroup>
|
||||
<vxe-colgroup align="center" field="number" title="跳变段电压变化率(V/ms)">
|
||||
<vxe-column align="center" field="number5" title="A相"></vxe-column>
|
||||
<vxe-column align="center" field="number6" title="B相"></vxe-column>
|
||||
<vxe-column align="center" field="number7" title="C相"></vxe-column>
|
||||
</vxe-colgroup>
|
||||
<vxe-colgroup align="center" field="number" title="相位跳变(°)">
|
||||
<vxe-column align="center" field="number8" title="A相"></vxe-column>
|
||||
<vxe-column align="center" field="number9" title="B相"></vxe-column>
|
||||
<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-tabs>
|
||||
</div>
|
||||
@@ -73,7 +84,25 @@ export default {
|
||||
subName: '',
|
||||
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,
|
||||
vhh: null,
|
||||
ptpass: '',
|
||||
@@ -88,7 +117,7 @@ export default {
|
||||
zoom: ''
|
||||
}
|
||||
},
|
||||
created() { },
|
||||
created() {},
|
||||
watch: {
|
||||
value: function (a, b) {
|
||||
if (a == 2) {
|
||||
@@ -116,10 +145,10 @@ export default {
|
||||
this.zoom = 1 / document.body.style.zoom
|
||||
if (this.flag) {
|
||||
// console.log(123);
|
||||
this.vh = mainHeight(250).height
|
||||
this.vh = mainHeight(280).height
|
||||
} else {
|
||||
// console.log(3333);
|
||||
this.vh = mainHeight(270).height
|
||||
this.vh = mainHeight(305).height
|
||||
}
|
||||
},
|
||||
query() {
|
||||
@@ -197,6 +226,8 @@ export default {
|
||||
'#FF9999'
|
||||
]
|
||||
}
|
||||
console.log('🚀 ~ this.boxoList:', this.boxoList)
|
||||
|
||||
var option = {
|
||||
tooltip: {
|
||||
top: '10px',
|
||||
@@ -239,7 +270,7 @@ export default {
|
||||
|
||||
title: {
|
||||
left: 'center',
|
||||
text: '发生时刻:' + this.boxoList.startTime + ' PT变化:' + this.boxoList.measurementPointName,
|
||||
text: '发生时刻:' + this.boxoList.startTime + ' PT变化:' + this.boxoList.pt,
|
||||
textStyle: {
|
||||
fontSize: 16,
|
||||
color: _this.DColor ? '#fff' : echartsColor.WordColor
|
||||
@@ -378,6 +409,33 @@ export default {
|
||||
}
|
||||
],
|
||||
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相',
|
||||
type: 'line',
|
||||
|
||||
1498
src/components/echarts/gaoji.js
Normal file
1498
src/components/echarts/gaoji.js
Normal file
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
@@ -16,18 +16,12 @@
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
<!-- <el-button v-if="view2 && senior" class="ml10" type="primary"
|
||||
@click="AdvancedAnalytics">高级分析</el-button> -->
|
||||
<!-- <el-button v-if="view2 && senior" class="ml10" type="primary" @click="AdvancedAnalytics">
|
||||
高级分析
|
||||
</el-button> -->
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-button
|
||||
@click="backbxlb"
|
||||
class="el-icon-refresh-right"
|
||||
icon="el-icon-Back"
|
||||
style="float: right"
|
||||
>
|
||||
返回
|
||||
</el-button>
|
||||
<el-button @click="backbxlb" icon="el-icon-Back" style="float: right">返回</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div v-loading="loading" style="height: calc(100vh - 190px)">
|
||||
@@ -108,12 +102,12 @@ const options = ref([
|
||||
const shushiboxiRef = ref()
|
||||
const bxecharts = ref(mainHeight(95).height as any)
|
||||
const view2 = ref(true)
|
||||
const boxoList = ref(null)
|
||||
const boxoList: any = ref(null)
|
||||
const wp = ref(null)
|
||||
const showBoxi = ref(true)
|
||||
const view3 = ref(false)
|
||||
const view4 = ref(false)
|
||||
const GJList = ref([])
|
||||
const GJList = ref({})
|
||||
|
||||
const open = async (row: any) => {
|
||||
loading.value = true
|
||||
@@ -122,6 +116,7 @@ const open = async (row: any) => {
|
||||
row.loading = false
|
||||
if (res != undefined) {
|
||||
boxoList.value = row
|
||||
boxoList.value.pt = res.data.pt
|
||||
wp.value = res.data
|
||||
loading.value = false
|
||||
view4.value = true
|
||||
@@ -129,6 +124,7 @@ const open = async (row: any) => {
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false
|
||||
backbxlb()
|
||||
})
|
||||
}
|
||||
const bxhandleClick = (tab: any) => {
|
||||
@@ -168,10 +164,13 @@ const AdvancedAnalytics = () => {
|
||||
analysis({
|
||||
eventIndex: boxoList.value.eventId
|
||||
}).then(res => {
|
||||
GJList.value = res.data
|
||||
view3.value = true
|
||||
view2.value = false
|
||||
// GJList.value = res.data
|
||||
// view3.value = true
|
||||
// view2.value = false
|
||||
})
|
||||
GJList.value = {}
|
||||
view3.value = true
|
||||
view2.value = false
|
||||
}
|
||||
const changeView = () => {
|
||||
if (shushiboxiRef.value) shushiboxiRef.value.backbxlb()
|
||||
|
||||
@@ -264,7 +264,7 @@ const setTheDate = (val: any) => {
|
||||
}
|
||||
// 导出
|
||||
const onExport = () => {
|
||||
|
||||
|
||||
tableStore.onTableAction('export', { showAllFlag: true })
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ const init = async () => {
|
||||
// 设置消息接收回调
|
||||
mqttClient.onMessage((topic, message) => {
|
||||
const msg = JSON.parse(message.toString())
|
||||
console.log('🚀 ~ init ~ msg:', msg)
|
||||
// console.log('🚀 ~ init ~ msg:', msg)
|
||||
if (msg.deptList.includes(adminInfo.$state.deptId)) {
|
||||
drawer.value = true
|
||||
isLoading.value = true
|
||||
@@ -90,7 +90,7 @@ const init = async () => {
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('MQTT 初始化失败:', error)
|
||||
// console.error('MQTT 初始化失败:', error)
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
|
||||
@@ -122,7 +122,7 @@ const onFullScreen = () => {
|
||||
})
|
||||
}
|
||||
|
||||
const handleCommand = (key: string) => {
|
||||
const handleCommand = async(key: string) => {
|
||||
console.log(key)
|
||||
switch (key) {
|
||||
case 'adminInfo':
|
||||
@@ -132,10 +132,17 @@ const handleCommand = (key: string) => {
|
||||
popupPwd.value.open()
|
||||
break
|
||||
case 'layout':
|
||||
navTabs.closeTabs()
|
||||
window.localStorage.clear()
|
||||
adminInfo.reset()
|
||||
router.push({ name: 'login' })
|
||||
await window.location.reload()
|
||||
setTimeout(() => {
|
||||
navTabs.closeTabs()
|
||||
window.localStorage.clear()
|
||||
adminInfo.reset()
|
||||
router.push({ name: 'login' })
|
||||
}, 0)
|
||||
// navTabs.closeTabs()
|
||||
// window.localStorage.clear()
|
||||
// adminInfo.reset()
|
||||
// router.push({ name: 'login' })
|
||||
break
|
||||
default:
|
||||
break
|
||||
|
||||
@@ -1,246 +1,246 @@
|
||||
import { reactive } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
import { STORE_CONFIG } from '@/stores/constant/cacheKey'
|
||||
import type { Layout } from '@/stores/interface'
|
||||
|
||||
export const useConfig = defineStore(
|
||||
'config',
|
||||
() => {
|
||||
const layout: Layout = reactive({
|
||||
/* 全局 */
|
||||
showDrawer: false,
|
||||
// 是否收缩布局(小屏终端)
|
||||
shrink: false,
|
||||
// 后台布局方式,可选值<Default|Classic|Streamline|Double>
|
||||
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>
|
||||
mainAnimation: 'slide-right',
|
||||
// 是否暗黑模式
|
||||
isDark: false,
|
||||
elementUiPrimary: ['#002B6A', '#002B6A'],
|
||||
tableHeaderBackground: ['#F3F6F9', '#F3F6F9'],
|
||||
tableHeaderColor: ['#111', '#fff'],
|
||||
tableCurrent: ['#F3F6F9', '#F3F6F9'],
|
||||
/* 侧边菜单 */
|
||||
// 侧边菜单背景色
|
||||
menuBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 侧边菜单文字颜色
|
||||
menuColor: ['#FFFFFF', '#CFD3DC'],
|
||||
// 侧边菜单激活项背景色
|
||||
menuActiveBackground: ['#002255', '#1d1e1f'],
|
||||
// 侧边菜单激活项文字色
|
||||
menuActiveColor: ['#409eff', '#3375b9'],
|
||||
// 侧边菜单顶栏背景色
|
||||
menuTopBarBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 侧边菜单宽度(展开时),单位px
|
||||
menuWidth: 260,
|
||||
// 侧边菜单项默认图标
|
||||
menuDefaultIcon: 'fa fa-circle-o',
|
||||
// 是否水平折叠收起菜单
|
||||
menuCollapse: false,
|
||||
// 是否只保持一个子菜单的展开(手风琴)
|
||||
menuUniqueOpened: false,
|
||||
// 显示菜单栏顶栏(LOGO)
|
||||
menuShowTopBar: true,
|
||||
|
||||
/* 顶栏 */
|
||||
// 顶栏文字色
|
||||
headerBarTabColor: ['#FFFFFF', '#CFD3DC'],
|
||||
// // 顶栏激活项背景色
|
||||
headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
|
||||
// 顶栏激活项文字色
|
||||
headerBarTabActiveColor: ['#000000', '#409EFF'],
|
||||
// 顶栏背景色
|
||||
headerBarBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 顶栏悬停时背景色
|
||||
headerBarHoverBackground: ['#f5f5f5', '#18222c']
|
||||
})
|
||||
|
||||
const lang = reactive({
|
||||
// 默认语言,可选值<zh-cn|en>
|
||||
defaultLang: 'zh-cn',
|
||||
// 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
|
||||
fallbackLang: 'zh-cn',
|
||||
// 支持的语言列表
|
||||
langArray: [
|
||||
{ name: 'zh-cn', value: '中文简体' },
|
||||
{ name: 'en', value: 'English' }
|
||||
]
|
||||
})
|
||||
|
||||
function menuWidth() {
|
||||
if (layout.shrink) {
|
||||
return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
|
||||
}
|
||||
// 菜单是否折叠
|
||||
return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
|
||||
}
|
||||
|
||||
function setLang(val: string) {
|
||||
lang.defaultLang = val
|
||||
}
|
||||
|
||||
function onSetLayoutColor(data = layout.layoutMode) {
|
||||
// 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
|
||||
const tempValue = layout.isDark
|
||||
? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
|
||||
: { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
|
||||
if (
|
||||
data == 'Classic' &&
|
||||
layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
|
||||
) {
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
|
||||
} else if (
|
||||
data == 'Default' &&
|
||||
layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
|
||||
) {
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
|
||||
}
|
||||
}
|
||||
|
||||
function setLayoutMode(data: string) {
|
||||
layout.layoutMode = data
|
||||
onSetLayoutColor(data)
|
||||
}
|
||||
|
||||
const setLayout = (name: keyof Layout, value: any) => {
|
||||
layout[name] = value as never
|
||||
}
|
||||
|
||||
const getColorVal = function (name: keyof Layout): string {
|
||||
const colors = layout[name] as string[]
|
||||
if (layout.isDark) {
|
||||
return colors[1]
|
||||
} else {
|
||||
return colors[0]
|
||||
}
|
||||
}
|
||||
|
||||
return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
|
||||
},
|
||||
// () => {
|
||||
//
|
||||
// console.log('🚀 ~ subject:', subject)
|
||||
// const layout: Layout = reactive({
|
||||
// /* 全局 */
|
||||
// showDrawer: false,
|
||||
// // 是否收缩布局(小屏终端)
|
||||
// shrink: false,
|
||||
// // 后台布局方式,可选值<Default|Classic|Streamline|Double>
|
||||
// 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>
|
||||
// mainAnimation: subject.mainAnimation,
|
||||
// // 是否暗黑模式
|
||||
// isDark: false,
|
||||
// elementUiPrimary: JSON.parse(subject.elementUiPrimary),
|
||||
// tableHeaderBackground: JSON.parse(subject.tableHeaderBackground),
|
||||
// tableHeaderColor:JSON.parse(subject.tableHeaderColor),
|
||||
// tableCurrent: JSON.parse(subject.tableCurrent),
|
||||
// /* 侧边菜单 */
|
||||
// // 侧边菜单背景色
|
||||
// menuBackground: JSON.parse(subject.menuBackground),
|
||||
// // 侧边菜单文字颜色
|
||||
// menuColor:JSON.parse(subject.menuColor),
|
||||
// // 侧边菜单激活项背景色
|
||||
// menuActiveBackground:JSON.parse(subject.menuActiveBackground),
|
||||
// // 侧边菜单激活项文字色
|
||||
// menuActiveColor:JSON.parse(subject.menuActiveColor),
|
||||
// // 侧边菜单顶栏背景色
|
||||
// menuTopBarBackground: JSON.parse(subject.menuTopBarBackground),
|
||||
// // 侧边菜单宽度(展开时),单位px
|
||||
// menuWidth: 260,
|
||||
// // 侧边菜单项默认图标
|
||||
// menuDefaultIcon: 'fa fa-circle-o',
|
||||
// // 是否水平折叠收起菜单
|
||||
// menuCollapse: false,
|
||||
// // 是否只保持一个子菜单的展开(手风琴)
|
||||
// menuUniqueOpened: false,
|
||||
// // 显示菜单栏顶栏(LOGO)
|
||||
// menuShowTopBar: true,
|
||||
|
||||
// /* 顶栏 */
|
||||
// // 顶栏文字色
|
||||
// headerBarTabColor:JSON.parse(subject.headerBarTabColor),
|
||||
// // // 顶栏激活项背景色
|
||||
// headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
|
||||
// // 顶栏激活项文字色
|
||||
// headerBarTabActiveColor: ['#000000', '#409EFF'],
|
||||
// // 顶栏背景色
|
||||
// headerBarBackground: JSON.parse(subject.headerBarBackground),
|
||||
// // 顶栏悬停时背景色
|
||||
// headerBarHoverBackground: ['#f5f5f5', '#18222c']
|
||||
// })
|
||||
// // console.log(123, window.localStorage.getItem('getTheme'))
|
||||
|
||||
// const lang = reactive({
|
||||
// // 默认语言,可选值<zh-cn|en>
|
||||
// defaultLang: 'zh-cn',
|
||||
// // 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
|
||||
// fallbackLang: 'zh-cn',
|
||||
// // 支持的语言列表
|
||||
// langArray: [
|
||||
// { name: 'zh-cn', value: '中文简体' },
|
||||
// { name: 'en', value: 'English' }
|
||||
// ]
|
||||
// })
|
||||
|
||||
// function menuWidth() {
|
||||
// if (layout.shrink) {
|
||||
// return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
|
||||
// }
|
||||
// // 菜单是否折叠
|
||||
// return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
|
||||
// }
|
||||
|
||||
// function setLang(val: string) {
|
||||
// lang.defaultLang = val
|
||||
// }
|
||||
|
||||
// function onSetLayoutColor(data = layout.layoutMode) {
|
||||
// // 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
|
||||
// const tempValue = layout.isDark
|
||||
// ? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
|
||||
// : { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
|
||||
// if (
|
||||
// data == 'Classic' &&
|
||||
// layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
|
||||
// ) {
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
|
||||
// } else if (
|
||||
// data == 'Default' &&
|
||||
// layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
|
||||
// ) {
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
|
||||
// }
|
||||
// }
|
||||
|
||||
// function setLayoutMode(data: string) {
|
||||
// layout.layoutMode = data
|
||||
// onSetLayoutColor(data)
|
||||
// }
|
||||
|
||||
// const setLayout = (name: keyof Layout, value: any) => {
|
||||
// layout[name] = value as never
|
||||
// }
|
||||
|
||||
// const getColorVal = function (name: keyof Layout): string {
|
||||
// const colors = layout[name] as string[]
|
||||
// if (layout.isDark) {
|
||||
// return colors[1]
|
||||
// } else {
|
||||
// return colors[0]
|
||||
// }
|
||||
// }
|
||||
|
||||
// return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
|
||||
// },
|
||||
{
|
||||
persist: {
|
||||
key: STORE_CONFIG
|
||||
}
|
||||
}
|
||||
)
|
||||
import { reactive } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
import { STORE_CONFIG } from '@/stores/constant/cacheKey'
|
||||
import type { Layout } from '@/stores/interface'
|
||||
|
||||
export const useConfig = defineStore(
|
||||
'config',
|
||||
() => {
|
||||
const layout: Layout = reactive({
|
||||
/* 全局 */
|
||||
showDrawer: false,
|
||||
// 是否收缩布局(小屏终端)
|
||||
shrink: false,
|
||||
// 后台布局方式,可选值<Default|Classic|Streamline|Double>
|
||||
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>
|
||||
mainAnimation: 'slide-right',
|
||||
// 是否暗黑模式
|
||||
isDark: false,
|
||||
elementUiPrimary: ['#002B6A', '#002B6A'],
|
||||
tableHeaderBackground: ['#F3F6F9', '#F3F6F9'],
|
||||
tableHeaderColor: ['#111', '#fff'],
|
||||
tableCurrent: ['#F3F6F9', '#F3F6F9'],
|
||||
/* 侧边菜单 */
|
||||
// 侧边菜单背景色
|
||||
menuBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 侧边菜单文字颜色
|
||||
menuColor: ['#FFFFFF', '#CFD3DC'],
|
||||
// 侧边菜单激活项背景色
|
||||
menuActiveBackground: ['#002255', '#1d1e1f'],
|
||||
// 侧边菜单激活项文字色
|
||||
menuActiveColor: ['#409eff', '#3375b9'],
|
||||
// 侧边菜单顶栏背景色
|
||||
menuTopBarBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 侧边菜单宽度(展开时),单位px
|
||||
menuWidth: 260,
|
||||
// 侧边菜单项默认图标
|
||||
menuDefaultIcon: 'fa fa-circle-o',
|
||||
// 是否水平折叠收起菜单
|
||||
menuCollapse: false,
|
||||
// 是否只保持一个子菜单的展开(手风琴)
|
||||
menuUniqueOpened: false,
|
||||
// 显示菜单栏顶栏(LOGO)
|
||||
menuShowTopBar: true,
|
||||
|
||||
/* 顶栏 */
|
||||
// 顶栏文字色
|
||||
headerBarTabColor: ['#FFFFFF', '#CFD3DC'],
|
||||
// // 顶栏激活项背景色
|
||||
headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
|
||||
// 顶栏激活项文字色
|
||||
headerBarTabActiveColor: ['#000000', '#409EFF'],
|
||||
// 顶栏背景色
|
||||
headerBarBackground: ['#002B6A', '#1d1e1f'],
|
||||
// 顶栏悬停时背景色
|
||||
headerBarHoverBackground: ['#f5f5f5', '#18222c']
|
||||
})
|
||||
|
||||
const lang = reactive({
|
||||
// 默认语言,可选值<zh-cn|en>
|
||||
defaultLang: 'zh-cn',
|
||||
// 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
|
||||
fallbackLang: 'zh-cn',
|
||||
// 支持的语言列表
|
||||
langArray: [
|
||||
{ name: 'zh-cn', value: '中文简体' },
|
||||
{ name: 'en', value: 'English' }
|
||||
]
|
||||
})
|
||||
|
||||
function menuWidth() {
|
||||
if (layout.shrink) {
|
||||
return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
|
||||
}
|
||||
// 菜单是否折叠
|
||||
return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
|
||||
}
|
||||
|
||||
function setLang(val: string) {
|
||||
lang.defaultLang = val
|
||||
}
|
||||
|
||||
function onSetLayoutColor(data = layout.layoutMode) {
|
||||
// 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
|
||||
const tempValue = layout.isDark
|
||||
? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
|
||||
: { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
|
||||
if (
|
||||
data == 'Classic' &&
|
||||
layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
|
||||
) {
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
|
||||
} else if (
|
||||
data == 'Default' &&
|
||||
layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
|
||||
) {
|
||||
layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
|
||||
}
|
||||
}
|
||||
|
||||
function setLayoutMode(data: string) {
|
||||
layout.layoutMode = data
|
||||
onSetLayoutColor(data)
|
||||
}
|
||||
|
||||
const setLayout = (name: keyof Layout, value: any) => {
|
||||
layout[name] = value as never
|
||||
}
|
||||
|
||||
const getColorVal = function (name: keyof Layout): string {
|
||||
const colors = layout[name] as string[] || ['#082E6C', '#0e8780']
|
||||
if (layout.isDark) {
|
||||
return colors[1]
|
||||
} else {
|
||||
return colors[0]
|
||||
}
|
||||
}
|
||||
|
||||
return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
|
||||
},
|
||||
// () => {
|
||||
//
|
||||
// console.log('🚀 ~ subject:', subject)
|
||||
// const layout: Layout = reactive({
|
||||
// /* 全局 */
|
||||
// showDrawer: false,
|
||||
// // 是否收缩布局(小屏终端)
|
||||
// shrink: false,
|
||||
// // 后台布局方式,可选值<Default|Classic|Streamline|Double>
|
||||
// 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>
|
||||
// mainAnimation: subject.mainAnimation,
|
||||
// // 是否暗黑模式
|
||||
// isDark: false,
|
||||
// elementUiPrimary: JSON.parse(subject.elementUiPrimary),
|
||||
// tableHeaderBackground: JSON.parse(subject.tableHeaderBackground),
|
||||
// tableHeaderColor:JSON.parse(subject.tableHeaderColor),
|
||||
// tableCurrent: JSON.parse(subject.tableCurrent),
|
||||
// /* 侧边菜单 */
|
||||
// // 侧边菜单背景色
|
||||
// menuBackground: JSON.parse(subject.menuBackground),
|
||||
// // 侧边菜单文字颜色
|
||||
// menuColor:JSON.parse(subject.menuColor),
|
||||
// // 侧边菜单激活项背景色
|
||||
// menuActiveBackground:JSON.parse(subject.menuActiveBackground),
|
||||
// // 侧边菜单激活项文字色
|
||||
// menuActiveColor:JSON.parse(subject.menuActiveColor),
|
||||
// // 侧边菜单顶栏背景色
|
||||
// menuTopBarBackground: JSON.parse(subject.menuTopBarBackground),
|
||||
// // 侧边菜单宽度(展开时),单位px
|
||||
// menuWidth: 260,
|
||||
// // 侧边菜单项默认图标
|
||||
// menuDefaultIcon: 'fa fa-circle-o',
|
||||
// // 是否水平折叠收起菜单
|
||||
// menuCollapse: false,
|
||||
// // 是否只保持一个子菜单的展开(手风琴)
|
||||
// menuUniqueOpened: false,
|
||||
// // 显示菜单栏顶栏(LOGO)
|
||||
// menuShowTopBar: true,
|
||||
|
||||
// /* 顶栏 */
|
||||
// // 顶栏文字色
|
||||
// headerBarTabColor:JSON.parse(subject.headerBarTabColor),
|
||||
// // // 顶栏激活项背景色
|
||||
// headerBarTabActiveBackground: ['#ffffff', '#1d1e1f'],
|
||||
// // 顶栏激活项文字色
|
||||
// headerBarTabActiveColor: ['#000000', '#409EFF'],
|
||||
// // 顶栏背景色
|
||||
// headerBarBackground: JSON.parse(subject.headerBarBackground),
|
||||
// // 顶栏悬停时背景色
|
||||
// headerBarHoverBackground: ['#f5f5f5', '#18222c']
|
||||
// })
|
||||
// // console.log(123, window.localStorage.getItem('getTheme'))
|
||||
|
||||
// const lang = reactive({
|
||||
// // 默认语言,可选值<zh-cn|en>
|
||||
// defaultLang: 'zh-cn',
|
||||
// // 当在默认语言包找不到翻译时,继续在 fallbackLang 语言包内查找翻译
|
||||
// fallbackLang: 'zh-cn',
|
||||
// // 支持的语言列表
|
||||
// langArray: [
|
||||
// { name: 'zh-cn', value: '中文简体' },
|
||||
// { name: 'en', value: 'English' }
|
||||
// ]
|
||||
// })
|
||||
|
||||
// function menuWidth() {
|
||||
// if (layout.shrink) {
|
||||
// return layout.menuCollapse ? '0px' : layout.menuWidth + 'px'
|
||||
// }
|
||||
// // 菜单是否折叠
|
||||
// return layout.menuCollapse ? '64px' : layout.menuWidth + 'px'
|
||||
// }
|
||||
|
||||
// function setLang(val: string) {
|
||||
// lang.defaultLang = val
|
||||
// }
|
||||
|
||||
// function onSetLayoutColor(data = layout.layoutMode) {
|
||||
// // 切换布局时,如果是为默认配色方案,对菜单激活背景色重新赋值
|
||||
// const tempValue = layout.isDark
|
||||
// ? { idx: 1, color: '#1d1e1f', newColor: '#141414' }
|
||||
// : { idx: 0, color: '#ffffff', newColor: '#f5f5f5' }
|
||||
// if (
|
||||
// data == 'Classic' &&
|
||||
// layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.color
|
||||
// ) {
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.newColor
|
||||
// } else if (
|
||||
// data == 'Default' &&
|
||||
// layout.headerBarBackground[tempValue.idx] == tempValue.color &&
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] == tempValue.newColor
|
||||
// ) {
|
||||
// layout.headerBarTabActiveBackground[tempValue.idx] = tempValue.color
|
||||
// }
|
||||
// }
|
||||
|
||||
// function setLayoutMode(data: string) {
|
||||
// layout.layoutMode = data
|
||||
// onSetLayoutColor(data)
|
||||
// }
|
||||
|
||||
// const setLayout = (name: keyof Layout, value: any) => {
|
||||
// layout[name] = value as never
|
||||
// }
|
||||
|
||||
// const getColorVal = function (name: keyof Layout): string {
|
||||
// const colors = layout[name] as string[]
|
||||
// if (layout.isDark) {
|
||||
// return colors[1]
|
||||
// } else {
|
||||
// return colors[0]
|
||||
// }
|
||||
// }
|
||||
|
||||
// return { layout, lang, menuWidth, setLang, setLayoutMode, setLayout, getColorVal, onSetLayoutColor }
|
||||
// },
|
||||
{
|
||||
persist: {
|
||||
key: STORE_CONFIG
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@@ -1,286 +1,337 @@
|
||||
//指标类型
|
||||
export const indexOptions = [
|
||||
{
|
||||
label: '电压趋势',
|
||||
options: [
|
||||
{
|
||||
value: '10',
|
||||
label: '相电压有效值'
|
||||
},
|
||||
{
|
||||
value: '11',
|
||||
label: '线电压有效值'
|
||||
},
|
||||
{
|
||||
value: '12',
|
||||
label: '电压偏差'
|
||||
},
|
||||
{
|
||||
value: '13',
|
||||
label: '三相电压不平衡'
|
||||
},
|
||||
{
|
||||
value: '14',
|
||||
label: '电压不平衡'
|
||||
},
|
||||
{
|
||||
value: '15',
|
||||
label: '电压总谐波畸变率'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '电流趋势',
|
||||
options: [
|
||||
{
|
||||
value: '20',
|
||||
label: '电流有效值'
|
||||
},
|
||||
{
|
||||
value: '21',
|
||||
label: '电流总谐波畸变率'
|
||||
},
|
||||
{
|
||||
value: '22',
|
||||
label: '负序电流'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '频率趋势',
|
||||
options: [
|
||||
{
|
||||
value: '30',
|
||||
label: '频率'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '谐波趋势',
|
||||
options: [
|
||||
{
|
||||
value: '40',
|
||||
label: '谐波电压含有率'
|
||||
},
|
||||
{
|
||||
value: '43',
|
||||
label: '谐波电流幅值'
|
||||
},
|
||||
{
|
||||
value: '44',
|
||||
label: '谐波电压相角'
|
||||
},
|
||||
{
|
||||
value: '45',
|
||||
label: '谐波电流相角'
|
||||
},
|
||||
{
|
||||
value: '46',
|
||||
label: '间谐波电压含有率'
|
||||
},
|
||||
// {
|
||||
// value: '47',
|
||||
// label: '间谐波电流含有率'
|
||||
// },
|
||||
// {
|
||||
// value: '48',
|
||||
// label: '间谐波电压幅值'
|
||||
// },
|
||||
{
|
||||
value: '49',
|
||||
label: '间谐波电流幅值'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '功率趋势',
|
||||
options: [
|
||||
{
|
||||
value: '50',
|
||||
label: '谐波有功功率'
|
||||
},
|
||||
{
|
||||
value: '51',
|
||||
label: '谐波无功功率'
|
||||
},
|
||||
{
|
||||
value: '52',
|
||||
label: '谐波视在功率'
|
||||
},
|
||||
{
|
||||
value: '53',
|
||||
label: '三相有功功率'
|
||||
},
|
||||
{
|
||||
value: '54',
|
||||
label: '三相无功功率'
|
||||
},
|
||||
{
|
||||
value: '55',
|
||||
label: '三相视在功率'
|
||||
},
|
||||
{
|
||||
value: '56',
|
||||
label: '三相总有功功率'
|
||||
},
|
||||
{
|
||||
value: '57',
|
||||
label: '三相总无功功率'
|
||||
},
|
||||
{
|
||||
value: '58',
|
||||
label: '三相总视在功率'
|
||||
},
|
||||
{
|
||||
value: '59',
|
||||
label: '视在功率因数'
|
||||
},
|
||||
{
|
||||
value: '591',
|
||||
label: '位移功率因数'
|
||||
},
|
||||
{
|
||||
value: '592',
|
||||
label: '总视在功率因数'
|
||||
},
|
||||
{
|
||||
value: '593',
|
||||
label: '总位移功率因数'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '闪变趋势',
|
||||
options: [
|
||||
{
|
||||
value: '60',
|
||||
label: '短时电压闪变'
|
||||
},
|
||||
{
|
||||
value: '61',
|
||||
label: '长时电压闪变'
|
||||
},
|
||||
{
|
||||
value: '62',
|
||||
label: '电压波动'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
//谐波次数
|
||||
export const harmonicOptions = [
|
||||
{ label: '基波', value: 1 },
|
||||
{ label: '2次', value: 2 },
|
||||
{ label: '3次', value: 3 },
|
||||
{ label: '4次', value: 4 },
|
||||
{ label: '5次', value: 5 },
|
||||
{ label: '6次', value: 6 },
|
||||
{ label: '7次', value: 7 },
|
||||
{ label: '8次', value: 8 },
|
||||
{ label: '9次', value: 9 },
|
||||
{ label: '10次', value: 10 },
|
||||
{ label: '11次', value: 11 },
|
||||
{ label: '12次', value: 12 },
|
||||
{ label: '13次', value: 13 },
|
||||
{ label: '14次', value: 14 },
|
||||
{ label: '15次', value: 15 },
|
||||
{ label: '16次', value: 16 },
|
||||
{ label: '17次', value: 17 },
|
||||
{ label: '18次', value: 18 },
|
||||
{ label: '19次', value: 19 },
|
||||
{ label: '20次', value: 20 },
|
||||
{ label: '21次', value: 21 },
|
||||
{ label: '22次', value: 22 },
|
||||
{ label: '23次', value: 23 },
|
||||
{ label: '24次', value: 24 },
|
||||
{ label: '25次', value: 25 },
|
||||
{ label: '26次', value: 26 },
|
||||
{ label: '27次', value: 27 },
|
||||
{ label: '28次', value: 28 },
|
||||
{ label: '29次', value: 29 },
|
||||
{ label: '30次', value: 30 },
|
||||
{ label: '31次', value: 31 },
|
||||
{ label: '32次', value: 32 },
|
||||
{ label: '33次', value: 33 },
|
||||
{ label: '34次', value: 34 },
|
||||
{ label: '35次', value: 35 },
|
||||
{ label: '36次', value: 36 },
|
||||
{ label: '37次', value: 37 },
|
||||
{ label: '38次', value: 38 },
|
||||
{ label: '39次', value: 39 },
|
||||
{ label: '40次', value: 40 },
|
||||
{ label: '41次', value: 41 },
|
||||
{ label: '42次', value: 42 },
|
||||
{ label: '43次', value: 43 },
|
||||
{ label: '44次', value: 44 },
|
||||
{ label: '45次', value: 45 },
|
||||
{ label: '46次', value: 46 },
|
||||
{ label: '47次', value: 47 },
|
||||
{ label: '48次', value: 48 },
|
||||
{ label: '49次', value: 49 },
|
||||
{ label: '50次', 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 },
|
||||
{ label: '5.5次', value: 6 },
|
||||
{ label: '6.5次', value: 7 },
|
||||
{ label: '7.5次', value: 8 },
|
||||
{ label: '8.5次', value: 9 },
|
||||
{ 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 }
|
||||
]
|
||||
//指标类型
|
||||
export const indexOptions = [
|
||||
{
|
||||
label: '电压趋势',
|
||||
options: [
|
||||
{
|
||||
value: '10',
|
||||
label: '相电压有效值'
|
||||
},
|
||||
{
|
||||
value: '11',
|
||||
label: '线电压有效值'
|
||||
},
|
||||
{
|
||||
value: '12',
|
||||
label: '电压偏差'
|
||||
},
|
||||
{
|
||||
value: '13',
|
||||
label: '三相电压不平衡'
|
||||
},
|
||||
{
|
||||
value: '14',
|
||||
label: '电压不平衡'
|
||||
},
|
||||
{
|
||||
value: '15',
|
||||
label: '电压总谐波畸变率'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '电流趋势',
|
||||
options: [
|
||||
{
|
||||
value: '20',
|
||||
label: '电流有效值'
|
||||
},
|
||||
{
|
||||
value: '21',
|
||||
label: '电流总谐波畸变率'
|
||||
},
|
||||
{
|
||||
value: '22',
|
||||
label: '负序电流'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '频率趋势',
|
||||
options: [
|
||||
{
|
||||
value: '30',
|
||||
label: '频率'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '谐波趋势',
|
||||
options: [
|
||||
{
|
||||
value: '40',
|
||||
label: '谐波电压含有率'
|
||||
},
|
||||
{
|
||||
value: '43',
|
||||
label: '谐波电流幅值'
|
||||
},
|
||||
{
|
||||
value: '44',
|
||||
label: '谐波电压相角'
|
||||
},
|
||||
{
|
||||
value: '45',
|
||||
label: '谐波电流相角'
|
||||
},
|
||||
{
|
||||
value: '46',
|
||||
label: '间谐波电压含有率'
|
||||
},
|
||||
// {
|
||||
// value: '47',
|
||||
// label: '间谐波电流含有率'
|
||||
// },
|
||||
// {
|
||||
// value: '48',
|
||||
// label: '间谐波电压幅值'
|
||||
// },
|
||||
{
|
||||
value: '49',
|
||||
label: '间谐波电流幅值'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '功率趋势',
|
||||
options: [
|
||||
{
|
||||
value: '50',
|
||||
label: '谐波有功功率'
|
||||
},
|
||||
{
|
||||
value: '51',
|
||||
label: '谐波无功功率'
|
||||
},
|
||||
{
|
||||
value: '52',
|
||||
label: '谐波视在功率'
|
||||
},
|
||||
{
|
||||
value: '53',
|
||||
label: '三相有功功率'
|
||||
},
|
||||
{
|
||||
value: '54',
|
||||
label: '三相无功功率'
|
||||
},
|
||||
{
|
||||
value: '55',
|
||||
label: '三相视在功率'
|
||||
},
|
||||
{
|
||||
value: '56',
|
||||
label: '三相总有功功率'
|
||||
},
|
||||
{
|
||||
value: '57',
|
||||
label: '三相总无功功率'
|
||||
},
|
||||
{
|
||||
value: '58',
|
||||
label: '三相总视在功率'
|
||||
},
|
||||
{
|
||||
value: '59',
|
||||
label: '视在功率因数'
|
||||
},
|
||||
{
|
||||
value: '591',
|
||||
label: '位移功率因数'
|
||||
},
|
||||
{
|
||||
value: '592',
|
||||
label: '总视在功率因数'
|
||||
},
|
||||
{
|
||||
value: '593',
|
||||
label: '总位移功率因数'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '闪变趋势',
|
||||
options: [
|
||||
{
|
||||
value: '60',
|
||||
label: '短时电压闪变'
|
||||
},
|
||||
{
|
||||
value: '61',
|
||||
label: '长时电压闪变'
|
||||
},
|
||||
{
|
||||
value: '62',
|
||||
label: '电压波动'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
//谐波次数
|
||||
export const harmonicOptions = [
|
||||
{ label: '基波', value: 1 },
|
||||
{ label: '2次', value: 2 },
|
||||
{ label: '3次', value: 3 },
|
||||
{ label: '4次', value: 4 },
|
||||
{ label: '5次', value: 5 },
|
||||
{ label: '6次', value: 6 },
|
||||
{ label: '7次', value: 7 },
|
||||
{ label: '8次', value: 8 },
|
||||
{ label: '9次', value: 9 },
|
||||
{ label: '10次', value: 10 },
|
||||
{ label: '11次', value: 11 },
|
||||
{ label: '12次', value: 12 },
|
||||
{ label: '13次', value: 13 },
|
||||
{ label: '14次', value: 14 },
|
||||
{ label: '15次', value: 15 },
|
||||
{ label: '16次', value: 16 },
|
||||
{ label: '17次', value: 17 },
|
||||
{ label: '18次', value: 18 },
|
||||
{ label: '19次', value: 19 },
|
||||
{ label: '20次', value: 20 },
|
||||
{ label: '21次', value: 21 },
|
||||
{ label: '22次', value: 22 },
|
||||
{ label: '23次', value: 23 },
|
||||
{ label: '24次', value: 24 },
|
||||
{ label: '25次', value: 25 },
|
||||
{ label: '26次', value: 26 },
|
||||
{ label: '27次', value: 27 },
|
||||
{ label: '28次', value: 28 },
|
||||
{ label: '29次', value: 29 },
|
||||
{ label: '30次', value: 30 },
|
||||
{ label: '31次', value: 31 },
|
||||
{ label: '32次', value: 32 },
|
||||
{ label: '33次', value: 33 },
|
||||
{ label: '34次', value: 34 },
|
||||
{ label: '35次', value: 35 },
|
||||
{ label: '36次', value: 36 },
|
||||
{ label: '37次', value: 37 },
|
||||
{ label: '38次', value: 38 },
|
||||
{ label: '39次', value: 39 },
|
||||
{ label: '40次', value: 40 },
|
||||
{ label: '41次', value: 41 },
|
||||
{ label: '42次', value: 42 },
|
||||
{ label: '43次', value: 43 },
|
||||
{ label: '44次', value: 44 },
|
||||
{ label: '45次', value: 45 },
|
||||
{ label: '46次', value: 46 },
|
||||
{ label: '47次', value: 47 },
|
||||
{ label: '48次', value: 48 },
|
||||
{ label: '49次', value: 49 },
|
||||
{ label: '50次', value: 50 }
|
||||
]
|
||||
export const harmonicOptions1 = [
|
||||
{ label: '2次', value: 2 },
|
||||
{ label: '3次', value: 3 },
|
||||
{ label: '4次', value: 4 },
|
||||
{ label: '5次', value: 5 },
|
||||
{ label: '6次', value: 6 },
|
||||
{ label: '7次', value: 7 },
|
||||
{ label: '8次', value: 8 },
|
||||
{ label: '9次', value: 9 },
|
||||
{ label: '10次', value: 10 },
|
||||
{ label: '11次', value: 11 },
|
||||
{ label: '12次', value: 12 },
|
||||
{ label: '13次', value: 13 },
|
||||
{ label: '14次', value: 14 },
|
||||
{ label: '15次', value: 15 },
|
||||
{ label: '16次', value: 16 },
|
||||
{ label: '17次', value: 17 },
|
||||
{ label: '18次', value: 18 },
|
||||
{ label: '19次', value: 19 },
|
||||
{ label: '20次', value: 20 },
|
||||
{ label: '21次', value: 21 },
|
||||
{ label: '22次', value: 22 },
|
||||
{ label: '23次', value: 23 },
|
||||
{ label: '24次', value: 24 },
|
||||
{ label: '25次', value: 25 },
|
||||
{ label: '26次', value: 26 },
|
||||
{ label: '27次', value: 27 },
|
||||
{ label: '28次', value: 28 },
|
||||
{ label: '29次', value: 29 },
|
||||
{ label: '30次', value: 30 },
|
||||
{ label: '31次', value: 31 },
|
||||
{ label: '32次', value: 32 },
|
||||
{ label: '33次', value: 33 },
|
||||
{ label: '34次', value: 34 },
|
||||
{ label: '35次', value: 35 },
|
||||
{ label: '36次', value: 36 },
|
||||
{ label: '37次', value: 37 },
|
||||
{ label: '38次', value: 38 },
|
||||
{ label: '39次', value: 39 },
|
||||
{ label: '40次', value: 40 },
|
||||
{ label: '41次', value: 41 },
|
||||
{ label: '42次', value: 42 },
|
||||
{ label: '43次', value: 43 },
|
||||
{ label: '44次', value: 44 },
|
||||
{ label: '45次', value: 45 },
|
||||
{ label: '46次', value: 46 },
|
||||
{ label: '47次', value: 47 },
|
||||
{ label: '48次', value: 48 },
|
||||
{ label: '49次', value: 49 },
|
||||
{ label: '50次', 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 },
|
||||
{ label: '5.5次', value: 6 },
|
||||
{ label: '6.5次', value: 7 },
|
||||
{ label: '7.5次', value: 8 },
|
||||
{ label: '8.5次', value: 9 },
|
||||
{ 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 }
|
||||
]
|
||||
|
||||
@@ -50,13 +50,17 @@ class MQTT {
|
||||
if (this.client) {
|
||||
throw new Error('MQTT 客户端已初始化')
|
||||
}
|
||||
|
||||
const mqttUrl = localStorage.getItem('MqttUrl')
|
||||
console.log('MQTT URL:', mqttUrl)
|
||||
if (!mqttUrl || mqttUrl === 'null') {
|
||||
return Promise.resolve()
|
||||
}
|
||||
try {
|
||||
const mqttUrl =
|
||||
localStorage.getItem('MqttUrl') == 'null'
|
||||
? 'ws://192.168.1.68:8083/mqtt'
|
||||
: localStorage.getItem('MqttUrl')
|
||||
if (mqttUrl == 'null'||mqttUrl == null) return
|
||||
// const mqttUrl =
|
||||
// localStorage.getItem('MqttUrl') == 'null'
|
||||
// ? 'ws://192.168.1.68:8083/mqtt'
|
||||
// : localStorage.getItem('MqttUrl')
|
||||
|
||||
this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions)
|
||||
this.setupEventListeners()
|
||||
|
||||
@@ -77,12 +81,12 @@ class MQTT {
|
||||
|
||||
this.client?.on('error', error => {
|
||||
clearTimeout(timeout)
|
||||
console.error('MQTT 连接错误:', error)
|
||||
console.log('MQTT 连接错误:', error)
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('初始化 MQTT 失败:', error)
|
||||
// console.log('初始化 MQTT 失败:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -131,7 +135,7 @@ class MQTT {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.client?.subscribe(this.topic, { qos: this.defaultOptions.qos, ...subscribeOptions }, error => {
|
||||
if (error) {
|
||||
console.error('订阅失败:', error)
|
||||
console.log('订阅失败:', error)
|
||||
reject(error)
|
||||
} else {
|
||||
console.log('订阅成功')
|
||||
@@ -153,7 +157,7 @@ class MQTT {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.client?.unsubscribe(this.topic, error => {
|
||||
if (error) {
|
||||
console.error('取消订阅失败:', error)
|
||||
console.log('取消订阅失败:', error)
|
||||
reject(error)
|
||||
} else {
|
||||
console.log('取消订阅成功')
|
||||
@@ -188,7 +192,7 @@ class MQTT {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.client?.publish(this.topic, message, { qos: this.defaultOptions.qos, ...options }, error => {
|
||||
if (error) {
|
||||
console.error('消息发布失败:', error)
|
||||
console.log('消息发布失败:', error)
|
||||
reject(error)
|
||||
} else {
|
||||
console.log('消息发布成功')
|
||||
|
||||
@@ -104,11 +104,11 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
if (token) {
|
||||
;(config.headers as anyObj).Authorization = token
|
||||
} else {
|
||||
config.headers.Authorization = 'Basic bmpjbnRlc3Q6bmpjbnBxcw=='
|
||||
config.headers.Authorization = 'Basic bmpjbjpuamNucHFz'
|
||||
}
|
||||
}
|
||||
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
|
||||
@@ -145,12 +145,14 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
return refreshToken()
|
||||
.then(res => {
|
||||
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 = []
|
||||
|
||||
return Axios(response.config)
|
||||
})
|
||||
.catch(err => {
|
||||
window.location.reload()
|
||||
adminInfo.removeToken()
|
||||
router.push({ name: 'login' })
|
||||
return Promise.reject(err)
|
||||
|
||||
@@ -77,6 +77,7 @@ export default class TableStore {
|
||||
}
|
||||
|
||||
index() {
|
||||
|
||||
this.table.beforeSearchFun && this.table.beforeSearchFun()
|
||||
this.table.data = []
|
||||
this.table.loading = true
|
||||
@@ -97,10 +98,12 @@ export default class TableStore {
|
||||
url: this.url,
|
||||
method: this.method
|
||||
},
|
||||
|
||||
requestPayload(this.method, this.table.params, this.paramsPOST)
|
||||
)
|
||||
)
|
||||
.then((res: any) => {
|
||||
|
||||
if (res.data) {
|
||||
this.table.data = res.data.records || res.data
|
||||
this.table.total = res.data?.total || res.data.length || 0
|
||||
@@ -129,13 +132,15 @@ export default class TableStore {
|
||||
* @param data 携带数据
|
||||
*/
|
||||
onTableAction = (event: string, data: anyObj) => {
|
||||
|
||||
const actionFun = new Map([
|
||||
[
|
||||
'search',
|
||||
() => {
|
||||
|
||||
|
||||
this.table.params.pageNum = 1
|
||||
this.index()
|
||||
|
||||
}
|
||||
],
|
||||
[
|
||||
@@ -201,9 +206,10 @@ export default class TableStore {
|
||||
[
|
||||
'export',
|
||||
() => {
|
||||
|
||||
this.table.exportLoading = true
|
||||
// this.index()
|
||||
//console.log('export')
|
||||
|
||||
let params = { ...this.table.params, pageNum: 1, pageSize: this.table.total }
|
||||
createAxios(
|
||||
Object.assign(
|
||||
@@ -219,7 +225,7 @@ export default class TableStore {
|
||||
this.table.exportProcessingData && this.table.exportProcessingData()
|
||||
this.table.allFlag = data.showAllFlag || true
|
||||
this.table.exportLoading = false
|
||||
|
||||
|
||||
})
|
||||
.catch(() => {
|
||||
this.table.exportLoading = false
|
||||
|
||||
@@ -38,6 +38,7 @@ const tableStore = new TableStore({
|
||||
echarts.value.Grade(tableStore.table.data.voltageStatistics)
|
||||
echarts.value.Relation(tableStore.table.data.monthlyStatistics)
|
||||
table.value.info(tableStore.table.data)
|
||||
|
||||
}
|
||||
})
|
||||
provide('tableStore', tableStore)
|
||||
|
||||
@@ -183,7 +183,7 @@ import TableHeader from '@/components/table/header/index.vue'
|
||||
import MyEChart from '@/components/echarts/MyEchart.vue'
|
||||
import { useMonitoringPoint } from '@/stores/monitoringPoint'
|
||||
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { harmonicOptions } from '@/utils/dictionary'
|
||||
import { harmonicOptions1 } from '@/utils/dictionary'
|
||||
import { Select } from '@element-plus/icons-vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import {
|
||||
@@ -202,7 +202,7 @@ import html2canvas from 'html2canvas'
|
||||
import { yMethod } from '@/utils/echartMethod'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
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 monitoringPoint = useMonitoringPoint()
|
||||
const size = ref(19)
|
||||
@@ -844,7 +844,7 @@ onMounted(() => {
|
||||
}
|
||||
.btnBox {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
:deep(.vxe-table--header thead tr:first-of-type th:first-of-type) {
|
||||
|
||||
@@ -157,7 +157,7 @@ const tableStore: any = new TableStore({
|
||||
},
|
||||
{
|
||||
name: 'del',
|
||||
text: '禁止接入',
|
||||
text: '删除',
|
||||
type: 'danger',
|
||||
icon: 'el-icon-Delete',
|
||||
render: 'confirmButton',
|
||||
@@ -165,11 +165,11 @@ const tableStore: any = new TableStore({
|
||||
confirmButtonText: '确认',
|
||||
cancelButtonText: '取消',
|
||||
confirmButtonType: 'danger',
|
||||
title: '确定禁止接入?'
|
||||
title: '确定删除?'
|
||||
},
|
||||
click: row => {
|
||||
remove({ ids: row.id }).then(() => {
|
||||
ElMessage.success('禁止接入成功')
|
||||
ElMessage.success('删除成功')
|
||||
tableStore.index()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,163 +1,163 @@
|
||||
<template>
|
||||
<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>
|
||||
|
||||
<vxe-table v-bind="defaultAttribute" v-loading="loading" height="500px" ref="xTable" :data="userData">
|
||||
<vxe-column field="devName" title="设备名称"></vxe-column>
|
||||
<vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column>
|
||||
<vxe-column field="protocolCapacity" title="设备容量(MVA)"></vxe-column>
|
||||
<vxe-column title="操作" width="120px">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" size="small" link @click="revise(row)">修改</el-button>
|
||||
|
||||
<el-popconfirm @confirm="deleteD(row)" title="确认删除设备?">
|
||||
<template #reference>
|
||||
<el-button type="danger" size="small" link>删除</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
</el-dialog>
|
||||
<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-item label="设备名称" prop="devName">
|
||||
<el-input
|
||||
v-model.trim="form.devName"
|
||||
placeholder="请输入设备名称"
|
||||
maxlength="32"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="电压等级" prop="devScale">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="设备容量(MVA)" prop="protocolCapacity">
|
||||
<el-input-number
|
||||
v-model="form.protocolCapacity"
|
||||
style="width: 100%"
|
||||
:min="0"
|
||||
:max="10000000"
|
||||
placeholder="请选择设备容量"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue'
|
||||
import { queyDeviceList, addDev, updateDev, removeDev } from '@/api/advance-boot/bearingCapacity'
|
||||
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import { ElMessage } from 'element-plus'
|
||||
const dictData = useDictData()
|
||||
const levelList = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
const dialogVisible = ref(false)
|
||||
const addShow = ref(false)
|
||||
const loading = ref(false)
|
||||
const userData = ref([])
|
||||
const rowList = ref([])
|
||||
const title = ref('')
|
||||
const formRef = ref()
|
||||
|
||||
const form: any = ref({
|
||||
devName: '',
|
||||
devScale: '',
|
||||
protocolCapacity: 0,
|
||||
userId: ''
|
||||
})
|
||||
const rules = {
|
||||
devName: [{ required: true, message: '请输入设备名称', trigger: 'blur' }],
|
||||
devScale: [{ required: true, message: '请输入设备名称', trigger: 'change' }],
|
||||
protocolCapacity: [{ required: true, message: '请输入设备名称', trigger: 'blur' }]
|
||||
}
|
||||
const open = (row: any) => {
|
||||
dialogVisible.value = true
|
||||
loading.value = true
|
||||
rowList.value = row
|
||||
queyDeviceList({
|
||||
userId: row.userId
|
||||
}).then(res => {
|
||||
loading.value = false
|
||||
userData.value = res.data
|
||||
})
|
||||
}
|
||||
// 新增
|
||||
const add = () => {
|
||||
addShow.value = true
|
||||
title.value = '新增设备'
|
||||
}
|
||||
|
||||
// 过滤数据
|
||||
const formatter = (row: any) => {
|
||||
if (row.column.field == 'devScale') {
|
||||
return levelList.filter(item => item.id == row.cellValue)[0].name
|
||||
} else {
|
||||
return row.cellValue
|
||||
}
|
||||
}
|
||||
// 修改
|
||||
const revise = (row: any) => {
|
||||
form.value = JSON.parse(JSON.stringify(row))
|
||||
title.value = '修改设备'
|
||||
addShow.value = true
|
||||
}
|
||||
// 关闭弹框
|
||||
const handleClose = () => {
|
||||
addShow.value = false
|
||||
form.value = {
|
||||
devName: '',
|
||||
devScale: '',
|
||||
protocolCapacity: 0,
|
||||
userId: ''
|
||||
}
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
// 新增设备
|
||||
const submitForm = async () => {
|
||||
await formRef.value.validate(valid => {
|
||||
if (valid) {
|
||||
if (title.value == '新增设备') {
|
||||
form.value.userId = rowList.value.userId
|
||||
addDev(form.value).then(res => {
|
||||
ElMessage.success('新增成功!')
|
||||
open(rowList.value)
|
||||
handleClose()
|
||||
})
|
||||
} else {
|
||||
updateDev(form.value).then(res => {
|
||||
ElMessage.success('修改成功!')
|
||||
open(rowList.value)
|
||||
handleClose()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
// 删除设备
|
||||
const deleteD = row => {
|
||||
removeDev({ devIds: row.devId }).then(res => {
|
||||
ElMessage.success('删除设备成功!')
|
||||
open(rowList.value)
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.formBox{
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
}
|
||||
|
||||
</style>
|
||||
<template>
|
||||
<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>
|
||||
|
||||
<vxe-table v-bind="defaultAttribute" v-loading="loading" height="500px" ref="xTable" :data="userData">
|
||||
<vxe-column field="devName" title="设备名称"></vxe-column>
|
||||
<vxe-column field="devScale" title="电压等级" :formatter="formatter"></vxe-column>
|
||||
<vxe-column field="protocolCapacity" title="设备容量(MVA)"></vxe-column>
|
||||
<vxe-column title="操作" width="120px">
|
||||
<template #default="{ row }">
|
||||
<el-button type="primary" size="small" link @click="revise(row)">修改</el-button>
|
||||
|
||||
<el-popconfirm @confirm="deleteD(row)" title="确认删除设备?">
|
||||
<template #reference>
|
||||
<el-button type="danger" size="small" link>删除</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
</el-dialog>
|
||||
<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-item label="设备名称" prop="devName">
|
||||
<el-input
|
||||
v-model.trim="form.devName"
|
||||
placeholder="请输入设备名称"
|
||||
maxlength="32"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="电压等级" prop="devScale">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="设备容量(MVA)" prop="protocolCapacity">
|
||||
<el-input-number
|
||||
v-model="form.protocolCapacity"
|
||||
style="width: 100%"
|
||||
:min="0"
|
||||
:max="10000000"
|
||||
placeholder="请选择设备容量"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue'
|
||||
import { queyDeviceList, addDev, updateDev, removeDev } from '@/api/advance-boot/bearingCapacity'
|
||||
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import { ElMessage } from 'element-plus'
|
||||
const dictData = useDictData()
|
||||
const levelList = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
const dialogVisible = ref(false)
|
||||
const addShow = ref(false)
|
||||
const loading = ref(false)
|
||||
const userData = ref([])
|
||||
const rowList = ref([])
|
||||
const title = ref('')
|
||||
const formRef = ref()
|
||||
|
||||
const form: any = ref({
|
||||
devName: '',
|
||||
devScale: '',
|
||||
protocolCapacity: 0,
|
||||
userId: ''
|
||||
})
|
||||
const rules = {
|
||||
devName: [{ required: true, message: '请输入设备名称', trigger: 'blur' }],
|
||||
devScale: [{ required: true, message: '请输入设备名称', trigger: 'change' }],
|
||||
protocolCapacity: [{ required: true, message: '请输入设备名称', trigger: 'blur' }]
|
||||
}
|
||||
const open = (row: any) => {
|
||||
dialogVisible.value = true
|
||||
loading.value = true
|
||||
rowList.value = row
|
||||
queyDeviceList({
|
||||
userId: row.userId
|
||||
}).then(res => {
|
||||
loading.value = false
|
||||
userData.value = res.data
|
||||
})
|
||||
}
|
||||
// 新增
|
||||
const add = () => {
|
||||
addShow.value = true
|
||||
title.value = '新增设备'
|
||||
}
|
||||
|
||||
// 过滤数据
|
||||
const formatter = (row: any) => {
|
||||
if (row.column.field == 'devScale') {
|
||||
return levelList.filter(item => item.id == row.cellValue)[0].name
|
||||
} else {
|
||||
return row.cellValue
|
||||
}
|
||||
}
|
||||
// 修改
|
||||
const revise = (row: any) => {
|
||||
form.value = JSON.parse(JSON.stringify(row))
|
||||
title.value = '修改设备'
|
||||
addShow.value = true
|
||||
}
|
||||
// 关闭弹框
|
||||
const handleClose = () => {
|
||||
addShow.value = false
|
||||
form.value = {
|
||||
devName: '',
|
||||
devScale: '',
|
||||
protocolCapacity: 0,
|
||||
userId: ''
|
||||
}
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
// 新增设备
|
||||
const submitForm = async () => {
|
||||
await formRef.value.validate(valid => {
|
||||
if (valid) {
|
||||
if (title.value == '新增设备') {
|
||||
form.value.userId = rowList.value.userId
|
||||
addDev(form.value).then(res => {
|
||||
ElMessage.success('新增成功!')
|
||||
open(rowList.value)
|
||||
handleClose()
|
||||
})
|
||||
} else {
|
||||
updateDev(form.value).then(res => {
|
||||
ElMessage.success('修改成功!')
|
||||
open(rowList.value)
|
||||
handleClose()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
// 删除设备
|
||||
const deleteD = row => {
|
||||
removeDev({ devIds: row.devId }).then(res => {
|
||||
ElMessage.success('删除设备成功!')
|
||||
open(rowList.value)
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.formBox{
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -57,9 +57,15 @@
|
||||
|
||||
<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" :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 label="详细地址:" prop="area">
|
||||
<el-input
|
||||
clearable
|
||||
@@ -95,7 +101,7 @@ import { mainHeight } from '@/utils/layout'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import equipment from './equipment.vue'
|
||||
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({
|
||||
name: 'estimate/photovoltaic'
|
||||
@@ -108,8 +114,9 @@ const disabled = ref(false)
|
||||
const TableHeaderRef = ref()
|
||||
const equipmentRef = ref()
|
||||
const title = ref('')
|
||||
const VITE_FLAG = import.meta.env.VITE_NAME == 'removeMode'
|
||||
//const areaList: any = dictData.areaSelect()
|
||||
const areaList = ref([])
|
||||
const areaList: any = ref([])
|
||||
const userShow: any = ref('Power_Station_Users')
|
||||
|
||||
const form = ref({
|
||||
@@ -187,7 +194,8 @@ const tableStore: any = new TableStore({
|
||||
{ field: 'createBy', title: '创建者' },
|
||||
{ field: 'createTime', title: '创建日期' },
|
||||
{
|
||||
title: '操作',fixed: 'right',
|
||||
title: '操作',
|
||||
fixed: 'right',
|
||||
width: '180',
|
||||
render: 'buttons',
|
||||
buttons: [
|
||||
@@ -258,9 +266,7 @@ const tableStore: any = new TableStore({
|
||||
}
|
||||
],
|
||||
|
||||
loadCallback: () => {
|
||||
console.log(tableStore.table.data)
|
||||
}
|
||||
loadCallback: () => {}
|
||||
})
|
||||
|
||||
tableStore.table.params.userType = ''
|
||||
@@ -268,8 +274,6 @@ tableStore.table.params.userType = ''
|
||||
provide('tableStore', tableStore)
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
|
||||
|
||||
})
|
||||
const useChange = (e: string) => {
|
||||
userShow.value = uesrList.filter(item => item.id == e)[0].code
|
||||
@@ -278,10 +282,14 @@ const useChange = (e: string) => {
|
||||
const add = async () => {
|
||||
disabled.value = false
|
||||
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
|
||||
}
|
||||
// 保存
|
||||
|
||||
@@ -40,7 +40,14 @@
|
||||
></Table>
|
||||
</div>
|
||||
<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>
|
||||
<Icon name="el-icon-Search" style="font-size: 16px" />
|
||||
</template>
|
||||
@@ -141,7 +148,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="最大终端数:" prop="nodeDevNum" class="top">
|
||||
<el-input
|
||||
v-model="formData.nodeDevNum"
|
||||
v-model.trim.number="formData.nodeDevNum"
|
||||
onkeyup="value = value.replace(/[^0-9]/g,'')"
|
||||
maxlength="5"
|
||||
placeholder="请输入最大终端数"
|
||||
@@ -149,7 +156,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="最大进程数:" prop="maxProcessNum" class="top">
|
||||
<el-input
|
||||
v-model="formData.maxProcessNum"
|
||||
v-model.trim.number="formData.maxProcessNum"
|
||||
onkeyup="value = value.replace(/[^0-9]/g,'')"
|
||||
maxlength="5"
|
||||
placeholder="请根据监测点规模填写合适进程数(1个进程最大可承载200个监测点)"
|
||||
@@ -209,7 +216,8 @@ import {
|
||||
updateNode,
|
||||
nodeDeviceTree,
|
||||
updateDeviceProcess,
|
||||
askRestartProcess
|
||||
askRestartProcess,
|
||||
allotTerminal
|
||||
} from '@/api/device-boot/Business'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
@@ -272,7 +280,7 @@ const tableStore = new TableStore({
|
||||
method: 'POST',
|
||||
column: [
|
||||
{ title: '名称', field: 'name' },
|
||||
{ title: 'IP', field: 'ip' ,width:'120px' },
|
||||
{ title: 'IP', field: 'ip', width: '120px' },
|
||||
{
|
||||
title: '等级',
|
||||
field: 'nodeGrade',
|
||||
@@ -289,7 +297,7 @@ const tableStore = new TableStore({
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '最大监测点数量',
|
||||
title: '最大终端数量',
|
||||
field: 'nodeDevNum'
|
||||
},
|
||||
{
|
||||
@@ -316,7 +324,8 @@ const tableStore = new TableStore({
|
||||
{ title: '描述', field: 'remark' },
|
||||
|
||||
{
|
||||
title: '操作',fixed: 'right',
|
||||
title: '操作',
|
||||
fixed: 'right',
|
||||
align: 'center',
|
||||
width: '180',
|
||||
render: 'buttons',
|
||||
@@ -351,7 +360,7 @@ const tableStore = new TableStore({
|
||||
},
|
||||
click: row => {
|
||||
askRestartProcess({
|
||||
deviceRebootType: null,
|
||||
deviceRebootType: 1,
|
||||
nodeId: row.id,
|
||||
processNo: 1
|
||||
}).then(res => {
|
||||
@@ -375,8 +384,8 @@ const tableStore = new TableStore({
|
||||
},
|
||||
click: row => {
|
||||
if (hasDevices.value) {
|
||||
ElMessage.warning('此前置机绑定了设备,无法删除!');
|
||||
return;
|
||||
ElMessage.warning('此前置机绑定了设备,无法删除!')
|
||||
return
|
||||
}
|
||||
|
||||
delNode(row.id).then(res => {
|
||||
@@ -384,6 +393,31 @@ const tableStore = new TableStore({
|
||||
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) {
|
||||
// 检查是否有设备绑定
|
||||
const hasAnyDevices = res.data.processDeviceList.some(item =>
|
||||
item.deviceInfoList && item.deviceInfoList.length > 0
|
||||
);
|
||||
hasDevices.value = hasAnyDevices;
|
||||
|
||||
const hasAnyDevices = res.data.processDeviceList.some(
|
||||
item => item.deviceInfoList && item.deviceInfoList.length > 0
|
||||
)
|
||||
hasDevices.value = hasAnyDevices
|
||||
|
||||
dataSource.value = res.data.processDeviceList.filter(item => {
|
||||
item.name = item.processNo + '';
|
||||
return true; // 保持原有的过滤逻辑
|
||||
});
|
||||
item.name = item.processNo + ''
|
||||
return true // 保持原有的过滤逻辑
|
||||
})
|
||||
} else {
|
||||
dataSource.value = []
|
||||
hasDevices.value = false;
|
||||
hasDevices.value = false
|
||||
}
|
||||
loading.value = false
|
||||
|
||||
})
|
||||
.catch(() => {
|
||||
// 添加错误处理,确保 loading 状态也能关闭
|
||||
dataSource.value = []
|
||||
hasDevices.value = false;
|
||||
hasDevices.value = false
|
||||
loading.value = false
|
||||
})
|
||||
|
||||
@@ -450,11 +483,11 @@ const currentChangeEvent = () => {
|
||||
|
||||
// 重启进程
|
||||
const restart = (data: any) => {
|
||||
// console.log('🚀 ~ restart ~ data:', data)
|
||||
// console.log('🚀 ~ restart ~ data:', data)
|
||||
askRestartProcess({
|
||||
deviceRebootType: data.processNo,
|
||||
deviceRebootType: null,
|
||||
nodeId: nodeId.value,
|
||||
processNo: 2
|
||||
processNo: data.processNo
|
||||
}).then(res => {
|
||||
ElMessage.success('重启成功')
|
||||
currentChangeEvent()
|
||||
@@ -492,7 +525,7 @@ const filterNode = (value: string, data: any, node: any) => {
|
||||
|
||||
// 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符.
|
||||
const chooseNode = (value: string, data: any, node: any) => {
|
||||
if (data.name.indexOf(value) !== -1) {
|
||||
if ((data.subName + data.name).indexOf(value) !== -1) {
|
||||
return true
|
||||
}
|
||||
const level = node.level
|
||||
@@ -603,7 +636,7 @@ const addMenu = () => {}
|
||||
:deep(.default) {
|
||||
display: flex;
|
||||
.row--current {
|
||||
// background-color: var(--el-color-primary-light-8) !important;
|
||||
// background-color: var(--el-color-primary-light-8) !important;
|
||||
}
|
||||
}
|
||||
.custom-tree-node {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<TableHeader>
|
||||
<template #select>
|
||||
<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
|
||||
v-for="item in teriminaloption"
|
||||
:key="item.id"
|
||||
@@ -13,7 +13,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<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
|
||||
v-for="item in teriminalstatusoption"
|
||||
:key="item.id"
|
||||
@@ -23,7 +23,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<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
|
||||
v-for="item in stateoption"
|
||||
:key="item.id"
|
||||
@@ -42,7 +42,7 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="筛选数据">
|
||||
<!-- <el-form-item label="筛选数据">
|
||||
<el-input
|
||||
v-model="tableStore.table.params.filterName"
|
||||
@keyup="searchEvent"
|
||||
@@ -50,7 +50,7 @@
|
||||
show-word-limit
|
||||
placeholder="输入关键字筛选"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
</template>
|
||||
<!-- <template #operation>
|
||||
<el-button icon="el-icon-Download" @click="add">导出</el-button>
|
||||
@@ -252,9 +252,9 @@ const tableStore = new TableStore({
|
||||
}, 0)
|
||||
}
|
||||
})
|
||||
tableStore.table.params.teriminal = ''
|
||||
tableStore.table.params.teriminalstatus = ''
|
||||
tableStore.table.params.state = ''
|
||||
tableStore.table.params.devType = ''
|
||||
tableStore.table.params.runFlag = ''
|
||||
tableStore.table.params.comFlag = ''
|
||||
tableStore.table.params.program = ''
|
||||
tableStore.table.params.searchEvent = ''
|
||||
tableStore.table.params.filterName = ''
|
||||
|
||||
@@ -1740,8 +1740,8 @@ const optionarr = ref([
|
||||
])
|
||||
/**母线类型 */
|
||||
const busBarType = ref([
|
||||
{ name: '实际母线', value: 0 },
|
||||
{ name: '虚拟母线', value: 1 }
|
||||
{ name: '真实母线', value: 1 },
|
||||
{ name: '虚拟母线', value: 0 }
|
||||
])
|
||||
const bigList: any = ref([])
|
||||
const smallList: any = ref([])
|
||||
@@ -1811,7 +1811,7 @@ const busBarDetail = ref({
|
||||
/**电压等级 */
|
||||
scale: '',
|
||||
/**母线类型 */
|
||||
model: 0,
|
||||
model: 1,
|
||||
/**母线id */
|
||||
subvIndex: '',
|
||||
/**监测点 */
|
||||
|
||||
107
src/views/pqs/business/terminal/sensitiveLoadMange/detail.vue
Normal file
107
src/views/pqs/business/terminal/sensitiveLoadMange/detail.vue
Normal 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>
|
||||
117
src/views/pqs/business/terminal/sensitiveLoadMange/index.vue
Normal file
117
src/views/pqs/business/terminal/sensitiveLoadMange/index.vue
Normal 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>
|
||||
@@ -604,56 +604,74 @@ const maintenanceData = reactive({
|
||||
//上节点选择
|
||||
const checkLeft = (checkedNodes: any, checkedKeys: any) => {
|
||||
maintenanceData.upNode = checkedNodes.id
|
||||
if (maintenanceData.upNode === maintenanceData.downNode) {
|
||||
menuTreeRight.value?.setCheckedKeys([])
|
||||
maintenanceData.downNode = ''
|
||||
}
|
||||
if (checkedKeys.checkedKeys.length > 1) {
|
||||
menuTreeLeft.value?.setCheckedKeys([checkedNodes.id])
|
||||
}
|
||||
if (maintenanceData.upNode === maintenanceData.downNode) {
|
||||
menuTreeRight.value?.setCheckedKeys([])
|
||||
maintenanceData.downNode = ''
|
||||
}
|
||||
if (checkedKeys.checkedKeys.length > 1) {
|
||||
menuTreeLeft.value?.setCheckedKeys([checkedNodes.id])
|
||||
}
|
||||
}
|
||||
|
||||
//下节点选择
|
||||
const checkRight = (checkedNodes: any, checkedKeys: any) => {
|
||||
maintenanceData.downNode = checkedNodes.id
|
||||
if (maintenanceData.downNode === maintenanceData.upNode) {
|
||||
menuTreeLeft.value?.setCheckedKeys([])
|
||||
maintenanceData.upNode = ''
|
||||
}
|
||||
if (checkedKeys.checkedKeys.length > 1) {
|
||||
menuTreeRight.value?.setCheckedKeys([checkedNodes.id])
|
||||
}
|
||||
|
||||
if (maintenanceData.downNode === maintenanceData.upNode) {
|
||||
menuTreeLeft.value?.setCheckedKeys([])
|
||||
maintenanceData.upNode = ''
|
||||
}
|
||||
if (checkedKeys.checkedKeys.length > 1) {
|
||||
menuTreeRight.value?.setCheckedKeys([checkedNodes.id])
|
||||
}
|
||||
}
|
||||
|
||||
//节点维护提交
|
||||
const maintenanceOnsubmit = () => {
|
||||
for (let i = 0; i < bind.value.length; i++) {
|
||||
if (bind.value[i][0] == maintenanceData.upNode) {
|
||||
for (let j = 0; j < bind.value.length; j++) {
|
||||
if (bind.value[j][1] == maintenanceData.downNode) {
|
||||
ElMessage({
|
||||
type: 'warning',
|
||||
message: '上下节点无法选择相同母线!!!'
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if(maintenanceData.downNode == '' || maintenanceData.upNode == '') {
|
||||
ElMessage({
|
||||
type: 'warning',
|
||||
message: '请确保上下节点各自选择一个母线!'
|
||||
})
|
||||
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) => {
|
||||
if (res.code == 'A0000') {
|
||||
ElMessage({
|
||||
|
||||
@@ -53,12 +53,12 @@
|
||||
</el-col>
|
||||
<el-col :span="14">
|
||||
<div class="box">
|
||||
<el-form :model="form" label-width="100px" ref="ruleFormRef">
|
||||
<el-form-item label="名称:">
|
||||
<el-form :model="form" label-width="100px" ref="ruleFormRef" :rules="rules">
|
||||
<el-form-item label="名称:" prop="tpName">
|
||||
<el-input v-model="form.tpName" placeholder="请输入" maxlength="32" show-word-limit clearable></el-input>
|
||||
</el-form-item>
|
||||
<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 class="mt20 ml20">
|
||||
<el-button @click="dialogFormVisible = false">取消</el-button>
|
||||
@@ -122,13 +122,8 @@ const menuTree = ref()
|
||||
const TableHeaderRef = ref()
|
||||
|
||||
const rules = reactive({
|
||||
name: [{ 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' }]
|
||||
tpName: [{ required: true, message: '名称不可为空', trigger: 'blur' }],
|
||||
|
||||
})
|
||||
|
||||
const dialogFormVisible = ref(false)
|
||||
|
||||
@@ -400,13 +400,12 @@ import { uploadFile } from '@/api/system-boot/file'
|
||||
import {
|
||||
submitFormData,
|
||||
getById,
|
||||
updateFormData,
|
||||
addEditor,
|
||||
resend,
|
||||
getByDeptDevLine
|
||||
} from '@/api/supervision-boot/interfere/index'
|
||||
getByDeptDevLine,
|
||||
getUserReportUpdateById
|
||||
} from '@/api/device-boot/sensitiveLoadMange'
|
||||
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'
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
@@ -1,217 +1,225 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<div v-if="detailLoading" class="loading">
|
||||
<div v-if="detailLoading" class="loading">
|
||||
<el-spin description="加载中..." />
|
||||
</div>
|
||||
<div v-else>
|
||||
<el-descriptions :column="2" border>
|
||||
<el-descriptions-item label="所在地市">
|
||||
{{ detailData.city }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="项目名称">
|
||||
{{ detailData.projectName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="工程预期投产日期">
|
||||
{{ formatDate(detailData.expectedProductionDate, 'YYYY-MM-DD') }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="经纬度">
|
||||
{{ detailData.longitude }} {{ detailData.latitude }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="用户性质">
|
||||
{{
|
||||
userTypeList.find(item => {
|
||||
return item.value == detailData.userType
|
||||
})?.label
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions :column="2" border label-width="200px">
|
||||
<el-descriptions-item label="所在地市">
|
||||
{{ detailData.city }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="项目名称">
|
||||
{{ detailData.projectName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="工程预期投产日期">
|
||||
{{ formatDate(detailData.expectedProductionDate, 'YYYY-MM-DD') }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="经纬度">
|
||||
{{ detailData.longitude }} {{ detailData.latitude }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="用户性质">
|
||||
{{
|
||||
userTypeList.find(item => {
|
||||
return item.value == detailData.userType
|
||||
})?.label
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="归口管理部门">
|
||||
{{ detailData.responsibleDepartment }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="用户状态">
|
||||
{{
|
||||
userStateList.find(item => {
|
||||
return item.value == detailData.userStatus
|
||||
})?.label
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="厂站名称">
|
||||
{{ detailData.substation }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="归口管理部门">
|
||||
{{ detailData.responsibleDepartment }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="用户状态">
|
||||
{{
|
||||
userStateList.find(item => {
|
||||
return item.value == detailData.userStatus
|
||||
})?.label
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="厂站名称">
|
||||
{{ detailData.substation }}
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="电压等级">
|
||||
{{
|
||||
voltageLevelList.find(item => {
|
||||
return item.id == detailData.voltageLevel
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="非线性终端类型" v-if="detailData.userType == 0 || detailData.userType == 1">
|
||||
{{ proviteData.nonlinearDeviceType ? proviteData.nonlinearDeviceType : '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="预测评估单位">
|
||||
{{ detailData.evaluationDept }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="预测评估结论" :span="2">
|
||||
{{ detailData.evaluationConclusion }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
:label="
|
||||
detailData.userType == '4' || detailData.userType == '5' ? '非线性设备类型: ' : '非线性负荷类型:'
|
||||
"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
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
|
||||
<el-descriptions-item label="电压等级">
|
||||
{{
|
||||
voltageLevelList.find(item => {
|
||||
return item.id == detailData.voltageLevel
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="非线性终端类型"
|
||||
v-if="detailData.userType == 0 || detailData.userType == 1"
|
||||
>
|
||||
{{ proviteData.nonlinearDeviceType ? proviteData.nonlinearDeviceType : '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="预测评估单位">
|
||||
{{ detailData.evaluationDept }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="预测评估结论" :span="2">
|
||||
{{ detailData.evaluationConclusion }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
:label="
|
||||
detailData.userType == '4' || detailData.userType == '5'
|
||||
? '非线性设备类型: '
|
||||
: '非线性负荷类型:'
|
||||
"
|
||||
v-if="
|
||||
detailData.userType == 2 ||
|
||||
detailData.userType == 3 ||
|
||||
detailData.userType == 4 ||
|
||||
detailData.userType == 5
|
||||
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
|
||||
{{ 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="
|
||||
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="
|
||||
detailData.userType == 2 ||
|
||||
detailData.userType == 3 ||
|
||||
detailData.userType == 4 ||
|
||||
detailData.userType == 5
|
||||
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="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData.pccEquipmentCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="基准短路容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData.baseShortCircuitCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="系统最小短路容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData?.minShortCircuitCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="用户用电协议容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData?.userAgreementCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点" v-if="detailData.userType != 0 && detailData.userType != 1">
|
||||
{{ proviteData?.pccPoint }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="评估类型" v-if="detailData.userType != 0 && detailData.userType != 1">
|
||||
{{
|
||||
evaluationTypeList.find(item => {
|
||||
return item.id == proviteData?.evaluationType
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="预测评估评审单位" v-if="detailData.userType != 0 && detailData.userType != 1">
|
||||
{{ proviteData?.evaluationChekDept }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="行业" v-if="detailData.userType == 6">
|
||||
{{
|
||||
industryList.find(item => {
|
||||
return item.id == proviteData.industry
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="敏感终端名称" v-if="detailData.userType == 6">
|
||||
{{ proviteData.deviceName }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="供电电源数量" v-if="detailData.userType == 6">-->
|
||||
<!-- {{ 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>
|
||||
{{ proviteData.pccEquipmentCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="基准短路容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData.baseShortCircuitCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="系统最小短路容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData?.minShortCircuitCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="用户用电协议容量(MVA)"
|
||||
v-if="
|
||||
detailData.userType == '2' ||
|
||||
detailData.userType == '3' ||
|
||||
detailData.userType == '4' ||
|
||||
detailData.userType == '5'
|
||||
"
|
||||
>
|
||||
{{ proviteData?.userAgreementCapacity }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点" v-if="detailData.userType != 0 && detailData.userType != 1">
|
||||
{{ proviteData?.pccPoint }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="评估类型" v-if="detailData.userType != 0 && detailData.userType != 1">
|
||||
{{
|
||||
evaluationTypeList.find(item => {
|
||||
return item.id == proviteData?.evaluationType
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="预测评估评审单位"
|
||||
v-if="detailData.userType != 0 && detailData.userType != 1"
|
||||
>
|
||||
{{ proviteData?.evaluationChekDept }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="行业" v-if="detailData.userType == 6">
|
||||
{{
|
||||
industryList.find(item => {
|
||||
return item.id == proviteData.industry
|
||||
})?.name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="敏感终端名称" v-if="detailData.userType == 6">
|
||||
{{ proviteData.deviceName }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="供电电源数量" v-if="detailData.userType == 6">-->
|
||||
<!-- {{ 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>
|
||||
</template>
|
||||
@@ -220,14 +228,13 @@ import { onMounted, ref, reactive, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { formatDate } from '@/utils/formatTime'
|
||||
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 { useDictData } from '@/stores/dictData'
|
||||
import { getFileNameAndFilePath } from '@/api/system-boot/file'
|
||||
import { Link, View } from '@element-plus/icons-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' })
|
||||
|
||||
const { query } = useRoute() // 查询参数
|
||||
@@ -340,9 +347,9 @@ const getInfo = async () => {
|
||||
getProviteData()
|
||||
})
|
||||
} else {
|
||||
await getUserReportById(props.id || queryId).then(res => {
|
||||
await getById({ id: props.id || queryId }).then(res => {
|
||||
detailData.value = res.data
|
||||
|
||||
|
||||
getProviteData()
|
||||
})
|
||||
}
|
||||
@@ -385,7 +392,6 @@ const preview = (val: any, url: any) => {
|
||||
}
|
||||
//预测评估报告
|
||||
if (val == 'predictionEvaluationReport') {
|
||||
|
||||
predictionEvaluationReportRef?.value.open(url)
|
||||
}
|
||||
//预测评估评审意见报告
|
||||
@@ -416,11 +422,11 @@ const preview = (val: any, url: any) => {
|
||||
}
|
||||
|
||||
const queryFiles = () => {
|
||||
getFileById({ id: props.id }).then(res => {
|
||||
res.data.forEach((item: any) => {
|
||||
if (item.url.length > 0) getFileNamePaths(item.url, item.name)
|
||||
})
|
||||
})
|
||||
// getFileById({ id: props.id }).then(res => {
|
||||
// res.data.forEach((item: any) => {
|
||||
// if (item.url.length > 0) getFileNamePaths(item.url, item.name)
|
||||
// })
|
||||
// })
|
||||
}
|
||||
//判断userType选择取用的对象
|
||||
const getProviteData = async () => {
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
</TableHeader>
|
||||
<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>
|
||||
</el-dialog>
|
||||
<!-- 批量导入 -->
|
||||
<sensitive-user-popup ref="sensitiveUserPopup" />
|
||||
<!-- 批量导入
|
||||
<sensitive-user-popup ref="sensitiveUserPopup" /> -->
|
||||
|
||||
<!-- 查看详情 detail 新增/修改 create-->
|
||||
<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 DetailInfo from './components/detail.vue'
|
||||
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 dictData = useDictData()
|
||||
const sensitiveUserPopup = ref()
|
||||
@@ -73,7 +73,7 @@ defineOptions({
|
||||
//获取登陆用户姓名和部门
|
||||
const adminInfo = useAdminInfo()
|
||||
const tableStore = new TableStore({
|
||||
url: '/supervision-boot/userReport/getUserLedgerPage',
|
||||
url: '/device-boot/userReport/getUserLedgerPage',
|
||||
// publicHeight: 65,
|
||||
method: 'POST',
|
||||
column: [
|
||||
|
||||
@@ -129,14 +129,22 @@ const tableStore = new TableStore({
|
||||
{ field: 'subName', title: '变电站', minWidth: '150' },
|
||||
{ field: 'ip', title: '网络参数' ,width:'120px' },
|
||||
{ field: 'scale', title: '电压等级', minWidth: '110' },
|
||||
// {
|
||||
// field: 'advanceType',
|
||||
// title: '触发类型',
|
||||
// minWidth: '90',
|
||||
// formatter: (row: any) => {
|
||||
// return row.cellValue || '其他'
|
||||
// }
|
||||
// },
|
||||
{
|
||||
field: 'advanceType',
|
||||
title: '暂降类型',
|
||||
minWidth: '90',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '其他'
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'eventType',
|
||||
title: '触发类型',
|
||||
minWidth: '120',
|
||||
formatter: (row: any) => {
|
||||
return eventList.filter(item => item.id === row.cellValue)[0]?.name
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'advanceReason',
|
||||
title: '暂降原因',
|
||||
@@ -145,14 +153,7 @@ const tableStore = new TableStore({
|
||||
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) => {
|
||||
// return row.cellValue.toFixed(2)
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
:value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="关键字筛选:">
|
||||
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template #operation>
|
||||
<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]
|
||||
},
|
||||
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
|
||||
|
||||
chartsRef.value && chartsRef.value.getTableStoreParams(tableStore.table.params)
|
||||
@@ -305,6 +308,7 @@ const tableStore = new TableStore({
|
||||
|
||||
tableStore.table.params.deptIndex = ''
|
||||
tableStore.table.params.filterName = ''
|
||||
tableStore.table.params.searchValue = ''
|
||||
tableStore.table.params.statisticalType = []
|
||||
tableStore.table.params.scale = []
|
||||
tableStore.table.params.manufacturer = []
|
||||
@@ -339,6 +343,78 @@ const tree2List = (list: any, id?: string) => {
|
||||
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) => {
|
||||
return date > new Date() // 如果日期大于当前日期,则禁用
|
||||
@@ -351,7 +427,9 @@ const makeUp = () => {
|
||||
tableRef.value
|
||||
.getRef()
|
||||
.getCheckboxRecords()
|
||||
.find((item: any) => item.level == '6') || []
|
||||
.filter((item: any) => item.level == '6') || []
|
||||
|
||||
|
||||
|
||||
if (list.length == 0) {
|
||||
return ElMessage({
|
||||
@@ -359,6 +437,16 @@ const makeUp = () => {
|
||||
type: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
// 检查是否有 comFlag 等于 0 的项
|
||||
const hasOfflineDevice = list.some((item: any) => item.comFlag === 0)
|
||||
|
||||
if (hasOfflineDevice) {
|
||||
return ElMessage({
|
||||
message: '请选择在线监测点进行补招',
|
||||
type: 'warning'
|
||||
})
|
||||
}
|
||||
timeData.value = []
|
||||
timePopUp.value = true
|
||||
}
|
||||
|
||||
@@ -102,6 +102,13 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="关键字筛选:">
|
||||
<el-input
|
||||
v-model="tableStore.table.params.searchValue"
|
||||
clearable
|
||||
placeholder="请输入关键字"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</TableHeader>
|
||||
</div>
|
||||
@@ -132,7 +139,6 @@ import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import charts from './components/charts.vue'
|
||||
|
||||
|
||||
defineOptions({
|
||||
name: 'device-boot/getOnlineRateData'
|
||||
})
|
||||
@@ -153,7 +159,6 @@ const treeData = ref([])
|
||||
const idArr = ref([])
|
||||
const activeName = ref(0)
|
||||
const getTreeData = async () => {
|
||||
|
||||
await getAreaDept().then(res => {
|
||||
var data = res.data
|
||||
data.forEach(element => {
|
||||
@@ -205,7 +210,8 @@ const tableStore = new TableStore({
|
||||
{
|
||||
title: '网络参数',
|
||||
field: 'ip',
|
||||
align: 'center' ,width:'120px',
|
||||
align: 'center',
|
||||
width: '120px',
|
||||
formatter: function (row) {
|
||||
return row.cellValue ? row.cellValue : '/'
|
||||
}
|
||||
@@ -257,7 +263,7 @@ const tableStore = new TableStore({
|
||||
formatter: function (row) {
|
||||
return row.cellValue == 3.14159 ? '暂无数据' : row.cellValue.toFixed(2)
|
||||
}
|
||||
},
|
||||
}
|
||||
// {
|
||||
// title: '评估',
|
||||
// field: 'valueOver',
|
||||
@@ -299,23 +305,26 @@ const tableStore = new TableStore({
|
||||
// let treeData = []
|
||||
// treeData = tree2List(tableStore.table.data)
|
||||
// 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)
|
||||
setTimeout(() => {
|
||||
activeName.value == 0 && tableRef.value && tableRef.value.getRef().setAllTreeExpand(true)
|
||||
}, 0)
|
||||
},
|
||||
resetCallback: () => {
|
||||
resetCallback: () => {
|
||||
// 重置表单数据到默认值
|
||||
formData.value.statisticalType = classificationData[0]
|
||||
formData.value.deptIndex = treeData.value[0]?.id
|
||||
formData.value.scale = voltageleveloption
|
||||
formData.value.manufacturer = terminaloption
|
||||
formData.value.loadType = interfereoption
|
||||
formData.value.loadType = interfereoption
|
||||
}
|
||||
})
|
||||
|
||||
tableStore.table.params.searchValue = ''
|
||||
tableStore.table.params.deptIndex = ''
|
||||
tableStore.table.params.statisticalType = []
|
||||
tableStore.table.params.scale = []
|
||||
@@ -342,7 +351,73 @@ const tree2List = (list: any, id?: string) => {
|
||||
})
|
||||
// 返回结果数组
|
||||
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(() => {})
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<TableHeader :showReset="false" ref="TableHeaderRef">
|
||||
<template #select>
|
||||
<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>
|
||||
</template>
|
||||
<template #operation>
|
||||
|
||||
@@ -613,7 +613,7 @@ onMounted(() => {
|
||||
.harmonicButton {
|
||||
height: 42px;
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
:deep(.el-tabs__content) {
|
||||
|
||||
@@ -158,7 +158,7 @@ onMounted(() => {
|
||||
<style lang="scss" scoped>
|
||||
.title {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
></DatePicker>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-slot:operation></template>
|
||||
<template v-slot:operation>
|
||||
<el-button type="primary" icon="el-icon-Download" @click="exportTemplate">导出</el-button>
|
||||
</template>
|
||||
</TableHeader>
|
||||
|
||||
<GridLayout
|
||||
@@ -68,9 +70,12 @@ import { useRouter, useRoute } from 'vue-router'
|
||||
import { View } from '@element-plus/icons-vue'
|
||||
import { useTimeCacheStore } from '@/stores/timeCache'
|
||||
import { adminBaseRoutePath } from '@/router/static'
|
||||
import { useAdminInfo } from '@/stores/adminInfo'
|
||||
import { dataVerifyExcel } from '@/api/device-boot/line'
|
||||
const { push } = useRouter()
|
||||
const datePickerRef = ref()
|
||||
const router = useRouter()
|
||||
const adminInfo = useAdminInfo()
|
||||
const route = useRoute()
|
||||
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(() => {
|
||||
initRowHeight()
|
||||
|
||||
@@ -665,7 +665,7 @@ const initEcharts = (color: string, key: number, name: string) => {
|
||||
startAngle: key == 0 ? 180 : 90,
|
||||
endAngle: key == 0 ? 90 : 0,
|
||||
min: 0,
|
||||
max: key == 0 ? 12 : 400,
|
||||
max: key == 0 ? 12 : 200,
|
||||
radius: '180%',
|
||||
center: key == 0 ? ['70%', '95%'] : ['30%', '95%'],
|
||||
splitNumber: 2, //刻度数量
|
||||
@@ -744,6 +744,7 @@ const initEcharts = (color: string, key: number, name: string) => {
|
||||
}
|
||||
//渲染echarts
|
||||
const init = () => {
|
||||
loading.value = true
|
||||
const url = localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/'
|
||||
echartsDataV1.value = initEcharts('#DAA520', 0, 'A相')
|
||||
echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相')
|
||||
@@ -758,6 +759,7 @@ const init = () => {
|
||||
return
|
||||
}
|
||||
if (monitoringPoint.state.comFlag == 0) {
|
||||
loading.value = false
|
||||
return ElMessage({
|
||||
message: '所选监测点离线!',
|
||||
type: 'warning'
|
||||
@@ -826,7 +828,7 @@ const init = () => {
|
||||
]
|
||||
spectrumRef.value?.init(data)
|
||||
trendRef.value?.init(data)
|
||||
|
||||
loading.value = false
|
||||
// console.log('🚀 ~ dataSocket.socketServe.registerCallBack ~ webMsgSend.value:', data)
|
||||
setRealData()
|
||||
})
|
||||
@@ -866,6 +868,22 @@ const setRealData = () => {
|
||||
// webMsgSend.value[0].vRmsB == 0 ? 1 : Math.ceil(webMsgSend.value[0].vRmsB)
|
||||
// echartsDataV3.value.options.series[0].max =
|
||||
// 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 = [
|
||||
{
|
||||
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)
|
||||
// echartsDataA3.value.options.series[0].max =
|
||||
// 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 = [
|
||||
{
|
||||
name: 'A相',
|
||||
@@ -919,6 +953,7 @@ const setRealData = () => {
|
||||
defineExpose({ setRealData })
|
||||
onMounted(() => {
|
||||
init()
|
||||
|
||||
initRadioCharts()
|
||||
getLineDetail({ id: monitoringPoint.state.lineId }).then(res => {
|
||||
ptName.value = connection.filter(item => item.value == res.data.ptType)[0].code || ''
|
||||
|
||||
@@ -1,357 +1,358 @@
|
||||
<template>
|
||||
<div class="pt50">
|
||||
<el-button class="shutDown" icon="el-icon-Back" @click="emit('shutDown')">返回</el-button>
|
||||
<div class="select">
|
||||
<div class="mr10">谐波次数</div>
|
||||
<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-select>
|
||||
</div>
|
||||
<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">
|
||||
<div>
|
||||
<div class="realtrend_top">
|
||||
<div class="realtrend_table">
|
||||
<div class="thead_left">
|
||||
<p style="font-weight: 700; background-color: #f3f6f9">次数(次)</p>
|
||||
<p>{{ item.groupName }}{{ item.unit ? '(' + item.unit + ')' : '' }}</p>
|
||||
</div>
|
||||
<div class="thead_right">
|
||||
<div
|
||||
class="right_cell"
|
||||
v-for="i in selectValue == '1'
|
||||
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 !== 0)
|
||||
: selectValue == '2'
|
||||
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 == 0)
|
||||
: item.title"
|
||||
:key="index"
|
||||
>
|
||||
<p style="background-color: #f3f6f9">
|
||||
<span>{{ i }}次</span>
|
||||
</p>
|
||||
<p>
|
||||
<span>{{ item.data[`h${i}`] == 0 ? 0 : item.data[`h${i}`] || '/' }}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt10" :style="height">
|
||||
<MyEchart ref="barCharts" :options="tabsList[0].echartsData"></MyEchart>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import MyEchart from '@/components/echarts/MyEchart.vue'
|
||||
import { getOverLimitData } from '@/api/device-boot/communicate'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { useMonitoringPoint } from '@/stores/monitoringPoint'
|
||||
const emit = defineEmits(['shutDown'])
|
||||
const monitoringPoint = useMonitoringPoint()
|
||||
const options = [
|
||||
{
|
||||
value: '3',
|
||||
label: '全部'
|
||||
},
|
||||
|
||||
{
|
||||
value: '1',
|
||||
label: '奇次'
|
||||
},
|
||||
{
|
||||
value: '2',
|
||||
label: '偶次'
|
||||
}
|
||||
]
|
||||
const height = mainHeight(315)
|
||||
const barCharts = ref()
|
||||
const loading = ref(true)
|
||||
const crossTheLine: any = ref({})
|
||||
const tabsList: any = ref([
|
||||
{
|
||||
id: '6d5470f509ca271d7108a86e83bb283f',
|
||||
groupName: '谐波电压含有率',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: '%',
|
||||
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,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
|
||||
],
|
||||
data: {},
|
||||
echartsData: {}
|
||||
},
|
||||
{
|
||||
id: 'ae31115b83f02f03a0d3bd65cb017121',
|
||||
groupName: '间谐波电压含有率',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: '%',
|
||||
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,
|
||||
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: {}
|
||||
},
|
||||
{
|
||||
id: '8dc260f16280184e2b57d26668dc00b1',
|
||||
groupName: '谐波电流幅值',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: 'A',
|
||||
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,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
|
||||
],
|
||||
|
||||
data: {},
|
||||
echartsData: {}
|
||||
}
|
||||
])
|
||||
|
||||
const selectValue = ref('1')
|
||||
const activeName = ref(0)
|
||||
// 点击tab
|
||||
const handleClick = (tab: any, event: any) => {
|
||||
loading.value = true
|
||||
}
|
||||
const init = (row: any) => {
|
||||
let vData: any = {}
|
||||
let iData: any = {}
|
||||
let SvData: any = {}
|
||||
for (let i = 1; i < 50; i++) {
|
||||
vData[`h${i + 1}`] =
|
||||
Math.floor(
|
||||
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) /
|
||||
100
|
||||
iData[`h${i + 1}`] =
|
||||
Math.floor(
|
||||
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
|
||||
|
||||
tabsList.value[0].data = vData
|
||||
tabsList.value[1].data = SvData
|
||||
tabsList.value[2].data = iData
|
||||
|
||||
let xData =
|
||||
selectValue.value == '1'
|
||||
? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 !== 0)
|
||||
: selectValue.value == '2'
|
||||
? 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: {
|
||||
text: tabsList.value[activeName.value].groupName
|
||||
},
|
||||
xAxis: {
|
||||
data: xData.map(num => `${num}次`)
|
||||
},
|
||||
yAxis: {
|
||||
name: tabsList.value[activeName.value].unit // 更新Y轴单位
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: tabsList.value[activeName.value].groupName + '(' + tabsList.value[activeName.value].unit + ')' ,
|
||||
type: 'bar',
|
||||
data: xData.map(num => {
|
||||
return tabsList.value[activeName.value].data[`h${num}`]
|
||||
})
|
||||
},
|
||||
{
|
||||
name: '国标限值(' + tabsList.value[activeName.value].unit + ')', // 更新series名称中的单位
|
||||
type: 'bar',
|
||||
data: xData.map(num => {
|
||||
return (
|
||||
crossTheLine.value[
|
||||
activeName.value == 0
|
||||
? `uharm${num}`
|
||||
: activeName.value == 1
|
||||
? `inuharm${num + 0.5}`
|
||||
: `iharm${num}`
|
||||
] || ''
|
||||
)
|
||||
})
|
||||
}
|
||||
]
|
||||
})
|
||||
loading.value = false
|
||||
}
|
||||
// 设置ecartsData
|
||||
const echarts = (num: number) => {
|
||||
return {
|
||||
title: {
|
||||
text: ''
|
||||
},
|
||||
xAxis: {
|
||||
name: "次数",
|
||||
data: []
|
||||
},
|
||||
yAxis: {name: tabsList.value[num].unit},
|
||||
color: ['#2E8B57', '#DAA520'],
|
||||
options: {
|
||||
series: [
|
||||
{
|
||||
name: tabsList.value[num].groupName,
|
||||
type: 'bar',
|
||||
data: []
|
||||
},
|
||||
{
|
||||
name: '国标限值('+ tabsList.value[num].unit +')',
|
||||
type: 'bar',
|
||||
// label: {
|
||||
// normal: {
|
||||
// position: 'top'
|
||||
// }
|
||||
// },
|
||||
data: []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
tabsList.value[0].echartsData = echarts(0)
|
||||
tabsList.value[1].echartsData = echarts(1)
|
||||
tabsList.value[2].echartsData = echarts(2)
|
||||
console.log(tabsList.value)
|
||||
getOverLimitData({ id: monitoringPoint.state.lineId }).then(res => {
|
||||
crossTheLine.value = res.data
|
||||
})
|
||||
})
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.shutDown {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
}
|
||||
.select {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
.realtrend_top {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.table {
|
||||
flex: 1;
|
||||
// min-height: 80px;
|
||||
cursor: pointer;
|
||||
min-height: 90px;
|
||||
max-height: 170px;
|
||||
border: 1px solid #eee;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
position: relative;
|
||||
|
||||
ul {
|
||||
width: auto;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
|
||||
li {
|
||||
flex: none;
|
||||
width: 100px;
|
||||
line-height: 40px;
|
||||
border: 1px solid #eee;
|
||||
text-align: center;
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
|
||||
ul:nth-child(1) {
|
||||
li {
|
||||
font-weight: 800;
|
||||
background: #f4f6f9;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// .table::-webkit-scrollbar {
|
||||
// display: none;
|
||||
// }
|
||||
|
||||
.realtrend_table {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
max-height: 150px;
|
||||
display: flex;
|
||||
border: 2px solid #eee;
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
|
||||
.thead_left {
|
||||
width: 150px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
line-height: 50px;
|
||||
|
||||
padding-bottom: 5px;
|
||||
|
||||
p {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
border: 1px solid #eee;
|
||||
line-height: 38px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.thead_right {
|
||||
flex: 1;
|
||||
align-items: center;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
display: flex;
|
||||
padding-bottom: 5px;
|
||||
|
||||
.right_cell {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
p {
|
||||
flex: none;
|
||||
min-width: 60px;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
border: 1px solid #eee;
|
||||
line-height: 38px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
p:nth-child(1) {
|
||||
font-weight: 800;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div class="pt50">
|
||||
<el-button class="shutDown" icon="el-icon-Back" @click="emit('shutDown')">返回</el-button>
|
||||
<div class="select">
|
||||
<div class="mr10">谐波次数</div>
|
||||
<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-select>
|
||||
</div>
|
||||
<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">
|
||||
<div>
|
||||
<div class="realtrend_top">
|
||||
<div class="realtrend_table">
|
||||
<div class="thead_left">
|
||||
<p style="font-weight: 700; background-color: #f3f6f9">次数(次)</p>
|
||||
<p>{{ item.groupName }}{{ item.unit ? '(' + item.unit + ')' : '' }}</p>
|
||||
</div>
|
||||
<div class="thead_right">
|
||||
<div
|
||||
class="right_cell"
|
||||
v-for="i in selectValue == '1'
|
||||
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 !== 0)
|
||||
: selectValue == '2'
|
||||
? item.title.filter(num => (activeName == 1 ? num - 0.5 : num) % 2 == 0)
|
||||
: item.title"
|
||||
:key="index"
|
||||
>
|
||||
<p style="background-color: #f3f6f9">
|
||||
<span>{{ i }}次</span>
|
||||
</p>
|
||||
<p>
|
||||
<span>{{ item.data[`h${i}`] == 0 ? 0 : item.data[`h${i}`] || '/' }}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt10" :style="height">
|
||||
<MyEchart ref="barCharts" :options="tabsList[0].echartsData"></MyEchart>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import MyEchart from '@/components/echarts/MyEchart.vue'
|
||||
import { getOverLimitData } from '@/api/device-boot/communicate'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { useMonitoringPoint } from '@/stores/monitoringPoint'
|
||||
const emit = defineEmits(['shutDown'])
|
||||
const monitoringPoint = useMonitoringPoint()
|
||||
const options = [
|
||||
{
|
||||
value: '3',
|
||||
label: '全部'
|
||||
},
|
||||
|
||||
{
|
||||
value: '1',
|
||||
label: '奇次'
|
||||
},
|
||||
{
|
||||
value: '2',
|
||||
label: '偶次'
|
||||
}
|
||||
]
|
||||
const height = mainHeight(315)
|
||||
const barCharts = ref()
|
||||
const loading = ref(true)
|
||||
const crossTheLine: any = ref({})
|
||||
const tabsList: any = ref([
|
||||
{
|
||||
id: '6d5470f509ca271d7108a86e83bb283f',
|
||||
groupName: '谐波电压含有率',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: '%',
|
||||
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,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
|
||||
],
|
||||
data: {},
|
||||
echartsData: {}
|
||||
},
|
||||
{
|
||||
id: 'ae31115b83f02f03a0d3bd65cb017121',
|
||||
groupName: '间谐波电压含有率',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: '%',
|
||||
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,
|
||||
// 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: {}
|
||||
},
|
||||
{
|
||||
id: '8dc260f16280184e2b57d26668dc00b1',
|
||||
groupName: '谐波电流幅值',
|
||||
thdDataVOS: null,
|
||||
thdDataTdVODatas: null,
|
||||
unit: 'A',
|
||||
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,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
|
||||
],
|
||||
|
||||
data: {},
|
||||
echartsData: {}
|
||||
}
|
||||
])
|
||||
|
||||
const selectValue = ref('1')
|
||||
const activeName = ref(0)
|
||||
// 点击tab
|
||||
const handleClick = (tab: any, event: any) => {
|
||||
loading.value = true
|
||||
}
|
||||
const init = (row: any) => {
|
||||
let vData: any = {}
|
||||
let iData: any = {}
|
||||
let SvData: any = {}
|
||||
for (let i = 1; i < 50; i++) {
|
||||
vData[`h${i + 1}`] =
|
||||
Math.floor(
|
||||
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) /
|
||||
100
|
||||
iData[`h${i + 1}`] =
|
||||
Math.floor(
|
||||
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
|
||||
|
||||
tabsList.value[0].data = vData
|
||||
tabsList.value[1].data = SvData
|
||||
tabsList.value[2].data = iData
|
||||
|
||||
let xData =
|
||||
selectValue.value == '1'
|
||||
? tabsList.value[activeName.value].title.filter(num => (activeName.value == 1 ? num - 0.5 : num) % 2 !== 0)
|
||||
: selectValue.value == '2'
|
||||
? 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: {
|
||||
text: tabsList.value[activeName.value].groupName
|
||||
},
|
||||
xAxis: {
|
||||
data: xData.map(num => `${num}次`)
|
||||
},
|
||||
yAxis: {
|
||||
name: tabsList.value[activeName.value].unit // 更新Y轴单位
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: tabsList.value[activeName.value].groupName + '(' + tabsList.value[activeName.value].unit + ')' ,
|
||||
type: 'bar',
|
||||
data: xData.map(num => {
|
||||
return tabsList.value[activeName.value].data[`h${num}`]
|
||||
})
|
||||
},
|
||||
{
|
||||
name: '国标限值(' + tabsList.value[activeName.value].unit + ')', // 更新series名称中的单位
|
||||
type: 'bar',
|
||||
data: xData.map(num => {
|
||||
return (
|
||||
crossTheLine.value[
|
||||
activeName.value == 0
|
||||
? `uharm${num}`
|
||||
: activeName.value == 1
|
||||
? `inuharm${num + 0.5}`
|
||||
: `iharm${num}`
|
||||
] || ''
|
||||
)
|
||||
})
|
||||
}
|
||||
]
|
||||
})
|
||||
loading.value = false
|
||||
}
|
||||
// 设置ecartsData
|
||||
const echarts = (num: number) => {
|
||||
return {
|
||||
title: {
|
||||
text: ''
|
||||
},
|
||||
xAxis: {
|
||||
name: "次数",
|
||||
data: []
|
||||
},
|
||||
yAxis: {name: tabsList.value[num].unit},
|
||||
color: ['#2E8B57', '#DAA520'],
|
||||
options: {
|
||||
series: [
|
||||
{
|
||||
name: tabsList.value[num].groupName,
|
||||
type: 'bar',
|
||||
data: []
|
||||
},
|
||||
{
|
||||
name: '国标限值('+ tabsList.value[num].unit +')',
|
||||
type: 'bar',
|
||||
// label: {
|
||||
// normal: {
|
||||
// position: 'top'
|
||||
// }
|
||||
// },
|
||||
data: []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
tabsList.value[0].echartsData = echarts(0)
|
||||
tabsList.value[1].echartsData = echarts(1)
|
||||
tabsList.value[2].echartsData = echarts(2)
|
||||
console.log(tabsList.value)
|
||||
getOverLimitData({ id: monitoringPoint.state.lineId }).then(res => {
|
||||
crossTheLine.value = res.data
|
||||
})
|
||||
})
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.shutDown {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
}
|
||||
.select {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
.realtrend_top {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.table {
|
||||
flex: 1;
|
||||
// min-height: 80px;
|
||||
cursor: pointer;
|
||||
min-height: 90px;
|
||||
max-height: 170px;
|
||||
border: 1px solid #eee;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
position: relative;
|
||||
|
||||
ul {
|
||||
width: auto;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
|
||||
li {
|
||||
flex: none;
|
||||
width: 100px;
|
||||
line-height: 40px;
|
||||
border: 1px solid #eee;
|
||||
text-align: center;
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
|
||||
ul:nth-child(1) {
|
||||
li {
|
||||
font-weight: 800;
|
||||
background: #f4f6f9;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// .table::-webkit-scrollbar {
|
||||
// display: none;
|
||||
// }
|
||||
|
||||
.realtrend_table {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
max-height: 150px;
|
||||
display: flex;
|
||||
border: 2px solid #eee;
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
|
||||
.thead_left {
|
||||
width: 150px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
line-height: 50px;
|
||||
|
||||
padding-bottom: 5px;
|
||||
|
||||
p {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
border: 1px solid #eee;
|
||||
line-height: 38px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.thead_right {
|
||||
flex: 1;
|
||||
align-items: center;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
display: flex;
|
||||
padding-bottom: 5px;
|
||||
|
||||
.right_cell {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
p {
|
||||
flex: none;
|
||||
min-width: 60px;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
border: 1px solid #eee;
|
||||
line-height: 38px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
p:nth-child(1) {
|
||||
font-weight: 800;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -103,7 +103,11 @@ const init = () => {
|
||||
)
|
||||
}
|
||||
options.value = {
|
||||
title: {
|
||||
text: formData.harmState == 0 ? '谐波电压频谱' : '谐波电流频谱'
|
||||
},
|
||||
xAxis: {
|
||||
|
||||
name: '次数',
|
||||
type: 'category',
|
||||
data: Array.from({ length: 49 }, (_, i) => `${i + 2}次`)
|
||||
|
||||
@@ -35,8 +35,8 @@ defineOptions({
|
||||
name: 'harmonic-boot/reate/word'
|
||||
})
|
||||
const dictData = useDictData()
|
||||
//区域联级选择
|
||||
const industry = dictData.getBasicData('Interference_Source')
|
||||
//行业类型选择
|
||||
const industry = dictData.getBasicData('Business_Type')
|
||||
//用户信息弹出框
|
||||
const tableRef = ref()
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ const tableStore = new TableStore({
|
||||
item.data[k.r][k.c].v ? (item.data[k.r][k.c] = k.v) : ''
|
||||
})
|
||||
})
|
||||
console.log(tableStore.table.data)
|
||||
|
||||
setTimeout(() => {
|
||||
luckysheet.create({
|
||||
container: 'luckysheet',
|
||||
@@ -129,6 +129,13 @@ const tableStore = new TableStore({
|
||||
data: tableStore.table.data
|
||||
})
|
||||
}, 10)
|
||||
},
|
||||
resetCallback: () => {
|
||||
// 重置模板策略为第一个选项
|
||||
if (templatePolicy.value && templatePolicy.value.length > 0) {
|
||||
Template.value = templatePolicy.value[0]
|
||||
reportForm.value = templatePolicy.value[0]?.reportForm
|
||||
}
|
||||
}
|
||||
})
|
||||
const loading = ref(false)
|
||||
@@ -154,7 +161,7 @@ const changetype = (val: any) => {
|
||||
reportForm.value = val.reportForm
|
||||
}
|
||||
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) {
|
||||
setTimeout(() => {
|
||||
luckysheet && luckysheet?.resize()
|
||||
@@ -165,6 +172,13 @@ const selectChange = () => {
|
||||
const handleNodeClick = (data: any, node: any) => {
|
||||
if (data.level == 6) {
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ const exportEvent = () => {
|
||||
form.append('type', '0')
|
||||
form.append('startTime', TableHeaderRef.value.datePickerRef.timeValue[0])
|
||||
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 || '')
|
||||
// 特殊字符正则表达式
|
||||
const specialCharRegex = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/
|
||||
|
||||
@@ -1,156 +1,276 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
|
||||
<TableHeader area showExport>
|
||||
<TableHeader area ref="TableHeaderRef" showExport>
|
||||
<template #select>
|
||||
<!-- <el-form-item label="统计类型:">
|
||||
<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>
|
||||
<el-form-item label="运行状态">
|
||||
<el-select
|
||||
filterable
|
||||
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-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-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
|
||||
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.manufacturer" filterable 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
|
||||
v-model="tableStore.table.params.manufacturer"
|
||||
filterable
|
||||
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-form-item>
|
||||
<el-form-item label="干扰源类型:">
|
||||
<el-select v-model="tableStore.table.params.loadType" filterable 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
|
||||
v-model="tableStore.table.params.loadType"
|
||||
filterable
|
||||
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-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 #operation>
|
||||
<!-- <el-button icon="el-icon-Download" type="primary">导出</el-button> -->
|
||||
</template>
|
||||
</TableHeader>
|
||||
<Table ref="tableRef" />
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, provide } from 'vue'
|
||||
import { ref, onMounted, provide, nextTick, watch } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
const dictData = useDictData()
|
||||
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')
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
|
||||
const communicationstatus = [
|
||||
{ value: 0, label: "中断" },
|
||||
{ value: 1, label: "正常" },
|
||||
]
|
||||
const terminalstatus = [
|
||||
{ value: 0, label: "投运" },
|
||||
{ value: 1, label: "检修" },
|
||||
{ value: 2, label: "停运" },
|
||||
]
|
||||
const dictData = useDictData()
|
||||
const TableHeaderRef = ref()
|
||||
const areaOptionList = dictData.getBasicData('jibei_area')
|
||||
const interfereoption = dictData.getBasicData('Interference_Source')
|
||||
const terminaloption = dictData.getBasicData('Dev_Manufacturers')
|
||||
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
const tableStore = new TableStore({
|
||||
url: '/device-boot/runManage/getLineLedger',
|
||||
url: '/device-boot/runManage/getLineLedgerComm',
|
||||
method: 'POST',
|
||||
isWebPaging: true,
|
||||
filename: '监测点台账',
|
||||
column: [
|
||||
{
|
||||
field: 'index',
|
||||
title: '序号',
|
||||
width: '80',
|
||||
width: 80,
|
||||
formatter: (row: any) => {
|
||||
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',
|
||||
title: '供电公司',
|
||||
minWidth: 100
|
||||
title: '所属变电站',
|
||||
minWidth: 150
|
||||
},
|
||||
{ field: 'objName', title: '对象名称' , minWidth: 240},
|
||||
{ field: 'lineName', title: '监测点名称' , minWidth: 100},
|
||||
{ field: 'manufacturer', title: '厂家' , minWidth: 100},
|
||||
{ field: 'scale', title: '电压等级' , minWidth: 100},
|
||||
{ field: 'businessType', title: '行业类型' , minWidth: 100},
|
||||
{
|
||||
field: 'objName',
|
||||
title: '监测对象名称',
|
||||
minWidth: 150,
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue ? row.cellValue : '/'
|
||||
}
|
||||
},
|
||||
{ field: 'lineName', title: '监测点名称', minWidth: 130 },
|
||||
{ field: 'scale', title: '监测点电压等级', minWidth: 120 },
|
||||
|
||||
{ field: 'devName', title: '终端名称', minWidth: 80 },
|
||||
{ field: 'ip', title: '网络参数' ,width:'120px'},
|
||||
{ field: 'loadType', title: '干扰源类型', minWidth: 120 },
|
||||
|
||||
// { 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',
|
||||
title: '通讯状态',
|
||||
render: 'tag',
|
||||
minWidth: 100,
|
||||
// effect: 'dark',
|
||||
minWidth: 70,
|
||||
custom: {
|
||||
'正常': 'success',
|
||||
'中断': 'danger',
|
||||
|
||||
},
|
||||
|
||||
正常: 'success',
|
||||
中断: '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: () => {
|
||||
tableStore.table.data.map((item: any) => {
|
||||
item.onlineEvaluate == 3.14159 ? item.onlineEvaluate = '/' : item.onlineEvaluate <= 0.6 ? item.onlineEvaluate = '差' : item.onlineEvaluate <= 0.9 ? item.onlineEvaluate = '良' : item.onlineEvaluate <= 1 ? item.onlineEvaluate = '优' : '/'
|
||||
})
|
||||
beforeSearchFun: () => {
|
||||
tableStore.table.params.serverName = 'harmonic-boot'
|
||||
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.evaluate = ''
|
||||
tableStore.table.params.comFlag = []
|
||||
tableStore.table.params.powerFlag = 2
|
||||
tableStore.table.params.monitorFlag = 2
|
||||
tableStore.table.params.searchValue = ''
|
||||
tableStore.table.params.scale = []
|
||||
tableStore.table.params.manufacturer = []
|
||||
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)
|
||||
onMounted(() => {
|
||||
@@ -159,6 +279,4 @@ onMounted(() => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
@@ -1,32 +1,15 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader area showExport>
|
||||
<TableHeader area ref="TableHeaderRef" showExport>
|
||||
<template #select>
|
||||
<!-- <el-form-item label="统计类型:">
|
||||
<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>
|
||||
</el-select>
|
||||
|
||||
|
||||
</el-form-item> -->
|
||||
<el-form-item label="电压等级:">
|
||||
<el-select
|
||||
v-model="tableStore.table.params.scale"
|
||||
filterable
|
||||
multiple
|
||||
collapse-tags
|
||||
clearable
|
||||
placeholder="请选择电压等级"
|
||||
value-key="id"
|
||||
>
|
||||
<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.manufacturer"
|
||||
@@ -45,6 +28,44 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</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-select
|
||||
v-model="tableStore.table.params.loadType"
|
||||
@@ -63,59 +84,39 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电压等级:">
|
||||
<el-select
|
||||
v-model="tableStore.table.params.scale"
|
||||
filterable
|
||||
multiple
|
||||
collapse-tags
|
||||
clearable
|
||||
placeholder="请选择电压等级"
|
||||
value-key="id"
|
||||
>
|
||||
<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>
|
||||
</TableHeader>
|
||||
<Table ref="tableRef" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, provide } from 'vue'
|
||||
import { ref, onMounted, provide, nextTick } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
const dictData = useDictData()
|
||||
defineOptions({
|
||||
name: 'harmonic-boot/run/terminalmessage'
|
||||
})
|
||||
|
||||
const view = ref(true)
|
||||
const classificationData = dictData.getBasicData('Statistical_Type', ['Report_Type', 'Voltage_Level', 'Load_Type'])
|
||||
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
|
||||
@@ -134,37 +135,41 @@ const terminalstatus = [
|
||||
const tableStore = new TableStore({
|
||||
url: '/device-boot/runManage/getRuntimeData',
|
||||
method: 'POST',
|
||||
isWebPaging: true,
|
||||
column: [
|
||||
{
|
||||
field: 'index',
|
||||
title: '序号',
|
||||
width: '80',
|
||||
width: '70',
|
||||
formatter: (row: any) => {
|
||||
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: 90 },
|
||||
{ field: 'gdName', title: '市公司', minWidth: 110 },
|
||||
{
|
||||
field: 'bdName',
|
||||
title: '供电公司',
|
||||
minWidth: 100
|
||||
title: '变电站',
|
||||
minWidth: 110
|
||||
},
|
||||
{
|
||||
field: 'objName',
|
||||
title: '用户对象',
|
||||
minWidth: 110
|
||||
},
|
||||
{ field: 'manufacturer', title: '厂家', minWidth: 100 },
|
||||
|
||||
{ field: 'devName', title: '终端名称', minWidth: 80 },
|
||||
{ field: 'ip', title: '网络参数' ,width:'120px' },
|
||||
{ field: 'loginTime', title: '投运时间', minWidth: 100 },
|
||||
{ field: 'devName', title: '终端名称', minWidth: 100 },
|
||||
{ field: 'ip', title: '网络参数' ,width:110 },
|
||||
{ field: 'loginTime', title: '投运时间', minWidth: 90 },
|
||||
{ field: 'devType', title: '终端型号', minWidth: 100 },
|
||||
{ field: 'port', title: '端口', minWidth: 100 },
|
||||
{ field: 'updateTime', title: '最新数据', minWidth: 100 },
|
||||
{ field: 'port', title: '端口', minWidth: 60 },
|
||||
{ field: 'updateTime', title: '最新数据', minWidth: 110 },
|
||||
{
|
||||
field: 'runFlag',
|
||||
title: '终端状态',
|
||||
// effect: 'dark',
|
||||
render: 'tag',
|
||||
minWidth: 100,
|
||||
minWidth: 70,
|
||||
custom: {
|
||||
投运: 'success',
|
||||
检修: 'warning',
|
||||
@@ -176,56 +181,45 @@ const tableStore = new TableStore({
|
||||
title: '通讯状态',
|
||||
render: 'tag',
|
||||
// effect: 'dark',
|
||||
minWidth: 100,
|
||||
minWidth: 70,
|
||||
custom: {
|
||||
正常: 'success',
|
||||
中断: 'danger'
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'onlineEvaluate',
|
||||
title: '在线率评价',
|
||||
render: 'tag',
|
||||
// effect: 'dark',
|
||||
minWidth: 100,
|
||||
custom: {
|
||||
'/': 'info',
|
||||
优: 'success',
|
||||
良: 'warning',
|
||||
差: 'danger'
|
||||
}
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
loadCallback: () => {
|
||||
tableStore.table.webPagingData.map((item1: any) => {
|
||||
item1.map((item: any) => {
|
||||
item.onlineEvaluate == 3.14159
|
||||
? (item.onlineEvaluate = '/')
|
||||
: item.onlineEvaluate <= 0.6
|
||||
? (item.onlineEvaluate = '差')
|
||||
: item.onlineEvaluate <= 0.9
|
||||
? (item.onlineEvaluate = '良')
|
||||
: item.onlineEvaluate <= 1
|
||||
? (item.onlineEvaluate = '优')
|
||||
: '/'
|
||||
})
|
||||
})
|
||||
beforeSearchFun: () => {
|
||||
tableStore.table.params.serverName = 'harmonic-boot'
|
||||
tableStore.table.params.statisticalType = {
|
||||
name: '电网拓扑',
|
||||
code: 'Power_Network'
|
||||
}
|
||||
|
||||
|
||||
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.serverName = 'harmonic-boot'
|
||||
tableStore.table.params.comFlag = []
|
||||
tableStore.table.params.runFlag = []
|
||||
tableStore.table.params.evaluate = ''
|
||||
tableStore.table.params.searchValue = ''
|
||||
tableStore.table.params.powerFlag = 2
|
||||
tableStore.table.params.monitorFlag = 2
|
||||
tableStore.table.params.scale = []
|
||||
tableStore.table.params.manufacturer = []
|
||||
tableStore.table.params.loadType = []
|
||||
const wp = ref({})
|
||||
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
onMounted(() => {
|
||||
|
||||
@@ -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 {
|
||||
zjkJSON,
|
||||
lfJSON,
|
||||
@@ -8640,5 +8725,7 @@ export default {
|
||||
铁岭,
|
||||
朝阳,
|
||||
葫芦岛,
|
||||
沈阳
|
||||
沈阳,
|
||||
海口,
|
||||
三亚
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<div class="statistics-box">
|
||||
<MyEChart style="height: 250px" :options="picEChart1" />
|
||||
<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>
|
||||
</div>
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
</div>
|
||||
<div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<baidu-map
|
||||
class="map"
|
||||
:style="height"
|
||||
@@ -329,6 +333,16 @@ const boundaryList: any = ref([
|
||||
orgName: '鞍山',
|
||||
LngLat: [122.808845, 40.840049],
|
||||
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 lineId = ref('')
|
||||
const center = ref({
|
||||
lng: 122.42588,
|
||||
lat: 40.810977
|
||||
lng: 122.42588,
|
||||
lat: 40.810977
|
||||
// lng: 109.5, // 海南经度
|
||||
// lat: 18.5 // 海南纬度
|
||||
})
|
||||
const infoWindowPoint = ref<anyObj>({
|
||||
lng: 0,
|
||||
|
||||
@@ -363,7 +363,7 @@ defineExpose({
|
||||
|
||||
.actionButtons {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.loading-container {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
</el-collapse-item>
|
||||
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
|
||||
<div style="height: 200px">
|
||||
|
||||
<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
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<el-form-item label="用户名称" prop="assessName">
|
||||
<el-input
|
||||
v-model="form.assessName"
|
||||
placeholder="用户名称"
|
||||
placeholder="请输入用户名称"
|
||||
clearable
|
||||
show-word-limit
|
||||
maxlength="32"
|
||||
@@ -127,7 +127,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<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
|
||||
v-for="item in voltageleveloption"
|
||||
:key="item.id"
|
||||
@@ -147,7 +147,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<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
|
||||
v-for="item in voltageleveloption"
|
||||
:key="item.id"
|
||||
@@ -189,7 +189,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="导线类型" prop="linetypeId">
|
||||
<el-select v-model="form.linetypeId" clearable placeholder="请选择变电站">
|
||||
<el-select v-model="form.linetypeId" clearable placeholder="请选择导线类型">
|
||||
<el-option
|
||||
v-for="item in linetypeList"
|
||||
:key="item.linetypeId"
|
||||
@@ -404,7 +404,7 @@ const info = async (id?: string) => {
|
||||
const getUserList = async (e?: any) => {
|
||||
selectUserAssessMentList({ orgId: form.value.deptId, secondAssessmentId: form.value.assessId || '' }).then(res => {
|
||||
userList.value = res.data
|
||||
console.log('🚀 ~ getUserList ~ e:', e)
|
||||
|
||||
if (e) {
|
||||
assessMentId.value = res.data.filter(item => item.secondAssessmentId == form.value.assessId)[0]?.id || ''
|
||||
} else {
|
||||
@@ -454,7 +454,7 @@ onMounted(() => {
|
||||
<style lang="scss" scoped>
|
||||
.actionButtons {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
:deep(.el-collapse-item__header) {
|
||||
// font-family: AlimamaDongFangDaKai;
|
||||
|
||||
@@ -102,7 +102,7 @@ import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
|
||||
import { cableList, batchDel } from '@/api/advance-boot/assess'
|
||||
import { useRouter } from 'vue-router'
|
||||
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'
|
||||
defineOptions({
|
||||
name: 'runManage/addUser'
|
||||
|
||||
@@ -467,6 +467,7 @@ const dictionary = () => {
|
||||
|
||||
}
|
||||
onBeforeMount(async () => {
|
||||
|
||||
await dictionary()
|
||||
info(0) // 变压器参数维护
|
||||
info(1) // 电容器参数维护
|
||||
|
||||
@@ -1,231 +1,231 @@
|
||||
<template>
|
||||
<div :style="height" style="overflow-y: auto" class="pd10">
|
||||
<!-- <MyEChart :options="options" /> -->
|
||||
<div v-for="(item, index) in List">
|
||||
<div class="box" @mouseenter="item.flag = false" @mouseleave="item.flag = true">
|
||||
<div class="div">{{ item.name }} <span>({{ item.count }}台)</span></div>
|
||||
<!-- <el-progress style="flex: 1" :percentage="(item.count / total).toFixed(2) * 100">
|
||||
<span>{{ item.count }}台</span>
|
||||
</el-progress> -->
|
||||
<el-progress style="flex: 1" :percentage="item.score" :color="ratingColor(item.score)">
|
||||
<span v-if="item.flag" :style="`color:${ratingColor(item.score)}`">
|
||||
{{ ratingName(item.score) }}
|
||||
</span>
|
||||
<span v-else :style="`color:${ratingColor(item.score)}`">{{ item.score }}分</span>
|
||||
</el-progress>
|
||||
</div>
|
||||
<el-divider />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import MyEChart from '@/components/echarts/MyEchart.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { areaTerminalStatistic } from '@/api/device-boot/runEvaluate'
|
||||
const height = mainHeight(220, 1.5)
|
||||
const props = defineProps({
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
})
|
||||
const List: any = ref([])
|
||||
const total: any = ref(0)
|
||||
const options = ref({})
|
||||
const format = percentage => percentage + '分'
|
||||
const info = () => {
|
||||
areaTerminalStatistic(props.params).then(res => {
|
||||
total.value = res.data.reduce((sum, item) => sum + Number(item.count), 0)
|
||||
List.value = res.data
|
||||
List.value.forEach(item => {
|
||||
item.flag = true
|
||||
})
|
||||
})
|
||||
// let dataSource = [
|
||||
// { value: '90', name: '张家口' },
|
||||
// { value: '80', name: '廊坊' },
|
||||
// { value: '70', name: '秦皇岛' },
|
||||
// { value: '60', name: '唐山' },
|
||||
// { value: '50', name: '承德' }
|
||||
// ]
|
||||
// options.value = {
|
||||
// grid: {
|
||||
// top: '10'
|
||||
// },
|
||||
// toolbox: {
|
||||
// show: false
|
||||
// },
|
||||
// options: {
|
||||
// yAxis: {
|
||||
// type: 'category',
|
||||
// data: dataSource.map(item => item.name),
|
||||
// // axisLabel: {
|
||||
// // color: '#fff'
|
||||
// // },
|
||||
// splitLine: {
|
||||
// show: false
|
||||
// }
|
||||
// },
|
||||
// xAxis: {
|
||||
// type: 'value',
|
||||
// data: [1, 2, 3, 4],
|
||||
// axisLabel: {
|
||||
// show: true
|
||||
// // textStyle: {
|
||||
// // color: '#FFF'
|
||||
// // },
|
||||
// // formatter: function (value) {
|
||||
|
||||
// // }
|
||||
// },
|
||||
// splitLine: {
|
||||
// show: false
|
||||
// },
|
||||
// axisTick: {
|
||||
// show: false
|
||||
// },
|
||||
// axisLine: {
|
||||
// show: true
|
||||
// }
|
||||
// },
|
||||
// dataZoom: null,
|
||||
// series: [
|
||||
// {
|
||||
// type: 'bar',
|
||||
// itemStyle: {
|
||||
// color: function (params) {
|
||||
// return params.value >= 90
|
||||
// ? '#00b07d'
|
||||
// : params.value >= 80
|
||||
// ? '#2b7fd3'
|
||||
// : params.value >= 70
|
||||
// ? '#ffcc33'
|
||||
// : '#c00'
|
||||
// }
|
||||
// },
|
||||
// markLine: {
|
||||
// silent: false,
|
||||
// symbol: 'circle',
|
||||
// data: [
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 100,
|
||||
// lineStyle: {
|
||||
// color: '#2E8B57'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// formatter: '优质',
|
||||
// color: '#2E8B57'
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 90,
|
||||
// lineStyle: {
|
||||
// color: '#77DA63'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#77DA63',
|
||||
// formatter: '良好'
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 60,
|
||||
// lineStyle: {
|
||||
// color: '#DAA520'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#DAA520',
|
||||
// formatter: '合格'
|
||||
// }
|
||||
// }
|
||||
// ]
|
||||
// },
|
||||
// data: dataSource.map(item => item.value)
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
// }
|
||||
}
|
||||
const ratingColor = (num: number) => {
|
||||
if (num >= 90) {
|
||||
return '#00b07d'
|
||||
} else if (num >= 80) {
|
||||
return '#2b7fd3'
|
||||
} else if (num >= 70) {
|
||||
return '#ff8c00'
|
||||
} else {
|
||||
return '#c00'
|
||||
}
|
||||
}
|
||||
const ratingName = (num: number) => {
|
||||
if (num >= 90) {
|
||||
return '优秀'
|
||||
} else if (num >= 80) {
|
||||
return '良好'
|
||||
} else if (num >= 70) {
|
||||
return '一般'
|
||||
} else {
|
||||
return '较差'
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
// info()
|
||||
})
|
||||
defineExpose({
|
||||
info
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.btnsBox {
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
}
|
||||
::v-deep .el-radio-button__inner {
|
||||
padding: 8px 18px;
|
||||
background: var(--el-color-primary);
|
||||
border: 1px solid #00fff4;
|
||||
border-radius: 0;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
text-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.73);
|
||||
opacity: 0.52;
|
||||
}
|
||||
::v-deep .el-radio-button:last-child .el-radio-button__inner {
|
||||
border-radius: 0;
|
||||
}
|
||||
::v-deep .el-radio-button:first-child .el-radio-button__inner {
|
||||
border-radius: 0;
|
||||
border-left: 1px solid #00fff4;
|
||||
}
|
||||
::v-deep .is-active {
|
||||
border: 1px solid #00fff4;
|
||||
opacity: 1 !important;
|
||||
color: #ffffff;
|
||||
background: var(--el-color-primary);
|
||||
|
||||
.el-radio-button__inner {
|
||||
opacity: 1 !important;
|
||||
border-left: 1px solid #00fff4 !important;
|
||||
}
|
||||
}
|
||||
.box {
|
||||
cursor: pointer;
|
||||
// display: flex;
|
||||
.div {
|
||||
// width: 100px;
|
||||
font-size: 16px;
|
||||
span{
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
:deep(.el-divider--horizontal) {
|
||||
margin: 5px 0;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div :style="height" style="overflow-y: auto" class="pd10">
|
||||
<!-- <MyEChart :options="options" /> -->
|
||||
<div v-for="(item, index) in List">
|
||||
<div class="box" @mouseenter="item.flag = false" @mouseleave="item.flag = true">
|
||||
<div class="div">{{ item.name }} <span>({{ item.count }}台)</span></div>
|
||||
<!-- <el-progress style="flex: 1" :percentage="(item.count / total).toFixed(2) * 100">
|
||||
<span>{{ item.count }}台</span>
|
||||
</el-progress> -->
|
||||
<el-progress style="flex: 1" :percentage="item.score" :color="ratingColor(item.score)">
|
||||
<span v-if="item.flag" :style="`color:${ratingColor(item.score)}`">
|
||||
{{ ratingName(item.score) }}
|
||||
</span>
|
||||
<span v-else :style="`color:${ratingColor(item.score)}`">{{ item.score }}分</span>
|
||||
</el-progress>
|
||||
</div>
|
||||
<el-divider />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import MyEChart from '@/components/echarts/MyEchart.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { areaTerminalStatistic } from '@/api/device-boot/runEvaluate'
|
||||
const height = mainHeight(220, 1.5)
|
||||
const props = defineProps({
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
})
|
||||
const List: any = ref([])
|
||||
const total: any = ref(0)
|
||||
const options = ref({})
|
||||
const format = percentage => percentage + '分'
|
||||
const info = () => {
|
||||
areaTerminalStatistic(props.params).then(res => {
|
||||
total.value = res.data.reduce((sum, item) => sum + Number(item.count), 0)
|
||||
List.value = res.data
|
||||
List.value.forEach(item => {
|
||||
item.flag = true
|
||||
})
|
||||
})
|
||||
// let dataSource = [
|
||||
// { value: '90', name: '张家口' },
|
||||
// { value: '80', name: '廊坊' },
|
||||
// { value: '70', name: '秦皇岛' },
|
||||
// { value: '60', name: '唐山' },
|
||||
// { value: '50', name: '承德' }
|
||||
// ]
|
||||
// options.value = {
|
||||
// grid: {
|
||||
// top: '10'
|
||||
// },
|
||||
// toolbox: {
|
||||
// show: false
|
||||
// },
|
||||
// options: {
|
||||
// yAxis: {
|
||||
// type: 'category',
|
||||
// data: dataSource.map(item => item.name),
|
||||
// // axisLabel: {
|
||||
// // color: '#fff'
|
||||
// // },
|
||||
// splitLine: {
|
||||
// show: false
|
||||
// }
|
||||
// },
|
||||
// xAxis: {
|
||||
// type: 'value',
|
||||
// data: [1, 2, 3, 4],
|
||||
// axisLabel: {
|
||||
// show: true
|
||||
// // textStyle: {
|
||||
// // color: '#FFF'
|
||||
// // },
|
||||
// // formatter: function (value) {
|
||||
|
||||
// // }
|
||||
// },
|
||||
// splitLine: {
|
||||
// show: false
|
||||
// },
|
||||
// axisTick: {
|
||||
// show: false
|
||||
// },
|
||||
// axisLine: {
|
||||
// show: true
|
||||
// }
|
||||
// },
|
||||
// dataZoom: null,
|
||||
// series: [
|
||||
// {
|
||||
// type: 'bar',
|
||||
// itemStyle: {
|
||||
// color: function (params) {
|
||||
// return params.value >= 90
|
||||
// ? '#00b07d'
|
||||
// : params.value >= 80
|
||||
// ? '#2b7fd3'
|
||||
// : params.value >= 70
|
||||
// ? '#ffcc33'
|
||||
// : '#c00'
|
||||
// }
|
||||
// },
|
||||
// markLine: {
|
||||
// silent: false,
|
||||
// symbol: 'circle',
|
||||
// data: [
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 100,
|
||||
// lineStyle: {
|
||||
// color: '#2E8B57'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// formatter: '优质',
|
||||
// color: '#2E8B57'
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 90,
|
||||
// lineStyle: {
|
||||
// color: '#77DA63'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#77DA63',
|
||||
// formatter: '良好'
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// name: '',
|
||||
// yAxis: 60,
|
||||
// lineStyle: {
|
||||
// color: '#DAA520'
|
||||
// },
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#DAA520',
|
||||
// formatter: '合格'
|
||||
// }
|
||||
// }
|
||||
// ]
|
||||
// },
|
||||
// data: dataSource.map(item => item.value)
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
// }
|
||||
}
|
||||
const ratingColor = (num: number) => {
|
||||
if (num >= 90) {
|
||||
return '#00b07d'
|
||||
} else if (num >= 80) {
|
||||
return '#2b7fd3'
|
||||
} else if (num >= 70) {
|
||||
return '#ff8c00'
|
||||
} else {
|
||||
return '#c00'
|
||||
}
|
||||
}
|
||||
const ratingName = (num: number) => {
|
||||
if (num >= 90) {
|
||||
return '优秀'
|
||||
} else if (num >= 80) {
|
||||
return '良好'
|
||||
} else if (num >= 70) {
|
||||
return '一般'
|
||||
} else {
|
||||
return '较差'
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
// info()
|
||||
})
|
||||
defineExpose({
|
||||
info
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.btnsBox {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
::v-deep .el-radio-button__inner {
|
||||
padding: 8px 18px;
|
||||
background: var(--el-color-primary);
|
||||
border: 1px solid #00fff4;
|
||||
border-radius: 0;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
text-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.73);
|
||||
opacity: 0.52;
|
||||
}
|
||||
::v-deep .el-radio-button:last-child .el-radio-button__inner {
|
||||
border-radius: 0;
|
||||
}
|
||||
::v-deep .el-radio-button:first-child .el-radio-button__inner {
|
||||
border-radius: 0;
|
||||
border-left: 1px solid #00fff4;
|
||||
}
|
||||
::v-deep .is-active {
|
||||
border: 1px solid #00fff4;
|
||||
opacity: 1 !important;
|
||||
color: #ffffff;
|
||||
background: var(--el-color-primary);
|
||||
|
||||
.el-radio-button__inner {
|
||||
opacity: 1 !important;
|
||||
border-left: 1px solid #00fff4 !important;
|
||||
}
|
||||
}
|
||||
.box {
|
||||
cursor: pointer;
|
||||
// display: flex;
|
||||
.div {
|
||||
// width: 100px;
|
||||
font-size: 16px;
|
||||
span{
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
:deep(.el-divider--horizontal) {
|
||||
margin: 5px 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -235,7 +235,7 @@ defineExpose({ open })
|
||||
}
|
||||
.form {
|
||||
// display: flex;
|
||||
// justify-content: end;
|
||||
// justify-content: flex-end;
|
||||
// position: relative;
|
||||
// .form_but {
|
||||
|
||||
|
||||
@@ -12,6 +12,16 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</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-input
|
||||
style="width: 200px"
|
||||
@@ -19,7 +29,7 @@
|
||||
v-model="tableStore.table.params.searchValue"
|
||||
clearable
|
||||
maxlength="32"
|
||||
show-word-limit
|
||||
show-word-limit
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -71,6 +81,7 @@ const tableStore = new TableStore({
|
||||
{ field: 'bdName', title: '所属变电站', minWidth: 120 },
|
||||
{ field: 'devName', title: '终端名称', minWidth: 110 },
|
||||
{ field: 'loginTime', title: '投运时间', minWidth: 100 },
|
||||
{ field: 'updateTime', title: '最新数据时间', minWidth: 150 },
|
||||
{
|
||||
field: 'manufacturer',
|
||||
title: '厂家',
|
||||
@@ -79,7 +90,18 @@ const tableStore = new TableStore({
|
||||
{ field: 'devType', title: '终端型号', minWidth: 100 },
|
||||
|
||||
{ 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',
|
||||
title: '运行状态',
|
||||
@@ -125,10 +147,15 @@ const tableStore = new TableStore({
|
||||
if (tableStore.table.params.runF != null) {
|
||||
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.comF = ''
|
||||
tableStore.table.params.runFlag = []
|
||||
tableStore.table.params.searchValue = ''
|
||||
|
||||
@@ -139,6 +166,10 @@ const runFlagList = [
|
||||
{ id: 3, name: '调试' },
|
||||
{ id: 4, name: '退运' }
|
||||
]
|
||||
const comFlagList = [
|
||||
{ name: '正常', id: 1 },
|
||||
{ name: '中断', id: 0 }
|
||||
]
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
onMounted(() => {
|
||||
|
||||
@@ -220,6 +220,23 @@ const tableStore = new TableStore({
|
||||
|
||||
beforeSearchFun: () => {
|
||||
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 = ''
|
||||
|
||||
@@ -169,6 +169,14 @@ const tableStore = new TableStore({
|
||||
|
||||
beforeSearchFun: () => {
|
||||
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 = ''
|
||||
|
||||
@@ -357,6 +357,7 @@ import {
|
||||
import { getAllDeptList } from '@/api/common'
|
||||
import { getTerminalDetailsById } from '@/api/supervision-boot/terminal/index'
|
||||
import { nodeAllList } from '@/api/device-boot/Business'
|
||||
import { getDeviceTypeList } from '@/api/device-boot/modelManage'
|
||||
const emits = defineEmits(['onSubmit'])
|
||||
const dictData = useDictData()
|
||||
const dialogFormVisible = ref(false)
|
||||
@@ -377,7 +378,8 @@ const neutralPointWiringMethodList = dictData.getBasicData('Neutral_Point')
|
||||
//字典获取厂家
|
||||
const manufacturerList = dictData.getBasicData('Dev_Manufacturers')
|
||||
//字典获取终端型号
|
||||
const terminalTypeList = dictData.getBasicData('Dev_Type')
|
||||
//const terminalTypeList = dictData.getBasicData('Dev_Type')
|
||||
const terminalTypeList = ref([])
|
||||
//字典获取数据类型
|
||||
const dataTypeList = [
|
||||
{
|
||||
@@ -432,7 +434,7 @@ const terminalModelList = [
|
||||
const substationList: any = ref([])
|
||||
//字典获取通讯类型
|
||||
const frontTypeList = dictData.getBasicData('Front_Type', ['CLD', '61850'])
|
||||
console.log("🚀 ~ frontTypeList:", frontTypeList)
|
||||
//console.log("🚀 ~ frontTypeList:", frontTypeList)
|
||||
//定义通讯状态下拉框数据
|
||||
const communicationStatusList = [
|
||||
{
|
||||
@@ -539,6 +541,7 @@ const getPowerCompanyList = async (flag: any) => {
|
||||
getAllDeptList().then(res => {
|
||||
powerCompanyList.value = res.data[0].children[0].children
|
||||
if (flag) {
|
||||
|
||||
getSubstationVoltageLevel({
|
||||
orgIds: [
|
||||
powerCompanyList.value.find(
|
||||
@@ -1168,12 +1171,26 @@ const disabledDate = time => {
|
||||
const importType = ref(null)
|
||||
const resendId = ref('')
|
||||
const open = async (row: any) => {
|
||||
console.log('🚀 ~ open ~ row:', row.row)
|
||||
|
||||
let flag = row.row ? true : false
|
||||
importType.value = null
|
||||
if (!flag) await getPowerCompanyList(false)
|
||||
title.value = row.title
|
||||
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) {
|
||||
resendId.value = row.row.id
|
||||
importType.value = row.row.importType
|
||||
|
||||
@@ -384,7 +384,7 @@ const startRunTest = () => {
|
||||
// 下载报告
|
||||
const downloadTheReport = (url: string) => {
|
||||
getFileNameAndFilePath({ filePath: url }).then((res: any) => {
|
||||
console.log(res.data.url, 'res')
|
||||
//console.log(res.data.url, 'res')
|
||||
const link = document.createElement('a')
|
||||
link.href = res.data.url
|
||||
link.download = res.data.name
|
||||
|
||||
@@ -1,23 +1,37 @@
|
||||
<template>
|
||||
<div class="flex">
|
||||
<span style="width: 100px; margin-top: 3px">电压等级:</span>
|
||||
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"
|
||||
style="margin-right: 28px">
|
||||
<el-checkbox
|
||||
:indeterminate="isIndeterminate"
|
||||
v-model="checkAll"
|
||||
@change="handleCheckAllChange"
|
||||
style="margin-right: 28px"
|
||||
>
|
||||
全选
|
||||
</el-checkbox>
|
||||
<el-checkbox-group v-model="checkedVoltage" @change="handleCheckedVoltageChange"
|
||||
style="height: 72px; overflow-y: auto; flex: 1">
|
||||
<el-checkbox-group
|
||||
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-group>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<span style="width: 100px; margin-top: 3px">干扰源类型:</span>
|
||||
<el-checkbox :indeterminate="isIndeterminate1" v-model="checkAll1" @change="handleCheckAllChange1"
|
||||
style="margin-right: 28px">
|
||||
<el-checkbox
|
||||
:indeterminate="isIndeterminate1"
|
||||
v-model="checkAll1"
|
||||
@change="handleCheckAllChange1"
|
||||
style="margin-right: 28px"
|
||||
>
|
||||
全选
|
||||
</el-checkbox>
|
||||
<el-checkbox-group v-model="checkedSource" @change="handleCheckedSourceChange"
|
||||
style="height: 72px; overflow-y: auto; flex: 1">
|
||||
<el-checkbox-group
|
||||
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-group>
|
||||
</div>
|
||||
@@ -28,7 +42,7 @@
|
||||
<el-radio label="F47">F47</el-radio>
|
||||
</el-radio-group>
|
||||
</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-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 { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { ref, reactive } from 'vue'
|
||||
import { Bottom } from '@element-plus/icons-vue/dist/types'
|
||||
const emit = defineEmits(['viewWave'])
|
||||
const dictData = useDictData()
|
||||
const isIndeterminate = ref(false)
|
||||
const isIndeterminate1 = ref(false)
|
||||
@@ -340,7 +354,7 @@ const gongfunction = () => {
|
||||
var index = datalist.value[i].lineId
|
||||
var eventId = datalist.value[i].eventId
|
||||
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) {
|
||||
var line = 0
|
||||
@@ -468,6 +482,10 @@ const gongfunction = () => {
|
||||
}
|
||||
}
|
||||
}
|
||||
const echartClick = (params: any) => {
|
||||
|
||||
emit('viewWave', params.value[8])
|
||||
}
|
||||
|
||||
defineExpose({ checkedVoltage, checkedSource, info })
|
||||
const layout = mainHeight(320) as any
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
import { ref, reactive, defineExpose, computed } from 'vue'
|
||||
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { Console } from 'console'
|
||||
|
||||
const areaData: any = ref([])
|
||||
const levelData: any = ref([])
|
||||
@@ -69,16 +70,23 @@ const tableHeaderLevel = ref<any[]>([
|
||||
const frequency = ref<number>(875)
|
||||
|
||||
const info = (list: any, searchBeginTime: any, searchEndTime: any,selectedAreaName: string) => {
|
||||
|
||||
Time.value = [searchBeginTime, searchEndTime]
|
||||
frequency.value = list.areaStatistics.frequencySum
|
||||
areaName.value = selectedAreaName // 更新区域名称
|
||||
|
||||
let allSarfi9 = 0
|
||||
|
||||
list.areaStatistics.areaCalculation.forEach((item: any) => {
|
||||
allSarfi9 += item.sarfi9
|
||||
})
|
||||
|
||||
areaData.value = [
|
||||
{
|
||||
areaName: '总计',
|
||||
monitoringPoints: list.areaStatistics.monitoringPointSum,
|
||||
frequency: list.areaStatistics.frequencySum,
|
||||
sarfi9: '/'
|
||||
sarfi9: allSarfi9,
|
||||
},
|
||||
...list.areaStatistics.areaCalculation
|
||||
]
|
||||
@@ -91,19 +99,23 @@ const info = (list: any, searchBeginTime: any, searchEndTime: any,selectedAreaNa
|
||||
},
|
||||
...list.voltageStatistics.voltageLevelCalculation
|
||||
]
|
||||
|
||||
|
||||
|
||||
let all = 0
|
||||
|
||||
list.monthlyStatistics.monthCalculation.forEach((item: any) => {
|
||||
all += item.linked + item.notAssociated
|
||||
})
|
||||
|
||||
shareData.value = [
|
||||
{
|
||||
month: '总计',
|
||||
notAssociated: all.toFixed(2)
|
||||
notAssociated: all,
|
||||
},
|
||||
...list.monthlyStatistics.monthCalculation
|
||||
...list.monthlyStatistics.monthCalculation.map((item: any) => ({
|
||||
month: item.month,
|
||||
notAssociated: item.notAssociated + item.linked
|
||||
}))
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<span style="color: red; font-size: 12px">注:触发类型仅统计暂降原因为短路故障事件</span>
|
||||
<span style="color: red; font-size: 12px">注:暂降类型仅统计暂降原因为短路故障事件</span>
|
||||
|
||||
<div class="statistics-main">
|
||||
<template v-if="flag">
|
||||
@@ -17,7 +17,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<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-table>
|
||||
</div>
|
||||
@@ -86,7 +86,7 @@ const info = (res: any) => {
|
||||
}
|
||||
resemble.value = {
|
||||
title: {
|
||||
text: '触发类型'
|
||||
text: '暂降类型'
|
||||
},
|
||||
legend: {
|
||||
type: 'scroll',
|
||||
@@ -109,7 +109,7 @@ const info = (res: any) => {
|
||||
options: {
|
||||
series: [
|
||||
{
|
||||
name: '触发类型',
|
||||
name: '暂降类型',
|
||||
type: 'pie',
|
||||
center: ['50%', '50%'],
|
||||
selectedOffset: 30,
|
||||
|
||||
@@ -22,11 +22,11 @@ const Processing = (list: any) => {
|
||||
let echartsArr: string[] = []
|
||||
list.areaCalculation.forEach((item: any) => {
|
||||
echartsndArr.push(item.areaName)
|
||||
if (item.frequency == 0) {
|
||||
item.frequency = 1.1
|
||||
} else if (item.frequency == 1) {
|
||||
item.frequency = 1.3
|
||||
}
|
||||
// if (item.frequency == 0) {
|
||||
// item.frequency = 1.1
|
||||
// } else if (item.frequency == 1) {
|
||||
// item.frequency = 1.3
|
||||
// }
|
||||
echartsArr.push(item.frequency)
|
||||
})
|
||||
areaStatistics.value = {
|
||||
@@ -48,7 +48,7 @@ const Processing = (list: any) => {
|
||||
return html
|
||||
}
|
||||
},
|
||||
|
||||
color: ['#07CCCA'],
|
||||
legend: {
|
||||
data: ['暂降次数']
|
||||
},
|
||||
@@ -68,7 +68,7 @@ const Processing = (list: any) => {
|
||||
normal: {
|
||||
//这里是颜色
|
||||
color: function (params: any) {
|
||||
if (params.data == 1.1) {
|
||||
if (params.data == 0) {
|
||||
return '#B3B3B3'
|
||||
} else {
|
||||
return '#07CCCA '
|
||||
@@ -90,11 +90,11 @@ const Grade = (list: any) => {
|
||||
let echartsArr: string[] = []
|
||||
list.voltageLevelCalculation.forEach((item: any) => {
|
||||
echartsndArr.push(item.voltageLevel)
|
||||
if (item.frequency == 0) {
|
||||
item.frequency = 1.1
|
||||
} else if (item.frequency == 1) {
|
||||
item.frequency = 1.3
|
||||
}
|
||||
// if (item.frequency == 0) {
|
||||
// item.frequency = 1.1
|
||||
// } else if (item.frequency == 1) {
|
||||
// item.frequency = 1.3
|
||||
// }
|
||||
echartsArr.push(item.frequency)
|
||||
})
|
||||
|
||||
@@ -117,7 +117,7 @@ const Grade = (list: any) => {
|
||||
return html
|
||||
}
|
||||
},
|
||||
|
||||
color: ['#07CCCA'],
|
||||
legend: {
|
||||
data: ['暂降次数']
|
||||
},
|
||||
@@ -137,7 +137,7 @@ const Grade = (list: any) => {
|
||||
normal: {
|
||||
//这里是颜色
|
||||
color: function (params: any) {
|
||||
if (params.data == 1.1) {
|
||||
if (params.data == 0) {
|
||||
return '#B3B3B3'
|
||||
} else {
|
||||
return '#07CCCA '
|
||||
@@ -174,18 +174,21 @@ const Relation = (list: any, interval: number) => {
|
||||
// item.linked = 3.14159;
|
||||
// item.notAssociated = 3.14159;
|
||||
// }
|
||||
if (item.linked == 0) {
|
||||
item.linked = 1.1
|
||||
} else if (item.linked == 1) {
|
||||
item.linked = 1.3
|
||||
}
|
||||
// if (item.linked == 0) {
|
||||
// item.linked = 1.1
|
||||
// } else if (item.linked == 1) {
|
||||
// item.linked = 1.3
|
||||
// }
|
||||
echartsArr.push(item.linked)
|
||||
if (item.notAssociated == 0) {
|
||||
item.notAssociated = 1.1
|
||||
} else if (item.notAssociated == 1) {
|
||||
item.notAssociated = 1.3
|
||||
}
|
||||
echartswArr.push(item.notAssociated)
|
||||
// if (item.notAssociated == 0) {
|
||||
// item.notAssociated = 1.1
|
||||
// } else if (item.notAssociated == 1) {
|
||||
// item.notAssociated = 1.3
|
||||
// }
|
||||
//echartswArr.push(item.notAssociated)
|
||||
const total = item.notAssociated + item.linked
|
||||
echartswArr.push(total)
|
||||
|
||||
})
|
||||
monthlyStatistics.value = {
|
||||
title: {
|
||||
@@ -208,9 +211,11 @@ const Relation = (list: any, interval: number) => {
|
||||
},
|
||||
|
||||
legend: {
|
||||
data: ['未关联暂降次数', '已关联处理事件']
|
||||
data: ['暂降次数']
|
||||
//data: ['未关联暂降次数', '已关联处理事件']
|
||||
},
|
||||
color: ['#07CCCA', '#Ff6600'],
|
||||
color: ['#07CCCA'],
|
||||
//color: ['#07CCCA', '#Ff6600'],
|
||||
xAxis: {
|
||||
name: '月份', // 给X轴加单位
|
||||
data: echartsndArr
|
||||
@@ -221,11 +226,11 @@ const Relation = (list: any, interval: number) => {
|
||||
options: {
|
||||
series: [
|
||||
{
|
||||
name: '未关联暂降次数',
|
||||
name: '暂降次数',
|
||||
type: 'bar',
|
||||
barMaxWidth: 30,
|
||||
barMinHeight: 5,
|
||||
data: echartswArr,
|
||||
data: echartswArr,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
label: {
|
||||
@@ -238,7 +243,7 @@ const Relation = (list: any, interval: number) => {
|
||||
}
|
||||
},
|
||||
color: function (params: any) {
|
||||
if (params.data == 1.1) {
|
||||
if (params.data == 0) {
|
||||
return '#B3B3B3'
|
||||
} else {
|
||||
return '#07CCCA '
|
||||
@@ -247,32 +252,32 @@ const Relation = (list: any, interval: number) => {
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '已关联处理事件',
|
||||
type: 'bar',
|
||||
barMaxWidth: 30,
|
||||
data: echartsArr,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
label: {
|
||||
// show: true, //数字开启显示
|
||||
textStyle: {
|
||||
//数值样式
|
||||
color: '#fff',
|
||||
fontSize: 14,
|
||||
fontWeight: 600
|
||||
}
|
||||
},
|
||||
color: function (params: any) {
|
||||
if (params.data == 1.1) {
|
||||
return '#B3B3B3'
|
||||
} else {
|
||||
return '#Ff6600'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// {
|
||||
// name: '已关联处理事件',
|
||||
// type: 'bar',
|
||||
// barMaxWidth: 30,
|
||||
// data: echartsArr,
|
||||
// itemStyle: {
|
||||
// normal: {
|
||||
// label: {
|
||||
// // show: true, //数字开启显示
|
||||
// textStyle: {
|
||||
// //数值样式
|
||||
// color: '#fff',
|
||||
// fontSize: 14,
|
||||
// fontWeight: 600
|
||||
// }
|
||||
// },
|
||||
// color: function (params: any) {
|
||||
// if (params.data == 0) {
|
||||
// return '#B3B3B3'
|
||||
// } else {
|
||||
// return '#Ff6600'
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -291,3 +296,4 @@ const layout = mainHeight(150) as any
|
||||
display: flex;
|
||||
}
|
||||
</style>
|
||||
>>>>>>> c902dabb73a92b43a23970969d750508558b5400
|
||||
|
||||
@@ -39,6 +39,7 @@ const tableStore = new TableStore({
|
||||
tableStore.table.params.searchEndTime,
|
||||
currentAreaName.value // 传递当前区域名称
|
||||
)
|
||||
console.log('11111',tableStore.table.data)
|
||||
echarts.value.Processing(tableStore.table.data.areaStatistics)
|
||||
echarts.value.Grade(tableStore.table.data.voltageStatistics)
|
||||
echarts.value.Relation(JSON.parse(JSON.stringify(tableStore.table.data.monthlyStatistics)))
|
||||
|
||||
@@ -85,6 +85,7 @@ const eliminate = (name: string) => {
|
||||
|
||||
// 地图数处理
|
||||
const map = (res: any) => {
|
||||
|
||||
echartMapList.value = {
|
||||
name: '',
|
||||
title: {
|
||||
|
||||
@@ -1,98 +1,125 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader date-picker area>
|
||||
<template v-slot:select></template>
|
||||
</TableHeader>
|
||||
<el-tabs v-model="activeName" type="border-card" @tab-change="handleClick" v-loading="tableStore.table.loading">
|
||||
<el-tab-pane label="暂降原因及类型统计" name="1">
|
||||
<TypeStatistics ref="Statistics" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="电压容忍度曲线兼容性统计" name="2">
|
||||
<Compatibility ref="compatibility" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- "area": "",
|
||||
"city": "",
|
||||
"protocolCapacity": 0,
|
||||
"province": "",
|
||||
"region": "",
|
||||
"userName": "",
|
||||
"userType": "",
|
||||
"voltage": "" -->
|
||||
<script setup lang="ts">
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import { onMounted, reactive, ref, provide } from 'vue'
|
||||
import TypeStatistics from '../components/TypeStatistics.vue'
|
||||
import Compatibility from '../components/Compatibility.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
defineOptions({
|
||||
name: 'Region/overview'
|
||||
})
|
||||
const activeName = ref('1')
|
||||
const Statistics = ref()
|
||||
const compatibility = ref()
|
||||
const dictData = useDictData()
|
||||
|
||||
const tableStore = new TableStore({
|
||||
url: '/event-boot/areaAnalysis/getEventReason',
|
||||
method: 'POST',
|
||||
column: [],
|
||||
beforeSearchFun: () => {
|
||||
if (activeName.value == '1') {
|
||||
tableStore.table.params.scale = null
|
||||
tableStore.table.params.loadType = null
|
||||
} else {
|
||||
tableStore.table.params.scale = compatibility.value.checkedVoltage
|
||||
tableStore.table.params.loadType = compatibility.value.checkedSource
|
||||
}
|
||||
},
|
||||
loadCallback: () => {
|
||||
|
||||
|
||||
if (activeName.value == '1') {
|
||||
Statistics.value.info(tableStore.table.data)
|
||||
} else {
|
||||
compatibility.value.info(tableStore.table.data.voltageToleranceCurveDataList)
|
||||
}
|
||||
}
|
||||
})
|
||||
provide('tableStore', tableStore)
|
||||
|
||||
tableStore.table.params.statisticalType = dictData.getBasicData('Statistical_Type', ['Load_Type'])[3]
|
||||
tableStore.table.params.monitorFlag = 2
|
||||
tableStore.table.params.powerFlag = 2
|
||||
tableStore.table.params.serverName = 'event-boot'
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
const handleClick = async (e: any) => {
|
||||
if (e == '1') {
|
||||
// tableStore.table.params.scale = null
|
||||
// tableStore.table.params.loadType = null
|
||||
tableStore.url = '/event-boot/areaAnalysis/getEventReason'
|
||||
} else {
|
||||
// tableStore.table.params.scale = compatibility.value.checkedVoltage
|
||||
// tableStore.table.params.loadType = compatibility.value.checkedSource
|
||||
tableStore.url = '/event-boot/areaAnalysis/getVoltageToleranceCurve'
|
||||
}
|
||||
await tableStore.onTableAction('search', {})
|
||||
}
|
||||
const layout = mainHeight(123) as any
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.bars_w {
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
}
|
||||
:deep(.el-tabs__content) {
|
||||
height: v-bind('layout.height');
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<div v-show="view">
|
||||
<TableHeader date-picker area>
|
||||
<template v-slot:select></template>
|
||||
</TableHeader>
|
||||
<el-tabs
|
||||
v-model="activeName"
|
||||
type="border-card"
|
||||
@tab-change="handleClick"
|
||||
v-loading="tableStore.table.loading"
|
||||
>
|
||||
<el-tab-pane label="暂降原因及类型统计" name="1">
|
||||
<TypeStatistics ref="Statistics" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="电压容忍度曲线兼容性统计" name="2">
|
||||
<Compatibility ref="compatibility" @viewWave="viewWave" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</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>
|
||||
</template>
|
||||
|
||||
<!-- "area": "",
|
||||
"city": "",
|
||||
"protocolCapacity": 0,
|
||||
"province": "",
|
||||
"region": "",
|
||||
"userName": "",
|
||||
"userType": "",
|
||||
"voltage": "" -->
|
||||
<script setup lang="ts">
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import waveForm from '@/components/echarts/waveForm.vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import { onMounted, reactive, ref, provide } from 'vue'
|
||||
import TypeStatistics from '../components/TypeStatistics.vue'
|
||||
import Compatibility from '../components/Compatibility.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
defineOptions({
|
||||
name: 'Region/overview'
|
||||
})
|
||||
const pageHeight = mainHeight(20)
|
||||
const activeName = ref('1')
|
||||
const Statistics = ref()
|
||||
const compatibility = ref()
|
||||
const dictData = useDictData()
|
||||
const view = ref(true)
|
||||
const view2 = ref(false)
|
||||
const boxoList = ref({})
|
||||
const wp = ref({})
|
||||
const tableStore = new TableStore({
|
||||
url: '/event-boot/areaAnalysis/getEventReason',
|
||||
method: 'POST',
|
||||
column: [],
|
||||
beforeSearchFun: () => {
|
||||
if (activeName.value == '1') {
|
||||
tableStore.table.params.scale = null
|
||||
tableStore.table.params.loadType = null
|
||||
} else {
|
||||
tableStore.table.params.scale = compatibility.value.checkedVoltage
|
||||
tableStore.table.params.loadType = compatibility.value.checkedSource
|
||||
}
|
||||
},
|
||||
loadCallback: () => {
|
||||
if (activeName.value == '1') {
|
||||
Statistics.value.info(tableStore.table.data)
|
||||
} else {
|
||||
compatibility.value.info(tableStore.table.data.voltageToleranceCurveDataList)
|
||||
}
|
||||
}
|
||||
})
|
||||
provide('tableStore', tableStore)
|
||||
|
||||
tableStore.table.params.statisticalType = dictData.getBasicData('Statistical_Type', ['Load_Type'])[3]
|
||||
tableStore.table.params.monitorFlag = 2
|
||||
tableStore.table.params.powerFlag = 2
|
||||
tableStore.table.params.serverName = 'event-boot'
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
const handleClick = async (e: any) => {
|
||||
if (e == '1') {
|
||||
// tableStore.table.params.scale = null
|
||||
// tableStore.table.params.loadType = null
|
||||
tableStore.url = '/event-boot/areaAnalysis/getEventReason'
|
||||
} else {
|
||||
// tableStore.table.params.scale = compatibility.value.checkedVoltage
|
||||
// tableStore.table.params.loadType = compatibility.value.checkedSource
|
||||
tableStore.url = '/event-boot/areaAnalysis/getVoltageToleranceCurve'
|
||||
}
|
||||
await tableStore.onTableAction('search', {})
|
||||
}
|
||||
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>
|
||||
|
||||
@@ -240,7 +240,7 @@ const tableStore = new TableStore({
|
||||
field: 'featureAmplitude',
|
||||
title: '暂降(骤升)幅值(%)',
|
||||
minWidth: '130',
|
||||
formatter: ({ row }: any) => {
|
||||
formatter: (row: any) => {
|
||||
return Math.floor(row.cellValue * 10000) / 100
|
||||
}
|
||||
},
|
||||
|
||||
@@ -29,6 +29,17 @@
|
||||
</template>
|
||||
</vxe-column>
|
||||
</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>
|
||||
</div>
|
||||
<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 boxoList = ref({})
|
||||
const wp = ref({})
|
||||
|
||||
const form = ref({
|
||||
pageSize: 20,
|
||||
pageNum: 1,
|
||||
id: ''
|
||||
})
|
||||
const total = ref(0)
|
||||
provide('tableStore', tableStore)
|
||||
|
||||
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
|
||||
})
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
// 启动关联分析
|
||||
const firing = () => {
|
||||
processEvents({
|
||||
@@ -207,9 +257,8 @@ const details = (row: any) => {
|
||||
type: 'success',
|
||||
message: res.message
|
||||
})
|
||||
queryRelevantLogPage({}).then((res: any) => {
|
||||
AnalysisData.value = res.data.records
|
||||
})
|
||||
// 重新加载当前页的数据
|
||||
loadAnalysisData()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -217,4 +266,6 @@ const backbxlb = () => {
|
||||
view.value = true
|
||||
view2.value = false
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<div style="flex: 1" class="mt10">
|
||||
<my-echart :options="options" />
|
||||
<my-echart :options="options" @echartClick="echartClick" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -52,7 +52,7 @@ const init = () => {
|
||||
data.gs = res.data.voltageToleranceCurveDataList.length
|
||||
data.krr = gongData.pointI.length
|
||||
data.bkrr = gongData.pointIun.length
|
||||
|
||||
|
||||
options.value = {
|
||||
// backgroundColor: "#f9f9f9", //地图背景色深蓝
|
||||
title: {
|
||||
@@ -107,7 +107,7 @@ const init = () => {
|
||||
name: '%'
|
||||
}
|
||||
],
|
||||
color: ['#FF8C00', '#00BFFF', 'green', 'red'],
|
||||
color: ['#FF8C00', '#00BFFF', 'green', 'red'],
|
||||
options: {
|
||||
dataZoom: null,
|
||||
series: [
|
||||
@@ -186,7 +186,7 @@ function gongfunction(arr: any) {
|
||||
let time = arr[i].time
|
||||
let eventId = arr[i].eventId
|
||||
// let index =arr[i].eventDetailIndex;
|
||||
point = [xx, yy, time, eventId]
|
||||
point = [xx, yy, time, eventId, arr[i]]
|
||||
|
||||
if (xx <= 0.003) {
|
||||
let line = 0
|
||||
@@ -324,9 +324,13 @@ function gongfunction(arr: any) {
|
||||
pointFun
|
||||
}
|
||||
}
|
||||
const emit = defineEmits(['viewWave'])
|
||||
const echartClick = (params: any) => {
|
||||
emit('viewWave', params.value[4])
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
datePickerRef.value.setTheDate(1)
|
||||
datePickerRef.value.setTheDate(1)
|
||||
init()
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<el-descriptions-item align="center" label="不可容忍">{{ data.bkrr }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<div style="flex: 1" class="mt10">
|
||||
<my-echart :options="options" />
|
||||
<my-echart :options="options" @echartClick="echartClick" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -50,8 +50,8 @@ const init = () => {
|
||||
getPlot(formData).then((res: any) => {
|
||||
const gongData = gongfunction(res.data.voltageToleranceCurveDataList)
|
||||
data.gs = res.data.voltageToleranceCurveDataList.length
|
||||
data.krr = gongData.pointI.length
|
||||
data.bkrr = gongData.pointIun.length
|
||||
data.krr = gongData.pointF.length
|
||||
data.bkrr = gongData.pointFun.length
|
||||
|
||||
options.value = {
|
||||
// backgroundColor: "#f9f9f9", //地图背景色深蓝
|
||||
@@ -172,7 +172,7 @@ function gongfunction(arr: any) {
|
||||
let time = arr[i].time
|
||||
let eventId = arr[i].eventId
|
||||
// let index =arr[i].eventDetailIndex;
|
||||
point = [xx, yy, time, eventId]
|
||||
point = [xx, yy, time, eventId, arr[i]]
|
||||
|
||||
if (xx <= 0.003) {
|
||||
let line = 0
|
||||
@@ -205,8 +205,6 @@ function gongfunction(arr: any) {
|
||||
})
|
||||
}
|
||||
} else if (xx <= 0.5) {
|
||||
|
||||
|
||||
if (yy > 120 || yy < 70) {
|
||||
unstandI++
|
||||
pointIun.push({
|
||||
@@ -312,9 +310,12 @@ function gongfunction(arr: any) {
|
||||
pointFun
|
||||
}
|
||||
}
|
||||
|
||||
const emit = defineEmits(['viewWave'])
|
||||
const echartClick = (params: any) => {
|
||||
emit('viewWave', params.value[4])
|
||||
}
|
||||
onMounted(() => {
|
||||
datePickerRef.value.setTheDate(1)
|
||||
datePickerRef.value.setTheDate(1)
|
||||
init()
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<el-tabs v-model="activeName" type="border-card" class="event-statistics" tab-position="left" :style="height">
|
||||
<el-tab-pane lazy label="ITIC曲线分析" name="1">
|
||||
<ITICquxianfenxi />
|
||||
<ITICquxianfenxi @viewWave="viewWave"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane lazy label="SEMI F47 分析" name="2">
|
||||
<SEMIF47fenxi />
|
||||
<SEMIF47fenxi @viewWave="viewWave"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane lazy label="电压暂降表及密度" name="3">
|
||||
<Dianyazanjiangbiaojimidu />
|
||||
@@ -35,12 +35,16 @@ const props = defineProps({
|
||||
default: 0
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['viewWave'])
|
||||
const activeName = ref('1')
|
||||
const height = ref(mainHeight(84 + props.externalHeight))
|
||||
// onMounted(() => {
|
||||
// height.value = mainHeight(84 + props.externalHeight)
|
||||
// console.log("🚀 ~ 84 + props.externalHeight:", 84 + props.externalHeight)
|
||||
// })
|
||||
const viewWave=(row:any)=>{
|
||||
emit('viewWave',row)
|
||||
}
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.event-statistics {
|
||||
|
||||
@@ -249,7 +249,7 @@ const initThird = () => {
|
||||
backgroundColor: '#fff', //背景色,
|
||||
animation: false,
|
||||
title: {
|
||||
text: '触发类型',
|
||||
text: '暂降类型',
|
||||
x: 'center'
|
||||
},
|
||||
|
||||
@@ -277,7 +277,7 @@ const initThird = () => {
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '触发类型',
|
||||
name: '暂降类型',
|
||||
type: 'pie',
|
||||
radius: '65%',
|
||||
center: ['50%', '60%'],
|
||||
|
||||
@@ -1,34 +1,39 @@
|
||||
<template>
|
||||
<div class="default-main" style="position: relative">
|
||||
|
||||
<el-tabs v-model="activeName" type="border-card" class="demo-tabs">
|
||||
<el-tab-pane label="导航" name="1" :style="height" lazy>
|
||||
<Navigation @changeTab="changeTab" ref="navigationRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="事件统计" name="2" lazy v-if="!isReload">
|
||||
<EventStatistics />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="事件分析" name="3" lazy v-if="!isReload">
|
||||
<EventStudy />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="运行情况" name="4" lazy :style="height" v-if="!isReload">
|
||||
<RunningCondition />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="暂态报告" name="5" lazy v-if="VITE_FLAG">
|
||||
<TransientReport />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<div class="monitoring-point">当前位置:{{ monitoringPoint.state.lineName }}</div>
|
||||
<div v-show="view">
|
||||
<el-tabs v-model="activeName" type="border-card" class="demo-tabs">
|
||||
<el-tab-pane label="导航" name="1" :style="height" lazy>
|
||||
<Navigation @changeTab="changeTab" ref="navigationRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="事件统计" name="2" lazy v-if="!isReload">
|
||||
<EventStatistics @viewWave="viewWave" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="事件分析" name="3" lazy v-if="!isReload">
|
||||
<EventStudy />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="运行情况" name="4" lazy :style="height" v-if="!isReload">
|
||||
<RunningCondition />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="暂态报告" name="5" lazy v-if="VITE_FLAG">
|
||||
<TransientReport />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<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>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { defineOptions, nextTick, ref, watch } from 'vue'
|
||||
import { nextTick, ref, watch } from 'vue'
|
||||
import Navigation from './navigation/index.vue'
|
||||
import EventStatistics from './eventStatistics/index.vue'
|
||||
import EventStudy from './eventStudy/index.vue'
|
||||
import RunningCondition from './runningCondition/index.vue'
|
||||
import TransientReport from './transientReport/index.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import waveForm from '@/components/echarts/waveForm.vue'
|
||||
import router from '@/router'
|
||||
import { useMonitoringPoint } from '@/stores/monitoringPoint'
|
||||
const VITE_FLAG = import.meta.env.VITE_NAME == 'jibei'
|
||||
@@ -37,14 +42,17 @@ defineOptions({
|
||||
})
|
||||
const isReload = ref(false)
|
||||
const navigationRef = ref()
|
||||
const pageHeight = mainHeight(20)
|
||||
const monitoringPoint = useMonitoringPoint()
|
||||
const height = mainHeight(82)
|
||||
const activeName = ref('1')
|
||||
|
||||
const view = ref(true)
|
||||
const view2 = ref(false)
|
||||
const boxoList = ref({})
|
||||
const wp = ref({})
|
||||
watch(
|
||||
() => router.currentRoute.value.query.lineId,
|
||||
(newLineId, oldLineId) => {
|
||||
|
||||
if (!newLineId) return
|
||||
// 在这里处理 lineId 的变化
|
||||
console.log('newLineId')
|
||||
@@ -62,7 +70,6 @@ watch(
|
||||
watch(
|
||||
() => monitoringPoint.state.lineId,
|
||||
() => {
|
||||
|
||||
// 刷新页面
|
||||
isReload.value = true
|
||||
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
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { BmlMarkerClusterer } from 'vue-baidu-map-3x'
|
||||
|
||||
import { onMounted, ref, watch } from 'vue'
|
||||
import { getAreaLineInfo } from '@/api/event-boot/areaInfo'
|
||||
import DatePicker from '@/components/form/datePicker/index.vue'
|
||||
@@ -241,19 +242,19 @@ const handler = async ({ BMap, map }: any) => {
|
||||
siteList.value = list
|
||||
|
||||
center.value.lng = list[0]?.lng || 0
|
||||
center.value.lat = list[0]?.lat + 0.01 || 0
|
||||
center.value.lat = list[0]?.lat
|
||||
watch(
|
||||
() => monitoringPoint.state.lineId,
|
||||
(newLineId, oldLineId) => {
|
||||
let value = areaLineInfo.value.find((item: any) => item.lineId == newLineId)
|
||||
|
||||
|
||||
if (value == undefined) return
|
||||
|
||||
center.value.lng = value.lng
|
||||
center.value.lat = value.lat + 0.01
|
||||
center.value.lat = value.lat
|
||||
infoWindowPoint.value = value
|
||||
infoWindowPoint.value.show = true
|
||||
|
||||
|
||||
monitoringPoint.setValue(
|
||||
'lineName',
|
||||
value.manufacturer + '>' + value.gdName + '>' + value.subName + '>' + value.lineName
|
||||
@@ -273,7 +274,6 @@ const syncCenterAndZoom = (e: any) => {
|
||||
const markerClick = (e: any) => {
|
||||
//console.log("🚀 ~ markerClick ~ e:", e)
|
||||
infoWindowPoint.value = e
|
||||
monitoringPoint.setValue('lineId', e.lineId)
|
||||
infoWindowPoint.value.show = true
|
||||
}
|
||||
const changeTab = (e: string) => {
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
<el-row>
|
||||
<el-col :span="12" class="mTop">
|
||||
<div class="grid-content">
|
||||
<div class="divBox">触发类型</div>
|
||||
<div class="divBox">暂降类型</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="12" class="mTop">
|
||||
|
||||
@@ -91,14 +91,19 @@
|
||||
@click="markerClick(path)"
|
||||
></bm-marker>
|
||||
</BmlMarkerClusterer>
|
||||
|
||||
<bm-marker :position="infoWindowPoint" :icon="{ url: '1', size: { width: 0, height: 0 } }">
|
||||
<bm-info-window :show="infoWindowPoint.show" @close="infoWindowPoint.show = false">
|
||||
<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="变电站(场站)">
|
||||
{{ infoWindowPoint.subName }}
|
||||
</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="网络参数">
|
||||
{{ infoWindowPoint.ip }}
|
||||
</el-descriptions-item>
|
||||
@@ -292,7 +297,7 @@ const pointChange = (val: string) => {
|
||||
let data = areaLineInfo.value.find((item: any) => item.lineId == val)
|
||||
|
||||
center.value.lng = data.lng
|
||||
center.value.lat = data.lat + 0.04
|
||||
center.value.lat = data.lat
|
||||
infoWindowPoint.value = data
|
||||
infoWindowPoint.value.show = true
|
||||
zoom.value = 13
|
||||
|
||||
@@ -25,7 +25,11 @@
|
||||
<vxe-column type="seq" title="序号" width="70px"></vxe-column>
|
||||
<vxe-column field="startTime" title="发生时刻" width="200"></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-table>
|
||||
</div>
|
||||
@@ -49,7 +53,6 @@ const props = defineProps({
|
||||
const tableData = ref([])
|
||||
const tableData1 = ref([])
|
||||
getNoDealEvents(props.params).then(res => {
|
||||
|
||||
tableData.value = res.data
|
||||
})
|
||||
getAreaOffDev(props.params).then(res => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader date-picker area showExport>
|
||||
<TableHeader date-picker area >
|
||||
<template v-slot:select>
|
||||
<el-form-item label="统计类型">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="网公司标志:">
|
||||
<el-form-item label="网公司标志">
|
||||
<el-select
|
||||
v-model="tableStore.table.params.monitorFlag"
|
||||
collapse-tags
|
||||
@@ -48,7 +48,7 @@
|
||||
</el-form-item>
|
||||
</template>
|
||||
<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>
|
||||
</TableHeader>
|
||||
<Table ref="tableRef" />
|
||||
@@ -61,6 +61,7 @@ import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import { getEventReport } from '@/api/event-boot/report'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
defineOptions({
|
||||
name: 'Operationmanagement/terminalmanagement'
|
||||
@@ -70,7 +71,7 @@ const triggerType = dictData.getBasicData('Event_Statis')
|
||||
const sign: any = dictData.getBasicData('power_flag')
|
||||
const tableRef = ref()
|
||||
|
||||
|
||||
const loading = ref(false)
|
||||
const monitorList = [
|
||||
{ value: 0, label: '非网公司' },
|
||||
{ value: 1, label: '网公司' },
|
||||
@@ -130,6 +131,7 @@ const tableStore = new TableStore({
|
||||
width: '140',
|
||||
formatter: (row: any) => {
|
||||
// return (row.cellValue * 100).toFixed(0)
|
||||
|
||||
return Math.floor(row.cellValue * 10000) / 100
|
||||
}
|
||||
},
|
||||
@@ -161,20 +163,48 @@ onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
const exportEvent = () => {
|
||||
let form: any = JSON.parse(JSON.stringify(tableStore.table.params))
|
||||
form.pageNum = 1
|
||||
form.pageSize = tableStore.table.total
|
||||
getEventReport(form).then(res => {
|
||||
tableRef.value.getRef().exportData({
|
||||
filename: '事件报告', // 文件名字
|
||||
sheetName: 'Sheet1',
|
||||
type: 'xlsx', //导出文件类型 xlsx 和 csv
|
||||
useStyle: true,
|
||||
data: res.data.records, // 数据源 // 过滤那个字段导出
|
||||
columnFilterMethod: function (column, $columnIndex) {
|
||||
return !(column.$columnIndex === 0)
|
||||
// let form: any = JSON.parse(JSON.stringify(tableStore.table.params))
|
||||
// form.pageNum = 1
|
||||
// form.pageSize = tableStore.table.total
|
||||
// getEventReport(form).then(res => {
|
||||
// tableRef.value.getRef().exportData({
|
||||
// filename: '事件报告', // 文件名字
|
||||
// sheetName: 'Sheet1',
|
||||
// type: 'xlsx', //导出文件类型 xlsx 和 csv
|
||||
// useStyle: true,
|
||||
// data: res.data.records, // 数据源 // 过滤那个字段导出
|
||||
// columnFilterMethod: function (column, $columnIndex) {
|
||||
// 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>
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
<el-row>
|
||||
<el-col :span="12" class="mTop">
|
||||
<div class="grid-content">
|
||||
<div class="divBox">触发类型</div>
|
||||
<div class="divBox">暂降类型</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="12" class="mTop">
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<div class="grid-content">
|
||||
<div class="divBox">触发类型</div>
|
||||
<div class="divBox">暂降类型</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
|
||||
@@ -30,6 +30,7 @@ import { ref, onMounted, provide, nextTick } from 'vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
import MyEchart from '@/components/echarts/MyEchart.vue'
|
||||
|
||||
const dictData = useDictData()
|
||||
const tableRef = ref()
|
||||
const options = ref({})
|
||||
@@ -88,6 +89,7 @@ const tableStore = new TableStore({
|
||||
text: '暂降原因统计',
|
||||
top: '20'
|
||||
},
|
||||
|
||||
legend: {
|
||||
type: 'scroll',
|
||||
orient: 'vertical',
|
||||
|
||||
@@ -35,44 +35,44 @@ const height = mainHeight(80).height
|
||||
const activeName = ref('1')
|
||||
const activeName1 = ref('1')
|
||||
const list = ref([
|
||||
// {
|
||||
// name: '暂态严重度统计',
|
||||
// id: '3',
|
||||
// isGroup: true,
|
||||
// url: '/event-boot/report/getSeverity',
|
||||
// column: [
|
||||
// {
|
||||
// title: '暂态事件严重度(前二十)',
|
||||
// children: [
|
||||
// {
|
||||
// field: 'index',
|
||||
// title: '序号',
|
||||
// width: '80',
|
||||
// formatter: (row: any) => {
|
||||
// return (
|
||||
// (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize +
|
||||
// row.rowIndex +
|
||||
// 1
|
||||
// )
|
||||
// }
|
||||
// },
|
||||
// { field: 'startTime', title: '暂态事件发生时刻', width: '200' },
|
||||
// { field: 'gdName', title: '供电公司' },
|
||||
// { field: 'subName', title: '变电站' },
|
||||
// { field: 'lineName', title: '监测点' },
|
||||
// { field: 'voltageScale', title: '监测点电压等级' },
|
||||
// { field: 'loadType', title: '干扰源类型' },
|
||||
// {
|
||||
// field: 'featureAmplitude',
|
||||
// title: '暂降(骤升)幅值(%)',
|
||||
// formatter: ({ row }: any) => (row.featureAmplitude * 100).toFixed(2)
|
||||
// },
|
||||
// { field: 'duration', title: '持续时间(s)' },
|
||||
// { field: 'severity', title: '暂态事件严重度' }
|
||||
// ]
|
||||
// }
|
||||
// ]
|
||||
// },
|
||||
{
|
||||
name: '暂态严重度统计',
|
||||
id: '3',
|
||||
isGroup: true,
|
||||
url: '/event-boot/report/getSeverity',
|
||||
column: [
|
||||
{
|
||||
title: '暂态事件严重度(前二十)',
|
||||
children: [
|
||||
{
|
||||
field: 'index',
|
||||
title: '序号',
|
||||
width: '80',
|
||||
formatter: (row: any) => {
|
||||
return (
|
||||
(tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize +
|
||||
row.rowIndex +
|
||||
1
|
||||
)
|
||||
}
|
||||
},
|
||||
{ field: 'startTime', title: '暂态事件发生时刻', width: '200' },
|
||||
{ field: 'gdName', title: '供电公司' },
|
||||
{ field: 'subName', title: '变电站' },
|
||||
{ field: 'lineName', title: '监测点' },
|
||||
{ field: 'voltageScale', title: '监测点电压等级' },
|
||||
{ field: 'loadType', title: '干扰源类型' },
|
||||
{
|
||||
field: 'featureAmplitude',
|
||||
title: '暂降(骤升)幅值(%)',
|
||||
formatter: ({ row }: any) => (row.featureAmplitude * 100).toFixed(2)
|
||||
},
|
||||
{ field: 'duration', title: '持续时间(s)' },
|
||||
{ field: 'severity', title: '暂态事件严重度' }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '暂降事件列表',
|
||||
id: '4',
|
||||
@@ -108,7 +108,7 @@ const list = ref([
|
||||
}
|
||||
},
|
||||
{ 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
Reference in New Issue
Block a user