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
|
// Параметры бонуса в зависимости от priority
|
||||||
var extraBonusLimit float64 = 20
|
var extraBonusLimit float64 = 40
|
||||||
if priorityVal == 1 {
|
if priorityVal == 1 {
|
||||||
extraBonusLimit = 50
|
extraBonusLimit = 100
|
||||||
} else if priorityVal == 2 {
|
} else if priorityVal == 2 {
|
||||||
extraBonusLimit = 35
|
extraBonusLimit = 70
|
||||||
}
|
}
|
||||||
|
|
||||||
// Расчет базового прогресса
|
// Расчет базового прогресса
|
||||||
@@ -3021,11 +3021,11 @@ func (a *App) getWeeklyStatsData() (*WeeklyStatsResponse, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Параметры бонуса в зависимости от priority
|
// Параметры бонуса в зависимости от priority
|
||||||
var extraBonusLimit float64 = 20
|
var extraBonusLimit float64 = 40
|
||||||
if priorityVal == 1 {
|
if priorityVal == 1 {
|
||||||
extraBonusLimit = 50
|
extraBonusLimit = 100
|
||||||
} else if priorityVal == 2 {
|
} else if priorityVal == 2 {
|
||||||
extraBonusLimit = 35
|
extraBonusLimit = 70
|
||||||
}
|
}
|
||||||
|
|
||||||
// Расчет базового прогресса
|
// Расчет базового прогресса
|
||||||
@@ -3167,11 +3167,11 @@ func (a *App) getWeeklyStatsDataForUser(userID int) (*WeeklyStatsResponse, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Параметры бонуса в зависимости от priority
|
// Параметры бонуса в зависимости от priority
|
||||||
var extraBonusLimit float64 = 20
|
var extraBonusLimit float64 = 40
|
||||||
if priorityVal == 1 {
|
if priorityVal == 1 {
|
||||||
extraBonusLimit = 50
|
extraBonusLimit = 100
|
||||||
} else if priorityVal == 2 {
|
} else if priorityVal == 2 {
|
||||||
extraBonusLimit = 35
|
extraBonusLimit = 70
|
||||||
}
|
}
|
||||||
|
|
||||||
// Расчет базового прогресса
|
// Расчет базового прогресса
|
||||||
@@ -3874,22 +3874,33 @@ func calculateGroupsProgress(groups map[int][]float64) GroupsProgress {
|
|||||||
avg = 100.0
|
avg = 100.0
|
||||||
} else {
|
} 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 {
|
if priorityVal == 1 || priorityVal == 2 {
|
||||||
sum := 0.0
|
sum := 0.0
|
||||||
for _, score := range scores {
|
for _, score := range scores {
|
||||||
sum += score
|
sum += adjustScore(score)
|
||||||
}
|
}
|
||||||
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)
|
||||||
|
|
||||||
sum := 0.0
|
sum := 0.0
|
||||||
for _, score := range scores {
|
for _, score := range scores {
|
||||||
|
// Применяем корректировку перед использованием в формуле
|
||||||
|
adjustedScore := adjustScore(score)
|
||||||
// score уже в процентах (например, 80.0), переводим в долю (0.8)
|
// score уже в процентах (например, 80.0), переводим в долю (0.8)
|
||||||
scoreAsDecimal := score / 100.0
|
scoreAsDecimal := adjustedScore / 100.0
|
||||||
sum += scoreAsDecimal * multiplier
|
sum += scoreAsDecimal * multiplier
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4633,16 +4644,16 @@ func (a *App) setupWeeklyGoals() error {
|
|||||||
-- Логика max_score в зависимости от приоритета (только если есть данные)
|
-- Логика max_score в зависимости от приоритета (только если есть данные)
|
||||||
CASE
|
CASE
|
||||||
WHEN gm.median_score IS NULL THEN NULL
|
WHEN gm.median_score IS NULL THEN NULL
|
||||||
WHEN p.priority = 1 THEN gm.median_score * 1.5
|
WHEN p.priority = 1 THEN gm.median_score * 2.0
|
||||||
WHEN p.priority = 2 THEN gm.median_score * 1.3
|
WHEN p.priority = 2 THEN gm.median_score * 1.7
|
||||||
ELSE gm.median_score * 1.2
|
ELSE gm.median_score * 1.4
|
||||||
END AS max_goal_score,
|
END AS max_goal_score,
|
||||||
-- max_score (snapshot) заполняется при INSERT, но НЕ обновляется при конфликте
|
-- max_score (snapshot) заполняется при INSERT, но НЕ обновляется при конфликте
|
||||||
CASE
|
CASE
|
||||||
WHEN gm.median_score IS NULL THEN NULL
|
WHEN gm.median_score IS NULL THEN NULL
|
||||||
WHEN p.priority = 1 THEN gm.median_score * 1.5
|
WHEN p.priority = 1 THEN gm.median_score * 2.0
|
||||||
WHEN p.priority = 2 THEN gm.median_score * 1.3
|
WHEN p.priority = 2 THEN gm.median_score * 1.7
|
||||||
ELSE gm.median_score * 1.2
|
ELSE gm.median_score * 1.4
|
||||||
END AS max_score,
|
END AS max_score,
|
||||||
p.priority,
|
p.priority,
|
||||||
p.user_id
|
p.user_id
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "play-life-web",
|
"name": "play-life-web",
|
||||||
"version": "4.6.1",
|
"version": "4.7.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
Reference in New Issue
Block a user