79 lines
4.0 KiB
C#
79 lines
4.0 KiB
C#
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 : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
|
||
}
|
||
}
|
||
}
|