Обновление проекта

This commit is contained in:
slarny 2024-11-25 07:33:26 +03:00
parent 9ba62b2fa2
commit c55e680ab1
118 changed files with 4715 additions and 2413 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
.vs/
bin/
obj/
*.suo
*.user
*.log
*.cache
*.tmp

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,12 +1,23 @@
{ {
"Version": 1, "Version": 1,
"WorkspaceRootPath": "C:\\Users\\class_Student\\source\\repos\\slarny4\\", "WorkspaceRootPath": "C:\\Users\\\u041D\u0430\u0438\u043B\u044C\\source\\repos\\slarny4\\",
"Documents": [], "Documents": [],
"DocumentGroupContainers": [ "DocumentGroupContainers": [
{ {
"Orientation": 0, "Orientation": 0,
"VerticalTabListWidth": 256, "VerticalTabListWidth": 256,
"DocumentGroups": [] "DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": -1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
}
]
}
]
} }
] ]
} }

View File

@ -0,0 +1,75 @@
using Microsoft.AspNetCore.Mvc;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Domain.UseCase;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AdminController : ControllerBase
{
private readonly UserUseCase _userUseCase;
private readonly GroupUseCase _groupUseCase;
private readonly UseCasePresence _presenceUseCase;
public AdminController(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCasePresence presenceUseCase)
{
_userUseCase = userUseCase;
_groupUseCase = groupUseCase;
_presenceUseCase = presenceUseCase;
}
[HttpPost("addUser")]
public IActionResult AddUser([FromBody] User user)
{
_userUseCase.UpdateUser(user);
return Ok();
}
[HttpPut("updateUser")]
public IActionResult UpdateUser([FromBody] User user)
{
_userUseCase.UpdateUser(user);
return Ok();
}
[HttpDelete("deleteUser/{id}")]
public IActionResult DeleteUser(Guid id)
{
_userUseCase.DeleteUser(id);
return Ok();
}
[HttpGet("getUser/{id}")]
public IActionResult GetUser(Guid id)
{
var user = _userUseCase.GetUserById(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
[HttpGet("getAllUsers")]
public IActionResult GetAllUsers()
{
var users = _userUseCase.GetAllUsers();
return Ok(users);
}
[HttpGet("getPresenceByUser/{userId}")]
public IActionResult GetPresenceByUser(Guid userId)
{
var presence = _presenceUseCase.GetPresenceByGroup(userId);
if (presence == null)
{
return NotFound();
}
return Ok(presence);
}
}
}

View File

@ -0,0 +1,59 @@
using Microsoft.AspNetCore.Mvc;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Domain.UseCase;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class PresenceController : ControllerBase
{
private readonly UseCasePresence _presenceUseCase;
public PresenceController(UseCasePresence presenceUseCase)
{
_presenceUseCase = presenceUseCase;
}
[HttpGet("getPresenceByGroup")]
public IActionResult GetPresenceByGroup([FromQuery] int groupId)
{
var presence = _presenceUseCase.GetPresenceByGroup(groupId);
return Ok(presence);
}
[HttpPost("addPresence")]
public IActionResult AddPresence([FromBody] Demo.Data.RemoteData.RemoteDataBase.DAO.Presence daoPresence)
{
var domainPresence = new Demo.Domain.Models.Presence
{
Id = daoPresence.Id,
Date = daoPresence.Date,
LessonNumber = daoPresence.LessonNumber,
IsAttendance = daoPresence.IsAttendance,
UserId = daoPresence.UserId
};
_presenceUseCase.PresenceRepository.AddPresence(domainPresence);
return Ok();
}
[HttpPut("markUserAsAbsent")]
public IActionResult MarkUserAsAbsent([FromQuery] Guid userId, [FromQuery] int lessonNumber, [FromQuery] DateTime date)
{
_presenceUseCase.MarkUserAsAbsent(userId, lessonNumber, date);
return Ok();
}
[HttpDelete("deletePresence")]
public IActionResult DeletePresence([FromQuery] Guid id)
{
_presenceUseCase.PresenceRepository.DeletePresence(id);
return Ok();
}
}
}

View File

@ -1,13 +1,9 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Exceptions\GroupNotFoundException.cs using System;
using System;
namespace Demo.Data.Exceptions namespace Demo.Data.Exceptions
{ {
public class GroupNotFoundException : Exception public class GroupNotFoundException : Exception
{ {
public GroupNotFoundException(int groupId) public GroupNotFoundException(string message) : base(message) { }
: base($"Group with ID {groupId} was not found.")
{
}
} }
} }

View File

@ -0,0 +1,9 @@
using System;
namespace Demo.Data.Exceptions
{
public class PresenceNotFoundException : Exception
{
public PresenceNotFoundException(string message) : base(message) { }
}
}

View File

@ -1,13 +1,9 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Exceptions\RepositoryException.cs using System;
using System;
namespace Demo.Data.Exceptions namespace Demo.Data.Exceptions
{ {
public class RepositoryException : Exception public class RepositoryException : Exception
{ {
public RepositoryException(string message) public RepositoryException(string message) : base(message) { }
: base(message)
{
}
} }
} }

View File

@ -1,13 +1,9 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Exceptions\UserNotFoundException.cs using System;
using System;
namespace Demo.Data.Exceptions namespace Demo.Data.Exceptions
{ {
public class UserNotFoundException : Exception public class UserNotFoundException : Exception
{ {
public UserNotFoundException(Guid userId) public UserNotFoundException(string message) : base(message) { }
: base($"User with ID {userId} was not found.")
{
}
} }
} }

View File

@ -1,9 +1,8 @@
// Group.cs в LocalData/Entity namespace Demo.Data.LocalData.Entity
namespace Demo.Data.LocalData.Entity
{ {
public class Group public class Group
{ {
public int Id { get; set; } public int Id { get; set; }
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; // Инициализация по умолчанию
} }
} }

View File

@ -1,13 +0,0 @@
// C:\Users\class_Student\source\repos\slarny4\Demo1\Data\LocalData\Entity\Presence.cs
using System;
namespace Demo.Data.LocalData.Entity
{
public class LocalPresence
{
public Guid UserId { get; set; }
public DateTime ClassDate { get; set; }
public int LessonNumber { get; set; } // Вместо ClassNumber
public bool WasPresent { get; set; } // Вместо IsPresent
}
}

View File

@ -0,0 +1,11 @@
namespace Demo.Data.LocalData.Entity
{
public class Presence
{
public Guid Id { get; set; } // Убедитесь, что тип Guid
public DateTime Date { get; set; }
public int LessonNumber { get; set; }
public bool IsAttendance { get; set; }
public Guid UserId { get; set; }
}
}

View File

@ -1,12 +1,9 @@
// User.cs в LocalData/Entity namespace Demo.Data.LocalData.Entity
using System;
namespace Demo.Data.LocalData.Entity
{ {
public class User public class User
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string FIO { get; set; } = string.Empty; public string FIO { get; set; } = string.Empty; // Инициализация по умолчанию
public int GroupID { get; set; } public int GroupID { get; set; }
} }
} }

View File

@ -1,29 +1,22 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\LocalData\LocalStaticData.cs namespace Demo.Data.LocalData
using System;
using System.Collections.Generic;
using Demo.Data.LocalData.Entity;
namespace Demo.Data.LocalData
{ {
public static class LocalStaticData public static class LocalStaticData
{ {
public static List<User> Users = new List<User> public static List<Entity.User> Users = new List<Entity.User>
{ {
new User { Id = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "Иванов Иван Иванович", GroupID = 1 }, new Entity.User { Id = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "Иванов Иван Иванович", GroupID = 1 },
new User { Id = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "Петров Петр Петрович", GroupID = 2 }, new Entity.User { Id = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "Петров Петр Петрович", GroupID = 2 },
new User { Id = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "Мендалиев Наиль", GroupID = 3 }, new Entity.User { Id = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "Мендалиев Наиль", GroupID = 3 },
new User { Id = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "Сидоров Сидор Сидорович", GroupID = 1 }, new Entity.User { Id = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "Сидоров Сидор Сидорович", GroupID = 1 },
new User { Id = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "Кузнецов Алексей Викторович", GroupID = 2 }, new Entity.User { Id = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "Кузнецов Алексей Викторович", GroupID = 2 },
new User { Id = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "Смирнова Анна Сергеевна", GroupID = 3 } new Entity.User { Id = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "Смирнова Анна Сергеевна", GroupID = 3 }
}; };
public static List<Group> Groups = new List<Group> public static List<Entity.Group> Groups = new List<Entity.Group>
{ {
new Group { Id = 1, Name = "ИП1-23" }, new Entity.Group { Id = 1, Name = "ИП1-23" },
new Group { Id = 2, Name = "ИП1-22" }, new Entity.Group { Id = 2, Name = "ИП1-22" },
new Group { Id = 3, Name = "С1-23" } new Entity.Group { Id = 3, Name = "С1-23" }
}; };
public static List<LocalPresence> Presences = new List<LocalPresence>();
} }
} }

View File

@ -0,0 +1,10 @@
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{
public class AttendanceRecord
{
public DateTime Date { get; set; }
public int LessonNumber { get; set; }
public bool IsAttendance { get; set; }
public Guid UserId { get; set; }
}
}

View File

@ -1,10 +1,8 @@
// Group.cs в RemoteData/RemoteDataBase/DAO namespace Demo.Data.RemoteData.RemoteDataBase.DAO
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{ {
public class GroupDAO public class Group
{ {
public int Id { get; set; } public int Id { get; set; } // Убедитесь, что тип int
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; // Инициализация по умолчанию
public UserDAO User { get; set; }
} }
} }

View File

@ -0,0 +1,10 @@
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{
public class GroupAttendanceStatistics
{
public int GroupId { get; set; }
public int TotalLessons { get; set; }
public int TotalAttendance { get; set; }
public double AttendancePercentage { get; set; }
}
}

View File

@ -1,15 +1,11 @@
using System; namespace Demo.Data.RemoteData.RemoteDataBase.DAO
using System.ComponentModel.DataAnnotations;
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{ {
public class PresenceDAO public class Presence
{ {
public Guid Id { get; set; } // Убедитесь, что тип Guid
public int PresenceId { get; set; } // Уникальный идентификатор записи public DateTime Date { get; set; }
public DateTime ClassDate { get; set; } // Дата занятия
public int LessonNumber { get; set; } public int LessonNumber { get; set; }
public bool WasPresent { get; set; } public bool IsAttendance { get; set; }
public Guid UserId { get; set; } public Guid UserId { get; set; }
} }
} }

View File

@ -1,12 +1,9 @@
using System; namespace Demo.Data.RemoteData.RemoteDataBase.DAO
using System.ComponentModel.DataAnnotations;
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{ {
public class UserDAO public class User
{ {
public Guid UserId { get; set; } // Измените имя на UserId public Guid Id { get; set; }
public string FIO { get; set; } = string.Empty; public string FIO { get; set; } = string.Empty; // Инициализация по умолчанию
public int GroupID { get; set; } public int GroupID { get; set; }
} }
} }

