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

2 months ago
<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">
4 weeks ago
<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>
4 weeks ago
<span style="margin-top: .3rem;"></span>
</div>
<div class="tablebody">
<div class="table-container">
<div class="table-column">
<div class="table-header">评价要素</div>
4 weeks ago
<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>
4 weeks ago
<div v-for="(description, index) in descriptionData" :key="index" class="table-row">
{{ description.pjpm }} /{{ description.count }}
</div>
</div>
</div>
</div>
2 months ago
</div>
</div>
</div>
</template>
2 months ago
<script>
import * as echarts from 'echarts';
4 weeks ago
import { getpicture, getpicturelist } from '@/api/ManageApi/index'; // 确保路径正确
export default {
props: {
size: {
type: String,
default: ''
4 weeks ago
},
id: {
type: Number,
default: 0
}
},
data() {
return {
4 weeks ago
evaluations: [],
radarData: {
project: [],
median: []
},
maxValues: {},
descriptionData: []
};
},
mounted() {
4 weeks ago
this.fetchData();
this.fetchDescriptionData();
},
methods: {
4 weeks ago
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%'],
4 weeks ago
indicator: this.evaluations.map(evaluation => ({
name: evaluation.element,
max: this.maxValues[evaluation.element] || 65000 // 根据实际情况调整 max 值
}))
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
4 weeks ago
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)' // 阴影结束颜色
}]
}
}
},
{
4 weeks ago
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)' // 阴影结束颜色
}]
}
}
}
]
}
]
};
2 months ago
myChart.setOption(option);
}
}
};
2 months ago
</script>
2 months ago
<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);
2 months ago
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
}
.containertop {
2 months ago
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
2 months ago
}
.topleft {
width: 8rem;
2 months ago
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
2 months ago
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
2 months ago
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>