from app.core.base_schema import CommonSchema """基地与试验地管理 —— Pydantic 校验/序列化模型。""" from datetime import datetime from pydantic import BaseModel, ConfigDict, Field # ── 基地(site) ─────────────────────────────────────────────────────── class BreedingSiteBaseSchema(BaseModel): model_config = ConfigDict(from_attributes=True) site_name: str = Field(..., description="基地名称") address: str | None = Field(default=None, description="详细地址") area: float | None = Field(default=None, description="基地面积(亩)") longitude: float | None = Field(default=None, description="经度") latitude: float | None = Field(default=None, description="纬度") eco_type: str | None = Field(default=None, description="生态区类型") remark: str | None = Field(default=None, description="备注") class BreedingSiteCreateSchema(BreedingSiteBaseSchema): pass class BreedingSiteUpdateSchema(BreedingSiteBaseSchema): site_name: str | None = Field(default=None, description="基地名称") address: str | None = Field(default=None, description="详细地址") area: float | None = Field(default=None, description="基地面积(亩)") longitude: float | None = Field(default=None, description="经度") latitude: float | None = Field(default=None, description="纬度") eco_type: str | None = Field(default=None, description="生态区类型") remark: str | None = Field(default=None, description="备注") class BreedingSiteOutSchema(BreedingSiteBaseSchema): id: int uuid: str created_time: datetime | None = None updated_time: datetime | None = None created_by: CommonSchema | None = None updated_by: CommonSchema | None = None class BreedingSiteQueryParam(BaseModel): site_name: str | None = Field(default=None, description="基地名称(模糊查询)") eco_type: str | None = Field(default=None, description="生态区类型") model_config = ConfigDict( extra="ignore", json_schema_extra={ "site_name": ("like", "{param}"), "eco_type": ("eq", "{param}"), }, ) # ── 试验地(plot) ────────────────────────────────────────────────────── class BreedingPlotBaseSchema(BaseModel): model_config = ConfigDict(from_attributes=True) site_id: int = Field(..., description="所属基地ID") plot_code: str = Field(..., description="地块编号/名称") row_orientation: str | None = Field(default=None, description="行向(南北行/东西行)") row_count: int | None = Field(default=None, description="行数") col_count: int | None = Field(default=None, description="每行株数") grid_note: str | None = Field(default=None, description="株行距/网格说明") area: float | None = Field(default=None, description="地块面积(亩)") class BreedingPlotCreateSchema(BreedingPlotBaseSchema): pass class BreedingPlotUpdateSchema(BreedingPlotBaseSchema): site_id: int | None = Field(default=None, description="所属基地ID") plot_code: str | None = Field(default=None, description="地块编号/名称") row_orientation: str | None = Field(default=None, description="行向(南北行/东西行)") row_count: int | None = Field(default=None, description="行数") col_count: int | None = Field(default=None, description="每行株数") grid_note: str | None = Field(default=None, description="株行距/网格说明") area: float | None = Field(default=None, description="地块面积(亩)") class BreedingPlotOutSchema(BreedingPlotBaseSchema): id: int uuid: str site_name: str | None = None # 由 Service 层联表填充 created_time: datetime | None = None updated_time: datetime | None = None created_by: CommonSchema | None = None updated_by: CommonSchema | None = None class BreedingPlotQueryParam(BaseModel): site_id: int | None = Field(default=None, description="所属基地ID") plot_code: str | None = Field(default=None, description="地块编号(模糊查询)") row_orientation: str | None = Field(default=None, description="行向") model_config = ConfigDict( extra="ignore", json_schema_extra={ "site_id": ("eq", "{param}"), "plot_code": ("like", "{param}"), "row_orientation": ("eq", "{param}"), }, )