DmitrMakeev commited on
Commit
b9cdb18
·
verified ·
1 Parent(s): 234b68b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -62
app.py CHANGED
@@ -703,7 +703,7 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
703
  "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
704
  "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
705
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
706
- "Сульфат магния": {"Mg": 0.09861, "S": 0.13010}, # Исправлено содержание Mg
707
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
708
  }
709
 
@@ -735,23 +735,19 @@ class NutrientCalculator:
735
 
736
  def calculate(self):
737
  try:
738
- # Применяем удобрения в правильном порядке
739
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
740
  self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
741
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
742
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
743
 
744
- # Восполняем дефицит NO3-
745
  current_no3 = self.actual_profile['N (NO3-)']
746
  no3_needed = self.target_profile['N (NO3-)'] - current_no3
747
 
748
  if no3_needed > 0.1:
749
  self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
750
 
751
- # Восполняем дефицит S и K
752
  self._apply_k_sulfate()
753
 
754
- # Восполняем оставшийся дефицит K
755
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
756
  if k_deficit > 0.1:
757
  self._apply("Калий азотнокислый", "K", k_deficit)
@@ -804,20 +800,19 @@ class NutrientCalculator:
804
  return
805
 
806
  try:
807
- # Рассчитываем сколько нужно внести для покрытия дефицита S
808
  if s_def > 0.1:
809
  s_content = self.fertilizers[fert]["S"]
810
- grams_needed = (s_def * self.volume) / (s_content * 1000)
811
 
812
- # Проверяем, не приведет ли это к избытку K
813
  k_content = self.fertilizers[fert]["K"]
814
- k_added = (grams_needed * k_content * 1000) / self.volume
815
 
816
- if k_added > k_def and k_def > 0:
817
- # Если добавляем слишком много K, уменьшаем количество
818
- grams_needed = (k_def * self.volume) / (k_content * 1000)
819
-
820
- self._apply(fert, "S", (grams_needed * s_content * 1000) / self.volume)
 
821
  except Exception as e:
822
  print(f"Ошибка при расчёте сульфата калия: {str(e)}")
823
  raise
@@ -825,62 +820,61 @@ class NutrientCalculator:
825
  def calculate_ec(self):
826
  return round(self.total_ec, 2)
827
 
828
- def print_report(self):
829
- try:
830
- print("\n" + "="*60)
831
- print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
832
- print("="*60)
833
- table = [[el, round(self.actual_profile[el], 1)] for el in self.actual_profile]
834
- print(tabulate(table, headers=["Элемент", "ppm"]))
835
-
836
- print("\nИсходный расчёт азота:")
837
- for form, val in self.initial_n_profile.items():
838
- print(f" {form}: {round(val, 1)} ppm")
839
-
840
- print("\n" + "="*60)
841
- print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
842
- print("="*60)
843
- print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1)} ppm") # Исправлено здесь
844
- print(f"EC: {self.calculate_ec()} mS/cm")
845
-
846
- print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
847
- fert_table = []
848
- for fert, data in self.results.items():
849
- adds = [f"+{k}: {v:.1f} ppm" for k, v in data.items() if k.startswith('внесет')]
850
- fert_table.append([
851
- fert,
852
- round(data['граммы'], 3),
853
- data['миллиграммы'],
854
- round(data['вклад в EC'], 3),
855
- "\n".join(adds)
856
- ])
857
- print(tabulate(fert_table,
858
- headers=["Удобрение", "Граммы", "Миллиграммы", "EC (мСм/см)", "Добавит"]))
859
-
860
- print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
861
- deficit = {
862
- k: round(self.target_profile[k] - self.actual_profile[k], 1)
863
- for k in self.target_profile
864
- if abs(self.target_profile[k] - self.actual_profile[k]) > 0.1
865
- }
866
- if deficit:
867
- for el, val in deficit.items():
868
- print(f" {el}: {val} ppm")
869
- else:
870
- print(" Все элементы покрыты полностью")
871
- except Exception as e:
872
- print(f"Ошибка при выводе отчёта: {str(e)}")
873
- raise
874
 
