258 lines
8.3 KiB
C#
258 lines
8.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using Avalonia.Controls;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Policlinica.DB;
|
|
using Policlinica.Views;
|
|
|
|
|
|
namespace Policlinica.ViewModels;
|
|
|
|
public partial class AdminViewModel : ViewModelBase
|
|
{
|
|
private readonly Navigation _navigation;
|
|
private readonly IServiceProvider _provider;
|
|
private readonly RecordRep _recordRep;
|
|
private readonly User _user;
|
|
private readonly UserRepository _userRepository;
|
|
private readonly DoctorRepository _doctorRepository;
|
|
private readonly ServiceRepository _serviceRepository;
|
|
private List<Record> _allRecords; // Сохраняем все записи для поиска
|
|
|
|
[ObservableProperty] string _login;
|
|
[ObservableProperty] int _id;
|
|
[ObservableProperty] ObservableCollection<Record> _recordsList = new();
|
|
[ObservableProperty] private Record _selectedRecord;
|
|
[ObservableProperty] private ObservableCollection<User> userList = new ObservableCollection<User>();
|
|
[ObservableProperty] string statusMessage = "";
|
|
[ObservableProperty] string searchText = "";
|
|
|
|
[ObservableProperty] string editClientName = "";
|
|
[ObservableProperty] string editClientSurname = "";
|
|
[ObservableProperty] ObservableCollection<Doctor> doctorList = new();
|
|
[ObservableProperty] Doctor editSelectedDoctor;
|
|
[ObservableProperty] ObservableCollection<Service> editServiceList = new();
|
|
[ObservableProperty] Service editSelectedService;
|
|
[ObservableProperty] decimal editTotalAmount = 0;
|
|
[ObservableProperty] string editRecordDate = "";
|
|
|
|
private Action _closeAction;
|
|
|
|
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<User>(userRepository.GetUserId(user.Login, user.Password));
|
|
|
|
foreach (var obj in UserList)
|
|
{
|
|
Id = obj.Id;
|
|
}
|
|
|
|
_allRecords = recordRep.GetRecord(Id);
|
|
RecordsList = new ObservableCollection<Record>(_allRecords);
|
|
DoctorList = new ObservableCollection<Doctor>(doctorRepository.GetDoctorsByTest());
|
|
}
|
|
|
|
public void SetCloseAction(Action closeAction)
|
|
{
|
|
_closeAction = closeAction;
|
|
}
|
|
|
|
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<Service>(services);
|
|
EditSelectedService = null;
|
|
}
|
|
else
|
|
{
|
|
EditServiceList.Clear();
|
|
EditSelectedService = null;
|
|
}
|
|
}
|
|
|
|
partial void OnEditSelectedServiceChanged(Service value)
|
|
{
|
|
if (value != null)
|
|
{
|
|
EditTotalAmount = value.Price;
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
void SearchRecords()
|
|
{
|
|
if (string.IsNullOrWhiteSpace(SearchText))
|
|
{
|
|
// Если поле поиска пусто, показываем все записи
|
|
RecordsList = new ObservableCollection<Record>(_allRecords);
|
|
return;
|
|
}
|
|
|
|
// Фильтруем записи по имени или фамилии клиента
|
|
var filteredRecords = _allRecords
|
|
.Where(r => r.ClientName.Contains(SearchText, StringComparison.OrdinalIgnoreCase) ||
|
|
r.ClientSurname.Contains(SearchText, StringComparison.OrdinalIgnoreCase))
|
|
.ToList();
|
|
|
|
RecordsList = new ObservableCollection<Record>(filteredRecords);
|
|
StatusMessage = $"Найдено {filteredRecords.Count} записей";
|
|
}
|
|
|
|
[RelayCommand]
|
|
void ShowAllRecords()
|
|
{
|
|
SearchText = "";
|
|
RecordsList = new ObservableCollection<Record>(_allRecords);
|
|
StatusMessage = $"Показано {_allRecords.Count} записей";
|
|
}
|
|
|
|
[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 = "Запись успешно обновлена";
|
|
_allRecords = _recordRep.GetRecord(Id);
|
|
RecordsList = new ObservableCollection<Record>(_allRecords);
|
|
SelectedRecord = null;
|
|
ClearEditFields();
|
|
SearchText = "";
|
|
}
|
|
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]
|
|
void DeleteRecord()
|
|
{
|
|
if (SelectedRecord == null)
|
|
{
|
|
StatusMessage = "Выберите запись для удаления";
|
|
Console.WriteLine("No record selected for deletion");
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
bool deleted = _recordRep.Delete(SelectedRecord.Id);
|
|
if (deleted)
|
|
{
|
|
StatusMessage = "Запись успешно удалена";
|
|
_allRecords = _recordRep.GetRecord(Id);
|
|
RecordsList = new ObservableCollection<Record>(_allRecords);
|
|
SelectedRecord = null;
|
|
ClearEditFields();
|
|
SearchText = "";
|
|
}
|
|
else
|
|
{
|
|
StatusMessage = "Ошибка при удалении записи";
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
StatusMessage = $"Ошибка: {ex.Message}";
|
|
Console.WriteLine($"Error deleting record: {ex}");
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
void GoService()
|
|
{
|
|
var vm = ActivatorUtilities.CreateInstance<DoctorViewModel>(_provider);
|
|
_navigation.Navigate(vm);
|
|
}
|
|
|
|
[RelayCommand]
|
|
void GoSugarCheck()
|
|
{
|
|
var vm = ActivatorUtilities.CreateInstance<SugarCheckViewModel>(_provider);
|
|
_navigation.Navigate(vm);
|
|
}
|
|
|
|
[RelayCommand]
|
|
void ExitApplication()
|
|
{
|
|
Console.WriteLine("Exit button clicked");
|
|
_closeAction?.Invoke();
|
|
}
|
|
|
|
}
|