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

246 lines
8.2 KiB
Python
Raw 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.

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"