DmitrMakeev commited on
Commit
3c3d1dc
·
verified ·
1 Parent(s): 192c3e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -30
app.py CHANGED
@@ -979,45 +979,140 @@ if __name__ == "__main__":
979
 
980
 
981
 
982
- @app.route('/calculation', methods=['POST'])
983
- def handle_calculation():
984
- try:
985
- data = request.json
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
986
 
987
- # 1. СОЗДАЕМ КАЛЬКУЛЯТОР С НУЖНЫМ ОБЪЕМОМ
988
- calculator = NutrientCalculator(volume_liters=data['profileSettings']['liters'])
 
 
 
 
 
989
 
990
- # 2. ПЕРЕЗАПИСЫВАЕМ ВСЕ ЗНАЧЕНИЯ ИЗ ЗАПРОСА (БЕЗ СОХРАНЕНИЯ СТАРЫХ)
991
- calculator.target_profile = {
992
- 'P': float(data['profileSettings']['P']),
993
- 'K': float(data['profileSettings']['K']),
994
- 'Mg': float(data['profileSettings']['Mg']),
995
- 'Ca': float(data['profileSettings']['Ca']),
996
- 'S': float(data['profileSettings']['S']),
997
- 'N (NO3-)': float(data['profileSettings']['N (NO3-)']), # Берем ТОЛЬКО из запроса
998
- 'N (NH4+)': float(data['profileSettings']['N (NH4+)']) # Берем ТОЛЬКО из запроса
 
 
 
 
 
 
 
 
 
 
 
 
999
  }
1000
 
1001
- # 3. УСТАНАВЛИВАЕМ ПАРАМЕТРЫ УДОБРЕНИЙ ИЗ ЗАПРОСА
1002
- calculator.fertilizers = {
1003
- fert: {el: float(p) for el, p in nutrients.items()}
1004
- for fert, nutrients in data['fertilizerConstants'].items()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1005
  }
 
1006
 
1007
- # 4. ВЫПОЛНЯЕМ РАСЧЕТ (ИСПОЛЬЗУЕТ ТОЛЬКО ПЕРЕДАННЫЕ ДАННЫЕ)
1008
- calculator.calculate()
 
 
 
 
 
 
 
 
 
 
 
 
1009
 
1010
- # 5. ВОЗВРАЩАЕМ РЕЗУЛЬТАТ
1011
- return jsonify(calculator.get_web_results())
1012
 
1013
  except Exception as e:
1014
- return jsonify({
1015
- "error": str(e),
1016
- "message": "Ошибка расчета"
1017
- }), 500
1018
-
1019
-
1020
-
1021
 
1022
 
1023
 
 
979
 
980
 
981
 
982
+ class WebNutrientCalculator:
983
+ def __init__(self, volume_liters=1.0):
984
+ self.volume = volume_liters
985
+ self.results = {}
986
+ self.target_profile = {}
987
+ self.actual_profile = {}
988
+ self.fertilizers = {}
989
+ self.total_ec = 0.0
990
+
991
+ def web_calculate(self, profile_settings, fertilizer_constants):
992
+ """Основная функция расчета для веб-интерфейса"""
993
+ try:
994
+ # 1. Устанавливаем целевой профиль из параметров
995
+ self.target_profile = {
996
+ 'P': float(profile_settings['P']),
997
+ 'K': float(profile_settings['K']),
998
+ 'Mg': float(profile_settings['Mg']),
999
+ 'Ca': float(profile_settings['Ca']),
1000
+ 'S': float(profile_settings['S']),
1001
+ 'N (NO3-)': float(profile_settings['N (NO3-)']),
1002
+ 'N (NH4+)': float(profile_settings['N (NH4+)'])
1003
+ }
1004
+
1005
+ # 2. Устанавливаем параметры удобрений
1006
+ self.fertilizers = fertilizer_constants
1007
+
1008
+ # 3. Выполняем расчет по новой логике
1009
+ self._web_apply("Сульфат магния", "Mg", self.target_profile['Mg'])
1010
+ self._web_apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
1011
+ self._web_apply("Монофосфат калия", "P", self.target_profile['P'])
1012
+ self._web_apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
1013
+
1014
+ # 4. Коррекция NO3
1015
+ current_no3 = self.actual_profile.get('N (NO3-)', 0)
1016
+ no3_needed = self.target_profile['N (NO3-)'] - current_no3
1017
+ if no3_needed > 0.1:
1018
+ self._web_apply("Калий азотнокислый", "N (NO3-)", no3_needed)
1019
+
1020
+ # 5. Коррекция K и S
1021
+ self._web_apply_k_sulfate()
1022
+
1023
+ # 6. Финалный расчет EC
1024
+ self.total_ec = self._web_calculate_ec()
1025
+
1026
+ return self._web_get_results()
1027
+
1028
+ except Exception as e:
1029
+ print(f"WebCalculator error: {str(e)}")
1030
+ raise
1031
+
1032
+ def _web_apply(self, fert_name, main_element, required_ppm):
1033
+ """Аналог оригинального _apply для веб-версии"""
1034
+ if required_ppm <= 0:
1035
+ return
1036
+
1037
+ content = self.fertilizers[fert_name][main_element]
1038
+ grams = (required_ppm * self.volume) / (content * 1000)
1039
 
