You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
3.6 KiB

2 months ago
<template>
<div style="width: 100%; height: 100%;">
<div ref="chart" style="width: 100%; height: 100%;"></div>
2 weeks ago
</div>
1 month ago
</template>
<script>
import * as echarts from 'echarts';
import { investall } from '@/api/ManageApi/index';
export default {
name: 'RingChart',
props: {
years: {
type: String,
default: new Date().getFullYear().toString()
}
},
1 month ago
data() {
return {
functionnumber: 0,
1 month ago
chartData: [
{ value: 54, name: '国企', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '民企', itemStyle: { color: '#5B76F9' } },
{ value: 32, name: '外企', itemStyle: { color: '#FAC858' } },
3 weeks ago
{ value: 32, name: '其他', itemStyle: { color: '#50DFB3' } },
1 month ago
],
};
},
mounted() {
this.getData();
},
watch: {
years: {
immediate: true,
handler(newVal) {
this.getData();
}
}
1 month ago
},
methods: {
async getData() {
const response = await investall({
years: this.years,
});
1 month ago
if (response && response.code === 200 && response.data) {
2 weeks ago
const totalCount = response.data.reduce((sum, item) => sum + item.count, 0);
this.functionnumber = totalCount;
1 month ago
this.chartData = this.processData(response.data);
this.renderChart();
2 weeks ago
} else {}
2 months ago
},
1 month ago
processData(data) {
2 weeks ago
const names = ['国企', '民企', '外企', '其他'];
1 month ago
const counts = data.map(item => item.count);
const total = counts.reduce((sum, count) => sum + count, 0);
1 month ago
return names.map((name, index) => ({
value: counts[index] || 0,
name: name,
itemStyle: { color: ['#36C3FB', '#5B76F9', '#FAC858', '#50DFB3'][index] },
percent: total > 0 ? ((counts[index] || 0) / total * 100).toFixed(2) : '0.00'
1 month ago
}));
},
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item',
formatter: ({name, value, percent}) => `${name}: ${value}个 (${percent}%)`
1 month ago
},
legend: {
orient: 'vertical',
right: '27.7%',
top: 'center',
itemGap: 18,
1 month ago
formatter: function (name) {
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this)
},
graphic: [
{
type: 'text',
left: '29%',
top: '40%',
style: {
text: this.functionnumber.toString(),
textAlign: 'center',
fill: '#292C33',
fontSize: 20,
fontFamily: 'DINbold',
fontWeight: '500'
}
},
{
type: 'text',
left: '26%',
top: '55%',
style: {
text: '项目总数',
textAlign: 'center',
fill: '#9E9E9E',
fontSize: '0.68rem',
fontFamily: 'alibold',
fontWeight: '400'
}
}
],
1 month ago
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '60%'],
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false
1 month ago
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
2 months ago
}
}
1 month ago
}
]
};
myChart.setOption(option);
2 months ago
}
1 month ago
}
};
</script>
2 weeks ago
<style scoped>
</style>