246 lines
8.2 KiB
Python
246 lines
8.2 KiB
Python
|
from pydantic import BaseModel
|
|||
|
from typing import List, Optional, Dict, Any
|
|||
|
|
|||
|
# 用户模型
|
|||
|
class UserBase(BaseModel):
|
|||
|
username: str
|
|||
|
email: Optional[str] = None
|
|||
|
full_name: Optional[str] = None
|
|||
|
|
|||
|
class UserCreate(UserBase):
|
|||
|
password: str
|
|||
|
|
|||
|
class User(UserBase):
|
|||
|
id: int
|
|||
|
disabled: Optional[bool] = None
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# 令牌模型
|
|||
|
class Token(BaseModel):
|
|||
|
access_token: str
|
|||
|
token_type: str
|
|||
|
|
|||
|
class TokenData(BaseModel):
|
|||
|
username: str
|
|||
|
|
|||
|
# 人才模型
|
|||
|
class TalentBase(BaseModel):
|
|||
|
name: str
|
|||
|
idcode: Optional[str] = None # 新增展示用ID字段
|
|||
|
gender: Optional[str] = None
|
|||
|
birthDate: Optional[str] = None
|
|||
|
title: Optional[str] = None
|
|||
|
position: Optional[str] = None
|
|||
|
education: Optional[str] = None
|
|||
|
educationBackground: Optional[str] = None
|
|||
|
address: Optional[str] = None
|
|||
|
academicDirection: Optional[str] = None
|
|||
|
talentPlan: Optional[str] = None
|
|||
|
officeLocation: Optional[str] = None
|
|||
|
email: Optional[str] = None
|
|||
|
phone: Optional[str] = None
|
|||
|
tutorType: Optional[str] = None
|
|||
|
papers: Optional[str] = None
|
|||
|
projects: Optional[str] = None
|
|||
|
photo: Optional[str] = None
|
|||
|
eduWorkHistory: Optional[str] = None
|
|||
|
researchDirection: Optional[str] = None
|
|||
|
recentProjects: Optional[str] = None
|
|||
|
representativePapers: Optional[str] = None
|
|||
|
patents: Optional[str] = None
|
|||
|
evaluationData: Optional[List[float]] = None
|
|||
|
|
|||
|
class TalentCreate(TalentBase):
|
|||
|
id: str
|
|||
|
|
|||
|
class Talent(TalentBase):
|
|||
|
id: str
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# 工程研究中心模型
|
|||
|
class LabBase(BaseModel):
|
|||
|
name: str
|
|||
|
idcode: Optional[str] = None # 新增展示用ID字段
|
|||
|
|
|||
|
# 基本信息
|
|||
|
center_number: Optional[str] = None # 中心编号
|
|||
|
school: Optional[str] = None # 所属学校
|
|||
|
department: Optional[str] = None # 主管部门
|
|||
|
field: Optional[str] = None # 所属领域
|
|||
|
|
|||
|
# 年度数据 - 修改为可以接受字符串或字典列表
|
|||
|
annual_data: Optional[str] = None # 存储为JSON字符串
|
|||
|
current_year: Optional[str] = None # 当前评估年份
|
|||
|
|
|||
|
# 详细信息
|
|||
|
innovation_situation: Optional[str] = None # 技术攻关与创新情况
|
|||
|
overall_situation: Optional[str] = None # 总体情况
|
|||
|
engineering_cases: Optional[str] = None # 工程化案例
|
|||
|
industry_service: Optional[str] = None # 行业服务情况
|
|||
|
discipline_support: Optional[str] = None # 学科发展支撑情况
|
|||
|
talent_cultivation: Optional[str] = None # 人才培养情况
|
|||
|
team_building: Optional[str] = None # 研究队伍建设情况
|
|||
|
department_support: Optional[str] = None # 主管部门、依托单位支持情况
|
|||
|
equipment_sharing: Optional[str] = None # 仪器设备开放共享情况
|
|||
|
academic_style: Optional[str] = None # 学风建设情况
|
|||
|
technical_committee: Optional[str] = None # 技术委员会工作情况
|
|||
|
next_year_plan: Optional[str] = None # 下一年度工作计划
|
|||
|
problems_suggestions: Optional[str] = None # 问题与建议
|
|||
|
director_opinion: Optional[str] = None # 工程中心负责人意见
|
|||
|
institution_opinion: Optional[str] = None # 依托单位意见
|
|||
|
research_directions: Optional[str] = None # 研究方向/学术带头人
|
|||
|
|
|||
|
# 统计数据
|
|||
|
national_awards_first: Optional[int] = 0 # 国家级科技奖励一等奖
|
|||
|
national_awards_second: Optional[int] = 0 # 国家级科技奖励二等奖
|
|||
|
provincial_awards_first: Optional[int] = 0 # 省、部级科技奖励一等奖
|
|||
|
provincial_awards_second: Optional[int] = 0 # 省、部级科技奖励二等奖
|
|||
|
valid_patents: Optional[int] = 0 # 有效专利
|
|||
|
other_ip: Optional[int] = 0 # 其他知识产权
|
|||
|
international_standards: Optional[int] = 0 # 国际/国家标准
|
|||
|
industry_standards: Optional[int] = 0 # 行业/地方标准
|
|||
|
|
|||
|
# 专利转化相关
|
|||
|
patent_transfer_contracts: Optional[int] = 0 # 专利转让合同项数
|
|||
|
patent_transfer_amount: Optional[float] = 0.0 # 专利转让合同金额
|
|||
|
patent_license_contracts: Optional[int] = 0 # 专利许可合同项数
|
|||
|
patent_license_amount: Optional[float] = 0.0 # 专利许可合同金额
|
|||
|
patent_valuation_contracts: Optional[int] = 0 # 专利作价合同项数
|
|||
|
patent_valuation_amount: Optional[float] = 0.0 # 专利作价金额
|
|||
|
|
|||
|
# 项目合作
|
|||
|
project_contracts: Optional[int] = 0 # 项目合同项数
|
|||
|
project_amount: Optional[float] = 0.0 # 项目合同金额
|
|||
|
|
|||
|
# 学科信息
|
|||
|
discipline_1: Optional[str] = None # 依托学科1
|
|||
|
discipline_2: Optional[str] = None # 依托学科2
|
|||
|
discipline_3: Optional[str] = None # 依托学科3
|
|||
|
|
|||
|
# 人才培养数据
|
|||
|
doctoral_students: Optional[int] = 0 # 在读博士生
|
|||
|
master_students: Optional[int] = 0 # 在读硕士生
|
|||
|
graduated_doctoral: Optional[int] = 0 # 当年毕业博士
|
|||
|
graduated_master: Optional[int] = 0 # 当年毕业硕士
|
|||
|
undergraduate_courses: Optional[int] = 0 # 承担本科课程
|
|||
|
graduate_courses: Optional[int] = 0 # 承担研究生课程
|
|||
|
textbooks: Optional[int] = 0 # 大专院校教材
|
|||
|
|
|||
|
# 人员结构
|
|||
|
professors: Optional[int] = 0 # 教授人数
|
|||
|
associate_professors: Optional[int] = 0 # 副教授人数
|
|||
|
lecturers: Optional[int] = 0 # 讲师人数
|
|||
|
domestic_visitors: Optional[int] = 0 # 国内访问学者
|
|||
|
foreign_visitors: Optional[int] = 0 # 国外访问学者
|
|||
|
postdoc_in: Optional[int] = 0 # 本年度进站博士后
|
|||
|
postdoc_out: Optional[int] = 0 # 本年度出站博士后
|
|||
|
|
|||
|
# 基础设施
|
|||
|
center_area: Optional[float] = 0.0 # 工程中心面积
|
|||
|
new_area: Optional[float] = 0.0 # 当年新增面积
|
|||
|
fixed_personnel: Optional[int] = 0 # 固定人员
|
|||
|
mobile_personnel: Optional[int] = 0 # 流动人员
|
|||
|
|
|||
|
# 经费情况
|
|||
|
total_funding: Optional[float] = 0.0 # 当年项目到账总经费
|
|||
|
vertical_funding: Optional[float] = 0.0 # 纵向经费
|
|||
|
horizontal_funding: Optional[float] = 0.0 # 横向经费
|
|||
|
|
|||
|
# 服务情况
|
|||
|
technical_consultations: Optional[int] = 0 # 技术咨询次数
|
|||
|
training_services: Optional[int] = 0 # 培训服务人次
|
|||
|
|
|||
|
# 原有字段保留兼容性
|
|||
|
personnel: Optional[str] = None
|
|||
|
nationalProjects: Optional[str] = None
|
|||
|
otherProjects: Optional[str] = None
|
|||
|
achievements: Optional[str] = None
|
|||
|
labAchievements: Optional[str] = None
|
|||
|
image: Optional[str] = None
|
|||
|
score: Optional[int] = None
|
|||
|
evaluationData: Optional[List[float]] = None
|
|||
|
sub_dimension_evaluations: Optional[Dict[str, Any]] = None # 存储二级维度评估数据
|
|||
|
|
|||
|
class LabCreate(LabBase):
|
|||
|
id: str
|
|||
|
|
|||
|
class Lab(LabBase):
|
|||
|
id: str
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# 新闻模型
|
|||
|
class NewsBase(BaseModel):
|
|||
|
title: str
|
|||
|
date: str
|
|||
|
|
|||
|
class NewsCreate(NewsBase):
|
|||
|
dashboard_id: int
|
|||
|
|
|||
|
class News(NewsBase):
|
|||
|
id: int
|
|||
|
dashboard_id: int
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# 仪表盘数据模型
|
|||
|
class DashboardData(BaseModel):
|
|||
|
paperCount: int
|
|||
|
patentCount: int
|
|||
|
highImpactPapers: int
|
|||
|
keyProjects: int
|
|||
|
fundingAmount: str
|
|||
|
researcherStats: Dict[str, int]
|
|||
|
newsData: List[Dict[str, str]]
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# URL抓取请求模型
|
|||
|
class ScrapeRequest(BaseModel):
|
|||
|
url: str
|
|||
|
|
|||
|
# 保存评估数据请求模型
|
|||
|
class SaveDataRequest(BaseModel):
|
|||
|
data_type: str # "talent" 或 "lab"
|
|||
|
data: Dict[str, Any]
|
|||
|
|
|||
|
# 维度模型
|
|||
|
class SubDimensionBase(BaseModel):
|
|||
|
name: str
|
|||
|
weight: float = 1.0
|
|||
|
description: Optional[str] = None
|
|||
|
|
|||
|
class SubDimension(SubDimensionBase):
|
|||
|
id: Optional[int] = None
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
class DimensionBase(BaseModel):
|
|||
|
name: str
|
|||
|
weight: float = 0.0 # 一级维度不需要权重
|
|||
|
category: Optional[str] = None
|
|||
|
description: Optional[str] = None
|
|||
|
sub_dimensions: Optional[List[SubDimension]] = None
|
|||
|
subDimensions: Optional[List[SubDimension]] = None # 添加subDimensions作为别名,兼容前端
|
|||
|
|
|||
|
class DimensionCreate(DimensionBase):
|
|||
|
pass
|
|||
|
|
|||
|
class Dimension(DimensionBase):
|
|||
|
id: int
|
|||
|
|
|||
|
class Config:
|
|||
|
from_attributes = True
|
|||
|
|
|||
|
# 批量保存维度的请求模型
|
|||
|
class SaveDimensionsRequest(BaseModel):
|
|||
|
dimensions: List[DimensionBase]
|
|||
|
category: str # "talent" 或 "lab"
|