DmitrMakeev commited on
Commit
79975ed
·
verified ·
1 Parent(s): 506e0b6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -14
app.py CHANGED
@@ -693,8 +693,8 @@ from tabulate import tabulate
693
 
694
  INPUT_DATA = {
695
  "fertilizerConstants": {
696
- "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca_nitrate": 0.16972}, # Только нитратный кальций
697
- "Хелат кальция": {"Ca_chelate": 0.10}, # Только хелатный кальций
698
  "Калий азотнокислый": {"N (NO3-)": 0.13854, "K": 0.36672},
699
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
700
  "Сульфат магния": {"Mg": 0.10220, "S": 0.13483},
@@ -703,8 +703,8 @@ INPUT_DATA = {
703
  },
704
  "profileSettings": {
705
  "P": 31, "K": 210, "Mg": 24, "S": 57.5,
706
- "Ca_nitrate_target": 62, # Чётко 62 ppm из селитры
707
- "Ca_chelate_target": 20, # Чётко 20 ppm из хелата
708
  "NO3_RAT": 8.25, "TOTAL_NITROG": 125, "liters": 100
709
  }
710
  }
@@ -722,8 +722,8 @@ class NutrientCalculator:
722
  'K': self.profile["K"],
723
  'Mg': self.profile["Mg"],
724
  'S': self.profile["S"],
725
- 'Ca_nitrate': self.profile["Ca_nitrate_target"], # 62 ppm
726
- 'Ca_chelate': self.profile["Ca_chelate_target"], # 20 ppm
727
  'N (NO3-)': self.profile["TOTAL_NITROG"] * (self.profile["NO3_RAT"] / total_parts),
728
  'N (NH4+)': self.profile["TOTAL_NITROG"] * (1 / total_parts)
729
  }
@@ -735,6 +735,48 @@ class NutrientCalculator:
735
  }
736
  self.results = {fert: {'граммы': 0.0} for fert in self.fertilizers}
737
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
738
  def calculate(self):
739
  # 1. Вносим хелатный кальций - строго 20 ppm
740
  self._apply_fertilizer("Хелат кальция", "Ca_chelate", self.target["Ca_chelate"])
@@ -742,28 +784,24 @@ class NutrientCalculator:
742
  # 2. Вносим нитратный кальций - строго 62 ppm
743
  self._apply_fertilizer("Кальциевая селитра", "Ca_nitrate", self.target["Ca_nitrate"])
744
 
745
- # 3. Остальные элементы (как было)
746
  self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target["N (NH4+)"])
747
  self._apply_fertilizer("Монофосфат калия", "P", self.target["P"])
748
  self._apply_fertilizer("Сульфат магния", "Mg", self.target["Mg"])
749
  self._balance_k_s()
750
 
751
- # 4. Балансируем нитратный азот (учитываем уже внесённый из кальц��евой селитры)
752
  no3_needed = self.target["N (NO3-)"] - self.actual["N (NO3-)"]
753
  if no3_needed > 0:
754
  self._apply_fertilizer("Калий азотнокислый", "N (NO3-)", no3_needed)
755
 
756
  return self._verify_results()
757
 
758
- # ... остальные методы остаются без изменений ...
759
-
760
  def generate_report(self, results):
761
  fert_table = []
762
  for name, data in results['fertilizers'].items():
763
- if data['граммы'] > 0: # Показываем только используемые удобрения
764
- fert_table.append([name, f"{data['граммы']} г"])
765
 
766
- # Добавляем строку с суммарным кальцием
767
  total_ca = self.actual['Ca_nitrate'] + self.actual['Ca_chelate']
768
  ca_diff = total_ca - (self.target['Ca_nitrate'] + self.target['Ca_chelate'])
769
 
@@ -785,9 +823,13 @@ class NutrientCalculator:
785
  report += tabulate(element_table,
786
  headers=["Элемент", "Цель", "Факт", "Отклонение"],
787
  tablefmt="grid")
 
 
 
 
788
  return report
789
 
790
- # Использование
791
  calculator = NutrientCalculator(
792
  fertilizer_constants=INPUT_DATA["fertilizerConstants"],
793
  profile_settings=INPUT_DATA["profileSettings"],
 
693
 
694
  INPUT_DATA = {
695
  "fertilizerConstants": {
696
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca_nitrate": 0.16972},
697
+ "Хелат кальция": {"Ca_chelate": 0.10},
698
  "Калий азотнокислый": {"N (NO3-)": 0.13854, "K": 0.36672},
699
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
700
  "Сульфат магния": {"Mg": 0.10220, "S": 0.13483},
 
703
  },
704
  "profileSettings": {
705
  "P": 31, "K": 210, "Mg": 24, "S": 57.5,
706
+ "Ca_nitrate_target": 62,
707
+ "Ca_chelate_target": 20,
708
  "NO3_RAT": 8.25, "TOTAL_NITROG": 125, "liters": 100
709
  }
710
  }
 
722
  'K': self.profile["K"],
723
  'Mg': self.profile["Mg"],
724
  'S': self.profile["S"],
725
+ 'Ca_nitrate': self.profile["Ca_nitrate_target"],
726
+ 'Ca_chelate': self.profile["Ca_chelate_target"],
727
  'N (NO3-)': self.profile["TOTAL_NITROG"] * (self.profile["NO3_RAT"] / total_parts),
728
  'N (NH4+)': self.profile["TOTAL_NITROG"] * (1 / total_parts)
729
  }
 
