Files
smart_storage_web/src/views/new-screen-zz/components/left-center.vue
2025-06-30 10:17:15 +08:00

203 lines
4.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="left-center-warp">
<item :title="'电站区域分布'">
<dv-loading v-if="loading">Loading...</dv-loading>
<div v-else class="chart-box">
<Chart :options="options" :class-name="'chart'" />
</div></item>
</div>
</template>
<script>
import item from './item-warp.vue'
import { GetRegionalDistribution } from '@/api/screen/zzScreen'
export default {
components: { item },
data() {
return {
options: {},
loading: true
}
},
methods: {
async getData(deptId) {
try {
this.loading = true
const res = await GetRegionalDistribution({
deptId: deptId
})
this.initChart(res.data)
} catch (error) {
console.log(error)
} finally {
this.loading = false
}
},
initChart(val) {
if (val.length) {
val.sort((a, b) => b.regionValue - a.regionValue)
var ydata = []
var legend = []
val.forEach(i => {
const param = {
name: i.addName,
value: i.regionValue
}
legend.push(param.name)
ydata.push(param)
})
const count = this.arrCount(ydata)
this.options = {
title: [{
text: '电站总数',
subtext: count,
subtextStyle: {
color: '#fff',
fontSize: 37,
fontWeight: 500
},
left: '35%',
top: '40%',
padding: [0, 0],
textStyle: {
color: '#fff',
fontSize: 18
},
textAlign: 'center'
}],
tooltip: {},
legend: {
type: 'scroll',
orient: 'vertical',
right: 10,
top: 20,
bottom: 20,
padding: [0, 10],
data: legend,
icon: 'circle',
align: 'left',
itemWidth: 8,
itemHeight: 8,
itemGap: 15,
textStyle: {
color: '#fff',
rich: {
name: {
fontSize: 12,
color: '#ffffff',
padding: [0, 10, 0, 0]
},
num: {
fontSize: 16,
color: '#ffffff'
},
unit: {
fontSize: 16,
color: '#ffffff'
}
}
},
formatter: function(name) {
const val = ydata.filter(item => {
return item.name === name
})
const num = (((val[0].value / count)) * 100).toFixed(2)
return [
`{name|${name.length > 5 ? name.slice(0, 2) : name}}`,
`{num|${num}}{unit|%}`
].join(' ')
}
},
series: [{
name: '电站个数',
type: 'pie',
clockwise: false, // 饼图的扇区是否是顺时针排布
minAngle: 20, // 最小的扇区角度0 ~ 360
radius: ['60%', '75%'],
center: ['35%', '50%'],
avoidLabelOverlap: false,
itemStyle: { // 图形样式
normal: {
borderColor: '#070A0C',
borderWidth: 5
}
},
label: {
normal: {
show: false
},
emphasis: {
show: false,
position: 'outer',
alignTo: 'edge',
margin: 10,
formatter: '{text|{b}}\n{value|{d}%}',
rich: {
text: {
fontSize: 14,
align: 'center',
verticalAlign: 'middle',
padding: 5
},
value: {
fontSize: 24,
align: 'center',
verticalAlign: 'middle'
}
}
}
},
data: ydata
}]
}
} else {
this.options = {
title: {
text: '暂无数据',
x: 'center',
y: 'center',
textStyle: {
fontSize: 14,
color: 'rgb(153, 153, 153)',
fontWeight: 'normal'
}
}
}
}
},
arrCount(arr) {
let count = 0
arr.forEach(item => {
count = count + item.value
})
return count
}
}
}
</script>
<style lang="scss" scoped>
.left-center-warp {
width: 100%;
height: 100%;
.chart-box {
width: 100%;
height: 100%;
}
}
</style>