master #1
@ -10,7 +10,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
public class GroupDao
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public required string Name { get; set; }
|
||||
public string Name { get; set; }
|
||||
public List<UserDao> Users { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
{
|
||||
public class PresenceDao
|
||||
{
|
||||
public int PresenceId { get; set; }
|
||||
public int UserId { get; set; }
|
||||
public bool IsAttedance { get; set; } = true;
|
||||
public DateOnly Date { get; set; }
|
||||
|
@ -11,6 +11,6 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
public required string FIO { get; set; }
|
||||
public required int UserId { get; set; }
|
||||
public required int GroupId { get; set; }
|
||||
public GroupDao Group { get; set; }
|
||||
public GroupDao? Group { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -27,13 +27,8 @@ namespace Demo.Data.RemoteData.RemoteDataBase
|
||||
modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<UserDao>().HasKey(user=>user.UserId);
|
||||
modelBuilder.Entity<UserDao>().Property(user=>user.UserId).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<PresenceDao>().HasKey(presence => new
|
||||
{
|
||||
presence.UserId,
|
||||
presence.Date,
|
||||
presence.IsAttedance,
|
||||
presence.LessonNumber
|
||||
});
|
||||
modelBuilder.Entity<PresenceDao>().HasKey(presence =>presence.PresenceId);
|
||||
modelBuilder.Entity<PresenceDao>().Property(presence=>presence.PresenceId).ValueGeneratedOnAdd();
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -53,11 +53,6 @@ public class GroupRepositoryImpl: IGroupRepository
|
||||
}
|
||||
}
|
||||
|
||||
bool IGroupRepository.RemoveGroupById(int groupID)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
List<GroupDao> IGroupRepository.GetAllGroups()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
@ -11,7 +11,6 @@ namespace Demo.Data.Repository
|
||||
public interface IGroupRepository
|
||||
{
|
||||
List<GroupDao> GetAllGroups();
|
||||
bool RemoveGroupById(int groupID);
|
||||
bool UpdateGroupById(int groupID, GroupDao updatedGroup);
|
||||
GroupDao GetGroupById(int groupID);
|
||||
bool AddGroup(string Name);
|
||||
|
@ -15,5 +15,7 @@ namespace Demo.Data.Repository
|
||||
List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId);
|
||||
void SavePresence(List<PresenceDao> presences);
|
||||
List<PresenceDao> GetPresenceByGroup(int groupId);
|
||||
DateOnly? GetLastDateByGroupId(int groupId);
|
||||
List<PresenceDao> GetPresenceForAbsent(DateTime date, int GroupId);
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ namespace Demo.Data.Repository
|
||||
{
|
||||
public interface IUserRepository
|
||||
{
|
||||
IEnumerable<UserDao> GetAllUsers { get; }
|
||||
List<UserDao> GetAllUsers();
|
||||
bool RemoveUserById(int userId);
|
||||
UserDao? UpdateUser(UserDao user);
|
||||
}
|
||||
|
@ -47,5 +47,7 @@ namespace Demo.Data.Repository
|
||||
{
|
||||
return _presences.Where(p => p.GroupId == groupId).ToList();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,13 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
@ -18,7 +21,10 @@ namespace Demo.Data.Repository
|
||||
{
|
||||
_remoteDatabaseContext = remoteDatabaseContext;
|
||||
}
|
||||
|
||||
public List<PresenceDao> GetPresenceForAbsent(DateTime date, int GroupId)
|
||||
{
|
||||
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == GroupId && p.Date==DateOnly.FromDateTime(date)).ToList();
|
||||
}
|
||||
public List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId)
|
||||
{
|
||||
return _remoteDatabaseContext.PresenceDaos.Where(p => p.Date == DateOnly.FromDateTime(date) &&
|
||||
@ -28,10 +34,6 @@ namespace Demo.Data.Repository
|
||||
// Реализация метода для получения всех данных по группе
|
||||
public List<PresenceDao> GetPresenceByGroup(int groupId)
|
||||
{
|
||||
foreach (var user in _remoteDatabaseContext.PresenceDaos)
|
||||
{
|
||||
Console.WriteLine(user);
|
||||
}
|
||||
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == groupId).ToList();
|
||||
}
|
||||
|
||||
@ -42,10 +44,23 @@ namespace Demo.Data.Repository
|
||||
Date = it.Date,
|
||||
IsAttedance = it.IsAttedance,
|
||||
LessonNumber = it.LessonNumber,
|
||||
UserId = it.UserId
|
||||
UserId = it.UserId,
|
||||
GroupId = it.GroupId
|
||||
}));
|
||||
_remoteDatabaseContext.SaveChanges();
|
||||
}
|
||||
|
||||
public DateOnly? GetLastDateByGroupId(int groupId)
|
||||
{
|
||||
// Проверяем наличие записей о посещаемости в базе данных для данной группы.
|
||||
var lastDate = _remoteDatabaseContext.PresenceDaos
|
||||
.Where(p => p.GroupId == groupId)
|
||||
.OrderByDescending(p => p.Date)
|
||||
.Select(p => p.Date)
|
||||
.FirstOrDefault();
|
||||
|
||||
return lastDate == default ? (DateOnly?)null : lastDate;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -18,8 +18,6 @@ namespace Demo.Data.Repository
|
||||
_remoteDatabaseContext = remoteDatabaseContext;
|
||||
}
|
||||
|
||||
public IEnumerable<UserDao> GetAllUsers => _remoteDatabaseContext.Users;
|
||||
|
||||
public bool RemoveUserById(int userId)
|
||||
{
|
||||
var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == userId);
|
||||
@ -34,10 +32,18 @@ namespace Demo.Data.Repository
|
||||
var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == user.UserId);
|
||||
if (existingUser == null) throw new UserNotFoundException(user.UserId);
|
||||
|
||||
// Обновляем поля существующего пользователя
|
||||
existingUser.FIO = user.FIO;
|
||||
existingUser.GroupId = user.GroupId;
|
||||
_remoteDatabaseContext.SaveChanges();
|
||||
|
||||
return existingUser;
|
||||
}
|
||||
|
||||
public List<UserDao> GetAllUsers()
|
||||
{
|
||||
// Возвращаем пользователей, отсортированных по UserId
|
||||
return _remoteDatabaseContext.Users.OrderBy(u => u.UserId).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,17 +29,6 @@ namespace Demo.Data.Repository
|
||||
return true;
|
||||
}
|
||||
|
||||
public UserLocalEnity? UpdateUser(UserLocalEnity user)
|
||||
{
|
||||
var existingUser = _users.FirstOrDefault(u => u.ID == user.ID);
|
||||
if (existingUser == null) throw new UserNotFoundException(user.ID);
|
||||
|
||||
existingUser.FIO = user.FIO;
|
||||
existingUser.GroupID = user.GroupID;
|
||||
|
||||
return existingUser;
|
||||
}
|
||||
|
||||
public UserDao? UpdateUser(UserDao user)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Data\RemoteData\RemoteApi\" />
|
||||
<Folder Include="Migrations\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -91,26 +91,6 @@ namespace Demo.Domain.UseCase
|
||||
_repositoryGroupImpl.AddGroup(newGroup.Name);
|
||||
}
|
||||
|
||||
public void RemoveGroupById(int groupId)
|
||||
{
|
||||
ValidateGroupId(groupId);
|
||||
var existingGroup = ValidateGroupExistence(groupId);
|
||||
List<Group> _groups = GetAllGroups();
|
||||
|
||||
// Находим группу по ID и удаляем ее
|
||||
var groupToRemove = _groups.FirstOrDefault(g => g.Id == existingGroup.Id);
|
||||
if (groupToRemove != null)
|
||||
{
|
||||
_groups.Remove(groupToRemove);
|
||||
_repositoryGroupImpl.RemoveGroupById(existingGroup.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException("Группа не найдена.");
|
||||
// Обработка случая, если группа не найдена (например, выброс исключения)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Метод для изменения названия группы
|
||||
public void UpdateGroup(int groupId, string newGroupName)
|
||||
|
@ -1,6 +1,7 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.domain.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -14,6 +15,7 @@ namespace Demo.Domain.UseCase
|
||||
public readonly IUserRepository _userRepository;
|
||||
public readonly IPresenceRepository _presenceRepository;
|
||||
|
||||
|
||||
public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository)
|
||||
{
|
||||
_userRepository = userRepository;
|
||||
@ -28,23 +30,26 @@ namespace Demo.Domain.UseCase
|
||||
return _presenceRepository.GetPresenceByDateAndGroup(date, groupId);
|
||||
}
|
||||
|
||||
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate)
|
||||
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var users = _userRepository.GetAllUsers.Where(u => u.GroupId == groupId).ToList();
|
||||
var users = _userRepository.GetAllUsers().Where(u => u.GroupId == groupId).ToList();
|
||||
|
||||
// Находим последнюю дату посещаемости для данной группы
|
||||
DateOnly startDate = _presenceRepository.GetLastDateByGroupId(groupId)?.AddDays(1)
|
||||
?? DateOnly.FromDateTime(DateTime.Today);
|
||||
|
||||
List<PresenceDao> presences = new List<PresenceDao>();
|
||||
for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++)
|
||||
{
|
||||
foreach (var user in users)
|
||||
{
|
||||
Console.WriteLine($"UserId: {user.UserId}, GroupId: {user.GroupId}"); // Выводим информацию о пользователе
|
||||
var presence = new PresenceDao
|
||||
{
|
||||
UserId = user.UserId,
|
||||
GroupId = user.GroupId,
|
||||
Date = DateOnly.FromDateTime(currentDate),
|
||||
Date = startDate,
|
||||
LessonNumber = lessonNumber,
|
||||
IsAttedance = true
|
||||
};
|
||||
@ -52,7 +57,7 @@ namespace Demo.Domain.UseCase
|
||||
try
|
||||
{
|
||||
_presenceRepository.SavePresence(new List<PresenceDao> { presence });
|
||||
Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber}");
|
||||
Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber} на дату {startDate}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -76,12 +81,14 @@ namespace Demo.Domain.UseCase
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime)
|
||||
{
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
DateTime currentTime = startTime.AddDays(i);
|
||||
GeneratePresenceDaily(firstLesson, lastLesson, groupId, currentTime);
|
||||
GeneratePresenceDaily(firstLesson, lastLesson, groupId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,24 +97,26 @@ namespace Demo.Domain.UseCase
|
||||
// Отметить пользователя как отсутствующего на диапазоне занятий
|
||||
public void MarkUserAbsentForLessons(int userId, int groupId, int firstLesson, int lastLesson, DateTime date)
|
||||
{
|
||||
var presences = _presenceRepository.GetPresenceByDateAndGroup(date, groupId);
|
||||
List<PresenceDao> presences = _presenceRepository.GetPresenceForAbsent(date, groupId);
|
||||
|
||||
// Обновляем состояние присутствия для указанных занятий
|
||||
foreach (var presence in presences.Where(p => p.UserId == userId && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson))
|
||||
{
|
||||
presence.IsAttedance = false;
|
||||
presence.IsAttedance = false; // Устанавливаем отсутствие
|
||||
Console.WriteLine($"PresenceId: {presence.PresenceId}, UserId: {presence.UserId}, Lesson Num: {presence.LessonNumber}, Att: {presence.IsAttedance}");
|
||||
}
|
||||
// Сохраняем изменения в репозитории
|
||||
_presenceRepository.SavePresence(presences);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<PresenceDao> GetAllPresenceByGroup(int groupId)
|
||||
{
|
||||
|
||||
return _presenceRepository.GetPresenceByGroup(groupId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ namespace Demo.Domain.UseCase
|
||||
// Приватный метод для валидации существования пользователя по ID
|
||||
private UserDao ValidateUserExistence(int userId)
|
||||
{
|
||||
var user = _repositoryUserImpl.GetAllUsers
|
||||
var user = _repositoryUserImpl.GetAllUsers()
|
||||
.FirstOrDefault(u => u.UserId == userId);
|
||||
|
||||
if (user == null)
|
||||
@ -54,7 +54,7 @@ namespace Demo.Domain.UseCase
|
||||
}
|
||||
|
||||
// Вывести всех пользователей
|
||||
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers
|
||||
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers()
|
||||
.Join(_repositoryGroupImpl.GetAllGroups(),
|
||||
user => user.GroupId, // Ключ для пользователей
|
||||
group => group.Id, // Ключ для групп
|
||||
@ -86,47 +86,47 @@ namespace Demo.Domain.UseCase
|
||||
}
|
||||
|
||||
// Обновить пользователя по id
|
||||
//public User UpdateUser(User user)
|
||||
//{
|
||||
// ValidateUserFIO(user.FIO);
|
||||
// ValidateGroupExistence(user.Group.Id);
|
||||
public UserDao UpdateUser(UserDao user)
|
||||
{
|
||||
ValidateUserFIO(user.FIO);
|
||||
ValidateGroupExistence(user.GroupId);
|
||||
|
||||
// UserDao userDao = new UserDao
|
||||
// {
|
||||
// FIO = user.FIO,
|
||||
// GroupId = user.Group.Id
|
||||
// };
|
||||
UserDao userDao = new UserDao
|
||||
{
|
||||
UserId = user.UserId,
|
||||
FIO = user.FIO,
|
||||
GroupId = user.GroupId
|
||||
};
|
||||
|
||||
// UserDao? result = _repositoryUserImpl.UpdateUser(userDao);
|
||||
UserDao? result = _repositoryUserImpl.UpdateUser(userDao);
|
||||
|
||||
// if (result == null)
|
||||
// {
|
||||
// throw new Exception("Ошибка при обновлении пользователя.");
|
||||
// }
|
||||
if (result == null)
|
||||
{
|
||||
throw new Exception("Ошибка при обновлении пользователя.");
|
||||
}
|
||||
|
||||
// var groupEntity = ValidateGroupExistence(result.GroupId);
|
||||
var groupEntity = ValidateGroupExistence(result.GroupId);
|
||||
|
||||
// return new User
|
||||
// {
|
||||
// FIO = result.FIO,
|
||||
// Group = new Group
|
||||
// {
|
||||
// Id = groupEntity.Id,
|
||||
// Name = groupEntity.Name
|
||||
// }
|
||||
// };
|
||||
//}
|
||||
return new UserDao
|
||||
{
|
||||
UserId=user.UserId,
|
||||
FIO = result.FIO,
|
||||
GroupId = result.GroupId
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// Найти пользователя по id
|
||||
public User FindUserById(int userId)
|
||||
public UserDao FindUserById(int userId)
|
||||
{
|
||||
var user = ValidateUserExistence(userId);
|
||||
var group = ValidateGroupExistence(user.GroupId);
|
||||
|
||||
return new User
|
||||
return new UserDao
|
||||
{
|
||||
UserId = user.UserId,
|
||||
FIO = user.FIO,
|
||||
Group = new Group { Id = group.Id, Name = group.Name }
|
||||
GroupId = group.Id
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
namespace Demo.Migrations
|
||||
{
|
||||
[DbContext(typeof(RemoteDatabaseContext))]
|
||||
[Migration("20241025085326_InitialCreate")]
|
||||
partial class InitialCreate
|
||||
[Migration("20241101064613_InitialMigration")]
|
||||
partial class InitialMigration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
@ -44,27 +44,28 @@ namespace Demo.Migrations
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.Property<int>("UserId")
|
||||
b.Property<int>("PresenceId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
|
||||
|
||||
b.Property<DateOnly>("Date")
|
||||
.HasColumnType("date");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsAttedance")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("LessonNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("UserDaoUserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber");
|
||||
|
||||
b.HasIndex("UserDaoUserId");
|
||||
b.HasKey("PresenceId");
|
||||
|
||||
b.ToTable("PresenceDaos");
|
||||
});
|
||||
@ -91,17 +92,6 @@ namespace Demo.Migrations
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserDaoUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("UserDao");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
@ -7,7 +7,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
namespace Demo.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class InitialCreate : Migration
|
||||
public partial class InitialMigration : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
@ -25,6 +25,23 @@ namespace Demo.Migrations
|
||||
table.PrimaryKey("PK_Groups", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PresenceDaos",
|
||||
columns: table => new
|
||||
{
|
||||
PresenceId = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
UserId = table.Column<int>(type: "integer", nullable: false),
|
||||
IsAttedance = table.Column<bool>(type: "boolean", nullable: false),
|
||||
Date = table.Column<DateOnly>(type: "date", nullable: false),
|
||||
LessonNumber = table.Column<int>(type: "integer", nullable: false),
|
||||
GroupId = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PresenceDaos", x => x.PresenceId);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Users",
|
||||
columns: table => new
|
||||
@ -45,33 +62,6 @@ namespace Demo.Migrations
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PresenceDaos",
|
||||
columns: table => new
|
||||
{
|
||||
UserId = table.Column<int>(type: "integer", nullable: false),
|
||||
IsAttedance = table.Column<bool>(type: "boolean", nullable: false),
|
||||
Date = table.Column<DateOnly>(type: "date", nullable: false),
|
||||
LessonNumber = table.Column<int>(type: "integer", nullable: false),
|
||||
UserDaoUserId = table.Column<int>(type: "integer", nullable: false),
|
||||
GroupId = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PresenceDaos", x => new { x.UserId, x.Date, x.IsAttedance, x.LessonNumber });
|
||||
table.ForeignKey(
|
||||
name: "FK_PresenceDaos_Users_UserDaoUserId",
|
||||
column: x => x.UserDaoUserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "UserId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PresenceDaos_UserDaoUserId",
|
||||
table: "PresenceDaos",
|
||||
column: "UserDaoUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Users_GroupId",
|
||||
table: "Users",
|
@ -41,27 +41,28 @@ namespace Demo.Migrations
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.Property<int>("UserId")
|
||||
b.Property<int>("PresenceId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
|
||||
|
||||
b.Property<DateOnly>("Date")
|
||||
.HasColumnType("date");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<bool>("IsAttedance")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("LessonNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("UserDaoUserId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber");
|
||||
|
||||
b.HasIndex("UserDaoUserId");
|
||||
b.HasKey("PresenceId");
|
||||
|
||||
b.ToTable("PresenceDaos");
|
||||
});
|
||||
@ -88,17 +89,6 @@ namespace Demo.Migrations
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserDaoUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("UserDao");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
||||
|
@ -47,13 +47,6 @@ namespace Demo.UI
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveGroup(string groupIdStr)
|
||||
{
|
||||
int groupId = int.Parse(groupIdStr);
|
||||
_groupUseCase.RemoveGroupById(groupId);
|
||||
Console.WriteLine($"Группа с ID: {groupId} удалена");
|
||||
}
|
||||
|
||||
// Метод для обновления названия группы
|
||||
public void UpdateGroupName(int groupId, string newGroupName)
|
||||
{
|
||||
|
@ -1,6 +1,7 @@
|
||||
using Demo.domain.Models;
|
||||
using Demo.Domain.UseCase;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
@ -33,16 +34,15 @@ namespace Demo.UI
|
||||
Console.WriteLine("=-= Команды с Группами =-=");
|
||||
Console.WriteLine("5. Вывести все группы");
|
||||
Console.WriteLine("6. Добавить группу");
|
||||
Console.WriteLine("7. Удалить группу");
|
||||
Console.WriteLine("8. Изменить название группы");
|
||||
Console.WriteLine("9. Поиск группы по ID");
|
||||
Console.WriteLine("7. Изменить название группы");
|
||||
Console.WriteLine("8. Поиск группы по ID");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("=-= Команды Presence =-=");
|
||||
Console.WriteLine("10. Сгенерировать посещаемость на день");
|
||||
Console.WriteLine("11. Сгенерировать посещаемость на неделю");
|
||||
Console.WriteLine("12. Показать посещаемость");
|
||||
Console.WriteLine("13. Отметить пользователя как отсутствующего");
|
||||
Console.WriteLine("14. Вывести всю посещаемость группы");
|
||||
Console.WriteLine("9. Сгенерировать посещаемость на день");
|
||||
Console.WriteLine("10. Сгенерировать посещаемость на неделю");
|
||||
Console.WriteLine("11. Показать посещаемость");
|
||||
Console.WriteLine("12. Отметить пользователя как отсутствующего");
|
||||
Console.WriteLine("13. Вывести всю посещаемость группы");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("0. Выход");
|
||||
|
||||
@ -71,19 +71,19 @@ namespace Demo.UI
|
||||
}
|
||||
break;
|
||||
|
||||
//case "3":
|
||||
// // Обновление пользователя по ID
|
||||
// Console.Write("Введите ID пользователя для обновления: ");
|
||||
// string updateIdInput = Console.ReadLine();
|
||||
// if (int.TryParse(updateIdInput, out int updateUserId))
|
||||
// {
|
||||
// _userConsoleUI.UpdateUserById(updateUserId);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Console.WriteLine("Неверный формат ID");
|
||||
// }
|
||||
// break;
|
||||
case "3":
|
||||
// Обновление пользователя по ID
|
||||
Console.Write("Введите ID пользователя для обновления: ");
|
||||
string updateIdInput = Console.ReadLine();
|
||||
if (int.TryParse(updateIdInput, out int updateUserId))
|
||||
{
|
||||
_userConsoleUI.UpdateUserById(updateUserId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Неверный формат ID");
|
||||
}
|
||||
break;
|
||||
|
||||
case "4":
|
||||
// Поиск пользователя по ID
|
||||
@ -112,13 +112,6 @@ namespace Demo.UI
|
||||
break;
|
||||
|
||||
case "7":
|
||||
// Удаление группы
|
||||
Console.Write("Введите ID группы для удаления: ");
|
||||
string groupIdForDelete = Console.ReadLine();
|
||||
_groupConsoleUI.RemoveGroup(groupIdForDelete);
|
||||
break;
|
||||
|
||||
case "8":
|
||||
// Изменение названия группы
|
||||
Console.Write("Введите ID группы для изменения: ");
|
||||
if (int.TryParse(Console.ReadLine(), out int groupId))
|
||||
@ -133,7 +126,7 @@ namespace Demo.UI
|
||||
}
|
||||
break;
|
||||
|
||||
case "9":
|
||||
case "8":
|
||||
// Поиск группы
|
||||
Console.Write("Введите ID группы для поиска : ");
|
||||
if (int.TryParse(Console.ReadLine(), out int IdGroup))
|
||||
@ -142,7 +135,7 @@ namespace Demo.UI
|
||||
}
|
||||
break;
|
||||
|
||||
case "10":
|
||||
case "9":
|
||||
// Генерация посещаемости на день
|
||||
Console.Write("Введите номер первого занятия: ");
|
||||
int firstLesson = int.Parse(Console.ReadLine());
|
||||
@ -155,7 +148,7 @@ namespace Demo.UI
|
||||
Console.WriteLine("Посещаемость на день сгенерирована.");
|
||||
break;
|
||||
|
||||
case "11":
|
||||
case "10":
|
||||
// Генерация посещаемости на неделю
|
||||
Console.Write("Введите номер первого занятия: ");
|
||||
int firstLessonForWeek = int.Parse(Console.ReadLine());
|
||||
@ -168,7 +161,7 @@ namespace Demo.UI
|
||||
Console.WriteLine("Посещаемость на неделю сгенерирована.");
|
||||
break;
|
||||
|
||||
case "12":
|
||||
case "11":
|
||||
// Отображение посещаемости
|
||||
Console.Write("Введите дату (гггг-мм-дд): ");
|
||||
DateTime date = DateTime.Parse(Console.ReadLine());
|
||||
@ -178,7 +171,7 @@ namespace Demo.UI
|
||||
_presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
|
||||
break;
|
||||
|
||||
case "13":
|
||||
case "12":
|
||||
// Отметить пользователя как отсутствующего
|
||||
Console.Write("Введите ID пользователя: ");
|
||||
userId = int.Parse(Console.ReadLine());
|
||||
@ -189,11 +182,22 @@ namespace Demo.UI
|
||||
Console.Write("Введите ID группы: ");
|
||||
int absGroupId = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userId, firstAbsLesson, lastAbsLesson);
|
||||
Console.Write("Введите дату (дд.мм.гггг): ");
|
||||
string dateInput = Console.ReadLine();
|
||||
DateTime absenceDate;
|
||||
|
||||
if (!DateTime.TryParseExact(dateInput, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out absenceDate))
|
||||
{
|
||||
Console.WriteLine("Ошибка: Введен некорректный формат даты. Пожалуйста, используйте формат дд.мм.гггг.");
|
||||
return; // Завершает выполнение, если дата некорректна
|
||||
}
|
||||
_presenceConsoleUI.MarkUserAbsent(absenceDate, absGroupId, userId, firstAbsLesson, lastAbsLesson);
|
||||
Console.WriteLine("Пользователь отмечен как отсутствующий.");
|
||||
break;
|
||||
|
||||
case "14":
|
||||
|
||||
|
||||
case "13":
|
||||
Console.Write("Введите ID группы: ");
|
||||
int groupIdForAllPresence = int.Parse(Console.ReadLine());
|
||||
_presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence);
|
||||
|
@ -20,7 +20,7 @@ namespace Demo.UI
|
||||
{
|
||||
try
|
||||
{
|
||||
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date);
|
||||
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId);
|
||||
Console.WriteLine("Посещаемость на день успешно сгенерирована.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -56,26 +56,31 @@ namespace Demo.UI
|
||||
return;
|
||||
}
|
||||
|
||||
// Сортируем присутствия по номеру занятия и ID пользователя
|
||||
var sortedPresences = presences.OrderBy(p => p.LessonNumber)
|
||||
.ThenBy(p => p.UserId);
|
||||
|
||||
Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:");
|
||||
Console.WriteLine("---------------------------------------------");
|
||||
int a = presences[0].LessonNumber;
|
||||
foreach (var presence in presences)
|
||||
|
||||
int previousLessonNumber = -1; // Инициализация для сравнения
|
||||
foreach (var presence in sortedPresences)
|
||||
{
|
||||
if (a != presence.LessonNumber)
|
||||
if (previousLessonNumber != presence.LessonNumber)
|
||||
{
|
||||
Console.WriteLine("---------------------------------------------");
|
||||
a = presence.LessonNumber;
|
||||
previousLessonNumber = presence.LessonNumber;
|
||||
}
|
||||
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
|
||||
Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
|
||||
}
|
||||
Console.WriteLine("---------------------------------------------");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson)
|
||||
@ -90,14 +95,15 @@ namespace Demo.UI
|
||||
{
|
||||
try
|
||||
{
|
||||
// Получаем все посещения для группы
|
||||
var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);
|
||||
|
||||
if (presences == null || !presences.Any())
|
||||
if (presences == null || presences.Count == 0)
|
||||
{
|
||||
Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует.");
|
||||
return;
|
||||
}
|
||||
int a = presences[0].LessonNumber;
|
||||
|
||||
// Группируем по дате
|
||||
var groupedPresences = presences.GroupBy(p => p.Date);
|
||||
|
||||
@ -107,20 +113,30 @@ namespace Demo.UI
|
||||
Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}");
|
||||
Console.WriteLine("===================================================");
|
||||
|
||||
foreach (var presence in group)
|
||||
// Группируем по занятию
|
||||
var groupedByLesson = group.GroupBy(p => p.LessonNumber);
|
||||
|
||||
foreach (var lessonGroup in groupedByLesson)
|
||||
{
|
||||
if (a != presence.LessonNumber)
|
||||
Console.WriteLine($"Занятие {lessonGroup.Key}:");
|
||||
|
||||
// Создаем HashSet для уникальных пользователей
|
||||
var userIds = new HashSet<int>();
|
||||
|
||||
foreach (var presence in lessonGroup)
|
||||
{
|
||||
// Проверяем, добавляется ли пользователь в HashSet
|
||||
if (userIds.Add(presence.UserId))
|
||||
{
|
||||
Console.WriteLine("---------------------------------------------------");
|
||||
a= presence.LessonNumber;
|
||||
}
|
||||
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
|
||||
Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
|
||||
Console.WriteLine($"Пользователь ID: {presence.UserId}, Статус: {status}");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine("---------------------------------------------------");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
|
||||
|
@ -36,26 +36,27 @@ namespace Demo.UI
|
||||
}
|
||||
|
||||
// Метод для обновления пользователя по ID
|
||||
//public void UpdateUserById(int userId)
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// var user = _userUseCase.FindUserById(userId);
|
||||
public void UpdateUserById(int userId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var user = _userUseCase.FindUserById(userId);
|
||||
|
||||
// Console.WriteLine($"Текущие данные: {user.FIO}, {user.Group.Name}");
|
||||
// Console.Write("\nВведите новое ФИО: ");
|
||||
// string newFIO = Console.ReadLine();
|
||||
|
||||
// user.FIO = newFIO;
|
||||
// _userUseCase.UpdateUser(user);
|
||||
Console.WriteLine($"Текущие данные: {user.FIO}");
|
||||
Console.Write("\nВведите новое ФИО: ");
|
||||
string newFIO = Console.ReadLine();
|
||||
|
||||
// Console.WriteLine("\nПользователь обновлен.\n");
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||
// }
|
||||
//}
|
||||
user.FIO = newFIO;
|
||||
_userUseCase.UpdateUser(user);
|
||||
|
||||
Console.WriteLine("\nПользователь обновлен.\n");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Метод для поиска пользователя по ID
|
||||
public void FindUserById(int userId)
|
||||
@ -63,7 +64,7 @@ namespace Demo.UI
|
||||
var user = _userUseCase.FindUserById(userId);
|
||||
if (user != null)
|
||||
{
|
||||
Console.WriteLine($"\nПользователь найден: {user.ID}, {user.FIO}, {user.Group.Name}\n");
|
||||
Console.WriteLine($"\nПользователь найден: {user.UserId}, {user.FIO}, {user.Group.Name}\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -14,7 +14,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Demo")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4aa192ee8817fa90eef0a643199a140baea5f367")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5f424596e2b0fa84375965a237d76913c98a016f")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Demo")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Demo")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
@ -1 +1 @@
|
||||
d0ff50a2b7329f08a99a7d850fd97c7e85ea6c3c244d5b7af843a712fd92af39
|
||||
e42cc116f635190b7c9988c97519c211c4b2432424ca6ac866ba04673b9f3fa7
|
||||
|
@ -1 +1 @@
|
||||
30504035d845e5616feb21a777025026c55555e88052b83a111a265004d6549d
|
||||
1e41011bf1bd18b43960533c1b9a8180853e639316cffb41dabd64b373687e5e
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user