4.7.0: Увеличены бонусы и множители
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m42s

This commit is contained in:
poignatov
2026-02-02 18:56:19 +03:00
parent dfe9f5b9a0
commit b15e1dd615
3 changed files with 32 additions and 21 deletions

View File

@@ -1 +1 @@
4.6.1
4.7.0

View File

@@ -2574,11 +2574,11 @@ func (a *App) getWeeklyStatsHandler(w http.ResponseWriter, r *http.Request) {
}
// Параметры бонуса в зависимости от priority
var extraBonusLimit float64 = 20
var extraBonusLimit float64 = 40
if priorityVal == 1 {
extraBonusLimit = 50
extraBonusLimit = 100
} else if priorityVal == 2 {
extraBonusLimit = 35
extraBonusLimit = 70
}
// Расчет базового прогресса
@@ -3021,11 +3021,11 @@ func (a *App) getWeeklyStatsData() (*WeeklyStatsResponse, error) {
}
// Параметры бонуса в зависимости от priority
var extraBonusLimit float64 = 20
var extraBonusLimit float64 = 40
if priorityVal == 1 {
extraBonusLimit = 50
extraBonusLimit = 100
} else if priorityVal == 2 {
extraBonusLimit = 35
extraBonusLimit = 70
}
// Расчет базового прогресса
@@ -3167,11 +3167,11 @@ func (a *App) getWeeklyStatsDataForUser(userID int) (*WeeklyStatsResponse, error
}
// Параметры бонуса в зависимости от priority
var extraBonusLimit float64 = 20
var extraBonusLimit float64 = 40
if priorityVal == 1 {
extraBonusLimit = 50
extraBonusLimit = 100
} else if priorityVal == 2 {
extraBonusLimit = 35
extraBonusLimit = 70
}
// Расчет базового прогресса
@@ -3874,22 +3874,33 @@ func calculateGroupsProgress(groups map[int][]float64) GroupsProgress {
avg = 100.0
} else {
// Вычисляем среднее для группы
// Для приоритета 1 и 2 - обычное среднее
// Для всех приоритетов: если calculated_score > 100%, избыточная часть делится на 2
// Функция для корректировки score: если > 100%, то 100 + (score - 100) / 2
adjustScore := func(score float64) float64 {
if score > 100.0 {
return 100.0 + (score-100.0)/2.0
}
return score
}
// Для приоритета 1 и 2 - обычное среднее с корректировкой
if priorityVal == 1 || priorityVal == 2 {
sum := 0.0
for _, score := range scores {
sum += score
sum += adjustScore(score)
}
avg = sum / float64(len(scores))
} else {
// Для проектов без приоритета (priorityVal == 0) - специальная формула
// Для проектов без приоритета (priorityVal == 0) - специальная формула с корректировкой
projectCount := float64(len(scores))
multiplier := 100.0 / (projectCount * 0.8)
sum := 0.0
for _, score := range scores {
// Применяем корректировку перед использованием в формуле
adjustedScore := adjustScore(score)
// score уже в процентах (например, 80.0), переводим в долю (0.8)
scoreAsDecimal := score / 100.0
scoreAsDecimal := adjustedScore / 100.0
sum += scoreAsDecimal * multiplier
}
@@ -4633,16 +4644,16 @@ func (a *App) setupWeeklyGoals() error {
-- Логика max_score в зависимости от приоритета (только если есть данные)
CASE
WHEN gm.median_score IS NULL THEN NULL
WHEN p.priority = 1 THEN gm.median_score * 1.5
WHEN p.priority = 2 THEN gm.median_score * 1.3
ELSE gm.median_score * 1.2
WHEN p.priority = 1 THEN gm.median_score * 2.0
WHEN p.priority = 2 THEN gm.median_score * 1.7
ELSE gm.median_score * 1.4
END AS max_goal_score,
-- max_score (snapshot) заполняется при INSERT, но НЕ обновляется при конфликте
CASE
WHEN gm.median_score IS NULL THEN NULL
WHEN p.priority = 1 THEN gm.median_score * 1.5
WHEN p.priority = 2 THEN gm.median_score * 1.3
ELSE gm.median_score * 1.2
WHEN p.priority = 1 THEN gm.median_score * 2.0
WHEN p.priority = 2 THEN gm.median_score * 1.7
ELSE gm.median_score * 1.4
END AS max_score,
p.priority,
p.user_id

View File

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