DmitrMakeev commited on
Commit
0d3a2e1
·
verified ·
1 Parent(s): 78eb065

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -30
app.py CHANGED
@@ -692,41 +692,41 @@ class NutrientCalculator:
692
  self.results = {}
693
  self.target_profile = {
694
  'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
695
- 'N (NO3-)': 0, 'N (NH4+)': 0
696
  }
697
  self.actual_profile = {
698
  'P': 0.0, 'K': 0.0, 'Mg': 0.0, 'Ca': 0.0, 'S': 0.0,
699
- 'N (NO3-)': 0.0, 'N (NH4+)': 0.0
700
  }
701
  self.fertilizers = {}
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)),
710
  'Ca': float(profile_data.get('Ca', 0)),
711
  'S': float(profile_data.get('S', 0)),
712
- 'N (NO3-)': float(profile_data.get('N (NO3-)', 0)), # Берём как есть
713
- 'N (NH4+)': float(profile_data.get('N (NH4+)', 0)) # Без пересчёта
714
  })
715
 
716
  def set_fertilizers(self, fertilizers_data):
717
- """Устанавливаем состав удобрений из входных данных"""
718
  self.fertilizers = {
719
  "Кальциевая селитра": {
720
- "N (NO3-)": float(fertilizers_data["Кальциевая селитра"]["N (NO3-)"]),
721
  "Ca": float(fertilizers_data["Кальциевая селитра"]["Ca"])
722
  },
723
  "Калий азотнокислый": {
724
- "N (NO3-)": float(fertilizers_data["Калий азотнокислый"]["N (NO3-)"]),
725
  "K": float(fertilizers_data["Калий азотнокислый"]["K"])
726
  },
727
  "Аммоний азотнокислый": {
728
- "N (NO3-)": float(fertilizers_data["Аммоний азотнокислый"]["N (NO3-)"]),
729
- "N (NH4+)": float(fertilizers_data["Аммоний азотнокислый"]["N (NH4+)"])
730
  },
731
  "Сульфат магния": {
732
  "Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
@@ -743,31 +743,32 @@ class NutrientCalculator:
743
  }
744
 
745
  def calculate(self):
746
- """Оригинальная логика расчёта без изменений"""
747
  try:
748
  # 1. Вносим сульфат магния (Mg + S)
749
  self._apply_fertilizer("Сульфат магния", "Mg")
750
 
751
- # 2. Вносим кальциевую селитру (Ca + NO3)
752
- self._apply_fertilizer("Кальциевая селитра", "Ca")
753
-
754
- # 3. Вносим монофосфат калия (P + K)
755
  self._apply_fertilizer("Монофосфат калия", "P")
756
 
757
- # 4. Вносим аммоний азотнокислый (NH4 + NO3)
758
- self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)")
759
 
760
- # 5. Довносим NO3 через калийную селитру при необходимости
761
- no3_deficit = self.target_profile['N (NO3-)'] - self.actual_profile['N (NO3-)']
762
- if no3_deficit > 0.1:
763
- self._apply_fertilizer("Калий азотнокислый", "N (NO3-)", no3_deficit)
764
 
765
- # 6. Довносим калий при необходимости
766
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
767
  if k_deficit > 0.1:
768
- self._apply_fertilizer("Калий азотнокислый", "K", k_deficit)
 
 
 
 
769
 
770
- # 7. Довносим серу через сульфат калия при необходимости
771
  s_deficit = self.target_profile['S'] - self.actual_profile['S']
772
  if s_deficit > 0.1:
773
  self._apply_fertilizer("Калий сернокислый", "S", s_deficit)
@@ -778,7 +779,7 @@ class NutrientCalculator:
778
  return False
779
 
780
  def _apply_fertilizer(self, name, main_element, required_ppm=None):
781
- """Метод внесения удобрений без изменений"""
782
  if required_ppm is None:
783
  required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
784
 
@@ -789,6 +790,12 @@ class NutrientCalculator:
789
  if content <= 0:
790
  return
791
 
 
 
 
 
 
 
792
  grams = (required_ppm * self.volume) / (content * 1000)
793
 
794
  # Запись результатов
@@ -807,7 +814,7 @@ class NutrientCalculator:
807
  ec_coefficients = {
808
  'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
809
  'Ca': 0.0016, 'S': 0.0014,
810
- 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
811
  }
812
  self.total_ec += sum(
813
  added_ppm * ec_coefficients.get(element, 0.0015)
@@ -815,7 +822,7 @@ class NutrientCalculator:
815
  )
816
 
817
  def get_results(self):
818
- """Форматирование результатов без изменений"""
819
  return {
820
  'fertilizers': [
821
  {
@@ -826,13 +833,14 @@ class NutrientCalculator:
826
  ],
827
  'profile': [
828
  {
829
- 'element': k.replace(' (NO3-)', '-NO3').replace(' (NH4+)', '-NH4'),
830
  'ppm': round(v, 3)
831
  } for k, v in self.actual_profile.items()
832
  ],
833
  'ec': round(self.total_ec, 2),
834
  'deficits': {
835
- k: max(self.target_profile[k] - self.actual_profile.get(k, 0), 0)
 
836
  for k in self.target_profile
837
  }
838
  }
@@ -894,6 +902,5 @@ def handle_calculation():
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 = {}
693
  self.target_profile = {
694
  'P': 0, 'K': 0, 'Mg': 0, 'Ca': 0, 'S': 0,
695
+ 'NO3': 0, 'NH4': 0 # Изменил ключи на NO3/NH4 без скобок
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
  }
701
  self.fertilizers = {}
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)),
710
  'Ca': float(profile_data.get('Ca', 0)),
