DmitrMakeev commited on
Commit
d98e04e
·
verified ·
1 Parent(s): 1e5a7e5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +157 -0
app.py CHANGED
@@ -813,6 +813,41 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
813
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
814
  }
815
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
816
  class NutrientCalculator:
817
  def __init__(self, volume_liters=1.0):
818
  self.volume = volume_liters
@@ -991,6 +1026,128 @@ if __name__ == "__main__":
991
 
992
 
993
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
994
 
995
 
996
 
 
813
  "Монофосфат калия": {"P": 0.218, "K": 0.275}
814
  }
815
 
816
+
817
+
818
+
819
+
820
+ from tabulate import tabulate
821
+
822
+ # Константы
823
+ TOTAL_NITROGEN = 125.000
824
+ NO3_RATIO = 8.25
825
+ NH4_RATIO = 1.00
826
+ VOLUME_LITERS = 100
827
+
828
+ # Коэффициенты электропроводности
829
+ EC_COEFFICIENTS = {
830
+ 'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
831
+ 'Ca': 0.0016, 'S': 0.0014,
832
+ 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
833
+ }
834
+
835
+ # Целевые значения
836
+ BASE_PROFILE = {
837
+ 'P': 31.000, 'K': 210.000, 'Mg': 24.000,
838
+ 'Ca': 84.000, 'S': 56.439,
839
+ 'N (NO3-)': 0, 'N (NH4+)': 0
840
+ }
841
+
842
+ NUTRIENT_CONTENT_IN_FERTILIZERS = {
843
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
844
+ "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
845
+ "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
846
+ "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
847
+ "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
848
+ "Монофосфат калия": {"P": 0.218, "K": 0.275}
849
+ }
850
+
851
  class NutrientCalculator:
852
  def __init__(self, volume_liters=1.0):
853
  self.volume = volume_liters
 
1026
 
1027
 
1028
 
