This commit is contained in:
adm 2024-10-23 12:44:48 +03:00
parent 71b5a3c283
commit d3fed9e925
25 changed files with 330 additions and 25 deletions

View File

@ -6,12 +6,12 @@ using System.Threading.Tasks;
namespace Demo.domain.Models namespace Demo.domain.Models
{ {
internal class PresenceLocalEntity public class PresenceLocalEntity
{ {
public required Guid UserGuid { get; set; } public required int UserId { get; set; }
public bool IsAttedance { get; set; } = true; public bool IsAttedance { get; set; } = true;
public required DateOnly Date { get; set; } public required DateTime Date { get; set; }
public required int LessonNumber { get; set; } public required int LessonNumber { get; set; }
} }
} }

View File

@ -27,5 +27,10 @@ namespace Demo.Data.LocalData
new UserLocalEnity{ID = 5, Guid=Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "RandomFio4", GroupID = 2 }, new UserLocalEnity{ID = 5, Guid=Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "RandomFio4", GroupID = 2 },
new UserLocalEnity{ID = 6, Guid=Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "RandomFio5", GroupID = 3 }, new UserLocalEnity{ID = 6, Guid=Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "RandomFio5", GroupID = 3 },
}; };
public static List<PresenceLocalEntity> presences => new List<PresenceLocalEntity>
{
};
} }
} }

View File

@ -0,0 +1,18 @@

using Demo.domain.Models;
using Demo.Domain.UseCase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo.Data.Repository
{
public interface IPresenceRepository
{
List<PresenceLocalEntity> GetPresenceByDateAndGroup(DateTime date, int groupId);
void SavePresence(List<PresenceLocalEntity> presences);
}
}

View File

@ -0,0 +1,57 @@
using Demo.Data.LocalData;
using Demo.domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo.Data.Repository
{
public class PresenceRepositoryImpl : IPresenceRepository
{
private List<PresenceLocalEntity> _presences;
public PresenceRepositoryImpl()
{
_presences = LocalStaticData.presences;
}
// Метод для сохранения посещаемости
public void SavePresence(List<PresenceLocalEntity> presences)
{
foreach (var presence in presences)
{
var existingPresence = _presences.FirstOrDefault(p =>
p.Date == presence.Date &&
p.UserId == presence.UserId &&
p.LessonNumber == presence.LessonNumber);
if (existingPresence == null)
{
_presences.Add(presence);
}
else
{
// Обновление существующего значения посещаемости
existingPresence.IsAttedance = presence.IsAttedance;
}
}
}
// Метод для получения всех дат посещаемости по группе
public List<DateTime> GetAllDatesByGroup(int groupId)
{
return _presences
.Where(p => LocalStaticData.users.Any(u => u.GroupID == groupId && u.ID == p.UserId))
.Select(p => p.Date.Date)
.Distinct()
.ToList();
}
// Метод для получения посещаемости по дате и группе
public List<PresenceLocalEntity> GetPresenceByDateAndGroup(DateTime date, int groupId)
{
return _presences.Where(p => p.Date.Date == date.Date &&
LocalStaticData.users.Any(u => u.GroupID == groupId && u.ID == p.UserId)).ToList();
}
}
}

View File

@ -11,7 +11,7 @@ namespace Demo.domain.Models
public required User User { get; set; } public required User User { get; set; }
public bool IsAttedance { get; set; } = true; public bool IsAttedance { get; set; } = true;
public required DateOnly Date { get; set; } public required DateTime Date { get; set; }
public required int LessonNumber { get; set; } public required int LessonNumber { get; set; }
} }

View File