View File

@ -0,0 +1,10 @@
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{
public class UserAttendance
{
public Guid UserId { get; set; }
public int TotalLessons { get; set; }
public int TotalAttendance { get; set; }
public double AttendancePercentage { get; set; }
}
}

View File

@ -1,12 +0,0 @@
using Microsoft.EntityFrameworkCore;
namespace Demo.Data.RemoteData.RemoteDataBase
{
public class DesignTimeDbContextFactory : DesignTimeDbContextFactoryBase<RemoteDatabaseContext>
{
protected override RemoteDatabaseContext CreateNewInstance(DbContextOptions<RemoteDatabaseContext> options)
{
return new RemoteDatabaseContext(options);
}
}
}

View File

@ -1,18 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace Demo.Data.RemoteData.RemoteDataBase
{
public abstract class DesignTimeDbContextFactoryBase<TContext> : IDesignTimeDbContextFactory<TContext> where TContext : DbContext
{
public TContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<TContext>();
builder.UseNpgsql("Host=45.67.56.214;Port=5421;Database=user5;Username=user5;Password=EtEJqhsf");
return CreateNewInstance(builder.Options);
}
protected abstract TContext CreateNewInstance(DbContextOptions<TContext> options);
}
}

View File

@ -1,8 +1,22 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\RemoteData\RemoteDataBase\RemoteDatabase.cs using Microsoft.EntityFrameworkCore;
namespace Demo.Data.RemoteData.RemoteDataBase namespace Demo.Data.RemoteData.RemoteDataBase
{ {
public class RemoteDatabase public class RemoteDatabase : DbContext
{ {
// Логика подключения к удаленной базе данных public DbSet<DAO.User> Users { get; set; }
public DbSet<DAO.Group> Groups { get; set; }
public DbSet<DAO.Presence> Presence { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Username=user5;Database=user5;Password=EtEJqhsf");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<DAO.Presence>()
.HasKey(p => p.Id); // Указание первичного ключа
}
} }
} }

View File

@ -1,44 +1,26 @@
using Demo.Data.LocalData.Entity; // Локальные сущности using Microsoft.EntityFrameworkCore;
using Demo.Data.RemoteData.RemoteDataBase.DAO; // DAO классы using Demo.Data.RemoteData.RemoteDataBase.DAO; // Используйте правильное пространство имен
using Microsoft.EntityFrameworkCore;
namespace Demo.Data.RemoteData.RemoteDataBase
{
public class RemoteDatabaseContext : DbContext public class RemoteDatabaseContext : DbContext
{ {
public DbSet<User> User { get; set; } public DbSet<User> Users { get; set; }
public DbSet<GroupDAO> Group { get; set; } // DbSet для GroupDao public DbSet<Group> Groups { get; set; }
public DbSet<PresenceDAO> Presence { get; set; } // DbSet для PresenceDao public DbSet<Presence> Presence { get; set; }
public RemoteDatabaseContext(DbContextOptions<RemoteDatabaseContext> options) : base(options) { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ {
if (!optionsBuilder.IsConfigured) optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Username=user5;Database=user5;Password=EtEJqhsf");
{
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Database=;Username=user5;Password=EtEJqhsf");
}
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<GroupDAO>().HasKey(group => group.Id); modelBuilder.Entity<Presence>()
modelBuilder.Entity<GroupDAO>().Property(group => group.Id).ValueGeneratedOnAdd(); .HasKey(p => p.Id); // Указание первичного ключа
modelBuilder.Entity<UserDAO>().HasKey(user => user.UserId); modelBuilder.Entity<Group>()
modelBuilder.Entity<UserDAO>().Property(user => user.UserId).ValueGeneratedOnAdd(); .HasKey(g => g.Id); // Указание первичного ключа
}
modelBuilder.Entity<PresenceDAO>().HasKey(presence => presence.PresenceId); // Устанавливаем первичный ключ
// Дополнительные настройки для User
modelBuilder.Entity<User>(entity =>
{
entity.ToTable("User"); // Имя таблицы
entity.HasKey(e => e.Id); // Указываем первичный ключ
entity.Property(e => e.FIO)
.IsRequired()
.HasColumnName("FIO");
entity.Property(e => e.GroupID)
.IsRequired()
.HasColumnName("GroupID");
});
} }
} }

View File

@ -1,52 +0,0 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Repository\GroupRepositoryImpl.cs
using System.Collections.Generic;
using System.Linq;
using Demo.Data.Exceptions;
using Demo.Data.LocalData;
using Demo.Data.LocalData.Entity;
using Demo.Data.RemoteData.RemoteDataBase;
namespace Demo.Data.Repository
{
public class GroupRepositoryImpl : IGroupRepository
{
private RemoteDatabaseContext context;
public GroupRepositoryImpl(RemoteDatabaseContext context)
{
this.context = context;
}
public void AddGroup(Group group)
{
if (LocalStaticData.Groups.Any(g => g.Id == group.Id))
throw new RepositoryException("Group with the same ID already exists.");
LocalStaticData.Groups.Add(group);
}
public void DeleteGroup(int id)
{
var group = GetGroupById(id);
LocalStaticData.Groups.Remove(group);
}
public IEnumerable<Group> GetAllGroups()
{
return LocalStaticData.Groups;
}
public Group GetGroupById(int id)
{
var group = LocalStaticData.Groups.FirstOrDefault(g => g.Id == id);
if (group == null)
throw new GroupNotFoundException(id);
return group;
}
public void UpdateGroup(Group group)
{
var existingGroup = GetGroupById(group.Id);
existingGroup.Name = group.Name;
}
}
}

View File

@ -1,15 +1,13 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Repository\IGroupRepository.cs using Demo.Data.RemoteData.RemoteDataBase.DAO;
using System.Collections.Generic; using System.Collections.Generic;
using Demo.Data.LocalData.Entity;
namespace Demo.Data.Repository namespace Demo.Data.Repository
{ {
public interface IGroupRepository public interface IGroupRepository
{ {
IEnumerable<Group> GetAllGroups(); IEnumerable<Group> GetAllGroups();
Group GetGroupById(int id);
void AddGroup(Group group); void AddGroup(Group group);
void UpdateGroup(Group group); void UpdateGroupName(int id, string name);
void DeleteGroup(int id); void DeleteGroup(int id);
} }
} }

View File

@ -1,20 +1,17 @@
// IPresenceRepository.cs using Demo.Domain.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using AttendanceApp.Domain.Models;
using Demo.Data.LocalData.Entity;
namespace Demo.Data.Repository namespace Demo.Data.Repository
{ {
public interface IPresenceRepository public interface IPresenceRepository
{ {
IEnumerable<LocalPresence> GetPresencesByGroupAndDate(int groupId, DateTime date); void AddPresence(Presence presence);
void AddPresence(LocalPresence presence); IEnumerable<Presence> GetPresenceByGroup(int groupId);
void UpdatePresence(LocalPresence presence); IEnumerable<Presence> GetPresenceByGroupAndDate(int groupId, DateTime date);
IEnumerable<LocalPresence> GetAllPresences(); void MarkUserAsAbsent(Guid userId, int lessonNumber, DateTime date);
IEnumerable<LocalPresence> GetPresenceByGroup(int groupId); IEnumerable<Presence> GetAllPresence();
void DeletePresence(Guid id);
void UpdatePresence(Presence presence); void UpdatePresence(Presence presence);
// Удалите этот метод, так как он дублирует GetPresencesByGroupAndDate
// IEnumerable<object> GetPresenceByGroupAndDate(int groupId, DateTime date);
} }
} }

View File

@ -1,6 +1,6 @@
using System; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using Demo.Domain.Models;
namespace Demo.Data.Repository namespace Demo.Data.Repository
{ {
@ -8,8 +8,8 @@ namespace Demo.Data.Repository
{ {
IEnumerable<User> GetAllUsers(); IEnumerable<User> GetAllUsers();
User GetUserById(Guid id); User GetUserById(Guid id);
void AddUser(User user);
void UpdateUser(User user); void UpdateUser(User user);
void DeleteUser(Guid id); void DeleteUser(Guid id);
void AddUser(User user);
} }
} }

View File

