diff --git a/Policlinica/DB/RecordRep.cs b/Policlinica/DB/RecordRep.cs index c580a86..4ec9361 100644 --- a/Policlinica/DB/RecordRep.cs +++ b/Policlinica/DB/RecordRep.cs @@ -77,8 +77,7 @@ public class RecordRep:BaseRep mc.ExecuteNonQuery(); Console.WriteLine($"ExecuteNonQuery returned"); } - - // Получаем ID последней вставленной записи + string lastIdSql = "SELECT LAST_INSERT_ID() as last_id"; using (var mc = new MySqlCommand(lastIdSql, connection)) { @@ -117,11 +116,44 @@ public class RecordRep:BaseRep return -1; } + public bool UpdateRecord(Record record) + { + string sql = @"update `records` + set client_name = @client_name, + client_surname = @client_surname, + doctor_id = @doctor_id, + service_id = @service_id, + total_amount = @total_amount, + record_date = @record_date + where id = @id"; + try + { + using (var mc = new MySqlCommand(sql, connection)) + { + mc.Parameters.AddWithValue("@id", record.Id); + mc.Parameters.AddWithValue("@client_name", record.ClientName ?? ""); + mc.Parameters.AddWithValue("@client_surname", record.ClientSurname ?? ""); + mc.Parameters.AddWithValue("@doctor_id", record.DoctorId); + mc.Parameters.AddWithValue("@service_id", record.ServiceId); + mc.Parameters.AddWithValue("@total_amount", record.TotalAmount); + mc.Parameters.AddWithValue("@record_date", record.RecordDate); + + int rows = mc.ExecuteNonQuery(); + Console.WriteLine($"Updated {rows} rows"); + return rows > 0; + } + } + catch (Exception e) + { + Console.WriteLine($"Error updating record: {e}"); + } + return false; + } + public bool Delete(int id) { try { - // Сначала удаляем все связанные record_items string deleteItemsSql = @"delete from `record_items` where `record_id` = @id"; using (var mc = new MySqlCommand(deleteItemsSql, connection)) { @@ -129,8 +161,7 @@ public class RecordRep:BaseRep mc.ExecuteNonQuery(); Console.WriteLine($"Deleted record items for record {id}"); } - - // Затем удаляем саму запись + string deleteRecordSql = @"delete from `records` where `id` = @id"; using (var mc = new MySqlCommand(deleteRecordSql, connection)) { diff --git a/Policlinica/DB/ServiceRepository.cs b/Policlinica/DB/ServiceRepository.cs index ab7edc9..a879564 100644 --- a/Policlinica/DB/ServiceRepository.cs +++ b/Policlinica/DB/ServiceRepository.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Options; using MySqlConnector; @@ -82,9 +82,43 @@ public class ServiceRepository : BaseRep return s; } + + public List GetServicesByTest() + { + List result = new List(); + string sql = "select * from services"; + try + { + using (var mc = new MySqlCommand(sql, connection)) + using (var dr = mc.ExecuteReader()) + { + while (dr.Read()) + { + result.Add(new Service + { + Id = dr.GetInt32("id"), + DoctorId = dr.GetInt32("doctor_id"), + ServiceName = dr.GetString("service_name"), + Price = dr.GetDecimal("price"), + }); + } + } + } + catch (MySqlException ex) + { + Console.WriteLine(ex); + } + catch (Exception e) + { + Console.WriteLine(e); + } + + return result; + } + public void Dispose() { base.Dispose(); CloseConnection(); } -} \ No newline at end of file +} diff --git a/Policlinica/Program.cs b/Policlinica/Program.cs index 997278f..6f11bc8 100644 --- a/Policlinica/Program.cs +++ b/Policlinica/Program.cs @@ -28,7 +28,6 @@ sealed class Program s.Configure(c.Configuration. GetSection("DatabaseConnection")); - //окна s.AddTransient(); s.AddTransient(); @@ -51,8 +50,7 @@ sealed class Program s.AddTransient(); s.AddTransient(); - // s.AddTransient(); - //Репозитории + s.AddTransient(); s.AddTransient(); diff --git a/Policlinica/ViewModels/AdminViewModel.cs b/Policlinica/ViewModels/AdminViewModel.cs index 679ac2f..31f32f2 100644 --- a/Policlinica/ViewModels/AdminViewModel.cs +++ b/Policlinica/ViewModels/AdminViewModel.cs @@ -18,23 +18,36 @@ public partial class AdminViewModel : ViewModelBase private readonly RecordRep _recordRep; private readonly User _user; private readonly UserRepository _userRepository; + private readonly DoctorRepository _doctorRepository; + private readonly ServiceRepository _serviceRepository; + [ObservableProperty] string _login; [ObservableProperty] int _id; [ObservableProperty] ObservableCollection _recordsList = new(); [ObservableProperty] private Record _selectedRecord; [ObservableProperty] private ObservableCollection userList = new ObservableCollection(); [ObservableProperty] string statusMessage = ""; + + [ObservableProperty] string editClientName = ""; + [ObservableProperty] string editClientSurname = ""; + [ObservableProperty] ObservableCollection doctorList = new(); + [ObservableProperty] Doctor editSelectedDoctor; + [ObservableProperty] ObservableCollection editServiceList = new(); + [ObservableProperty] Service editSelectedService; + [ObservableProperty] decimal editTotalAmount = 0; + [ObservableProperty] string editRecordDate = ""; - public AdminViewModel(Navigation navigation, IServiceProvider provider, RecordRep recordRep,User user,UserRepository userRepository) + public AdminViewModel(Navigation navigation, IServiceProvider provider, RecordRep recordRep, User user, UserRepository userRepository, DoctorRepository doctorRepository, ServiceRepository serviceRepository) { - _navigation = navigation; _provider = provider; _recordRep = recordRep; _user = user; _userRepository = userRepository; + _doctorRepository = doctorRepository; + _serviceRepository = serviceRepository; - UserList = new ObservableCollection(userRepository.GetUserId(user.Login,user.Password)); + UserList = new ObservableCollection(userRepository.GetUserId(user.Login, user.Password)); foreach (var obj in UserList) { @@ -42,6 +55,107 @@ public partial class AdminViewModel : ViewModelBase } RecordsList = new ObservableCollection(recordRep.GetRecord(Id)); + DoctorList = new ObservableCollection(doctorRepository.GetDoctorsByTest()); + } + + partial void OnSelectedRecordChanged(Record value) + { + if (value != null) + { + EditClientName = value.ClientName; + EditClientSurname = value.ClientSurname; + EditSelectedDoctor = DoctorList.FirstOrDefault(d => d.Id == value.DoctorId); + EditTotalAmount = value.TotalAmount; + EditRecordDate = value.RecordDate.ToString("yyyy-MM-dd"); + } + } + + partial void OnEditSelectedDoctorChanged(Doctor value) + { + if (value != null) + { + var services = _serviceRepository.GetServicesByDoctors(value.Id); + EditServiceList = new ObservableCollection(services); + EditSelectedService = null; + } + else + { + EditServiceList.Clear(); + EditSelectedService = null; + } + } + + partial void OnEditSelectedServiceChanged(Service value) + { + if (value != null) + { + EditTotalAmount = value.Price; + } + } + + [RelayCommand] + void UpdateRecord() + { + if (SelectedRecord == null) + { + StatusMessage = "Выберите запись для обновления"; + return; + } + + if (string.IsNullOrWhiteSpace(EditClientName) || string.IsNullOrWhiteSpace(EditClientSurname)) + { + StatusMessage = "Имя и фамилия клиента обязательны"; + return; + } + + if (EditSelectedDoctor == null || EditSelectedService == null) + { + StatusMessage = "Выберите врача и услугу"; + return; + } + + try + { + SelectedRecord.ClientName = EditClientName; + SelectedRecord.ClientSurname = EditClientSurname; + SelectedRecord.DoctorId = EditSelectedDoctor.Id; + SelectedRecord.ServiceId = EditSelectedService.Id; + SelectedRecord.TotalAmount = EditTotalAmount; + + if (DateTime.TryParse(EditRecordDate, out DateTime recordDate)) + { + SelectedRecord.RecordDate = recordDate; + } + + bool updated = _recordRep.UpdateRecord(SelectedRecord); + if (updated) + { + StatusMessage = "Запись успешно обновлена"; + RecordsList = new ObservableCollection(_recordRep.GetRecord(Id)); + SelectedRecord = null; + ClearEditFields(); + } + else + { + StatusMessage = "Ошибка при обновлении записи"; + } + } + catch (Exception ex) + { + StatusMessage = $"Ошибка: {ex.Message}"; + Console.WriteLine($"Error updating record: {ex}"); + } + } + + private void ClearEditFields() + { + EditClientName = ""; + EditClientSurname = ""; + EditSelectedDoctor = null; + EditServiceList.Clear(); + EditSelectedService = null; + EditTotalAmount = 0; + EditRecordDate = ""; } [RelayCommand] @@ -61,6 +175,8 @@ public partial class AdminViewModel : ViewModelBase { StatusMessage = "Запись успешно удалена"; RecordsList = new ObservableCollection(_recordRep.GetRecord(Id)); + SelectedRecord = null; + ClearEditFields(); } else { diff --git a/Policlinica/ViewModels/AutorizationViewModel.cs b/Policlinica/ViewModels/AutorizationViewModel.cs index 1d3496e..bbc5de8 100644 --- a/Policlinica/ViewModels/AutorizationViewModel.cs +++ b/Policlinica/ViewModels/AutorizationViewModel.cs @@ -40,8 +40,7 @@ public partial class AutorizationViewModel : ViewModelBase Eror = "Неверный логин или пароль"; return; } - - // Копируем все данные авторизованного пользователя в синглтон + _user.Id = SpUser[0].Id; _user.Name = SpUser[0].Name; _user.Surname = SpUser[0].Surname; diff --git a/Policlinica/ViewModels/RecordItemsViewModel.cs b/Policlinica/ViewModels/RecordItemsViewModel.cs index e7c00f7..763c0da 100644 --- a/Policlinica/ViewModels/RecordItemsViewModel.cs +++ b/Policlinica/ViewModels/RecordItemsViewModel.cs @@ -41,7 +41,6 @@ public partial class RecordItemsViewModel : ViewModelBase clientName = name; clientSurname = surname; - // Расчет общей суммы totalAmount = selectedServices.Sum(s => s.Price); } @@ -62,12 +61,10 @@ public partial class RecordItemsViewModel : ViewModelBase try { - // Используем первую услугу int mainServiceId = selectedServices[0].Id; Console.WriteLine($"Main service ID: {mainServiceId}"); Console.WriteLine($"Selected services count: {selectedServices.Count}"); - - // Создаем запись с данными КЛИЕНТА + var record = new Record { ClientName = clientName, @@ -80,8 +77,7 @@ public partial class RecordItemsViewModel : ViewModelBase }; Console.WriteLine($"Saving record: Name={record.ClientName}, Surname={record.ClientSurname}, DoctorId={record.DoctorId}, UserId={record.UserId}, ServiceId={record.ServiceId}"); - - // Сохраняем запись в БД и получаем ID + int recordId = _recordRepository.InsertRecord(record); if (recordId <= 0) @@ -92,8 +88,7 @@ public partial class RecordItemsViewModel : ViewModelBase } Console.WriteLine($"Record saved with ID: {recordId}"); - - // Сохраняем все выбранные услуги в record_items + foreach (var service in selectedServices) { Console.WriteLine($"Saving record item for service: {service.Id} (price: {service.Price})"); @@ -114,7 +109,6 @@ public partial class RecordItemsViewModel : ViewModelBase StatusMessage = "Запись успешно сохранена!"; - // Переходим в админ-панель var vm = ActivatorUtilities.CreateInstance(_provider); _navigation.Navigate(vm); } diff --git a/Policlinica/ViewModels/RegistrationViewModel.cs b/Policlinica/ViewModels/RegistrationViewModel.cs index 00f6417..5d4b672 100644 --- a/Policlinica/ViewModels/RegistrationViewModel.cs +++ b/Policlinica/ViewModels/RegistrationViewModel.cs @@ -56,12 +56,7 @@ public partial class RegistrationViewModel : ViewModelBase { rep.AddUser(user); } - - // var vm = ActivatorUtilities.CreateInstance(_serviceProvider); - // var win = _serviceProvider.GetRequiredService(); - //win.DataContext = vm; - //win.Show(); - //_navigation.Close(); + var vm = _serviceProvider.GetRequiredService(); _navigation.Navigate(vm); } diff --git a/Policlinica/ViewModels/ServiceViewModel.cs b/Policlinica/ViewModels/ServiceViewModel.cs index 5af1f64..e20c093 100644 --- a/Policlinica/ViewModels/ServiceViewModel.cs +++ b/Policlinica/ViewModels/ServiceViewModel.cs @@ -35,7 +35,6 @@ public partial class ServiceViewModel : ViewModelBase surname = clientSurname; Services = new ObservableCollection(repository.GetServicesByDoctors(selectedDoctor.Id).Select(service => new ServiceSelected(service)).ToList()); - //Console.WriteLine(CurrentUser.login); } @@ -54,15 +53,11 @@ public partial class ServiceViewModel : ViewModelBase if (selectedServices.Count == 0) { - // Можно добавить уведомление об ошибке return; } - - // Получаем репозитории для передачи в ViewModel + var recordRepository = _provider.GetRequiredService(); var recordItemsRepository = _provider.GetRequiredService(); - - // Создаем ViewModel для показа подтверждения записи var vm = ActivatorUtilities.CreateInstance(_provider, _navigation, _selectedDoctor, selectedServices, recordRepository, recordItemsRepository, Name, Surname); diff --git a/Policlinica/ViewModels/SugarCheckViewModel.cs b/Policlinica/ViewModels/SugarCheckViewModel.cs index a8f30df..b20beaf 100644 --- a/Policlinica/ViewModels/SugarCheckViewModel.cs +++ b/Policlinica/ViewModels/SugarCheckViewModel.cs @@ -35,8 +35,7 @@ public partial class SugarCheckViewModel : ViewModelBase StatusMessage = "Ошибка: вид не инициализирован"; return; } - - // Получаем значения из TextBox'ов + var weightInput = _view.FindControl("WeightInput"); var heightInput = _view.FindControl("HeightInput"); @@ -61,7 +60,6 @@ public partial class SugarCheckViewModel : ViewModelBase try { - // Расчет BMI (индекс массы тела) decimal heightInMeters = height / 100; decimal bmi = weight / (heightInMeters * heightInMeters); diff --git a/Policlinica/Views/AdminView.axaml b/Policlinica/Views/AdminView.axaml index 3c4629f..300d592 100644 --- a/Policlinica/Views/AdminView.axaml +++ b/Policlinica/Views/AdminView.axaml @@ -3,51 +3,112 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Policlinica.ViewModels" - mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="700" + mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="900" x:Class="Policlinica.Views.AdminView" x:DataType="viewModels:AdminViewModel"> + + + + + - - - - - - - - - - - - - - - - - - - - - - -