DmitrMakeev commited on
Commit
ed4919c
·
verified ·
1 Parent(s): 26c9ae8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -31
app.py CHANGED
@@ -690,11 +690,11 @@ class NutrientCalculator:
690
  def __init__(self, volume_liters=1.0):
691
  self.volume = volume_liters
692
  self.results = {}
693
- self.target_profile = {
694
  'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
695
- 'NO3': 0, 'NH4': 0 # Упрощенные ключи
696
  }
697
- self.actual_profile = {
698
  'P': 0.0, 'K': 0.0, 'Mg': 0.0, 'Ca': 0.0, 'S': 0.0,
699
  'NO3': 0.0, 'NH4': 0.0
700
  }
@@ -702,8 +702,7 @@ class NutrientCalculator:
702
  self.total_ec = 0.0
703
 
704
  def set_target_profile(self, profile_data):
705
- """Устанавливаем целевые значения с преобразованием ключей"""
706
- self.target_profile.update({
707
  'P': float(profile_data.get('P', 0)),
708
  'K': float(profile_data.get('K', 0)),
709
  'Mg': float(profile_data.get('Mg', 0)),
@@ -714,7 +713,6 @@ class NutrientCalculator:
714
  })
715
 
716
  def set_fertilizers(self, fertilizers_data):
717
- """Преобразуем входные данные в единый формат"""
718
  self.fertilizers = {
719
  "Сульфат магния": {
720
  "Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
@@ -743,7 +741,6 @@ class NutrientCalculator:
743
  }
744
 
745
  def calculate(self):
746
- """Новая логика расчёта с приоритетом по азоту"""
747
  try:
748
  # 1. Вносим обязательные компоненты
749
  self._apply_fertilizer("Сульфат магния", "Mg")
@@ -753,20 +750,20 @@ class NutrientCalculator:
753
  self._apply_fertilizer("Аммоний азотнокислый", "NH4")
754
 
755
  # 3. Кальций с контролем NO3
756
- remaining_no3 = max(self.target_profile['NO3'] - self.actual_profile['NO3'], 0)
757
  if remaining_no3 > 0.1:
758
  self._apply_fertilizer("Кальциевая селитра", "Ca")
759
 
760
  # 4. Калий с минимальным NO3
761
- k_deficit = self.target_profile['K'] - self.actual_profile['K']
762
  if k_deficit > 0.1:
763
- if self.actual_profile['NO3'] < self.target_profile['NO3']:
764
  self._apply_fertilizer("Калий азотнокислый", "K")
765
  else:
766
  self._apply_fertilizer("Калий сернокислый", "K")
767
 
768
  # 5. Сера
769
- s_deficit = self.target_profile['S'] - self.actual_profile['S']
770
  if s_deficit > 0.1:
771
  self._apply_fertilizer("Калий сернокислый", "S")
772
 
@@ -776,12 +773,11 @@ class NutrientCalculator:
776
  return False
777
 
778
  def _apply_fertilizer(self, name, main_element, required_ppm=None):
779
- """Умное внесение удобрений с контролем NO3"""
780
  if name not in self.fertilizers:
781
  return
782
 
783
  if required_ppm is None:
784
- required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
785
 
786
  if required_ppm <= 0:
787
  return
@@ -792,9 +788,9 @@ class NutrientCalculator:
792
 
793
  # Корректировка для NO3
794
  if 'NO3' in self.fertilizers[name]:
795
- no3_limit = max(self.target_profile['NO3'] - self.actual_profile['NO3'], 0)
796
  if no3_limit <= 0:
797
- return # Превышение NO3
798
  max_grams = (no3_limit * self.volume) / (self.fertilizers[name]['NO3'] * 1000)
799
  required_grams = (required_ppm * self.volume) / (content * 1000)
800
  grams = min(required_grams, max_grams)
@@ -809,7 +805,7 @@ class NutrientCalculator:
809
  self.results[name]['grams'] += grams
810
  for element, percent in self.fertilizers[name].items():
811
  added_ppm = (grams * percent * 1000) / self.volume
812
- self.actual_profile[element] += added_ppm
813
  if element not in self.results[name]['adds']:
814
  self.results[name]['adds'][element] = 0.0
815
  self.results[name]['adds'][element] += added_ppm
@@ -826,7 +822,6 @@ class NutrientCalculator:
826
  )
827
 
828
  def get_results(self):
829
- """Форматируем выходные данные"""
830
  return {
831
  'fertilizers': [
832
  {
@@ -836,23 +831,23 @@ class NutrientCalculator:
836
  } for name, data in self.results.items()
837
  ],
838
  'profile': [
839
- {'element': 'P', 'ppm': round(self.actual_profile['P'], 3)},
840
- {'element': 'K', 'ppm': round(self.actual_profile['K'], 3)},
841
- {'element': 'Mg', 'ppm': round(self.actual_profile['Mg'], 3)},
842
- {'element': 'Ca', 'ppm': round(self.actual_profile['Ca'], 3)},
843
- {'element': 'S', 'ppm': round(self.actual_profile['S'], 3)},
844
- {'element': 'N-NO3', 'ppm': round(self.actual_profile['NO3'], 3)},
845
- {'element': 'N-NH4', 'ppm': round(self.actual_profile['NH4'], 3)}
846
  ],
847
  'ec': round(self.total_ec, 2),
848
  'deficits': {
849
- 'Ca': max(self.target_profile['Ca'] - self.actual_profile['Ca'], 0),
850
- 'K': max(self.target_profile['K'] - self.actual_profile['K'], 0),
851
- 'Mg': max(self.target_profile['Mg'] - self.actual_profile['Mg'], 0),
852
- 'N (NH4+)': max(self.target_profile['NH4'] - self.actual_profile['NH4'], 0),
853
- 'N (NO3-)': max(self.target_profile['NO3'] - self.actual_profile['NO3'], 0),
854
- 'P': max(self.target_profile['P'] - self.actual_profile['P'], 0),
855
- 'S': max(self.target_profile['S'] - self.actual_profile['S'], 0)
856
  }
857
  }