@ -0,0 +1,75 @@
using Demo.Data.Repository;
using Demo.domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo.Domain.UseCase
{
public class UseCaseGeneratePresence
{
public readonly UserRepositoryImpl _userRepository;
public readonly IPresenceRepository _presenceRepository;
public UseCaseGeneratePresence(UserRepositoryImpl userRepository, IPresenceRepository presenceRepository)
{
_userRepository = userRepository;
_presenceRepository = presenceRepository;
}
public List<PresenceLocalEntity> GetPresenceByDateAndGroup(DateTime date, int groupId)
{
return _presenceRepository.GetPresenceByDateAndGroup(date, groupId);
}
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate)
{
var users = _userRepository.GetAllUsers.Where(u => u.GroupID == groupId).ToList();
List<PresenceLocalEntity> presences = new List<PresenceLocalEntity>();
for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++)
{
foreach (var user in users)
{
presences.Add(new PresenceLocalEntity
{
UserId = user.ID,
Date = currentDate,
LessonNumber = lessonNumber,
IsAttedance = true
});
}
_presenceRepository.SavePresence(presences);
}
}
public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime)
{
for (int i = 0; i < 7; i++)
{
DateTime currentTime = startTime.AddDays(i);
GeneratePresenceDaily(firstLesson, lastLesson, groupId, currentTime);
}
}
// Отметить пользователя как отсутствующего на диапазоне занятий
public void MarkUserAbsentForLessons(int userId, int groupId, int firstLesson, int lastLesson, DateTime date)
{
var presences = _presenceRepository.GetPresenceByDateAndGroup(date, groupId);
foreach (var presence in presences.Where(p => p.UserId == userId && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson))
{
presence.IsAttedance = false;
}
_presenceRepository.SavePresence(presences);
}
}
}

View File

@ -2,14 +2,18 @@
using Demo.Domain.UseCase; using Demo.Domain.UseCase;
using Demo.UI; using Demo.UI;
// Создаем экземпляр репозиториев
GroupRepositoryImpl groupRepositoryImpl = new GroupRepositoryImpl(); GroupRepositoryImpl groupRepositoryImpl = new GroupRepositoryImpl();
UserRepositoryImpl userRepositoryImpl = new UserRepositoryImpl(); UserRepositoryImpl userRepositoryImpl = new UserRepositoryImpl();
PresenceRepositoryImpl presenceRepositoryImpl = new PresenceRepositoryImpl(); // Создаем экземпляр PresenceRepositoryImpl
// Создаем UseCase для пользователей и групп
UserUseCase userUseCase = new UserUseCase(userRepositoryImpl, groupRepositoryImpl); UserUseCase userUseCase = new UserUseCase(userRepositoryImpl, groupRepositoryImpl);
GroupUseCase groupUseCase = new GroupUseCase(groupRepositoryImpl); GroupUseCase groupUseCase = new GroupUseCase(groupRepositoryImpl);
UseCaseGeneratePresence presenceUseCase = new UseCaseGeneratePresence(userRepositoryImpl, presenceRepositoryImpl);
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase); // Создаем пользовательский интерфейс
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase, presenceUseCase);
// Выводим главное меню
mainMenuUI.DisplayMenu(); mainMenuUI.DisplayMenu();

View File

