fix: обновлен расчет общего процента выполнения - отсутствующие группы приоритетов считаются как 100%
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 55s

- Изменена функция calculateOverallProgress: теперь всегда учитываются 3 группы приоритетов (1, 2, 0)
- Если группа отсутствует, она считается как 100%
- Общий процент всегда вычисляется как среднее из 3 групп: (группа1 + группа2 + группа0) / 3
- Изменения применяются для API и ежедневных Telegram отчетов
- Версия обновлена до 3.8.5
This commit is contained in:
poignatov
2026-01-11 15:00:20 +03:00
parent a8cb7c2730
commit 29cf05a3c3
3 changed files with 33 additions and 21 deletions

View File

@@ -1 +1 @@
3.8.4 3.8.5

View File

@@ -3897,14 +3897,28 @@ func roundToFourDecimals(val float64) float64 {
// calculateOverallProgress вычисляет общий процент выполнения на основе групп проектов по приоритетам // calculateOverallProgress вычисляет общий процент выполнения на основе групп проектов по приоритетам
// groups - карта приоритетов к спискам calculatedScore проектов // groups - карта приоритетов к спискам calculatedScore проектов
// Возвращает указатель на float64 с общим процентом выполнения или nil, если нет данных // Возвращает указатель на float64 с общим процентом выполнения или nil, если нет данных
// Если какая-то группа отсутствует, она считается как 100%
func calculateOverallProgress(groups map[int][]float64) *float64 { func calculateOverallProgress(groups map[int][]float64) *float64 {
// Находим среднее внутри каждой группы // Всего есть 3 группы: приоритет 1, приоритет 2, приоритет 0
groupAverages := make([]float64, 0) // Вычисляем среднее для каждой группы, если она есть
for priorityVal, scores := range groups { // Если группы нет, считаем её как 100%
if len(scores) > 0 {
groupAverages := make(map[int]float64)
// Обрабатываем все 3 возможных приоритета
priorities := []int{1, 2, 0}
for _, priorityVal := range priorities {
scores, exists := groups[priorityVal]
if !exists || len(scores) == 0 {
// Если группы нет, считаем как 100%
groupAverages[priorityVal] = 100.0
} else {
// Вычисляем среднее для группы
var avg float64 var avg float64
// Для приоритета 1 и 2 - обычное среднее (как было) // Для приоритета 1 и 2 - обычное среднее
if priorityVal == 1 || priorityVal == 2 { if priorityVal == 1 || priorityVal == 2 {
sum := 0.0 sum := 0.0
for _, score := range scores { for _, score := range scores {
@@ -3912,7 +3926,7 @@ func calculateOverallProgress(groups map[int][]float64) *float64 {
} }
avg = sum / float64(len(scores)) avg = sum / float64(len(scores))
} else { } else {
// Для проектов без приоритета (priorityVal == 0) - новая формула // Для проектов без приоритета (priorityVal == 0) - специальная формула
projectCount := float64(len(scores)) projectCount := float64(len(scores))
multiplier := 100.0 / (projectCount * 0.8) multiplier := 100.0 / (projectCount * 0.8)
@@ -3926,21 +3940,19 @@ func calculateOverallProgress(groups map[int][]float64) *float64 {
avg = math.Min(120.0, sum) avg = math.Min(120.0, sum)
} }
groupAverages = append(groupAverages, avg) groupAverages[priorityVal] = avg
} }
} }
// Находим среднее между всеми группами // Находим среднее между всеми тремя группами
var total *float64
if len(groupAverages) > 0 {
sum := 0.0 sum := 0.0
for _, avg := range groupAverages { for _, priorityVal := range priorities {
sum += avg sum += groupAverages[priorityVal]
} }
overallProgress := sum / float64(len(groupAverages))
overallProgress := sum / 3.0 // Всегда делим на 3, так как групп всегда 3
overallProgressRounded := roundToFourDecimals(overallProgress) overallProgressRounded := roundToFourDecimals(overallProgress)
total = &overallProgressRounded total := &overallProgressRounded
}
return total return total
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "play-life-web", "name": "play-life-web",
"version": "3.8.4", "version": "3.8.5",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",