Files
site/apps/api/app/modules/zootech/lab/indicators.py
T
2026-07-17 12:57:18 +03:00

170 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Все показатели рациона для расчёта и сравнения с нормами профиля."""
from __future__ import annotations
from typing import Any
def _ind(
key: str,
label: str,
unit: str,
nutrient_keys: list[str] | None = None,
*,
aggregation: str = "daily_total",
derived: str | None = None,
**extra: Any,
) -> dict[str, Any]:
row: dict[str, Any] = {
"key": key,
"label": label,
"unit": unit,
"nutrient_keys": nutrient_keys or [],
"aggregation": aggregation,
}
if derived:
row["derived"] = derived
row.update(extra)
return row
# Порядок: базовые → расширенные zootech → производные
RATION_ALL_INDICATORS: list[dict[str, Any]] = [
_ind("dry_matter", "Сухое вещество", "г", ["СВ"]),
_ind("dm_main", "СВ — основной корм", "г", ["Осн.Корм", "СВ Основной корм"]),
_ind("oe", "ОЭ — КРС / Дойн", "MJ", ["ОЭ-КРС", " ОЭ-КРС", "OЭ КРС форм"]),
_ind("nel", "ЧЭЛ — КРС / Дойн", "MJ", ["ЧЭЛ- КРС", " ЧЭЛ- КРС", "ЧЭЛ - КРС Форм"]),
_ind("nel_per_kg_dm", "ЧЭЛ/кг СВ", "MJ", derived="nel_per_kg_dm"),
_ind("crude_protein", "Сырой протеин", "г", ["Сыр. Протеин"]),
_ind("rup_per_kg_dm", "Нер. СП / кг СВ", "г", ["Нер. СП / кг СВ"], aggregation="weighted_avg"),
_ind("insoluble_protein", "Нерастворимый протеин", "г", ["Нераствор протеин ", "Нерастворим прот ", "Нерастворим прот"]),
_ind("insoluble_protein_pct", "% нераств. протеин", "%", ["% нераств. протеин", "% нераствор протеин"], aggregation="weighted_avg"),
_ind("usp", "уСП", "г", ["уСП", "уСП формул"]),
_ind("usp_pct_dm", "% уСП/кг СВ", "%", ["% уСП/кг СВ", "% уСП/кг СР"], aggregation="weighted_avg"),
_ind("usp_per_kg_dm", "уСП/кг СВ", "г", derived="g_per_kg_dm", from_key="usp"),
_ind("usp_in_om", "уСП в ОВ", "г", ["уСП в ОР", "уСП в ОВ"]),
_ind("usp_low_fat", "уСП <7% СЖ", "г", ["уСП<7%CЖ"], aggregation="weighted_avg"),
_ind("usp_high_fat", "уСП >7% СЖ", "г", ["уСП>7%CЖ"], aggregation="weighted_avg"),
_ind("ndf", "Сырая клетчатка", "г", ["Сырая клетч", "Сырая клетчатка", "НДК"]),
_ind("ndf_total", "НДК общ", "г", ["НДК Общ", "НДК"]),
_ind("ndf_main_feed", "НДК осн. корм", "г", ["НДК Осн. Корм"]),
_ind("adf_total", "КДК общ", "г", ["КДК общ", "КДК"]),
_ind("structural_fiber", "Структур. клетчатка", "г", ["Структур клетч", "Структур. клетчатка"]),
_ind("structural_fiber_pct", "% стр. клетчатки", "%", ["% стр Сыр. Клетчатк.", "% стр Сыр. Клетч."], aggregation="weighted_avg"),
_ind("crude_fat", "Сырой жир", "г", ["Сырой жир"]),
_ind("rnb", "RNB", "г", ["RNB", "БРА", " БРА "], derived="rnb"),
_ind("calcium", "Ca", "г", ["Ca"]),
_ind("phosphorus", "P", "г", ["P"]),
_ind("magnesium", "Mg", "г", ["Mg"]),
_ind("sodium", "Na", "г", ["Na"]),
_ind("potassium", "K", "г", ["K"]),
_ind("dcab", "DCAB", "мэкв", ["DCAB Форм", "DCAB"]),
_ind("sugar_starch", "Сахар и крахмал", "г", ["Сахар и Крохм"]),
_ind("sugar_digestible_starch", "Сахар и усв. крахмал", "г", ["Сахар и усв. крох"]),
_ind("insoluble_starch", "Нераств. крахмал", "г", ["Нераств. Крохмал", "Нераств Крохм", "Нераств крахмал"]),
_ind("insoluble_starch_alt", "Нераств. крахмал (2)", "г", ["Нераств крохмал"]),
_ind("insoluble_starch_pct", "% нераств. крахмала", "%", ["% Нераств крохм"], aggregation="weighted_avg"),
_ind("sugar", "Сахар", "г", ["Сахар"]),
_ind("starch", "Крахмал", "г", ["Крахмал"]),
_ind("starch_pct_dm", "% крахмала СВ", "%", ["% Крохмал. СВ", "доля крохмала"], aggregation="weighted_avg"),
_ind("carotene", "Каротин", "мг", ["Каротин"]),
_ind("beta_carotene", "β-каротин", "мг", ["b -Каротин"]),
_ind("linoleic_acid", "Линолевая к-та", "г", ["Линолевая к-та"]),
_ind("linolenic_acid", "Линоленовая к-та", "г", ["Линоленовая ки-та"]),
_ind("butyric_acid", "Масляная к-та", "г", ["Масляная ки-та"]),
_ind("arachidonic_acid", "Арахидоновая к-та", "г", ["Арахидоновая ки-та"]),
_ind("polyenoic_acid", "Полиэновая к-та", "г", ["Полиэновая ки-та"]),
_ind("urea", "Мочевина", "г", ["Мочевина"]),
_ind("crude_ash", "Сырая зола", "г", ["Сырая зола"]),
_ind("nfe", "БЭВ", "г", ["БЕР", "БЭВ"]),
_ind("tdn_cattle", "КРС орг. вещество", "г", ["КРС Орг Вещ", "ВРХ Орг Вещ"]),
_ind("digestible_organic_matter", "Перевар. орг. вещество", "г", ["Перевар Орг Вещ", "Переварим Орг Вещ"]),
_ind("cp_cattle", "КРС протеин", "г", ["КРС Протеин"]),
_ind("digestible_protein", "Перевар. протеин", "г", ["Перевар Протеин", "Переварим Протеин"]),
_ind("fat_cattle", "КРС сырой жир", "г", ["КРС Сырой жир", "КРС Сирий жир", "КРС Сирой жир"]),
_ind("digestible_fat", "Перевар. сырой жир", "г", ["Перевар Сырой жир", "Перевар Сирой жир", "Переварим Сырой жир"]),
_ind("fiber_cattle", "КРС сырая клетчатка", "г", ["КРС Сырая клетч"]),
_ind("digestible_fiber", "Перевар. сырая клетчатка", "г", ["Перевар сыр клетч", "Переварим сырая клетч"]),
_ind("nfe_cattle", "КРС БЭВ", "г", ["КРС БЭВ"]),
_ind("digestible_nfe", "Перевар. БЭВ", "г", ["Перевар БЭВ", "Переварим БЭВ"]),
_ind("feed_value", "ВЕ", "", ["ВЕ"], aggregation="weighted_avg"),
_ind("fat_per_kg_dm", "СЖ/кг СВ", "г", derived="g_per_kg_dm", from_key="crude_fat"),
_ind("nsp_per_kg_dm", "НСП/кг СВ", "г", ["НСП/кг СВ"], aggregation="weighted_avg"),
_ind("cp_per_kg_dm", "СП/кг СВ", "г", derived="g_per_kg_dm", from_key="crude_protein"),
_ind("dom_per_kg_dm", "пОВ/кг СВ", "г", derived="g_per_kg_dm", from_key="digestible_organic_matter"),
_ind(
"digestible_fat_per_kg_dm",
"пСЖ/кг СВ",
"г",
derived="g_per_kg_dm",
from_key="digestible_fat",
),
_ind("fiber_pct_per_kg_dm", "%СК/кг СВ", "%", derived="pct_of_dm", from_key="ndf"),
_ind("fat_pct_per_kg_dm", "%-СЖ/кг СВ", "%", derived="pct_of_dm", from_key="crude_fat"),
_ind("usp_pct_per_kg_dm", "%-уСП / кг СВ", "%", derived="pct_of_dm", from_key="usp"),
_ind("ca_pct_per_kg_dm", "%-Ca / кг СВ", "%", derived="pct_of_dm", from_key="calcium"),
_ind("p_pct_per_kg_dm", "%-P / кг СВ", "%", derived="pct_of_dm", from_key="phosphorus"),
_ind("k_pct_per_kg_dm", "%-К / кг СВ", "%", derived="pct_of_dm", from_key="potassium"),
_ind("na_pct_per_kg_dm", "%-Na / кг СВ", "%", derived="pct_of_dm", from_key="sodium"),
_ind("mg_pct_per_kg_dm", "%-Mg / кг СВ", "%", derived="pct_of_dm", from_key="magnesium"),
_ind("ndf_pct_dm", "НДК % от СВ", "%", derived="pct_of_dm", from_key="ndf"),
_ind("ndf_main_pct_dm", "НДК-ОК % от СВ", "%", derived="pct_of_dm", from_key="ndf_main_feed"),
_ind("adf_pct_dm", "КДК % от СВ", "%", derived="pct_of_dm", from_key="adf_total"),
_ind("nfc_pct_dm", "НКВ % от СВ", "%", derived="pct_of_dm", from_key="nfe"),
_ind("sw_per_kg_dm", "SW / кг СВ", "", ["SW / кг СВ ()"], aggregation="weighted_avg"),
_ind("metab_oet", "Метаб. ОЕТ", "г", ["Метаб ОЕТ", "OEB"]),
_ind("metab_lysine", "Метаб. лизин", "г", ["Метаб лизин", "Лизин"]),
_ind("metab_threonine", "Метаб. треонин", "г", ["Метабол Треон", "Треонин"]),
_ind("metab_leucine", "Метаб. лейцин", "г", ["Метаб Лейц", "Метабол Лейцин", "Лейцин"]),
_ind("metab_isoleucine", "Метаб. изолейцин", "г", ["Метаб Изол", "Метабол Изолейц", "Изолейцин"]),
_ind("metab_valine", "Метаб. валин", "г", ["Метаб Вал", "Метабол Валин", "Валин"]),
_ind("vitamin_a", "Витамин А", "МЕ", ["Вит А"]),
_ind("vitamin_d", "Витамин D", "МЕ", ["Вит D"]),
_ind("vitamin_e", "Витамин Е", "мг", ["Вит Е"]),
_ind("vitamin_b1", "Витамин В1", "мг", ["Вит В1"]),
_ind("vitamin_b2", "Витамин В2", "мг", ["Вит В2"]),
_ind("vitamin_b6", "Витамин В6", "мг", ["Вит В6"]),
_ind("vitamin_b12", "Витамин В12", "мкг", ["Вит В12"]),
_ind("calcium_pantothenate", "Пантотенат кальция", "мг", ["Пант Кальц", "Пантеонат Кальция"]),
_ind("niacin", "Никотиновая к-та", "мг", ["Никот Ки-та", "Никотиновая кислота"]),
_ind("folic_acid", "Фолиевая к-та", "мг", ["Фол ки-та", "Фолиева кислота"]),
_ind("choline", "Холин", "мг", ["Холин"]),
_ind("biotin", "Биотин", "мкг", ["Биотин"]),
_ind("iron", "Fe", "мг", ["Fe"]),
_ind("zinc", "Zn", "мг", ["Zn"]),
_ind("copper", "Cu", "мг", ["Cu"]),
_ind("cobalt", "Co", "мг", ["Co"]),
_ind("manganese", "Mn", "мг", ["Mn"]),
_ind("selenium", "Se", "мг", ["Se"]),
_ind("iodine", "J", "мг", ["J"]),
_ind("oet", "OET", "", ["OEB", "OET"]),
_ind("synthesis_mj", "Синтез", "МДж", ["Синтез Мдж"]),
_ind("ca_p_ratio", "Са:P", "", derived="ratio", ratio_num="calcium", ratio_den="phosphorus"),
_ind("k_na_ratio", "K:Na", "", derived="ratio", ratio_num="potassium", ratio_den="sodium"),
_ind("ration_dm_pct_bw", "Рацион % СВ от веса", "%", derived="dm_pct_bw"),
_ind("ration_pct_bw", "Рацион % от веса", "%", derived="ration_pct_bw"),
# Дубликаты ключей норм (укр. заголовки) — тот же расчёт
_ind("ndf_pct_dm_uk", "НДК % від СВ", "%", derived="alias", alias_of="ndf_pct_dm"),
_ind("ndf_main_pct_dm_uk", "НДК-ОК % від СВ", "%", derived="alias", alias_of="ndf_main_pct_dm"),
_ind("adf_pct_dm_uk", "КДК % від СВ", "%", derived="alias", alias_of="adf_pct_dm"),
_ind("nfc_pct_dm_uk", "НКВ % від СВ", "%", derived="alias", alias_of="nfc_pct_dm"),
]
# Обратная совместимость
RATION_QUALITY_INDICATORS = RATION_ALL_INDICATORS
_INDICATOR_BY_KEY = {d["key"]: d for d in RATION_ALL_INDICATORS}
_LABEL_TO_KEY = {d["label"]: d["key"] for d in RATION_ALL_INDICATORS}
def indicator_by_key(key: str) -> dict[str, Any] | None:
return _INDICATOR_BY_KEY.get(key)
def label_to_indicator_key(label: str) -> str | None:
return _LABEL_TO_KEY.get(label)
def calc_indicator_keys() -> frozenset[str]:
return frozenset(_INDICATOR_BY_KEY)