Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -979,121 +979,6 @@ if __name__ == "__main__":
|
|
| 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():
|
|
|
|
| 979 |
|
| 980 |
|
| 981 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 982 |
|
| 983 |
@app.route('/calculation', methods=['POST'])
|
| 984 |
def handle_calculation():
|