From 46b171eab8cce81ee784fcdb7be15fe40799d777 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 21 Apr 2025 12:00:17 +0300 Subject: [PATCH] 210425 --- .idea/.idea.presence/.idea/.gitignore | 13 ++ .idea/.idea.presence/.idea/avalonia.xml | 10 ++ .idea/.idea.presence/.idea/encodings.xml | 4 + .idea/.idea.presence/.idea/indexLayout.xml | 8 + .idea/.idea.presence/.idea/vcs.xml | 6 + .../DI/ServiceColletionExtensions.cs | 2 + Presence.Desktop/Models/PresencePresenter.cs | 5 +- .../ViewModels/PresenceViewModel.cs | 160 ++++++++++++++++-- Presence.Desktop/ViewModels/StartViewModel.cs | 7 +- Presence.Desktop/Views/PresenceView.axaml | 37 +++- .../bin/Debug/net8.0/Presence.Desktop.dll | Bin 58880 -> 70144 bytes .../bin/Debug/net8.0/Presence.Desktop.pdb | Bin 24680 -> 26136 bytes Presence.Desktop/bin/Debug/net8.0/data.dll | Bin 25088 -> 26112 bytes Presence.Desktop/bin/Debug/net8.0/data.pdb | Bin 17392 -> 17540 bytes Presence.Desktop/bin/Debug/net8.0/domain.dll | Bin 30720 -> 31232 bytes Presence.Desktop/bin/Debug/net8.0/domain.pdb | Bin 21508 -> 21560 bytes .../net8.0/Avalonia/Presence.Desktop.dll | Bin 58880 -> 70144 bytes .../net8.0/Avalonia/Presence.Desktop.pdb | Bin 24680 -> 26136 bytes .../obj/Debug/net8.0/Avalonia/resources | Bin 8033 -> 10288 bytes .../net8.0/Presence.Desktop.AssemblyInfo.cs | 4 +- .../Presence.Desktop.AssemblyInfoInputs.cache | 2 +- ...nce.Desktop.csproj.AssemblyReference.cache | Bin 25702 -> 25702 bytes .../obj/Debug/net8.0/Presence.Desktop.dll | Bin 33792 -> 39936 bytes .../obj/Debug/net8.0/Presence.Desktop.pdb | Bin 23208 -> 24356 bytes .../obj/Debug/net8.0/ref/Presence.Desktop.dll | Bin 12288 -> 13312 bytes .../refint/Avalonia/Presence.Desktop.dll | Bin 12288 -> 13312 bytes .../Debug/net8.0/refint/Presence.Desktop.dll | Bin 12800 -> 13824 bytes Presence.Desktop/obj/project.packagespec.json | 1 + .../obj/rider.project.model.nuget.info | 1 + .../obj/rider.project.restore.info | 1 + .../Debug/net8.0/console_ui.AssemblyInfo.cs | 2 +- .../console_ui.AssemblyInfoInputs.cache | 2 +- .../console_ui.csproj.AssemblyReference.cache | Bin 11860 -> 11209 bytes console_ui/obj/project.packagespec.json | 1 + console_ui/obj/rider.project.model.nuget.info | 1 + console_ui/obj/rider.project.restore.info | 1 + .../RemoteDataBase/RemoteDataBaseContext.cs | 2 +- data/Repository/IPresenceRepository.cs | 1 + data/Repository/PresenceRepositoryImpl.cs | 16 ++ data/bin/Debug/net8.0/data.dll | Bin 25088 -> 26112 bytes data/bin/Debug/net8.0/data.pdb | Bin 17392 -> 17540 bytes data/obj/Debug/net8.0/data.AssemblyInfo.cs | 4 +- .../net8.0/data.AssemblyInfoInputs.cache | 2 +- data/obj/Debug/net8.0/data.dll | Bin 25088 -> 26112 bytes data/obj/Debug/net8.0/data.pdb | Bin 17392 -> 17540 bytes data/obj/Debug/net8.0/ref/data.dll | Bin 11776 -> 12288 bytes data/obj/Debug/net8.0/refint/data.dll | Bin 11776 -> 12288 bytes data/obj/project.packagespec.json | 1 + data/obj/rider.project.model.nuget.info | 1 + data/obj/rider.project.restore.info | 1 + domain/UseCase/IPresenceUseCase.cs | 1 + domain/UseCase/PresenceUseCase.cs | 6 + domain/bin/Debug/net8.0/data.dll | Bin 25088 -> 26112 bytes domain/bin/Debug/net8.0/data.pdb | Bin 17392 -> 17540 bytes domain/bin/Debug/net8.0/domain.dll | Bin 30720 -> 31232 bytes domain/bin/Debug/net8.0/domain.pdb | Bin 21508 -> 21560 bytes .../obj/Debug/net8.0/domain.AssemblyInfo.cs | 4 +- .../net8.0/domain.AssemblyInfoInputs.cache | 2 +- .../domain.csproj.AssemblyReference.cache | Bin 11106 -> 11106 bytes domain/obj/Debug/net8.0/domain.dll | Bin 30720 -> 31232 bytes domain/obj/Debug/net8.0/domain.pdb | Bin 21508 -> 21560 bytes domain/obj/Debug/net8.0/ref/domain.dll | Bin 14848 -> 14848 bytes domain/obj/Debug/net8.0/refint/domain.dll | Bin 14848 -> 14848 bytes domain/obj/project.packagespec.json | 1 + domain/obj/rider.project.model.nuget.info | 1 + domain/obj/rider.project.restore.info | 1 + .../Debug/net8.0/presence_api.AssemblyInfo.cs | 2 +- .../presence_api.AssemblyInfoInputs.cache | 2 +- ...resence_api.csproj.AssemblyReference.cache | Bin 11011 -> 11011 bytes presence_api/obj/project.packagespec.json | 1 + .../obj/rider.project.model.nuget.info | 1 + presence_api/obj/rider.project.restore.info | 1 + ui/obj/Debug/net8.0/ui.AssemblyInfo.cs | 2 +- .../Debug/net8.0/ui.AssemblyInfoInputs.cache | 2 +- .../net8.0/ui.csproj.AssemblyReference.cache | Bin 10668 -> 10668 bytes ui/obj/project.packagespec.json | 1 + ui/obj/rider.project.model.nuget.info | 1 + ui/obj/rider.project.restore.info | 1 + 78 files changed, 291 insertions(+), 35 deletions(-) create mode 100644 .idea/.idea.presence/.idea/.gitignore create mode 100644 .idea/.idea.presence/.idea/avalonia.xml create mode 100644 .idea/.idea.presence/.idea/encodings.xml create mode 100644 .idea/.idea.presence/.idea/indexLayout.xml create mode 100644 .idea/.idea.presence/.idea/vcs.xml create mode 100644 Presence.Desktop/obj/project.packagespec.json create mode 100644 Presence.Desktop/obj/rider.project.model.nuget.info create mode 100644 Presence.Desktop/obj/rider.project.restore.info create mode 100644 console_ui/obj/project.packagespec.json create mode 100644 console_ui/obj/rider.project.model.nuget.info create mode 100644 console_ui/obj/rider.project.restore.info create mode 100644 data/obj/project.packagespec.json create mode 100644 data/obj/rider.project.model.nuget.info create mode 100644 data/obj/rider.project.restore.info create mode 100644 domain/obj/project.packagespec.json create mode 100644 domain/obj/rider.project.model.nuget.info create mode 100644 domain/obj/rider.project.restore.info create mode 100644 presence_api/obj/project.packagespec.json create mode 100644 presence_api/obj/rider.project.model.nuget.info create mode 100644 presence_api/obj/rider.project.restore.info create mode 100644 ui/obj/project.packagespec.json create mode 100644 ui/obj/rider.project.model.nuget.info create mode 100644 ui/obj/rider.project.restore.info diff --git a/.idea/.idea.presence/.idea/.gitignore b/.idea/.idea.presence/.idea/.gitignore new file mode 100644 index 0000000..0a0f6f6 --- /dev/null +++ b/.idea/.idea.presence/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/.idea.presence.iml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.presence/.idea/avalonia.xml b/.idea/.idea.presence/.idea/avalonia.xml new file mode 100644 index 0000000..09200b8 --- /dev/null +++ b/.idea/.idea.presence/.idea/avalonia.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/encodings.xml b/.idea/.idea.presence/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.presence/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/indexLayout.xml b/.idea/.idea.presence/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.presence/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/vcs.xml b/.idea/.idea.presence/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.presence/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Presence.Desktop/DI/ServiceColletionExtensions.cs b/Presence.Desktop/DI/ServiceColletionExtensions.cs index 195bfff..481aa11 100644 --- a/Presence.Desktop/DI/ServiceColletionExtensions.cs +++ b/Presence.Desktop/DI/ServiceColletionExtensions.cs @@ -21,8 +21,10 @@ using System.Threading.Tasks; .AddDbContext() .AddSingleton() .AddSingleton() + .AddTransient() .AddTransient() .AddTransient() + .AddTransient() .AddTransient(); } } diff --git a/Presence.Desktop/Models/PresencePresenter.cs b/Presence.Desktop/Models/PresencePresenter.cs index 9a3b930..e295cda 100644 --- a/Presence.Desktop/Models/PresencePresenter.cs +++ b/Presence.Desktop/Models/PresencePresenter.cs @@ -10,10 +10,13 @@ using System.Threading.Tasks; { public class PresencePresenter { - public int UserGuid { get; set; } + public Guid UserGuid { get; set; } public bool IsAttedance {get; set; } public DateOnly Date {get; set; } public int LessonNumber {get; set; } public UserPresenter? user { get; set; } + +//для будущего решения + public string AttendanceStatus { get; set; } } } \ No newline at end of file diff --git a/Presence.Desktop/ViewModels/PresenceViewModel.cs b/Presence.Desktop/ViewModels/PresenceViewModel.cs index 43d9d41..3df1888 100644 --- a/Presence.Desktop/ViewModels/PresenceViewModel.cs +++ b/Presence.Desktop/ViewModels/PresenceViewModel.cs @@ -1,24 +1,152 @@ +// using System.Reactive; +// using ReactiveUI; + +// namespace Presence.Desktop.ViewModels; + +// public class PresenceViewModel: ViewModelBase, IRoutableViewModel +// { +// public string? UrlPathSegment { get; } +// public IScreen HostScreen { get; } + +// public ReactiveCommand GoBackCommand { get; } + +// public PresenceViewModel(IScreen hostScreen) +// { +// HostScreen = hostScreen; + +// GoBackCommand = ReactiveCommand.Create(() => +// { +// HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); +// }); +// } +// } + +using System; using System.Reactive; using ReactiveUI; +using Demo.Domain.Models; +using Demo.Domain.UseCase; +using System.Collections.ObjectModel; +using Presence.Desktop.Models; -namespace Presence.Desktop.ViewModels; - -public class PresenceViewModel: ViewModelBase, IRoutableViewModel +namespace Presence.Desktop.ViewModels { - public string? UrlPathSegment { get; } - public IScreen HostScreen { get; } - - public ReactiveCommand GoBackCommand { get; } - - public PresenceViewModel(IScreen hostScreen) + public class PresenceViewModel : ViewModelBase, IRoutableViewModel { - HostScreen = hostScreen; + public string? UrlPathSegment { get; } + public IScreen HostScreen { get; } - GoBackCommand = ReactiveCommand.Create(() => + public ReactiveCommand GoBackCommand { get; } + public ReactiveCommand FilterAttendanceCommand { get; } + + public ObservableCollection AttendanceRecords { get; set; } = new(); + public ObservableCollection Groups { get; set; } = new(); + public ObservableCollection AttendanceTypes { get; set; } = new() { - HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); - }); - } -} + "Присутствовал", + "Отсутствовал", + }; - \ No newline at end of file + private Group? _selectedGroup; + public Group? SelectedGroup + { + get => _selectedGroup; + set + { + this.RaiseAndSetIfChanged(ref _selectedGroup, value); + FilterAttendanceRecords(); + } + } + + private DateTime? _selectedDate; + public DateTime? SelectedDate + { + get => _selectedDate; + set + { + this.RaiseAndSetIfChanged(ref _selectedDate, value); + FilterAttendanceRecords(); + } + } + + private readonly IGroupUseCase _groupUseCase; + private readonly IPresenceUseCase _presenceUseCase; + + public PresenceViewModel(IScreen hostScreen, IGroupUseCase groupUseCase, IPresenceUseCase presenceUseCase) + { + HostScreen = hostScreen; + _groupUseCase = groupUseCase; + _presenceUseCase = presenceUseCase; + + GoBackCommand = ReactiveCommand.Create(() => + { + HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); + }); + + FilterAttendanceCommand = ReactiveCommand.Create(FilterAttendanceRecords); + + LoadGroups(); + } + + private void LoadGroups() + { + Groups.Clear(); + var groups = _groupUseCase.GetAllGroups(); + foreach (var group in groups) + { + Groups.Add(group); + } + } + + private void FilterAttendanceRecords() + { + if (SelectedGroup == null || SelectedDate == null) + { + AttendanceRecords.Clear(); + return; + } + + var dateOnly = DateOnly.FromDateTime(SelectedDate.Value); + + var records = _presenceUseCase.GetPresenceByGroupByTime( + SelectedGroup.ID, + dateOnly); + + AttendanceRecords.Clear(); + foreach (var record in records) + { + // Преобразуем значение IsAttedance в строку прямо здесь + var attendanceStatus = record.IsAttedance ? "Был на уроке" : "Не был на уроке"; + + AttendanceRecords.Add(new PresencePresenter + { + UserGuid = record.User.Guid, + IsAttedance = record.IsAttedance, // оставляем bool в модели + Date = record.Date, + LessonNumber = record.LessonNumber, + user = new UserPresenter + { + Name = record.User.FIO, + Guid = record.User.Guid + }, + AttendanceStatus = attendanceStatus // добавляем строковое представление + }); + } + } + + // Новый метод для обработки изменения типа посещаемости + public void OnAttendanceTypeChanged(PresencePresenter presence, string newType) + { + presence.IsAttedance = newType == "Присутствовал"; + + if (_presenceUseCase.UpdateAttendance(presence.LessonNumber, presence.Date, presence.UserGuid, presence.IsAttedance)) + { + Console.WriteLine($"Изменен тип посещаемости для {presence.user.Name}: {newType}"); + } + else + { + Console.WriteLine($"Не удалось обновить тип посещаемости для {presence.user.Name}"); + } + } + } +} \ No newline at end of file diff --git a/Presence.Desktop/ViewModels/StartViewModel.cs b/Presence.Desktop/ViewModels/StartViewModel.cs index 59acc9b..fff4d35 100644 --- a/Presence.Desktop/ViewModels/StartViewModel.cs +++ b/Presence.Desktop/ViewModels/StartViewModel.cs @@ -30,7 +30,12 @@ namespace Presence.Desktop.ViewModels OpenPresenceCommand = ReactiveCommand.Create(() => { - HostScreen.Router.Navigate.Execute(new PresenceViewModel(HostScreen)); + // HostScreen.Router.Navigate.Execute(new PresenceViewModel(HostScreen)); + HostScreen.Router.Navigate.Execute(new PresenceViewModel( + HostScreen, + App.ServiceProvider.GetRequiredService(), + App.ServiceProvider.GetRequiredService() + )); }); GoBackCommand = ReactiveCommand.Create(() => diff --git a/Presence.Desktop/Views/PresenceView.axaml b/Presence.Desktop/Views/PresenceView.axaml index 78c3215..7cf5fb9 100644 --- a/Presence.Desktop/Views/PresenceView.axaml +++ b/Presence.Desktop/Views/PresenceView.axaml @@ -1,4 +1,4 @@ - + --> + + + +