const StatusManager = () => { const getRandomStatus = () => { const statuses = [ ...Array(90).fill("green"), // 90% шанс ...Array(6).fill("yellow"), // 6% шанс ...Array(3).fill("orange"), // 3% шанс ...Array(1).fill("red"), // 1% шанс ]; return statuses[Math.floor(Math.random() * statuses.length)]; }; const getStatusWeight = (status) => { switch (status) { case "green": return 1; // 100% здоровья case "yellow": return 0.75; case "orange": return 0.5; case "red": return 0.25; // 25% здоровья default: return 1; // По умолчанию "green" } }; const updateStatuses = (data) => { if (!data.items || data.items.length === 0) { // Если это элемент нижнего уровня, генерируем случайный статус data.status = getRandomStatus(); return getStatusWeight(data.status); } // Рекурсивно обновляем статусы для всех дочерних элементов let childStatusWeights = data.items.map((child) => updateStatuses(child)); // Проверяем, есть ли дочерние элементы (избегаем деления на 0) if (childStatusWeights.length === 0) { data.status = "green"; return 1; } // Вычисляем среднее арифметическое значение весов статусов const averageStatusWeight = childStatusWeights.reduce((sum, weight) => sum + weight, 0) / childStatusWeights.length; // Определяем статус текущего элемента data.status = getStatusFromWeight(averageStatusWeight); return Math.max(0, averageStatusWeight); // Гарантия, что не будет отрицательных значений }; const getStatusFromWeight = (weight) => { if (weight >= 0.875) return "green"; if (weight >= 0.625) return "yellow"; if (weight >= 0.375) return "orange"; return "red"; }; const getStatusColor = (status) => { switch (status) { case "green": return "#4CAF50"; // Зеленый case "yellow": return "#cebd21"; // Желтый case "orange": return "#FF9800"; // Оранжевый case "red": return "#F44336"; // Красный default: return "#4CAF50"; // По умолчанию зеленый } }; return { getRandomStatus, updateStatuses, getStatusColor, }; }; // Создаем два независимых менеджера статусов export const statusManager1 = StatusManager(); export const statusManager2 = StatusManager(); // Функция для расчета процентов здоровья системы export const calculateStatusPercentage = (averageStatusValue) => { return Math.max(0, Math.min(100, averageStatusValue * 100)); }; // Экспортируем getStatusColor отдельно export const getStatusColor = (status) => { switch (status) { case "green": return "#4CAF50"; // Зеленый case "yellow": return "#cebd21"; // Желтый case "orange": return "#FF9800"; // Оранжевый case "red": return "#F44336"; // Красный default: return "#4CAF50"; // По умолчанию зеленый } };