Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -692,14 +692,13 @@ class NutrientCalculator:
|
|
692 |
self.results = defaultdict(lambda: {'grams': 0.0, 'adds': defaultdict(float)})
|
693 |
self.target = {
|
694 |
'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
|
695 |
-
'NO3': 0, 'NH4': 0
|
696 |
}
|
697 |
self.actual = defaultdict(float)
|
698 |
self.fertilizers = {}
|
699 |
self.total_ec = 0.0
|
700 |
|
701 |
def set_target_profile(self, profile_data):
|
702 |
-
"""Устанавливаем целевые значения с преобразованием ключей"""
|
703 |
self.target.update({
|
704 |
'P': float(profile_data.get('P', 0)),
|
705 |
'K': float(profile_data.get('K', 0)),
|
@@ -711,7 +710,6 @@ class NutrientCalculator:
|
|
711 |
})
|
712 |
|
713 |
def set_fertilizers(self, fertilizers_data):
|
714 |
-
"""Преобразуем входные данные в единый формат"""
|
715 |
self.fertilizers = {
|
716 |
"Сульфат магния": {
|
717 |
"Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
|
@@ -740,13 +738,12 @@ class NutrientCalculator:
|
|
740 |
}
|
741 |
|
742 |
def calculate(self):
|
743 |
-
"""Новая логика расчёта с приоритетом по азоту"""
|
744 |
try:
|
745 |
-
# 1.
|
746 |
self._apply_fertilizer("Сульфат магния", "Mg")
|
747 |
self._apply_fertilizer("Монофосфат калия", "P")
|
748 |
|
749 |
-
# 2.
|
750 |
self._apply_fertilizer("Аммоний азотнокислый", "NH4")
|
751 |
|
752 |
# 3. Кальций с контролем NO3
|
@@ -754,7 +751,7 @@ class NutrientCalculator:
|
|
754 |
if remaining_no3 > 0.1:
|
755 |
self._apply_fertilizer("Кальциевая селитра", "Ca")
|
756 |
|
757 |
-
# 4. Калий
|
758 |
k_deficit = self.target['K'] - self.actual['K']
|
759 |
if k_deficit > 0.1:
|
760 |
if self.actual['NO3'] < self.target['NO3']:
|
@@ -773,7 +770,6 @@ class NutrientCalculator:
|
|
773 |
return False
|
774 |
|
775 |
def _apply_fertilizer(self, name, main_element, required_ppm=None):
|
776 |
-
"""Умное внесение удобрений с контролем NO3"""
|
777 |
if name not in self.fertilizers:
|
778 |
return
|
779 |
|
@@ -787,18 +783,18 @@ class NutrientCalculator:
|
|
787 |
if content <= 0:
|
788 |
return
|
789 |
|
790 |
-
#
|
791 |
if 'NO3' in self.fertilizers[name]:
|
792 |
no3_limit = max(self.target['NO3'] - self.actual['NO3'], 0)
|
793 |
if no3_limit <= 0:
|
794 |
-
return
|
795 |
max_grams = (no3_limit * self.volume) / (self.fertilizers[name]['NO3'] * 1000)
|
796 |
required_grams = (required_ppm * self.volume) / (content * 1000)
|
797 |
grams = min(required_grams, max_grams)
|
798 |
else:
|
799 |
grams = (required_ppm * self.volume) / (content * 1000)
|
800 |
|
801 |
-
#
|
802 |
self.results[name]['grams'] += grams
|
803 |
for element, percent in self.fertilizers[name].items():
|
804 |
added_ppm = (grams * percent * 1000) / self.volume
|
@@ -817,7 +813,6 @@ class NutrientCalculator:
|
|
817 |
)
|
818 |
|
819 |
def get_results(self):
|
820 |
-
"""Форматируем выходные данные"""
|
821 |
return {
|
822 |
'fertilizers': [
|
823 |
{
|
@@ -847,7 +842,7 @@ class NutrientCalculator:
|
|
847 |
}
|
848 |
}
|
849 |
|
850 |
-
@app.route('/
|
851 |
def handle_calculation():
|
852 |
try:
|
853 |
data = request.json
|
@@ -892,8 +887,5 @@ def handle_calculation():
|
|
892 |
|
893 |
|
894 |
|
895 |
-
|
896 |
-
|
897 |
-
|
898 |
if __name__ == '__main__':
|
899 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|
|
|
692 |
self.results = defaultdict(lambda: {'grams': 0.0, 'adds': defaultdict(float)})
|
693 |
self.target = {
|
694 |
'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
|
695 |
+
'NO3': 0, 'NH4': 0
|
696 |
}
|
697 |
self.actual = defaultdict(float)
|
698 |
self.fertilizers = {}
|
699 |
self.total_ec = 0.0
|
700 |
|
701 |
def set_target_profile(self, profile_data):
|
|
|
702 |
self.target.update({
|
703 |
'P': float(profile_data.get('P', 0)),
|
704 |
'K': float(profile_data.get('K', 0)),
|
|
|
710 |
})
|
711 |
|
712 |
def set_fertilizers(self, fertilizers_data):
|
|
|
713 |
self.fertilizers = {
|
714 |
"Сульфат магния": {
|
715 |
"Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
|
|
|
738 |
}
|
739 |
|
740 |
def calculate(self):
|
|
|
741 |
try:
|
742 |
+
# 1. Обязательные компоненты
|
743 |
self._apply_fertilizer("Сульфат магния", "Mg")
|
744 |
self._apply_fertilizer("Монофосфат калия", "P")
|
745 |
|
746 |
+
# 2. Азотный баланс
|
747 |
self._apply_fertilizer("Аммоний азотнокислый", "NH4")
|
748 |
|
749 |
# 3. Кальций с контролем NO3
|
|
|
751 |
if remaining_no3 > 0.1:
|
752 |
self._apply_fertilizer("Кальциевая селитра", "Ca")
|
753 |
|
754 |
+
# 4. Калий
|
755 |
k_deficit = self.target['K'] - self.actual['K']
|
756 |
if k_deficit > 0.1:
|
757 |
if self.actual['NO3'] < self.target['NO3']:
|
|
|
770 |
return False
|
771 |
|
772 |
def _apply_fertilizer(self, name, main_element, required_ppm=None):
|
|
|
773 |
if name not in self.fertilizers:
|
774 |
return
|
775 |
|
|
|
783 |
if content <= 0:
|
784 |
return
|
785 |
|
786 |
+
# Контроль NO3
|
787 |
if 'NO3' in self.fertilizers[name]:
|
788 |
no3_limit = max(self.target['NO3'] - self.actual['NO3'], 0)
|
789 |
if no3_limit <= 0:
|
790 |
+
return
|
791 |
max_grams = (no3_limit * self.volume) / (self.fertilizers[name]['NO3'] * 1000)
|
792 |
required_grams = (required_ppm * self.volume) / (content * 1000)
|
793 |
grams = min(required_grams, max_grams)
|
794 |
else:
|
795 |
grams = (required_ppm * self.volume) / (content * 1000)
|
796 |
|
797 |
+
# Обновление данных
|
798 |
self.results[name]['grams'] += grams
|
799 |
for element, percent in self.fertilizers[name].items():
|
800 |
added_ppm = (grams * percent * 1000) / self.volume
|
|
|
813 |
)
|
814 |
|
815 |
def get_results(self):
|
|
|
816 |
return {
|
817 |
'fertilizers': [
|
818 |
{
|
|
|
842 |
}
|
843 |
}
|
844 |
|
845 |
+
@app.route('/calculation', methods=['POST']) # Точный эндпоинт из ошибки
|
846 |
def handle_calculation():
|
847 |
try:
|
848 |
data = request.json
|
|
|
887 |
|
888 |
|
889 |
|
|
|
|
|
|
|
890 |
if __name__ == '__main__':
|
891 |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|