工程研究中心列+详情页接口对接
This commit is contained in:
parent
a8127a4bfa
commit
9c8b3b240e
@ -213,6 +213,15 @@
|
||||
const awardsChartRef = ref(null)
|
||||
const fundingChartRef = ref(null)
|
||||
const newsListRef = ref(null)
|
||||
// 工程研究中心图表数据
|
||||
const labData = ref({
|
||||
datax: [],
|
||||
datay: []
|
||||
})
|
||||
const labLineData = ref({
|
||||
datax: [],
|
||||
datay: []
|
||||
})
|
||||
|
||||
// DeepSeek 智能助手相关变量
|
||||
const chatMessagesRef = ref(null)
|
||||
@ -363,7 +372,6 @@
|
||||
const data = await response.json();
|
||||
console.log("仪表盘数据:", data);
|
||||
dashboardData.value = data.data;
|
||||
|
||||
// 更新相应的UI数据
|
||||
if (data) {
|
||||
// 如果有新闻数据,更新新闻列表
|
||||
@ -385,7 +393,92 @@
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const fetchLabData = async () => {
|
||||
try {
|
||||
const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/research-data-dashboard/get-release`);
|
||||
if (res) {
|
||||
const data = await res.json();
|
||||
// 处理 keyFields 数据
|
||||
const keyFields = data.data.keyFields || [];
|
||||
const datax = keyFields.map(item => item.fieldName);
|
||||
const datay = keyFields.map(item => item.quantity);
|
||||
labData.value = {
|
||||
datax,
|
||||
datay
|
||||
};
|
||||
// 数据更新后,手动更新图表
|
||||
updateLabBarChart();
|
||||
} else {
|
||||
console.error('获取工程研究中心数据失败:', response.statusText);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取工程研究中心数据出错:', error);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
const fetchLabData2 = async () => {
|
||||
try {
|
||||
const res = await fetch(`${getApiBaseUrl()}/admin-api/pg/changes-in-achievements/get-release`);
|
||||
if (res) {
|
||||
const data = await res.json();
|
||||
// 处理 keyFields 数据
|
||||
const afterAnalysis = data.data.afterAnalysis || [];
|
||||
const datax = [];
|
||||
const datay = [];
|
||||
|
||||
afterAnalysis.forEach(item => {
|
||||
const year = Object.keys(item)[0]; // 获取年份
|
||||
const quantity = item[year]; // 获取对应的值
|
||||
datax.push(year);
|
||||
datay.push(quantity);
|
||||
});
|
||||
labLineData.value = {
|
||||
datax,
|
||||
datay
|
||||
};
|
||||
// 数据更新后,手动更新图表
|
||||
updateLabLineChart();
|
||||
} else {
|
||||
console.error('获取工程研究中心数据失败:', response.statusText);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取工程研究中心数据出错:', error);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
// 添加更新工程研究中心柱状图的函数
|
||||
const updateLabBarChart = () => {
|
||||
const labBarChart = echarts.getInstanceByDom(labBarChartRef.value);
|
||||
if (labBarChart) {
|
||||
labBarChart.setOption({
|
||||
xAxis: {
|
||||
data: labData.value.datax
|
||||
},
|
||||
series: [
|
||||
{
|
||||
data: labData.value.datay
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
}
|
||||
const updateLabLineChart = () => {
|
||||
const labLineChart = echarts.getInstanceByDom(labLineChartRef.value);
|
||||
if (labLineChart) {
|
||||
labLineChart.setOption({
|
||||
xAxis: {
|
||||
data: labLineData.value.datax
|
||||
},
|
||||
series: [
|
||||
{
|
||||
data: labLineData.value.datay
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
};
|
||||
// 使用仪表盘数据更新图表
|
||||
const updateChartsWithDashboardData = () => {
|
||||
if (!dashboardData.value) return;
|
||||
@ -468,7 +561,7 @@
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['国家重点工程研究中心', '工程研究中心总数'],
|
||||
data: labData.value.datax,
|
||||
axisLine: { lineStyle: { color: '#fff' } },
|
||||
axisLabel: { color: '#fff' }
|
||||
},
|
||||
@ -488,7 +581,7 @@
|
||||
series: [
|
||||
{
|
||||
type: 'bar',
|
||||
data: [20, 150],
|
||||
data: labData.value.datay,
|
||||
itemStyle: { color: '#4080ff' },
|
||||
barWidth: '15%',
|
||||
label: {
|
||||
@ -523,7 +616,7 @@
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['2023', '2024', '2025'],
|
||||
data: labLineData.value.datax,
|
||||
axisLine: { lineStyle: { color: '#fff' } },
|
||||
axisLabel: { color: '#fff' }
|
||||
},
|
||||
@ -543,7 +636,7 @@
|
||||
series: [
|
||||
{
|
||||
type: 'line',
|
||||
data: [145, 160, 175],
|
||||
data: labLineData.value.datay,
|
||||
lineStyle: { color: '#ffd700', width: 3 },
|
||||
itemStyle: { color: '#ffd700' },
|
||||
symbolSize: 8
|
||||
@ -715,9 +808,12 @@
|
||||
}
|
||||
|
||||
// 生命周期钩子 - 组件挂载后初始化
|
||||
onMounted(() => {
|
||||
onMounted(async() => {
|
||||
// 工程研究中心数据
|
||||
await fetchLabData();
|
||||
await fetchLabData2();
|
||||
// 获取仪表盘数据
|
||||
fetchDashboardData();
|
||||
await fetchDashboardData();
|
||||
|
||||
// 初始化图表
|
||||
nextTick(() => {
|
||||
|
@ -15,43 +15,6 @@
|
||||
|
||||
<!-- 主内容区域 -->
|
||||
<div class="content-container">
|
||||
<!-- 左侧维度设置 -->
|
||||
<!-- <div class="dimension-sidebar">
|
||||
<div class="dimension-content">
|
||||
<h2 class="dimension-section-title">评估维度设置</h2>
|
||||
|
||||
<div class="dimension-list custom-scrollbar">
|
||||
<div v-for="(dim, index) in dimensions" :key="index" class="dimension-item primary-dimension">
|
||||
<div class="dimension-header" @click="editDimension(dim, index)">
|
||||
<div class="dimension-name">
|
||||
<label>{{ dim.name }}</label>
|
||||
</div>
|
||||
<div class="dimension-expand">
|
||||
<span class="expand-icon">▼</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-dimensions">
|
||||
<div v-for="(subDim, subIndex) in dim.subDimensions" :key="`${index}-${subIndex}`" class="dimension-item sub-dimension">
|
||||
<div class="dimension-name">
|
||||
<label>{{ subDim.name }}</label>
|
||||
</div>
|
||||
<div class="dimension-weight">
|
||||
<span class="weight-label">W:</span>
|
||||
<span class="weight-value">{{ subDim.weight }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dimension-add" @click="openDimensionDrawer">
|
||||
<span class="add-icon">+</span>
|
||||
<span class="add-text">添加自定义维度</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- 右侧内容区 -->
|
||||
<div class="main-content">
|
||||
<!-- 搜索和操作栏 -->
|
||||
@ -85,31 +48,31 @@
|
||||
<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 class="card-header">
|
||||
<span class="lab-id">ID: {{ lab.idcode || lab.id }}</span>
|
||||
<span class="lab-id">ID: {{ lab.basicInformation.name0 || lab.id }}</span>
|
||||
<!-- <span class="total-score">综合评估分数: <span class="score-value">{{ lab.score }}分</span></span> -->
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<div class="lab-image">
|
||||
<img :src="lab.image" alt="工程研究中心图片" />
|
||||
<img :src="lab.basicInformation.name5" alt="工程研究中心图片" />
|
||||
</div>
|
||||
|
||||
<div class="lab-info">
|
||||
<div class="info-item">
|
||||
<span class="info-label">研究中心名称:</span>
|
||||
<span class="info-value">{{ lab.name }}</span>
|
||||
<span class="info-value">{{ lab.basicInformation.name1 }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">所属领域:</span>
|
||||
<span class="info-value">{{ lab.field }}</span>
|
||||
<span class="info-value">{{ lab.basicInformation.name2 }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">所属学校:</span>
|
||||
<span class="info-value">{{ lab.school }}</span>
|
||||
<span class="info-value">{{ lab.basicInformation.name3 }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">主管部门:</span>
|
||||
<span class="info-value">{{ lab.department }}</span>
|
||||
<span class="info-value">{{ lab.basicInformation.name4 }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -226,68 +189,23 @@ const labs = ref([]);
|
||||
// 根据搜索过滤工程研究中心
|
||||
const filteredLabs = ref([]);
|
||||
|
||||
// 为每个工程研究中心分配唯一的图片
|
||||
function assignUniqueLabImages() {
|
||||
// 确保每个工程研究中心都有不同的图片
|
||||
labs.value.forEach((lab, index) => {
|
||||
// 计算1-6之间的序号,确保均匀分布
|
||||
const photoIndex = (index % 6) + 1;
|
||||
lab.image = `/image/实验室${photoIndex}.png`;
|
||||
});
|
||||
}
|
||||
|
||||
// 在组件挂载时获取维度数据
|
||||
onMounted(async () => {
|
||||
try {
|
||||
// 获取工程研究中心评估维度数据
|
||||
const response = await axios.get(`${getApiBaseUrl()}/admin-api/pg/J-dimensions/lab`);
|
||||
dimensions.value = response.data.data;
|
||||
dimensions.value.forEach(dim => {
|
||||
if (typeof dim.subDimensions === 'string') {
|
||||
try {
|
||||
dim.subDimensions = JSON.parse(dim.subDimensions);
|
||||
} catch (error) {
|
||||
console.error(`解析 subDimensions 失败: ${dim.name}`, error);
|
||||
dim.subDimensions = []; // 解析失败时设为空数组
|
||||
}
|
||||
}
|
||||
});
|
||||
// 加载工程研究中心数据
|
||||
await loadLabs();
|
||||
// 在此不需要调用handleSearch,因为loadLabs中已经调用了
|
||||
} catch (error) {
|
||||
console.error('获取维度数据失败:', error);
|
||||
ElMessage.error('获取维度数据失败');
|
||||
}
|
||||
await loadLabs();
|
||||
});
|
||||
|
||||
// 加载工程研究中心数据
|
||||
const loadLabs = async () => {
|
||||
try {
|
||||
const response = await axios.get(`${getApiBaseUrl()}/admin-api/pg/J-labs/labs`);
|
||||
const response = await axios.get(`${getApiBaseUrl()}/admin-api/pg/evaluation-results/get-release`);
|
||||
labs.value = response.data.data;
|
||||
|
||||
// 为工程研究中心分配唯一的图片
|
||||
assignUniqueLabImages();
|
||||
|
||||
// 确保每个工程研究中心都有分数
|
||||
labs.value.forEach(lab => {
|
||||
// 确保有分数
|
||||
if (!lab.score && lab.evaluationData && lab.evaluationData.length > 0) {
|
||||
// 计算平均分作为综合得分
|
||||
lab.score = Math.round(lab.evaluationData.reduce((a, b) => a + b, 0) / lab.evaluationData.length);
|
||||
}
|
||||
});
|
||||
|
||||
// 先更新过滤的工程研究中心列表
|
||||
handleSearch();
|
||||
|
||||
// 给一个短暂的延时,确保DOM已经更新
|
||||
setTimeout(() => {
|
||||
updateAllRadarCharts();
|
||||
}, 100);
|
||||
} catch (error) {
|
||||
console.error('获取工程研究中心数据失败:', error);
|
||||
ElMessage.error('获取工程研究中心数据失败');
|
||||
}
|
||||
};
|
||||
@ -310,61 +228,13 @@ const updateAllRadarCharts = () => {
|
||||
const chart = echarts.init(chartDom);
|
||||
|
||||
// 从二级维度生成指标
|
||||
const indicators = [];
|
||||
if (dimensions.value && dimensions.value.length > 0) {
|
||||
dimensions.value.forEach(dim => {
|
||||
if (dim.subDimensions && dim.subDimensions.length > 0) {
|
||||
dim.subDimensions.forEach(subDim => {
|
||||
indicators.push({
|
||||
name: subDim.name,
|
||||
max: 100
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 如果没有维度,使用默认维度
|
||||
if (indicators.length === 0) {
|
||||
indicators.push(
|
||||
{ name: '创新水平', max: 100 },
|
||||
{ name: '研究能力', max: 100 },
|
||||
{ name: '成果转化', max: 100 },
|
||||
{ name: '学科建设', max: 100 },
|
||||
{ name: '行业贡献', max: 100 },
|
||||
{ name: '发展潜力', max: 100 }
|
||||
);
|
||||
}
|
||||
|
||||
// const indicators = lab.dynamicColumns.index;
|
||||
const indicators = lab.dynamicColumns.index.map(index => ({ name: index.label}));
|
||||
// 准备雷达图数据
|
||||
let radarData = [];
|
||||
let radarData = lab.result;
|
||||
|
||||
// 检查是否有二级维度评估数据
|
||||
let hasSubDimensionData = false;
|
||||
if (lab.sub_dimension_evaluations && Object.keys(lab.sub_dimension_evaluations).length > 0) {
|
||||
dimensions.value.forEach(dim => {
|
||||
if (dim.subDimensions && dim.subDimensions.length > 0 &&
|
||||
lab.sub_dimension_evaluations[dim.name]) {
|
||||
dim.subDimensions.forEach(subDim => {
|
||||
if (lab.sub_dimension_evaluations[dim.name][subDim.name] !== undefined) {
|
||||
hasSubDimensionData = true;
|
||||
radarData.push(lab.sub_dimension_evaluations[dim.name][subDim.name]);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 如果没有二级维度数据,使用传统的evaluationData
|
||||
if (!hasSubDimensionData) {
|
||||
// 确保评估数据与指标数量匹配
|
||||
if (!lab.evaluationData || lab.evaluationData.length !== indicators.length) {
|
||||
// 生成随机评估数据,范围在60-90之间
|
||||
lab.evaluationData = indicators.map(() => Math.floor(Math.random() * 31) + 60);
|
||||
}
|
||||
radarData = lab.evaluationData;
|
||||
}
|
||||
|
||||
|
||||
console.log('radarData:', indicators,radarData);
|
||||
chart.setOption({
|
||||
radar: {
|
||||
indicator: indicators,
|
||||
@ -428,8 +298,8 @@ const handleSearch = () => {
|
||||
filteredLabs.value = labs.value;
|
||||
} else {
|
||||
filteredLabs.value = labs.value.filter(lab =>
|
||||
lab.name.includes(searchQuery.value) ||
|
||||
(lab.idcode && lab.idcode.includes(searchQuery.value))
|
||||
lab.basicInformation.name1.includes(searchQuery.value) ||
|
||||
(lab.name0 && lab.name0.includes(searchQuery.value))
|
||||
);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user