Presence_Desktop/data/Repository/SQLPresenceRepositoryImpl.cs
2024-12-23 14:26:41 +03:00

248 lines
12 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 data.RemoteData;
using data.RemoteData.DAO;
using domain.Models;
using Microsoft.EntityFrameworkCore;
namespace data.Repository
{
// Реализация интерфейса IPresenceRepository для работы с посещаемостью
public class SQLPresenceRepositoryImpl : IPresenceRepository
{
private readonly RemoteDatabaseContext _remoteDatabaseContext;
// Конструктор, принимающий контекст базы данных
public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
{
_remoteDatabaseContext = remoteDatabaseContext;
}
// Добавление новой записи о посещаемости
public void AddPresence(PresenceLocalEntity presence)
{
if (presence == null) throw new ArgumentNullException(nameof(presence)); // Проверка на null
var newPresence = new PresenceDao
{
Date = DateOnly.FromDateTime(presence.Date),
UserGuid = presence.UserGuid,
LessonNumber = presence.LessonNumber,
IsAttedance = presence.IsAttedance
};
_remoteDatabaseContext.PresenceDaos.Add(newPresence); // Добавляем новую запись
}
// Очистка всех записей о посещаемости
public void ClearAllPresence()
{
var allPresenceRecords = _remoteDatabaseContext.PresenceDaos.ToList();
_remoteDatabaseContext.PresenceDaos.RemoveRange(allPresenceRecords); // Удаляем все записи
_remoteDatabaseContext.SaveChanges(); // Сохраняем изменения
}
// Получение посещаемости по ID группы
public List<PresenceDao> GetAttendanceByGroup(int groupId)
{
var userGuidsInGroup = _remoteDatabaseContext.Users
.Where(u => u.GroupID == groupId)
.Select(u => u.Guid)
.ToList();
// Фильтруем посещаемость по пользователям из этой группы
return _remoteDatabaseContext.PresenceDaos
.Where(p => userGuidsInGroup.Contains(p.UserGuid))
.Select(p => new PresenceDao
{
UserGuid = p.UserGuid,
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttedance = p.IsAttedance
})
.ToList(); // Возвращаем список посещаемости
}
// Получение общей посещаемости для группы
public GroupPresenceSummary GetGeneralPresenceForGroup(int groupId)
{
var presences = _remoteDatabaseContext.PresenceDaos
.Where(p => p.UserDao.GroupID == groupId)
.OrderBy(p => p.Date).ThenBy(p => p.LessonNumber)
.ToList();
var distinctLessonDates = presences
.Select(p => new { p.Date, p.LessonNumber })
.Distinct()
.ToList();
int lessonCount = distinctLessonDates.Count; // Количество уроков
var userGuids = presences
.Select(p => p.UserGuid)
.Distinct()
.ToHashSet();
double totalAttendance = presences.Count(p => p.IsAttedance); // Общее количество присутствий
double totalPossibleAttendance = userGuids.Count * lessonCount; // Общее возможное количество присутствий
var userAttendances = userGuids.Select(userGuid =>
{
var userPresences = presences.Where(p => p.UserGuid == userGuid).ToList();
double attended = userPresences.Count(p => p.IsAttedance); // Количество присутствий пользователя
double missed = userPresences.Count(p => !p.IsAttedance); // Количество пропусков пользователя
return new UserAttendance
{
UserGuid = userGuid,
Attended = attended,
Missed = missed,
AttendanceRate = (attended / (attended + missed)) * 100 // Процент посещаемости
};
}).ToList();
// Рассчитываем процент посещаемости в заданной группе
double totalAttendancePercentage = (totalAttendance / totalPossibleAttendance) * 100;
return new GroupPresenceSummary
{
UserCount = userGuids.Count,
LessonCount = lessonCount,
TotalAttendancePercentage = totalAttendancePercentage,
UserAttendances = userAttendances
};
}
// Получение последней даты посещаемости для группы
public DateOnly? GetLastDateByGroupId(int groupId)
{
// Проверяем наличие записей о посещаемости в БД
var lastDate = _remoteDatabaseContext.PresenceDaos
.Where(p => p.UserDao.GroupID == groupId)
.OrderByDescending(p => p.Date)
.Select(p => p.Date)
.FirstOrDefault();
return lastDate == default ? (DateOnly?)null : lastDate; // Возвращаем последнюю дату или null
}
// Получение посещаемости по ID группы
public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
{
return _remoteDatabaseContext.PresenceDaos.Include(user => user.UserDao)
.Where(p => p.UserDao != null && p.UserDao.GroupID == groupId) // Проверка на null
.Select(p => new PresenceLocalEntity
{
Date = p.Date.ToDateTime(TimeOnly.MinValue), // Преобразование даты
UserGuid = p.UserGuid,
LessonNumber = p.LessonNumber,
IsAttedance = p.IsAttedance
})
.ToList(); // Возвращаем список посещаемости
}
// Получение посещаемости по ID группы и дате
public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
{
return _remoteDatabaseContext.PresenceDaos
.Where(p => p.UserDao != null && p.UserDao.GroupID == groupId && p.Date == DateOnly.FromDateTime(date))
.Select(p => new PresenceLocalEntity
{
Date = p.Date.ToDateTime(TimeOnly.MinValue), // Преобразование даты
UserGuid = p.UserGuid,
LessonNumber = p.LessonNumber,
IsAttedance = p.IsAttedance
})
.ToList(); // Возвращаем список посещаемости
}
// Пометка пользователя как отсутствующего на занятиях
public void MarkUserAsAbsent(Guid userGuid, int firstLessonNumber, int lastLessonNumber)
{
foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
{
var presence = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
p.UserGuid == userGuid &&
p.LessonNumber == lesson);
if (presence != null)
{
presence.IsAttedance = false; // Устанавливаем отсутствие
}
}
}
// Сохранение посещаемости для списка записей
public void SavePresence(List<PresenceLocalEntity> presences)
{
foreach (var presence in presences)
{
// Проверяем, существует ли запись с указанными параметрами
var existing = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
p.Date == DateOnly.FromDateTime(presence.Date) &&
p.UserGuid == presence.UserGuid &&
p.LessonNumber == presence.LessonNumber);
if (existing == null)
{
// Добавляем запись, если её не существует
_remoteDatabaseContext.PresenceDaos.Add(new PresenceDao
{
Date = DateOnly.FromDateTime(presence.Date),
IsAttedance = presence.IsAttedance,
LessonNumber = presence.LessonNumber,
UserGuid = presence.UserGuid
});
}
else
{
// Обновляем запись, если она уже существует
existing.IsAttedance = presence.IsAttedance;
}
}
_remoteDatabaseContext.SaveChanges(); // Сохраняем изменения в базе данных
}
// Обновление записи о посещаемости
public void UpdateAttendance(PresenceLocalEntity attendance)
{
if (attendance == null)
throw new ArgumentNullException(nameof(attendance)); // Проверка на null
// Ищем запись в базе данных по идентификатору
var existingAttendance = _remoteDatabaseContext.PresenceDaos
.FirstOrDefault(p => p.Id == attendance.Id);
if (existingAttendance != null)
{
// Обновляем запись
existingAttendance.IsAttedance = attendance.IsAttedance;
_remoteDatabaseContext.SaveChanges(); // Сохраняем изменения
}
else
{
throw new InvalidOperationException("Запись с указанным ID не найдена."); // Исключение, если запись не найдена
}
}
// Обновление посещаемости пользователя
public bool UpdateAttention(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance)
{
var presences = _remoteDatabaseContext.PresenceDaos
.Where(p => p.UserGuid == userGuid && p.UserDao.GroupID == groupId &&
p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson && p.Date == date)
.ToList();
if (presences.Any())
{
foreach (var presence in presences)
{
presence.IsAttedance = isAttendance; // Обновляем посещаемость
}
_remoteDatabaseContext.SaveChanges(); // Сохраняем изменения
return true; // Возвращаем true, если обновление прошло успешно
}
return false; // Возвращаем false, если записи не найдены
}
}
}