presenceNikita/Demo/Domain/UseCase/GroupAttendanceService.cs

70 lines
4.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Demo.Data.Repository; // Для доступа к репозиториям данных
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)
{
// Получаем данные о посещаемости для группы с ID 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).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 : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
}
}
}