96 lines
3.6 KiB
JavaScript
Executable File
96 lines
3.6 KiB
JavaScript
Executable File
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"; // По умолчанию зеленый
|
|
}
|
|
};
|