"""农事操作 数据模型""" from datetime import date from sqlalchemy import Date, Float, ForeignKey, Index, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.base_model import MappedBase, ModelMixin, UserMixin class FieldOperationModel(ModelMixin, UserMixin, MappedBase): """农事操作(§3.3;施肥/喷药/修剪/灌溉/疏果/套袋/采收)。 tree_id/plot_id 可空二选一:既可针对单株记录,也可针对整块小区记录。 """ __tablename__ = "bre_field_operation" 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 ) op_type: Mapped[str] = mapped_column( String(32), nullable=False, comment="操作类型(field_operation字典: fertilize/spray/prune/irrigate/thinning/bagging/harvest)" ) op_date: Mapped[date | None] = mapped_column(Date, nullable=True, comment="操作日期", default=None) op_detail: Mapped[str | None] = mapped_column(Text, nullable=True, comment="操作详情/用量", default=None) yield_kg: Mapped[float | None] = mapped_column(Float, nullable=True, comment="单株产量(kg,op_type=harvest)", default=None) fruit_count: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="果实个数(op_type=harvest)", default=None) avg_fruit_weight: Mapped[float | None] = mapped_column(Float, nullable=True, comment="平均单果重(g,op_type=harvest)", default=None) marketable_rate: Mapped[float | None] = mapped_column(Float, nullable=True, comment="好果率(%,op_type=harvest)", 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_field_operation_created_deleted", "created_time", "is_deleted"), )