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.

345 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="container">
<!-- 顶部信息 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目画像</span>
</div>
<div class="topright" style="visibility: hidden;">
<el-button type="primary" size="medium" plain>
编辑
</el-button>
</div>
</div>
<!-- 内容区 -->
<div class="content">
<div class="picturediv">
<div ref="chart" style="width: 38rem; height: 28rem;"></div>
</div>
<div class="descriptionsdiv">
<div class="tablehead">
<img src="@/assets/images/icon-pjdj@2x.png" alt="">
<span>评价等级</span>
<span style="margin-top: .3rem;"></span>
</div>
<div class="tablebody">
<div class="table-container">
<div class="table-column">
<div class="table-header">评价要素</div>
<div v-for="(description, index) in descriptionData" :key="index" class="table-row">
{{ description.ysmc }}
</div>
</div>
<div class="table-column">
<div class="table-header">评价排名</div>
<div v-for="(description, index) in descriptionData" :key="index" class="table-row">
{{ description.pjpm }} /{{ description.count }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
import { getpicture, getpicturelist } from '@/api/ManageApi/index'; // 确保路径正确
export default {
props: {
size: {
type: String,
default: ''
},
id: {
type: Number,
default: 0
}
},
data() {
return {
evaluations: [],
radarData: {
project: [],
median: []
},
maxValues: {},
descriptionData: []
};
},
mounted() {
this.fetchData();
this.fetchDescriptionData();
},
methods: {
fetchData() {
if (this.id) {
getpicture(this.id)
.then(response => {
this.processData(response.data);
this.initChart();
})
.catch(error => {
console.error('获取项目画像失败:', error);
});
}
},
fetchDescriptionData() {
if (this.id) {
getpicturelist(this.id)
.then(response => {
this.processDescriptionData(response.data);
})
.catch(error => {
console.error('获取项目画像解释说明失败:', error);
});
}
},
processData(data) {
const projectData = [];
const medianData = [];
const evaluations = [];
const maxValues = {};
// 创建一个映射来存储每个要素的数据
const elementMap = {};
data.forEach(item => {
item.list.forEach(subItem => {
const element = subItem.ysmc;
const value = parseFloat(subItem.pjpm);
if (!elementMap[element]) {
elementMap[element] = {
max: null,
project: null,
median: null
};
}
if (item.type === 1) { // 最大值
elementMap[element].max = value;
} else if (item.type === 2) { // 本项目
elementMap[element].project = value;
} else if (item.type === 3) { // 中位数
elementMap[element].median = value;
}
});
});
// 填充 evaluations 数组
for (const element in elementMap) {
const data = elementMap[element];
evaluations.push({
element: element,
ranking: data.project // 假设 pjpm 是排名
});
projectData.push(data.project);
medianData.push(data.median);
maxValues[element] = data.max;
}
this.evaluations = evaluations;
this.radarData.project = projectData;
this.radarData.median = medianData;
this.maxValues = maxValues;
},
processDescriptionData(data) {
// 处理雷达图解释说明的数据
// 假设 data 是一个数组,包含解释说明的信息
this.descriptionData = data;
},
initChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
legend: {
data: ['本项目', '中位数'],
top: '0%',
},
radar: {
center: ['50%', '55%'],
indicator: this.evaluations.map(evaluation => ({
name: evaluation.element,
max: this.maxValues[evaluation.element] || 65000 // 根据实际情况调整 max 值
}))
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: this.radarData.project,
name: '本项目',
itemStyle: {
color: '#2B62F1' // 自定义线条颜色
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(43, 98, 241, 0.3)' // 阴影起始颜色
}, {
offset: 1, color: 'rgba(43, 98, 241, 0)' // 阴影结束颜色
}]
}
}
},
{
value: this.radarData.median,
name: '中位数',
itemStyle: {
color: '#FF9900' // 自定义线条颜色
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'rgba(255, 153, 0, 0.3)' // 阴影起始颜色
}, {
offset: 1, color: 'rgba(255, 153, 0, 0)' // 阴影结束颜色
}]
}
}
}
]
}
]
};
myChart.setOption(option);
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
}
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.topleft {
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.picturediv {
width: auto;
height: auto;
}
.descriptionsdiv {
width: 52rem;
margin-left: 10rem;
height: 25.31rem;
}
.two-row-item {
height: 20rem;
}
.tablebody {
margin-top: 2rem;
}
.table-container {
display: flex;
width: 100%;
}
.table-column {
flex: 1;
}
.table-header {
font-weight: bold;
text-align: center;
background-color: #F2F4F7;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 600;
font-size: 0.88rem;
color: #3D3D3D;
line-height: 2.19rem;
text-align: center;
font-style: normal;
text-transform: none;
padding: .3rem 0;
}
.table-row {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
color: #3D424C;
line-height: 2.56rem;
text-align: center;
font-style: normal;
text-transform: none;
padding: .3rem 0;
}
.tablehead {
width: auto;
height: 2.38rem;
display: flex;
align-items: center;
gap: .3rem;
}
.tablehead img {
width: 1.13rem;
height: 1.13rem;
}
</style>