#!/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()