@ -1,4 +1,5 @@
using Demo.Domain.UseCase; using Demo.domain.Models;
using Demo.Domain.UseCase;
using System; using System;
namespace Demo.UI namespace Demo.UI
@ -7,11 +8,13 @@ namespace Demo.UI
{ {
private readonly UserConsoleUI _userConsoleUI; private readonly UserConsoleUI _userConsoleUI;
private readonly GroupConsoleUI _groupConsoleUI; private readonly GroupConsoleUI _groupConsoleUI;
private readonly PresenceConsole _presenceConsoleUI;
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase) public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCaseGeneratePresence presenceUseCase)
{ {
_userConsoleUI = new UserConsoleUI(userUseCase); _userConsoleUI = new UserConsoleUI(userUseCase);
_groupConsoleUI = new GroupConsoleUI(groupUseCase); _groupConsoleUI = new GroupConsoleUI(groupUseCase);
_presenceConsoleUI = new PresenceConsole(presenceUseCase);
} }
public void DisplayMenu() public void DisplayMenu()
@ -34,8 +37,13 @@ namespace Demo.UI
Console.WriteLine("8. Изменить название группы"); Console.WriteLine("8. Изменить название группы");
Console.WriteLine("9. Поиск группы по ID"); Console.WriteLine("9. Поиск группы по ID");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("0. Выход"); Console.WriteLine("=-= Команды Presence =-=");
Console.WriteLine("10. Сгенерировать посещаемость на день");
Console.WriteLine("11. Сгенерировать посещаемость на неделю");
Console.WriteLine("12. Показать посещаемость");
Console.WriteLine("13. Отметить пользователя как отсутствующего");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("0. Выход");
Console.Write("\nВаш выбор: "); Console.Write("\nВаш выбор: ");
string comand = Console.ReadLine(); string comand = Console.ReadLine();
@ -105,7 +113,7 @@ namespace Demo.UI
case "7": case "7":
// Удаление группы // Удаление группы
Console.Write("Введите ID группы для удаления: "); Console.Write("Введите ID группы для удаления: ");
string groupIdForDelete=Console.ReadLine(); string groupIdForDelete = Console.ReadLine();
_groupConsoleUI.RemoveGroup(groupIdForDelete); _groupConsoleUI.RemoveGroup(groupIdForDelete);
break; break;
@ -127,11 +135,63 @@ namespace Demo.UI
case "9": case "9":
// Поиск группы // Поиск группы
Console.Write("Введите ID группы для поиска : "); Console.Write("Введите ID группы для поиска : ");
if(int.TryParse(Console.ReadLine(), out int IdGroup)){ if (int.TryParse(Console.ReadLine(), out int IdGroup))
{
_groupConsoleUI.FindGroupById(IdGroup); _groupConsoleUI.FindGroupById(IdGroup);
} }
break; break;
case "10":
// Генерация посещаемости на день
Console.Write("Введите номер первого занятия: ");
int firstLesson = int.Parse(Console.ReadLine());
Console.Write("Введите номер последнего занятия: ");
int lastLesson = int.Parse(Console.ReadLine());
Console.Write("Введите ID группы: ");
int groupIdForPresence = int.Parse(Console.ReadLine());
_presenceConsoleUI.GeneratePresenceForDay(DateTime.Now, groupIdForPresence, firstLesson, lastLesson);
Console.WriteLine("Посещаемость на день сгенерирована.");
break;
case "11":
// Генерация посещаемости на неделю
Console.Write("Введите номер первого занятия: ");
int firstLessonForWeek = int.Parse(Console.ReadLine());
Console.Write("Введите номер последнего занятия: ");
int lastLessonForWeek = int.Parse(Console.ReadLine());
Console.Write("Введите ID группы: ");
int groupIdForWeekPresence = int.Parse(Console.ReadLine());
_presenceConsoleUI.GeneratePresenceForWeek(DateTime.Now, groupIdForWeekPresence, firstLessonForWeek, lastLessonForWeek);
Console.WriteLine("Посещаемость на неделю сгенерирована.");
break;
case "12":
// Отображение посещаемости
Console.Write("Введите дату (гггг-мм-дд): ");
DateTime date = DateTime.Parse(Console.ReadLine());
Console.Write("Введите ID группы: ");
int groupForPresenceView = int.Parse(Console.ReadLine());
_presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
break;
case "13":
// Отметить пользователя как отсутствующего
Console.Write("Введите ID пользователя: ");
userId = int.Parse(Console.ReadLine());
Console.Write("Введите номер первого занятия: ");
int firstAbsLesson = int.Parse(Console.ReadLine());
Console.Write("Введите номер последнего занятия: ");
int lastAbsLesson = int.Parse(Console.ReadLine());
Console.Write("Введите ID группы: ");
int absGroupId = int.Parse(Console.ReadLine());
_presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userId, firstAbsLesson, lastAbsLesson);
Console.WriteLine("Пользователь отмечен как отсутствующий.");
break;
case "0": case "0":
Console.WriteLine("Выход..."); Console.WriteLine("Выход...");
return; return;
@ -144,4 +204,4 @@ namespace Demo.UI
} }
} }
} }
} }

View File

