Унификация расчета процентов с бэкендом
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m8s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m8s
This commit is contained in:
@@ -108,9 +108,18 @@ type WeeklyProjectStats struct {
|
||||
CalculatedScore float64 `json:"calculated_score"`
|
||||
}
|
||||
|
||||
type GroupsProgress struct {
|
||||
Group1 *float64 `json:"group1,omitempty"`
|
||||
Group2 *float64 `json:"group2,omitempty"`
|
||||
Group0 *float64 `json:"group0,omitempty"`
|
||||
}
|
||||
|
||||
type WeeklyStatsResponse struct {
|
||||
Total *float64 `json:"total,omitempty"`
|
||||
Projects []WeeklyProjectStats `json:"projects"`
|
||||
Total *float64 `json:"total,omitempty"`
|
||||
GroupProgress1 *float64 `json:"group_progress_1,omitempty"`
|
||||
GroupProgress2 *float64 `json:"group_progress_2,omitempty"`
|
||||
GroupProgress0 *float64 `json:"group_progress_0,omitempty"`
|
||||
Projects []WeeklyProjectStats `json:"projects"`
|
||||
}
|
||||
|
||||
type MessagePostRequest struct {
|
||||
@@ -2538,12 +2547,18 @@ func (a *App) getWeeklyStatsHandler(w http.ResponseWriter, r *http.Request) {
|
||||
projects = append(projects, project)
|
||||
}
|
||||
|
||||
// Вычисляем проценты для каждой группы
|
||||
groupsProgress := calculateGroupsProgress(groups)
|
||||
|
||||
// Вычисляем общий процент выполнения
|
||||
total := calculateOverallProgress(groups)
|
||||
total := calculateOverallProgress(groupsProgress)
|
||||
|
||||
response := WeeklyStatsResponse{
|
||||
Total: total,
|
||||
Projects: projects,
|
||||
Total: total,
|
||||
GroupProgress1: groupsProgress.Group1,
|
||||
GroupProgress2: groupsProgress.Group2,
|
||||
GroupProgress0: groupsProgress.Group0,
|
||||
Projects: projects,
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
@@ -3727,12 +3742,18 @@ func (a *App) getWeeklyStatsData() (*WeeklyStatsResponse, error) {
|
||||
projects = append(projects, project)
|
||||
}
|
||||
|
||||
// Вычисляем проценты для каждой группы
|
||||
groupsProgress := calculateGroupsProgress(groups)
|
||||
|
||||
// Вычисляем общий процент выполнения
|
||||
total := calculateOverallProgress(groups)
|
||||
total := calculateOverallProgress(groupsProgress)
|
||||
|
||||
response := WeeklyStatsResponse{
|
||||
Total: total,
|
||||
Projects: projects,
|
||||
Total: total,
|
||||
GroupProgress1: groupsProgress.Group1,
|
||||
GroupProgress2: groupsProgress.Group2,
|
||||
GroupProgress0: groupsProgress.Group0,
|
||||
Projects: projects,
|
||||
}
|
||||
|
||||
return &response, nil
|
||||
@@ -3857,12 +3878,18 @@ func (a *App) getWeeklyStatsDataForUser(userID int) (*WeeklyStatsResponse, error
|
||||
}
|
||||
}
|
||||
|
||||
// Вычисляем проценты для каждой группы
|
||||
groupsProgress := calculateGroupsProgress(groups)
|
||||
|
||||
// Вычисляем общий процент выполнения
|
||||
total := calculateOverallProgress(groups)
|
||||
total := calculateOverallProgress(groupsProgress)
|
||||
|
||||
response := WeeklyStatsResponse{
|
||||
Total: total,
|
||||
Projects: projects,
|
||||
Total: total,
|
||||
GroupProgress1: groupsProgress.Group1,
|
||||
GroupProgress2: groupsProgress.Group2,
|
||||
GroupProgress0: groupsProgress.Group0,
|
||||
Projects: projects,
|
||||
}
|
||||
|
||||
return &response, nil
|
||||
@@ -4386,16 +4413,16 @@ func roundToFourDecimals(val float64) float64 {
|
||||
return float64(int(val*10000+0.5)) / 10000.0
|
||||
}
|
||||
|
||||
// calculateOverallProgress вычисляет общий процент выполнения на основе групп проектов по приоритетам
|
||||
// calculateGroupsProgress вычисляет проценты выполнения для каждой группы приоритетов
|
||||
// groups - карта приоритетов к спискам calculatedScore проектов
|
||||
// Возвращает указатель на float64 с общим процентом выполнения или nil, если нет данных
|
||||
// Возвращает структуру GroupsProgress с процентами для каждой группы
|
||||
// Если какая-то группа отсутствует, она считается как 100%
|
||||
func calculateOverallProgress(groups map[int][]float64) *float64 {
|
||||
func calculateGroupsProgress(groups map[int][]float64) GroupsProgress {
|
||||
// Всего есть 3 группы: приоритет 1, приоритет 2, приоритет 0
|
||||
// Вычисляем среднее для каждой группы, если она есть
|
||||
// Если группы нет, считаем её как 100%
|
||||
|
||||
groupAverages := make(map[int]float64)
|
||||
result := GroupsProgress{}
|
||||
|
||||
// Обрабатываем все 3 возможных приоритета
|
||||
priorities := []int{1, 2, 0}
|
||||
@@ -4403,13 +4430,12 @@ func calculateOverallProgress(groups map[int][]float64) *float64 {
|
||||
for _, priorityVal := range priorities {
|
||||
scores, exists := groups[priorityVal]
|
||||
|
||||
var avg float64
|
||||
if !exists || len(scores) == 0 {
|
||||
// Если группы нет, считаем как 100%
|
||||
groupAverages[priorityVal] = 100.0
|
||||
avg = 100.0
|
||||
} else {
|
||||
// Вычисляем среднее для группы
|
||||
var avg float64
|
||||
|
||||
// Для приоритета 1 и 2 - обычное среднее
|
||||
if priorityVal == 1 || priorityVal == 2 {
|
||||
sum := 0.0
|
||||
@@ -4431,18 +4457,52 @@ func calculateOverallProgress(groups map[int][]float64) *float64 {
|
||||
|
||||
avg = math.Min(120.0, sum)
|
||||
}
|
||||
|
||||
groupAverages[priorityVal] = avg
|
||||
}
|
||||
|
||||
// Сохраняем результат в соответствующее поле
|
||||
avgRounded := roundToFourDecimals(avg)
|
||||
switch priorityVal {
|
||||
case 1:
|
||||
result.Group1 = &avgRounded
|
||||
case 2:
|
||||
result.Group2 = &avgRounded
|
||||
case 0:
|
||||
result.Group0 = &avgRounded
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// calculateOverallProgress вычисляет общий процент выполнения на основе процентов групп
|
||||
// groupsProgress - структура с процентами для каждой группы приоритетов
|
||||
// Возвращает указатель на float64 с общим процентом выполнения
|
||||
// Всегда вычисляет среднее всех трех групп (даже если какая-то группа отсутствует, она считается как 100%)
|
||||
func calculateOverallProgress(groupsProgress GroupsProgress) *float64 {
|
||||
// Находим среднее между всеми тремя группами
|
||||
sum := 0.0
|
||||
for _, priorityVal := range priorities {
|
||||
sum += groupAverages[priorityVal]
|
||||
// Если какая-то группа отсутствует (nil), считаем её как 100%
|
||||
|
||||
var group1Val, group2Val, group0Val float64
|
||||
|
||||
if groupsProgress.Group1 != nil {
|
||||
group1Val = *groupsProgress.Group1
|
||||
} else {
|
||||
group1Val = 100.0
|
||||
}
|
||||
|
||||
overallProgress := sum / 3.0 // Всегда делим на 3, так как групп всегда 3
|
||||
if groupsProgress.Group2 != nil {
|
||||
group2Val = *groupsProgress.Group2
|
||||
} else {
|
||||
group2Val = 100.0
|
||||
}
|
||||
|
||||
if groupsProgress.Group0 != nil {
|
||||
group0Val = *groupsProgress.Group0
|
||||
} else {
|
||||
group0Val = 100.0
|
||||
}
|
||||
|
||||
overallProgress := (group1Val + group2Val + group0Val) / 3.0 // Всегда делим на 3, так как групп всегда 3
|
||||
overallProgressRounded := roundToFourDecimals(overallProgress)
|
||||
total := &overallProgressRounded
|
||||
|
||||
|
||||
Reference in New Issue
Block a user