875
  if __name__ == "__main__":
876
  try:
877
  calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
878
  calculator.calculate()
879
- calculator.print_report()
880
  except Exception as e:
881
  print(f"Критическая ошибка: {str(e)}")
882
 
883
 
884
-
885
  if __name__ == '__main__':
886
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
 
703
  "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
704
  "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
705
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
706
+ "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
707
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
708
  }
709
 
 
735
 
736
  def calculate(self):
737
  try:
 
738
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
739
  self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
740
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
741
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
742
 
 
743
  current_no3 = self.actual_profile['N (NO3-)']
744
  no3_needed = self.target_profile['N (NO3-)'] - current_no3
745
 
746
  if no3_needed > 0.1:
747
  self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
748
 
 
749
  self._apply_k_sulfate()
750
 
 
751
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
752
  if k_deficit > 0.1:
753
  self._apply("Калий азотнокислый", "K", k_deficit)
 
800
  return
801
 
802
  try:
 
803
  if s_def > 0.1:
804
  s_content = self.fertilizers[fert]["S"]
805
+ grams_s = (s_def * self.volume) / (s_content * 1000)
806
 
 
807
  k_content = self.fertilizers[fert]["K"]
808
+ k_from_s = (grams_s * k_content * 1000) / self.volume
809
 
810
+ if k_from_s > k_def and k_def > 0.1:
811
+ grams = (k_def * self.volume) / (k_content * 1000)
812
+ else:
813
+ grams = grams_s
814
+
815
+ self._apply(fert, "S", s_def)
816
  except Exception as e:
817
  print(f"Ошибка при расчёте сульфата калия: {str(e)}")
818
  raise
 
820
  def calculate_ec(self):
821
  return round(self.total_ec, 2)
822
 
823
+ def print_report(self):
824
+ try:
825
+ print("\n" + "="*60)
826
+ print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
827
+ print("="*60)
828
+ table = [[el, round(self.actual_profile[el], 1)] for el in self.actual_profile]
829
+ print(tabulate(table, headers=["Элемент", "ppm"]))
830
+
831
+ print("\nИсходный расчёт азота:")
832
+ for form, val in self.initial_n_profile.items():
833
+ print(f" {form}: {round(val, 1)} ppm")
834
+
835
+ print("\n" + "="*60)
836
+ print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
837
+ print("="*60)
838
+ print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1)} ppm")
839
+ print(f"EC: {self.calculate_ec()} mS/cm")
840
+
841
+ print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
842
+ fert_table = []
843
+ for fert, data in self.results.items():
844
+ adds = [f"+{k}: {v:.1f} ppm" for k, v in data.items() if k.startswith('внесет')]
845
+ fert_table.append([
846
+ fert,
847
+ round(data['граммы'], 3),
848
+ data['миллиграммы'],
849
+ round(data['вклад в EC'], 3),
850
+ "\n".join(adds)
851
+ ])
852
+ print(tabulate(fert_table,
853
+ headers=["Удобрение", "Граммы", "Миллиграммы", "EC (мСм/см)", "Добавит"]))
854
+
855
+ print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
856
+ deficit = {
857
+ k: round(self.target_profile[k] - self.actual_profile[k], 1)
858
+ for k in self.target_profile
859
+ if abs(self.target_profile[k] - self.actual_profile[k]) > 0.1
860
+ }
861
+ if deficit:
862
+ for el, val in deficit.items():
863
+ print(f" {el}: {val} ppm")
864
+ else:
865
+ print(" Все элементы покрыты полностью")
866
+ except Exception as e:
867
+ print(f"Ошибка при выводе отчёта: {str(e)}")
868
+ raise
869
 
870
  if __name__ == "__main__":
871
  try:
872
  calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
873
  calculator.calculate()
874
+ calculator.print_report() # Правильный вызов метода класса
875
  except Exception as e:
876
  print(f"Критическая ошибка: {str(e)}")
877
 
878
 
 
879
  if __name__ == '__main__':
880
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))