presenceNikita/Demo/Domain/UseCase/GroupAttendanceService.cs

70 lines
4.1 KiB
C#
Raw Permalink Normal View History

2024-11-10 18:56:16 +00:00
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 : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
}
}
}