修改itic点击波形图

This commit is contained in:
guanj
2026-03-26 14:53:34 +08:00
parent 93ee7e4034
commit fafc5f82c4
28 changed files with 24966 additions and 24719 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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

File diff suppressed because it is too large Load Diff

View File

@@ -152,6 +152,7 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
return Axios(response.config) return Axios(response.config)
}) })
.catch(err => { .catch(err => {
window.location.reload()
adminInfo.removeToken() adminInfo.removeToken()
router.push({ name: 'login' }) router.push({ name: 'login' })
return Promise.reject(err) return Promise.reject(err)

View File

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

View File

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

View File

@@ -40,7 +40,14 @@
></Table> ></Table>
</div> </div>
<div class="pd10" style="width: 400px" v-loading="loading"> <div class="pd10" style="width: 400px" v-loading="loading">
<el-input v-model="filterText" placeholder="请输入内容" clearable maxlength="32" show-word-limit @input="change"> <el-input
v-model="filterText"
placeholder="请输入内容"
clearable
maxlength="32"
show-word-limit
@input="change"
>
<template #prefix> <template #prefix>
<Icon name="el-icon-Search" style="font-size: 16px" /> <Icon name="el-icon-Search" style="font-size: 16px" />
</template> </template>
@@ -139,7 +146,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="最大终端数:" prop="nodeDevNum" class="top" > <el-form-item label="最大终端数:" prop="nodeDevNum" class="top">
<el-input <el-input
v-model.trim.number="formData.nodeDevNum" v-model.trim.number="formData.nodeDevNum"
onkeyup="value = value.replace(/[^0-9]/g,'')" onkeyup="value = value.replace(/[^0-9]/g,'')"
@@ -273,7 +280,7 @@ const tableStore = new TableStore({
method: 'POST', method: 'POST',
column: [ column: [
{ title: '名称', field: 'name' }, { title: '名称', field: 'name' },
{ title: 'IP', field: 'ip' ,width:'120px' }, { title: 'IP', field: 'ip', width: '120px' },
{ {
title: '等级', title: '等级',
field: 'nodeGrade', field: 'nodeGrade',
@@ -317,7 +324,8 @@ const tableStore = new TableStore({
{ title: '描述', field: 'remark' }, { title: '描述', field: 'remark' },
{ {
title: '操作',fixed: 'right', title: '操作',
fixed: 'right',
align: 'center', align: 'center',
width: '180', width: '180',
render: 'buttons', render: 'buttons',
@@ -376,8 +384,8 @@ const tableStore = new TableStore({
}, },
click: row => { click: row => {
if (hasDevices.value) { if (hasDevices.value) {
ElMessage.warning('此前置机绑定了设备,无法删除!'); ElMessage.warning('此前置机绑定了设备,无法删除!')
return; return
} }
delNode(row.id).then(res => { delNode(row.id).then(res => {
@@ -386,7 +394,7 @@ const tableStore = new TableStore({
}) })
} }
}, },
{ {
name: 'edit', name: 'edit',
title: '分配终端', title: '分配终端',
type: 'primary', type: 'primary',
@@ -399,10 +407,10 @@ const tableStore = new TableStore({
title: '确定分配终端吗?' title: '确定分配终端吗?'
}, },
click: row => { click: row => {
if (!hasDevices.value) { // if (!hasDevices.value) {
ElMessage.warning('此前置机下无设备,无法分配终端!'); // ElMessage.warning('此前置机下无设备,无法分配终端!')
return; // return
} // }
allotTerminal({ allotTerminal({
nodeId: row.id nodeId: row.id
}).then(res => { }).then(res => {
@@ -410,7 +418,7 @@ const tableStore = new TableStore({
tableStore.index() tableStore.index()
}) })
} }
}, }
] ]
} }
], ],
@@ -448,26 +456,25 @@ const currentChangeEvent = () => {
// 检查返回的数据是否存在且不为空 // 检查返回的数据是否存在且不为空
if (res.data && res.data.processDeviceList) { if (res.data && res.data.processDeviceList) {
// 检查是否有设备绑定 // 检查是否有设备绑定
const hasAnyDevices = res.data.processDeviceList.some(item => const hasAnyDevices = res.data.processDeviceList.some(
item.deviceInfoList && item.deviceInfoList.length > 0 item => item.deviceInfoList && item.deviceInfoList.length > 0
); )
hasDevices.value = hasAnyDevices; hasDevices.value = hasAnyDevices
dataSource.value = res.data.processDeviceList.filter(item => { dataSource.value = res.data.processDeviceList.filter(item => {
item.name = item.processNo + ''; item.name = item.processNo + ''
return true; // 保持原有的过滤逻辑 return true // 保持原有的过滤逻辑
}); })
} else { } else {
dataSource.value = [] dataSource.value = []
hasDevices.value = false; hasDevices.value = false
} }
loading.value = false loading.value = false
}) })
.catch(() => { .catch(() => {
// 添加错误处理,确保 loading 状态也能关闭 // 添加错误处理,确保 loading 状态也能关闭
dataSource.value = [] dataSource.value = []
hasDevices.value = false; hasDevices.value = false
loading.value = false loading.value = false
}) })
@@ -476,7 +483,7 @@ const currentChangeEvent = () => {
// 重启进程 // 重启进程
const restart = (data: any) => { const restart = (data: any) => {
// console.log('🚀 ~ restart ~ data:', data) // console.log('🚀 ~ restart ~ data:', data)
askRestartProcess({ askRestartProcess({
deviceRebootType: null, deviceRebootType: null,
nodeId: nodeId.value, nodeId: nodeId.value,
@@ -518,7 +525,7 @@ const filterNode = (value: string, data: any, node: any) => {
// 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配则返回该节点以及其下的所有子节点如果参数是子节点则返回该节点的父节点。name是中文字符enName是英文字符. // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配则返回该节点以及其下的所有子节点如果参数是子节点则返回该节点的父节点。name是中文字符enName是英文字符.
const chooseNode = (value: string, data: any, node: any) => { const chooseNode = (value: string, data: any, node: any) => {
if (data.name.indexOf(value) !== -1) { if ((data.subName + data.name).indexOf(value) !== -1) {
return true return true
} }
const level = node.level const level = node.level
@@ -629,7 +636,7 @@ const addMenu = () => {}
:deep(.default) { :deep(.default) {
display: flex; display: flex;
.row--current { .row--current {
// background-color: var(--el-color-primary-light-8) !important; // background-color: var(--el-color-primary-light-8) !important;
} }
} }
.custom-tree-node { .custom-tree-node {

View File

@@ -1740,8 +1740,8 @@ const optionarr = ref([
]) ])
/**母线类型 */ /**母线类型 */
const busBarType = ref([ const busBarType = ref([
{ name: '实际母线', value: 0 }, { name: '实际母线', value: 1 },
{ name: '虚拟母线', value: 1 } { name: '虚拟母线', value: 0 }
]) ])
const bigList: any = ref([]) const bigList: any = ref([])
const smallList: any = ref([]) const smallList: any = ref([])

View File

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

View File

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

View File

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

View File

@@ -454,7 +454,7 @@ onMounted(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.actionButtons { .actionButtons {
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
} }
:deep(.el-collapse-item__header) { :deep(.el-collapse-item__header) {
// font-family: AlimamaDongFangDaKai; // font-family: AlimamaDongFangDaKai;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -242,19 +242,19 @@ const handler = async ({ BMap, map }: any) => {
siteList.value = list siteList.value = list
center.value.lng = list[0]?.lng || 0 center.value.lng = list[0]?.lng || 0
center.value.lat = list[0]?.lat + 0.01 || 0 center.value.lat = list[0]?.lat
watch( watch(
() => monitoringPoint.state.lineId, () => monitoringPoint.state.lineId,
(newLineId, oldLineId) => { (newLineId, oldLineId) => {
let value = areaLineInfo.value.find((item: any) => item.lineId == newLineId) let value = areaLineInfo.value.find((item: any) => item.lineId == newLineId)
if (value == undefined) return if (value == undefined) return
center.value.lng = value.lng center.value.lng = value.lng
center.value.lat = value.lat + 0.01 center.value.lat = value.lat
infoWindowPoint.value = value infoWindowPoint.value = value
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
monitoringPoint.setValue( monitoringPoint.setValue(
'lineName', 'lineName',
value.manufacturer + '>' + value.gdName + '>' + value.subName + '>' + value.lineName value.manufacturer + '>' + value.gdName + '>' + value.subName + '>' + value.lineName
@@ -274,7 +274,6 @@ const syncCenterAndZoom = (e: any) => {
const markerClick = (e: any) => { const markerClick = (e: any) => {
//console.log("🚀 ~ markerClick ~ e:", e) //console.log("🚀 ~ markerClick ~ e:", e)
infoWindowPoint.value = e infoWindowPoint.value = e
monitoringPoint.setValue('lineId', e.lineId)
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
} }
const changeTab = (e: string) => { const changeTab = (e: string) => {

View File

@@ -91,63 +91,58 @@
@click="markerClick(path)" @click="markerClick(path)"
></bm-marker> ></bm-marker>
</BmlMarkerClusterer> </BmlMarkerClusterer>
<BmlMarkerClusterer maxZoom="12">
<bm-marker :position="infoWindowPoint" :icon="{ url: '1', size: { width: 0, height: 0 } }"> <bm-marker :position="infoWindowPoint" :icon="{ url: '1', size: { width: 0, height: 0 } }">
<bm-info-window :show="infoWindowPoint.show" @close="infoWindowPoint.show = false"> <bm-info-window :show="infoWindowPoint.show" @close="infoWindowPoint.show = false">
<el-descriptions <el-descriptions :title="infoWindowPoint.lineName" :column="1" v-if="infoWindowPoint.lineId">
:title="infoWindowPoint.lineName" <el-descriptions-item label="供电公司">
:column="1" {{ infoWindowPoint.gdName }}
v-if="infoWindowPoint.lineId" </el-descriptions-item>
> <el-descriptions-item label="变电站(场站)">
<el-descriptions-item label="供电公司"> {{ infoWindowPoint.subName }}
{{ infoWindowPoint.gdName }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="母线">
<el-descriptions-item label="变电站(场站)"> {{ infoWindowPoint.voltageName }}
{{ infoWindowPoint.subName }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="网络参数">
<el-descriptions-item label="母线"> {{ infoWindowPoint.ip }}
{{ infoWindowPoint.voltageName }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="PT变比">
<el-descriptions-item label="网络参数"> {{ infoWindowPoint.pt1 }}/{{ infoWindowPoint.pt2 }}
{{ infoWindowPoint.ip }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="CT变比">
<el-descriptions-item label="PT变比"> {{ infoWindowPoint.ct1 }}/{{ infoWindowPoint.ct2 }}
{{ infoWindowPoint.pt1 }}/{{ infoWindowPoint.pt2 }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="生产厂家">
<el-descriptions-item label="CT变比"> {{ infoWindowPoint.manufacturer }}
{{ infoWindowPoint.ct1 }}/{{ infoWindowPoint.ct2 }} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="终端状态">
<el-descriptions-item label="生产厂家"> {{
{{ infoWindowPoint.manufacturer }} infoWindowPoint.runFlag == 0
</el-descriptions-item> ? '投运'
<el-descriptions-item label="终端状态"> : infoWindowPoint.runFlag == 1
{{ ? '检修'
infoWindowPoint.runFlag == 0 : '停运'
? '投运' }}
: infoWindowPoint.runFlag == 1 </el-descriptions-item>
? '检修' <el-descriptions-item label="通讯状态">
: '停运' {{ infoWindowPoint.comFlag == 0 ? '中断' : '正常' }}
}} </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item>
<el-descriptions-item label="通讯状态"> <!-- <el-button type="primary" size="small" @click="lookPoint">查看监测点</el-button> -->
{{ infoWindowPoint.comFlag == 0 ? '中断' : '正常' }} <el-button type="primary" size="small" @click="lookEvent">
</el-descriptions-item> 暂态事件({{ infoWindowPoint.noDealCount }})
<el-descriptions-item> </el-button>
<!-- <el-button type="primary" size="small" @click="lookPoint">查看监测点</el-button> --> </el-descriptions-item>
<el-button type="primary" size="small" @click="lookEvent"> </el-descriptions>
暂态事件({{ infoWindowPoint.noDealCount }}) <el-descriptions
</el-button> :title="infoWindowPoint.subName"
</el-descriptions-item> :column="1"
</el-descriptions> v-else-if="infoWindowPoint.subId"
<el-descriptions style="padding-top: 10px"
:title="infoWindowPoint.subName" ></el-descriptions>
:column="1" </bm-info-window>
v-else-if="infoWindowPoint.subId" </bm-marker>
style="padding-top: 10px"
></el-descriptions>
</bm-info-window>
</bm-marker>
</BmlMarkerClusterer>
</baidu-map> </baidu-map>
</div> </div>
<div style="width: 600px; height: 100%"> <div style="width: 600px; height: 100%">
@@ -302,7 +297,7 @@ const pointChange = (val: string) => {
let data = areaLineInfo.value.find((item: any) => item.lineId == val) let data = areaLineInfo.value.find((item: any) => item.lineId == val)
center.value.lng = data.lng center.value.lng = data.lng
center.value.lat = data.lat + 0.04 center.value.lat = data.lat
infoWindowPoint.value = data infoWindowPoint.value = data
infoWindowPoint.value.show = true infoWindowPoint.value.show = true
zoom.value = 13 zoom.value = 13

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="strategy-manage pd10" :style="height"> <div class="strategy-manage pd10" :style="height" style="overflow-y: auto;">
<!-- 折叠面板 --> <!-- 折叠面板 -->
<el-collapse v-model="activeNames" > <el-collapse v-model="activeNames" >
@@ -194,7 +194,7 @@ import { ElMessageBox } from 'element-plus'
// 页面缓存 // 页面缓存
defineOptions({ defineOptions({
name: 'system-boot/sysConfig/timer' name: 'system-boot/strategyManage'
}) })
const height = mainHeight(20) const height = mainHeight(20)