测试问题整改

This commit is contained in:
GGJ
2024-11-07 15:23:04 +08:00
parent 6e9dd840db
commit a4b6bb111b
26 changed files with 33153 additions and 4358 deletions

View File

@@ -63,7 +63,35 @@ export function getLineInfoById(data:any) {
}
export function getLineRank(data:any) {
return request({
url: 'harmonic-boot/PollutionSubstation/getLineRank',
url: '/harmonic-boot/PollutionSubstation/getLineRank',
method: 'post',
data: data
})
}
export function deptInfo(data:any) {
return request({
url: '/harmonic-boot/detailAnalysis/deptInfo',
method: 'post',
data: data
})
}
export function getXbLineInfoById(data:any) {
return request({
url: '/harmonic-boot/detailAnalysis/getXbLineInfoById',
method: 'post',
data: data
})
}
export function getSubInfoById(data:any) {
return request({
url: '/harmonic-boot/detailAnalysis/getSubInfoById',
method: 'post',
data: data
})
}
export function getXbLineRank(data:any) {
return request({
url: '/harmonic-boot/detailAnalysis/getXbLineRank',
method: 'post',
data: data
})

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@ const { push, options, currentRoute } = useRouter()
const url = '/api-docx/excelreport' + currentRoute.value?.href?.split('?')[1]
console.log("🚀 ~ url:", url)
const excelOptions = ref({
xls: currentRoute.value.href?.split('?')[1].split('.')[1] == 'xls' ? true : true
xls: currentRoute.value.href?.split('?')[1].split('.')[1] == 'xls' ? true : false
})
onMounted(() => {
console.log()

View File

@@ -65,7 +65,7 @@ const initChart = () => {
},
backgroundColor: 'rgba(0,0,0,0.35)',
borderWidth: 0,
confine:true,
confine: true,
...(props.options?.tooltip || null)
},
toolbox: {
@@ -75,9 +75,15 @@ const initChart = () => {
saveAsImage: {
title: '保存图片',
},
...(props.options?.toolbox?.featureProps || null),
...(props.options?.toolbox?.featureProps || null)
},
emphasis: {
iconStyle: {
borderColor: config.layout.elementUiPrimary[0], // 鼠标悬停时的边框颜色
color: config.layout.elementUiPrimary[0] // 鼠标悬停时的图标颜色
}
},
// },
...(props.options?.toolbox || null)
},
@@ -123,9 +129,10 @@ const initChart = () => {
series: props.options?.series,
...props.options?.options
}
// console.log(options.series,"获取x轴");
handlerBar(options)
// 处理柱状图
chart.setOption(options,true)
chart.setOption(options, true)
setTimeout(() => {
chart.resize()
@@ -205,6 +212,9 @@ const handlerXAxis = () => {
let temp = {
type: 'category',
axisTick: { show: false },
nameTextStyle: {
color: '#000'
},
axisLine: {
// lineStyle: {
color: '#000'
@@ -214,9 +224,10 @@ const handlerXAxis = () => {
// textStyle: {
fontFamily: 'dinproRegular',
color: '#000',
fontSize: '12'
fontSize: '12',
// }
}
},
// boundaryGap: false,
}
// props.options?.xAxis 是数组还是对象
if (Array.isArray(props.options?.xAxis)) {
@@ -234,9 +245,6 @@ const handlerXAxis = () => {
}
}
let throttle: ReturnType<typeof setTimeout>
// 动态计算table高度
const resizeObserver = new ResizeObserver(entries => {

View File

@@ -187,6 +187,7 @@ const GetEchar = async (name: string) => {
}
}
})
}
const MapReturn = (name: string) => {

View File

@@ -22,6 +22,8 @@ const options:any = dictData.state.area
const areaName = ref(dictData.state.area[0].name)
const jbName = ref(dictData.state.area[0].name)
const change = (e: any) => {
console.log("🚀 ~ change ~ cascader.value.getCheckedNodes()[0]?.pathLabels.length:", cascader.value.getCheckedNodes()[0]?.pathLabels.length)
if (cascader.value.getCheckedNodes()[0]?.pathLabels.length == 1) {
areaName.value = cascader.value.getCheckedNodes()[0].pathLabels[0]
} else if (cascader.value.getCheckedNodes()[0]?.pathLabels.length >= 2) {

View File

@@ -31,7 +31,7 @@
</template>
<script setup lang="ts">
import { inject, ref, onMounted, nextTick, onUnmounted } from 'vue'
import { inject, ref, onMounted, nextTick, onUnmounted,watch } from 'vue'
import type TableStore from '@/utils/tableStore'
import DatePicker from '@/components/form/datePicker/index.vue'
import Area from '@/components/form/area/index.vue'
@@ -81,6 +81,14 @@ const headerFormSecondStyleClose = {
height: '0',
padding: '0'
}
watch(
() => tableStore.table.params.deptIndex,
(newVal) => {
setTimeout(() => {
areaRef.value.change()
}, 0);
}
)
onMounted(() => {
if (props.datePicker) {
tableStore.table.params.searchBeginTime = datePickerRef.value.timeValue[0]

View File

@@ -3,7 +3,7 @@
<Toolbar style="border-bottom: 1px solid #e4e4e4; border-top: 1px solid #e4e4e4" :editor="editorRef"
:defaultConfig="toolbarConfig" mode="default" />
<Editor v-bind="$attrs" :defaultConfig="editorConfig" mode="default" @onCreated="handleCreated"
style="height: calc(100% - 42px)" />
style="height: 300px;overflow-y: auto" />
</div>
</template>
<script lang="ts" setup>

View File

@@ -45,14 +45,14 @@
</template>
</vxe-column>
<vxe-column field="source" title="数据来源"></vxe-column>
<vxe-column field="useFLag" title="是否启用">
<!-- <vxe-column field="useFLag" title="是否启用">
<template #default="{ row }">
<el-tag :type="row.useFLag === 1 ? 'success' : 'info'" effect="dark"
style="cursor: pointer" @click="change(row)">
{{ row.useFLag === 1 ? '' : '' }}
</el-tag>
</template>
</vxe-column>
</vxe-column> -->
<vxe-column field="definition" title="定义">
<template #default="{ row }">
@@ -81,11 +81,14 @@
<PopupEdit ref="popupEditRef" v-if="popupEditFlag"
@getTree="treeRef.loadData(dotList.id), (popupEditFlag = false)" />
<!-- 定义 -->
<el-dialog v-model="viewFlag" title="定义" width="60%">
<div class="editor" ref="editorRef" v-html="summary" style="min-height: 300px;" />
<el-dialog draggable v-model="viewFlag" title="定义" width="60%">
<div style="min-height: 300px; max-height: 55vh;">
<div class="editor" ref="editorRef" v-html="summary" />
</div>
</el-dialog>
<!-- 删除 -->
<el-dialog v-model="dialogVisible" title="请选择需要删除的数据" width="400">
<el-dialog draggable v-model="dialogVisible" title="请选择需要删除的数据" width="400">
<el-tree-select v-model="TreeValue" :data="TreeData" filterable check-strictly :props="defaultProps"
default-expand-all :render-after-expand="false" />
<template #footer>
@@ -228,7 +231,7 @@ const view = (row: any) => {
span.parentNode.replaceChild(newDiv, span);
});
}, 100)
//

View File

@@ -1,54 +1,37 @@
<template>
<div
class="charts"
style="position: relative; width: 100%"
:style="`height: calc(${tableStore.table.height} - 75px)`"
v-loading="loading"
>
<div
style="position: absolute; right: 60px; top: 5px; font-weight: bold"
v-if="!loading && tableStore.table.data.length != 0"
>
<el-tag
style="
<div class="charts" style="position: relative; width: 100%" v-loading="loading">
<div style="position: absolute; right: 60px; top: 5px; font-weight: bold"
v-if="!loading && tableStore.table.data.length != 0">
<el-tag style="
background: #cc0000;
width: 30px;
height: 15px;
border: 1px solid #cc0000;
float: left;
margin-top: 2px;
"
></el-tag>
"></el-tag>
<span style="color: #cc0000; font-weight: 400; float: left">&nbsp&nbsp在线率<60% &nbsp&nbsp</span>
<el-tag
size="mini"
style="
<el-tag size="mini" style="
background: #ffcc33;
width: 30px;
height: 15px;
border: 1px solid #ffcc33;
float: left;
margin-top: 2px;
"
></el-tag>
<span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%在线率<90% &nbsp&nbsp</span>
<el-tag
style="
"></el-tag>
<span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%在线率<90% &nbsp&nbsp</span>
<el-tag style="
background: #339966;
width: 30px;
height: 15px;
border: 1px solid #339966;
float: left;
margin-top: 2px;
"
></el-tag>
<span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp在线率90%</span>
"></el-tag>
<span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp在线率90%</span>
</div>
<my-echart
class="mt10"
:style="`margin-top:50px;height: calc(${tableStore.table.height} - 120px)`"
:options="options"
/>
<my-echart class="mt10" :style="`margin-top:50px;height: calc(${tableStore.table.height} - 135px)`"
:options="options" />
</div>
</template>
<script setup lang="ts">
@@ -126,19 +109,7 @@ const tableStore = new TableStore({
legend: {
show: false
},
toolbox: {
show: true,
feature: {
saveAsImage: {
// bottom: '10px',
show: true,
title: '保存'
// yAxisIndex: 'none'
}
},
right: 0,
top: 0
},
tooltip: {
backgroundColor: '#fff',
textStyle: {
@@ -152,22 +123,14 @@ const tableStore = new TableStore({
// legendColorList[i]
// }"></p>
tips += `<div style="min-width:80px;display:flex;justify-content:space-between;align-items:center">
<span style="margin-left:5px;dislpay:block;min-width:80px;color:#000">${
params[i].seriesName
}</span> ${
params[i].seriesName == '在线率' ? params[i].value?.toFixed(2) : params[i].value
} </div>`
<span style="margin-left:5px;dislpay:block;min-width:80px;color:#000">${params[i].seriesName
}</span> ${params[i].seriesName == '在线率' ? params[i].value?.toFixed(2) : params[i].value
} </div>`
}
return tips
}
},
grid: {
top: '50px', // 等价于 y: '16%'
left: '10px',
right: '10px',
bottom: '40px',
containLabel: true
},
calculable: true,
xAxis: {
name: titleX,
@@ -348,7 +311,7 @@ const tableStore = new TableStore({
provide('tableStore', tableStore)
onMounted(() => {})
onMounted(() => { })
defineExpose({ getTableStoreParams })
</script>
<style scoped lang="scss"></style>

View File

@@ -131,6 +131,9 @@ import TableHeader from '@/components/table/header/index.vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import charts from './components/charts.vue'
defineOptions({
name: 'harmonic-boot/harmonic/getIntegrityData'
})
const tableRef = ref()
const chartsRef = ref()
const dictData = useDictData()
@@ -183,7 +186,7 @@ const handleClick = (tab: any, e: any) => {
// const datePickerRef = ref()
const tableHeaderRef = ref()
const tableStore = new TableStore({
// publicHeight: 60,
publicHeight: 60,
showPage: false,
url: '/device-boot/LineIntegrityData/getLineIntegrityData',
method: 'POST',
@@ -352,17 +355,17 @@ watch(
)
</script>
<style lang="scss" scoped>
.online {
width: 100%;
height: 100%;
.online_header {
width: 100%;
max-height: 140px;
padding: 10px;
box-sizing: border-box;
}
.online_main {
padding: 0 10px;
}
}
// .online {
// width: 100%;
// height: 100%;
// .online_header {
// width: 100%;
// max-height: 140px;
// padding: 10px;
// box-sizing: border-box;
// }
// .online_main {
// padding: 0 10px;
// }
// }
</style>

View File

@@ -2,7 +2,7 @@
<my-echart
v-loading="loading"
class="mt10"
:style="`height: calc(${tableStore.table.height} - 75px)`"
:style="`height: calc(${tableStore.table.height} - 135px)`"
:options="options"
/>
</template>
@@ -65,19 +65,7 @@ const tableStore = new TableStore({
title: {
text: title
},
toolbox: {
show: true,
feature: {
saveAsImage: {
// bottom: '10px',
show: true,
title: '保存'
// yAxisIndex: 'none'
}
},
right: 10,
top: 0
},
tooltip: {
formatter: function (params: any) {
var tips = ''
@@ -94,13 +82,7 @@ const tableStore = new TableStore({
return tips
}
},
grid: {
top: '50px', // 等价于 y: '16%'
left: '10px',
right: '10px',
bottom: '80px',
containLabel: true
},
xAxis: {
name: titleX,
data: tableStore.table.data.type

View File

@@ -131,6 +131,9 @@ import TableHeader from '@/components/table/header/index.vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import charts from './components/charts.vue'
defineOptions({
name: 'harmonic-boot/area/harmonicDistortionRate'
})
const tableRef = ref()
const onlineChartsRef = ref()
const dictData = useDictData()
@@ -185,7 +188,7 @@ const handleClick = (tab: any, e: any) => {
// const datePickerRef = ref()
const tableHeaderRef = ref()
const tableStore = new TableStore({
// publicHeight: 60,
publicHeight: 60,
showPage: false,
url: '/harmonic-boot/tHDistortion/getTHDistortionData',
method: 'POST',
@@ -303,17 +306,17 @@ watch(
)
</script>
<style lang="scss" scoped>
.online {
width: 100%;
height: 100%;
.online_header {
width: 100%;
max-height: 140px;
padding: 10px;
box-sizing: border-box;
}
.online_main {
padding: 0 10px;
}
}
// .online {
// width: 100%;
// height: 100%;
// .online_header {
// width: 100%;
// max-height: 140px;
// padding: 10px;
// box-sizing: border-box;
// }
// .online_main {
// padding: 0 10px;
// }
// }
</style>

View File

@@ -1,52 +1,37 @@
<template>
<div
class="charts"
style="position: relative; width: 100%"
:style="`height: calc(${tableStore.table.height} - 75px)`"
>
<div class="charts" style="position: relative; width: 100%">
<div style="position: absolute; right: 60px; top: 5px; font-weight: bold" v-if="!loading && tableStore.table.data.length != 0">
<el-tag
style="
<div style="position: absolute; right: 60px; top: 5px; font-weight: bold"
v-if="!loading && tableStore.table.data.length != 0">
<el-tag style="
background: #cc0000;
width: 30px;
height: 15px;
border: 1px solid #cc0000;
float: left;
margin-top: 2px;
"
></el-tag>
"></el-tag>
<span style="color: #cc0000; font-weight: 400; float: left">&nbsp&nbsp在线率<60% &nbsp&nbsp</span>
<el-tag
size="mini"
style="
<el-tag size="mini" style="
background: #ffcc33;
width: 30px;
height: 15px;
border: 1px solid #ffcc33;
float: left;
margin-top: 2px;
"
></el-tag>
<span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%在线率<90% &nbsp&nbsp</span>
<el-tag
style="
"></el-tag>
<span style="color: #ffcc33; font-weight: 400; float: left">&nbsp&nbsp60%在线率<90% &nbsp&nbsp</span>
<el-tag style="
background: #339966;
width: 30px;
height: 15px;
border: 1px solid #339966;
float: left;
margin-top: 2px;
"
></el-tag>
<span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp在线率>90%</span>
"></el-tag>
<span style="color: #339966; font-weight: 400; float: left">&nbsp&nbsp在线率>90%</span>
</div>
<my-echart
v-loading="loading"
class="mt10"
:style="`height: calc(${tableStore.table.height} - 100px)`"
:options="options"
/>
<my-echart v-loading="loading" :style="`height: calc(${tableStore.table.height} - 125px)`" :options="options" />
</div>
</template>
<script setup lang="ts">
@@ -153,11 +138,9 @@ const tableStore = new TableStore({
// legendColorList[i]
// }"></p>
tips += `<div style="min-width:80px;display:flex;justify-content:space-between;align-items:center">
<span style="margin-left:5px;dislpay:block;min-width:80px;color:#000">${
params[i].seriesName
}</span> ${
params[i].seriesName == '在线率' ? params[i].value?.toFixed(2) : params[i].value
} </div>`
<span style="margin-left:5px;dislpay:block;min-width:80px;color:#000">${params[i].seriesName
}</span> ${params[i].seriesName == '在线率' ? params[i].value?.toFixed(2) : params[i].value
} </div>`
}
return tips
}
@@ -178,58 +161,32 @@ const tableStore = new TableStore({
{
type: 'value',
name: '台',
nameTextStyle: {
color: '#000',
verticalAlign: 'top', //标题位置
padding: [-22, 0, 10, 0]
},
// max:50,
// interval: 2,
splitLine: {
show: true
show: false
},
axisLabel: {
textStyle: {
color: '#000'
}
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolOffset: 25, //箭头距离x轴末端距离
lineStyle: {
// shadowOffsetY: -25,
color: '#000',
shadowColor: '#000' //设置阴影的颜色
}
}
},
{
type: 'value',
name: '%',
nameTextStyle: {
color: '#000',
verticalAlign: 'top', //标题位置
padding: [-22, 0, 10, 0]
},
max: 100,
// nameTextStyle: {
// color: "#000"
// },
position: 'right',
offset: 0,
axisLine: {
show: true,
// symbol: ["none", "arrow"],
symbolOffset: 20, //箭头距离x轴末端距离
lineStyle: {
shadowOffsetY: -20,
color: '#000',
shadowColor: '#000' //设置阴影的颜色
}
},
splitLine: {
show: true
show: false
},
axisLabel: {
show: true,
@@ -452,7 +409,7 @@ const tableStore = new TableStore({
provide('tableStore', tableStore)
onMounted(() => {})
onMounted(() => { })
defineExpose({ getTableStoreParams })
</script>
<style scoped lang="scss"></style>

View File

@@ -199,6 +199,9 @@ import TableHeader from '@/components/table/header/index.vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import charts from './components/charts.vue'
defineOptions({
name: 'harmonic-boot/area/terminalonlinerate'
})
const tableRef = ref()
const chartsRef = ref()
const dictData = useDictData()
@@ -251,10 +254,11 @@ const handleClick = (tab: any, e: any) => {
// const datePickerRef = ref()
const tableHeaderRef = ref()
const tableStore = new TableStore({
// publicHeight: 60,
publicHeight: 100,
showPage: false,
url: '/harmonic-boot/terminal/getTerminalData',
method: 'POST',
column: [
{
title: formData.value.statisticalType.name,
@@ -399,19 +403,7 @@ watch(
)
</script>
<style lang="scss" scoped>
.online {
width: 100%;
height: 100%;
.online_header {
width: 100%;
max-height: 140px;
padding: 10px;
box-sizing: border-box;
}
.online_main {
padding: 0 10px;
}
}
.table_legend {
width: 100%;
height: 40px;

View File

@@ -0,0 +1,124 @@
<template>
<div class="default-main">
<TableHeader date-picker area>
<template #select>
<!-- <el-form-item label="统计类型:">
<el-select v-model="tableStore.table.params.statisticalType" placeholder="请选择统计类型" value-key="id">
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="item">
</el-option>
</el-select>
</el-form-item> -->
<el-form-item label="电压等级:">
<el-select v-model="tableStore.table.params.scale" filterable multiple collapse-tags clearable
placeholder="请选择电压等级" value-key="id">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家:">
<el-select v-model="tableStore.table.params.manufacturer" filterable multiple collapse-tags
clearable placeholder="请选择终端厂家" value-key="id">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="tableStore.table.params.loadType" filterable multiple collapse-tags clearable
placeholder="请选择干扰源类型" value-key="id">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="item">
</el-option>
</el-select>
</el-form-item>
</template>
</TableHeader>
<Table ref="tableRef" isGroup />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import { useDictData } from '@/stores/dictData'
import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData()
defineOptions({
name: 'harmonic-boot/detailedAnalysis/station'
})
const view = ref(true)
const classificationData = dictData.getBasicData('Statistical_Type', ["Report_Type"])
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const terminaloption = dictData.getBasicData('Dev_Manufacturers')
const interfereoption = dictData.getBasicData('Interference_Source')
const tableStore = new TableStore({
url: '/harmonic-boot/detailAnalysis/warnSubstationDetail',
method: 'POST',
column: [
{
field: 'index',
title: '序号',
width: '60',
formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ field: 'provinceCompany', title: '地级区', minWidth: "100px", },
{ field: 'cityCompany', title: '地区公司', minWidth: "100px", },
{ field: 'plantName', title: '变电站名称', minWidth: "180px", },
{ field: 'plantVoltageLevel', title: '电压等级', minWidth: "100px", },
{ field: 'onlineMonitorCounts', title: '在线监测点数量(个)', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "150px", },
{ field: 'alertMonitorCounts', title: '告警监测点数量(个)', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "150px", },
{ field: 'alertCounts', title: '告警次数', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'alertAlarmFrequency', title: '告警频次(次/点)', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "150px", },
{
title: '各项稳态指标告警频次(次/点)', children: [
{ field: 'frequencyDeviation', title: '频率偏差', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'voltageDeviation', title: '电压偏差', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'harmonicVoltage', title: '谐波电压', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'harmonicCurrent', title: '谐波电流', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'threePhaseVoltageUnbalance', title: '三相电压不平衡度', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "180px", },
{ field: 'flicker', title: '闪变', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'negative', title: '负序电流', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'interHarmonic', title: '间谐波电压', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
]
}, {
title: '各项暂态指标告警频次(次/点)', children: [
{ field: 'shortInterruption', title: '短时中断', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'voltageDip', title: '电压暂降', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
{ field: 'voltageSwell', title: '电压暂升', formatter: (row: any) => { return row.cellValue == -1 ? '/' : row.cellValue }, minWidth: "100px", },
]
},
],
loadCallback: () => {
}
})
tableStore.table.params.statisticalType = classificationData[0]
tableStore.table.params.powerFlag = 2
tableStore.table.params.monitorFlag = 2
tableStore.table.params.scale = []
tableStore.table.params.manufacturer = []
tableStore.table.params.loadType = []
const wp = ref({})
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
</script>

View File

@@ -1,7 +1,8 @@
<template>
<el-dialog v-model="dialogVisible" :title="title" width="70%">
<vxe-table height="400px" auto-resize :data="tableData" v-loading="loading" v-bind="defaultAttribute"
<el-dialog draggable v-model="dialogVisible" :title="title" width="70%">
<div style="height: 55vh">
<vxe-table height="auto" auto-resize :data="tableData" v-loading="loading" v-bind="defaultAttribute"
:key="key">
<vxe-column field="name" title="名称"></vxe-column>
@@ -60,7 +61,7 @@
</template>
</vxe-column>
</vxe-table>
</div>
</el-dialog>
</template>

View File

@@ -1,7 +1,7 @@
<template>
<el-dialog v-model="dialogVisible" title="排名前10的监测点" width="1200">
<div style="height: 500px">
<div style="height: 55vh">
<my-echart class="tall" :options="echartList" />
</div>

View File

@@ -188,9 +188,8 @@ import { ref, onMounted, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
import * as echarts from 'echarts/core'
defineOptions({
name: 'Region/distribution'
name: 'harmonic-boot/qydetailedAnalysis/pollutionqy'
})
const dictData = useDictData()
const echartList = ref({})
const provinceDetailsRef = ref()
@@ -494,7 +493,7 @@ const histogram = (res: any) => {
onMounted(() => {
tableStore.index()
})
const layout = mainHeight(123) as any
const layout = mainHeight(133) as any
const layout1 = mainHeight(93) as any
</script>
<style lang="scss" scoped>

View File

@@ -0,0 +1,133 @@
<template>
<el-dialog draggable v-model="dialogVisible" :title="title" width="70%">
<div style="height: 55vh">
<vxe-table height="auto" auto-resize :data="tableData" v-loading="loading" v-bind="defaultAttribute"
:key="key">
<div v-if="!voltageLevelFlag">
<vxe-column field="name" title="名称" min-width="150"></vxe-column>
<vxe-column field="onlineCount" title="在线监测点数" min-width="120">
<template #default="scope">
{{ scope.row.onlineCount == 3.14159 ? '暂无数据' : scope.row.onlineCount }}
</template>
</vxe-column>
<vxe-column field="overLineCount" min-width="120" title="超标监测点数">
<template #default="scope">
{{ scope.row.overLineCount == 3.14159 ? '暂无数据' : scope.row.overLineCount }}
</template>
</vxe-column>
<vxe-column field="averageOverDay" min-width="120" title="平均超标天数">
<template #default="scope">
{{ scope.row.averageOverDay == 3.14159 ? '暂无数据' : scope.row.averageOverDay }}
</template>
</vxe-column>
<vxe-column field="ratio" title="超标占比(%)">
<template #default="scope">
{{ scope.row.ratio == 3.14159 ? '暂无数据' : scope.row.ratio }}
</template>
</vxe-column>
<vxe-column field="warningFreq" title="告警频次">
<template #default="scope">
{{ scope.row.warningFreq == 3.14159 ? '暂无数据' : scope.row.warningFreq }}
</template>
</vxe-column>
</div>
<div v-else>
<vxe-column field="name" title="名称" min-width="150"></vxe-column>
<vxe-column field="overDays" title="超标天数"></vxe-column>
<vxe-colgroup title="各指标超标次数">
<vxe-column field="overThreeTimes" title="3次">
<template #default="scope">
{{ scope.row.overThreeTimes == 3.14159 ? '暂无数据' : scope.row.overThreeTimes }}
</template>
</vxe-column>
<vxe-column field="overFiveTimes" title="5次">
<template #default="scope">
{{ scope.row.overFiveTimes == 3.14159 ? '暂无数据' : scope.row.overFiveTimes }}
</template>
</vxe-column>
<vxe-column field="overSevenTimes" title="7次">
<template #default="scope">
{{ scope.row.overSevenTimes == 3.14159 ? '暂无数据' : scope.row.overSevenTimes }}
</template>
</vxe-column>
<vxe-column field="overElevenTimes" title="11次">
<template #default="scope">
{{ scope.row.overElevenTimes == 3.14159 ? '暂无数据' : scope.row.overElevenTimes }}
</template>
</vxe-column>
<vxe-column field="overThirteenTimes" title="13次">
<template #default="scope">
{{ scope.row.overThirteenTimes == 3.14159 ? '暂无数据' : scope.row.overThirteenTimes }}
</template>
</vxe-column>
<vxe-column field="overTwentyThreeTimes" title="23次">
<template #default="scope">
{{ scope.row.overTwentyThreeTimes == 3.14159 ? '暂无数据' : scope.row.overTwentyThreeTimes
}}
</template>
</vxe-column>
<vxe-column field="overTwentyFiveTimes" title="25次">
<template #default="scope">
{{ scope.row.overTwentyFiveTimes == 3.14159 ? '暂无数据' : scope.row.overTwentyFiveTimes }}
</template>
</vxe-column>
<vxe-column field="otherTimes" title="其他次">
<template #default="scope">
{{ scope.row.otherTimes == 3.14159 ? '暂无数据' : scope.row.otherTimes }}
</template>
</vxe-column>
</vxe-colgroup>
</div>
</vxe-table>
</div>
</el-dialog>
</template>
<script setup lang='ts'>
import { ref, reactive } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { getSubInfoById, getXbLineInfoById } from '@/api/harmonic-boot/area'
const dialogVisible = ref(false)
const loading = ref(false)
const voltageLevelFlag = ref(false)
const tableData = ref([])
const title = ref('')
const key = ref(0)
const statisticalName = ref('')
const open = (row: any, flag: boolean, params: any) => {
voltageLevelFlag.value = flag
loading.value = true
title.value = row.name + '详情'
statisticalName.value = params.statisticalType.name + '(%)'
tableData.value = []
if (flag) {
getXbLineInfoById({ ...params, deptIndex: row.pid, id: row.id }).then((res: any) => {
tableData.value = res.data
loading.value = false
}).catch(() => {
loading.value = false
})
} else {
getSubInfoById({ ...params, deptIndex: row.id }).then((res: any) => {
tableData.value = res.data
loading.value = false
}).catch(() => {
loading.value = false
})
}
key.value += 1
dialogVisible.value = true
}
defineExpose({ open })
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,82 @@
<template>
<el-dialog v-model="dialogVisible" title="排名前10的监测点" width="1200">
<div style="height: 55vh">
<my-echart class="tall" :options="echartList" />
</div>
</el-dialog>
</template>
<script setup lang='ts'>
import { ref, reactive } from 'vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { getXbLineRank } from '@/api/harmonic-boot/area'
import * as echarts from 'echarts/core'
const dialogVisible = ref(false)
const echartList = ref({})
const open = (row: any,) => {
getXbLineRank({ ...row, reportFlag: 3, id: '' }).then((res: any) => {
echartList.value = {
// title: {
// text: ''
// },
tooltip: {
formatter: function (params: any) {
// console.log(params);
var tips = ''
for (var i = 0; i < params.length; i++) {
tips += params[i].name + '</br/>'
tips += '超标天数' + ':' + '&nbsp' + '&nbsp' + (params[i].value == 0.14159 ? '暂无数据' : params[i].value +'天') + '</br/>'
}
return tips
}
},
xAxis: {
name: '监测点',
data: res.data.map((item: any) => item.name),
axisLabel: {
fontFamily: 'dinproRegular',
color: '#000',
fontSize: '12',
rotate: 30,
}
},
yAxis: {
name: '天',// 给X轴加单位
},
options: {
dataZoom: null,
series: [
{
type: 'bar',
data: res.data.map((item: any) => {
return item.overDays == 3.14159 ? 0.14159 : item.overDays
}),
barMaxWidth: 30,
}
]
}
}
})
dialogVisible.value = true
}
defineExpose({ open })
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,473 @@
<template>
<div class="default-main">
<TableHeader datePicker ref="header">
<template v-slot:select>
<el-form-item label="统计类型">
<el-select v-model="tableStore.table.params.statisticalType" value-key="id" placeholder="请选择统计类型">
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-DataAnalysis"
@click="rankingClick">排名前10监测点</el-button>
</el-form-item>
</template>
</TableHeader>
<div v-loading="tableStore.table.loading" class="pr10">
<el-row>
<el-col :span="12" class="pd10">
<el-tag style="background: #339966; color: #fff" size="small"></el-tag>
<span style="color: #339966">:优秀60%</span> 
<el-tag style="background: #ffcc33; color: #fff" size="small"></el-tag>
<span style="color: #ffcc33">:60%良好90% </span> 
<el-tag style="background: #cc0000; color: #fff" size="small"></el-tag>
<span style="color: #cc0000">:极差90%</span>
<div :style="{ height: layout.height }" style="overflow-y: auto" class="mt10">
<div class=" cardBox">
<el-card v-for="(item, index) in tableStore.table.data" :key="index">
<template #header>
<div style="cursor: pointer;" @click="queryline(item, false)">
<el-tag v-if="item.data < 60 && item.data > 0"
style="color: #fff; background: #339966" size="small">
</el-tag>
<el-tag v-if="60 <= item.data && item.data < 90"
style="color: #fff; background: #ffcc33" size="small">
</el-tag>
<el-tag v-if="90 <= item.data && item.data"
style="color: #fff; background: #cc0000" size="small">
</el-tag>
<el-tag v-if="item.data == 3.14159 || item.data == 0"
style="color: #fff; background: #ccc" size="small">
</el-tag>
<span>{{ item.name }}</span>
</div>
</template>
<div class="card-content">
<div class="card-item" v-for="(item1, index1) in item.children"
:key="index1" @click="queryline(item1, true)">
<el-tag v-if="item1.data == 3.14159 || item1.data == 0"
style="background: #ccc; color: #fff" size="small">
</el-tag>
<el-tag
v-if="0 < item1.data && item1.data < 1 && item1.data !== 3.14159"
style="background: #339966; color: #fff" size="small">
1
</el-tag>
<el-tag
v-if="1 <= item1.data && item1.data < 1.2 && item1.data !== 3.14159"
style="background: #3399ff; color: #fff" size="small">
2
</el-tag>
<el-tag
v-if="1.2 <= item1.data && item1.data < 1.6 && item1.data !== 3.14159"
style="background: #ffcc33; color: #fff" size="small">
3
</el-tag>
<el-tag
v-if="1.6 <= item1.data && item1.data < 2 && item1.data !== 3.14159"
style="background: #ff9900; color: #fff" size="small">
4
</el-tag>
<el-tag v-if="2 <= item1.data && item1.data && item1.data !== 3.14159"
style="background: #cc0000; color: #fff" size="small">
5
</el-tag>
<span class="xdf">
<el-tooltip :show-arrow="false" :offset="-0" :content="item1.name"
popper-class="atooltip" placement="bottom-start">
<div class="tooltipText">
{{ item1.name }}
</div>
</el-tooltip>
</span>
</div>
</div>
</el-card>
</div>
</div>
</el-col>
<el-col :span="12">
<my-echart class="tall" :options="echartList" />
<div class="tall">
<vxe-table height="auto" auto-resize :data="dataList" v-bind="defaultAttribute">
<vxe-column field="name" title="名称"></vxe-column>
<vxe-column field="onlineCount" title="在线监测点数(个)">
<template #default="scope">
{{ scope.row.onlineCount == 3.14159 ? '暂无数据' : scope.row.onlineCount == 0 ? '/' : scope.row.onlineCount }}
</template>
</vxe-column>
<vxe-column field="overLineCount" title="超标监测点数(个)">
<template #default="scope">
{{ scope.row.overLineCount == 3.14159 ? '暂无数据' : scope.row.overLineCount == 0 ? '/': scope.row.overLineCount }}
</template>
</vxe-column>
<vxe-column field="averageOverDay" title="平均超标天数(天)">
<template #default="scope">
{{ scope.row.averageOverDay == 3.14159 ? '暂无数据' : scope.row.averageOverDay == 0 ?'/' : scope.row.averageOverDay }}
</template>
</vxe-column>
<vxe-column field="ratio" title="监测点超标占比(%)">
<template #default="scope">
{{ scope.row.ratio == 3.14159 ? '暂无数据' : scope.row.ratio == 0 ? '/' : scope.row.ratio }}
</template>
</vxe-column>
</vxe-table>
</div>
</el-col>
</el-row>
</div>
<!-- 详情 -->
<provinceDetails ref="provinceDetailsRef" />
<!-- 排名前10的监测点 -->
<ranking ref="rankingRef" />
</div>
</template>
<script setup lang="ts">
import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import provinceDetails from './components/provinceDetails.vue'
import ranking from './components/ranking.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import TableStore from '@/utils/tableStore'
import { ref, onMounted, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
import { deptInfo } from '@/api/harmonic-boot/area'
import * as echarts from 'echarts/core'
defineOptions({
name: 'harmonic-boot/detailedAnalysis/station'
})
const dictData = useDictData()
const echartList = ref({})
const provinceDetailsRef = ref()
const rankingRef = ref()
const dataList = ref([])
const header = ref()
const options = dictData.getBasicData('Indicator_Type', ['PLPC', 'DYPC', 'SXDYBPHD', 'CSSB', 'FXDL', 'JXBDY'])
const tableStore = new TableStore({
url: '/harmonic-boot/detailAnalysis/deptSubRelations',
method: 'POST',
column: [],
loadCallback: () => {
deptInfo(tableStore.table.params).then((res: any) => {
histogram(res.data)
dataList.value = res.data
})
header.value.areaRef.change()
}
})
provide('tableStore', tableStore)
tableStore.table.params.deptIndex = dictData.state.area[0].id
tableStore.table.params.statisticalType = options[0]
tableStore.table.params.monitorFlag = 2
tableStore.table.params.powerFlag = 2
tableStore.table.params.statFlag = true
tableStore.table.params.serverName = 'event-boot'
// 地图数处理
const rankingClick = () => {
rankingRef.value.open(tableStore.table.params)
}
const queryline = (row: any, flag: boolean) => {
provinceDetailsRef.value.open(row, flag, tableStore.table.params)
}
// 表格数据处理
// 柱状图数据处理
const histogram = (res: any) => {
echartList.value = {
title: {
text: '监测点超标占比'
},
tooltip: {
formatter: function (params: any) {
// console.log(params);
var tips = ''
for (var i = 0; i < params.length; i++) {
tips += params[i].name + '</br/>'
tips += '监测点数' + ':' + '&nbsp' + '&nbsp' + (params[i].value == 0.14159 ? '暂无数据' : params[i].value) + '</br/>'
}
return tips
}
},
xAxis: {
name: '区域',
data: res.map((item: any) => item.name)
},
yAxis: {
name: '等级',// 给X轴加单位
min: 0,
max: 100,
splitLine: {
show: false
},
axisLabel: {
show: true,
// 这里重新定义就可以
},
},
options: {
dataZoom: null,
series: [
{
type: 'bar',
data: res.map((item: any) => {
return item.lineRatio == 3.14159 ? 0.14159 : item.lineRatio
}),
barMaxWidth: 30,
itemStyle: {
normal: {
// 随机显示
//color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);}
// 定制显示(按顺序)
color: function (params) {
if (params.value == 0 || params.value == 0.14159) {
return '#ccc'
} else if (params.value >= 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#CC0000'
}
],
false
)
} else if (60 < params.value && params.value < 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#FFCC33'
}
],
false
)
} else if (
params.value <= 60 &&
params.value >= 0 &&
params.value !== 0.05
) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#339966'
}
],
false
)
} else if (params.value == 0.05) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#999999'
}
],
false
)
}
}
}
},
markLine: {
silent: false,
symbol: 'circle',
lineStyle: {
color: 'red',
width: 1
},
emphasis: {
lineStyle: {
width: 1
}
},
data: [
{
name: '',
yAxis: 60,
lineStyle: {
color: '#339966'
},
label: {
//position: "middle",
formatter: '{b}',
textStyle: {
color: '#339966'
}
}
},
{
name: '',
yAxis: 90,
lineStyle: {
color: '#FFCC33'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#FFCC33'
}
}
},
{
name: '',
yAxis: 100,
lineStyle: {
color: '#CC0000'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#CC0000'
}
}
}
]
},
}
]
}
}
}
onMounted(() => {
tableStore.index()
})
const layout = mainHeight(133) as any
const layout1 = mainHeight(93) as any
</script>
<style lang="scss" scoped>
.tall {
height: calc(v-bind('layout1.height') / 2);
}
.tag {
color: #fff;
border: #fff;
margin-left: 5px;
width: 28px;
}
.text {
font-weight: bold;
font-size: 12px;
}
:deep(.cardBox) {
box-sizing: border-box;
overflow: auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-template-rows: max-content;
grid-gap: 10px;
justify-content: center;
.el-card {
background-image: linear-gradient(var(--el-color-primary), var(--el-color-primary-light-3));
font-weight: bold;
.el-card__header {
padding: 10px !important;
color: #fff;
div {
display: flex;
justify-content: space-between;
}
}
.el-card__body {
padding: 10px !important;
}
.card-content {
height: 200px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
overflow-y: auto;
color: #000;
.card-item {
margin-bottom: 20px;
width: 50%;
display: flex;
cursor: pointer;
}
.xdf {
width: 70%;
}
.tooltipText {
font-weight: 500;
font-size: 12px;
color: #fff;
// width: 50%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-left: 5px;
}
}
}
}
</style>

View File

@@ -0,0 +1,543 @@
<template>
<div class="default-main">
<TableHeader area date-picker ref="header">
<template v-slot:select>
<el-form-item label="统计类型">
<el-select v-model="tableStore.table.params.statisticalType" value-key="id" placeholder="请选择统计类型">
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item" />
</el-select>
</el-form-item>
</template>
</TableHeader>
<div v-loading="tableStore.table.loading" class="pr10">
<el-row>
<el-col :span="12">
<MyEchartMap ref="EchartMap" :options="echartMapList" class="map"
@getRegionByRegion="getRegionByRegion" />
</el-col>
<el-col :span="12">
<my-echart class="tall" :options="echartList" />
<div class="tall">
<vxe-table height="auto" auto-resize :data="tableStore.table.data" v-bind="defaultAttribute">
<vxe-column field="name" title="名称"></vxe-column>
<vxe-column field="data" :title="changeName">
<template #default="scope">
<span v-if="scope.row.data == -1" type="primary" size="small">暂无数据</span>
<span v-if="scope.row.data !== -1 && scope.row.data !== 0.1" type="primary"
size="small">
{{ scope.row.data }}
</span>
<span v-if="scope.row.data == 0.1" type="primary" size="small">/</span>
</template>
</vxe-column>
<vxe-column field="data" title="污区严重度评估">
<template #default="scope">
<span v-if="
0 <= scope.row.data &&
scope.row.data < 1 &&
scope.row.data !== 3.14159
" style=" font-weight: bold;color: #339966;">
无污染
</span>
<span v-if="
1 <= scope.row.data &&
scope.row.data < 1.2 &&
scope.row.data !== 3.14159
" style=" font-weight: bold;color: #3399ff;">
轻微污染
</span>
<span v-if="
1.2 <= scope.row.data &&
scope.row.data < 1.6 &&
scope.row.data !== 3.14159
" style=" font-weight: bold;color: #ffcc33;">
轻度污染
</span>
<span v-if="
1.6 <= scope.row.data &&
scope.row.data < 2 &&
scope.row.data !== 3.14159
" style=" font-weight: bold;color: #ff9900;">
中度污染
</span>
<span v-if="
2 <= scope.row.data && scope.row.data && scope.row.data !== 3.14159
" style=" font-weight: bold;color: #cc0000;">
重度污染
</span>
<span v-if="scope.row.data == 3.14159" style="color: #000;">
暂无评估
</span>
</template>
</vxe-column>
</vxe-table>
</div>
</el-col>
</el-row>
</div>
<div class="mask"></div>
</div>
</template>
<script setup lang="ts">
import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData'
import MyEchartMap from '@/components/echarts/MyEchartMap.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import TableStore from '@/utils/tableStore'
import { ref, onMounted, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
import * as echarts from 'echarts/core'
import { defaultAttribute } from '@/components/table/defaultAttribute'
defineOptions({
name: 'harmonic-boot/detailedAnalysis/pollution'
})
const EchartMap = ref()
const dictData = useDictData()
const changeName = ref('')
const echartMapList: any = ref({})
const echartList = ref({})
const header = ref()
const list: any = ref([])
const geoCoordMap: any = ref([])
const options = dictData.getBasicData('Pollution_Statis', ['V_All', 'I_Neg', 'V_Inharm', 'V_Dev', 'V_Unbalance', 'Plt', 'Freq_Dev'])
const tableStore = new TableStore({
url: '/harmonic-boot/PollutionSubstation/deptSubstationRelations',
method: 'POST',
column: [],
beforeSearchFun: () => { },
loadCallback: () => {
changeName.value = tableStore.table.params.statisticalType.name
map(tableStore.table.data)
histogram(tableStore.table.data)
EchartMap.value.GetEchar(header.value.areaRef.areaName)
console.log("🚀 ~ header.value.areaRef.areaName:", header.value.areaRef.areaName)
}
})
tableStore.table.params.monitorFlag = 2
tableStore.table.params.powerFlag = 2
tableStore.table.params.reportFlag = 3
tableStore.table.params.statisticalType = options[0]
provide('tableStore', tableStore)
// 地图点击事件
const getRegionByRegion = (list: any) => {
tableStore.table.params.deptIndex = list.id
tableStore.onTableAction('search', {})
}
// 地图数处理
const map = (res: any) => {
let areaData: any = []
let xarr = []
let yarr = []
let arr = []
let arr1: any = []
res.forEach(element => {
xarr.push(element.name)
if (element.data == 0) {
element.data = 0.1
yarr.push(element.data)
}
yarr.push(element.data)
let p = {
name: element.name,
value: element.data
}
arr.push(p)
let d = element.name.split('\n')
let p1 = {
name: d[0],
value: element.data
}
arr1.push(p1)
})
echartMapList.value = {
name: '',
title: {
text: '电能质量污区图分布'
},
tooltip: {
formatter: function (params) {
var tips = ''
if (params.value === -1 || window.isNaN(params.value)) {
tips =
"<font style='color:#fff'>" +
params.name +
'</font><br/>区域污染评估:' +
"<font style='color:#fff'><font style='color:#fff'>暂无数据</font><br/>"
} else if (params.value === 0.1 || window.isNaN(params.value)) {
tips =
"<font style='color:#fff'>" +
params.name +
'</font><br/>区域污染评估:' +
"<font style='color:#fff'><font style='color:#fff'>暂无数据</font><br/>"
} else {
tips +=
"<font style='color:#fff'>" +
params.name +
'</font><br/>区域污染评估' +
"<font style='color:#fff'>" +
params.value +
'</font><br/>'
}
return tips
}
},
visualMap: {
min: 0,
max: 2,
left: 25,
bottom: 40,
pieces: [
{
gt: 2,
lt: 10000,
label: '重度污染',
color: '#CC0000',
},
{
gte: 1.2,
lt: 1.6,
label: '轻度污染',
color: '#FFCC33'
},
{
gt: 1.6,
lt: 2,
label: '中度污染',
color: '#FF9900'
},
{
gte: 1,
lte: 1.2,
label: '轻微污染',
color: '#3399FF'
},
{
gte: 0.1,
lte: 1,
label: '无污染',
color: '#339966'
},
{
gte: -1,
lte: 0.05,
label: '无数据',
color: '#ccc'
}
],
},
options: {
series: [
{
type: "map",
geoIndex: 0,
data: arr1,
}
]
}
}
}
// 柱状图数据处理
const histogram = (res: any) => {
echartList.value = {
title: {
text: '区域'
},
tooltip: {
formatter: function (params: any) {
// console.log(params);
var tips = ''
for (var i = 0; i < params.length; i++) {
tips += params[i].name + '</br/>'
tips += '监测点数' + ':' + '&nbsp' + '&nbsp' + (params[i].value == 0.14159 ? '暂无数据' : params[i].value) + '</br/>'
}
return tips
}
},
xAxis: {
name: '区域',
data: res.map((item: any) => item.name)
},
yAxis: {
name: '等级',// 给X轴加单位
min: 0,
max: 2,
interval: 0.2,
splitLine: {
show: false
},
axisLabel: {
show: true,
// 这里重新定义就可以
formatter: function (value, index) {
var texts = []
if (value === 1) {
texts.push('1级')
} else if (value === 1.2) {
texts.push('2级')
} else if (value === 1.4) {
texts.push('3级')
} else if (value === 1.6) {
texts.push('4级')
} else if (value === 2) {
texts.push('5级')
}
return texts
}
},
},
options: {
dataZoom: null,
series: [
{
type: 'bar',
data: res.map((item: any) => {
return item.data == 3.14159 ? 0.14159 : item.data
}),
barMaxWidth: 30,
itemStyle: {
normal: {
// 随机显示
//color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);}
// 定制显示(按顺序)
color: function (params) {
if (params.value == 0 || params.value == 0.14159) {
return '#ccc'
} else if (params.value > 2) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#CC0000'
}
],
false
)
} else if (1.6 < params.value && params.value <= 2) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#FF9900'
}
],
false
)
} else if (1.2 < params.value && params.value <= 1.6) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#FFCC33'
}
],
false
)
} else if (1 < params.value && params.value <= 1.2) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#3399FF'
}
],
false
)
} else if (
0 < params.value &&
params.value <= 1 &&
params.value >= 0 &&
params.value !== 0.05
) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#339966'
}
],
false
)
} else if (params.value == 0.05) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#999999'
}
],
false
)
}
}
}
},
markLine: {
silent: false,
symbol: 'circle',
lineStyle: {
color: 'red',
width: 1
},
emphasis: {
lineStyle: {
width: 1
}
},
data: [
{
name: '',
yAxis: 1,
lineStyle: {
color: '#339966'
},
label: {
//position: "middle",
formatter: '{b}',
textStyle: {
color: '#339966'
}
}
},
{
name: '',
yAxis: 1.2,
lineStyle: {
color: '#3399FF'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#3399FF'
}
}
},
{
name: '',
yAxis: 1.4,
lineStyle: {
color: '#FFCC33'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#FFCC33'
}
}
},
{
name: '',
yAxis: 1.6,
lineStyle: {
color: '#FF9900'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#FF9900'
}
}
},
{
name: '',
yAxis: 2,
lineStyle: {
color: '#CC0000'
},
label: {
// position: "middle",
formatter: '{b}',
textStyle: {
color: '#CC0000'
}
}
}
]
},
}
]
}
}
}
onMounted(() => {
setTimeout(() => {
tableStore.index()
}, 10)
})
const layout = mainHeight(83) as any
const layout1 = mainHeight(93) as any
</script>
<style lang="scss" scoped>
.map {
height: v-bind('layout.height');
}
.tall {
height: calc(v-bind('layout1.height') / 2);
}
.mask {
width: 100px;
height: 150px;
background-color: rgba(0, 0, 0, 0);
position: absolute;
left: 25px;
bottom: 40px;
z-index: 999;
}
</style>

