presence/Demo/Data/Repository/SQLPresenceRepository.cs
2024-11-03 14:15:59 +03:00

277 lines
9.4 KiB
C#
Raw 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 Demo.Data.LocalData;
using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.domain.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Demo.Data.Repository
{
public class SQLPresenceRepositoryImpl : IPresenceRepository
{
private readonly RemoteDatabaseContext _remoteDatabaseContext;
public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
{
_remoteDatabaseContext = remoteDatabaseContext;
}
public List<PresenceDao> GetPresenceForAbsent(DateTime date, int GroupId)
{
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == GroupId && p.Date == DateOnly.FromDateTime(date)).ToList();
}
public List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId)
{
return _remoteDatabaseContext.PresenceDaos.Where(p => p.Date == DateOnly.FromDateTime(date) &&
_remoteDatabaseContext.Users.Any(u => u.GroupId == groupId && u.UserId == p.UserId)).ToList();
}
// Реализация метода для получения всех данных по группе
public List<PresenceDao> GetPresenceByGroup(int groupId)
{
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == groupId)
.OrderBy(p => p.Date)
.ThenBy(p=>p.UserId).ToList();
}
public void SavePresence(List<PresenceDao> presences)
{
_remoteDatabaseContext.PresenceDaos.AddRange(presences.Select(it => new PresenceDao
{
Date = it.Date,
IsAttedance = it.IsAttedance,
LessonNumber = it.LessonNumber,
UserId = it.UserId,
GroupId = it.GroupId
}));
_remoteDatabaseContext.SaveChanges();
}
public void UpdateAtt(int userId, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance)
{
// Находим все записи по UserId, GroupId, LessonNumber (в диапазоне) и дате
var presences = _remoteDatabaseContext.PresenceDaos
.Where(p => p.UserId == userId
&& p.GroupId == groupId
&& p.LessonNumber >= firstLesson
&& p.LessonNumber <= lastLesson
&& p.Date == date)
.ToList();
if (presences.Any())
{
// Обновляем значение IsAttendance для всех найденных записей
foreach (var presence in presences)
{
presence.IsAttedance = isAttendance;
}
_remoteDatabaseContext.SaveChanges(); // Сохраняем изменения в базе данных
Console.WriteLine($"Статус посещаемости для пользователя {userId} с {firstLesson} по {lastLesson} урок обновлён.");
}
else
{
Console.WriteLine($"Посещаемость для пользователя ID: {userId} на дату {date.ToShortDateString()} с {firstLesson} по {lastLesson} уроки не найдена.");
}
}
public DateOnly? GetLastDateByGroupId(int groupId)
{
// Проверяем наличие записей о посещаемости в базе данных для данной группы.
var lastDate = _remoteDatabaseContext.PresenceDaos
.Where(p => p.GroupId == groupId)
.OrderByDescending(p => p.Date)
.Select(p => p.Date)
.FirstOrDefault();
return lastDate == default ? (DateOnly?)null : lastDate;
}
public List<PresenceDao> PresenceSort(List<PresenceDao> presences)
{
presences=_remoteDatabaseContext.PresenceDaos.OrderBy(p=>p.Date).ToList();
return presences;
}
public void GetGeneralPresenceForGroup(int groupId)
{
var presences = _remoteDatabaseContext.PresenceDaos.Where(p=>p.GroupId==groupId).OrderBy(p=>p.LessonNumber).ToList();
int lesId = 0;
int lesNum = 1;
double att = 0;
int countAllLes = 0;
DateOnly date= DateOnly.MinValue;
List<int> usersId = new List<int>();
foreach (var presence in presences)
{
if (!usersId.Contains(presence.UserId))
{
usersId.Add(presence.UserId);
}
if (presence.Date != date)
{
date = presence.Date;
lesId++;
lesNum = presence.LessonNumber;
}
if (presence.LessonNumber != lesNum && date == presence.Date)
{
lesNum = presence.LessonNumber;
countAllLes++;
lesId++;
}
if (presence.IsAttedance)
{
att++;
}
}
Console.WriteLine($"Человек в группе: {usersId.Count()}, " +
$"Количество проведённых занятий: {lesId}, " +
$"Общий процент посещаемости группы: {att/usersId.Count()/lesNum*100}%");
List<Temp> a = new List<Temp>();
List<int> ids = new List<int>();
double ok = 0;
double skip = 0;
int userId = 0;
foreach (var user in usersId)
{
var users = _remoteDatabaseContext.PresenceDaos.Where(p => p.UserId == user);
foreach (var usera in users)
{
userId = usera.UserId;
if (!ids.Contains(usera.UserId))
{
skip = 0;
ok = 0;
ids.Add(userId);
a.Add(new Temp { UserId = userId, ok = ok, skip = skip });
userId = usera.UserId;
if (usera.IsAttedance)
{
a.First(a => a.UserId == usera.UserId).ok = ok += 1;
}
else
{
a.First(a => a.UserId == usera.UserId).skip = skip += 1;
}
}
else
{
if (usera.IsAttedance)
{
a.First(a => a.UserId == usera.UserId).ok=ok+=1;
}
else
{
a.First(a => a.UserId == usera.UserId).skip=skip+=1;
}
}
}
}
foreach(var user in a)
{
if(user.ok / (user.skip + user.ok) * 100 < 40)
{
Console.ForegroundColor = ConsoleColor.Red;
}
Console.WriteLine($"ID Пользователя: {user.UserId}, " +
$"Посетил: {user.ok}, " +
$"Пропустил: {user.skip}, " +
$"Процент посещаемости: {user.ok/(user.skip+user.ok)*100}%");
Console.ForegroundColor= ConsoleColor.White;
}
//double skip=0;
//double ok=0;
//List<Temp> users = new List<Temp>();
//foreach (var presence in presences)
//{
// int id = presence.UserId;
// var attendance=_remoteDatabaseContext.PresenceDaos.Where(p=>p.UserId==id).ToList();
// int userid = 0;
// int lessons=0;
// foreach (var user in attendance)
// {
// skip = 0;
// ok = 0;
// lessons = 0;
// if (user.IsAttedance)
// {
// ok++;
// }
// else
// {
// skip++;
// }
// lessons++;
// userid=user.UserId;
// }
// if (ok != 0)
// {
// Console.WriteLine($"{userid} Посетил: {ok}, Пропустил: {skip}, Процент посещаемости: {lessons / ok * 100}%");
// }
// else
// {
// Console.WriteLine($"{userid} Посетил: {ok}, Пропустил: {skip}, Процент посещаемости: 0%");
// }
// lessons = 0;
//}
}
}
}