This commit is contained in:
2026-04-29 16:03:47 +05:00
parent a79212c5cd
commit d5f0b2a532
12 changed files with 257 additions and 25 deletions

View File

@@ -13,6 +13,6 @@
</providers>
</entityFramework>
<connectionStrings>
<add name="LaboratoryDBEntities" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Room\SQLEXPRESS;initial catalog=LaboratoryDB;integrated security=True;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
<add name="LaboratoryDBEntities" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=PC311-9;initial catalog=LaboratoryDB;integrated security=True;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>

View File

@@ -156,6 +156,10 @@
<DependentUpon>Model1.tt</DependentUpon>
</Compile>
<Compile Include="Services\AuthService.cs" />
<Compile Include="Services\DelegateCommand.cs" />
<Compile Include="Services\InverseBooleanConverter.cs" />
<Compile Include="Services\InverseBoolToVisConverter.cs" />
<Compile Include="Services\NullToVisibilityConverter.cs" />
<Compile Include="Services\StringToImageConverter.cs" />
<Compile Include="Services\Valid.cs" />
<Compile Include="ViewModels\AddPatientViewModel.cs" />

View File

@@ -1,4 +1,4 @@
// Создание кода T4 для модели "D:\Projects\TASK3UP01\Labaratory\Labaratory\Models\Model1.edmx" включено.
// Создание кода T4 для модели "C:\Users\student1\Source\Repos\UP01TASK3\Labaratory\Labaratory\Models\Model1.edmx" включено.
// Чтобы включить формирование кода прежних версий, измените значение свойства "Стратегия создания кода" конструктора
// на "Legacy ObjectContext". Это свойство доступно в окне "Свойства", если модель
// открыта в конструкторе.

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace Labaratory.Services
{
public class RelayCommand<T> : ICommand
{
private readonly Action<T> _execute;
private readonly Predicate<T> _canExecute;
public RelayCommand(Action<T> execute, Predicate<T> canExecute = null)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
public bool CanExecute(object parameter) => _canExecute == null || _canExecute((T)parameter);
public void Execute(object parameter) => _execute((T)parameter);
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows;
namespace Labaratory.Services
{
public class InverseBoolToVisConverter : IValueConverter
{
public object Convert(object v, Type t, object p, CultureInfo c) =>
(bool)v ? Visibility.Collapsed : Visibility.Visible;
public object ConvertBack(object v, Type t, object p, CultureInfo c) => throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Labaratory.Services
{
public class InverseBooleanConverter : IValueConverter
{
public object Convert(object v, Type t, object p, CultureInfo c) => !(bool)v;
public object ConvertBack(object v, Type t, object p, CultureInfo c) => !(bool)v;
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows;
namespace Labaratory.Services
{
public class NullToVisibilityConverter : IValueConverter
{
public object Convert(object v, Type t, object p, CultureInfo c) =>
(v == null || string.IsNullOrEmpty(v.ToString())) ? Visibility.Collapsed : Visibility.Visible;
public object ConvertBack(object v, Type t, object p, CultureInfo c) => throw new NotImplementedException();
}
}

View File

@@ -48,7 +48,7 @@ namespace Labaratory.ViewModels
get
{
if (_updatePhotoCommand == null)
_updatePhotoCommand = new RelayCommand<object>(obj => AuthService.UpdatePhoto("Admin.png"));
_updatePhotoCommand = new Services.RelayCommand<object>(obj => AuthService.UpdatePhoto("Admin.png"));
return _updatePhotoCommand;
}
}
@@ -97,7 +97,7 @@ namespace Labaratory.ViewModels
{
if (_saveUserCommand == null)
{
_saveUserCommand = new RelayCommand<object>(obj => SaveUser());
_saveUserCommand = new Services.RelayCommand<object>(obj => SaveUser());
}
return _saveUserCommand;
}

View File

@@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Data.Entity; // Для .Include() в старых версиях EF
using System.Data.Entity;
using Wpf.Ui.Input;
namespace Labaratory.ViewModels
@@ -45,7 +45,7 @@ namespace Labaratory.ViewModels
public ByhalterModel(Models.User user)
{
CurrentUser = user;
_db = new LaboratoryDBEntities(); // Используем ваш контекст
_db = new LaboratoryDBEntities();
LoadInitialData();
@@ -63,7 +63,7 @@ namespace Labaratory.ViewModels
private void GenerateRevenueReport()
{
var data = _db.Rendered_Services
.Include(s => s.OrderItem)
.Include(s => s.Order_Items)
.OrderByDescending(s => s.ExecutionDate)
.ToList();

View File

@@ -1,18 +1,93 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using Labaratory.Models;
using Labaratory.Services;
namespace Labaratory.ViewModels
{
public class LaborantExplorer : BaseViewModel
{
private LaboratoryDBEntities _db = new LaboratoryDBEntities(); // Ваш контекст Entity Framework
private Analyzer _selectedAnalyzer;
public Models.User CurrentUser { get; set; }
// Список доступных анализаторов
public ObservableCollection<Analyzer> Analyzers { get; set; }
// Список услуг для выбранного анализатора
public ObservableCollection<Service> PendingServices { get; set; }
public Analyzer SelectedAnalyzer
{
get => _selectedAnalyzer;
set
{
_selectedAnalyzer = value;
OnPropertyChanged();
LoadServices(); // Загружаем услуги при выборе прибора
}
}
public LaborantExplorer(Models.User user)
{
CurrentUser = user;
}
LoadInitialData();
}
private void LoadInitialData()
{
// Загрузка анализаторов из БД
Analyzers = new ObservableCollection<Analyzer>(_db.Analyzers.ToList());
}
private void LoadServices()
{
var services = _db.Services.ToList();
PendingServices = new ObservableCollection<Service>(services);
OnPropertyChanged(nameof(PendingServices));
}
public ICommand SendToResearchCommand => new DelegateCommand<Service>(async (service) =>
{
if (SelectedAnalyzer.IsBusy)
{
MessageBox.Show("Анализатор занят!");
return;
}
service.IsProcessing = true;
SelectedAnalyzer.IsBusy = true;
await Task.Run(async () =>
{
Random rng = new Random();
for (int i = 0; i <= 100; i += 10)
{
service.Progress = i;
await Task.Delay(500);
}
// Имитация получения результата
double resultValue = rng.NextDouble() * 100;
service.ResultValue = resultValue.ToString("F2");
// Логика проверки на сбой (отклонение в 3 раза от среднего)
double average = 20.0; // В реальности берем из БД
if (resultValue > average * 3 || resultValue < average / 3)
{
Application.Current.Dispatcher.Invoke(() =>
MessageBox.Show("Внимание: возможен сбой или некачественный биоматериал!"));
}
service.IsProcessing = false;
SelectedAnalyzer.IsBusy = false;
});
});
}
}

View File

@@ -1,4 +1,4 @@
<Window x:Class="Labaratory.Views.Laborant"
<Window x:Class="Labaratory.Views.ByhalterWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
@@ -56,7 +56,7 @@
<StackPanel Grid.Row="0" Margin="0,0,0,20">
<TextBlock Text="Формирование нового счета" FontSize="18" FontWeight="SemiBold" Margin="0,0,0,10"/>
<StackPanel Orientation="Horizontal">
<ComboBox ItemsSource="{Binding InsuranceCompanies}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedCompany}" Width="250"/>
<ComboBox ItemsSource="{Binding InsuranceCompanies}" DisplayMemberPath="CompanyName" SelectedItem="{Binding SelectedCompany}" Width="250"/>
<ui:Button Content="Создать счет" Icon="Add24" Command="{Binding CreateInvoiceCommand}" Margin="10,0,0,0" Appearance="Primary"/>
</StackPanel>
</StackPanel>
@@ -66,13 +66,6 @@
<DataGridTextColumn Header="Компания" Binding="{Binding CompanyName}"/>
<DataGridTextColumn Header="Дата" Binding="{Binding Date, StringFormat=d}"/>
<DataGridTextColumn Header="Сумма" Binding="{Binding TotalAmount, StringFormat=C}"/>
<DataGridTemplateColumn Header="Действие">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ui:Button Content="Скачать" Icon="ArrowDownload24" Command="{Binding DataContext.DownloadInvoiceCommand, RelativeSource={RelativeSource AncestorType=ui:DataGrid}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</ui:DataGrid.Columns>
</ui:DataGrid>
</Grid>

View File

@@ -1,12 +1,91 @@
<Window x:Class="Labaratory.Views.LaborantExplorer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Labaratory.Views"
mc:Ignorable="d"
Title="LaborantExplorer" Height="450" Width="800">
<Grid>
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:services="clr-namespace:Labaratory.Services"
Title="Рабочее бугхалтера" Height="700" Width="900"
Background="{ui:ThemeResource ApplicationBackgroundBrush}"
Foreground="{ui:ThemeResource TextFillColorPrimaryBrush}">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<services:StringToImageConverter x:Key="StringToImageConverter" />
</Window.Resources>
<Grid>
<TabControl>
<TabItem Header="Анализатор">
<Grid Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column ="0" Margin="0,0,10,0">
<TextBlock Text="Доступные анализаторы" FontSize="18" Margin="0,0,0,10"/>
<ListBox ItemsSource="{Binding Analyzers}" SelectedItem="{Binding SelectedAnalyzer}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ui:SymbolIcon Symbol="DeveloperBoard24"/>
<TextBlock Text="{Binding Name}" Margin="10,0"/>
<ui:Badge Appearance="Success" Visibility="{Binding IsBusy, Converter={StaticResource InverseBoolToVis}}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<ui:Card Grid.Column="1" VerticalAlignment="Stretch">
<DataGrid ItemsSource="{Binding PendingServices}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Услуга" Binding="{Binding Name}" Width="*"/>
<DataGridTemplateColumn Header="Статус/Прогресс" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<ui:ProgressRing IsIndeterminate="False"
Progress="{Binding Progress}"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"
Width="30"
Height="30"/>
<TextBlock Text="Ожидание"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Visibility="{Binding IsProcessing, Converter={StaticResource InverseBoolToVis}}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Результат" Binding="{Binding ResultValue}" Width="80"/>
<DataGridTemplateColumn Header="Действия" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ui:Button Content="Отправить"
Command="{Binding DataContext.SendToResearchCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}"
CommandParameter="{Binding}"
Appearance="Primary"
IsEnabled="{Binding IsProcessing, Converter={StaticResource InverseBooleanConverter}}"/>
<StackPanel Orientation="Horizontal" Visibility="{Binding ResultValue, Converter={StaticResource NullToVisibilityConverter}}">
<ui:Button Icon="Checkmark24" Appearance="Success" Margin="5,0"
Command="{Binding DataContext.ApproveCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
<ui:Button Icon="Dismiss24" Appearance="Danger"
Command="{Binding DataContext.RejectCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</ui:Card>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>