@ -1,70 +0,0 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Data\Repository\PresenceRepositoryImpl.cs
using System;
using System.Collections.Generic;
using System.Linq;
using AttendanceApp.Domain.Models;
using Demo.Data.LocalData;
using Demo.Data.LocalData.Entity;
using Demo.Data.RemoteData.RemoteDataBase;
namespace Demo.Data.Repository
{
public class PresenceRepositoryImpl : IPresenceRepository
{
private RemoteDatabaseContext context;
public PresenceRepositoryImpl(RemoteDatabaseContext context)
{
this.context = context;
}
public void AddPresence(LocalPresence presence)
{
LocalStaticData.Presences.Add(presence);
}
public IEnumerable<LocalPresence> GetAllPresences()
{
return LocalStaticData.Presences;
}
public IEnumerable<object> GetPresenceByGroup(int groupId)
{
throw new NotImplementedException();
}
public IEnumerable<object> GetPresenceByGroupAndDate(int groupId, DateTime date)
{
throw new NotImplementedException();
}
public IEnumerable<LocalPresence> GetPresencesByGroupAndDate(int groupId, DateTime date)
{
var usersInGroup = LocalStaticData.Users.Where(u => u.GroupID == groupId).Select(u => u.Id).ToList();
return LocalStaticData.Presences.Where(p => usersInGroup.Contains(p.UserId) && p.ClassDate.Date == date.Date);
}
public void UpdatePresence(LocalPresence presence)
{
var existingPresence = LocalStaticData.Presences.FirstOrDefault(p =>
p.UserId == presence.UserId &&
p.ClassDate.Date == presence.ClassDate.Date &&
p.LessonNumber == presence.LessonNumber);
if (existingPresence != null)
{
existingPresence.WasPresent = presence.WasPresent;
}
}
public void UpdatePresence(Presence presence)
{
throw new NotImplementedException();
}
IEnumerable<LocalPresence> IPresenceRepository.GetPresenceByGroup(int groupId)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,12 +1,48 @@
using System; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo1.Data.Repository namespace Demo.Data.Repository
{ {
internal class SQLGroupRepositoryImpl public class SQLGroupRepositoryImpl : IGroupRepository
{ {
private readonly DbContext _context;
public SQLGroupRepositoryImpl(DbContext context)
{
_context = context;
}
public IEnumerable<Group> GetAllGroups()
{
return _context.Set<Group>().ToList();
}
public void AddGroup(Group group)
{
_context.Set<Group>().Add(group);
_context.SaveChanges();
}
public void UpdateGroupName(int id, string name)
{
var group = _context.Set<Group>().Find(id);
if (group != null)
{
group.Name = name;
_context.SaveChanges();
}
}
public void DeleteGroup(int id)
{
var group = _context.Set<Group>().Find(id);
if (group != null)
{
_context.Set<Group>().Remove(group);
_context.SaveChanges();
}
}
} }
} }

View File

@ -1,12 +1,120 @@
using System; using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Domain.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo1.Data.Repository namespace Demo.Data.Repository
{ {
internal class SQLPresenceRepository public class SQLPresenceRepository : IPresenceRepository
{ {
private readonly DbContext _context;
public SQLPresenceRepository(DbContext context)
{
_context = context;
}
public void AddPresence(Presence presence)
{
presence.Date = DateTime.SpecifyKind(presence.Date, DateTimeKind.Utc);
_context.Set<RemoteData.RemoteDataBase.DAO.Presence>().Add(new RemoteData.RemoteDataBase.DAO.Presence
{
Id = presence.Id,
Date = presence.Date,
LessonNumber = presence.LessonNumber,
IsAttendance = presence.IsAttendance,
UserId = presence.UserId
});
_context.SaveChanges();
}
public void AddPresence(RemoteData.RemoteDataBase.DAO.Presence presence)
{
presence.Date = DateTime.SpecifyKind(presence.Date, DateTimeKind.Utc);
_context.Set<RemoteData.RemoteDataBase.DAO.Presence>().Add(presence);
_context.SaveChanges();
}
public IEnumerable<Presence> GetPresenceByGroup(int groupId)
{
return _context.Set<RemoteData.RemoteDataBase.DAO.Presence>()
.Where(p => _context.Set<RemoteData.RemoteDataBase.DAO.User>().Any(u => u.Id == p.UserId && u.GroupID == groupId))
.Select(p => new Presence
{
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttendance = p.IsAttendance,
UserId = p.UserId
})
.ToList();
}
public IEnumerable<Presence> GetPresenceByGroupAndDate(int groupId, DateTime date)
{
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
return _context.Set<RemoteData.RemoteDataBase.DAO.Presence>()
.Where(p => _context.Set<RemoteData.RemoteDataBase.DAO.User>().Any(u => u.Id == p.UserId && u.GroupID == groupId) && p.Date == date)
.Select(p => new Presence
{
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttendance = p.IsAttendance,
UserId = p.UserId
})
.ToList();
}
public void MarkUserAsAbsent(Guid userId, int lessonNumber, DateTime date)
{
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
var presence = _context.Set<RemoteData.RemoteDataBase.DAO.Presence>()
.FirstOrDefault(p => p.UserId == userId && p.LessonNumber == lessonNumber && p.Date == date);
if (presence != null)
{
presence.IsAttendance = false;
_context.SaveChanges();
}
}
public IEnumerable<Presence> GetAllPresence()
{
return _context.Set<RemoteData.RemoteDataBase.DAO.Presence>()
.Select(p => new Presence
{
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttendance = p.IsAttendance,
UserId = p.UserId
})
.ToList();
}
public void DeletePresence(Guid id)
{
var presence = _context.Set<RemoteData.RemoteDataBase.DAO.Presence>().Find(id);
if (presence != null)
{
_context.Set<RemoteData.RemoteDataBase.DAO.Presence>().Remove(presence);
_context.SaveChanges();
}
}
public void UpdatePresence(Presence presence)
{
var existingPresence = _context.Set<RemoteData.RemoteDataBase.DAO.Presence>().Find(presence.Id);
if (existingPresence != null)
{
existingPresence.Date = presence.Date;
existingPresence.LessonNumber = presence.LessonNumber;
existingPresence.IsAttendance = presence.IsAttendance;
existingPresence.UserId = presence.UserId;
_context.SaveChanges();
}
}
} }
} }

View File

@ -1,86 +1,50 @@
using System; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Demo.Data.RemoteData.RemoteDataBase.DAO; // DAO User
using UserDomain = Demo.Domain.Models.User; // Доменная модель
using UserEntity = Demo.Data.LocalData.Entity.User; // Локальная сущность
namespace Demo.Data.Repository namespace Demo.Data.Repository
{ {
public class SQLUserRepositoryImpl : IUserRepository public class SQLUserRepositoryImpl : IUserRepository
{ {
private readonly RemoteDatabaseContext _context; private readonly DbContext _context;
public SQLUserRepositoryImpl(RemoteDatabaseContext context) public SQLUserRepositoryImpl(DbContext context)
{ {
_context = context; _context = context;
} }
public void AddUser(UserDomain user) public IEnumerable<User> GetAllUsers()
{ {
var daoUser = new UserEntity // Используем локальную сущность return _context.Set<User>().ToList();
}
public User GetUserById(Guid id)
{ {
Id = user.Id, return _context.Set<User>().Find(id);
FIO = user.FIO, }
GroupID = user.GroupID
}; public void UpdateUser(User user)
_context.User.Add(daoUser); {
_context.Set<User>().Update(user);
_context.SaveChanges(); _context.SaveChanges();
} }
public IEnumerable<UserDomain> GetAllUser()
{
return _context.User.Select(u => new UserDomain
{
Id = u.Id,
FIO = u.FIO,
GroupID = u.GroupID
}).ToList();
}
public UserDomain GetUserById(Guid id)
{
var daoUser = _context.User.Find(id);
if (daoUser == null) return null;
return new UserDomain
{
Id = daoUser.Id,
FIO = daoUser.FIO,
GroupID = daoUser.GroupID
};
}
public void UpdateUser(UserDomain user)
{
var daoUser = _context.User.Find(user.Id);
if (daoUser != null)
{
daoUser.FIO = user.FIO;
daoUser.GroupID = user.GroupID;
_context.SaveChanges();
}
}
public void DeleteUser(Guid id) public void DeleteUser(Guid id)
{ {
var daoUser = _context.User.Find(id); var user = _context.Set<User>().Find(id);
if (daoUser != null) if (user != null)
{ {
_context.User.Remove(daoUser); _context.Set<User>().Remove(user);
_context.SaveChanges(); _context.SaveChanges();
} }
} }
// Реализуем метод GetAllUsers public void AddUser(User user)
public IEnumerable<UserDomain> GetAllUsers()
{ {
return _context.User.Select(u => new UserDomain _context.Set<User>().Add(user);
{ _context.SaveChanges();
Id = u.Id,
FIO = u.FIO,
GroupID = u.GroupID
}).ToList();
} }
} }
} }

View File

@ -1,65 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Demo.Domain.Models;
using Demo.Data.LocalData;
namespace Demo.Data.Repository
{
public class UserRepositoryImpl : IUserRepository
{
public IEnumerable<User> GetAllUsers()
{
return LocalStaticData.Users.Select(u => new User
{
Id = u.Id,
FIO = u.FIO,
GroupID = u.GroupID
});
}
public User GetUserById(Guid id)
{
var localUser = LocalStaticData.Users.FirstOrDefault(u => u.Id == id);
if (localUser == null)
throw new Exception("User not found");
return new User
{
Id = localUser.Id,
FIO = localUser.FIO,
GroupID = localUser.GroupID
};
}
public void AddUser(User user)
{
var localUser = new LocalData.Entity.User
{
Id = user.Id,
FIO = user.FIO,
GroupID = user.GroupID
};
LocalStaticData.Users.Add(localUser);
}
public void UpdateUser(User user)
{
var localUser = LocalStaticData.Users.FirstOrDefault(u => u.Id == user.Id);
if (localUser == null)
throw new Exception("User not found");
localUser.FIO = user.FIO;
localUser.GroupID = user.GroupID;
}
public void DeleteUser(Guid id)
{
var user = LocalStaticData.Users.FirstOrDefault(u => u.Id == id);
if (user != null)
{
LocalStaticData.Users.Remove(user);
}
}
}
}

View File

@ -1,5 +0,0 @@
{
"ConnectionStrings": {
"DefaultConnection": "Host=45.67.56.214;Port=5421;Database=user5;Username=user5;Password=EtEJqhsf"
}
}

36
Demo1/DataInitializer.cs Normal file
View File

@ -0,0 +1,36 @@
using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Microsoft.EntityFrameworkCore;
namespace Demo
{
public class DataInitializer
{
public static void Initialize(RemoteDatabaseContext context)
{
context.Database.EnsureCreated();
if (context.Groups.Any() || context.Users.Any())
{
return; // База данных уже содержит данные
}
context.Users.AddRange(
new User { Id = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "Иванов Иван Иванович", GroupID = 1 },
new User { Id = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "Петров Петр Петрович", GroupID = 2 },
new User { Id = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "Мендалиев Наиль", GroupID = 3 },
new User { Id = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "Сидоров Сидор Сидорович", GroupID = 1 },
new User { Id = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "Кузнецов Алексей Викторович", GroupID = 2 },
new User { Id = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "Смирнова Анна Сергеевна", GroupID = 3 }
);
context.Groups.AddRange(
new Group { Id = 1, Name = "ИП1-23" },
new Group { Id = 2, Name = "ИП1-22" },
new Group { Id = 3, Name = "С1-23" }
);
context.SaveChanges();
}
}
}

View File

@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ClosedXML" Version="0.104.2" />
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Data\RemoteData\RemoteApi\" />
<Folder Include="Excel\" />
</ItemGroup>
</Project>

View File

@ -8,24 +8,52 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Remove="Dockerfile.dockerignore" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ClosedXML" Version="0.104.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.10" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Abstractions" Version="8.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.6.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.6.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Data\RemoteData\RemoteApi\" /> <Folder Include="Data\RemoteData\RemoteApi\" />
<Folder Include="Migrations\" /> <Folder Include="Excel\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,5 +1,8 @@
public class Group namespace Demo.Domain.Models
{
public class Group
{ {
public int Id { get; set; } public int Id { get; set; }
public string Name { get; set; } = string.Empty; // Добавляем значение по умолчанию public string Name { get; set; } = string.Empty; // Инициализация по умолчанию
}
} }

View File

@ -1,14 +1,13 @@
using System; using System;
namespace AttendanceApp.Domain.Models namespace Demo.Domain.Models
{ {
public class Presence public class Presence
{ {
public DateTime ClassDate { get; set; } public Guid Id { get; set; } // Убедитесь, что тип Guid
public int ClassNumber { get; set; } public DateTime Date { get; set; }
public bool IsPresent { get; set; } public int LessonNumber { get; set; }
public bool IsAttendance { get; set; }
public Guid UserId { get; set; } public Guid UserId { get; set; }
public bool WasPresent { get; internal set; }
public int LessonNumber { get; internal set; }
} }
} }

View File

@ -1,11 +1,9 @@
using System; namespace Demo.Domain.Models
namespace Demo.Domain.Models
{ {
public class User public class User
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string FIO { get; set; } = string.Empty; public string FIO { get; set; } = string.Empty; // Инициализация по умолчанию
public int GroupID { get; set; } public int GroupID { get; set; }
} }
} }

