Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -979,45 +979,140 @@ if __name__ == "__main__":
|
|
979 |
|
980 |
|
981 |
|
982 |
-
|
983 |
-
def
|
984 |
-
|
985 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
986 |
|
987 |
-
|
988 |
-
|
|
|
|
|
|
|
|
|
|
|
989 |
|
990 |
-
#
|
991 |
-
|
992 |
-
|
993 |
-
|
994 |
-
|
995 |
-
|
996 |
-
|
997 |
-
|
998 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
999 |
}
|
1000 |
|
1001 |
-
|
1002 |
-
|
1003 |
-
|
1004 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1005 |
}
|
|
|
1006 |
|
1007 |
-
|
1008 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1009 |
|
1010 |
-
|
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 |
|