dashboard/backend/import_lab_data_full.py

270 lines
13 KiB
Python
Raw Permalink Normal View History

2025-06-09 14:59:40 +08:00
#!/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()