Mega_New_Presence/presence_new/Domain/UseCase/GroupAttendanceService.cs

79 lines
4.0 KiB
C#
Raw Normal View History

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