DmitrMakeev commited on
Commit
10731f0
·
verified ·
1 Parent(s): bbeec9c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -14
app.py CHANGED
@@ -767,9 +767,11 @@ class NutrientCalculator:
767
 
768
  # Веса компенсации для элементов (кроме азотов)
769
  self.element_compensation_weights = {
770
- "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
771
- "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
772
- "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"}
 
 
773
  }
774
 
775
  # Расчёт азота
@@ -851,11 +853,18 @@ class NutrientCalculator:
851
  raise
852
 
853
  def _compensate_element(self, element):
854
- needed = self.target_profile[element] - self.actual_profile.get(element, 0)
855
- if needed <= 0:
856
- return
857
 
858
- candidates = []
 
 
 
 
 
 
 
859
  for weight_key, weight_data in self.element_compensation_weights.items():
860
  fert_name = weight_data["fert"]
861
  if element in self.fertilizers.get(fert_name, {}):
@@ -865,14 +874,14 @@ class NutrientCalculator:
865
  'content': self.fertilizers[fert_name][element]
866
  })
867
 
868
- if not candidates:
869
- raise ValueError(f"Нет удобрений для элемента {element}")
870
 
871
- total_weight = sum(c['weight'] for c in candidates)
872
- for candidate in candidates:
873
- share = candidate['weight'] / total_weight
874
- ppm_to_apply = needed * share
875
- self._apply(candidate['name'], element, ppm_to_apply)
876
 
877
  def calculate_ec(self):
878
  return round(self.total_ec, 2)
 
767
 
768
  # Веса компенсации для элементов (кроме азотов)
769
  self.element_compensation_weights = {
770
+ "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
771
+ "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
772
+ "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"},
773
+ "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
774
+ "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "NO3"}
775
  }
776
 
777
  # Расчёт азота
 
853
  raise
854
 
855
  def _compensate_element(self, element):
856
+ needed = self.target_profile[element] - self.actual_profile.get(element, 0)
857
+ if needed <= 0:
858
+ return
859
 
860
+ candidates = []
861
+
862
+ # Для азотных соединений особый случай
863
+ if element in ['NH4', 'NO3']:
864
+ # Здесь ваша текущая логика для NH4 и NO3
865
+ pass
866
+ else:
867
+ # Стандартная компенсация для других элементов
868
  for weight_key, weight_data in self.element_compensation_weights.items():
869
  fert_name = weight_data["fert"]
870
  if element in self.fertilizers.get(fert_name, {}):
 
874
  'content': self.fertilizers[fert_name][element]
875
  })
876
 
877
+ if not candidates:
878
+ raise ValueError(f"Нет удобрений для элемента {element}")
879
 
880
+ total_weight = sum(abs(c['weight']) for c in candidates) # Берем модуль весов
881
+ for candidate in candidates:
882
+ share = abs(candidate['weight']) / total_weight # Используем модуль веса
883
+ ppm_to_apply = needed * share
884
+ self._apply(candidate['name'], element, ppm_to_apply)
885
 
886
  def calculate_ec(self):
887
  return round(self.total_ec, 2)