735
  }
736
  self.results = {fert: {'граммы': 0.0} for fert in self.fertilizers}
737
 
738
+ def _apply_fertilizer(self, name, element, target_ppm):
739
+ if name not in self.fertilizers:
740
+ raise KeyError(f"Удобрение '{name}' не найдено!")
741
+ content = self.fertilizers[name].get(element, 0)
742
+ if content == 0:
743
+ print(f"ПРЕДУПРЕЖДЕНИЕ: Удобрение '{name}' не содержит элемент '{element}'")
744
+ return
745
+ grams = (target_ppm * self.volume) / (content * 1000)
746
+ self.results[name]['граммы'] += round(grams, self.rounding_precision)
747
+ for el, val in self.fertilizers[name].items():
748
+ if el in self.actual:
749
+ added_ppm = (grams * val * 1000) / self.volume
750
+ self.actual[el] += round(added_ppm, self.rounding_precision)
751
+
752
+ def _balance_k_s(self):
753
+ k_needed = self.target["K"] - self.actual["K"]
754
+ s_needed = self.target["S"] - self.actual["S"]
755
+
756
+ if k_needed > 0 and s_needed > 0:
757
+ k_fraction = self.fertilizers["Калий сернокислый"].get("K", 0)
758
+ s_fraction = self.fertilizers["Калий сернокислый"].get("S", 0)
759
+ if k_fraction == 0 or s_fraction == 0:
760
+ return
761
+ k_from_k2so4 = min(k_needed, s_needed * k_fraction / s_fraction)
762
+ self._apply_fertilizer("Калий сернокислый", "K", k_from_k2so4)
763
+
764
+ remaining_k = self.target["K"] - self.actual["K"]
765
+ if remaining_k > 0:
766
+ self._apply_fertilizer("Калий азотнокислый", "K", remaining_k)
767
+
768
+ def _verify_results(self):
769
+ deficits = {}
770
+ for el in self.target:
771
+ diff = self.target[el] - self.actual[el]
772
+ if abs(diff) > 0.1:
773
+ deficits[el] = round(diff, self.rounding_precision)
774
+ return {
775
+ 'fertilizers': {k: round(v['граммы'], self.rounding_precision) for k, v in self.results.items() if v['граммы'] > 0},
776
+ 'actual_profile': {k: round(v, self.rounding_precision) for k, v in self.actual.items()},
777
+ 'deficits': deficits
778
+ }
779
+
780
  def calculate(self):
781
  # 1. Вносим хелатный кальций - строго 20 ppm
782
  self._apply_fertilizer("Хелат кальция", "Ca_chelate", self.target["Ca_chelate"])
 
784
  # 2. Вносим нитратный кальций - строго 62 ppm
785
  self._apply_fertilizer("Кальциевая селитра", "Ca_nitrate", self.target["Ca_nitrate"])
786
 
787
+ # 3. Остальные элементы
788
  self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target["N (NH4+)"])
789
  self._apply_fertilizer("Монофосфат калия", "P", self.target["P"])
790
  self._apply_fertilizer("Сульфат магния", "Mg", self.target["Mg"])
791
  self._balance_k_s()
792
 
793
+ # 4. Балансируем нитратный азот
794
  no3_needed = self.target["N (NO3-)"] - self.actual["N (NO3-)"]
795
  if no3_needed > 0:
796
  self._apply_fertilizer("Калий азотнокислый", "N (NO3-)", no3_needed)
797
 
798
  return self._verify_results()
799
 
 
 
800
  def generate_report(self, results):
801
  fert_table = []
802
  for name, data in results['fertilizers'].items():
803
+ fert_table.append([name, f"{data} г"])
 
804
 
 
805
  total_ca = self.actual['Ca_nitrate'] + self.actual['Ca_chelate']
806
  ca_diff = total_ca - (self.target['Ca_nitrate'] + self.target['Ca_chelate'])
807
 
 
823
  report += tabulate(element_table,
824
  headers=["Элемент", "Цель", "Факт", "Отклонение"],
825
  tablefmt="grid")
826
+ if results['deficits']:
827
+ report += "\n\nВНИМАНИЕ: Обнаружены небольшие отклонения:"
828
+ for el, diff in results['deficits'].items():
829
+ report += f"\n- {el}: не хватает {abs(diff)} ppm"
830
  return report
831
 
832
+ # Запуск расчета
833
  calculator = NutrientCalculator(
834
  fertilizer_constants=INPUT_DATA["fertilizerConstants"],
835
  profile_settings=INPUT_DATA["profileSettings"],