View File

@ -1,8 +1,6 @@
// C:\Users\class_Student\source\repos\slarny4\Demo1\Domain\UseCase\GroupUseCase.cs using Demo.Data.Repository;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Demo.Data.LocalData.Entity;
using Demo.Data.Repository;
namespace Demo.Domain.UseCase namespace Demo.Domain.UseCase
{ {
@ -20,26 +18,19 @@ namespace Demo.Domain.UseCase
return _groupRepository.GetAllGroups(); return _groupRepository.GetAllGroups();
} }
public Group GetGroupById(int id)
{
return _groupRepository.GetGroupById(id);
}
public void AddGroup(Group group) public void AddGroup(Group group)
{ {
_groupRepository.AddGroup(group); _groupRepository.AddGroup(group);
} }
public void UpdateGroup(Group group) public void UpdateGroupName(int id, string name)
{ {
_groupRepository.UpdateGroup(group); _groupRepository.UpdateGroupName(id, name);
} }
public void DeleteGroup(int id) public void DeleteGroup(int id)
{ {
_groupRepository.DeleteGroup(id); _groupRepository.DeleteGroup(id);
} }
// Дополнительные методы, если нужны
} }
} }

View File

@ -1,45 +0,0 @@
// C:\Users\class_Student\source\repos\slarny4\Demo1\Domain\UseCase\PresenceUseCase.cs
using System;
using System.Collections.Generic;
using Demo.Data.LocalData.Entity;
using Demo.Data.Repository;
namespace Demo.Domain.UseCase
{
public class PresenceUseCase
{
private readonly IPresenceRepository _presenceRepository;
private readonly IGroupRepository _groupRepository;
private readonly IUserRepository _userRepository;
public PresenceUseCase(IPresenceRepository presenceRepository, IGroupRepository groupRepository, IUserRepository userRepository)
{
_presenceRepository = presenceRepository;
_groupRepository = groupRepository;
_userRepository = userRepository;
}
public IEnumerable<LocalPresence> GetPresencesByGroupAndDate(int groupId, DateTime date)
{
return _presenceRepository.GetPresencesByGroupAndDate(groupId, date);
}
public void MarkUserAbsent(Guid userId, int lessonNumber, DateTime date)
{
var presence = _presenceRepository.GetAllPresences();
foreach (var p in presence)
{
if (p.UserId == userId && p.ClassDate.Date == date.Date && p.LessonNumber == lessonNumber)
{
p.WasPresent = false;
_presenceRepository.UpdatePresence(p);
}
}
}
public IEnumerable<LocalPresence> GetAllPresences()
{
return _presenceRepository.GetAllPresences();
}
}
}

View File

@ -1,9 +1,8 @@
// C:\Users\adm\Source\Repos\presence1\Demo\Domain\UseCase\UseCaseGeneratePresence.cs using Demo.Data.Repository;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Domain.Models;
using System; using System;
using System.Linq; using System.Linq;
using Demo.Data.LocalData;
using Demo.Data.LocalData.Entity;
using Demo.Data.Repository;
namespace Demo.Domain.UseCase namespace Demo.Domain.UseCase
{ {
@ -14,46 +13,47 @@ namespace Demo.Domain.UseCase
public UseCaseGeneratePresence(IPresenceRepository presenceRepository, IUserRepository userRepository) public UseCaseGeneratePresence(IPresenceRepository presenceRepository, IUserRepository userRepository)
{ {
_presenceRepository = presenceRepository; _presenceRepository = presenceRepository ?? throw new ArgumentNullException(nameof(presenceRepository));
_userRepository = userRepository; _userRepository = userRepository ?? throw new ArgumentNullException(nameof(userRepository));
} }
public void GenerateDailyPresence(int groupId, int firstLesson, int lastLesson, DateTime date) public void GeneratePresenceForToday(int firstLesson, int lastLesson, int groupId, DateTime date)
{ {
var users = _userRepository.GetAllUsers().Where(u => u.GroupID == groupId).ToList(); date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
var users = _userRepository.GetAllUsers().Where(u => u.GroupID == groupId);
foreach (var user in users) foreach (var user in users)
{ {
for (int lesson = firstLesson; lesson <= lastLesson; lesson++) for (int lesson = firstLesson; lesson <= lastLesson; lesson++)
{ {
var existing = LocalStaticData.Presences.FirstOrDefault(p => var daoPresence = new Demo.Data.RemoteData.RemoteDataBase.DAO.Presence
p.UserId == user.Id &&
p.ClassDate.Date == date.Date &&
p.LessonNumber == lesson);
if (existing == null)
{ {
var presence = new LocalPresence Id = Guid.NewGuid(),
{ Date = date,
UserId = user.Id,
ClassDate = date.Date,
LessonNumber = lesson, LessonNumber = lesson,
WasPresent = true IsAttendance = true,
UserId = user.Id
}; };
_presenceRepository.AddPresence(presence);
} var domainPresence = new Demo.Domain.Models.Presence
{
Id = daoPresence.Id,
Date = daoPresence.Date,
LessonNumber = daoPresence.LessonNumber,
IsAttendance = daoPresence.IsAttendance,
UserId = daoPresence.UserId
};
_presenceRepository.AddPresence(domainPresence);
} }
} }
} }
public void GenerateWeeklyPresence(int groupId, int firstLesson, int lastLesson, DateTime startDate) public void GeneratePresenceForWeek(int firstLesson, int lastLesson, int groupId, DateTime startDate)
{ {
startDate = DateTime.SpecifyKind(startDate, DateTimeKind.Utc);
for (int i = 0; i < 7; i++) for (int i = 0; i < 7; i++)
{ {
var date = startDate.AddDays(i); GeneratePresenceForToday(firstLesson, lastLesson, groupId, startDate.AddDays(i));
if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
continue; // Пропускаем выходные
GenerateDailyPresence(groupId, firstLesson, lastLesson, date);
} }
} }
} }

View File

@ -0,0 +1,56 @@
using Demo.Data.Repository;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo.Domain.UseCase
{
public class UseCasePresence
{
private readonly IPresenceRepository _presenceRepository;
public UseCasePresence(IPresenceRepository presenceRepository)
{
_presenceRepository = presenceRepository;
}
public IPresenceRepository PresenceRepository => _presenceRepository;
public IEnumerable<Presence> GetPresenceByGroup(int groupId)
{
return _presenceRepository.GetPresenceByGroup(groupId)
.Select(p => new Presence
{
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttendance = p.IsAttendance,
UserId = p.UserId
});
}
public IEnumerable<Presence> GetPresenceByGroupAndDate(int groupId, DateTime date)
{
return _presenceRepository.GetPresenceByGroupAndDate(groupId, date)
.Select(p => new Presence
{
Id = p.Id,
Date = p.Date,
LessonNumber = p.LessonNumber,
IsAttendance = p.IsAttendance,
UserId = p.UserId
});
}
public void MarkUserAsAbsent(Guid userId, int lessonNumber, DateTime date)
{
_presenceRepository.MarkUserAsAbsent(userId, lessonNumber, date);
}
internal object GetPresenceByGroup(Guid userId)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,8 +1,7 @@
using System; using Demo.Data.Repository;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using Demo.Data.LocalData.Entity; // Убедитесь, что это пространство имен присутствует
using Demo.Data.Repository;
using Demo.Domain.Models;
namespace Demo.Domain.UseCase namespace Demo.Domain.UseCase
{ {
@ -15,30 +14,26 @@ namespace Demo.Domain.UseCase
_userRepository = userRepository; _userRepository = userRepository;
} }
public IEnumerable<Domain.Models.User> GetAllUsers() public IUserRepository UserRepository => _userRepository;
public IEnumerable<User> GetAllUsers()
{ {
return _userRepository.GetAllUsers(); return _userRepository.GetAllUsers();
} }
public void AddUser(Domain.Models.User user) public User GetUserById(Guid id)
{
_userRepository.AddUser(user);
}
// Пример исправления
public Domain.Models.User GetUserById(Guid id)
{ {
return _userRepository.GetUserById(id); return _userRepository.GetUserById(id);
} }
internal void DeleteUser(Guid userId) public void UpdateUser(User user)
{ {
throw new NotImplementedException(); _userRepository.UpdateUser(user);
} }
internal void UpdateUser(Models.User user) public void DeleteUser(Guid id)
{ {
throw new NotImplementedException(); _userRepository.DeleteUser(id);
} }
} }
} }

BIN
Demo1/Excel/GroupInfo.xlsx Normal file

Binary file not shown.

View File

@ -1,99 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Demo1.Migrations
{
/// <inheritdoc />
public partial class create : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Presence",
columns: table => new
{
PresenceId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ClassDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
LessonNumber = table.Column<int>(type: "integer", nullable: false),
WasPresent = table.Column<bool>(type: "boolean", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Presence", x => x.PresenceId);
});
migrationBuilder.CreateTable(
name: "User",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
FIO = table.Column<string>(type: "text", nullable: false),
GroupID = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_User", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserDAO",
columns: table => new
{
UserId = table.Column<Guid>(type: "uuid", nullable: false),
FIO = table.Column<string>(type: "text", nullable: false),
GroupID = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserDAO", x => x.UserId);
});
migrationBuilder.CreateTable(
name: "Group",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Group", x => x.Id);
table.ForeignKey(
name: "FK_Group_UserDAO_UserId",
column: x => x.UserId,
principalTable: "UserDAO",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Group_UserId",
table: "Group",
column: "UserId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Group");
migrationBuilder.DropTable(
name: "Presence");
migrationBuilder.DropTable(
name: "User");
migrationBuilder.DropTable(
name: "UserDAO");
}
}
}

View File

