Spaces:
Sleeping
Sleeping
Update nutri_call.html
Browse files- nutri_call.html +59 -58
nutri_call.html
CHANGED
@@ -878,24 +878,26 @@ legend {
|
|
878 |
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
|
879 |
<script>
|
880 |
let call_data;
|
|
|
881 |
const ecConstants = {
|
882 |
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
883 |
'Ca': 0.0016, 'S': 0.0014,
|
884 |
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
885 |
};
|
886 |
-
|
|
|
887 |
console.log("=== НАЧАЛО ОБРАБОТКИ ===");
|
888 |
-
|
889 |
// 1. Получаем значение точности округления с подробным логированием
|
890 |
const roundingInput = document.getElementById('rounding-precision');
|
891 |
console.log("Значение поля rounding-precision (raw):", roundingInput.value);
|
892 |
-
|
893 |
const initialRounding = parseInt(roundingInput.value);
|
894 |
console.log("Парсинг значения rounding (после parseInt):", initialRounding);
|
895 |
-
|
896 |
const roundingPrecision = Math.min(Math.max(initialRounding || 3, 0), 6);
|
897 |
console.log("Финальное значение точности (0-6):", roundingPrecision);
|
898 |
-
|
899 |
// 2. Улучшенная функция для безопасного получения числового значения с логированием
|
900 |
const getValue = (id) => {
|
901 |
const element = document.getElementById(id);
|
@@ -904,16 +906,17 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
904 |
return 0;
|
905 |
}
|
906 |
console.log(`Значение поля ${id}:`, element.value);
|
907 |
-
|
908 |
-
const value = parseFloat(element.value);
|
909 |
const result = isNaN(value) ? 0 : value;
|
910 |
-
|
911 |
console.log(`Парсинг значения ${id}:`, result);
|
912 |
return result;
|
913 |
};
|
|
|
914 |
// 3. Формируем данные для сервера с пошаговым логированием
|
915 |
console.log("=== ФОРМИРОВАНИЕ ДАННЫХ ДЛЯ СЕРВЕРА ===");
|
916 |
-
|
917 |
const fertilizerConstants = {
|
918 |
"Кальциевая селитра": {
|
919 |
"N (NO3-)": getValue('fert_ca_no3') / 100,
|
@@ -938,9 +941,13 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
938 |
"Калий сернокислый": {
|
939 |
"K": getValue('fert_k2so4_k') / 100,
|
940 |
"S": getValue('fert_k2so4_s') / 100
|
|
|
|
|
|
|
|
|
941 |
}
|
942 |
};
|
943 |
-
|
944 |
const profileSettings = {
|
945 |
'P': getValue('profile_p'),
|
946 |
'K': getValue('profile_k'),
|
@@ -952,20 +959,22 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
952 |
'liters': parseInt(document.getElementById('liters-input').value) || 1,
|
953 |
'rounding_precision': roundingPrecision
|
954 |
};
|
955 |
-
|
956 |
const requestData = {
|
957 |
fertilizerConstants: fertilizerConstants,
|
958 |
profileSettings: profileSettings
|
959 |
};
|
960 |
-
|
961 |
console.log("=== ПОЛНЫЙ ОБЪЕКТ ДЛЯ ОТПРАВКИ ===", JSON.stringify(requestData, null, 2));
|
962 |
-
|
963 |
// 4. Проверка данных с подробным выводом
|
964 |
console.log("=== ПРОВЕРКА ДАННЫХ ===");
|
965 |
-
|
966 |
-
const requiredFertilizers = [
|
967 |
-
|
968 |
-
|
|
|
|
|
969 |
let hasErrors = false;
|
970 |
for (const fert of requiredFertilizers) {
|
971 |
if (!requestData.fertilizerConstants[fert]) {
|
@@ -975,7 +984,7 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
975 |
console.log(`Удобрение ${fert} присутствует`);
|
976 |
}
|
977 |
}
|
978 |
-
|
979 |
const requiredProfileFields = ['P', 'K', 'Mg', 'Ca', 'S', 'NO3_RAT', 'TOTAL_NITROG'];
|
980 |
for (const field of requiredProfileFields) {
|
981 |
if (isNaN(requestData.profileSettings[field])) {
|
@@ -985,18 +994,19 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
985 |
console.log(`Параметр ${field} в порядке:`, requestData.profileSettings[field]);
|
986 |
}
|
987 |
}
|
988 |
-
|
989 |
console.log("Параметр rounding_precision:", requestData.profileSettings.rounding_precision);
|
990 |
-
|
991 |
if (hasErrors) {
|
992 |
const errorMsg = "Пожалуйста, проверьте введенные данные. Обнаружены ошибки в форме. Смотрите консоль для деталей.";
|
993 |
console.error(errorMsg);
|
994 |
alert(errorMsg);
|
995 |
return;
|
996 |
}
|
|
|
997 |
// 5. Отправка данных на сервер с полным логированием
|
998 |
console.log("=== ОТПРАВКА ДАННЫХ НА СЕРВЕР ===");
|
999 |
-
|
1000 |
fetch('/calculation', {
|
1001 |
method: 'POST',
|
1002 |
headers: {
|
@@ -1006,7 +1016,6 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
1006 |
})
|
1007 |
.then(response => {
|
1008 |
console.log("Получен ответ от сервера. Статус:", response.status);
|
1009 |
-
|
1010 |
if (!response.ok) {
|
1011 |
console.error("ОШИБКА СЕРВЕРА. Полный ответ:", response);
|
1012 |
throw new Error(`HTTP error! status: ${response.status}`);
|
@@ -1023,15 +1032,13 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
1023 |
// Показываем статус расчёта
|
1024 |
showCalculationStatus(call_data);
|
1025 |
|
1026 |
-
|
1027 |
-
|
1028 |
|
1029 |
-
|
1030 |
-
|
1031 |
|
1032 |
-
|
1033 |
// Обновляем значения NPK
|
1034 |
-
|
1035 |
calculateAndUpdate(call_data);
|
1036 |
|
1037 |
// Получаем температуру из формы
|
@@ -1056,42 +1063,36 @@ document.getElementById('calculate-btn').addEventListener('click', function() {
|
|
1056 |
});
|
1057 |
});
|
1058 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1059 |
|
1060 |
-
|
1061 |
-
|
1062 |
-
|
1063 |
-
|
1064 |
-
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
1068 |
-
"Калий азотнокислый": "potassium_nitrate",
|
1069 |
-
"Аммоний азотнокислый": "ammonium_nitrate",
|
1070 |
-
"Сульфат магния": "magnesium_sulfate",
|
1071 |
-
"Монофосфат калия": "monopotassium_phosphate",
|
1072 |
-
"Калий сернокислый": "potassium_sulfate"
|
1073 |
-
};
|
1074 |
-
|
1075 |
-
// Заполняем граммы для каждого удобрения
|
1076 |
-
for (const [fertName, fieldId] of Object.entries(fertilizerMap)) {
|
1077 |
-
const value = response.fertilizers[fertName];
|
1078 |
-
if (value !== undefined) {
|
1079 |
-
const input = document.getElementById(fieldId);
|
1080 |
-
if (input) {
|
1081 |
-
input.value = typeof value === 'number'
|
1082 |
-
? value.toFixed(3)
|
1083 |
-
: value.граммы?.toFixed(3) || '0.000';
|
1084 |
-
console.log(`Установлено ${fertName}: ${input.value}`);
|
1085 |
-
} else {
|
1086 |
-
console.error(`Не найден элемент: ${fieldId}`);
|
1087 |
-
}
|
1088 |
}
|
1089 |
}
|
|
|
1090 |
|
1091 |
|
1092 |
|
1093 |
-
console.log("Данные успешно обновлены");
|
1094 |
-
}
|
1095 |
|
1096 |
|
1097 |
|
|
|
878 |
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
|
879 |
<script>
|
880 |
let call_data;
|
881 |
+
|
882 |
const ecConstants = {
|
883 |
'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
|
884 |
'Ca': 0.0016, 'S': 0.0014,
|
885 |
'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
|
886 |
};
|
887 |
+
|
888 |
+
document.getElementById('calculate-btn').addEventListener('click', function () {
|
889 |
console.log("=== НАЧАЛО ОБРАБОТКИ ===");
|
890 |
+
|
891 |
// 1. Получаем значение точности округления с подробным логированием
|
892 |
const roundingInput = document.getElementById('rounding-precision');
|
893 |
console.log("Значение поля rounding-precision (raw):", roundingInput.value);
|
894 |
+
|
895 |
const initialRounding = parseInt(roundingInput.value);
|
896 |
console.log("Парсинг значения rounding (после parseInt):", initialRounding);
|
897 |
+
|
898 |
const roundingPrecision = Math.min(Math.max(initialRounding || 3, 0), 6);
|
899 |
console.log("Финальное значение точности (0-6):", roundingPrecision);
|
900 |
+
|
901 |
// 2. Улучшенная функция для безопасного получения числового значения с логированием
|
902 |
const getValue = (id) => {
|
903 |
const element = document.getElementById(id);
|
|
|
906 |
return 0;
|
907 |
}
|
908 |
console.log(`Значение поля ${id}:`, element.value);
|
909 |
+
|
910 |
+
const value = parseFloat(element.value.replace(',', '.')); // Замена запятой на точку
|
911 |
const result = isNaN(value) ? 0 : value;
|
912 |
+
|
913 |
console.log(`Парсинг значения ${id}:`, result);
|
914 |
return result;
|
915 |
};
|
916 |
+
|
917 |
// 3. Формируем данные для сервера с пошаговым логированием
|
918 |
console.log("=== ФОРМИРОВАНИЕ ДАННЫХ ДЛЯ СЕРВЕРА ===");
|
919 |
+
|
920 |
const fertilizerConstants = {
|
921 |
"Кальциевая селитра": {
|
922 |
"N (NO3-)": getValue('fert_ca_no3') / 100,
|
|
|
941 |
"Калий сернокислый": {
|
942 |
"K": getValue('fert_k2so4_k') / 100,
|
943 |
"S": getValue('fert_k2so4_s') / 100
|
944 |
+
},
|
945 |
+
"Кальций хлористый": { // Добавляем хлористый кальций
|
946 |
+
"Ca": getValue('fert_ca_no3') / 100,
|
947 |
+
"Cl": getValue('fert_ca_cl') / 100
|
948 |
}
|
949 |
};
|
950 |
+
|
951 |
const profileSettings = {
|
952 |
'P': getValue('profile_p'),
|
953 |
'K': getValue('profile_k'),
|
|
|
959 |
'liters': parseInt(document.getElementById('liters-input').value) || 1,
|
960 |
'rounding_precision': roundingPrecision
|
961 |
};
|
962 |
+
|
963 |
const requestData = {
|
964 |
fertilizerConstants: fertilizerConstants,
|
965 |
profileSettings: profileSettings
|
966 |
};
|
967 |
+
|
968 |
console.log("=== ПОЛНЫЙ ОБЪЕКТ ДЛЯ ОТПРАВКИ ===", JSON.stringify(requestData, null, 2));
|
969 |
+
|
970 |
// 4. Проверка данных с подробным выводом
|
971 |
console.log("=== ПРОВЕРКА ДАННЫХ ===");
|
972 |
+
|
973 |
+
const requiredFertilizers = [
|
974 |
+
"Кальциевая селитра", "Калий азотнокислый", "Аммоний азотнокислый",
|
975 |
+
"Сульфат магния", "Монофосфат калия", "Калий сернокислый", "Кальций хлористый"
|
976 |
+
];
|
977 |
+
|
978 |
let hasErrors = false;
|
979 |
for (const fert of requiredFertilizers) {
|
980 |
if (!requestData.fertilizerConstants[fert]) {
|
|
|
984 |
console.log(`Удобрение ${fert} присутствует`);
|
985 |
}
|
986 |
}
|
987 |
+
|
988 |
const requiredProfileFields = ['P', 'K', 'Mg', 'Ca', 'S', 'NO3_RAT', 'TOTAL_NITROG'];
|
989 |
for (const field of requiredProfileFields) {
|
990 |
if (isNaN(requestData.profileSettings[field])) {
|
|
|
994 |
console.log(`Параметр ${field} в порядке:`, requestData.profileSettings[field]);
|
995 |
}
|
996 |
}
|
997 |
+
|
998 |
console.log("Параметр rounding_precision:", requestData.profileSettings.rounding_precision);
|
999 |
+
|
1000 |
if (hasErrors) {
|
1001 |
const errorMsg = "Пожалуйста, проверьте введенные данные. Обнаружены ошибки в форме. Смотрите консоль для деталей.";
|
1002 |
console.error(errorMsg);
|
1003 |
alert(errorMsg);
|
1004 |
return;
|
1005 |
}
|
1006 |
+
|
1007 |
// 5. Отправка данных на сервер с полным логированием
|
1008 |
console.log("=== ОТПРАВКА ДАННЫХ НА СЕРВЕР ===");
|
1009 |
+
|
1010 |
fetch('/calculation', {
|
1011 |
method: 'POST',
|
1012 |
headers: {
|
|
|
1016 |
})
|
1017 |
.then(response => {
|
1018 |
console.log("Получен ответ от сервера. Статус:", response.status);
|
|
|
1019 |
if (!response.ok) {
|
1020 |
console.error("ОШИБКА СЕРВЕРА. Полный ответ:", response);
|
1021 |
throw new Error(`HTTP error! status: ${response.status}`);
|
|
|
1032 |
// Показываем статус расчёта
|
1033 |
showCalculationStatus(call_data);
|
1034 |
|
1035 |
+
// Вызываем функцию для расчета катионов и анионов
|
1036 |
+
calculateCationsAndAnions(data);
|
1037 |
|
1038 |
+
// Обновляем поля NH4 и NO3
|
1039 |
+
updateNitrogenFields(call_data);
|
1040 |
|
|
|
1041 |
// Обновляем значения NPK
|
|
|
1042 |
calculateAndUpdate(call_data);
|
1043 |
|
1044 |
// Получаем температуру из формы
|
|
|
1063 |
});
|
1064 |
});
|
1065 |
|
1066 |
+
// Функция для вывода данных в форму
|
1067 |
+
function data_out(data) {
|
1068 |
+
console.log("=== ЗАПИСЬ ДАННЫХ В ФОРМУ ===");
|
1069 |
+
|
1070 |
+
// Записываем массы удобрений
|
1071 |
+
for (const [fertilizer, grams] of Object.entries(data.fertilizers)) {
|
1072 |
+
const inputId = fertilizer.toLowerCase().replace(/[^a-z0-9]/g, '_');
|
1073 |
+
const inputElement = document.getElementById(inputId);
|
1074 |
+
if (inputElement) {
|
1075 |
+
inputElement.value = grams.toFixed(3);
|
1076 |
+
console.log(`Записано значение для ${fertilizer}: ${grams.toFixed(3)} г`);
|
1077 |
+
} else {
|
1078 |
+
console.warn(`Поле для удобрения ${fertilizer} не найдено`);
|
1079 |
+
}
|
1080 |
+
}
|
1081 |
|
1082 |
+
// Записываем баланс элементов
|
1083 |
+
for (const [element, ppm] of Object.entries(data.actual_profile)) {
|
1084 |
+
const inputElement = document.getElementById(`profile_${element.toLowerCase()}`);
|
1085 |
+
if (inputElement) {
|
1086 |
+
inputElement.value = ppm.toFixed(3);
|
1087 |
+
console.log(`Записано значение для ${element}: ${ppm.toFixed(3)} ppm`);
|
1088 |
+
} else {
|
1089 |
+
console.warn(`Поле для элемента ${element} не найдено`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1090 |
}
|
1091 |
}
|
1092 |
+
}
|
1093 |
|
1094 |
|
1095 |
|
|
|
|
|
1096 |
|
1097 |
|
1098 |
|