using Demo.Data.Repository; using Demo.domain.Models; using System; using System.Collections.Generic; using System.Linq; namespace Demo.Domain.UseCase { public class GroupAttendanceService { private readonly IPresenceRepository _presenceRepository; private readonly IUserRepository _userRepository; // Добавляем репозиторий пользователей public GroupAttendanceService(IPresenceRepository presenceRepository, IUserRepository userRepository) { _presenceRepository = presenceRepository; _userRepository = userRepository; // Инициализируем репозиторий пользователей } public void DisplayGroupAttendanceInfo(int groupId) { var presences = _presenceRepository.GetPresenceByGroup(groupId); if (presences == null || !presences.Any()) { Console.WriteLine("Нет данных о посещаемости для группы с ID: " + groupId); return; } // Вычисление количества студентов var totalStudents = presences.Select(p => p.UserGuid).Distinct().Count(); // Предполагается, что в PresenceLocalEntity есть UserGuid // Вычисление количества проведенных занятий var totalSessions = presences.Select(p => p.Date).Distinct().Count(); // Общее количество присутствий var totalAttendance = presences.Count(p => p.IsAttedance); // Общий процент посещаемости double overallAttendancePercentage = totalSessions > 0 ? (double)totalAttendance / (totalSessions * totalStudents) * 100 : 0; Console.WriteLine($"Группа ID: {groupId}"); Console.WriteLine($"Количество студентов: {totalStudents}"); Console.WriteLine($"Количество проведенных занятий: {totalSessions}"); Console.WriteLine($"Общий процент посещаемости: {overallAttendancePercentage:F2}%"); Console.WriteLine("Студенты:"); // Вывод информации по каждому студенту var studentAttendances = presences .GroupBy(p => p.UserGuid) // Здесь также нужно использовать UserGuid .Select(g => new { StudentName = GetStudentNameByGuid(g.Key), // Функция для получения имени студента по его GUID AttendedCount = g.Count(p => p.IsAttedance), MissedCount = g.Count(p => !p.IsAttedance) }); foreach (var student in studentAttendances) { // Процент посещаемости студента double attendancePercentage = totalSessions > 0 ? (double)student.AttendedCount / totalSessions * 100 : 0; var attendanceColor = attendancePercentage < 40 ? "\u001b[31m" : "\u001b[0m"; // Красный для низкого процента Console.WriteLine($"{attendanceColor}{student.StudentName} - Посещено: {student.AttendedCount}, Пропущено: {student.MissedCount}, Процент посещаемости: {attendancePercentage:F2}%\u001b[0m"); } } // Метод для получения имени студента по его GUID private string GetStudentNameByGuid(Guid userGuid) { var user = _userRepository.GetAllUsers.FirstOrDefault(u => u.Guid == userGuid); return user != null ? user.FIO : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент" } } }