from app.core.base_schema import CommonSchema """性状字典 —— Pydantic 校验/序列化模型。""" from datetime import datetime from pydantic import BaseModel, ConfigDict, Field class TraitBaseSchema(BaseModel): model_config = ConfigDict(from_attributes=True) trait_code: str = Field(..., description="性状编码") trait_name: str = Field(..., description="性状名称") category: str | None = Field(default=None, description="性状类别") data_type: str = Field(default=None, description="数据类型") unit: str | None = Field(default=None, description="单位") is_core: str = Field(default=None, description="是否核心性状") scale_json: str | None = Field(default=None, description="量规/分级JSON") valid_min: float | None = Field(default=None, description="有效最小值") valid_max: float | None = Field(default=None, description="有效最大值") ontology_uri: str | None = Field(default=None, description="本体IRI") stage: str = Field(default="evaluation", description="测定阶段(juvenile幼龄/evaluation成株)") method: str | None = Field(default=None, description="测定方法") method_uri: str | None = Field(default=None, description="测定方法URI") direction: str = Field(default="desc", description="性状方向(desc越大越好/asc越小越好)") into_ebv: str = Field(default="1", description="是否选种目标(1是/0否)") default_h2: float | None = Field(default=None, description="先验遗传力h²(实测缺失时兜底)") remark: str | None = Field(default=None, description="备注") class TraitCreateSchema(TraitBaseSchema): pass class TraitUpdateSchema(TraitBaseSchema): trait_code: str | None = Field(default=None, description="性状编码") trait_name: str | None = Field(default=None, description="性状名称") category: str | None = Field(default=None, description="性状类别") data_type: str | None = Field(default=None, description="数据类型") unit: str | None = Field(default=None, description="单位") is_core: str | None = Field(default=None, description="是否核心性状") scale_json: str | None = Field(default=None, description="量规/分级JSON") valid_min: float | None = Field(default=None, description="有效最小值") valid_max: float | None = Field(default=None, description="有效最大值") ontology_uri: str | None = Field(default=None, description="本体IRI") stage: str | None = Field(default=None, description="测定阶段(juvenile幼龄/evaluation成株)") method: str | None = Field(default=None, description="测定方法") method_uri: str | None = Field(default=None, description="测定方法URI") direction: str | None = Field(default=None, description="性状方向(desc越大越好/asc越小越好)") into_ebv: str | None = Field(default=None, description="是否选种目标(1是/0否)") default_h2: float | None = Field(default=None, description="先验遗传力h²(实测缺失时兜底)") remark: str | None = Field(default=None, description="备注") class TraitOutSchema(TraitBaseSchema): id: int uuid: str trait_code: str | None = None trait_name: str | None = None category: str | None = None data_type: str | None = None unit: str | None = None is_core: str | None = None scale_json: str | None = None valid_min: float | None = None valid_max: float | None = None ontology_uri: str | None = None stage: str | None = None direction: str | None = None into_ebv: str | None = None default_h2: float | None = None remark: str | None = None created_time: datetime | None = None updated_time: datetime | None = None created_by: CommonSchema | None = None updated_by: CommonSchema | None = None class TraitQueryParam(BaseModel): trait_code: str | None = Field(default=None, description="性状编码", json_schema_extra={"q": "like"}) trait_name: str | None = Field(default=None, description="性状名称", json_schema_extra={"q": "like"}) category: str | None = Field(default=None, description="性状类别", json_schema_extra={"q": "eq"}) data_type: str | None = Field(default=None, description="数据类型", json_schema_extra={"q": "eq"}) is_core: str | None = Field(default=None, description="是否核心性状", json_schema_extra={"q": "eq"}) stage: str | None = Field(default=None, description="测定阶段", json_schema_extra={"q": "eq"}) direction: str | None = Field(default=None, description="性状方向", json_schema_extra={"q": "eq"}) into_ebv: str | None = Field(default=None, description="是否选种目标", json_schema_extra={"q": "eq"})