From 4885765fb3dac42e5021f618a8ef2fc1ff069c57 Mon Sep 17 00:00:00 2001 From: oreshki Date: Thu, 9 Apr 2026 18:54:22 +0500 Subject: [PATCH] Barcode --- Labaratory/Labaratory/Images/Admin.png | Bin 0 -> 41764 bytes Labaratory/Labaratory/Images/Buhalter.jpeg | Bin 0 -> 12534 bytes Labaratory/Labaratory/Images/Laborant.jpeg | Bin 0 -> 6567 bytes .../Labaratory/Images/LaborantExplorer.png | Bin 0 -> 4638 bytes Labaratory/Labaratory/Labaratory.csproj | 20 ++ .../Labaratory/Models/Model1.Designer.cs | 2 +- Labaratory/Labaratory/Models/Model1.edmx | 13 +- Labaratory/Labaratory/Services/AuthService.cs | 26 +++ .../Services/StringToImageConverter.cs | 33 +++ Labaratory/Labaratory/Services/Valid.cs | 40 +++- .../ViewModels/AddPatientViewModel.cs | 102 ++++++++ .../Labaratory/ViewModels/AdminModel.cs | 36 +++ Labaratory/Labaratory/ViewModels/Laborant.cs | 221 +++++++++++++++--- .../Labaratory/ViewModels/LoginViewModel.cs | 57 ++--- .../Labaratory/Views/AddPatientWindow.xaml | 77 ++++++ .../Labaratory/Views/AddPatientWindow.xaml.cs | 29 +++ Labaratory/Labaratory/Views/AdminWindow.xaml | 14 +- .../Labaratory/Views/AdminWindow.xaml.cs | 4 +- .../Labaratory/Views/LaborantWindow.xaml | 156 +++++++++++-- .../Labaratory/Views/LaborantWindow.xaml.cs | 4 +- Labaratory/Labaratory/packages.config | 3 +- 21 files changed, 735 insertions(+), 102 deletions(-) create mode 100644 Labaratory/Labaratory/Images/Admin.png create mode 100644 Labaratory/Labaratory/Images/Buhalter.jpeg create mode 100644 Labaratory/Labaratory/Images/Laborant.jpeg create mode 100644 Labaratory/Labaratory/Images/LaborantExplorer.png create mode 100644 Labaratory/Labaratory/Services/AuthService.cs create mode 100644 Labaratory/Labaratory/Services/StringToImageConverter.cs create mode 100644 Labaratory/Labaratory/ViewModels/AddPatientViewModel.cs create mode 100644 Labaratory/Labaratory/Views/AddPatientWindow.xaml create mode 100644 Labaratory/Labaratory/Views/AddPatientWindow.xaml.cs diff --git a/Labaratory/Labaratory/Images/Admin.png b/Labaratory/Labaratory/Images/Admin.png new file mode 100644 index 0000000000000000000000000000000000000000..c47611499458ab102d49669ed031d9162e0bcf05 GIT binary patch literal 41764 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≷q7E^=e2f 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 B+rR(- literal 0 HcmV?d00001 diff --git a/Labaratory/Labaratory/Images/Buhalter.jpeg b/Labaratory/Labaratory/Images/Buhalter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2c3e9a542613a50dadcadb957c6980957dbd4714 GIT binary patch literal 12534 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 literal 0 HcmV?d00001 diff --git a/Labaratory/Labaratory/Images/Laborant.jpeg b/Labaratory/Labaratory/Images/Laborant.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e0c105c30a3583999fbeaec4f2f4c1a990181c45 GIT binary patch literal 6567 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 KNh7;A)Bgjls9WR! literal 0 HcmV?d00001 diff --git a/Labaratory/Labaratory/Images/LaborantExplorer.png b/Labaratory/Labaratory/Images/LaborantExplorer.png new file mode 100644 index 0000000000000000000000000000000000000000..22e3d88cb55e8d96edc3c1d7eab10076183b2d86 GIT binary patch literal 4638 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 U$elju!T4 + + ..\packages\BouncyCastle.Cryptography.2.6.2\lib\net461\BouncyCastle.Cryptography.dll + ..\packages\EasyCaptcha.Wpf.0.9.0.3\lib\net45\EasyCaptcha.Wpf.dll @@ -47,6 +50,9 @@ ..\packages\EntityFramework.6.5.1\lib\net45\EntityFramework.SqlServer.dll + + ..\packages\iTextSharp.5.5.13.5\lib\net461\itextsharp.dll + ..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll @@ -98,7 +104,10 @@ Model1.tt + + + Model1.tt @@ -156,6 +165,10 @@ Model1.tt + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -181,6 +194,9 @@ Code + + AddPatientWindow.xaml + AdminWindow.xaml @@ -233,6 +249,10 @@ + + + + TextTemplatingFileGenerator Model1.Context.cs diff --git a/Labaratory/Labaratory/Models/Model1.Designer.cs b/Labaratory/Labaratory/Models/Model1.Designer.cs index 4cfa274..e29ec55 100644 --- a/Labaratory/Labaratory/Models/Model1.Designer.cs +++ b/Labaratory/Labaratory/Models/Model1.Designer.cs @@ -1,4 +1,4 @@ -// Создание кода T4 для модели "C:\Users\usersql\Source\Repos\UP01TASK3\Labaratory\Labaratory\Models\Model1.edmx" включено. +// Создание кода T4 для модели "C:\Users\usersql\source\repos\UP01TASK3\Labaratory\Labaratory\Models\Model1.edmx" включено. // Чтобы включить формирование кода прежних версий, измените значение свойства "Стратегия создания кода" конструктора // на "Legacy ObjectContext". Это свойство доступно в окне "Свойства", если модель // открыта в конструкторе. diff --git a/Labaratory/Labaratory/Models/Model1.edmx b/Labaratory/Labaratory/Models/Model1.edmx index 0b22d44..58feb0d 100644 --- a/Labaratory/Labaratory/Models/Model1.edmx +++ b/Labaratory/Labaratory/Models/Model1.edmx @@ -46,13 +46,11 @@ - - + @@ -386,6 +384,7 @@ + @@ -397,14 +396,6 @@ - - SELECT - [LoggnHistory].[ID] AS [ID], - [LoggnHistory].[Login] AS [Login], - [LoggnHistory].[AttemptTime] AS [AttemptTime], - [LoggnHistory].[IsSuccess] AS [IsSuccess] - FROM [dbo].[LoggnHistory] AS [LoggnHistory] - diff --git a/Labaratory/Labaratory/Services/AuthService.cs b/Labaratory/Labaratory/Services/AuthService.cs new file mode 100644 index 0000000..0ef039e --- /dev/null +++ b/Labaratory/Labaratory/Services/AuthService.cs @@ -0,0 +1,26 @@ +using Labaratory.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Labaratory.Services +{ + public static class AuthService + { + public static void LogAttempt(string login, bool isSuccess) + { + using (var db = new Models.LaboratoryDBEntities()) + { + db.LoggnHistories.Add(new Models.LoggnHistory + { + AttemptTime = DateTime.Now, + Login = login, + IsSuccess = isSuccess + }); + db.SaveChanges(); + } + } + } +} diff --git a/Labaratory/Labaratory/Services/StringToImageConverter.cs b/Labaratory/Labaratory/Services/StringToImageConverter.cs new file mode 100644 index 0000000..5bbc254 --- /dev/null +++ b/Labaratory/Labaratory/Services/StringToImageConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Windows.Media.Imaging; + +namespace Labaratory.Services +{ + public class StringToImageConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + string imageName = value as string; + + if (string.IsNullOrWhiteSpace(imageName)) + return null; + + try + { + return new BitmapImage(new Uri($"pack://application:,,,/Images/{imageName}")); + } + catch + { + return null; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + => throw new NotImplementedException(); + } +} diff --git a/Labaratory/Labaratory/Services/Valid.cs b/Labaratory/Labaratory/Services/Valid.cs index 7edd86a..5f70b1e 100644 --- a/Labaratory/Labaratory/Services/Valid.cs +++ b/Labaratory/Labaratory/Services/Valid.cs @@ -1,4 +1,7 @@ -using System; +using Labaratory.Models; +using Labaratory.ViewModels; +using Labaratory.Views; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -26,5 +29,40 @@ namespace Labaratory.Services if (string.IsNullOrEmpty(input)) return false; return input.Trim().ToUpper() == original.ToUpper(); } + public static void OpenRoleWindow(User user) + { + if (user.Role.Value == 1) + { + var nextWindow = new AdminWindow(); + + var mainVM = new AdminModel(user); + nextWindow.DataContext = mainVM; + nextWindow.Show(); + } + if (user.Role.Value == 2) + { + var nextWindow = new ByhalterWindow(); + + var mainVM = new ByhalterModel(user); + nextWindow.DataContext = mainVM; + nextWindow.Show(); + } + if (user.Role.Value == 3) + { + var nextWindow = new Views.Laborant(); + + var mainVM = new ViewModels.Laborant(user); + nextWindow.DataContext = mainVM; + nextWindow.Show(); + } + if (user.Role.Value == 4) + { + var nextWindow = new Views.LaborantExplorer(); + + var mainVM = new ViewModels.LaborantExplorer(user); + nextWindow.DataContext = mainVM; + nextWindow.Show(); + } + } } } diff --git a/Labaratory/Labaratory/ViewModels/AddPatientViewModel.cs b/Labaratory/Labaratory/ViewModels/AddPatientViewModel.cs new file mode 100644 index 0000000..2332de6 --- /dev/null +++ b/Labaratory/Labaratory/ViewModels/AddPatientViewModel.cs @@ -0,0 +1,102 @@ +using Labaratory.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Threading.Tasks; +using System.Windows.Input; +using Wpf.Ui.Input; + +namespace Labaratory.ViewModels +{ + public class AddPatientViewModel : BaseViewModel + { + private Models.LaboratoryDBEntities db = new Models.LaboratoryDBEntities(); + + public string Surname { get; set; } + public string FirstName { get; set; } + public string Patronymic { get; set; } + public DateTime BirthDate { get; set; } = DateTime.Now.AddYears(-20); + public string PassportSeries { get; set; } + public string PassportNumber { get; set; } + public string Phone { get; set; } + public string Email { get; set; } + public string InsuranceNumber { get; set; } + + public List PolicyTypes => db.Policy_Types.ToList(); + public List Companies => db.Insurance_Companies.ToList(); + + public Models.Policy_Types SelectedPolicyType { get; set; } + public Models.Insurance_Companies SelectedCompany { get; set; } + + public Models.Patient SavedPatient { get; private set; } + public ICommand SaveCommand { get; } + public ICommand CancelCommand { get; } + + public AddPatientViewModel() + { + SaveCommand = new RelayCommand(ExecuteSave); + CancelCommand = new RelayCommand(ExecuteCancel); + } + + private void ExecuteSave(Window window) + { + if (Save()) + { + if (window != null) + { + window.DialogResult = true; + window.Close(); + } + } + } + + private void ExecuteCancel(Window window) + { + if (window != null) + { + window.DialogResult = false; + window.Close(); + } + } + + public bool Save() + { + try + { + if (string.IsNullOrWhiteSpace(Surname) || string.IsNullOrWhiteSpace(FirstName)) + { + MessageBox.Show("Заполните обязательные поля: Фамилия и Имя"); + return false; + } + + var newPatient = new Models.Patient + { + Surname = Surname, + FirstName = FirstName, + Patronymic = Patronymic, + BirthDate = BirthDate, + PassportSeries = PassportSeries, + PassportNumber = PassportNumber, + Phone = Phone, + Email = Email, + InsuranceNumber = InsuranceNumber, + PolicyType = SelectedPolicyType?.ID_PolicyType, + Company = SelectedCompany?.ID_Company + }; + + db.Patients.Add(newPatient); + db.SaveChanges(); + + SavedPatient = newPatient; + return true; + } + catch (Exception ex) + { + MessageBox.Show("Ошибка при сохранении: " + ex.Message); + return false; + } + } + } +} \ No newline at end of file diff --git a/Labaratory/Labaratory/ViewModels/AdminModel.cs b/Labaratory/Labaratory/ViewModels/AdminModel.cs index 7b30107..5035eab 100644 --- a/Labaratory/Labaratory/ViewModels/AdminModel.cs +++ b/Labaratory/Labaratory/ViewModels/AdminModel.cs @@ -7,6 +7,8 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Wpf.Ui.Input; +using Labaratory.Models; +using System.Collections.ObjectModel; namespace Labaratory.ViewModels { @@ -17,6 +19,40 @@ namespace Labaratory.ViewModels public AdminModel(Models.User user) { CurrentUser = user; + LoadData(); + } + private Models.LaboratoryDBEntities db = new Models.LaboratoryDBEntities(); + private string _filterLogin; + private List _allLogs; + + public string FilterLogin + { + get => _filterLogin; + set { _filterLogin = value; OnPropertyChanged(); ApplyFilter(); } + } + + private ObservableCollection _history; + public ObservableCollection History + { + get => _history; + set { _history = value; OnPropertyChanged(); } + } + public void LoadData() + { + _allLogs = db.LoggnHistories.OrderByDescending(h => h.AttemptTime).ToList(); + History = new ObservableCollection(_allLogs); + } + + private void ApplyFilter() + { + var filtered = _allLogs.AsEnumerable(); + + if (!string.IsNullOrWhiteSpace(FilterLogin)) + { + filtered = filtered.Where(h => h.Login.ToLower().Contains(FilterLogin.ToLower())); + } + + History = new ObservableCollection(filtered); } } } diff --git a/Labaratory/Labaratory/ViewModels/Laborant.cs b/Labaratory/Labaratory/ViewModels/Laborant.cs index 958e060..abf57ca 100644 --- a/Labaratory/Labaratory/ViewModels/Laborant.cs +++ b/Labaratory/Labaratory/ViewModels/Laborant.cs @@ -4,6 +4,14 @@ using System.Linq; using System.Text; using System.Windows; using System.Threading.Tasks; +using iTextSharp.text; +using iTextSharp.text.pdf; +using System.IO; +using Labaratory.Models; +using System.Collections.ObjectModel; +using System.Windows.Input; +using Wpf.Ui.Input; +using Labaratory.Views; namespace Labaratory.ViewModels { @@ -15,10 +23,34 @@ namespace Labaratory.ViewModels { CurrentUser = user; CalculateNextNumber(); + ProcessOrderCommand = new RelayCommand(execute => ProcessOrder()); } private string _barcodeInput; private string _suggestedNumber; private Models.LaboratoryDBEntities db = new Models.LaboratoryDBEntities(); + private Patient _selectedPatient; + private ObservableCollection _selectedServices = new ObservableCollection(); + private decimal _totalCost; + + public List AllServices => db.Services.ToList(); + public ICommand ProcessOrderCommand { get; } + public Patient SelectedPatient + { + get => _selectedPatient; + set { _selectedPatient = value; OnPropertyChanged(); } + } + public ObservableCollection SelectedServices + { + get; + set; + } = new ObservableCollection(); + + + public decimal TotalCost + { + get => _totalCost; + set { _totalCost = value; OnPropertyChanged(); } + } public string BarcodeInput { @@ -33,30 +65,9 @@ namespace Labaratory.ViewModels } private void CalculateNextNumber() { - // Находим последний ID в заказах (кроме архивных, если есть флаг IsArchived) - //var lastId = db.Orders.OrderByDescending(o => o.ID).Select(o => o.ID).FirstOrDefault(); - //SuggestedNumber = (lastId + 1).ToString(); - BarcodeInput = SuggestedNumber; // Устанавливаем как значение по умолчанию - } - private string GetNextOrderNumber() - { - // Находим максимальный ID_Order var lastId = db.Orders.OrderByDescending(o => o.ID_Order).Select(o => o.ID_Order).FirstOrDefault(); - return (lastId + 1).ToString(); - } - - // Формирование полного штрих-кода по ТЗ - private string CreateFullBarcodeString(string orderId) - { - string datePart = DateTime.Now.ToString("ddMMyyyy"); - - // Генерируем 6 случайных цифр - Random rnd = new Random(); - string randomPart = ""; - for (int i = 0; i < 6; i++) randomPart += rnd.Next(0, 10).ToString(); - - // Результат: ID + Дата + 6 цифр - return $"{orderId}{datePart}{randomPart}"; + SuggestedNumber = (lastId + 1).ToString(); + BarcodeInput = SuggestedNumber; } public void ProcessOrder() { @@ -66,19 +77,173 @@ namespace Labaratory.ViewModels return; } - // Формируем полный код: ID + Дата + 6 случайных символов string fullCode = GenerateFullBarcode(BarcodeInput); - // Сохраняем в PDF и БД - //SaveToPdf(fullCode); - //SaveOrderToDb(fullCode); + SaveToPdf(fullCode); + SaveOrderToDb(fullCode); } private string GenerateFullBarcode(string orderId) { string datePart = DateTime.Now.ToString("ddMMyyyy"); - string uniquePart = Guid.NewGuid().ToString("N").Substring(0, 6); // 6 случайных символов + + Random rnd = new Random(); + string uniquePart = ""; + for (int i = 0; i < 6; i++) + uniquePart += rnd.Next(0, 10).ToString(); + return $"{orderId}{datePart}{uniquePart}"; } + private void SaveOrderToDb(string fullBarcode) + { + try + { + var newOrder = new Models.Order + { + Barcode = fullBarcode, + OrderDate = DateTime.Now, + ID_Order = int.Parse(BarcodeInput) + }; + + db.Orders.Add(newOrder); + db.SaveChanges(); + + MessageBox.Show($"Заказ успешно сохранен! Штрих-код: {fullBarcode}"); + + CalculateNextNumber(); + } + catch (Exception ex) + { + MessageBox.Show($"Ошибка при сохранении в БД: {ex.Message}"); + } + } + + private void SaveToPdf(string fullCode) + { + string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $"Barcode_{fullCode}.pdf"); + const float mmToPt = 72f / 25.4f; + + // Устанавливаем размер страницы чуть больше штрихкода + Document doc = new Document(new Rectangle(120 * mmToPt, 60 * mmToPt)); + + try + { + PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(filePath, FileMode.Create)); + doc.Open(); + PdfContentByte cb = writer.DirectContent; + + float startX = 3.63f * mmToPt; + float currentX = startX; + float y = 15 * mmToPt; + + cb.SetColorFill(BaseColor.BLACK); + + DrawGuardBar(cb, currentX, y, (22.85f + 1.65f), mmToPt); + currentX += (0.15f + 0.2f) * mmToPt; + + foreach (char c in fullCode) + { + if (!char.IsDigit(c)) continue; + int digit = int.Parse(c.ToString()); + + float barWidth = (digit == 0) ? 1.35f : (0.15f * digit); + + if (digit != 0) + { + cb.Rectangle(currentX, y + (1.65f * mmToPt), barWidth * mmToPt, 22.85f * mmToPt); + cb.Fill(); + } + currentX += (barWidth + 0.2f) * mmToPt; + } + + DrawGuardBar(cb, currentX, y, (22.85f + 1.65f), mmToPt); + + BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, "Cp1251", BaseFont.NOT_EMBEDDED); + cb.BeginText(); + cb.SetFontAndSize(bf, 2.75f * mmToPt); + + float textY = y - (3.0f * mmToPt); + cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, fullCode, startX, textY, 0); + cb.EndText(); + + doc.Close(); + MessageBox.Show($"PDF сохранен: {filePath}"); + } + catch (Exception ex) + { + MessageBox.Show("Ошибка PDF: " + ex.Message); + } + } + + private void DrawGuardBar(PdfContentByte cb, float x, float y, float height, float mmToPt) + { + cb.Rectangle(x, y, 0.15f * mmToPt, height * mmToPt); + cb.Fill(); + } + + public ICommand AddServiceCommand => new RelayCommand(service => + { + if (service != null) + { + SelectedServices.Add(service); + CalculateTotal(); + } + }); + + public ICommand SearchPatientCommand => new RelayCommand(fio => + { + if (string.IsNullOrWhiteSpace(fio)) return; + + var parts = fio.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + string surname = parts[0]; + string firstName = parts.Length > 1 ? parts[1] : ""; + + // 1. Ищем в БД + var patient = db.Patients.FirstOrDefault(p => p.Surname == surname && p.FirstName == firstName); + + if (patient == null) + { + // 2. Если не нашли — открываем модальное окно + var addWin = new Views.AddPatientWindow(); + var vm = new AddPatientViewModel { Surname = surname, FirstName = firstName }; + addWin.DataContext = vm; + + if (addWin.ShowDialog() == true) + { + SelectedPatient = vm.SavedPatient; + } + } + else + { + SelectedPatient = patient; + } + }); + + private void CalculateTotal() + { + TotalCost = SelectedServices.Sum(s => s.Price); + OnPropertyChanged(nameof(TotalCost)); + } + + private void CheckAndAddPatient(string searchSurname, string searchName) + { + var patient = db.Patients.FirstOrDefault(p => p.Surname == searchSurname && p.FirstName == searchName); + + if (patient == null) + { + var addWin = new AddPatientWindow(); + var vm = new AddPatientViewModel { Surname = searchSurname, FirstName = searchName }; + addWin.DataContext = vm; + + if (addWin.ShowDialog() == true) + { + SelectedPatient = vm.SavedPatient; + } + } + else + { + SelectedPatient = patient; + } + } } } diff --git a/Labaratory/Labaratory/ViewModels/LoginViewModel.cs b/Labaratory/Labaratory/ViewModels/LoginViewModel.cs index 7ab7b0c..e48abdc 100644 --- a/Labaratory/Labaratory/ViewModels/LoginViewModel.cs +++ b/Labaratory/Labaratory/ViewModels/LoginViewModel.cs @@ -9,6 +9,7 @@ using System.Windows.Input; using Wpf.Ui.Input; using Labaratory.ViewModels; using Labaratory.Views; +using Labaratory.Models; namespace Labaratory { @@ -59,14 +60,14 @@ namespace Labaratory CaptchaText = Valid.GenerateCaptchaText(); CaptchaInput = string.Empty; } - private async void ExecuteLogin(object parameter) { if (CapchaVisibility == Visibility.Visible && !Valid.ValidateCaptcha(CaptchaInput, CaptchaText)) { + LogAttempt(Login, false); MessageBox.Show("Неверная капча!"); GenerateNewCaptcha(); - await LockSystem(10); //Блокировка на 10 сек + await LockSystem(10); return; } @@ -74,52 +75,40 @@ namespace Labaratory if (user != null) { + LogAttempt(Login, true); + MessageBox.Show($"Успешный вход! Добро пожаловать, {user.Login}"); if (parameter is Window window) { - if (user.Role.Value == 1) - { - var nextWindow = new AdminWindow(); - - var mainVM = new AdminModel(user); - nextWindow.DataContext = mainVM; - nextWindow.Show(); - } - if (user.Role.Value == 2) - { - var nextWindow = new ByhalterWindow(); - - var mainVM = new ByhalterModel(user); - nextWindow.DataContext = mainVM; - nextWindow.Show(); - } - if (user.Role.Value == 3) - { - var nextWindow = new Views.Laborant(); - - var mainVM = new ViewModels.Laborant(user); - nextWindow.DataContext = mainVM; - nextWindow.Show(); - } - if (user.Role.Value == 4) - { - var nextWindow = new Views.LaborantExplorer(); - - var mainVM = new ViewModels.LaborantExplorer(user); - nextWindow.DataContext = mainVM; - nextWindow.Show(); - } + Valid.OpenRoleWindow(user); window.Close(); } } else { + LogAttempt(Login, false); MessageBox.Show("Неверный логин или пароль"); CapchaVisibility = Visibility.Visible; GenerateNewCaptcha(); } } + private void LogAttempt(string login, bool isSuccess) + { + // Новый контекст гарантирует запись, даже если основной db "глючит" + using (var context = new Models.LaboratoryDBEntities()) + { + var log = new Models.LoggnHistory + { + Login = login ?? "Unknown", + AttemptTime = DateTime.Now, + IsSuccess = isSuccess + }; + context.LoggnHistories.Add(log); + context.SaveChanges(); + } + } + private async Task LockSystem(int seconds) { IsLoginEnabled = false; diff --git a/Labaratory/Labaratory/Views/AddPatientWindow.xaml b/Labaratory/Labaratory/Views/AddPatientWindow.xaml new file mode 100644 index 0000000..787eb6f --- /dev/null +++ b/Labaratory/Labaratory/Views/AddPatientWindow.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Labaratory/Labaratory/Views/AddPatientWindow.xaml.cs b/Labaratory/Labaratory/Views/AddPatientWindow.xaml.cs new file mode 100644 index 0000000..43f73e5 --- /dev/null +++ b/Labaratory/Labaratory/Views/AddPatientWindow.xaml.cs @@ -0,0 +1,29 @@ +using Labaratory.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace Labaratory.Views +{ + /// + /// Логика взаимодействия для AddPatientWindow.xaml + /// + public partial class AddPatientWindow : Window + { + public AddPatientWindow() + { + InitializeComponent(); + DataContext = new AddPatientViewModel(); + } + } +} diff --git a/Labaratory/Labaratory/Views/AdminWindow.xaml b/Labaratory/Labaratory/Views/AdminWindow.xaml index b6d039b..f9abaa6 100644 --- a/Labaratory/Labaratory/Views/AdminWindow.xaml +++ b/Labaratory/Labaratory/Views/AdminWindow.xaml @@ -12,7 +12,19 @@ - + + + + + + + + + + + diff --git a/Labaratory/Labaratory/Views/AdminWindow.xaml.cs b/Labaratory/Labaratory/Views/AdminWindow.xaml.cs index 2a2d137..622fd79 100644 --- a/Labaratory/Labaratory/Views/AdminWindow.xaml.cs +++ b/Labaratory/Labaratory/Views/AdminWindow.xaml.cs @@ -1,4 +1,6 @@ -using System; +using Labaratory.Models; +using Labaratory.ViewModels; +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/Labaratory/Labaratory/Views/LaborantWindow.xaml b/Labaratory/Labaratory/Views/LaborantWindow.xaml index 6d1d341..de9c05f 100644 --- a/Labaratory/Labaratory/Views/LaborantWindow.xaml +++ b/Labaratory/Labaratory/Views/LaborantWindow.xaml @@ -1,36 +1,148 @@  + + + + + - - - - + + + + + + + + - - - - - + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Labaratory/Labaratory/Views/LaborantWindow.xaml.cs b/Labaratory/Labaratory/Views/LaborantWindow.xaml.cs index 428f865..029094a 100644 --- a/Labaratory/Labaratory/Views/LaborantWindow.xaml.cs +++ b/Labaratory/Labaratory/Views/LaborantWindow.xaml.cs @@ -1,4 +1,5 @@ -using System; +using Labaratory.Models; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -22,7 +23,6 @@ namespace Labaratory.Views public Laborant() { InitializeComponent(); - DataContext = new Laborant(); } } } diff --git a/Labaratory/Labaratory/packages.config b/Labaratory/Labaratory/packages.config index c99e7e3..fe65b39 100644 --- a/Labaratory/Labaratory/packages.config +++ b/Labaratory/Labaratory/packages.config @@ -1,8 +1,9 @@  + - +