trust-module-frontend/src/Components/TreeChart/dataUtils.jsx

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"; // По умолчанию зеленый
}
};