1029
+ from flask import request, jsonify
1030
+
1031
+ def round_floats(obj, ndigits=3):
1032
+ """Рекурсивно округляет все float значения в структуре данных"""
1033
+ if isinstance(obj, float):
1034
+ return round(obj, ndigits)
1035
+ elif isinstance(obj, dict):
1036
+ return {k: round_floats(v, ndigits) for k, v in obj.items()}
1037
+ elif isinstance(obj, (list, tuple)):
1038
+ return [round_floats(x, ndigits) for x in obj]
1039
+ return obj
1040
+
1041
+ @app.route('/calculation', methods=['POST'])
1042
+ def handle_calculation():
1043
+ try:
1044
+ data = request.get_json()
1045
+
1046
+ # Получаем параметр точности округления (по умолчанию 3)
1047
+ rounding_precision = int(data['profileSettings'].get('rounding_precision', 3))
1048
+
1049
+ # Проверка обязательных полей
1050
+ if not data or 'fertilizerConstants' not in data or 'profileSettings' not in data:
1051
+ return jsonify({'error': 'Неверный формат данных'}), 400
1052
+
1053
+ # Извлекаем данные из запроса
1054
+ fertilizer_data = data['fertilizerConstants']
1055
+ profile_data = data['profileSettings']
1056
+
1057
+ # Устанавливаем константы из запроса
1058
+ TOTAL_NITROGEN = float(profile_data.get('TOTAL_NITROG', 125.0))
1059
+ NO3_RATIO = float(profile_data.get('NO3_RAT', 8.25))
1060
+ VOLUME_LITERS = float(profile_data.get('liters', 100))
1061
+ NH4_RATIO = 1.00 # Фиксированное значение
1062
+
1063
+ # Формируем целевой профиль
1064
+ target_profile = {
1065
+ 'P': float(profile_data.get('P', 31.0)),
1066
+ 'K': float(profile_data.get('K', 210.0)),
1067
+ 'Mg': float(profile_data.get('Mg', 24.0)),
1068
+ 'Ca': float(profile_data.get('Ca', 84.0)),
1069
+ 'S': float(profile_data.get('S', 56.439)),
1070
+ 'N (NO3-)': 0, # Будет рассчитано в калькуляторе
1071
+ 'N (NH4+)': 0 # Будет рассчитано в калькуляторе
1072
+ }
1073
+
1074
+ # Обновляем константы удобрений
1075
+ NUTRIENT_CONTENT_IN_FERTILIZERS = {
1076
+ "Кальциевая селитра": {
1077
+ "N (NO3-)": float(fertilizer_data["Кальциевая селитра"].get("N (NO3-)", 0.11863)),
1078
+ "Ca": float(fertilizer_data["Кальциевая селитра"].get("Ca", 0.16972))
1079
+ },
1080
+ "Калий азотнокислый": {
1081
+ "N (NO3-)": float(fertilizer_data["Калий азотнокислый"].get("N (NO3-)", 0.13854)),
1082
+ "K": float(fertilizer_data["Калий азотнокислый"].get("K", 0.36672))
1083
+ },
1084
+ "Аммоний азотнокислый": {
1085
+ "N (NO3-)": float(fertilizer_data["Аммоний азотнокислый"].get("N (NO3-)", 0.17499)),
1086
+ "N (NH4+)": float(fertilizer_data["Аммоний азотнокислый"].get("N (NH4+)", 0.17499))
1087
+ },
1088
+ "Сульфат магния": {
1089
+ "Mg": float(fertilizer_data["Сульфат магния"].get("Mg", 0.1022)),
1090
+ "S": float(fertilizer_data["Сульфат магния"].get("S", 0.13483))
1091
+ },
1092
+ "Монофосфат калия": {
1093
+ "P": float(fertilizer_data["Монофосфат калия"].get("P", 0.22761)),
1094
+ "K": float(fertilizer_data["Монофосфат калия"].get("K", 0.28731))
1095
+ },
1096
+ "Калий сернокислый": {
1097
+ "K": float(fertilizer_data["Калий сернокислый"].get("K", 0.44874)),
1098
+ "S": float(fertilizer_data["Калий сернокислый"].get("S", 0.18401))
1099
+ }
1100
+ }
1101
+
1102
+ # Создаем и настраиваем калькулятор
1103
+ calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
1104
+ calculator.target_profile = target_profile
1105
+ calculator.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
1106
+
1107
+ # Устанавливаем параметры азота
1108
+ calculator.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / (NO3_RATIO + NH4_RATIO))
1109
+ calculator.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / (NO3_RATIO + NH4_RATIO))
1110
+
1111
+ # Выполняем расчет
1112
+ results = calculator.calculate()
1113
+
1114
+ # Формируем ответ
1115
+ response = {
1116
+ 'actual_profile': calculator.actual_profile,
1117
+ 'fertilizers': results,
1118
+ 'total_ec': calculator.calculate_ec(),
1119
+ 'total_ppm': sum(calculator.actual_profile.values()),
1120
+ 'nitrogen_ratios': {
1121
+ 'NO3_RATIO': NO3_RATIO,
1122
+ 'NH4_RATIO': NH4_RATIO,
1123
+ 'TOTAL_NITROGEN': TOTAL_NITROGEN
1124
+ }
1125
+ }
1126
+
1127
+ # Округляем все числовые значения
1128
+ rounded_response = round_floats(response, rounding_precision)
1129
+
1130
+ # Для миллиграммов применяем целочисленное округление
1131
+ if 'fertilizers' in rounded_response:
1132
+ for fert in rounded_response['fertilizers'].values():
1133
+ if 'миллиграммы' in fert:
1134
+ fert['миллиграммы'] = int(round(fert['миллиграммы']))
1135
+
1136
+ return jsonify(rounded_response)
1137
+
1138
+ except Exception as e:
1139
+ return jsonify({'error': str(e)}), 500
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
 
1152
 
1153