711
  'S': float(profile_data.get('S', 0)),
712
+ 'NO3': float(profile_data.get('N (NO3-)', 0)), # Преобразуем ключ
713
+ 'NH4': float(profile_data.get('N (NH4+)', 0)) # Преобразуем ключ
714
  })
715
 
716
  def set_fertilizers(self, fertilizers_data):
717
+ """Устанавливаем состав удобрений с преобразованием ключей"""
718
  self.fertilizers = {
719
  "Кальциевая селитра": {
720
+ "NO3": float(fertilizers_data["Кальциевая селитра"]["N (NO3-)"]),
721
  "Ca": float(fertilizers_data["Кальциевая селитра"]["Ca"])
722
  },
723
  "Калий азотнокислый": {
724
+ "NO3": float(fertilizers_data["Калий азотнокислый"]["N (NO3-)"]),
725
  "K": float(fertilizers_data["Калий азотнокислый"]["K"])
726
  },
727
  "Аммоний азотнокислый": {
728
+ "NO3": float(fertilizers_data["Аммоний азотнокислый"]["N (NO3-)"]),
729
+ "NH4": float(fertilizers_data["Аммоний азотнокислый"]["N (NH4+)"])
730
  },
731
  "Сульфат магния": {
732
  "Mg": float(fertilizers_data["Сульфат магния"]["Mg"]),
 
743
  }
744
 
745
  def calculate(self):
746
+ """Логика расчёта с приоритетом по нитратам"""
747
  try:
748
  # 1. Вносим сульфат магния (Mg + S)
749
  self._apply_fertilizer("Сульфат магния", "Mg")
750
 
751
+ # 2. Вносим монофосфат калия (P + K)
 
 
 
752
  self._apply_fertilizer("Монофосфат калия", "P")
753
 
754
+ # 3. Вносим аммоний азотнокислый (NH4 + NO3)
755
+ self._apply_fertilizer("Аммоний азотнокислый", "NH4")
756
 
757
+ # 4. Жёстко контролируем NO3:
758
+ # - Если нужно меньше, чем уже внесено, пропускаем кальциевую селитру
759
+ if self.target_profile['NO3'] > self.actual_profile['NO3']:
760
+ self._apply_fertilizer("Кальциевая селитра", "Ca")
761
 
762
+ # 5. Довносим K через калийную селитру или сульфат калия
763
  k_deficit = self.target_profile['K'] - self.actual_profile['K']
764
  if k_deficit > 0.1:
765
+ # Выбираем удобрение с минимальным NO3
766
+ if self.actual_profile['NO3'] < self.target_profile['NO3']:
767
+ self._apply_fertilizer("Калий азотнокислый", "K", k_deficit)
768
+ else:
769
+ self._apply_fertilizer("Калий сернокислый", "K", k_deficit)
770
 
771
+ # 6. Довносим серу при необходимости
772
  s_deficit = self.target_profile['S'] - self.actual_profile['S']
773
  if s_deficit > 0.1:
774
  self._apply_fertilizer("Калий сернокислый", "S", s_deficit)
 
779
  return False
780
 
781
  def _apply_fertilizer(self, name, main_element, required_ppm=None):
782
+ """Метод внесения удобрений с контролем NO3"""
783
  if required_ppm is None:
784
  required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
785
 
 
790
  if content <= 0:
791
  return
792
 
793
+ # Корректируем граммы, если NO3 превышает целевое значение
794
+ if 'NO3' in self.fertilizers[name]:
795
+ no3_added = (required_ppm / content) * self.fertilizers[name]['NO3']
796
+ if self.actual_profile['NO3'] + no3_added > self.target_profile['NO3']:
797
+ required_ppm = max(0, (self.target_profile['NO3'] - self.actual_profile['NO3']) * content / self.fertilizers[name]['NO3'])
798
+
799
  grams = (required_ppm * self.volume) / (content * 1000)
800
 
801
  # Запись результатов
 
814
  ec_coefficients = {
815
  'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
816
  'Ca': 0.0016, 'S': 0.0014,
817
+ 'NO3': 0.0017, 'NH4': 0.0019
818
  }
819
  self.total_ec += sum(
820
  added_ppm * ec_coefficients.get(element, 0.0015)
 
822
  )
823
 
824
  def get_results(self):
825
+ """Форматирование результатов с обратным преобразованием ключей"""
826
  return {
827
  'fertilizers': [
828
  {
 
833
  ],
834
  'profile': [
835
  {
836
+ 'element': 'N-NO3' if k == 'NO3' else 'N-NH4' if k == 'NH4' else k,
837
  'ppm': round(v, 3)
838
  } for k, v in self.actual_profile.items()
839
  ],
840
  'ec': round(self.total_ec, 2),
841
  'deficits': {
842
+ 'N (NO3-)' if k == 'NO3' else 'N (NH4+)' if k == 'NH4' else k:
843
+ max(self.target_profile[k] - self.actual_profile.get(k, 0), 0)
844
  for k in self.target_profile
845
  }
846
  }
 
902
 
903
 
904
 
 
905
  if __name__ == '__main__':
906
  app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))