4.7.0: Увеличены бонусы и множители
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m42s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m42s
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user