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