@@ -0,0 +1,17 @@
|
||||
from .animal_profile import LabAnimalProfile # noqa: F401
|
||||
from .component_nutrient_value import LabComponentNutrientValue # noqa: F401
|
||||
from .profile_norm import LabProfileNorm # noqa: F401
|
||||
from .racion_normy import ( # noqa: F401
|
||||
LabRacionNormyInfo,
|
||||
LabRacionNormyMoskwa,
|
||||
LabRacionNormyMoskwaMeta,
|
||||
LabRacionNormyPiter,
|
||||
LabRacionNormyPiterMeta,
|
||||
)
|
||||
from .ration_calc import ( # noqa: F401
|
||||
LabRationCalcIndicator,
|
||||
LabRationCalcTotal,
|
||||
LabRationCompoundLine,
|
||||
)
|
||||
from .ration_line import LabRationLine # noqa: F401
|
||||
from .recipe_ration import LabRecipeRation # noqa: F401
|
||||
@@ -0,0 +1,11 @@
|
||||
from sqlalchemy import Column, Integer, String
|
||||
|
||||
|
||||
class LabAuditMixin:
|
||||
version = Column(Integer, default=1, nullable=False)
|
||||
created_by = Column(String(50), nullable=False, default="system")
|
||||
updated_by = Column(String(50), nullable=False, default="system")
|
||||
|
||||
|
||||
# Backward alias during migration cleanup
|
||||
LabSyncMixin = LabAuditMixin
|
||||
@@ -0,0 +1,20 @@
|
||||
from sqlalchemy import Column, Float, Integer, String, Text
|
||||
|
||||
from app import db
|
||||
from app.models.base import SoftDeleteMixin, TimestampMixin, default_uuid
|
||||
|
||||
from ._mixins import LabAuditMixin
|
||||
|
||||
|
||||
class LabAnimalProfile(db.Model, TimestampMixin, SoftDeleteMixin, LabAuditMixin):
|
||||
__tablename__ = "lab_animal_profile"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
profile_key = Column(String(64), nullable=False, unique=True, index=True)
|
||||
label = Column(String(200), nullable=False)
|
||||
ration_type = Column(String(10), nullable=False, index=True)
|
||||
mass_kg = Column(Float, nullable=True)
|
||||
milk_yield_kg = Column(Float, nullable=True)
|
||||
external_no = Column(Integer, nullable=True)
|
||||
norms_method = Column(String(20), nullable=False, default="wesp", server_default="wesp")
|
||||
norms_params_json = Column(Text, nullable=True)
|
||||
@@ -0,0 +1,17 @@
|
||||
from sqlalchemy import Column, Float, ForeignKey, String, UniqueConstraint
|
||||
|
||||
from app import db
|
||||
|
||||
|
||||
class LabComponentNutrientValue(db.Model):
|
||||
"""Полная матрица показателей zootech «База сырья» (EAV, server-only)."""
|
||||
|
||||
__tablename__ = "lab_component_nutrient_value"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("component_id", "nutrient_key", name="uq_lab_comp_nutrient"),
|
||||
)
|
||||
|
||||
id = Column(String(36), primary_key=True)
|
||||
component_id = Column(String(36), ForeignKey("component.id"), nullable=False, index=True)
|
||||
nutrient_key = Column(String(80), nullable=False, index=True)
|
||||
value = Column(Float, nullable=True)
|
||||
@@ -0,0 +1,24 @@
|
||||
from sqlalchemy import Column, Float, ForeignKey, String, UniqueConstraint
|
||||
|
||||
from app import db
|
||||
from app.models.base import default_uuid
|
||||
|
||||
|
||||
class LabProfileNorm(db.Model):
|
||||
"""Min/max нормы показателя для профиля стада (server-only)."""
|
||||
|
||||
__tablename__ = "lab_profile_norm"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("profile_id", "indicator_key", name="uq_lab_profile_norm"),
|
||||
)
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
profile_id = Column(
|
||||
String(36),
|
||||
ForeignKey("lab_animal_profile.id"),
|
||||
nullable=False,
|
||||
index=True,
|
||||
)
|
||||
indicator_key = Column(String(64), nullable=False)
|
||||
min_value = Column(Float, nullable=True)
|
||||
max_value = Column(Float, nullable=True)
|
||||
@@ -0,0 +1,56 @@
|
||||
"""Справочники норм RACION (NORMY_*)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import Column, Float, Integer, String, Text, UniqueConstraint
|
||||
|
||||
from app import db
|
||||
from app.models.base import default_uuid
|
||||
|
||||
|
||||
class LabRacionNormyMoskwa(db.Model):
|
||||
__tablename__ = "lab_racion_normy_moskwa"
|
||||
__table_args__ = (UniqueConstraint("npitv", "pom", name="uq_lab_racion_moskwa_npitv_pom"),)
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
npitv = Column(Integer, nullable=False, index=True)
|
||||
pom = Column(Integer, nullable=False, default=1)
|
||||
koef = Column(Float, nullable=True)
|
||||
popr_k_json = Column(Text, nullable=True)
|
||||
|
||||
|
||||
class LabRacionNormyMoskwaMeta(db.Model):
|
||||
__tablename__ = "lab_racion_normy_moskwa_meta"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
meta_key = Column(String(32), nullable=False, unique=True)
|
||||
meta_json = Column(Text, nullable=True)
|
||||
|
||||
|
||||
class LabRacionNormyPiter(db.Model):
|
||||
__tablename__ = "lab_racion_normy_piter"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("npitv", "konc", "udoy", name="uq_lab_racion_piter_npitv_konc_udoy"),
|
||||
)
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
npitv = Column(Integer, nullable=False, index=True)
|
||||
konc = Column(Float, nullable=False)
|
||||
udoy = Column(Float, nullable=False)
|
||||
normy_json = Column(Text, nullable=True)
|
||||
|
||||
|
||||
class LabRacionNormyPiterMeta(db.Model):
|
||||
__tablename__ = "lab_racion_normy_piter_meta"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
meta_key = Column(String(32), nullable=False, unique=True)
|
||||
meta_json = Column(Text, nullable=True)
|
||||
|
||||
|
||||
class LabRacionNormyInfo(db.Model):
|
||||
__tablename__ = "lab_racion_normy_info"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
nperem = Column(Integer, nullable=False, unique=True, index=True)
|
||||
znachenie_json = Column(Text, nullable=True)
|
||||
@@ -0,0 +1,58 @@
|
||||
from sqlalchemy import Column, Float, ForeignKey, Integer, String
|
||||
|
||||
from app import db
|
||||
from app.models.base import default_uuid
|
||||
|
||||
|
||||
class LabRationCalcTotal(db.Model):
|
||||
__tablename__ = "lab_ration_calc_total"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
recipe_id = Column(
|
||||
String(36),
|
||||
ForeignKey("lab_recipe_ration.recipe_id"),
|
||||
nullable=False,
|
||||
index=True,
|
||||
)
|
||||
scope = Column(String(16), nullable=False, default="ration")
|
||||
metric_key = Column(String(32), nullable=False)
|
||||
label = Column(String(128), nullable=False, default="")
|
||||
value = Column(Float, nullable=True)
|
||||
sort_order = Column(Integer, nullable=False, default=0)
|
||||
|
||||
|
||||
class LabRationCalcIndicator(db.Model):
|
||||
__tablename__ = "lab_ration_calc_indicator"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
recipe_id = Column(
|
||||
String(36),
|
||||
ForeignKey("lab_recipe_ration.recipe_id"),
|
||||
nullable=False,
|
||||
index=True,
|
||||
)
|
||||
scope = Column(String(16), nullable=False, default="ration")
|
||||
indicator_key = Column(String(64), nullable=True)
|
||||
label = Column(String(128), nullable=False, default="")
|
||||
unit = Column(String(32), nullable=False, default="")
|
||||
min_value = Column(Float, nullable=True)
|
||||
max_value = Column(Float, nullable=True)
|
||||
content = Column(Float, nullable=True)
|
||||
diff = Column(Float, nullable=True)
|
||||
sort_order = Column(Integer, nullable=False, default=0)
|
||||
|
||||
|
||||
class LabRationCompoundLine(db.Model):
|
||||
__tablename__ = "lab_ration_compound_line"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
recipe_id = Column(
|
||||
String(36),
|
||||
ForeignKey("lab_recipe_ration.recipe_id"),
|
||||
nullable=False,
|
||||
index=True,
|
||||
)
|
||||
row_index = Column(Integer, nullable=False, default=0)
|
||||
ingredient_name = Column(String(200), nullable=True)
|
||||
daily_kg = Column(Float, nullable=True)
|
||||
share_pct = Column(Float, nullable=True)
|
||||
@@ -0,0 +1,21 @@
|
||||
from sqlalchemy import Boolean, Column, Float, ForeignKey, Integer, String
|
||||
|
||||
from app import db
|
||||
from app.models.base import SoftDeleteMixin, TimestampMixin, default_uuid
|
||||
|
||||
from ._mixins import LabAuditMixin
|
||||
|
||||
|
||||
class LabRationLine(db.Model, TimestampMixin, SoftDeleteMixin, LabAuditMixin):
|
||||
__tablename__ = "lab_ration_line"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=default_uuid)
|
||||
recipe_id = Column(String(36), ForeignKey("recipe.id"), nullable=False, index=True)
|
||||
component_id = Column(
|
||||
String(36), ForeignKey("component.id"), nullable=True, index=True
|
||||
)
|
||||
row_index = Column(Integer, nullable=False, default=0)
|
||||
ingredient_name = Column(String(200), nullable=True)
|
||||
daily_kg = Column(Float, nullable=True)
|
||||
in_ration = Column(Boolean, nullable=False, default=True)
|
||||
in_compound = Column(Boolean, nullable=False, default=False)
|
||||
@@ -0,0 +1,18 @@
|
||||
from sqlalchemy import Column, DateTime, ForeignKey, String
|
||||
|
||||
from app import db
|
||||
from app.models.base import SoftDeleteMixin, TimestampMixin
|
||||
|
||||
from ._mixins import LabAuditMixin
|
||||
|
||||
|
||||
class LabRecipeRation(db.Model, TimestampMixin, SoftDeleteMixin, LabAuditMixin):
|
||||
__tablename__ = "lab_recipe_ration"
|
||||
|
||||
recipe_id = Column(String(36), ForeignKey("recipe.id"), primary_key=True)
|
||||
animal_profile_id = Column(
|
||||
String(36), ForeignKey("lab_animal_profile.id"), nullable=True, index=True
|
||||
)
|
||||
calc_engine = Column(String(20), nullable=True)
|
||||
seed_source = Column(String(32), nullable=True)
|
||||
calculated_at = Column(DateTime, nullable=True)
|
||||
Reference in New Issue
Block a user