Compare commits

..

No commits in common. "084f859ad3b5a0b855b2a40ae425a56d8f4b152b" and "2d152c5e2d734d40d41ee93295f166ce9bfd7516" have entirely different histories.

5 changed files with 82 additions and 158 deletions

View File

@ -232,9 +232,8 @@ const teacherServiceData = ref({
}) })
// //
const labData = ref({ const labData = ref({
datax: [], // fieldName datax: [],
series: [], // ECharts series datay: []
years: [] //
}) })
const labLineData = ref({ const labLineData = ref({
datax: [], datax: [],
@ -439,7 +438,7 @@ const fetchTeacherbData = async (type) => {
updateResearcherChart(); updateResearcherChart();
} else if (type === 2) { } else if (type === 2) {
studyData.value = { studyData.value = {
datax: keyFields.map(item => ({ name: item.fieldName,max: Math.max(...datay)})), datax: keyFields.map(item => ({ name: item.fieldName})),
datay datay
}; };
updateStudyChart(); updateStudyChart();
@ -555,62 +554,24 @@ const updateTeacherServiceChart = () => {
} }
}; };
//
const barColors = ['#4080ff', '#d7fc33', 'rgb(63, 196, 15)']; //
const initEngineeringKeyFields = (data) => {
const fieldNames = data.map(item => item.fieldName);
const years = data.length > 0 ? Array.from(new Set(data.flatMap(item => item.yearData.map(y => y.year)))) : [];
years.sort((a, b) => a - b); //
const series = years.map((year, index) => { // index
return {
name: year.toString(),
type: 'bar',
barWidth: '15%',
// index
itemStyle: {
color: barColors[index % barColors.length] // 使
},
data: fieldNames.map(fieldName => {
const item = data.find(d => d.fieldName === fieldName);
const yearData = item ? item.yearData.find(y => y.year === year) : null;
return yearData ? yearData.quantity : 0;
}),
emphasis: {
focus: 'series'
}
};
});
labData.value.datax = fieldNames;
labData.value.series = series;
labData.value.years = years;
console.log("Processed labData.value:", labData.value);
};
const fetchLabData = async () => { const fetchLabData = async () => {
try { try {
const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/research-data-dashboard/get-release`); const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/research-data-dashboard/get-release`);
if (res) { if (res) {
const data = await res.json(); const data = await res.json();
// keyFields
const keyFields = data.data.keyFields || []; const keyFields = data.data.keyFields || [];
const processedData = keyFields.map((group) => { const datax = keyFields.map(item => item.fieldName);
const firstItem = group[0]; const datay = keyFields.map(item => item.quantity);
const yearData = group.map((item) => ({ labData.value = {
year: item.year, datax,
quantity: item.quantity datay
})); };
return { //
fieldName: firstItem.fieldName,
yearData
};
});
initEngineeringKeyFields(processedData);
updateLabBarChart(); updateLabBarChart();
} else { } else {
console.error('获取工程研究中心数据失败:', res.statusText); console.error('获取工程研究中心数据失败:', response.statusText);
} }
} catch (error) { } catch (error) {
console.error('获取工程研究中心数据出错:', error); console.error('获取工程研究中心数据出错:', error);
@ -621,8 +582,9 @@ const fetchLabData = async () => {
const fetchLabData2 = async () => { const fetchLabData2 = async () => {
try { try {
const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/changes-in-achievements/get-release`); const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/changes-in-achievements/get-release`);
if (res) { if (res) {
const data = await res.json(); const data = await res.json();
// keyFields
const afterAnalysis = data.data.afterAnalysis || []; const afterAnalysis = data.data.afterAnalysis || [];
const datax = afterAnalysis.map(item => item.year); const datax = afterAnalysis.map(item => item.year);
const datay = afterAnalysis.map(item => item.quantity); const datay = afterAnalysis.map(item => item.quantity);
@ -630,9 +592,10 @@ const fetchLabData2 = async () => {
datax, datax,
datay datay
}; };
//
updateLabLineChart(); updateLabLineChart();
} else { } else {
console.error('获取工程研究中心数据失败:', res.statusText); console.error('获取工程研究中心数据失败:', response.statusText);
} }
} catch (error) { } catch (error) {
console.error('获取工程研究中心数据出错:', error); console.error('获取工程研究中心数据出错:', error);
@ -642,26 +605,19 @@ const fetchLabData2 = async () => {
}; };
// //
const updateLabBarChart = () => { const updateLabBarChart = () => {
const labBarChart = echarts.getInstanceByDom(labBarChartRef.value); const labBarChart = echarts.getInstanceByDom(labBarChartRef.value);
if (labBarChart) { if (labBarChart) {
console.log("Updating labBarChart with:", { labBarChart.setOption({
xAxisData: labData.value.datax, xAxis: {
seriesData: labData.value.series data: labData.value.datax
}); },
labBarChart.setOption({ series: [
legend: { {
data: labData.value.years.map(String), data: labData.value.datay
textStyle: { color: '#fff' } }
}, ]
xAxis: { });
data: labData.value.datax, }
axisLabel: {
textStyle: { color: '#fff' } //
}
},
series: labData.value.series
}, true);
}
} }
const updateLabLineChart = () => { const updateLabLineChart = () => {
const labLineChart = echarts.getInstanceByDom(labLineChartRef.value); const labLineChart = echarts.getInstanceByDom(labLineChartRef.value);
@ -796,35 +752,18 @@ const initCharts = () => {
const labBarChart = echarts.init(labBarChartRef.value) const labBarChart = echarts.init(labBarChartRef.value)
labBarChart.setOption({ labBarChart.setOption({
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
legend: {
data: labData.value.years.map(String),
textStyle: { color: '#fff' } //
},
grid: { grid: {
left: '3%', left: '3%',
right: '4%', right: '4%',
top: '10%', top: '10%',
bottom: '15%', // bottom: '5%',
containLabel: true containLabel: true
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: labData.value.datax, data: labData.value.datax,
axisLine: { lineStyle: { color: '#fff' } }, axisLine: { lineStyle: { color: '#fff' } },
axisLabel: { axisLabel: { color: '#fff' }
color: '#fff',
// 4
formatter: function (params) {
return params.split('').reduce((acc, char, index) => {
if (index % 9 === 0 && index > 0) {
return acc + '\n' + char;
}
return acc + char;
}, '');
},
//
fontSize: 10,
}
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
@ -839,7 +778,19 @@ const initCharts = () => {
interval: 1 interval: 1
} }
}, },
series: labData.value.series series: [
{
type: 'bar',
data: labData.value.datay,
itemStyle: { color: '#4080ff' },
barWidth: '15%',
label: {
show: true,
position: 'top',
color: '#fff'
}
}
]
}) })
// 线 // 线

View File

@ -48,8 +48,8 @@
<!-- <div v-for="(lab, index) in filteredLabs" :key="index" class="lab-card" style="height: 440px;"> --> <!-- <div v-for="(lab, index) in filteredLabs" :key="index" class="lab-card" style="height: 440px;"> -->
<div v-for="(lab, index) in filteredLabs" :key="index" class="lab-card" style="height: 440px;" @click="openLabDetail(lab)"> <div v-for="(lab, index) in filteredLabs" :key="index" class="lab-card" style="height: 440px;" @click="openLabDetail(lab)">
<div class="card-header"> <div class="card-header">
<span class="lab-id">ID: {{ lab.basicInformation.name1 || lab.id }}</span> <span class="lab-id">ID: {{ lab.basicInformation.name0 || lab.id }}</span>
<span class="total-score">时间: <span class="score-value">{{ lab.basicInformation.name0 }}</span></span> <!-- <span class="total-score">综合评估分数: <span class="score-value">{{ lab.score }}</span></span> -->
</div> </div>
<div class="card-content"> <div class="card-content">
@ -60,19 +60,19 @@
<div class="lab-info"> <div class="lab-info">
<div class="info-item"> <div class="info-item">
<span class="info-label">研究中心名称:</span> <span class="info-label">研究中心名称:</span>
<span class="info-value">{{ lab.basicInformation.name2 }}</span> <span class="info-value">{{ lab.basicInformation.name1 }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="info-label">所属领域:</span> <span class="info-label">所属领域:</span>
<span class="info-value">{{ lab.basicInformation.name3 }}</span> <span class="info-value">{{ lab.basicInformation.name2 }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="info-label">所属学校:</span> <span class="info-label">所属学校:</span>
<span class="info-value">{{ lab.basicInformation.name4 }}</span> <span class="info-value">{{ lab.basicInformation.name3 }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="info-label">主管部门:</span> <span class="info-label">主管部门:</span>
<span class="info-value">{{ lab.basicInformation.name5 }}</span> <span class="info-value">{{ lab.basicInformation.name4 }}</span>
</div> </div>
</div> </div>
@ -229,7 +229,7 @@ const updateAllRadarCharts = () => {
// //
// const indicators = lab.dimension; // const indicators = lab.dimension;
const indicators = lab.dimension.map(index => ({ name: index, max: 50})); const indicators = lab.dimension.map(index => ({ name: index}));
// //
let radarData = lab.result; let radarData = lab.result;
@ -258,7 +258,7 @@ const updateAllRadarCharts = () => {
name: { name: {
textStyle: { textStyle: {
color: '#fff', color: '#fff',
fontSize: 10 fontSize: 11
} }
} }
}, },
@ -315,8 +315,8 @@ const handleSearch = () => {
filteredLabs.value = labs.value; filteredLabs.value = labs.value;
} else { } else {
filteredLabs.value = labs.value.filter(lab => filteredLabs.value = labs.value.filter(lab =>
lab.basicInformation.name2 && lab.basicInformation.name2.includes(searchQuery.value) || lab.basicInformation.name1 && lab.basicInformation.name1.includes(searchQuery.value) ||
(lab.basicInformation.name1 && lab.basicInformation.name1.includes(searchQuery.value)) (lab.basicInformation.name0 && lab.basicInformation.name0.includes(searchQuery.value))
); );
} }

View File

@ -13,26 +13,26 @@
<div class="form-row"> <div class="form-row">
<div class="form-item"> <div class="form-item">
<span class="label">编号:</span> <span class="label">编号:</span>
<span class="display-text">{{ labData.basicInformation.name1 }}</span> <span class="display-text">{{ labData.basicInformation.name0 }}</span>
</div> </div>
<div class="form-item"> <div class="form-item">
<span class="label">工程研究中心名称:</span> <span class="label">工程研究中心名称:</span>
<span class="display-text">{{ labData.basicInformation.name2 }}</span> <span class="display-text">{{ labData.basicInformation.name1 }}</span>
</div> </div>
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="form-item"> <div class="form-item">
<span class="label">所属领域:</span> <span class="label">所属领域:</span>
<span class="display-text">{{ labData.basicInformation.name3 }}</span> <span class="display-text">{{ labData.basicInformation.name2 }}</span>
</div> </div>
<div class="form-item"> <div class="form-item">
<span class="label">所属学校:</span> <span class="label">所属学校:</span>
<span class="display-text">{{ labData.basicInformation.name4 }}</span> <span class="display-text">{{ labData.basicInformation.name3 }}</span>
</div> </div>
<div class="form-item"> <div class="form-item">
<span class="label">主管部门:</span> <span class="label">主管部门:</span>
<span class="display-text">{{ labData.basicInformation.name5 }}</span> <span class="display-text">{{ labData.basicInformation.name4 }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -40,14 +40,7 @@
<!-- 工程研究中心年度信息 - 合并成一个card --> <!-- 工程研究中心年度信息 - 合并成一个card -->
<div class="detail-sections"> <div class="detail-sections">
<!-- 新增总分显示 --> <h3 class="section-title">详细信息</h3>
<div class="overall-score-section">
<h3 class="section-title">详细信息</h3>
<div>
<span class="overall-score-label">总分:</span>
<span class="overall-score-value">{{ overallTotalScore }}</span>
</div>
</div>
<div class="year-content"> <div class="year-content">
<div class="display-form"> <div class="display-form">
<!-- 工程研究中心概况 --> <!-- 工程研究中心概况 -->
@ -57,8 +50,7 @@
<!-- 遍历 labData.resultList --> <!-- 遍历 labData.resultList -->
<div v-for="(categoryItem, index) in labData.resultList" :key="index" class="category-section"> <div v-for="(categoryItem, index) in labData.resultList" :key="index" class="category-section">
<h4 class="category-title"> <h4 class="category-title">
{{ categoryItem.category }} {{ categoryItem.category }} (总分: {{ calculateCategoryTotal(categoryItem.result) }})
<span>总分: {{ calculateCategoryTotal(categoryItem.result) }} / 满分: {{ labData.scoreList[index] }}</span>
</h4> </h4>
<div class="category-content"> <div class="category-content">
<div v-for="(item, itemIndex) in categoryItem.result" :key="itemIndex" class="category-item"> <div v-for="(item, itemIndex) in categoryItem.result" :key="itemIndex" class="category-item">
@ -68,6 +60,11 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 新增总分显示 -->
<div class="overall-score-section">
<span class="overall-score-label">总分:</span>
<span class="overall-score-value">{{ overallTotalScore }}</span>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -353,12 +350,9 @@ const handleClose = () => {
.category-title { .category-title {
font-size: 16px; font-size: 16px;
font-weight: bold; font-weight: bold;
color: #d7fc33; /* 标题颜色 */ color: #4986ff; /* 标题颜色 */
margin-top: 0; margin-top: 0;
margin-bottom: 15px; margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: space-between;
} }
.category-content { .category-content {
@ -610,6 +604,7 @@ const handleClose = () => {
/* 新增:总分显示样式 */ /* 新增:总分显示样式 */
.overall-score-section { .overall-score-section {
margin-top: 20px; /* 与上方内容的间距 */
padding: 15px; padding: 15px;
background-color: rgba(12, 22, 51, 0.3); background-color: rgba(12, 22, 51, 0.3);
border-radius: 8px; border-radius: 8px;
@ -620,14 +615,8 @@ const handleClose = () => {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
color: #4986ff; color: #4986ff;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.overall-score-section h3{
margin: 0;
} }
.overall-score-label { .overall-score-label {
margin-right: 10px; margin-right: 10px;
color: rgba(255,255,255,0.9); color: rgba(255,255,255,0.9);

View File

@ -218,7 +218,7 @@ const teacherLabs = async () => {
teachers.value = response.data.data; teachers.value = response.data.data;
handleSearch(); handleSearch();
} catch (error) { } catch (error) {
ElMessage.error('获科研人才中心数据失败'); ElMessage.error('获取工程研究中心数据失败');
} }
}; };
@ -317,8 +317,7 @@ const initRadarCharts = () => {
// //
const indicators = teacher.dimension.map(dim => ({ const indicators = teacher.dimension.map(dim => ({
name: dim, name: dim
max: 50
})); }));
chart.setOption({ chart.setOption({

View File

@ -57,15 +57,7 @@
<!-- 详细信息 - 工程研究中心年度信息 - 合并成一个card --> <!-- 详细信息 - 工程研究中心年度信息 - 合并成一个card -->
<div class="detail-sections"> <div class="detail-sections">
<h3 class="section-title">详细信息</h3>
<!-- 新增总分显示 -->
<div class="overall-score-section">
<h3 class="section-title">详细信息</h3>
<div>
<span class="overall-score-label">总分:</span>
<span class="overall-score-value">{{ overallTotalScore }}</span>
</div>
</div>
<div class="year-content"> <div class="year-content">
<div class="display-form"> <div class="display-form">
<!-- 工程研究中心概况 --> <!-- 工程研究中心概况 -->
@ -74,8 +66,7 @@
<!-- 遍历 teacherData.resultList --> <!-- 遍历 teacherData.resultList -->
<div v-for="(categoryItem, index) in teacherData.resultList" :key="index" class="category-section"> <div v-for="(categoryItem, index) in teacherData.resultList" :key="index" class="category-section">
<h4 class="category-title"> <h4 class="category-title">
{{ categoryItem.category }} {{ categoryItem.category }} (总分: {{ calculateCategoryTotal(categoryItem.result) }})
<span>总分: {{ calculateCategoryTotal(categoryItem.result) }} / 满分: {{ teacherData.scoreList[index] }}</span>
</h4> </h4>
<div class="category-content"> <div class="category-content">
<div v-for="(item, itemIndex) in categoryItem.result" :key="itemIndex" class="category-item"> <div v-for="(item, itemIndex) in categoryItem.result" :key="itemIndex" class="category-item">
@ -86,6 +77,11 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 总分显示 -->
<div class="overall-score-section">
<span class="overall-score-label">总分:</span>
<span class="overall-score-value">{{ overallTotalScore }}</span>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -270,8 +266,6 @@ const handleClose = () => {
align-items: center; align-items: center;
color: white; color: white;
word-break: break-all; word-break: break-all;
white-space: nowrap;
font-size: 12px;
} }
.display-textarea { .display-textarea {
@ -302,12 +296,9 @@ const handleClose = () => {
.category-title { .category-title {
font-size: 16px; font-size: 16px;
font-weight: bold; font-weight: bold;
color: #d7fc33; /* 标题颜色 */ color: #4986ff;
margin-top: 0; margin-top: 0;
margin-bottom: 15px; margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: space-between;
} }
.category-content { .category-content {
@ -395,23 +386,17 @@ const handleClose = () => {
/* 新增:总分显示样式 */ /* 新增:总分显示样式 */
.overall-score-section { .overall-score-section {
margin-top: 20px;
padding: 15px; padding: 15px;
background-color: rgba(12, 22, 51, 0.3); background-color: rgba(12, 22, 51, 0.3);
border-radius: 8px; border-radius: 8px;
border: 1px solid rgba(73, 134, 255, 0.3); border: 1px solid rgba(73, 134, 255, 0.3);
display: flex; display: flex;
justify-content: flex-end; /* 靠右对齐 */ justify-content: flex-end;
align-items: center; align-items: center;
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
color: #4986ff; color: #4986ff;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.overall-score-section h3{
margin: 0;
} }
.overall-score-label { .overall-score-label {