DmitrMakeev commited on
Commit
9e1fef7
·
verified ·
1 Parent(s): 6291860

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -31
app.py CHANGED
@@ -841,6 +841,83 @@ class NutrientCalculator:
841
  "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
842
  "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "N (NO3-)"}
843
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
844
 
845
  def _compensate_element(self, element):
846
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
@@ -893,37 +970,6 @@ class NutrientCalculator:
893
  ppm_to_apply = needed * share
894
  self._apply(candidate['name'], element, ppm_to_apply)
895
 
896
- # ... остальной код ...
897
-
898
- def calculate(self):
899
- try:
900
- # Вносим магний через компенсацию
901
- self._compensate_element("Mg")
902
-
903
- # Теперь вносим кальций через компенсацию, а не напрямую
904
- self._compensate_element("Ca")
905
-
906
- # Вносим фосфор через компенсацию
907
- self._compensate_element("P")
908
-
909
- # Вносим аммонийный азот напрямую
910
- self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
911
-
912
- # Компенсируем нитратный азот через компенсацию
913
- self._compensate_element("N (NO3-)")
914
-
915
- # Компенсируем серу через компенсацию
916
- self._compensate_element("S")
917
-
918
- # Компенсируем калий через компенсацию
919
- self._compensate_element("K")
920
-
921
- return self.results
922
- except Exception as e:
923
- print(f"Ошибка при расчёте: {str(e)}")
924
- raise
925
-
926
-
927
 
928
  def calculate_ec(self):
929
  return round(self.total_ec, 2)
 
841
  "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
842
  "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "N (NO3-)"}
843
  }
844
+ # Расчёт азота
845
+ total_parts = NO3_RATIO + NH4_RATIO
846
+ self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
847
+ self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
848
+
849
+ def _label(self, element):
850
+ """Форматирование названий элементов для вывода"""
851
+ labels = {
852
+ 'N (NO3-)': 'NO3',
853
+ 'N (NH4+)': 'NH4'
854
+ }
855
+ return labels.get(element, element)
856
+
857
+ def calculate(self):
858
+ try:
859
+ # Вносим магний через компенсацию
860
+ self._compensate_element("Mg")
861
+
862
+ # Вносим кальций напрямую
863
+ self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
864
+
865
+ # Вносим фосфор через компенсацию
866
+ self._compensate_element("P")
867
+
868
+ # Вносим аммонийный азот напрямую
869
+ self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
870
+
871
+ # Компенсируем нитратный азот напрямую
872
+ current_no3 = self.actual_profile['N (NO3-)']
873
+ no3_needed = self.target_profile['N (NO3-)'] - current_no3
874
+ if no3_needed > 0.1:
875
+ self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
876
+
877
+ # Компенсируем серу через компенсацию
878
+ self._compensate_element("S")
879
+
880
+ # Компенсируем калий через компенсацию
881
+ self._compensate_element("K")
882
+
883
+ return self.results
884
+ except Exception as e:
885
+ print(f"Ошибка при расчёте: {str(e)}")
886
+ raise
887
+
888
+ def _apply(self, fert_name, main_element, required_ppm):
889
+ if required_ppm <= 0:
890
+ return
891
+
892
+ try:
893
+ content = self.fertilizers[fert_name][main_element]
894
+ grams = (required_ppm * self.volume) / (content * 1000)
895
+
896
+ if fert_name not in self.results:
897
+ result = {
898
+ 'граммы': 0.0,
899
+ 'миллиграммы': 0,
900
+ 'вклад в EC': 0.0
901
+ }
902
+ for element in self.fertilizers[fert_name]:
903
+ result[f'внесет {self._label(element)}'] = 0.0
904
+ self.results[fert_name] = result
905
+
906
+ self.results[fert_name]['граммы'] += grams
907
+ self.results[fert_name]['миллиграммы'] += int(grams * 1000)
908
+
909
+ fert_ec = 0.0
910
+ for element, percent in self.fertilizers[fert_name].items():
911
+ added_ppm = (grams * percent * 1000) / self.volume
912
+ self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
913
+ self.actual_profile[element] += added_ppm
914
+ fert_ec += added_ppm * EC_COEFFICIENTS.get(element, 0.0015)
915
+
916
+ self.results[fert_name]['вклад в EC'] += fert_ec
917
+ self.total_ec += fert_ec
918
+ except KeyError as e:
919
+ print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
920
+ raise
921
 
922
  def _compensate_element(self, element):
923
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
 
970
  ppm_to_apply = needed * share
971
  self._apply(candidate['name'], element, ppm_to_apply)
972
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
973
 
974
  def calculate_ec(self):
975
  return round(self.total_ec, 2)