View File

@@ -69,7 +69,7 @@ import { useDictData } from '@/stores/dictData'
import TableHeader from '@/components/table/header/index.vue'
const dictData = useDictData()
defineOptions({
name: 'harmonic-boot/run/terminalmessage'
name: 'harmonic-boot/run/devicemessage'
})
const view = ref(true)
const classificationData = dictData.getBasicData('Statistical_Type', ["Report_Type"])
@@ -106,6 +106,7 @@ const tableStore = new TableStore({
title: '供电公司',
minWidth: 100
},
{ field: 'objName', title: '监测点对象名称' , minWidth: 240},
{ field: 'manufacturer', title: '厂家' , minWidth: 100},
{ field: 'scale', title: '电压等级' , minWidth: 100},
{ field: 'businessType', title: '行业类型' , minWidth: 100},
@@ -115,7 +116,7 @@ const tableStore = new TableStore({
{ field: 'lineName', title: '监测点名称' , minWidth: 100},
{ field: 'comFlag', title: '通讯状态' , minWidth: 100},
{ field: 'loadType', title: '干扰源类型' , minWidth: 100},
{ field: 'objName', title: '监测点对象名称' , minWidth: 240},
],

View File

@@ -136,6 +136,7 @@ const map = (res: any) => {
},
color: ['green', 'red'],
legend: {
selectedMode: false,
data: [
{
name: '正常'