41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
from __future__ import annotations
|
||
|
||
from app.modules.zootech.lab.models import LabRationLine
|
||
|
||
|
||
def find_rations_by_component(component_id: str) -> list[str]:
|
||
"""Recipe IDs с не удалёнными строками рациона, использующими component."""
|
||
if not component_id:
|
||
return []
|
||
rows = (
|
||
LabRationLine.query.filter_by(component_id=component_id, is_deleted=False)
|
||
.with_entities(LabRationLine.recipe_id)
|
||
.distinct()
|
||
.all()
|
||
)
|
||
return sorted({str(r[0]) for r in rows if r[0]})
|
||
|
||
|
||
def recalculate_rations(recipe_ids: list[str], user_id: str = "system") -> dict:
|
||
from app.modules.zootech.lab.commands.recalculate import recalculate_ration
|
||
|
||
ok: list[str] = []
|
||
failed: dict[str, str] = {}
|
||
results: dict[str, dict] = {}
|
||
for recipe_id in recipe_ids:
|
||
try:
|
||
results[recipe_id] = recalculate_ration(recipe_id, user_id)
|
||
ok.append(recipe_id)
|
||
except Exception as exc:
|
||
failed[recipe_id] = str(exc)
|
||
return {"ok": ok, "failed": failed, "results": results}
|
||
|
||
|
||
def on_component_nutrients_changed(component_id: str, user_id: str = "system") -> dict:
|
||
"""Найти и пересчитать все рационы с данным компонентом (для будущего UI)."""
|
||
recipe_ids = find_rations_by_component(component_id)
|
||
if not recipe_ids:
|
||
return {"recipeIds": [], "ok": [], "failed": {}}
|
||
report = recalculate_rations(recipe_ids, user_id)
|
||
return {"recipeIds": recipe_ids, **report}
|