diff --git a/Demo/Data/RemoteData/RemoteDataBase/DAO/Group.cs b/Demo/Data/RemoteData/RemoteDataBase/DAO/Group.cs index 45c2dd4..98dee11 100644 --- a/Demo/Data/RemoteData/RemoteDataBase/DAO/Group.cs +++ b/Demo/Data/RemoteData/RemoteDataBase/DAO/Group.cs @@ -10,7 +10,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO public class GroupDao { public int Id { get; set; } - public required string Name { get; set; } + public string Name { get; set; } public List Users { get; set; } } } diff --git a/Demo/Data/RemoteData/RemoteDataBase/DAO/Presence.cs b/Demo/Data/RemoteData/RemoteDataBase/DAO/Presence.cs index 9ae499b..fbb977f 100644 --- a/Demo/Data/RemoteData/RemoteDataBase/DAO/Presence.cs +++ b/Demo/Data/RemoteData/RemoteDataBase/DAO/Presence.cs @@ -8,6 +8,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO { public class PresenceDao { + public int PresenceId { get; set; } public int UserId { get; set; } public bool IsAttedance { get; set; } = true; public DateOnly Date { get; set; } diff --git a/Demo/Data/RemoteData/RemoteDataBase/DAO/User.cs b/Demo/Data/RemoteData/RemoteDataBase/DAO/User.cs index 24dd124..6106b1b 100644 --- a/Demo/Data/RemoteData/RemoteDataBase/DAO/User.cs +++ b/Demo/Data/RemoteData/RemoteDataBase/DAO/User.cs @@ -11,6 +11,6 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO public required string FIO { get; set; } public required int UserId { get; set; } public required int GroupId { get; set; } - public GroupDao Group { get; set; } + public GroupDao? Group { get; set; } } } diff --git a/Demo/Data/RemoteData/RemoteDataBase/RemoteDatabaseContext.cs b/Demo/Data/RemoteData/RemoteDataBase/RemoteDatabaseContext.cs index e3cf70f..31255d9 100644 --- a/Demo/Data/RemoteData/RemoteDataBase/RemoteDatabaseContext.cs +++ b/Demo/Data/RemoteData/RemoteDataBase/RemoteDatabaseContext.cs @@ -27,13 +27,8 @@ namespace Demo.Data.RemoteData.RemoteDataBase modelBuilder.Entity().Property(group => group.Id).ValueGeneratedOnAdd(); modelBuilder.Entity().HasKey(user=>user.UserId); modelBuilder.Entity().Property(user=>user.UserId).ValueGeneratedOnAdd(); - modelBuilder.Entity().HasKey(presence => new - { - presence.UserId, - presence.Date, - presence.IsAttedance, - presence.LessonNumber - }); + modelBuilder.Entity().HasKey(presence =>presence.PresenceId); + modelBuilder.Entity().Property(presence=>presence.PresenceId).ValueGeneratedOnAdd(); } } diff --git a/Demo/Data/Repository/GroupRepositoryImpl.cs b/Demo/Data/Repository/GroupRepositoryImpl.cs index 4c75bb6..546f993 100644 --- a/Demo/Data/Repository/GroupRepositoryImpl.cs +++ b/Demo/Data/Repository/GroupRepositoryImpl.cs @@ -53,11 +53,6 @@ public class GroupRepositoryImpl: IGroupRepository } } - bool IGroupRepository.RemoveGroupById(int groupID) - { - throw new NotImplementedException(); - } - List IGroupRepository.GetAllGroups() { throw new NotImplementedException(); diff --git a/Demo/Data/Repository/IGroupRepository.cs b/Demo/Data/Repository/IGroupRepository.cs index 6eb3ab3..d5f20ef 100644 --- a/Demo/Data/Repository/IGroupRepository.cs +++ b/Demo/Data/Repository/IGroupRepository.cs @@ -11,7 +11,6 @@ namespace Demo.Data.Repository public interface IGroupRepository { List GetAllGroups(); - bool RemoveGroupById(int groupID); bool UpdateGroupById(int groupID, GroupDao updatedGroup); GroupDao GetGroupById(int groupID); bool AddGroup(string Name); diff --git a/Demo/Data/Repository/IPresenceRepository.cs b/Demo/Data/Repository/IPresenceRepository.cs index 0415ab7..8709689 100644 --- a/Demo/Data/Repository/IPresenceRepository.cs +++ b/Demo/Data/Repository/IPresenceRepository.cs @@ -15,5 +15,7 @@ namespace Demo.Data.Repository List GetPresenceByDateAndGroup(DateTime date, int groupId); void SavePresence(List presences); List GetPresenceByGroup(int groupId); + DateOnly? GetLastDateByGroupId(int groupId); + List GetPresenceForAbsent(DateTime date, int GroupId); } } diff --git a/Demo/Data/Repository/IUserRepository.cs b/Demo/Data/Repository/IUserRepository.cs index 0a3cae6..e3fa986 100644 --- a/Demo/Data/Repository/IUserRepository.cs +++ b/Demo/Data/Repository/IUserRepository.cs @@ -6,7 +6,7 @@ namespace Demo.Data.Repository { public interface IUserRepository { - IEnumerable GetAllUsers { get; } + List GetAllUsers(); bool RemoveUserById(int userId); UserDao? UpdateUser(UserDao user); } diff --git a/Demo/Data/Repository/PresenceRepositoryImpl.cs b/Demo/Data/Repository/PresenceRepositoryImpl.cs index d38d28f..0f0b8df 100644 --- a/Demo/Data/Repository/PresenceRepositoryImpl.cs +++ b/Demo/Data/Repository/PresenceRepositoryImpl.cs @@ -47,5 +47,7 @@ namespace Demo.Data.Repository { return _presences.Where(p => p.GroupId == groupId).ToList(); } + + } } diff --git a/Demo/Data/Repository/SQLPresenceRepository.cs b/Demo/Data/Repository/SQLPresenceRepository.cs index bab77ab..db553db 100644 --- a/Demo/Data/Repository/SQLPresenceRepository.cs +++ b/Demo/Data/Repository/SQLPresenceRepository.cs @@ -2,10 +2,13 @@ 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.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Demo.Data.Repository @@ -18,7 +21,10 @@ namespace Demo.Data.Repository { _remoteDatabaseContext = remoteDatabaseContext; } - + public List GetPresenceForAbsent(DateTime date, int GroupId) + { + return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == GroupId && p.Date==DateOnly.FromDateTime(date)).ToList(); + } public List GetPresenceByDateAndGroup(DateTime date, int groupId) { return _remoteDatabaseContext.PresenceDaos.Where(p => p.Date == DateOnly.FromDateTime(date) && @@ -28,10 +34,6 @@ namespace Demo.Data.Repository // Реализация метода для получения всех данных по группе public List GetPresenceByGroup(int groupId) { - foreach (var user in _remoteDatabaseContext.PresenceDaos) - { - Console.WriteLine(user); - } return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == groupId).ToList(); } @@ -42,10 +44,23 @@ namespace Demo.Data.Repository Date = it.Date, IsAttedance = it.IsAttedance, LessonNumber = it.LessonNumber, - UserId = it.UserId + UserId = it.UserId, + GroupId = it.GroupId })); _remoteDatabaseContext.SaveChanges(); } + 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; + } + } } diff --git a/Demo/Data/Repository/SQLUserRepositoryImpl.cs b/Demo/Data/Repository/SQLUserRepositoryImpl.cs index c6a10c0..a8a68a0 100644 --- a/Demo/Data/Repository/SQLUserRepositoryImpl.cs +++ b/Demo/Data/Repository/SQLUserRepositoryImpl.cs @@ -18,8 +18,6 @@ namespace Demo.Data.Repository _remoteDatabaseContext = remoteDatabaseContext; } - public IEnumerable GetAllUsers => _remoteDatabaseContext.Users; - public bool RemoveUserById(int userId) { var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == userId); @@ -34,10 +32,18 @@ namespace Demo.Data.Repository var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == user.UserId); if (existingUser == null) throw new UserNotFoundException(user.UserId); + // Обновляем поля существующего пользователя existingUser.FIO = user.FIO; existingUser.GroupId = user.GroupId; + _remoteDatabaseContext.SaveChanges(); return existingUser; } + + public List GetAllUsers() + { + // Возвращаем пользователей, отсортированных по UserId + return _remoteDatabaseContext.Users.OrderBy(u => u.UserId).ToList(); + } } } diff --git a/Demo/Data/Repository/UserRepositoryImpl.cs b/Demo/Data/Repository/UserRepositoryImpl.cs index a25e30f..e1d6e40 100644 --- a/Demo/Data/Repository/UserRepositoryImpl.cs +++ b/Demo/Data/Repository/UserRepositoryImpl.cs @@ -29,17 +29,6 @@ namespace Demo.Data.Repository return true; } - public UserLocalEnity? UpdateUser(UserLocalEnity user) - { - var existingUser = _users.FirstOrDefault(u => u.ID == user.ID); - if (existingUser == null) throw new UserNotFoundException(user.ID); - - existingUser.FIO = user.FIO; - existingUser.GroupID = user.GroupID; - - return existingUser; - } - public UserDao? UpdateUser(UserDao user) { throw new NotImplementedException(); diff --git a/Demo/Demo.csproj b/Demo/Demo.csproj index ed80240..e091d33 100644 --- a/Demo/Demo.csproj +++ b/Demo/Demo.csproj @@ -19,6 +19,7 @@ + diff --git a/Demo/Domain/UseCase/GroupUseCase.cs b/Demo/Domain/UseCase/GroupUseCase.cs index f8d3f6f..f0749a3 100644 --- a/Demo/Domain/UseCase/GroupUseCase.cs +++ b/Demo/Domain/UseCase/GroupUseCase.cs @@ -91,26 +91,6 @@ namespace Demo.Domain.UseCase _repositoryGroupImpl.AddGroup(newGroup.Name); } - public void RemoveGroupById(int groupId) - { - ValidateGroupId(groupId); - var existingGroup = ValidateGroupExistence(groupId); - List _groups = GetAllGroups(); - - // Находим группу по ID и удаляем ее - var groupToRemove = _groups.FirstOrDefault(g => g.Id == existingGroup.Id); - if (groupToRemove != null) - { - _groups.Remove(groupToRemove); - _repositoryGroupImpl.RemoveGroupById(existingGroup.Id); - } - else - { - throw new ArgumentException("Группа не найдена."); - // Обработка случая, если группа не найдена (например, выброс исключения) - } - } - // Метод для изменения названия группы public void UpdateGroup(int groupId, string newGroupName) diff --git a/Demo/Domain/UseCase/UseCaseGeneratePresence.cs b/Demo/Domain/UseCase/UseCaseGeneratePresence.cs index 4320e66..c9ae066 100644 --- a/Demo/Domain/UseCase/UseCaseGeneratePresence.cs +++ b/Demo/Domain/UseCase/UseCaseGeneratePresence.cs @@ -1,6 +1,7 @@ using Demo.Data.RemoteData.RemoteDataBase.DAO; using Demo.Data.Repository; using Demo.domain.Models; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -13,6 +14,7 @@ namespace Demo.Domain.UseCase { public readonly IUserRepository _userRepository; public readonly IPresenceRepository _presenceRepository; + public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository) { @@ -28,23 +30,26 @@ namespace Demo.Domain.UseCase return _presenceRepository.GetPresenceByDateAndGroup(date, groupId); } - public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate) + public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId) { try { - var users = _userRepository.GetAllUsers.Where(u => u.GroupId == groupId).ToList(); + var users = _userRepository.GetAllUsers().Where(u => u.GroupId == groupId).ToList(); + + // Находим последнюю дату посещаемости для данной группы + DateOnly startDate = _presenceRepository.GetLastDateByGroupId(groupId)?.AddDays(1) + ?? DateOnly.FromDateTime(DateTime.Today); List presences = new List(); for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++) { foreach (var user in users) { - Console.WriteLine($"UserId: {user.UserId}, GroupId: {user.GroupId}"); // Выводим информацию о пользователе var presence = new PresenceDao { UserId = user.UserId, GroupId = user.GroupId, - Date = DateOnly.FromDateTime(currentDate), + Date = startDate, LessonNumber = lessonNumber, IsAttedance = true }; @@ -52,7 +57,7 @@ namespace Demo.Domain.UseCase try { _presenceRepository.SavePresence(new List { presence }); - Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber}"); + Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber} на дату {startDate}"); } catch (Exception ex) { @@ -76,12 +81,14 @@ namespace Demo.Domain.UseCase } + + 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); + GeneratePresenceDaily(firstLesson, lastLesson, groupId); } } @@ -90,24 +97,26 @@ namespace Demo.Domain.UseCase // Отметить пользователя как отсутствующего на диапазоне занятий public void MarkUserAbsentForLessons(int userId, int groupId, int firstLesson, int lastLesson, DateTime date) { - var presences = _presenceRepository.GetPresenceByDateAndGroup(date, groupId); + List presences = _presenceRepository.GetPresenceForAbsent(date, groupId); + + // Обновляем состояние присутствия для указанных занятий foreach (var presence in presences.Where(p => p.UserId == userId && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson)) { - presence.IsAttedance = false; + presence.IsAttedance = false; // Устанавливаем отсутствие + Console.WriteLine($"PresenceId: {presence.PresenceId}, UserId: {presence.UserId}, Lesson Num: {presence.LessonNumber}, Att: {presence.IsAttedance}"); } + // Сохраняем изменения в репозитории _presenceRepository.SavePresence(presences); } - - public List GetAllPresenceByGroup(int groupId) { - return _presenceRepository.GetPresenceByGroup(groupId); } + } } diff --git a/Demo/Domain/UseCase/UserUseCase.cs b/Demo/Domain/UseCase/UserUseCase.cs index 3cb1c84..716e844 100644 --- a/Demo/Domain/UseCase/UserUseCase.cs +++ b/Demo/Domain/UseCase/UserUseCase.cs @@ -28,7 +28,7 @@ namespace Demo.Domain.UseCase // Приватный метод для валидации существования пользователя по ID private UserDao ValidateUserExistence(int userId) { - var user = _repositoryUserImpl.GetAllUsers + var user = _repositoryUserImpl.GetAllUsers() .FirstOrDefault(u => u.UserId == userId); if (user == null) @@ -54,7 +54,7 @@ namespace Demo.Domain.UseCase } // Вывести всех пользователей - public List GetAllUsers() => _repositoryUserImpl.GetAllUsers + public List GetAllUsers() => _repositoryUserImpl.GetAllUsers() .Join(_repositoryGroupImpl.GetAllGroups(), user => user.GroupId, // Ключ для пользователей group => group.Id, // Ключ для групп @@ -86,47 +86,47 @@ namespace Demo.Domain.UseCase } // Обновить пользователя по id - //public User UpdateUser(User user) - //{ - // ValidateUserFIO(user.FIO); - // ValidateGroupExistence(user.Group.Id); + public UserDao UpdateUser(UserDao user) + { + ValidateUserFIO(user.FIO); + ValidateGroupExistence(user.GroupId); - // UserDao userDao = new UserDao - // { - // FIO = user.FIO, - // GroupId = user.Group.Id - // }; + UserDao userDao = new UserDao + { + UserId = user.UserId, + FIO = user.FIO, + GroupId = user.GroupId + }; - // UserDao? result = _repositoryUserImpl.UpdateUser(userDao); + UserDao? result = _repositoryUserImpl.UpdateUser(userDao); - // if (result == null) - // { - // throw new Exception("Ошибка при обновлении пользователя."); - // } + if (result == null) + { + throw new Exception("Ошибка при обновлении пользователя."); + } - // var groupEntity = ValidateGroupExistence(result.GroupId); + var groupEntity = ValidateGroupExistence(result.GroupId); - // return new User - // { - // FIO = result.FIO, - // Group = new Group - // { - // Id = groupEntity.Id, - // Name = groupEntity.Name - // } - // }; - //} + return new UserDao + { + UserId=user.UserId, + FIO = result.FIO, + GroupId = result.GroupId + }; + + } // Найти пользователя по id - public User FindUserById(int userId) + public UserDao FindUserById(int userId) { var user = ValidateUserExistence(userId); var group = ValidateGroupExistence(user.GroupId); - return new User + return new UserDao { + UserId = user.UserId, FIO = user.FIO, - Group = new Group { Id = group.Id, Name = group.Name } + GroupId = group.Id }; } } diff --git a/Demo/Migrations/20241025085326_InitialCreate.Designer.cs b/Demo/Migrations/20241101064613_InitialMigration.Designer.cs similarity index 83% rename from Demo/Migrations/20241025085326_InitialCreate.Designer.cs rename to Demo/Migrations/20241101064613_InitialMigration.Designer.cs index c3f3dd9..7255aa8 100644 --- a/Demo/Migrations/20241025085326_InitialCreate.Designer.cs +++ b/Demo/Migrations/20241101064613_InitialMigration.Designer.cs @@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Demo.Migrations { [DbContext(typeof(RemoteDatabaseContext))] - [Migration("20241025085326_InitialCreate")] - partial class InitialCreate + [Migration("20241101064613_InitialMigration")] + partial class InitialMigration { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -44,27 +44,28 @@ namespace Demo.Migrations modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => { - b.Property("UserId") + b.Property("PresenceId") + .ValueGeneratedOnAdd() .HasColumnType("integer"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PresenceId")); + b.Property("Date") .HasColumnType("date"); + b.Property("GroupId") + .HasColumnType("integer"); + b.Property("IsAttedance") .HasColumnType("boolean"); b.Property("LessonNumber") .HasColumnType("integer"); - b.Property("GroupId") + b.Property("UserId") .HasColumnType("integer"); - b.Property("UserDaoUserId") - .HasColumnType("integer"); - - b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber"); - - b.HasIndex("UserDaoUserId"); + b.HasKey("PresenceId"); b.ToTable("PresenceDaos"); }); @@ -91,17 +92,6 @@ namespace Demo.Migrations b.ToTable("Users"); }); - modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => - { - b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao") - .WithMany() - .HasForeignKey("UserDaoUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("UserDao"); - }); - modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b => { b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group") diff --git a/Demo/Migrations/20241025085326_InitialCreate.cs b/Demo/Migrations/20241101064613_InitialMigration.cs similarity index 79% rename from Demo/Migrations/20241025085326_InitialCreate.cs rename to Demo/Migrations/20241101064613_InitialMigration.cs index 643f15c..296c3ff 100644 --- a/Demo/Migrations/20241025085326_InitialCreate.cs +++ b/Demo/Migrations/20241101064613_InitialMigration.cs @@ -7,7 +7,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Demo.Migrations { /// - public partial class InitialCreate : Migration + public partial class InitialMigration : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -25,6 +25,23 @@ namespace Demo.Migrations table.PrimaryKey("PK_Groups", x => x.Id); }); + migrationBuilder.CreateTable( + name: "PresenceDaos", + columns: table => new + { + PresenceId = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "integer", nullable: false), + IsAttedance = table.Column(type: "boolean", nullable: false), + Date = table.Column(type: "date", nullable: false), + LessonNumber = table.Column(type: "integer", nullable: false), + GroupId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PresenceDaos", x => x.PresenceId); + }); + migrationBuilder.CreateTable( name: "Users", columns: table => new @@ -45,33 +62,6 @@ namespace Demo.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "PresenceDaos", - columns: table => new - { - UserId = table.Column(type: "integer", nullable: false), - IsAttedance = table.Column(type: "boolean", nullable: false), - Date = table.Column(type: "date", nullable: false), - LessonNumber = table.Column(type: "integer", nullable: false), - UserDaoUserId = table.Column(type: "integer", nullable: false), - GroupId = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PresenceDaos", x => new { x.UserId, x.Date, x.IsAttedance, x.LessonNumber }); - table.ForeignKey( - name: "FK_PresenceDaos_Users_UserDaoUserId", - column: x => x.UserDaoUserId, - principalTable: "Users", - principalColumn: "UserId", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_PresenceDaos_UserDaoUserId", - table: "PresenceDaos", - column: "UserDaoUserId"); - migrationBuilder.CreateIndex( name: "IX_Users_GroupId", table: "Users", diff --git a/Demo/Migrations/RemoteDatabaseContextModelSnapshot.cs b/Demo/Migrations/RemoteDatabaseContextModelSnapshot.cs index c4f2402..3ee588f 100644 --- a/Demo/Migrations/RemoteDatabaseContextModelSnapshot.cs +++ b/Demo/Migrations/RemoteDatabaseContextModelSnapshot.cs @@ -41,27 +41,28 @@ namespace Demo.Migrations modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => { - b.Property("UserId") + b.Property("PresenceId") + .ValueGeneratedOnAdd() .HasColumnType("integer"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PresenceId")); + b.Property("Date") .HasColumnType("date"); + b.Property("GroupId") + .HasColumnType("integer"); + b.Property("IsAttedance") .HasColumnType("boolean"); b.Property("LessonNumber") .HasColumnType("integer"); - b.Property("GroupId") + b.Property("UserId") .HasColumnType("integer"); - b.Property("UserDaoUserId") - .HasColumnType("integer"); - - b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber"); - - b.HasIndex("UserDaoUserId"); + b.HasKey("PresenceId"); b.ToTable("PresenceDaos"); }); @@ -88,17 +89,6 @@ namespace Demo.Migrations b.ToTable("Users"); }); - modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => - { - b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao") - .WithMany() - .HasForeignKey("UserDaoUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("UserDao"); - }); - modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b => { b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group") diff --git a/Demo/UI/GroupConsole.cs b/Demo/UI/GroupConsole.cs index dab1660..82a710c 100644 --- a/Demo/UI/GroupConsole.cs +++ b/Demo/UI/GroupConsole.cs @@ -47,13 +47,6 @@ namespace Demo.UI } } - public void RemoveGroup(string groupIdStr) - { - int groupId = int.Parse(groupIdStr); - _groupUseCase.RemoveGroupById(groupId); - Console.WriteLine($"Группа с ID: {groupId} удалена"); - } - // Метод для обновления названия группы public void UpdateGroupName(int groupId, string newGroupName) { diff --git a/Demo/UI/MainMenu.cs b/Demo/UI/MainMenu.cs index 2bd2018..34441d6 100644 --- a/Demo/UI/MainMenu.cs +++ b/Demo/UI/MainMenu.cs @@ -1,6 +1,7 @@ using Demo.domain.Models; using Demo.Domain.UseCase; using System; +using System.Globalization; namespace Demo.UI { @@ -33,16 +34,15 @@ namespace Demo.UI Console.WriteLine("=-= Команды с Группами =-="); Console.WriteLine("5. Вывести все группы"); Console.WriteLine("6. Добавить группу"); - Console.WriteLine("7. Удалить группу"); - Console.WriteLine("8. Изменить название группы"); - Console.WriteLine("9. Поиск группы по ID"); + Console.WriteLine("7. Изменить название группы"); + Console.WriteLine("8. Поиск группы по ID"); Console.WriteLine(); Console.WriteLine("=-= Команды Presence =-="); - Console.WriteLine("10. Сгенерировать посещаемость на день"); - Console.WriteLine("11. Сгенерировать посещаемость на неделю"); - Console.WriteLine("12. Показать посещаемость"); - Console.WriteLine("13. Отметить пользователя как отсутствующего"); - Console.WriteLine("14. Вывести всю посещаемость группы"); + Console.WriteLine("9. Сгенерировать посещаемость на день"); + Console.WriteLine("10. Сгенерировать посещаемость на неделю"); + Console.WriteLine("11. Показать посещаемость"); + Console.WriteLine("12. Отметить пользователя как отсутствующего"); + Console.WriteLine("13. Вывести всю посещаемость группы"); Console.WriteLine(); Console.WriteLine("0. Выход"); @@ -71,19 +71,19 @@ namespace Demo.UI } break; - //case "3": - // // Обновление пользователя по ID - // Console.Write("Введите ID пользователя для обновления: "); - // string updateIdInput = Console.ReadLine(); - // if (int.TryParse(updateIdInput, out int updateUserId)) - // { - // _userConsoleUI.UpdateUserById(updateUserId); - // } - // else - // { - // Console.WriteLine("Неверный формат ID"); - // } - // break; + case "3": + // Обновление пользователя по ID + Console.Write("Введите ID пользователя для обновления: "); + string updateIdInput = Console.ReadLine(); + if (int.TryParse(updateIdInput, out int updateUserId)) + { + _userConsoleUI.UpdateUserById(updateUserId); + } + else + { + Console.WriteLine("Неверный формат ID"); + } + break; case "4": // Поиск пользователя по ID @@ -112,13 +112,6 @@ namespace Demo.UI break; case "7": - // Удаление группы - Console.Write("Введите ID группы для удаления: "); - string groupIdForDelete = Console.ReadLine(); - _groupConsoleUI.RemoveGroup(groupIdForDelete); - break; - - case "8": // Изменение названия группы Console.Write("Введите ID группы для изменения: "); if (int.TryParse(Console.ReadLine(), out int groupId)) @@ -133,7 +126,7 @@ namespace Demo.UI } break; - case "9": + case "8": // Поиск группы Console.Write("Введите ID группы для поиска : "); if (int.TryParse(Console.ReadLine(), out int IdGroup)) @@ -142,7 +135,7 @@ namespace Demo.UI } break; - case "10": + case "9": // Генерация посещаемости на день Console.Write("Введите номер первого занятия: "); int firstLesson = int.Parse(Console.ReadLine()); @@ -155,7 +148,7 @@ namespace Demo.UI Console.WriteLine("Посещаемость на день сгенерирована."); break; - case "11": + case "10": // Генерация посещаемости на неделю Console.Write("Введите номер первого занятия: "); int firstLessonForWeek = int.Parse(Console.ReadLine()); @@ -168,7 +161,7 @@ namespace Demo.UI Console.WriteLine("Посещаемость на неделю сгенерирована."); break; - case "12": + case "11": // Отображение посещаемости Console.Write("Введите дату (гггг-мм-дд): "); DateTime date = DateTime.Parse(Console.ReadLine()); @@ -178,7 +171,7 @@ namespace Demo.UI _presenceConsoleUI.DisplayPresence(date, groupForPresenceView); break; - case "13": + case "12": // Отметить пользователя как отсутствующего Console.Write("Введите ID пользователя: "); userId = int.Parse(Console.ReadLine()); @@ -189,11 +182,22 @@ namespace Demo.UI Console.Write("Введите ID группы: "); int absGroupId = int.Parse(Console.ReadLine()); - _presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userId, firstAbsLesson, lastAbsLesson); + Console.Write("Введите дату (дд.мм.гггг): "); + string dateInput = Console.ReadLine(); + DateTime absenceDate; + + if (!DateTime.TryParseExact(dateInput, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out absenceDate)) + { + Console.WriteLine("Ошибка: Введен некорректный формат даты. Пожалуйста, используйте формат дд.мм.гггг."); + return; // Завершает выполнение, если дата некорректна + } + _presenceConsoleUI.MarkUserAbsent(absenceDate, absGroupId, userId, firstAbsLesson, lastAbsLesson); Console.WriteLine("Пользователь отмечен как отсутствующий."); break; - case "14": + + + case "13": Console.Write("Введите ID группы: "); int groupIdForAllPresence = int.Parse(Console.ReadLine()); _presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence); diff --git a/Demo/UI/PresenceConsole.cs b/Demo/UI/PresenceConsole.cs index f941d34..209bb9e 100644 --- a/Demo/UI/PresenceConsole.cs +++ b/Demo/UI/PresenceConsole.cs @@ -20,7 +20,7 @@ namespace Demo.UI { try { - _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date); + _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId); Console.WriteLine("Посещаемость на день успешно сгенерирована."); } catch (Exception ex) @@ -56,26 +56,31 @@ namespace Demo.UI return; } + // Сортируем присутствия по номеру занятия и ID пользователя + var sortedPresences = presences.OrderBy(p => p.LessonNumber) + .ThenBy(p => p.UserId); + Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:"); Console.WriteLine("---------------------------------------------"); - int a = presences[0].LessonNumber; - foreach (var presence in presences) + + int previousLessonNumber = -1; // Инициализация для сравнения + foreach (var presence in sortedPresences) { - if (a != presence.LessonNumber) + if (previousLessonNumber != presence.LessonNumber) { Console.WriteLine("---------------------------------------------"); - a = presence.LessonNumber; + previousLessonNumber = 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) @@ -90,35 +95,46 @@ namespace Demo.UI { try { - var presences = _presenceUseCase.GetAllPresenceByGroup(groupId); + // Получаем все посещения для группы + var presences = _presenceUseCase.GetAllPresenceByGroup(groupId); + + if (presences == null || presences.Count == 0) + { + Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует."); + return; + } + + // Группируем по дате + var groupedPresences = presences.GroupBy(p => p.Date); - if (presences == null || !presences.Any()) - { - Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует."); - return; - } - int a = presences[0].LessonNumber; - // Группируем по дате - var groupedPresences = presences.GroupBy(p => p.Date); - foreach (var group in groupedPresences) { Console.WriteLine("==================================================="); Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}"); Console.WriteLine("==================================================="); - foreach (var presence in group) - { - if (a != presence.LessonNumber) - { - Console.WriteLine("---------------------------------------------------"); - a= presence.LessonNumber; - } - string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; - Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}"); - } + // Группируем по занятию + var groupedByLesson = group.GroupBy(p => p.LessonNumber); - Console.WriteLine("---------------------------------------------------"); + foreach (var lessonGroup in groupedByLesson) + { + Console.WriteLine($"Занятие {lessonGroup.Key}:"); + + // Создаем HashSet для уникальных пользователей + var userIds = new HashSet(); + + foreach (var presence in lessonGroup) + { + // Проверяем, добавляется ли пользователь в HashSet + if (userIds.Add(presence.UserId)) + { + string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; + Console.WriteLine($"Пользователь ID: {presence.UserId}, Статус: {status}"); + } + } + + Console.WriteLine("---------------------------------------------------"); + } } } catch (Exception ex) diff --git a/Demo/UI/UserConsole.cs b/Demo/UI/UserConsole.cs index 21092e0..7050f7b 100644 --- a/Demo/UI/UserConsole.cs +++ b/Demo/UI/UserConsole.cs @@ -36,26 +36,27 @@ namespace Demo.UI } // Метод для обновления пользователя по ID - //public void UpdateUserById(int userId) - //{ - // try - // { - // var user = _userUseCase.FindUserById(userId); + public void UpdateUserById(int userId) + { + try + { + var user = _userUseCase.FindUserById(userId); - // Console.WriteLine($"Текущие данные: {user.FIO}, {user.Group.Name}"); - // Console.Write("\nВведите новое ФИО: "); - // string newFIO = Console.ReadLine(); - // user.FIO = newFIO; - // _userUseCase.UpdateUser(user); + Console.WriteLine($"Текущие данные: {user.FIO}"); + Console.Write("\nВведите новое ФИО: "); + string newFIO = Console.ReadLine(); - // Console.WriteLine("\nПользователь обновлен.\n"); - // } - // catch (Exception ex) - // { - // Console.WriteLine($"Ошибка: {ex.Message}\n"); - // } - //} + user.FIO = newFIO; + _userUseCase.UpdateUser(user); + + Console.WriteLine("\nПользователь обновлен.\n"); + } + catch (Exception ex) + { + Console.WriteLine($"Ошибка: {ex.Message}\n"); + } + } // Метод для поиска пользователя по ID public void FindUserById(int userId) @@ -63,7 +64,7 @@ namespace Demo.UI var user = _userUseCase.FindUserById(userId); if (user != null) { - Console.WriteLine($"\nПользователь найден: {user.ID}, {user.FIO}, {user.Group.Name}\n"); + Console.WriteLine($"\nПользователь найден: {user.UserId}, {user.FIO}, {user.Group.Name}\n"); } else { diff --git a/Demo/bin/Debug/net8.0/Demo.dll b/Demo/bin/Debug/net8.0/Demo.dll index fd50f62..f9807dc 100644 Binary files a/Demo/bin/Debug/net8.0/Demo.dll and b/Demo/bin/Debug/net8.0/Demo.dll differ diff --git a/Demo/bin/Debug/net8.0/Demo.exe b/Demo/bin/Debug/net8.0/Demo.exe index 1bc7e2b..2332d88 100644 Binary files a/Demo/bin/Debug/net8.0/Demo.exe and b/Demo/bin/Debug/net8.0/Demo.exe differ diff --git a/Demo/bin/Debug/net8.0/Demo.pdb b/Demo/bin/Debug/net8.0/Demo.pdb index 4972a24..ca5d12f 100644 Binary files a/Demo/bin/Debug/net8.0/Demo.pdb and b/Demo/bin/Debug/net8.0/Demo.pdb differ diff --git a/Demo/obj/Debug/net8.0/Demo.AssemblyInfo.cs b/Demo/obj/Debug/net8.0/Demo.AssemblyInfo.cs index b949f2b..ebcad77 100644 --- a/Demo/obj/Debug/net8.0/Demo.AssemblyInfo.cs +++ b/Demo/obj/Debug/net8.0/Demo.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Demo")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4aa192ee8817fa90eef0a643199a140baea5f367")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5f424596e2b0fa84375965a237d76913c98a016f")] [assembly: System.Reflection.AssemblyProductAttribute("Demo")] [assembly: System.Reflection.AssemblyTitleAttribute("Demo")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Demo/obj/Debug/net8.0/Demo.AssemblyInfoInputs.cache b/Demo/obj/Debug/net8.0/Demo.AssemblyInfoInputs.cache index f0a4fd0..b8b98a7 100644 --- a/Demo/obj/Debug/net8.0/Demo.AssemblyInfoInputs.cache +++ b/Demo/obj/Debug/net8.0/Demo.AssemblyInfoInputs.cache @@ -1 +1 @@ -d0ff50a2b7329f08a99a7d850fd97c7e85ea6c3c244d5b7af843a712fd92af39 +e42cc116f635190b7c9988c97519c211c4b2432424ca6ac866ba04673b9f3fa7 diff --git a/Demo/obj/Debug/net8.0/Demo.csproj.CoreCompileInputs.cache b/Demo/obj/Debug/net8.0/Demo.csproj.CoreCompileInputs.cache index bc52d93..e982de8 100644 --- a/Demo/obj/Debug/net8.0/Demo.csproj.CoreCompileInputs.cache +++ b/Demo/obj/Debug/net8.0/Demo.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -30504035d845e5616feb21a777025026c55555e88052b83a111a265004d6549d +1e41011bf1bd18b43960533c1b9a8180853e639316cffb41dabd64b373687e5e diff --git a/Demo/obj/Debug/net8.0/Demo.dll b/Demo/obj/Debug/net8.0/Demo.dll index fd50f62..f9807dc 100644 Binary files a/Demo/obj/Debug/net8.0/Demo.dll and b/Demo/obj/Debug/net8.0/Demo.dll differ diff --git a/Demo/obj/Debug/net8.0/Demo.pdb b/Demo/obj/Debug/net8.0/Demo.pdb index 4972a24..ca5d12f 100644 Binary files a/Demo/obj/Debug/net8.0/Demo.pdb and b/Demo/obj/Debug/net8.0/Demo.pdb differ diff --git a/Demo/obj/Debug/net8.0/apphost.exe b/Demo/obj/Debug/net8.0/apphost.exe index 1bc7e2b..2332d88 100644 Binary files a/Demo/obj/Debug/net8.0/apphost.exe and b/Demo/obj/Debug/net8.0/apphost.exe differ diff --git a/Demo/obj/Debug/net8.0/ref/Demo.dll b/Demo/obj/Debug/net8.0/ref/Demo.dll index 37260fb..92f97d0 100644 Binary files a/Demo/obj/Debug/net8.0/ref/Demo.dll and b/Demo/obj/Debug/net8.0/ref/Demo.dll differ diff --git a/Demo/obj/Debug/net8.0/refint/Demo.dll b/Demo/obj/Debug/net8.0/refint/Demo.dll index 37260fb..92f97d0 100644 Binary files a/Demo/obj/Debug/net8.0/refint/Demo.dll and b/Demo/obj/Debug/net8.0/refint/Demo.dll differ