dashboard/backend/import_lab_data_full.py
2025-06-09 14:59:40 +08:00

270 lines
13 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
工程研究中心数据完整导入脚本
用于导入assets/工程研究中心.json中的所有工程研究中心数据到数据库
使用方法:
1. 确保后端服务未运行
2. 在backend目录下执行: python import_lab_data_full.py
主要功能:
- 导入所有工程研究中心的基本信息
- 导入多年度数据到annual_data JSON字段
- 自动生成lab_id
- 支持数据更新如果lab已存在
"""
import json
import sys
import os
from pathlib import Path
# 添加父目录到路径以便导入模块
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from sqlalchemy.orm import sessionmaker
from database import SessionLocal, engine
from models import Lab
import uuid
def safe_int(value):
"""安全转换为整数"""
if value is None or value == "":
return 0
if isinstance(value, (int, float)):
return int(value)
if isinstance(value, str):
try:
return int(float(value))
except (ValueError, TypeError):
return 0
return 0
def safe_float(value):
"""安全转换为浮点数"""
if value is None or value == "":
return 0.0
if isinstance(value, (int, float)):
return float(value)
if isinstance(value, str):
try:
return float(value)
except (ValueError, TypeError):
return 0.0
return 0.0
def safe_str(value):
"""安全转换为字符串"""
if value is None:
return ""
return str(value)
def import_lab_data():
"""导入工程研究中心数据"""
# 检查JSON文件是否存在
json_file = Path(__file__).parent.parent / "src" / "assets" / "工程研究中心.json"
if not json_file.exists():
print(f"❌ 错误:找不到数据文件 {json_file}")
return False
try:
# 读取JSON数据
print(f"📖 正在读取数据文件: {json_file}")
with open(json_file, 'r', encoding='utf-8') as f:
labs_data = json.load(f)
print(f"✅ 成功读取数据,共 {len(labs_data)} 个工程研究中心")
# 创建数据库会话
db = SessionLocal()
imported_count = 0
updated_count = 0
error_count = 0
try:
for lab_info in labs_data:
try:
center_name = lab_info.get("中心名称", "")
center_number = lab_info.get("中心编号", "")
annual_data = lab_info.get("年度数据", [])
if not center_name:
print(f"⚠️ 跳过无名称的工程研究中心")
continue
print(f"\n🔄 正在处理工程研究中心: {center_name} (编号: {center_number})")
# 检查是否已存在
existing_lab = None
if center_number:
existing_lab = db.query(Lab).filter(Lab.center_number == center_number).first()
if not existing_lab and center_name:
existing_lab = db.query(Lab).filter(Lab.name == center_name).first()
if existing_lab:
print(f" 📝 工程研究中心已存在,更新数据...")
lab = existing_lab
updated_count += 1
else:
print(f" 创建新工程研究中心...")
lab = Lab()
lab.id = str(uuid.uuid4())
imported_count += 1
# 设置基本信息
lab.name = center_name
lab.center_number = center_number
lab.idcode = center_number # 用编号作为显示ID
# 处理年度数据
if annual_data:
# 提取基本信息(从最新年度数据)
latest_data = max(annual_data, key=lambda x: x.get("归属年份", "0"))
lab.school = latest_data.get("所属学校", "")
lab.department = latest_data.get("主管部门", "")
lab.field = latest_data.get("所属领域", "")
lab.current_year = latest_data.get("归属年份", "")
# 存储多年度数据到annual_data JSON字段
lab.annual_data = json.dumps(annual_data, ensure_ascii=False)
# 从最新数据中提取主要信息字段
lab.innovation_situation = latest_data.get("技术攻关与创新情况", "")
lab.overall_situation = latest_data.get("1.总体情况", "")
lab.engineering_cases = latest_data.get("2.工程化案例", "")
lab.industry_service = latest_data.get("3.行业服务情况", "")
lab.discipline_support = latest_data.get("1.学科发展支撑情况", "") or latest_data.get("1.支撑学科发展情况", "")
lab.talent_cultivation = latest_data.get("2.人才培养情况", "")
lab.team_building = latest_data.get("3.研究队伍建设情况", "")
lab.department_support = latest_data.get("1.主管部门、依托单位支持情况", "")
lab.equipment_sharing = latest_data.get("2.仪器设备开放共享情况", "")
lab.academic_style = latest_data.get("3.学风建设情况", "")
lab.technical_committee = latest_data.get("4.技术委员会工作情况", "")
lab.next_year_plan = latest_data.get("下一年度工作计划", "")
lab.problems_suggestions = latest_data.get("问题与建议", "")
lab.director_opinion = latest_data.get("1.工程中心负责人意见", "")
lab.institution_opinion = latest_data.get("2.依托单位意见", "")
lab.research_directions = latest_data.get("研究方向/学术带头人", "")
# 统计数据字段
lab.national_awards_first = safe_int(latest_data.get("国家级科技奖励一等奖(项)", 0))
lab.national_awards_second = safe_int(latest_data.get("国家级科技奖励二等奖(项)", 0))
lab.provincial_awards_first = safe_int(latest_data.get("省、部级科技奖励一等奖(项)", 0))
lab.provincial_awards_second = safe_int(latest_data.get("省、部级科技奖励二等奖(项)", 0))
lab.valid_patents = safe_int(latest_data.get("有效专利(项)", 0))
lab.other_ip = safe_int(latest_data.get("其他知识产权(项)", 0))
lab.international_standards = safe_int(latest_data.get("国际/国家标准(项)", 0))
lab.industry_standards = safe_int(latest_data.get("行业/地方标准(项)", 0))
# 专利转化数据
lab.patent_transfer_contracts = safe_int(latest_data.get("合同项数(项)", 0))
lab.patent_transfer_amount = safe_float(latest_data.get("合同金额(万元)", 0))
lab.patent_license_contracts = safe_int(latest_data.get("合同项数(项)_1", 0))
lab.patent_license_amount = safe_float(latest_data.get("合同金额(万元)_1", 0))
lab.patent_valuation_contracts = safe_int(latest_data.get("合同项数(项)_2", 0))
lab.patent_valuation_amount = safe_float(latest_data.get("作价金额(万元)", 0))
# 项目合作
lab.project_contracts = safe_int(latest_data.get("项目合同项数(项)", 0))
lab.project_amount = safe_float(latest_data.get("项目合同金额(万元)", 0))
# 学科信息
lab.discipline_1 = latest_data.get("依托学科1", "")
lab.discipline_2 = latest_data.get("依托学科2", "")
lab.discipline_3 = latest_data.get("依托学科3", "")
# 人才培养数据
lab.doctoral_students = safe_int(latest_data.get("在读博士生", 0))
lab.master_students = safe_int(latest_data.get("在读硕士生", 0))
lab.graduated_doctoral = safe_int(latest_data.get("当年毕业博士", 0))
lab.graduated_master = safe_int(latest_data.get("当年毕业硕士", 0))
lab.undergraduate_courses = safe_int(latest_data.get("承担本科课程", 0))
lab.graduate_courses = safe_int(latest_data.get("承担研究生课程", 0))
lab.textbooks = safe_int(latest_data.get("大专院校教材", 0))
# 人员结构
lab.professors = safe_int(latest_data.get("科技人才-教授(人)", 0))
lab.associate_professors = safe_int(latest_data.get("科技人才-副教授(人)", 0))
lab.lecturers = safe_int(latest_data.get("科技人才-讲师(人)", 0))
lab.domestic_visitors = safe_int(latest_data.get("访问学者-国内(人)", 0))
lab.foreign_visitors = safe_int(latest_data.get("访问学者-国外(人)", 0))
lab.postdoc_in = safe_int(latest_data.get("本年度进站博士后(人)", 0))
lab.postdoc_out = safe_int(latest_data.get("本年度出站博士后(人)", 0))
# 基础设施
lab.center_area = safe_float(latest_data.get("工程中心面积(m²)", 0))
lab.new_area = safe_float(latest_data.get("当年新增面积(m²)", 0))
lab.fixed_personnel = safe_int(latest_data.get("固定人员(人)", 0))
lab.mobile_personnel = safe_int(latest_data.get("流动人员(人)", 0))
# 经费情况
lab.total_funding = safe_float(latest_data.get("当年项目到账总经费(万元)", 0))
lab.vertical_funding = safe_float(latest_data.get("纵向经费(万元)", 0))
lab.horizontal_funding = safe_float(latest_data.get("横向经费(万元)", 0))
# 服务情况
lab.technical_consultations = safe_int(latest_data.get("技术咨询(次)", 0))
lab.training_services = safe_int(latest_data.get("培训服务(人次)", 0))
# 设置兼容性字段
lab.personnel = f"{lab.fixed_personnel + lab.mobile_personnel}"
lab.nationalProjects = str(lab.project_contracts)
lab.otherProjects = "0"
lab.achievements = str(lab.valid_patents)
lab.image = "/image/实验室1.png" # 默认图片
print(f" ✅ 年度数据: {len(annual_data)} 年, 最新年份: {lab.current_year}")
# 添加到数据库(如果是新记录)
if lab not in db.query(Lab).all():
db.add(lab)
except Exception as e:
print(f" ❌ 处理工程研究中心 {center_name} 时出错: {str(e)}")
error_count += 1
continue
# 提交更改
print(f"\n💾 正在保存到数据库...")
db.commit()
print(f"✅ 数据导入完成!")
print(f"📊 统计信息:")
print(f" - 新增工程研究中心: {imported_count}")
print(f" - 更新工程研究中心: {updated_count}")
print(f" - 错误数量: {error_count}")
print(f" - 总计处理: {imported_count + updated_count}")
return True
except Exception as e:
print(f"❌ 数据库操作失败: {str(e)}")
db.rollback()
return False
finally:
db.close()
except Exception as e:
print(f"❌ 导入失败: {str(e)}")
return False
def main():
"""主函数"""
print("🚀 开始导入工程研究中心数据...")
print("=" * 50)
success = import_lab_data()
print("=" * 50)
if success:
print("🎉 导入完成!")
else:
print("💥 导入失败!")
input("\n按回车键退出...")
if __name__ == "__main__":
main()