"""通用观测(EAV长表) 数据模型""" from datetime import date from sqlalchemy import Date, ForeignKey, Index, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.base_model import MappedBase, ModelMixin, UserMixin class ObservationModel(ModelMixin, UserMixin, MappedBase): """通用观测 EAV 长表(§3.2;与 tree_evaluation 经统一性状值视图归一)。 EAV 通用观测:trait_id 可空(不强制挂性状),obs_value 按 obs_type (numeric/text/date) 解释,均存 text。 """ __tablename__ = "bre_observation" tree_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_tree.id", ondelete="CASCADE"), index=True, nullable=True, comment="单株(可空)", default=None ) plot_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_plot.id", ondelete="CASCADE"), index=True, nullable=True, comment="小区(可空)", default=None ) germplasm_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_germplasm.id", ondelete="CASCADE"), index=True, nullable=True, comment="种质资源(可空,描述性观测)", default=None ) trait_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_trait.id", ondelete="CASCADE"), index=True, nullable=True, comment="性状(可空,EAV)", default=None ) obs_date: Mapped[date | None] = mapped_column(Date, nullable=True, comment="观测日期", default=None) obs_year: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="观测年份", default=None) obs_value: Mapped[str | None] = mapped_column(Text, nullable=True, comment="观测值(text多态,按obs_type解释)", default=None) obs_type: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="观测类型(numeric/text/date)", default=None) trial_study_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_trial_study.id", ondelete="CASCADE"), index=True, nullable=True, comment="试验(可空)", default=None ) operator_id: Mapped[int | None] = mapped_column( Integer, ForeignKey("bre_personnel.id", ondelete="CASCADE"), index=True, nullable=True, comment="观测人", default=None ) remark: Mapped[str | None] = mapped_column(String(512), nullable=True, comment="备注", default=None) status: Mapped[int] = mapped_column(Integer, nullable=False, default=1, comment="状态(1正常/0停用)") __table_args__ = ( Index("ix_bre_observation_created_deleted", "created_time", "is_deleted"), )