@ -0,0 +1,86 @@
using Demo.domain.Models;
using Demo.Domain.UseCase;
using System;
using System.Collections.Generic;
namespace Demo.UI
{
public class PresenceConsole
{
private readonly UseCaseGeneratePresence _presenceUseCase;
public PresenceConsole(UseCaseGeneratePresence presenceUseCase)
{
_presenceUseCase = presenceUseCase;
}
// Метод для генерации посещаемости на день
public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
{
try
{
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId,date);
Console.WriteLine("Посещаемость на день успешно сгенерирована.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
}
}
// Метод для генерации посещаемости на неделю
public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
{
try
{
_presenceUseCase.GenerateWeeklyPresence(firstLesson, lastLesson, groupId, date);
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
}
}
// Метод для отображения посещаемости на конкретную дату и группу
public void DisplayPresence(DateTime date, int groupId)
{
try
{
List<PresenceLocalEntity> presences = _presenceUseCase.GetPresenceByDateAndGroup(date, groupId);
if (presences == null || presences.Count == 0)
{
Console.WriteLine("Посещаемость на выбранную дату отсутствует.");
return;
}
Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:");
Console.WriteLine("---------------------------------------------");
int a = presences[0].LessonNumber;
foreach (var presence in presences)
{
if (a != presence.LessonNumber)
{
Console.WriteLine("---------------------------------------------");
a=presence.LessonNumber;
}
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
}
Console.WriteLine("---------------------------------------------");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
}
}
public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson)
{
_presenceUseCase.MarkUserAbsentForLessons(userId, groupId, firstLesson, lastLesson, date);
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Demo")] [assembly: System.Reflection.AssemblyCompanyAttribute("Demo")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6be91a3daa12e11afafcb7bfa8a381851a1c6d13")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+71b5a3c2837384ab3b6285a4c3d50906eb3b91cd")]
[assembly: System.Reflection.AssemblyProductAttribute("Demo")] [assembly: System.Reflection.AssemblyProductAttribute("Demo")]
[assembly: System.Reflection.AssemblyTitleAttribute("Demo")] [assembly: System.Reflection.AssemblyTitleAttribute("Demo")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
597fa958725b79051cce88e5b66d8ff3029ce88e040c90e31a5a5829fb266be4 5088e77b146ea464a1056f1261a0d0e4064405ca4080bc9ab4bf224a506ec90b

View File

@ -8,6 +8,6 @@ build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules = build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Demo build_property.RootNamespace = Demo
build_property.ProjectDir = C:\Users\adm\source\repos\presence_new\Demo\ build_property.ProjectDir = C:\Users\adm\Source\Repos\presence_new\Demo\
build_property.EnableComHosting = build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -1 +1 @@
ed5a8c36a17dc0ce1f0584a54124cf9ca5fb6a4c72ce3bba4b5a671138ebee45 4ff1023a87b9461fc42766b66bdf7edceabf9645024b245c490a1e3cd9047155

Binary file not shown.

View File

@ -1 +1 @@
9b1e2cf713fac6b5af6fdc748e02588a118e0108e8af9c39763b31b5c1f122c1 94d3c7dec603eb068976231f8e3f6b7262a20ec3a72c6546c0039fab9f6d5f66

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,15 +1,15 @@
{ {
"format": 1, "format": 1,
"restore": { "restore": {
"C:\\Users\\adm\\source\\repos\\presence_new\\Demo\\Demo.csproj": {} "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\Demo.csproj": {}
}, },
"projects": { "projects": {
"C:\\Users\\adm\\source\\repos\\presence_new\\Demo\\Demo.csproj": { "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\Demo.csproj": {
"version": "1.0.0", "version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "C:\\Users\\adm\\source\\repos\\presence_new\\Demo\\Demo.csproj", "projectUniqueName": "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\Demo.csproj",
"projectName": "Demo", "projectName": "Demo",
"projectPath": "C:\\Users\\adm\\source\\repos\\presence_new\\Demo\\Demo.csproj", "projectPath": "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\Demo.csproj",
"packagesPath": "C:\\Users\\adm\\.nuget\\packages\\", "packagesPath": "C:\\Users\\adm\\.nuget\\packages\\",
"outputPath": "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\obj\\", "outputPath": "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\obj\\",
"projectStyle": "PackageReference", "projectStyle": "PackageReference",

View File

@ -1,8 +1,8 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "+PcSJ/mMOPQ=", "dgSpecHash": "eIAzK05HQQw=",
"success": true, "success": true,
"projectFilePath": "C:\\Users\\adm\\source\\repos\\presence_new\\Demo\\Demo.csproj", "projectFilePath": "C:\\Users\\adm\\Source\\Repos\\presence_new\\Demo\\Demo.csproj",
"expectedPackageFiles": [], "expectedPackageFiles": [],
"logs": [] "logs": []
} }