@ -1,5 +1,6 @@
// <auto-generated /> // <auto-generated />
using System; using System;
using Demo.Data.RemoteData.RemoteDataBase;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
@ -11,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Demo1.Migrations namespace Demo1.Migrations
{ {
[DbContext(typeof(RemoteDatabaseContext))] [DbContext(typeof(RemoteDatabaseContext))]
[Migration("20241114100437_create")] [Migration("20241123030700_InitialCreate")]
partial class create partial class InitialCreate
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -24,27 +25,7 @@ namespace Demo1.Migrations
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Demo.Data.LocalData.Entity.User", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.Group", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text")
.HasColumnName("FIO");
b.Property<int>("GroupID")
.HasColumnType("integer")
.HasColumnName("GroupID");
b.HasKey("Id");
b.ToTable("User", (string)null);
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDAO", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@ -56,44 +37,37 @@ namespace Demo1.Migrations
.IsRequired() .IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<Guid>("UserId")
.HasColumnType("uuid");
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("UserId"); b.ToTable("Groups");
b.ToTable("Group");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDAO", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.Presence", b =>
{ {
b.Property<int>("PresenceId") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer"); .HasColumnType("uuid");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId")); b.Property<DateTime>("Date")
b.Property<DateTime>("ClassDate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<bool>("IsAttendance")
.HasColumnType("boolean");
b.Property<int>("LessonNumber") b.Property<int>("LessonNumber")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnType("uuid"); .HasColumnType("uuid");
b.Property<bool>("WasPresent") b.HasKey("Id");
.HasColumnType("boolean");
b.HasKey("PresenceId");
b.ToTable("Presence"); b.ToTable("Presence");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDAO", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.User", b =>
{ {
b.Property<Guid>("UserId") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("uuid"); .HasColumnType("uuid");
@ -104,20 +78,9 @@ namespace Demo1.Migrations
b.Property<int>("GroupID") b.Property<int>("GroupID")
.HasColumnType("integer"); .HasColumnType("integer");
b.HasKey("UserId"); b.HasKey("Id");
b.ToTable("UserDAO"); b.ToTable("Users");
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDAO", b =>
{
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDAO", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -0,0 +1,70 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Demo1.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Groups",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Groups", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Presence",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
LessonNumber = table.Column<int>(type: "integer", nullable: false),
IsAttendance = table.Column<bool>(type: "boolean", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Presence", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
FIO = table.Column<string>(type: "text", nullable: false),
GroupID = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Groups");
migrationBuilder.DropTable(
name: "Presence");
migrationBuilder.DropTable(
name: "Users");
}
}
}

View File

@ -1,5 +1,6 @@
// <auto-generated /> // <auto-generated />
using System; using System;
using Demo.Data.RemoteData.RemoteDataBase;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
@ -21,27 +22,7 @@ namespace Demo1.Migrations
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Demo.Data.LocalData.Entity.User", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.Group", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text")
.HasColumnName("FIO");
b.Property<int>("GroupID")
.HasColumnType("integer")
.HasColumnName("GroupID");
b.HasKey("Id");
b.ToTable("User", (string)null);
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDAO", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@ -53,44 +34,37 @@ namespace Demo1.Migrations
.IsRequired() .IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<Guid>("UserId")
.HasColumnType("uuid");
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("UserId"); b.ToTable("Groups");
b.ToTable("Group");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDAO", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.Presence", b =>
{ {
b.Property<int>("PresenceId") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("integer"); .HasColumnType("uuid");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId")); b.Property<DateTime>("Date")
b.Property<DateTime>("ClassDate")
.HasColumnType("timestamp with time zone"); .HasColumnType("timestamp with time zone");
b.Property<bool>("IsAttendance")
.HasColumnType("boolean");
b.Property<int>("LessonNumber") b.Property<int>("LessonNumber")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnType("uuid"); .HasColumnType("uuid");
b.Property<bool>("WasPresent") b.HasKey("Id");
.HasColumnType("boolean");
b.HasKey("PresenceId");
b.ToTable("Presence"); b.ToTable("Presence");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDAO", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.User", b =>
{ {
b.Property<Guid>("UserId") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("uuid"); .HasColumnType("uuid");
@ -101,20 +75,9 @@ namespace Demo1.Migrations
b.Property<int>("GroupID") b.Property<int>("GroupID")
.HasColumnType("integer"); .HasColumnType("integer");
b.HasKey("UserId"); b.HasKey("Id");
b.ToTable("UserDAO"); b.ToTable("Users");
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDAO", b =>
{
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDAO", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -1,4 +1,13 @@
using Demo.UI; using Demo.UI;
using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.Repository;
using Demo.Domain.UseCase;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Collections.Generic;
using System.IO;
using Demo.Domain.Models;
namespace Demo namespace Demo
{ {
@ -6,8 +15,78 @@ namespace Demo
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
MainMenu menu = new MainMenu(); var builder = WebApplication.CreateBuilder(args);
menu.Show();
// Добавляем сервисы в контейнер
builder.Services.AddControllers();
builder.Services.AddScoped<IUserRepository, SQLUserRepositoryImpl>();
builder.Services.AddScoped<IGroupRepository, SQLGroupRepositoryImpl>();
builder.Services.AddScoped<IPresenceRepository, SQLPresenceRepository>();
builder.Services.AddScoped<UserUseCase>();
builder.Services.AddScoped<GroupUseCase>();
builder.Services.AddScoped<UseCasePresence>();
var app = builder.Build();
// Настройка конвейера обработки запросов
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
// Инициализация данных
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
var dbContext = new RemoteDatabaseContext();
DataInitializer.Initialize(dbContext);
}
// Запуск консольного меню
var context = new RemoteDatabaseContext();
var userRepository = new SQLUserRepositoryImpl(context);
var groupRepository = new SQLGroupRepositoryImpl(context);
var presenceRepository = new SQLPresenceRepository(context);
var userUseCase = new UserUseCase(userRepository);
var groupUseCase = new GroupUseCase(groupRepository);
var presenceUseCase = new UseCasePresence(presenceRepository);
var userConsole = new UserConsole(userUseCase);
var groupConsole = new GroupConsole(groupUseCase);
var presenceConsole = new PresenceConsole(presenceUseCase, userUseCase); // Передаем userUseCase
var excelExporter = new ExcelExporter();
// Создаем данные для экспорта
var group = new Group { Name = "Group 1" };
var users = new List<User> { new User { Id = Guid.NewGuid(), FIO = "User 1" } }; // Используем Guid для Id
var presence = new List<Presence> { new Presence { UserId = users[0].Id, IsAttendance = true } };
// Указываем путь для сохранения файла
string directoryPath = @"C:\Users\Наиль\Source\Repos\slarny4\Demo1\Excel";
string filePath = Path.Combine(directoryPath, "GroupInfo.xlsx");
// Проверяем, существует ли директория, и если нет, создаем её
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
// Вызываем метод для экспорта данных в Excel
excelExporter.ExportGroupInfoToExcel(group, users, presence, filePath);
var mainMenu = new MainMenu(userConsole, groupConsole, presenceConsole, excelExporter, groupUseCase, userUseCase, presenceUseCase);
mainMenu.ShowMenu();
// Запуск веб-сервера
app.Run();
} }
} }
} }

95
Demo1/UI/ExcelExporter.cs Normal file
View File

@ -0,0 +1,95 @@
using ClosedXML.Excel;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Demo.UI
{
public class ExcelExporter
{
public void ExportGroupInfoToExcel(Group group, List<User> users, List<Presence> presence, string filePath)
{
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Group Info");
worksheet.Cell(1, 1).Value = "Group Name";
worksheet.Cell(1, 2).Value = group.Name;
worksheet.Cell(3, 1).Value = "Student Name";
worksheet.Cell(3, 2).Value = "Attended Lessons";
worksheet.Cell(3, 3).Value = "Missed Lessons";
worksheet.Cell(3, 4).Value = "Attendance Percentage";
int row = 4;
foreach (var user in users)
{
var userPresence = presence.Where(p => p.UserId == user.Id).ToList();
int attended = userPresence.Count(p => p.IsAttendance);
int missed = userPresence.Count(p => !p.IsAttendance);
double percentage = (attended * 100.0) / (attended + missed);
worksheet.Cell(row, 1).Value = user.FIO;
worksheet.Cell(row, 2).Value = attended;
worksheet.Cell(row, 3).Value = missed;
worksheet.Cell(row, 4).Value = percentage;
if (percentage < 40)
{
worksheet.Row(row).Style.Fill.BackgroundColor = XLColor.Red;
}
row++;
}
workbook.SaveAs(filePath);
}
Console.WriteLine($"Отчёт экспортирован в Excel: {filePath}");
}
// Реализация метода для DAO моделей
internal void ExportGroupInfoToExcel(Data.RemoteData.RemoteDataBase.DAO.Group groupForExport, List<Data.RemoteData.RemoteDataBase.DAO.User> usersForExport, List<Presence> presenceForExport, string filePath)
{
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Group Info DAO");
worksheet.Cell(1, 1).Value = "Group Name";
worksheet.Cell(1, 2).Value = groupForExport.Name;
worksheet.Cell(3, 1).Value = "Student Name";
worksheet.Cell(3, 2).Value = "Attended Lessons";
worksheet.Cell(3, 3).Value = "Missed Lessons";
worksheet.Cell(3, 4).Value = "Attendance Percentage";
int row = 4;
foreach (var user in usersForExport)
{
var userPresence = presenceForExport.Where(p => p.UserId == user.Id).ToList();
int attended = userPresence.Count(p => p.IsAttendance);
int missed = userPresence.Count(p => !p.IsAttendance);
double percentage = (attended * 100.0) / (attended + missed);
worksheet.Cell(row, 1).Value = user.FIO;
worksheet.Cell(row, 2).Value = attended;
worksheet.Cell(row, 3).Value = missed;
worksheet.Cell(row, 4).Value = percentage;
if (percentage < 40)
{
worksheet.Row(row).Style.Fill.BackgroundColor = XLColor.Red;
}
row++;
}
workbook.SaveAs(filePath);
}
Console.WriteLine($"Отчёт экспортирован в Excel: {filePath}");
}
}
}

View File

@ -1,9 +1,8 @@
using System; using Demo.Data.RemoteData.RemoteDataBase.DAO; // Используйте правильное пространство имен
using Demo.Domain.UseCase; using Demo.Domain.UseCase;
using Demo.Data.Repository; using System;
using Demo.Data.LocalData.Entity;
using Demo.Data.Exceptions; namespace Demo.UI
namespace AttendanceApp.UI
{ {
public class GroupConsole public class GroupConsole
{ {
@ -14,141 +13,25 @@ namespace AttendanceApp.UI
_groupUseCase = groupUseCase; _groupUseCase = groupUseCase;
} }
public void ShowAllGroups() public void DisplayAllGroups()
{ {
Console.Clear();
Console.WriteLine("=== Список всех групп ===");
var groups = _groupUseCase.GetAllGroups(); var groups = _groupUseCase.GetAllGroups();
foreach (var group in groups) foreach (var group in groups)
{ {
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}"); Console.WriteLine($"ID: {group.Id}, Name: {group.Name}");
} }
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
} }
public void AddGroup() public void AddGroup(Group group)
{ {
Console.Clear(); _groupUseCase.AddGroup(group);
Console.WriteLine("=== Добавление новой группы ==="); Console.WriteLine("Group added.");
Console.Write("Введите название группы: ");
var groupName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(groupName))
{
var newGroup = new Group
{
Id = GenerateNewGroupId(),
Name = groupName
};
_groupUseCase.AddGroup(newGroup);
Console.WriteLine("Группа успешно добавлена.");
}
else
{
Console.WriteLine("Название группы не может быть пустым.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
} }
private int GenerateNewGroupId() public void UpdateGroupName(int id, string name)
{ {
var groups = _groupUseCase.GetAllGroups(); _groupUseCase.UpdateGroupName(id, name);
if (groups != null && groups.Any()) Console.WriteLine("Group name updated.");
{
return groups.Max(g => g.Id) + 1;
}
return 1;
}
public void UpdateGroup()
{
Console.Clear();
Console.WriteLine("=== Обновление группы ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"Текущее название группы: {group.Name}");
Console.Write("Введите новое название группы: ");
var newName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newName))
{
group.Name = newName;
_groupUseCase.UpdateGroup(group);
Console.WriteLine("Группа успешно обновлена.");
}
else
{
Console.WriteLine("Название группы не может быть пустым.");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void DeleteGroup()
{
Console.Clear();
Console.WriteLine("=== Удаление группы ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
_groupUseCase.DeleteGroup(groupId);
Console.WriteLine("Группа успешно удалена.");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void FindGroupById()
{
Console.Clear();
Console.WriteLine("=== Поиск группы по ID ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
} }
} }
} }

View File

@ -1,524 +1,358 @@
// C:\Users\class_Student\source\repos\slarny4\Demo1\UI\MainMenu.cs using System;
using System;
using System.Globalization;
using System.Linq; using System.Linq;
using Demo.Domain.Models;
using Demo.Domain.UseCase;
using Demo.Data.Repository; using Demo.Data.Repository;
using Demo.Data.LocalData.Entity; using Demo.Domain.UseCase;
using Demo.Data.RemoteData.RemoteDataBase; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Microsoft.EntityFrameworkCore; using System.IO;
namespace Demo.UI namespace Demo.UI
{ {
public class MainMenu public class MainMenu
{ {
private readonly UserUseCase _userUseCase; private readonly UserConsole _userConsole;
private readonly GroupConsole _groupConsole;
private readonly PresenceConsole _presenceConsole;
private readonly ExcelExporter _excelExporter;
private readonly GroupUseCase _groupUseCase; private readonly GroupUseCase _groupUseCase;
private readonly UseCaseGeneratePresence _presenceGenerator; private readonly UserUseCase _userUseCase;
private readonly PresenceUseCase _presenceUseCase; private readonly UseCasePresence _presenceUseCase;
private readonly RemoteDatabaseContext _context; public MainMenu(UserConsole userConsole, GroupConsole groupConsole, PresenceConsole presenceConsole, ExcelExporter excelExporter, GroupUseCase groupUseCase, UserUseCase userUseCase, UseCasePresence presenceUseCase)
public MainMenu(RemoteDatabaseContext context = null)
{ {
if (context == null) _userConsole = userConsole;
{ _groupConsole = groupConsole;
// Если контекст не предоставлен, создаем новый _presenceConsole = presenceConsole;
var optionsBuilder = new DbContextOptionsBuilder<RemoteDatabaseContext>(); _excelExporter = excelExporter;
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Database=user5;Username=user5;Password=EtEJqhsf"); _groupUseCase = groupUseCase;
_context = new RemoteDatabaseContext(optionsBuilder.Options); _userUseCase = userUseCase;
} _presenceUseCase = presenceUseCase;
else
{
_context = context;
} }
// Инициализация репозиториев public void ShowMenu()
IUserRepository userRepository = new SQLUserRepositoryImpl(_context);
IGroupRepository groupRepository = new GroupRepositoryImpl(_context);
IPresenceRepository presenceRepository = new PresenceRepositoryImpl(_context);
// Инициализация use cases
_userUseCase = new UserUseCase(userRepository);
_groupUseCase = new GroupUseCase(groupRepository);
_presenceGenerator = new UseCaseGeneratePresence(presenceRepository, userRepository);
_presenceUseCase = new PresenceUseCase(presenceRepository, groupRepository, userRepository);
}
public void Show()
{ {
bool exit = false; while (true)
while (!exit)
{ {
Console.Clear(); Console.WriteLine("=-= Команды с Пользователями =-=");
Console.WriteLine("=== Учёт Посещаемости ==="); Console.WriteLine("1. Вывести всех пользователей");
Console.WriteLine("1. Показать всех пользователей"); Console.WriteLine("2. Удалить пользователя по id");
Console.WriteLine("2. Удалить пользователя по GUID"); Console.WriteLine("3. Обновить пользователя по id");
Console.WriteLine("3. Обновить пользователя"); Console.WriteLine("4. Найти пользователя по id");
Console.WriteLine("4. Найти пользователя по GUID");
Console.WriteLine("5. Показать все группы");
Console.WriteLine("6. Добавить группу");
Console.WriteLine("7. Обновить группу");
Console.WriteLine("8. Удалить группу по ID");
Console.WriteLine("9. Найти группу по ID");
Console.WriteLine("10. Генерация посещаемости на текущий день");
Console.WriteLine("11. Генерация посещаемости на неделю");
Console.WriteLine("12. Показать посещаемость по группе и дате");
Console.WriteLine("13. Отметить пользователя как отсутствующего");
Console.WriteLine("14. Вывести всю посещаемость");
Console.WriteLine("0. Выход");
Console.Write("Выберите пункт меню: ");
var input = Console.ReadLine() ?? string.Empty;
Console.WriteLine(); Console.WriteLine();
switch (input) Console.WriteLine("=-= Команды с Группами =-=");
{ Console.WriteLine("5. Вывести все группы");
case "1": Console.WriteLine("6. Добавить группу");
ShowAllUsers(); Console.WriteLine("7. Изменить название группы");
break; Console.WriteLine("8. Поиск группы по ID");
case "2": Console.WriteLine();
DeleteUserByGuid();
break;
case "3":
UpdateUser();
break;
case "4":
FindUserByGuid();
break;
case "5":
ShowAllGroups();
break;
case "6":
AddGroup();
break;
case "7":
UpdateGroup();
break;
case "8":
DeleteGroupById();
break;
case "9":
FindGroupById();
break;
case "10":
GenerateDailyPresence();
break;
case "11":
GenerateWeeklyPresence();
break;
case "12":
ShowPresenceByGroupAndDate();
break;
case "13":
MarkUserAbsent();
break;
case "14":
ShowAllPresences();
break;
case "0":
exit = true;
break;
default:
Console.WriteLine("Неверный выбор. Нажмите любую клавишу для продолжения...");
Console.ReadKey();
break;
}
}
}
private void ShowAllUsers() Console.WriteLine("=-= Команды Presence =-=");
{ Console.WriteLine("9. Сгенерировать посещаемость на день");
var users = _userUseCase.GetAllUsers(); Console.WriteLine("10. Сгенерировать посещаемость на неделю");
Console.WriteLine("Список пользователей:"); Console.WriteLine("11. Показать посещаемость");
foreach (var user in users) Console.WriteLine("12. Отметить пользователя как отсутствующего");
{ Console.WriteLine("13. Вывести всю посещаемость группы");
var group = _groupUseCase.GetGroupById(user.GroupID); Console.WriteLine("14. Вывести общую информацию об посещаемости по группе");
Console.WriteLine($"ID: {user.Id} | ФИО: {user.FIO} | Группа: {group?.Name ?? "Неизвестно"}"); Console.WriteLine("15. Вывести отчёт в Excel");
} Console.WriteLine();
Pause(); Console.WriteLine("0. Выход");
}
private void DeleteUserByGuid() Console.Write("Выберите команду: ");
if (int.TryParse(Console.ReadLine(), out int choice))
{ {
Console.Write("Введите GUID пользователя для удаления: "); switch (choice)
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{ {
try case 1:
_userConsole.DisplayAllUsers();
break;
case 2:
Console.Write("Введите id пользователя: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userId))
{ {
_userUseCase.DeleteUser(userId); _userConsole.DeleteUser(userId);
Console.WriteLine("Пользователь удалён.");
} }
catch (Exception ex) else
{ {
Console.WriteLine($"Ошибка: {ex.Message}"); Console.WriteLine("Неверный формат id пользователя.");
}
break;
case 3:
Console.Write("Введите id пользователя: ");
if (Guid.TryParse(Console.ReadLine(), out Guid updateUserId))
{
var userToUpdate = _userUseCase.GetUserById(updateUserId);
if (userToUpdate != null)
{
Console.Write("Введите новое ФИО: ");
userToUpdate.FIO = Console.ReadLine();
Console.Write("Введите новый GroupID: ");
if (int.TryParse(Console.ReadLine(), out int newGroupID))
{
userToUpdate.GroupID = newGroupID;
_userConsole.UpdateUser(userToUpdate);
}
else
{
Console.WriteLine("Неверный формат GroupID.");
} }
} }
else else
{ {
Console.WriteLine("Неверный формат GUID."); Console.WriteLine("Пользователь не найден.");
} }
Pause();
} }
else
private void UpdateUser()
{ {
Console.Write("Введите GUID пользователя для обновления: "); Console.WriteLine("Неверный формат id пользователя.");
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{
try
{
var user = _userUseCase.GetUserById(userId);
Console.WriteLine($"Текущие данные: ФИО: {user.FIO}, Группа ID: {user.GroupID}");
Console.Write("Введите новое ФИО (оставьте пустым, чтобы сохранить текущее): ");
var newFIO = Console.ReadLine();
Console.Write("Введите новый ID группы (оставьте пустым, чтобы сохранить текущую): ");
var groupInput = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newFIO))
{
user.FIO = newFIO;
} }
break;
if (!string.IsNullOrWhiteSpace(groupInput)) case 4:
Console.Write("Введите id пользователя: ");
if (Guid.TryParse(Console.ReadLine(), out Guid findUserId))
{ {
if (int.TryParse(groupInput, out int newGroupId)) _userConsole.FindUser(findUserId);
}
else
{ {
var group = _groupUseCase.GetGroupById(newGroupId); Console.WriteLine("Неверный формат id пользователя.");
}
break;
case 5:
_groupConsole.DisplayAllGroups();
break;
case 6:
Console.Write("Введите название группы: ");
string groupName = Console.ReadLine();
var newGroup = new Group { Name = groupName };
_groupConsole.AddGroup(newGroup);
break;
case 7:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupId))
{
Console.Write("Введите новое название группы: ");
string newGroupName = Console.ReadLine();
_groupConsole.UpdateGroupName(groupId, newGroupName);
}
else
{
Console.WriteLine("Неверный формат id группы.");
}
break;
case 8:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int searchGroupId))
{
var group = _groupUseCase.GetAllGroups().FirstOrDefault(g => g.Id == searchGroupId);
if (group != null) if (group != null)
{ {
user.GroupID = newGroupId; Console.WriteLine($"ID: {group.Id}, Название: {group.Name}");
} }
else else
{ {
Console.WriteLine("Группа с таким ID не найдена. Группа не обновлена."); Console.WriteLine("Группа не найдена.");
} }
} }
else else
{ {
Console.WriteLine("Неверный формат ID группы. Группа не обновлена."); Console.WriteLine("Неверный формат id группы.");
} }
} break;
case 9:
_userUseCase.UpdateUser(user); Console.Write("Введите номер первого занятия: ");
Console.WriteLine("Пользователь обновлён."); if (int.TryParse(Console.ReadLine(), out int firstLesson))
}
catch (Exception ex)
{ {
Console.WriteLine($"Ошибка: {ex.Message}"); Console.Write("Введите номер последнего занятия: ");
} if (int.TryParse(Console.ReadLine(), out int lastLesson))
}
else
{ {
Console.WriteLine("Неверный формат GUID."); Console.Write("Введите id группы: ");
} if (int.TryParse(Console.ReadLine(), out int groupIdForPresence))
Pause();
}
private void FindUserByGuid()
{ {
Console.Write("Введите GUID пользователя для поиска: ");
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{
try
{
var user = _userUseCase.GetUserById(userId);
var group = _groupUseCase.GetGroupById(user.GroupID);
Console.WriteLine($"ID: {user.Id} | ФИО: {user.FIO} | Группа: {group?.Name ?? "Неизвестно"}");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Pause();
}
private void ShowAllGroups()
{
var groups = _groupUseCase.GetAllGroups();
Console.WriteLine("Список групп:");
foreach (var group in groups)
{
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}");
}
Pause();
}
private void AddGroup()
{
Console.Write("Введите ID группы: ");
var idInput = Console.ReadLine();
Console.Write("Введите название группы: ");
var name = Console.ReadLine() ?? string.Empty;
if (int.TryParse(idInput, out int groupId))
{
var existingGroup = _groupUseCase.GetGroupById(groupId);
if (existingGroup != null)
{
Console.WriteLine("Группа с таким ID уже существует.");
}
else
{
var group = new Group
{
Id = groupId,
Name = name
};
try
{
_groupUseCase.AddGroup(group);
Console.WriteLine("Группа добавлена.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Pause();
}
private void UpdateGroup()
{
Console.Write("Введите ID группы для обновления: ");
var idInput = Console.ReadLine();
if (int.TryParse(idInput, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"Текущие данные: Название: {group.Name}");
Console.Write("Введите новое название группы: ");
var newName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newName))
{
group.Name = newName;
_groupUseCase.UpdateGroup(group);
Console.WriteLine("Группа обновлена.");
}
else
{
Console.WriteLine("Название не может быть пустым. Группа не обновлена.");
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Pause();
}
private void DeleteGroupById()
{
Console.Write("Введите ID группы для удаления: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
_groupUseCase.DeleteGroup(groupId);
Console.WriteLine("Группа удалена.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Pause();
}
private void FindGroupById()
{
Console.Write("Введите ID группы для поиска: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Pause();
}
private void GenerateDailyPresence()
{
Console.Write("Введите номер первой пары: ");
var firstLessonInput = Console.ReadLine();
Console.Write("Введите номер последней пары: ");
var lastLessonInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): "); Console.Write("Введите дату (yyyy-MM-dd): ");
var dateInput = Console.ReadLine(); if (DateTime.TryParse(Console.ReadLine(), out DateTime date))
if (int.TryParse(firstLessonInput, out int firstLesson) &&
int.TryParse(lastLessonInput, out int lastLesson) &&
int.TryParse(groupIdInput, out int groupId) &&
DateTime.TryParseExact(dateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
{ {
try var generatePresenceUseCase = new UseCaseGeneratePresence(_presenceUseCase.PresenceRepository, _userUseCase.UserRepository);
{ generatePresenceUseCase.GeneratePresenceForToday(firstLesson, lastLesson, groupIdForPresence, date);
_presenceGenerator.GenerateDailyPresence(groupId, firstLesson, lastLesson, date); Console.WriteLine("Посещаемость сгенерирована на день.");
Console.WriteLine("Посещаемость сгенерирована.");
} }
catch (Exception ex) else
{ {
Console.WriteLine($"Ошибка: {ex.Message}"); Console.WriteLine("Неверный формат даты.");
} }
} }
else else
{ {
Console.WriteLine("Неверные входные данные."); Console.WriteLine("Неверный формат id группы.");
}
Pause();
}
private void GenerateWeeklyPresence()
{
Console.Write("Введите номер первой пары: ");
var firstLessonInput = Console.ReadLine();
Console.Write("Введите номер последней пары: ");
var lastLessonInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите начальную дату недели (yyyy-MM-dd): ");
var startDateInput = Console.ReadLine();
if (int.TryParse(firstLessonInput, out int firstLesson) &&
int.TryParse(lastLessonInput, out int lastLesson) &&
int.TryParse(groupIdInput, out int groupId) &&
DateTime.TryParseExact(startDateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime startDate))
{
try
{
_presenceGenerator.GenerateWeeklyPresence(groupId, firstLesson, lastLesson, startDate);
Console.WriteLine("Посещаемость на неделю сгенерирована.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
} }
} }
else else
{ {
Console.WriteLine("Неверные входные данные."); Console.WriteLine("Неверный формат номера последнего занятия.");
} }
Pause();
} }
else
private void ShowPresenceByGroupAndDate() {
Console.WriteLine("Неверный формат номера первого занятия.");
}
break;
case 10:
Console.Write("Введите номер первого занятия: ");
if (int.TryParse(Console.ReadLine(), out int firstLessonWeek))
{
Console.Write("Введите номер последнего занятия: ");
if (int.TryParse(Console.ReadLine(), out int lastLessonWeek))
{
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupIdForPresenceWeek))
{
Console.Write("Введите дату начала недели (yyyy-MM-dd): ");
if (DateTime.TryParse(Console.ReadLine(), out DateTime startDateWeek))
{
var generatePresenceUseCaseWeek = new UseCaseGeneratePresence(_presenceUseCase.PresenceRepository, _userUseCase.UserRepository);
generatePresenceUseCaseWeek.GeneratePresenceForWeek(firstLessonWeek, lastLessonWeek, groupIdForPresenceWeek, startDateWeek);
Console.WriteLine("Посещаемость сгенерирована на неделю.");
}
else
{
Console.WriteLine("Неверный формат даты.");
}
}
else
{
Console.WriteLine("Неверный формат id группы.");
}
}
else
{
Console.WriteLine("Неверный формат номера последнего занятия.");
}
}
else
{
Console.WriteLine("Неверный формат номера первого занятия.");
}
break;
case 11:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupIdForPresenceDisplay))
{
_presenceConsole.DisplayPresenceByGroup(groupIdForPresenceDisplay);
}
else
{
Console.WriteLine("Неверный формат id группы.");
}
break;
case 12:
Console.Write("Введите id пользователя: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userIdForAbsent))
{
Console.Write("Введите номер занятия: ");
if (int.TryParse(Console.ReadLine(), out int lessonNumberForAbsent))
{ {
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): "); Console.Write("Введите дату (yyyy-MM-dd): ");
var dateInput = Console.ReadLine(); if (DateTime.TryParse(Console.ReadLine(), out DateTime dateForAbsent))
if (int.TryParse(groupIdInput, out int groupId) &&
DateTime.TryParseExact(dateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
{ {
try _presenceConsole.MarkUserAsAbsent(userIdForAbsent, lessonNumberForAbsent, dateForAbsent);
{
var presences = _presenceUseCase.GetPresencesByGroupAndDate(groupId, date);
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"Посещаемость группы {group?.Name ?? "Неизвестно"} на {date.ToString("yyyy-MM-dd")}:");
foreach (var presence in presences)
{
var user = _userUseCase.GetUserById(presence.UserId);
Console.WriteLine($"Пользователь: {user.FIO} | Пара: {presence.LessonNumber} | Был/Не был: {(presence.WasPresent ? "Был" : "Не был")}");
} }
} else
catch (Exception ex)
{ {
Console.WriteLine($"Ошибка: {ex.Message}"); Console.WriteLine("Неверный формат даты.");
} }
} }
else else
{ {
Console.WriteLine("Неверные входные данные."); Console.WriteLine("Неверный формат номера занятия.");
}
Pause();
}
private void MarkUserAbsent()
{
Console.Write("Введите GUID пользователя: ");
var userIdInput = Console.ReadLine();
Console.Write("Введите номер пары: ");
var lessonInput = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): ");
var dateInput = Console.ReadLine();
if (Guid.TryParse(userIdInput, out Guid userId) &&
int.TryParse(lessonInput, out int lessonNumber) &&
DateTime.TryParseExact(dateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
{
try
{
_presenceUseCase.MarkUserAbsent(userId, lessonNumber, date);
Console.WriteLine("Пользователь отмечен как отсутствующий.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
} }
} }
else else
{ {
Console.WriteLine("Неверные входные данные."); Console.WriteLine("Неверный формат id пользователя.");
} }
Pause(); break;
case 13:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupIdForPresenceAll))
{
_presenceConsole.DisplayPresenceByGroup(groupIdForPresenceAll);
}
else
{
Console.WriteLine("Неверный формат id группы.");
}
break;
case 14:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupIdForPresenceInfo))
{
var groupForInfo = _groupUseCase.GetAllGroups().FirstOrDefault(g => g.Id == groupIdForPresenceInfo);
if (groupForInfo != null)
{
var usersForInfo = _userUseCase.GetAllUsers().Where(u => u.GroupID == groupIdForPresenceInfo).ToList();
var presenceForInfo = _presenceUseCase.GetPresenceByGroup(groupIdForPresenceInfo).ToList();
Console.WriteLine($"Количество человек в группе: {usersForInfo.Count}");
Console.WriteLine($"Количество проведенных занятий: {presenceForInfo.Select(p => p.Date).Distinct().Count()}");
Console.WriteLine($"Общий процент посещаемости: {presenceForInfo.Count(p => p.IsAttendance) * 100.0 / presenceForInfo.Count}%");
foreach (var user in usersForInfo)
{
var userPresence = presenceForInfo.Where(p => p.UserId == user.Id).ToList();
int attended = userPresence.Count(p => p.IsAttendance);
int missed = userPresence.Count(p => !p.IsAttendance);
double percentage = (attended * 100.0) / (attended + missed);
Console.WriteLine($"ФИО: {user.FIO}, Посещено: {attended}, Пропущено: {missed}, Процент посещаемости: {percentage}%");
}
}
else
{
Console.WriteLine("Группа не найдена.");
}
}
else
{
Console.WriteLine("Неверный формат id группы.");
}
break;
case 15:
Console.Write("Введите id группы: ");
if (int.TryParse(Console.ReadLine(), out int groupIdForExport))
{
var groupForExport = _groupUseCase.GetAllGroups().FirstOrDefault(g => g.Id == groupIdForExport);
if (groupForExport != null)
{
var usersForExport = _userUseCase.GetAllUsers().Where(u => u.GroupID == groupIdForExport).ToList();
var presenceForExport = _presenceUseCase.GetPresenceByGroup(groupIdForExport).ToList();
// Указываем путь для сохранения файла
string directoryPath = @"C:\Users\Наиль\Source\Repos\slarny4\Demo1\Excel";
string filePath = Path.Combine(directoryPath, "GroupInfo.xlsx");
// Проверяем, существует ли директория, и если нет, создаем её
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
} }
private void ShowAllPresences() _excelExporter.ExportGroupInfoToExcel(groupForExport, usersForExport, presenceForExport, filePath);
Console.WriteLine("Отчёт экспортирован в Excel.");
}
else
{ {
var presences = _presenceUseCase.GetAllPresences(); Console.WriteLine("Группа не найдена.");
Console.WriteLine("Вся посещаемость:"); }
foreach (var presence in presences) }
else
{ {
var user = _userUseCase.GetUserById(presence.UserId); Console.WriteLine("Неверный формат id группы.");
var group = _groupUseCase.GetGroupById(user.GroupID);
Console.WriteLine($"Пользователь: {user.FIO} | Группа: {group?.Name ?? "Неизвестно"} | Дата: {presence.ClassDate.ToString("yyyy-MM-dd")} | Пара: {presence.LessonNumber} | Был/Не был: {(presence.WasPresent ? "Был" : "Не был")}");
} }
Pause(); break;
} }
}
private void Pause() else
{ {
Console.WriteLine("\nНажмите любую клавишу для продолжения..."); Console.WriteLine("Неверный ввод. Пожалуйста, введите число.");
Console.ReadKey(); }
}
} }
} }
} }

View File

@ -1,221 +1,48 @@
using System; using Demo.Domain.UseCase;
using System.Globalization; using System;
using Demo.Domain.UseCase; using System.Linq;
using Demo.Data.Repository;
using Demo.Data.LocalData.Entity;
using Demo.Data.Exceptions;
using AttendanceApp.Domain.Models;
namespace AttendanceApp.UI namespace Demo.UI
{ {
public class PresenceConsole public class PresenceConsole
{ {
private readonly UseCaseGeneratePresence _generatePresenceUseCase; private readonly UseCasePresence _presenceUseCase;
private readonly IPresenceRepository _presenceRepository; private readonly UserUseCase _userUseCase;
private readonly IGroupRepository _groupRepository;
public PresenceConsole(UseCaseGeneratePresence generatePresenceUseCase, IPresenceRepository presenceRepository, IGroupRepository groupRepository) public PresenceConsole(UseCasePresence presenceUseCase, UserUseCase userUseCase)
{ {
_generatePresenceUseCase = generatePresenceUseCase; _presenceUseCase = presenceUseCase;
_presenceRepository = presenceRepository; _userUseCase = userUseCase;
_groupRepository = groupRepository;
} }
public void GenerateDailyPresence() public void DisplayPresenceByGroup(int groupId)
{ {
Console.Clear(); var presence = _presenceUseCase.GetPresenceByGroup(groupId);
Console.WriteLine("=== Генерация посещаемости на текущий день ==="); var users = _userUseCase.GetAllUsers().ToDictionary(u => u.Id);
Console.Write("Введите номер первого занятия: ");
var firstClassInput = Console.ReadLine();
Console.Write("Введите номер последнего занятия: ");
var lastClassInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
var currentDate = DateTime.Now.Date;
if (int.TryParse(firstClassInput, out int firstClassNum) foreach (var p in presence)
&& int.TryParse(lastClassInput, out int lastClassNum)
&& int.TryParse(groupIdInput, out int groupId))
{ {
try var user = users[p.UserId];
{ Console.WriteLine($"Дата: {p.Date}, Занятие: {p.LessonNumber}, ФИО: {user.FIO}, Посещаемость: {(p.IsAttendance ? "Присутствовал" : "Отсутствовал")}");
_generatePresenceUseCase.GenerateDailyPresence(firstClassNum, lastClassNum, groupId, currentDate);
Console.WriteLine("Посещаемость успешно сгенерирована на текущий день.");
} }
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
} }
Console.WriteLine("Нажмите любую клавишу для продолжения..."); public void DisplayPresenceByGroupAndDate(int groupId, DateTime date)
Console.ReadKey(); {
var presence = _presenceUseCase.GetPresenceByGroupAndDate(groupId, date);
var users = _userUseCase.GetAllUsers().ToDictionary(u => u.Id);
foreach (var p in presence)
{
var user = users[p.UserId];
Console.WriteLine($"Дата: {p.Date}, Занятие: {p.LessonNumber}, ФИО: {user.FIO}, Посещаемость: {(p.IsAttendance ? "Присутствовал" : "Отсутствовал")}");
}
} }
public void GenerateWeeklyPresence() public void MarkUserAsAbsent(Guid userId, int lessonNumber, DateTime date)
{ {
Console.Clear(); _presenceUseCase.MarkUserAsAbsent(userId, lessonNumber, date);
Console.WriteLine("=== Генерация посещаемости на неделю ==="); Console.WriteLine("Пользователь отмечен как отсутствующий.");
Console.Write("Введите номер первого занятия: ");
var firstClassInput = Console.ReadLine();
Console.Write("Введите номер последнего занятия: ");
var lastClassInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите стартовую дату (yyyy-MM-dd): ");
var startDateInput = Console.ReadLine();
if (int.TryParse(firstClassInput, out int firstClassNum)
&& int.TryParse(lastClassInput, out int lastClassNum)
&& int.TryParse(groupIdInput, out int groupId)
&& DateTime.TryParseExact(startDateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime startDate))
{
try
{
_generatePresenceUseCase.GenerateWeeklyPresence(firstClassNum, lastClassNum, groupId, startDate);
Console.WriteLine("Посещаемость успешно сгенерирована на неделю.");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void ShowPresenceByGroupAndDate()
{
Console.Clear();
Console.WriteLine("=== Показать посещаемость по группе и дате ===");
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): ");
var dateInput = Console.ReadLine();
if (int.TryParse(groupIdInput, out int groupId) && DateTime.TryParse(dateInput, out DateTime date))
{
try
{
var group = _groupRepository.GetGroupById(groupId);
// Добавляем проверку на null
if (group == null)
{
Console.WriteLine($"Группа с ID {groupId} не найдена.");
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
return;
}
var presences = _presenceRepository.GetPresencesByGroupAndDate(groupId, date);
Console.WriteLine($"Посещаемость группы {group.Name} на {date.ToShortDateString()}:");
foreach (var presence in presences)
{
Console.WriteLine($"Пользователь ID: {presence.UserId} | Занятие №: {presence.LessonNumber} | Присутствует: {presence.WasPresent}");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void MarkUserAbsent()
{
Console.Clear();
Console.WriteLine("=== Отметить пользователя как отсутствующего ===");
Console.Write("Введите ID пользователя (GUID): ");
var userIdInput = Console.ReadLine();
Console.Write("Введите диапазон занятий (через запятую, например: 1,3): ");
var classRangeInput = Console.ReadLine();
if (Guid.TryParse(userIdInput, out Guid userId)
&& classRangeInput.Contains(",")
&& int.TryParse(classRangeInput.Split(',')[0], out int startClass)
&& int.TryParse(classRangeInput.Split(',')[1], out int endClass))
{
try
{
var currentDate = DateTime.Now.Date;
for (int classNum = startClass; classNum <= endClass; classNum++)
{
var presence = new Presence
{
ClassDate = currentDate,
LessonNumber = classNum,
WasPresent = false,
UserId = userId
};
_presenceRepository.UpdatePresence(presence);
}
Console.WriteLine("Пользователь успешно отмечен как отсутствующий на указанных занятиях.");
}
catch (RepositoryException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void ShowPresenceByGroup()
{
Console.Clear();
Console.WriteLine("=== Показать посещаемость по группе ===");
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
if (int.TryParse(groupIdInput, out int groupId))
{
try
{
var group = _groupRepository.GetGroupById(groupId);
var presences = _presenceRepository.GetPresenceByGroup(groupId);
Console.WriteLine($"Посещаемость группы {group.Name}:");
foreach (var presence in presences)
{
Console.WriteLine($"Дата: {presence.ClassDate.ToShortDateString()} | " +
$"Занятие №{presence.LessonNumber} | " +
$"Присутствует: {(presence.WasPresent ? "Да" : "Нет")} | " +
$"Студент ID: {presence.UserId}");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("\nНажмите любую клавишу для продолжения...");
Console.ReadKey();
} }
} }
} }

View File

@ -1,12 +1,50 @@
using System; using Demo.Data.RemoteData.RemoteDataBase.DAO; // Используйте правильное пространство имен
using System.Collections.Generic; using Demo.Domain.UseCase;
using System.Linq; using System;
using System.Text;
using System.Threading.Tasks;
namespace Demo1.UI namespace Demo.UI
{ {
internal class UserConsole public class UserConsole
{ {
private readonly UserUseCase _userUseCase;
public UserConsole(UserUseCase userUseCase)
{
_userUseCase = userUseCase;
}
public void DisplayAllUsers()
{
var users = _userUseCase.GetAllUsers();
foreach (var user in users)
{
Console.WriteLine($"ID: {user.Id}, FIO: {user.FIO}, GroupID: {user.GroupID}");
}
}
public void DeleteUser(Guid id)
{
_userUseCase.DeleteUser(id);
Console.WriteLine("User deleted.");
}
public void UpdateUser(User user)
{
_userUseCase.UpdateUser(user);
Console.WriteLine("User updated.");
}
public void FindUser(Guid id)
{
var user = _userUseCase.GetUserById(id);
if (user != null)
{
Console.WriteLine($"ID: {user.Id}, FIO: {user.FIO}, GroupID: {user.GroupID}");
}
else
{
Console.WriteLine("User not found.");
}
}
} }
} }

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,10 +1,16 @@
{ {
"runtimeOptions": { "runtimeOptions": {
"tfm": "net8.0", "tfm": "net8.0",
"framework": { "frameworks": [
{
"name": "Microsoft.NETCore.App", "name": "Microsoft.NETCore.App",
"version": "8.0.0" "version": "8.0.0"
}, },
{
"name": "Microsoft.AspNetCore.App",
"version": "8.0.0"
}
],
"configProperties": { "configProperties": {
"System.Reflection.NullabilityInfoContext.IsSupported": true, "System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Demo1")] [assembly: System.Reflection.AssemblyCompanyAttribute("Demo1")]
[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+06b1f950636c0e6a821db89e32cb6df6c2d4fc5f")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9ba62b2fa20afffbdbc79b338375befcb707042e")]
[assembly: System.Reflection.AssemblyProductAttribute("Demo1")] [assembly: System.Reflection.AssemblyProductAttribute("Demo1")]
[assembly: System.Reflection.AssemblyTitleAttribute("Demo1")] [assembly: System.Reflection.AssemblyTitleAttribute("Demo1")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

Some files were not shown because too many files have changed in this diff Show More