修改冀北现场反馈问题

This commit is contained in:
GGJ
2025-12-15 09:33:34 +08:00
parent d30b8247cf
commit 9f5b2ecc46
28 changed files with 700 additions and 468 deletions

BIN
public/favicon4.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -182,7 +182,7 @@ const handlerHeight = () => {
}
}
const computedSearchRow = () => {
if (!headerForm.value.$el) return
if (!headerForm.value?.$el) return
// 清空headerFormSecond.value.$el下的元素
while (headerFormSecond.value.$el.firstChild) {
headerForm.value.$el.appendChild(headerFormSecond.value.$el.firstChild)

View File

@@ -59,7 +59,7 @@
effect="customized"
placement="bottom-start"
:offset="0"
v-if=" data.level == 6"
v-if="data.level == 6"
>
<template #content>
<el-button type="primary" plain @click="viewDetails(data)">
@@ -74,18 +74,16 @@
</el-tree>
</div>
<!-- 变电站详情 -->
<SubstationDetails ref="SubstationRef"/>
<!-- 监测点详情 -->
<MonitoringPointDetails ref="MonitoringPointRef"/>
<SubstationDetails ref="SubstationRef" />
<!-- 监测点详情 -->
<MonitoringPointDetails ref="MonitoringPointRef" />
</div>
</template>
<script lang="ts" setup>
import useCurrentInstance from '@/utils/useCurrentInstance'
import { ElTree } from 'element-plus'
import { ref, watch } from 'vue'
import { ref, watch, onMounted, nextTick } from 'vue'
import { ElMessage } from 'element-plus'
import MonitoringPointDetails from './details/monitoringPointDetails.vue'
import SubstationDetails from './details/substationDetails.vue'
@@ -110,6 +108,7 @@ const menuCollapse = ref(false)
const MonitoringPointRef = ref()
const SubstationRef = ref()
const filterText = ref('')
const treeRef = ref()
const defaultProps = {
label: 'name',
value: 'id'
@@ -148,7 +147,7 @@ const onMenuCollapse = () => {
}
// 查看详情
const viewDetails = (data: any) => {
console.log("🚀 ~ viewDetails ~ data:", data)
console.log('🚀 ~ viewDetails ~ data:', data)
if (data.level == 3) {
// 变电站详情
// substationDetails
@@ -194,12 +193,40 @@ const chooseNode = (value: string, data: any, node: any) => {
// 没匹配到返回false
return false
}
onMounted(async () => {
// 等待树渲染完成
await nextTick()
// 可以等待更长时间确保树完全展开
})
const scrollToNode = (id: string) => {
console.log("🚀 ~ scrollToNode ~ id:", id)
if (!treeRef.value) return
// 获取目标节点的元素
const targetNode = treeRef.value.getNode(id)
if (!targetNode) return
// 获取节点的DOM元素
const nodeElement = document.querySelector(`[data-key="${id}"]`)
if (nodeElement) {
// 滚动到节点位置
nodeElement.scrollIntoView({
behavior: 'smooth', // 平滑滚动
block: 'center', // 垂直方向居中
inline: 'nearest' // 水平方向最近
})
// 如果需要高亮当前节点
treeRef.value.setCurrentKey(id)
}
}
// 添加树
const onAddTree = () => {
emit('onAddTree')
}
const treeRef = ref<InstanceType<typeof ElTree>>()
defineExpose({ treeRef })
defineExpose({ treeRef, scrollToNode })
</script>
<style lang="scss" scoped>

View File

@@ -14,9 +14,7 @@ import { useDictData } from '@/stores/dictData'
import { getTerminalTreeForFive } from '@/api/device-boot/terminalTree'
import { useConfig } from '@/stores/config'
import { defineProps } from 'vue'
import {
getTree
} from '@/api/advance-boot/assess'
import { getTree } from '@/api/advance-boot/assess'
defineOptions({
name: 'pms/pointTree'
@@ -46,25 +44,24 @@ const formData = ref({
scale: null
})
// 添加数据转换函数
const transformTreeData = (data: any[]) => {
if (!data || !Array.isArray(data)) return [];
if (!data || !Array.isArray(data)) return []
return data.map(item => {
// 创建新对象,确保不修改原始数据
const newItem: any = {
name: item.treeName ,
id: item.treeId ,
name: item.treeName,
id: item.treeId,
children: []
};
}
// 递归处理子节点
if (item.children && Array.isArray(item.children)) {
newItem.children = transformTreeData(item.children);
newItem.children = transformTreeData(item.children)
}
return newItem;
});
};
return newItem
})
}
const loadData = () => {
let obj = classificationData.find(function (i) {
@@ -74,13 +71,16 @@ const loadData = () => {
form.statisticalType = classificationData.find((item: any) => item.id == form.statisticalType)
let nodeKey = ''
getTree({}).then(res => {
// 转换数据结构为指定格式
const transformedData = transformTreeData(res.data);
// 确保有数据再进行处理
if (transformedData && transformedData.length > 0 &&
transformedData[0].children && transformedData[0].children.length > 0) {
// 转换数据结构为指定格式
const transformedData = transformTreeData(res.data)
// 确保有数据再进行处理
if (
transformedData &&
transformedData.length > 0 &&
transformedData[0].children &&
transformedData[0].children.length > 0
) {
nodeKey = transformedData[0].children[0].id
emit('init', transformedData[0].children[0])
@@ -94,7 +94,15 @@ const loadData = () => {
}
})
}
const scrollToNode = (id: string) => {
// 树滚动
treeRef.value.scrollToNode(id)
}
loadData()
defineExpose({
tree,
scrollToNode
})
</script>
<style lang="scss">
.point-tree {

View File

@@ -135,11 +135,17 @@ const loadData = () => {
if (nodeKey) {
nextTick(() => {
treeRef.value.treeRef.setCurrentKey(nodeKey)
// treeRef.value.treeRef.setExpandedKeys(nodeKey)
})
}
})
}
const scrollToNode = (id: string) => {
// 树滚动
treeRef.value.scrollToNode(id)
}
defineExpose({ treeRef, scrollToNode, tree })
loadData()
</script>
<style lang="scss">

View File

@@ -5,7 +5,7 @@
贡献度计算
<div style="font-size: 14px; font-weight: 500">
<!-- {{ dotList.alias || '' }} -->
<span class="monitoring-point">当前位置{{ dotList.alias || '' }}</span>
<span class="monitoring-point1">当前位置{{ dotList.alias || '' }}</span>
<back-component />
</div>
</div>
@@ -598,7 +598,7 @@ onMounted(() => {
width: 300px;
}
}
.monitoring-point {
.monitoring-point1 {
font-size: 14px;
font-weight: 700;
color: var(--el-color-primary);

View File

@@ -3,9 +3,9 @@
<!-- 模版 -->
<TableHeader datePicker showExport :showReset="false" ref="TableHeaderRef">
<template #select>
<el-form-item label="关键字">
<!-- <el-form-item label="关键字">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字" />
</el-form-item>
</el-form-item> -->
</template>
<template #operation>
<el-button type="primary" icon="el-icon-CreditCard"

View File

@@ -1,99 +1,117 @@
<template>
<div class="tab-content">
<TableHeader datePicker ref="tableHeaderRef" @selectChange="handleSelectChange" >
<template #select>
<el-form-item label="区域">
<el-cascader
v-bind="$attrs"
:options="areOptions"
:props="cascaderProps"
v-model="selectedArea"
@change="handleFilterChange"
/>
</el-form-item>
<el-form-item label="统计类型">
<el-select
v-model="tableStore.table.params.statisticalType"
value-key="id"
placeholder="请选择统计类型"
@change="handleStatisticalTypeChange"
>
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="电网标志">
<el-select
v-model="tableStore.table.params.powerFlag"
placeholder="请选择电网标志"
@change="handleFilterChange"
>
<el-option label="全部" value="0"></el-option>
<el-option label="电网侧" value="1"></el-option>
<el-option label="非电网侧" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据">
<el-input
v-model="searchKeyword"
placeholder="请输入变电站/终端/监测点"
clearable
@input="handleFilterChange"
:show-word-limit=true
:maxlength="32"
/>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Download" type="primary" @click="exportEvent">导出</el-button>
</template>
</TableHeader>
<div class="tab-content">
<TableHeader datePicker ref="tableHeaderRef" @selectChange="handleSelectChange">
<template #select>
<el-form-item label="区域">
<el-cascader
v-bind="$attrs"
:options="areOptions"
:props="cascaderProps"
v-model="selectedArea"
@change="handleFilterChange"
/>
</el-form-item>
<el-form-item label="统计类型">
<el-select
v-model="tableStore.table.params.statisticalType"
value-key="id"
placeholder="请选择统计类型"
@change="handleStatisticalTypeChange"
>
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="电网标志">
<el-select
v-model="tableStore.table.params.powerFlag"
placeholder="请选择电网标志"
@change="handleFilterChange"
>
<el-option label="全部" value="0"></el-option>
<el-option label="电网侧" value="1"></el-option>
<el-option label="非电网侧" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据">
<el-input
v-model="searchKeyword"
placeholder="请输入变电站/终端/监测点"
clearable
@input="handleFilterChange"
:show-word-limit="true"
:maxlength="32"
/>
</el-form-item>
</template>
<template #operation>
<el-button icon="el-icon-Download" type="primary" @click="exportEvent">导出</el-button>
</template>
</TableHeader>
<div v-loading="tableStore.table.loading" class="main-container">
<vxe-table
class="full-height-table"
ref="tableRef"
auto-resize
:data="tableStore.table.data"
v-bind="defaultAttribute"
:height="tableHeight"
resizable
show-overflow
>
<vxe-column title="序号" width="80" type="seq" align="center"></vxe-column>
<vxe-column field="gdName" title="供电公司" align="center" min-width="120" ></vxe-column>
<vxe-column field="subStationName" :show-overflow="true" title="变电站" align="center" min-width="150"></vxe-column>
<vxe-column field="devName" title="终端名称" align="center" min-width="120"></vxe-column>
<!-- <vxe-column field="devType" title="终端型号" align="center" min-width="150"></vxe-column> -->
<!-- <vxe-column field="loginTime" title="投运时间" align="center" min-width="120"></vxe-column> -->
<vxe-column field="lineName" title="监测点名称" align="center" min-width="150" :formatter="formatMonitorId"></vxe-column>
<!-- <vxe-column field="powerFlag" title="监测位置" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="lineVoltage" title="监测点电压等级" align="center" min-width="120"></vxe-column> -->
<!-- <vxe-column field="loadType" title="干扰源类型" align="center" min-width="120"></vxe-column> -->
<!-- <vxe-column field="objName" title="监测对象名称" align="center" min-width="150" :formatter="formatMonitorId"></vxe-column> -->
<!-- <vxe-column field="interval" title="统计间隔" align="center" min-width="100" :formatter="formatMonitorId"></vxe-column> -->
<!-- <vxe-column field="onlineRate" title="在线率(%)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="integrity" title="完整率(%)" align="center" min-width="100"></vxe-column> -->
<vxe-column field="harmonicValue" :title="harmonicValueTitle" align="center" min-width="120"></vxe-column>
<!-- <vxe-column field="upCounts" title="暂升次数(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="downCounts" title="电压暂降(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="breakCounts" title="短时中断(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="monitorId" title="一类监测点" align="center" min-width="120" :formatter="formatMonitorId"></vxe-column> -->
</vxe-table>
</div>
<div v-loading="tableStore.table.loading" class="main-container">
<vxe-table
class="full-height-table"
ref="tableRef"
auto-resize
:data="tableStore.table.data"
v-bind="defaultAttribute"
:height="tableHeight"
resizable
show-overflow
>
<vxe-column title="序号" width="80" type="seq" align="center"></vxe-column>
<vxe-column field="gdName" title="供电公司" align="center" min-width="120"></vxe-column>
<vxe-column
field="subStationName"
:show-overflow="true"
title="变电站"
align="center"
min-width="150"
></vxe-column>
<vxe-column field="devName" title="终端名称" align="center" min-width="120"></vxe-column>
<!-- <vxe-column field="devType" title="终端型号" align="center" min-width="150"></vxe-column> -->
<!-- <vxe-column field="loginTime" title="投运时间" align="center" min-width="120"></vxe-column> -->
<vxe-column
field="lineName"
title="监测点名称"
align="center"
min-width="150"
:formatter="formatMonitorId"
></vxe-column>
<!-- <vxe-column field="powerFlag" title="监测位置" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="lineVoltage" title="监测点电压等级" align="center" min-width="120"></vxe-column> -->
<!-- <vxe-column field="loadType" title="干扰源类型" align="center" min-width="120"></vxe-column> -->
<!-- <vxe-column field="objName" title="监测对象名称" align="center" min-width="150" :formatter="formatMonitorId"></vxe-column> -->
<!-- <vxe-column field="interval" title="统计间隔" align="center" min-width="100" :formatter="formatMonitorId"></vxe-column> -->
<!-- <vxe-column field="onlineRate" title="在线率(%)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="integrity" title="完整率(%)" align="center" min-width="100"></vxe-column> -->
<vxe-column
field="harmonicValue"
:title="harmonicValueTitle"
align="center"
min-width="120"
></vxe-column>
<!-- <vxe-column field="upCounts" title="暂升次数(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="downCounts" title="电压暂降(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="breakCounts" title="短时中断(次)" align="center" min-width="100"></vxe-column> -->
<!-- <vxe-column field="monitorId" title="一类监测点" align="center" min-width="120" :formatter="formatMonitorId"></vxe-column> -->
</vxe-table>
</div>
<div class="pagination-container">
<el-pagination
:current-page="tableStore.table.params.pageNum"
:page-size="tableStore.table.params.pageSize"
:page-sizes="[10, 20, 50, 100,200]"
background
layout="sizes, total, prev, pager, next, jumper"
:total="tableStore.table.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
class="custom-pagination"/>
<div class="pagination-container">
<el-pagination
:current-page="tableStore.table.params.pageNum"
:page-size="tableStore.table.params.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
background
layout="sizes, total, prev, pager, next, jumper"
:total="tableStore.table.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
class="custom-pagination"
/>
</div>
</div>
</div>
</template>
<script setup lang="ts">
@@ -105,10 +123,10 @@ import { useDictData } from '@/stores/dictData'
import { debounce } from 'lodash-es'
const props = defineProps({
active: {
type: Boolean,
default: false
}
active: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['initialized'])
@@ -126,284 +144,287 @@ const searchKeyword = ref('')
const harmonicValueTitle = ref('谐波电压污染值')
const cascaderProps = {
label: 'name',
value: 'id',
checkStrictly: true,
emitPath: false
label: 'name',
value: 'id',
checkStrictly: true,
emitPath: false
}
interface PollutionItem {
gdName?: string
subStationName?: string
devName?: string
lineName?: string
powerFlag?: string
gdName?: string
subStationName?: string
devName?: string
lineName?: string
powerFlag?: string
}
const formatMonitorId = (row: any) => {
return row.cellValue || '/'
return row.cellValue || '/'
}
const handleSelectChange = (isExpanded: boolean) => {
if (isExpanded) {
tableHeight.value = tableHeight.value - 55
} else {
tableHeight.value = tableHeight.value + 55
}
if (isExpanded) {
tableHeight.value = tableHeight.value - 55
} else {
tableHeight.value = tableHeight.value + 55
}
}
const calculateTableHeight = () => {
const windowHeight = window.innerHeight
const headerHeight = 160
const paginationHeight = 120
const padding = 30
const calculatedHeight = windowHeight - headerHeight - paginationHeight - padding
tableHeight.value = Math.max(calculatedHeight, 300)
const windowHeight = window.innerHeight
const headerHeight = 160
const paginationHeight = 120
const padding = 30
const calculatedHeight = windowHeight - headerHeight - paginationHeight - padding
tableHeight.value = Math.max(calculatedHeight, 300)
}
const debouncedCalculateTableHeight = debounce(() => {
calculateTableHeight()
calculateTableHeight()
}, 300)
const filteredData = computed(() => {
let result = [...allData.value]
let result = [...allData.value]
if (selectedArea.value) {
let areaName = ''
let areaLevel = -1
const findAreaName = (areas: any[]) => {
for (const area of areas) {
if (area.id === selectedArea.value) {
areaName = area.name
areaLevel = area.level !== undefined ? area.level : -1
break
if (selectedArea.value) {
let areaName = ''
let areaLevel = -1
const findAreaName = (areas: any[]) => {
for (const area of areas) {
if (area.id === selectedArea.value) {
areaName = area.name
areaLevel = area.level !== undefined ? area.level : -1
break
}
if (area.children && area.children.length > 0) {
findAreaName(area.children)
}
}
}
if (area.children && area.children.length > 0) {
findAreaName(area.children)
findAreaName(areOptions)
if (areaName && areaLevel > 1) {
result = result.filter(item => item.gdName && item.gdName.includes(areaName))
}
}
}
findAreaName(areOptions)
if (areaName && areaLevel > 1) {
result = result.filter(item => item.gdName && item.gdName.includes(areaName))
if (tableStore.table.params.powerFlag === '1') {
result = result.filter(item => item.powerFlag && !item.powerFlag.includes('非'))
} else if (tableStore.table.params.powerFlag === '2') {
result = result.filter(item => item.powerFlag && item.powerFlag.includes('非'))
}
}
if (tableStore.table.params.powerFlag === '1') {
result = result.filter(item => item.powerFlag && !item.powerFlag.includes('非'))
} else if (tableStore.table.params.powerFlag === '2') {
result = result.filter(item => item.powerFlag && item.powerFlag.includes('非'))
}
if (searchKeyword.value) {
const keyword = searchKeyword.value.toLowerCase()
result = result.filter(
item =>
(item.subStationName && item.subStationName.toLowerCase().includes(keyword)) ||
(item.devName && item.devName.toLowerCase().includes(keyword)) ||
(item.lineName && item.lineName.toLowerCase().includes(keyword))
)
}
if (searchKeyword.value) {
const keyword = searchKeyword.value.toLowerCase()
result = result.filter(item =>
(item.subStationName && item.subStationName.toLowerCase().includes(keyword)) ||
(item.devName && item.devName.toLowerCase().includes(keyword)) ||
(item.lineName && item.lineName.toLowerCase().includes(keyword))
)
}
return result
return result
})
const currentPageData = computed(() => {
const pageSize = tableStore.table.params.pageSize
const pageNum = tableStore.table.params.pageNum
const start = (pageNum - 1) * pageSize
const end = start + pageSize
return filteredData.value.slice(start, end)
const pageSize = tableStore.table.params.pageSize
const pageNum = tableStore.table.params.pageNum
const start = (pageNum - 1) * pageSize
const end = start + pageSize
return filteredData.value.slice(start, end)
})
const updateTotal = computed(() => {
return filteredData.value.length
return filteredData.value.length
})
const tableStore = new TableStore({
url: '/harmonic-boot/PollutionSubstation/downPollutionLineCalc',
method: 'POST',
column: [],
beforeSearchFun: () => {
delete tableStore.table.params.deptIndex
delete tableStore.table.params.interval
delete tableStore.table.params.searchEndTime
delete tableStore.table.params.searchBeginTime
delete tableStore.table.params.timeFlag
},
loadCallback: () => {
allData.value = tableStore.table.data || []
tableStore.table.total = updateTotal.value
tableStore.table.data = currentPageData.value
},
resetCallback: () => {
clearQueryParams()
}
url: '/harmonic-boot/PollutionSubstation/downPollutionLineCalc',
method: 'POST',
column: [],
beforeSearchFun: () => {
delete tableStore.table.params.deptIndex
delete tableStore.table.params.interval
delete tableStore.table.params.searchEndTime
delete tableStore.table.params.searchBeginTime
delete tableStore.table.params.timeFlag
},
loadCallback: () => {
allData.value = tableStore.table.data || []
tableStore.table.total = updateTotal.value
tableStore.table.data = currentPageData.value
},
resetCallback: () => {
clearQueryParams()
}
})
provide('tableStore', tableStore)
watch(
() => areOptions,
(newOptions) => {
if (newOptions && newOptions.length > 0) {
selectedArea.value = newOptions[0].id
tableStore.table.params.id = newOptions[0].id
}
},
{ immediate: true }
() => areOptions,
newOptions => {
if (newOptions && newOptions.length > 0) {
selectedArea.value = newOptions[0].id
tableStore.table.params.id = newOptions[0].id
}
},
{ immediate: true }
)
watch(
() => options,
(newOptions) => {
if (newOptions && newOptions.length > 0) {
if (!tableStore.table.params.statisticalType) {
tableStore.table.params.statisticalType = newOptions[0]
tableStore.table.params.ids = [newOptions[0].id]
}
}
},
{ immediate: true }
() => options,
newOptions => {
if (newOptions && newOptions.length > 0) {
if (!tableStore.table.params.statisticalType) {
tableStore.table.params.statisticalType = newOptions[0]
tableStore.table.params.ids = [newOptions[0].id]
}
}
},
{ immediate: true }
)
tableStore.table.params.powerFlag = "0"
tableStore.table.params.powerFlag = '0'
tableStore.table.params.isUpToGrid = 0
tableStore.table.params.type = 1
const handleStatisticalTypeChange = (newVal: { id: any }) => {
console.log("🚀 ~ handleStatisticalTypeChange ~ newVal:", newVal)
if (newVal) {
tableStore.table.params.statisticalType = newVal
tableStore.table.params.ids = [newVal.id]
if (newVal.name) {
harmonicValueTitle.value = newVal.name + '污染值'
console.log('🚀 ~ handleStatisticalTypeChange ~ newVal:', newVal)
if (newVal) {
tableStore.table.params.statisticalType = newVal
tableStore.table.params.ids = [newVal.id]
if (newVal.name) {
harmonicValueTitle.value = newVal.name + '污染值'
}
}
}
// 重新调用接口
tableStore.index()
// 重新调用接口
tableStore.index()
}
const handleFilterChange = () => {
tableStore.table.params.pageNum = 1
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
tableStore.table.params.pageNum = 1
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
}
const handleSizeChange = (val: number) => {
tableStore.table.params.pageSize = val
tableStore.table.params.pageNum = 1
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
tableStore.table.params.pageSize = val
tableStore.table.params.pageNum = 1
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
}
const handleCurrentChange = (val: number) => {
tableStore.table.params.pageNum = val
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
tableStore.table.params.pageNum = val
tableStore.table.data = currentPageData.value
tableStore.table.total = updateTotal.value
}
const exportEvent = () => {
const allFilteredData = filteredData.value
tableRef.value.exportData({
filename: '监测点评估-污染值报告',
sheetName: 'Sheet1',
type: 'xlsx',
useStyle: true,
data: allFilteredData,
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0)
}
})
const allFilteredData = filteredData.value
tableRef.value.exportData({
filename: '监测点评估-污染值报告',
sheetName: 'Sheet1',
type: 'xlsx',
useStyle: true,
data: allFilteredData,
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0)
}
})
}
onMounted(() => {
if (props.active) {
tableStore.index()
emit('initialized', 'pollutionReport')
}
calculateTableHeight()
window.addEventListener('resize', debouncedCalculateTableHeight)
if (props.active) {
tableStore.index()
emit('initialized', 'pollutionReport')
}
calculateTableHeight()
window.addEventListener('resize', debouncedCalculateTableHeight)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', debouncedCalculateTableHeight)
window.removeEventListener('resize', debouncedCalculateTableHeight)
})
const clearQueryParams = () => {
// 将区域恢复成第一层
if (areOptions && areOptions.length > 0) {
selectedArea.value = areOptions[0].id
tableStore.table.params.id = areOptions[0].id
}
// 将区域恢复成第一层
if (areOptions && areOptions.length > 0) {
selectedArea.value = areOptions[0].id
tableStore.table.params.id = areOptions[0].id
}
// 清空搜索关键词
searchKeyword.value = ''
// 清空搜索关键词
searchKeyword.value = ''
}
defineExpose({
refresh: () => {
// 清空查询参数
clearQueryParams()
tableHeaderRef.value.setTheDate(3)
tableStore.index()
}
refresh: (name?: any) => {
// 清空查询参数
clearQueryParams()
tableHeaderRef.value.setTheDate(3)
if (name) {
searchKeyword.value = name
}
tableStore.index()
}
})
</script>
<style scoped>
.pagination-container {
border: 1px solid #ebeef5;
border-top: none;
padding: 10px;
margin: 0 0 5px 0;
background-color: #fff;
border: 1px solid #ebeef5;
border-top: none;
padding: 10px;
margin: 0 0 5px 0;
background-color: #fff;
}
:deep(.custom-pagination) {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
:deep(.custom-pagination .el-pagination__sizes) {
margin-right: 10px;
margin-right: 10px;
}
:deep(.custom-pagination .el-pagination__total) {
margin-right: auto;
margin-right: auto;
}
:deep(.custom-pagination .el-pagination__jump) {
margin-left: 20px;
margin-left: 20px;
}
/* 响应式处理 */
@media screen and (max-width: 768px) {
:deep(.custom-pagination) {
flex-direction: column;
align-items: stretch;
}
:deep(.custom-pagination) {
flex-direction: column;
align-items: stretch;
}
:deep(.custom-pagination .el-pagination__total) {
margin-right: 0;
order: 1;
margin-top: 10px;
}
:deep(.custom-pagination .el-pagination__total) {
margin-right: 0;
order: 1;
margin-top: 10px;
}
:deep(.custom-pagination .el-pagination__sizes) {
order: 2;
}
:deep(.custom-pagination .el-pagination__sizes) {
order: 2;
}
:deep(.custom-pagination .btn-prev),
:deep(.custom-pagination .el-pager),
:deep(.custom-pagination .btn-next),
:deep(.custom-pagination .el-pagination__jump) {
order: 3;
justify-content: center;
margin-top: 10px;
}
:deep(.custom-pagination .btn-prev),
:deep(.custom-pagination .el-pager),
:deep(.custom-pagination .btn-next),
:deep(.custom-pagination .el-pagination__jump) {
order: 3;
justify-content: center;
margin-top: 10px;
}
}
</style>

View File

@@ -85,7 +85,7 @@ const tableStore = new TableStore({
publicHeight: 65,
isWebPaging: true,
method: 'POST',
filename: '监测点台账',
filename: '区域级评估',
column: [
{
title: '序号',

View File

@@ -79,7 +79,7 @@ const tableStore = new TableStore({
publicHeight: 65,
isWebPaging: true,
method: 'POST',
filename: '监测点台账',
filename: '敏感及重要用户评估',
column: [
{
title: '序号',

View File

@@ -12,7 +12,7 @@
<regionalAssessment v-if="activeTab == '3'" />
</el-tab-pane>
<el-tab-pane label="敏感及重要用户评估" name="4">
<userEvaluation v-if="activeTab == '4'" />
<userEvaluation ref="userEvaluationRef" v-if="activeTab == '4'" />
</el-tab-pane>
</el-tabs>
</div>
@@ -33,7 +33,7 @@ defineOptions({
const activeTab = ref('pollutionReport')
const monitoringPointTabRef = ref()
const substationTabRef = ref()
const userEvaluationRef = ref()
const handleTabChange = (tabName: string) => {
if (tabName === 'pollutionReport' && monitoringPointTabRef.value) {
monitoringPointTabRef.value.refresh()
@@ -47,11 +47,21 @@ watch(
if (route.fullPath.includes('harmonic-boot/qydetailedAnalysis/pollutionReport')) {
let type = (route.query.type as string) || 'null'
if (type == 'null') {
} else if (type == '1') {
activeTab.value = 'pollutionReport'
setTimeout(() => {
monitoringPointTabRef.value.refresh((route.query.name as string) || 'null')
}, 500)
} else if (type == '2') {
activeTab.value = 'anotherReport'
substationTabRef.value.refresh((route.query.statisticalType as string) || 'null')
setTimeout(() => {
substationTabRef.value.refresh((route.query.statisticalType as string) || 'null')
}, 500)
} else if (type == '4') {
activeTab.value = '4'
setTimeout(() => {
userEvaluationRef.value.setSearchValue((route.query.name as string) || '')
}, 500)
}
}
},

View File

@@ -494,10 +494,10 @@ watch(
let type = (route.query.type as string) || 'null'
if (type == 'null') {
} else if (type == '1') {
nextTick(() => {
setTimeout(() => {
tableStore.table.params.searchValue = (route.query.name as string) || ''
tableStore.index()
})
tableStore.index()
}, 500)
}
}
},

View File

@@ -152,11 +152,7 @@
<vxe-column type="seq" title="序号" width="80px">
<template #default="{ rowIndex }">
<span>
{{
(pageNum - 1) * pageSize +
rowIndex +
1
}}
{{ (pageNum - 1) * pageSize + rowIndex + 1 }}
</span>
</template>
</vxe-column>
@@ -488,10 +484,10 @@ watch(
let type = (route.query.type as string) || 'null'
if (type == 'null') {
} else if (type == '1') {
nextTick(() => {
setTimeout(() => {
tableStore.table.params.searchValue = (route.query.name as string) || ''
tableStore.index()
})
tableStore.index()
}, 500)
}
}
},

View File

@@ -35,7 +35,7 @@
<el-tab-pane label="谐波频谱" name="4" lazy v-if="!isReload">
<Xiebopingpu v-if="activeName == '4'" />
</el-tab-pane>
<el-tab-pane label="告警数据统计" name="5" lazy v-if="!isReload ">
<el-tab-pane label="告警数据统计" name="5" lazy v-if="!isReload && VITE_FLAG">
<Gaojingshujutongji v-if="activeName == '5'" />
</el-tab-pane>
<el-tab-pane label="监测点运行状态" name="6" lazy v-if="!isReload">
@@ -64,7 +64,7 @@ import { defineOptions, watch, onMounted, ref, nextTick } from 'vue'
import 'splitpanes/dist/splitpanes.css'
import { Splitpanes, Pane } from 'splitpanes'
import PointTree from '@/components/tree/pqs/pointTree.vue'
import { useMonitoringPoint } from '@/stores/monitoringPoint'
import { mainHeight } from '@/utils/layout'
import Wentaizonghepinggu from './wentaizonghepinggu/index.vue'
import Wentaizhibiaohegelv from './wentaizhibiaohegelv/index.vue'
@@ -77,7 +77,8 @@ import { useRoute } from 'vue-router'
import StatisticalReport from './statisticalReport/index.vue'
const VITE_FLAG = import.meta.env.VITE_NAME == 'jibei'
import router from '@/router'
import { useMonitoringPoint } from '@/stores/monitoringPoint'
import { id } from 'element-plus/es/locale'
defineOptions({
name: 'harmonic-boot/monitor/online'
})
@@ -140,19 +141,42 @@ watch(
if (route.fullPath.includes('harmonic-boot/monitor/online')) {
let type = (route.query.type as string) || 'null'
let lineId = (route.query.id as string) || 'null'
console.log('🚀 ~ type:', type)
if (type == 'null') {
} else {
setTimeout(() => {
monitoringPoint.setValue('lineId', lineId)
//
// pointTree.value.tree
activeName.value = type
setTimeout(() => {
pointTree.value.scrollToNode(lineId)
monitoringPoint.setValue('lineName', findNodeByTreeId(pointTree.value.tree, lineId).alias)
}, 500)
}, 1000)
}
}
},
{ deep: true, immediate: true }
)
// 递归函数(同上)
const findNodeByTreeId = (treeData: any, id: any) => {
for (const node of treeData) {
if (node.id == id) return node
if (node.children && Array.isArray(node.children) && node.children.length) {
const found: any = findNodeByTreeId(node.children, id)
if (found) return found
}
}
return null
}
// 调用示例
const getTargetNode = () => {
const targetId = '9b7adecf588b4110acb7018f297592a7'
const node = findNodeByTreeId(treeData.value, targetId)
console.log('Vue中找到的节点', node)
}
const changeTab = (e: string) => {
activeName.value = e
}

View File

@@ -140,11 +140,11 @@ const exportReport = () => {
loading.value = true
let form = new FormData()
form.append('isUrl', false)
form.append('lineIndex', dotList.value.id)
form.append('lineIndex', monitoringPoint.state.lineId)
form.append('startTime', TableHeaderRef.value.datePickerRef.timeValue[0])
form.append('endTime', TableHeaderRef.value.datePickerRef.timeValue[1])
form.append('type', 0)
form.append('name', dotList.value.name)
form.append('name', monitoringPoint.state.lineName.split('>').pop())
ElMessage({
message: '下载报告中,请稍等.....',
duration: 1000
@@ -159,7 +159,7 @@ const exportReport = () => {
const link = document.createElement('a') // 创建a标签
link.href = url
link.download =
dotList.value.name +
monitoringPoint.state.lineName.split('>').pop() +
TableHeaderRef.value.datePickerRef.timeValue[0] +
'_' +
TableHeaderRef.value.datePickerRef.timeValue[1] // 设置下载的文件名

View File

@@ -1,15 +1,16 @@
<template>
<!-- 综合评估详情 -->
<el-dialog draggable title="区域污染水平评估" v-model="dialogVisible" width="1400px">
<el-dialog draggable title="稳态电能质量水平评估" v-model="dialogVisible" width="1400px">
<div style="display: flex">
<div style="width: 400px">
<vxe-table
v-bind="defaultAttribute"
ref="tableRef"
@current-change="currentChangeEvent"
@cell-click="currentChangeEvent"
height="250px"
:row-config="{ isCurrent: true, isHover: true }"
:data="tableData"
style="cursor: pointer"
>
<vxe-column field="deptName" title="地市" />
<vxe-column field="score" title="污染值" sortable>
@@ -26,7 +27,15 @@
</vxe-table>
</div>
<div class="ml10" style="width: 990px">
<vxe-table v-bind="defaultAttribute" v-loading="loadingTab" ref="vxeRef" height="250px" :data="subdata">
<vxe-table
v-bind="defaultAttribute"
@cell-click="clickAttribute"
v-loading="loadingTab"
ref="vxeRef"
height="250px"
:data="subdata"
style="cursor: pointer"
>
<vxe-column type="seq" width="70" title="序号"></vxe-column>
<vxe-column field="subName" title="变电站名称" min-width="120"></vxe-column>
<vxe-column field="lineName" title="监测点名称" align="center" min-width="120"></vxe-column>
@@ -59,7 +68,7 @@
</el-radio-group>
</div> -->
<MyEChart style="height: 300px" :options="picEChart" @echartClick="echartClick"/>
<MyEChart style="height: 300px" :options="picEChart" @echartClick="echartClick" />
</div>
</el-dialog>
</template>
@@ -121,7 +130,7 @@ const analysis = () => {
name: '',
data: first10Items.map((item: any) => item.projectName.split('(')[0].trim()),
axisLabel: {
rotate: 30 // 核心:倾斜 45 度(推荐 30/45/60角度太大易读性差
rotate: 20 // 核心:倾斜 45 度(推荐 30/45/60角度太大易读性差
}
},
grid: {
@@ -171,16 +180,25 @@ const setColor = val => {
? '#00B07D'
: ''
}
const echartClick = (res:any) => {
router.push({
const echartClick = (res: any) => {
router.push({
name: 'harmonic-boot/qydetailedAnalysis/pollutionReport',
query: {
type: '4',
name: res.name,
t: Date.now()
}
})
}
const clickAttribute = (row: any) => {
router.push({
name: 'harmonic-boot/qydetailedAnalysis/pollutionReport',
query: {
type: '1',
name: row.row.lineName,
t: Date.now()
}
})
console.log("🚀 ~ echartClick ~ res:", res)
}
defineExpose({ open })
</script>

View File

@@ -2,9 +2,16 @@
<div class="propInfo" v-if="show">
<div class="top">
<el-form :inline="false" label-width="auto">
<el-form-item label=" 筛选:">
<el-form-item label=" 筛选数据">
<el-input v-model="value" size="small" clearable placeholder="请输入关键字进行筛选"></el-input>
</el-form-item>
<!-- <el-form-item label="电网标志">
<el-select v-model="powerFlag" placeholder="请选择电网标志">
<el-option label="全部" value="0"></el-option>
<el-option label="电网侧" value="1"></el-option>
<el-option label="非电网侧" value="2"></el-option>
</el-select>
</el-form-item> -->
</el-form>
<Close class="ico" @click="show = false" />
</div>
@@ -19,8 +26,8 @@
v-loading="loading"
:row-config="{ isCurrent: true, isHover: true }"
:columnConfig="{ resizable: true }"
@current-change="currentChangeEvent"
style="z-index: 0;"
@cell-click="currentChangeEvent"
style="z-index: 0"
>
<vxe-column type="seq" title="序号" width="70px"></vxe-column>
<vxe-column field="gdName" title="供电公司"></vxe-column>
@@ -28,6 +35,11 @@
<!-- <vxe-column field="deviceName" title="终端名称"></vxe-column> -->
<!-- <vxe-column field="ip" title="IP"></vxe-column> -->
<vxe-column field="lineName" title="监测点名称"></vxe-column>
<vxe-column field="powerFlag" title="电网标志">
<template #default="{ row }">
{{ row.powerFlag == 0 ? '电网侧' : '非电网侧' }}
</template>
</vxe-column>
<!-- <vxe-column field="loadType" title="干扰源"></vxe-column> -->
<vxe-column field="loadType" title="干扰源类型"></vxe-column>
<vxe-column field="objName" title="监测对象"></vxe-column>
@@ -40,9 +52,10 @@ import { defaultAttribute } from '@/components/table/defaultAttribute'
import { Close } from '@element-plus/icons-vue'
const emit = defineEmits(['flyTo'])
const value = ref('')
const tableRef=ref()
const tableRef = ref()
const dataList = ref([])
const loading = ref(false)
const powerFlag = ref('0')
const open = (data: any) => {
dataList.value = []
loading.value = true
@@ -99,11 +112,11 @@ function filterDataByKeyword(data, keyword) {
})
})
}
const currentChangeEvent=()=>{
const currentChangeEvent = () => {
// tableRef.value.getCurrentRecord()
console.log("🚀 ~ currentChangeEvent ~ tableRef.value.getCurrentRecord():", tableRef.value.getCurrentRecord())
let data=tableRef.value.getCurrentRecord()
emit('flyTo',{ coordinate: [data.lng, data.lat] }, 16)
console.log('🚀 ~ currentChangeEvent ~ tableRef.value.getCurrentRecord():', tableRef.value.getCurrentRecord())
let data = tableRef.value.getCurrentRecord()
emit('flyTo', { coordinate: [data.lng, data.lat] }, 16)
}
const show = ref(false)

View File

@@ -496,7 +496,7 @@ const jump = () => {
name: 'harmonic-boot/qydetailedAnalysis/pollutionReport',
query: {
type: '2',
statisticalType:contaminate.value,
statisticalType: contaminate.value,
t: Date.now()
}
})
@@ -536,5 +536,7 @@ defineExpose({ open })
.text-style {
cursor: pointer;
text-decoration: underline;
text-decoration-color: var(--el-color-primary);
text-underline-offset: 4px;
}
</style>

View File

@@ -1,7 +1,14 @@
<!-- 暂态 -->
<template>
<el-dialog draggable :title="title" v-model="dialogVisible" width="800px">
<vxe-table v-bind="defaultAttribute" ref="vxeRef" height="360px" :data="tableData">
<vxe-table
v-bind="defaultAttribute"
ref="vxeRef"
height="360px"
:data="tableData"
@cell-click="currentChangeEvent"
style="cursor: pointer;"
>
<vxe-column title="序号" width="70" type="seq"></vxe-column>
<vxe-column field="lineName" title="监测点名称" />
<vxe-column field="subName" title="变电站名称"></vxe-column>
@@ -16,6 +23,8 @@ import MyEChart from '@/components/echarts/MyEchart.vue'
import { useDictData } from '@/stores/dictData'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { getEventDetailByList } from '@/api/device-boot/panorama'
import { useRouter } from 'vue-router'
const router = useRouter()
const dictData = useDictData()
const dialogVisible: any = ref(false)
const list = dictData.getBasicData('Event_Statis')
@@ -30,6 +39,19 @@ const open = async (row: any, name: string, type: string) => {
dialogVisible.value = true
}
const currentChangeEvent = (row: any) => {
router.push({
name: 'Descentsystem/transientList',
query: {
type: '1',
name:row.row.lineName,
dicData: types.value,
t: Date.now()
}
})
}
// 跳转暂态列表
// 查看详情
defineExpose({ open })

View File

@@ -5,9 +5,9 @@
<template #content>
<span style="">{{ dropList.gdName }}_{{ dropList.bdName }}_{{ dropList.lineName }}</span>
<span style="font-weight: 500" class="ml20">最新数据时间</span>
<span style="color: var(--color-primary-default)">{{ dropList.updateTime }}</span>
<span style="color: var(--el-color-primary)">{{ dropList.updateTime }}</span>
<span style="font-weight: 500" class="ml20">统计日期</span>
<span style="color: var(--color-primary-default)">
<span style="color: var(--el-color-primary)">
{{ getTimeOfTheMonth('3')[0] + '至' + getTimeOfTheMonth('3')[1] }}
</span>
</template>
@@ -88,7 +88,7 @@
</el-descriptions>
</el-col>
<el-col :span="8">
<h3 class="mb10 iconBox text-style" @click="clickAlarm(8)" >
<h3 class="mb10 iconBox text-style" @click="clickAlarm(8)">
<span></span>
告警明细
</h3>
@@ -107,11 +107,11 @@
<vxe-column field="xz" title="最大限值"></vxe-column>
</vxe-table> -->
<el-table :data="evaluationData" size="small" border>
<el-table :data="evaluationData.filter((item) => item.avg != 3.14159)" height="200px" size="small" border>
<el-table-column prop="targetName" align="center" label="指标名称" />
<el-table-column prop="avg" align="center" label="最大幅值">
<el-table-column prop="avg" align="center" label="最大越限幅值">
<template #default="{ row }">
{{ row.avg == 3.14159 ? '/' : Math.floor(row.avg * 100) / 100 }}
{{ Math.floor(row.avg * 100) / 100 }}
</template>
</el-table-column>
<el-table-column prop="xz" align="center" label="限值">
@@ -190,7 +190,6 @@ import {
} from '@/api/device-boot/panorama'
import { formatter } from 'element-plus'
const emit = defineEmits(['back'])
const dropList: any = ref({})
const TargetData: any = ref({})
@@ -382,8 +381,7 @@ const open = async (id: string) => {
searchBeginTime: datePickerRef.value.timeValue[0],
searchEndTime: datePickerRef.value.timeValue[1],
searchState: 0,
lineRunFlag: 0,
lineRunFlag: 0
}).then((res: any) => {
// dropList.value.assessData = res.data.assessLevel
evaluationData.value = [
@@ -398,19 +396,40 @@ const open = async (id: string) => {
xz: res.data.vdevLimit
},
{
targetName: '电压总谐波畸变率',
avg: res.data.udevData,
xz: res.data.uaberranceLimit
targetName: '谐波电流',
avg: res.data.iharmData,
xz: res.data.iharmLimit
},
{
targetName: '三相电压不平衡度',
avg: res.data.unbalanceData,
xz: res.data.unbalanceLimit
targetName: '负序电流',
avg: res.data.inegData,
xz: res.data.inegLimit
},
{
targetName: '间谐波电压',
avg: res.data.inuharmData,
xz: res.data.inuharmLimit
},
{
targetName: '电压总谐波畸变率',
avg: res.data.uaberranceData,
xz: res.data.uaberranceLimit
},
{
targetName: '闪变',
avg: res.data.flickerData,
xz: res.data.flickerLimit
},
{
targetName: '谐波电压',
avg: res.data.uharmData,
xz: res.data.uharmLimit
},
{
targetName: '三相电压不平衡度',
avg: res.data.unbalanceData,
xz: res.data.unbalanceLimit
}
]
})
@@ -770,7 +789,7 @@ defineExpose({ open })
.iconBox {
display: flex;
align-items: center;
align-items: center;
span {
display: inline-block;
width: 3px;
@@ -808,5 +827,7 @@ align-items: center;
.text-style {
cursor: pointer;
text-decoration: underline;
text-decoration-color: var(--el-color-primary);
text-underline-offset: 4px;
}
</style>

View File

@@ -118,7 +118,7 @@
{{ linList[0].lineNumOne || 0 }}
</span>
告警:
<span style="color: #a52a2a" @click="LookMap(linList[0].lineListOne, [], 0)">
<span style="color: #a52a2a" @click="LookMap(linList[0].lineListTwo, [], 1)">
{{ linList[0].lineNumTwo || 0 }}
</span>
)

View File

@@ -4,34 +4,7 @@
<!-- 综合评估 -->
<div style="height: 110px">
<div class="title">
<span>
区域污染水平评估
<el-popover placement="right" :width="190" trigger="hover">
<template #reference>
<WarningFilled class="WarningFilled" />
</template>
<div class="text">
<span style="color: #00b07d">无污染0</span>
<br />
<span style="color: #3399ff">轻微污染(0 , 100]</span>
<br />
<span style="color: #ffcc33">轻度污染(100 , 1000]</span>
<br />
<span style="color: #ff9900">中度污染(1000 , 10000]</span>
<br />
<span style="color: #a52a2a">重度污染(10000</span>
</div>
</el-popover>
<el-switch
v-model="heat"
class="ml5"
@change="changeHeat"
size="small"
inline-prompt
active-text="热力图"
inactive-text="热力图"
/>
</span>
<span>稳态电能质量水平评估</span>
<span class="info" @click="open(0)">
详情
<ArrowRight style="width: 12px" />
@@ -41,29 +14,33 @@
<img src="@/assets/img/FGX.png" />
</div>
<div class="mt10 TJTop">
<!-- <img src="@/assets/img/TJ.png" />
综合评估得分
<span
:style="{
color:
assessList.score == 3.14159
? ''
: assessList.score > 4.5
? '#339966'
: assessList.score > 4
? '#2b7fd3'
: assessList.score > 3
? '#ffcc33'
: assessList.score > 2
? '#97017e'
: assessList.score > 0
? '#A52a2a'
: ''
}"
>
{{ assessList.score == 3.14159 ? '/' : assessList.score }}
</span> -->
<img src="@/assets/img/TJ.png" />
区域污染水平评估
<el-popover placement="right" :width="190" trigger="hover">
<template #reference>
<WarningFilled class="WarningFilled ml5 " />
</template>
<div class="text">
<span style="color: #00b07d">无污染0</span>
<br />
<span style="color: #3399ff">轻微污染(0 , 100]</span>
<br />
<span style="color: #ffcc33">轻度污染(100 , 1000]</span>
<br />
<span style="color: #ff9900">中度污染(1000 , 10000]</span>
<br />
<span style="color: #a52a2a">重度污染(10000</span>
</div>
</el-popover>
<el-switch
v-model="heat"
class="ml5"
@change="changeHeat"
size="small"
inline-prompt
active-text="热力图"
inactive-text="热力图"
/>
</div>
<div class="evaluate">
<div v-for="item in assessList" style="min-width: 60px">
@@ -89,16 +66,16 @@
</div>
<!-- 稳态电能质量水平评估 -->
<div>
<div class="title">
<!-- <div class="title">
<span>稳态电能质量水平评估</span>
<span class="info" @click="open(1)">
详情
<ArrowRight style="width: 12px" />
</span>
</div>
<div style="display: flex" class="mt2">
</div> -->
<!-- <div style="display: flex" class="mt2">
<img src="@/assets/img/FGX.png" />
</div>
</div> -->
<div :style="boxHeight" class="boxR">
<div class="top">
<div class="TJTop">
@@ -386,10 +363,10 @@ const open = (e: number) => {
techniqueRef.value.open(formRow.value)
}
}
const changeHeat = (e:any) => {
const changeHeat = (e: any) => {
emit('changeHeat', e)
}
const setColor = (val:any) => {
const setColor = (val: any) => {
return val == 3.14159
? ''
: val > 10000
@@ -404,7 +381,7 @@ const setColor = (val:any) => {
? '#00B07D'
: ''
}
const setVal = (val:any) => {
const setVal = (val: any) => {
return val == 3.14159
? '/'
: val > 10000
@@ -511,14 +488,15 @@ defineExpose({ info, show })
cursor: pointer;
color: #757575;
}
.WarningFilled {
width: 12px;
font-weight: 500;
cursor: pointer;
}
}
.WarningFilled {
width: 12px;
font-weight: 500;
cursor: pointer;
}
.TJTop {
display: flex;
align-items: center;
img {
height: 1.2rem;
width: 1.2rem;
@@ -526,7 +504,7 @@ defineExpose({ info, show })
}
}
.evaluate {
margin: 10px 0;
margin: 5px 0 10px 0;
display: flex;
justify-content: space-around;
text-align: center;

View File

@@ -115,10 +115,10 @@ const changeValue = (e: any) => {
}
// 热力图开关
const changeHeat = (e: boolean) => {
console.log("🚀 ~ changeHeat ~ e:", e)
console.log('🚀 ~ changeHeat ~ e:', e)
mapRef.value.changeHeat(e)
if(e){
if (e) {
mapRef.value.flyTo({ coordinate: [116.84428600000001, 40.57707185292256] }, 6.409267680647425)
}
}
@@ -218,9 +218,10 @@ const reset = () => {
changeValue({ data: dictData.state.area[0] })
}
onMounted(() => {
// info()
changeValue({ data: dictData.state.area[0] })
// aaa()
nextTick(() => {
// datePickerRef.value.setTheDate(1)
changeValue({ data: dictData.state.area[0] })
})
})
</script>

View File

@@ -3,10 +3,10 @@
<splitpanes style="height: 100%" class="default-theme" id="navigation-splitpanes">
<pane :size="size">
<AssessTree
ref="AssessTreeRef"
:default-expand-all="false"
@node-click="handleNodeClick"
@init="handleNodeClick"
ref="assessTreeRef"
:highlight-current="true"
:current-node-key="currentTreeKey"
:expand-on-click-node="false"
@@ -263,7 +263,7 @@ onMounted(() => {
})
// 添加树组件的引用
const assessTreeRef = ref<any>(null)
const AssessTreeRef = ref()
// 控制树组件当前高亮的节点key
const currentTreeKey = ref<string | number | null>(null)
// 保存上一次真正有效的节点key子节点
@@ -308,6 +308,44 @@ const handleNodeClick = (data: any, node: any) => {
infoLoading.value = true
outcomeLoading.value = true
}
const setId = (id: any) => {
setTimeout(() => {
lastValidNodeKey.value = id
currentTreeKey.value = lastValidNodeKey.value
dotList.value = findNodeByTreeId(AssessTreeRef.value?.tree, id)?.name || {}
currentNodeName.value = findNodeByTreeId(AssessTreeRef.value?.tree, id)?.name || '' //data?.name || ''
currentNodeId.value = id
AssessTreeRef.value?.scrollToNode(id)
}, 100)
}
/**
* 递归查找树形结构中匹配treeId的节点对象
* @param {Array} treeData - 树形结构数据(数组)
* @param {string} targetTreeId - 要查找的treeId
* @returns {object|null} 匹配的节点对象未找到返回null
*/
const findNodeByTreeId = (treeData: any, id: any) => {
// 遍历每一个顶层节点
for (const node of treeData) {
// 1. 当前节点匹配,直接返回
if (node.id === id) {
return node
}
// 2. 当前节点有子节点,递归查找子节点
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
const foundNode: any = findNodeByTreeId(node.children, id)
// 子节点中找到则返回(终止递归)
if (foundNode) {
return foundNode
}
}
}
// 遍历完所有节点未找到返回null
return null
}
defineExpose({
setId
})
</script>
<style lang="scss" scoped>
.splitpanes.default-theme .splitpanes__pane {

View File

@@ -110,10 +110,10 @@
<el-collapse-item title="谐波电流/电压评估结果" :name="4">
<div class="flickerWaves" style="height: 520px">
<vxe-table :data="harmonicCurrents" height="520px" v-bind="defaultAttribute" :cell-class-name="getCellClassName3" style="width: 50%">
<vxe-column title="谐波次数" field="name" />
<vxe-column title="谐波次数" field="name" width="90px"/>
<vxe-colgroup title="电容器谐波电流评估值(A)">
<vxe-column field="notInvested" title="未投入" min-width="160px" />
<vxe-column field="hasInvested" title="已投入" min-width="160px" />
<vxe-column field="notInvested" title="未投入" />
<vxe-column field="hasInvested" title="已投入" />
</vxe-colgroup>
<vxe-column title="国标限值(%)" field="limitData" />
<vxe-column title="判断">
@@ -131,10 +131,10 @@
:cell-class-name="getCellClassName3"
style="width: 50%"
>
<vxe-column title="谐波次数" field="name" />
<vxe-column title="谐波次数" field="name" width="90px"/>
<vxe-colgroup title="电容器谐波电压评估值(%)">
<vxe-column field="notInvested" title="未投入" min-width="160px" />
<vxe-column field="hasInvested" title="已投入" min-width="160px" />
<vxe-column field="notInvested" title="未投入" />
<vxe-column field="hasInvested" title="已投入" />
</vxe-colgroup>
<vxe-column title="国标限值(A)" field="limitData" />
<vxe-column title="判断">

View File

@@ -1,20 +1,39 @@
<template>
<div class="default-main">
<el-tabs type="border-card" v-model="activeName">
<el-tab-pane label="评估用户维护" name="1"><User v-if="activeName == '1'"/></el-tab-pane>
<el-tab-pane label="用户二级评估" name="2"><Assess v-if="activeName == '2'"/></el-tab-pane>
<el-tab-pane label="参数字典维护" name="3"><Dictionary v-if="activeName == '3'"/></el-tab-pane>
<el-tab-pane label="评估用户维护" name="1"><User v-if="activeName == '1'" /></el-tab-pane>
<el-tab-pane label="用户二级评估" name="2"><Assess ref="AssessRef" v-if="activeName == '2'" /></el-tab-pane>
<el-tab-pane label="参数字典维护" name="3"><Dictionary v-if="activeName == '3'" /></el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { ref, reactive, watch } from 'vue'
import User from '@/views/pqs/runManage/assessment/components/uese/index.vue'
import Assess from '@/views/pqs/runManage/assessment/components/assess/index.vue'
import Dictionary from '@/views/pqs/runManage/assessment/components/dictionary/index.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
defineOptions({
name: 'runManage/assessment'
})
const AssessRef = ref()
const activeName = ref('1')
watch(
() => route.query.t,
async (newValue, oldValue) => {
if (route.fullPath.includes('runManage/assessment')) {
let type = (route.query.type as string) || 'null'
if (type == 'null') {
} else if (type == '2') {
activeName.value = '2'
setTimeout(() => {
AssessRef.value.setId((route.query.secondAssessmentId as string) || '')
}, 500)
}
}
},
{ deep: true, immediate: true }
)
</script>
<style lang="scss" scoped></style>

View File

@@ -56,6 +56,7 @@ import { cancelFormData, getUserReportById } from '@/api/supervision-boot/interf
import { ElMessage, ElMessageBox } from 'element-plus'
import { useAdminInfo } from '@/stores/adminInfo'
import { deleteUserReport } from '@/api/supervision-boot/delete/index'
//获取登陆用户姓名和部门
const adminInfo = useAdminInfo()
const dictData = useDictData()
@@ -76,7 +77,7 @@ const tableStore = new TableStore({
url: '/supervision-boot/userReport/getUserReport',
publicHeight: 65,
method: 'POST',
filename:'未建档用户档案录入管理',
filename: '未建档用户档案录入管理',
column: [
{
width: '60',
@@ -232,6 +233,26 @@ const tableStore = new TableStore({
click: row => {
cancelLeave(row)
}
},
{
name: 'cancel',
title: '二级评估',
type: 'primary',
icon: 'el-icon-Open',
render: 'basicButton',
disabled: row => {
return row.secondAssessmentId == null
},
click: row => {
push({
name: 'runManage/assessment',
query: {
type: '2',
secondAssessmentId:row.secondAssessmentId,
t: Date.now()
}
})
}
}
]
}

View File

@@ -166,10 +166,17 @@ watch(
let type = (route.query.type as string) || 'null'
if (type == 'null') {
} else if (type == '1') {
setTimeout(() => {
tableStore.table.params.searchValue = (route.query.name as string) || ''
setTimeout(() => {
tableStore.table.params.searchValue = (route.query.name as string) || ''
if (route.query.dicData) {
tableStore.table.params.dicData = triggerType.filter(item =>
item.name.includes(route.query.dicData as string)
)[0]?.id
} else {
tableStore.table.params.dicData = ''
}
tableStore.index()
},500)
}, 500)
}
}
},