1040
+ if fert_name not in self.results:
1041
+ self.results[fert_name] = {
1042
+ 'grams': 0.0,
1043
+ 'adds': {}
1044
+ }
1045
+
1046
+ self.results[fert_name]['grams'] += grams
1047
 
1048
+ # Расчет вносимых элементов
1049
+ for element, percent in self.fertilizers[fert_name].items():
1050
+ added_ppm = (grams * percent * 1000) / self.volume
1051
+ self.results[fert_name]['adds'][element] = added_ppm
1052
+ self.actual_profile[element] = self.actual_profile.get(element, 0) + added_ppm
1053
+
1054
+ def _web_apply_k_sulfate(self):
1055
+ """Аналог оригинального _apply_k_sulfate"""
1056
+ fert = "Калий сернокислый"
1057
+ k_def = self.target_profile['K'] - self.actual_profile.get('K', 0)
1058
+ s_def = self.target_profile['S'] - self.actual_profile.get('S', 0)
1059
+
1060
+ if s_def > 0.1:
1061
+ self._web_apply(fert, "S", s_def)
1062
+
1063
+ def _web_calculate_ec(self):
1064
+ """Упрощенный расчет EC для веб-версии"""
1065
+ ec_coefficients = {
1066
+ 'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
1067
+ 'Ca': 0.0016, 'S': 0.0014,
1068
+ 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
1069
  }
1070
 
1071
+ total_ec = 0.0
1072
+ for element, ppm in self.actual_profile.items():
1073
+ total_ec += ppm * ec_coefficients.get(element, 0.0015)
1074
+
1075
+ return round(total_ec, 2)
1076
+
1077
+ def _web_get_results(self):
1078
+ """Форматирование результатов для веб"""
1079
+ return {
1080
+ 'fertilizers': [
1081
+ {
1082
+ 'name': name,
1083
+ 'grams': round(data['grams'], 3),
1084
+ 'adds': {k: round(v, 2) for k, v in data['adds'].items()}
1085
+ }
1086
+ for name, data in self.results.items()
1087
+ ],
1088
+ 'profile': [
1089
+ {'element': k, 'ppm': round(v, 2)}
1090
+ for k, v in self.actual_profile.items()
1091
+ ],
1092
+ 'ec': self.total_ec,
1093
+ 'volume': self.volume
1094
  }
1095
+ }), 500
1096
 
1097
+
1098
+ @app.route('/calculation', methods=['POST'])
1099
+ def handle_calculation():
1100
+ try:
1101
+ data = request.json
1102
+
1103
+ # Создаем ВЕБ-версию калькулятора
1104
+ web_calculator = WebNutrientCalculator(volume_liters=data['profileSettings']['liters'])
1105
+
1106
+ # Выполняем расчет
1107
+ result = web_calculator.web_calculate(
1108
+ profile_settings=data['profileSettings'],
1109
+ fertilizer_constants=data['fertilizerConstants']
1110
+ )
1111
 
1112
+ return jsonify(result)
 
1113
 
1114
  except Exception as e:
1115
+ return jsonify({"error": str(e)}), 500
 
 
 
 
 
 
1116
 
1117
 
1118