/
Extrap
/
Network_technologies_Project
Обзор
Документация
Войти
/
Extrap
/
Network_technologies_Project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Project/Services/ReportService.cs
83 строки
3 KB
Extrap
Решил трабл с отправкой тренировки
20 дек 2025, 18:48
20 дек 2025, 18:48
77f5498
Код
Авторство
О чём код?
using Project.Interfaces; using Project.Models; using Project.Models.DTOs; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Project.Services { public class ReportService { private readonly IWorkoutRepository _workoutRepository; public ReportService(IWorkoutRepository workoutRepository) { _workoutRepository = workoutRepository; } public async Task<ReportResponseDTO> GenerateReportAsync(Guid userId, DateTime startDate, DateTime endDate) { // Получаем тренировки за указанный период var workouts = await _workoutRepository.GetByUserAsync(userId); var filteredWorkouts = workouts .Where(w => w.StartTime >= startDate && w.StartTime <= endDate) .ToList(); if (!filteredWorkouts.Any()) throw new InvalidOperationException("No workouts found for the specified period"); // Формируем отчет var report = new ReportResponseDTO { PeriodStart = startDate, PeriodEnd = endDate, TotalWorkouts = filteredWorkouts.Count, TotalDurationSeconds = filteredWorkouts.Sum(w => w.DurationSeconds), TotalDistanceKm = filteredWorkouts.Where(w => w.DistanceKm.HasValue).Sum(w => w.DistanceKm ?? 0), TotalCalories = filteredWorkouts.Where(w => w.Calories.HasValue).Sum(w => w.Calories ?? 0) }; // Расчет среднего пульса (только для тренировок с данными о ЧСС) var workoutsWithHeartRate = filteredWorkouts.Where(w => w.AvgHeartRate.HasValue).ToList(); if (workoutsWithHeartRate.Any()) { report.AvgHeartRate = (int)workoutsWithHeartRate.Average(w => w.AvgHeartRate ?? 0); report.MaxHeartRate = workoutsWithHeartRate.Max(w => w.MaxHeartRate ?? 0); } // Распределение по типам тренировок foreach (var workout in filteredWorkouts) { string type = workout.Type.ToString(); if (report.WorkoutTypeDistribution.ContainsKey(type)) report.WorkoutTypeDistribution[type]++; else report.WorkoutTypeDistribution[type] = 1; } // Добавляем краткую информацию о каждой тренировке report.WorkoutSummaries = filteredWorkouts.Select(w => new WorkoutSummary { Id = w.Id, StartTime = w.StartTime, DurationSeconds = w.DurationSeconds, Type = w.Type.ToString(), DistanceKm = w.DistanceKm, Calories = w.Calories }).ToList(); return report; } public async Task<ReportResponseDTO> GenerateReportAsync(Guid userId, ReportRequestDTO request) { // Нормализуем даты (начало дня для startDate, конец дня для endDate) var startDate = request.StartDate.Date; var endDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); return await GenerateReportAsync(userId, startDate, endDate); } } }