858
 
 
690
  def __init__(self, volume_liters=1.0):
691
  self.volume = volume_liters
692
  self.results = {}
693
+ self.target = {
694
  'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
695
+ 'NO3': 0, 'NH4': 0
696
  }
697
+ self.actual = {
698
  'P': 0.0, 'K': 0.0, 'Mg': 0.0, 'Ca': 0.0, 'S': 0.0,
699
  'NO3': 0.0, 'NH4': 0.0
700
  }
 
702
  self.total_ec = 0.0
703
 
704
  def set_target_profile(self, profile_data):
705
+ self.target.update({
 
706
  'P': float(profile_data.get('P', 0)),
707
  'K': float(profile_data.get('K', 0)),
708
  'Mg': float(profile_data.get('Mg', 0)),
 
713
  })
714
 
715
  def set_fertilizers(self, fertilizers_data):
 
716
  self.fertilizers = {
717
  "Сульфат магния": {
718
  "Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
 
741
  }
742
 
743
  def calculate(self):
 
744
  try:
745
  # 1. Вносим обязательные компоненты
746
  self._apply_fertilizer("Сульфат магния", "Mg")
 
750
  self._apply_fertilizer("Аммоний азотнокислый", "NH4")
751
 
752
  # 3. Кальций с контролем NO3
753
+ remaining_no3 = max(self.target['NO3'] - self.actual['NO3'], 0)
754
  if remaining_no3 > 0.1:
755
  self._apply_fertilizer("Кальциевая селитра", "Ca")
756
 
757
  # 4. Калий с минимальным NO3
758
+ k_deficit = self.target['K'] - self.actual['K']
759
  if k_deficit > 0.1:
760
+ if self.actual['NO3'] < self.target['NO3']:
761
  self._apply_fertilizer("Калий азотнокислый", "K")
762
  else:
763
  self._apply_fertilizer("Калий сернокислый", "K")
764
 
765
  # 5. Сера
766
+ s_deficit = self.target['S'] - self.actual['S']
767
  if s_deficit > 0.1:
768
  self._apply_fertilizer("Калий сернокислый", "S")
769
 
 
773
  return False
774
 
775
  def _apply_fertilizer(self, name, main_element, required_ppm=None):
 
776
  if name not in self.fertilizers:
777
  return
778
 
779
  if required_ppm is None:
780
+ required_ppm = self.target[main_element] - self.actual[main_element]
781
 
782
  if required_ppm <= 0:
783
  return
 
788
 
789
  # Корректировка для NO3
790
  if 'NO3' in self.fertilizers[name]:
791
+ no3_limit = max(self.target['NO3'] - self.actual['NO3'], 0)
792
  if no3_limit <= 0:
793
+ return
794
  max_grams = (no3_limit * self.volume) / (self.fertilizers[name]['NO3'] * 1000)
795
  required_grams = (required_ppm * self.volume) / (content * 1000)
796
  grams = min(required_grams, max_grams)
 
805
  self.results[name]['grams'] += grams
806
  for element, percent in self.fertilizers[name].items():
807
  added_ppm = (grams * percent * 1000) / self.volume
808
+ self.actual[element] += added_ppm
809
  if element not in self.results[name]['adds']:
810
  self.results[name]['adds'][element] = 0.0
811
  self.results[name]['adds'][element] += added_ppm
 
822
  )
823
 
824
  def get_results(self):
 
825
  return {
826
  'fertilizers': [
827
  {
 
831
  } for name, data in self.results.items()
832
  ],
833
  'profile': [
834
+ {'element': 'P', 'ppm': round(self.actual['P'], 3)},
835
+ {'element': 'K', 'ppm': round(self.actual['K'], 3)},
836
+ {'element': 'Mg', 'ppm': round(self.actual['Mg'], 3)},
837
+ {'element': 'Ca', 'ppm': round(self.actual['Ca'], 3)},
838
+ {'element': 'S', 'ppm': round(self.actual['S'], 3)},
839
+ {'element': 'N-NO3', 'ppm': round(self.actual['NO3'], 3)},
840
+ {'element': 'N-NH4', 'ppm': round(self.actual['NH4'], 3)}
841
  ],
842
  'ec': round(self.total_ec, 2),
843
  'deficits': {
844
+ 'Ca': max(self.target['Ca'] - self.actual['Ca'], 0),
845
+ 'K': max(self.target['K'] - self.actual['K'], 0),
846
+ 'Mg': max(self.target['Mg'] - self.actual['Mg'], 0),
847
+ 'N (NH4+)': max(self.target['NH4'] - self.actual['NH4'], 0),
848
+ 'N (NO3-)': max(self.target['NO3'] - self.actual['NO3'], 0),
849
+ 'P': max(self.target['P'] - self.actual['P'], 0),
850
+ 'S': max(self.target['S'] - self.actual['S'], 0)
851
  }
852
  }
853