/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
dev
src/Queue.OperatorApp/Views/OperatorWindow.xaml
164 строки
12 KB
kochkareal
feat: пауза оператора с блокировкой экрана и повторным входом
27 июл 2026, 19:44
27 июл 2026, 19:44
3b2de85
Код
Авторство
О чём код?
<Window x:Class="Queue.OperatorApp.Views.OperatorWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Очередь — АРМ оператора" Height="800" Width="1280" MinHeight="640" MinWidth="1040" WindowStartupLocation="CenterScreen" Background="#F5F6FA"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- Верхняя панель — фирменные цвета, как боковая панель в Admin: сразу видно, что это то же приложение семейства "Очередь", а не отдельная самопальная форма. --> <Border Grid.Row="0" Background="{StaticResource MainBrush}" Padding="24,16"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0" Orientation="Horizontal"> <TextBlock FontSize="{StaticResource FontSizeMedium}" FontWeight="Bold" VerticalAlignment="Center" Margin="0,0,20,0"> <Run Text="КОЧКА" Foreground="White" /><Run Text="ТЕХ" Foreground="{StaticResource FocusBrush}" /> </TextBlock> <TextBlock Text="{Binding EmployeeName}" Foreground="White" FontSize="{StaticResource FontSizeHeader}" FontWeight="Bold" VerticalAlignment="Center" /> </StackPanel> <StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Margin="0,0,20,0"> <TextBlock Text="Ваше окно приёма — сюда вызываются талоны" Foreground="White" Opacity="0.75" FontSize="{StaticResource FontSizeSmall}" Margin="0,0,0,4" /> <ComboBox Width="220" ItemsSource="{Binding Windows}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedWindow}" /> </StackPanel> <Border Background="#22FFFFFF" CornerRadius="6" Padding="16,8" VerticalAlignment="Bottom" Margin="0,0,20,0"> <StackPanel> <TextBlock Text="Ожидают вызова" Foreground="White" Opacity="0.75" FontSize="{StaticResource FontSizeSmall}" HorizontalAlignment="Center" /> <TextBlock Text="{Binding QueueCount, Mode=OneWay}" Foreground="White" FontSize="{StaticResource FontSizeHeader}" FontWeight="Bold" HorizontalAlignment="Center" /> </StackPanel> </Border> <Button Content="Пауза" Command="{Binding PauseCommand}" VerticalAlignment="Bottom" Background="Transparent" BorderThickness="1" BorderBrush="White" ToolTip="Приостановить работу — экран заблокируется, для продолжения нужно ввести пароль" /> </StackPanel> </Grid> </Border> <TextBlock Grid.Row="1" Text="{Binding StatusMessage}" Style="{StaticResource DestructiveTextStyle}" Margin="24,12,24,0" TextWrapping="Wrap" Visibility="{Binding StatusMessage, Converter={StaticResource StringToVisibilityConverter}}" /> <Grid Grid.Row="2" Margin="24"> <Grid.ColumnDefinitions> <ColumnDefinition Width="380" /> <ColumnDefinition Width="16" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="16" /> <ColumnDefinition Width="280" /> </Grid.ColumnDefinitions> <!-- Карточка 1: текущий талон и все действия с ним --> <Border Grid.Column="0" Background="White" Style="{StaticResource SectionBorderStyle}" Padding="24" VerticalAlignment="Top"> <StackPanel> <TextBlock Text="Текущий талон" FontWeight="Bold" Margin="0,0,0,12" /> <Border Background="#F5F6FA" CornerRadius="6" Padding="16" Margin="0,0,0,20"> <StackPanel> <TextBlock Text="{Binding CurrentTicket.Number, FallbackValue=Нет талона}" FontSize="36" FontWeight="Bold" HorizontalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap" /> <TextBlock Text="{Binding CurrentTicket.ServiceName}" Style="{StaticResource SubLabelTextStyle}" HorizontalAlignment="Center" /> </StackPanel> </Border> <Button Content="Вызвать следующего" Command="{Binding CallNextCommand}" HorizontalAlignment="Stretch" Margin="0,0,0,20" Padding="16,12" /> <TextBlock Text="Действия с вызванным талоном" Style="{StaticResource SubLabelTextStyle}" Margin="0,0,0,8" /> <!-- В один столбец, а не 2х2 — при более длинных подписях кнопок ("Начать обслуживание") текст обрезался в узких ячейках UniformGrid. --> <StackPanel Margin="0,0,0,20"> <Button Content="Начать обслуживание" Command="{Binding StartServiceCommand}" Margin="0,0,0,6" HorizontalAlignment="Stretch" ToolTip="Доступно, когда талон уже вызван" /> <Button Content="Завершить" Command="{Binding FinishCommand}" Margin="0,0,0,6" HorizontalAlignment="Stretch" ToolTip="Доступно, когда обслуживание начато" /> <Button Content="Не явился" Command="{Binding NoShowCommand}" Margin="0,0,0,6" HorizontalAlignment="Stretch" ToolTip="Доступно, когда талон уже вызван" /> <Button Content="Отменить" Command="{Binding CancelCommand}" HorizontalAlignment="Stretch" Background="Transparent" Foreground="#D32F2F" /> </StackPanel> <TextBlock Text="Перевести талон на другую услугу" Style="{StaticResource SubLabelTextStyle}" Margin="0,0,0,4" /> <StackPanel Orientation="Horizontal"> <ComboBox Width="180" Margin="0,0,8,0" ItemsSource="{Binding Services}" DisplayMemberPath="Name" SelectedItem="{Binding TransferTargetService}" /> <Button Content="Перевести" Command="{Binding TransferCommand}" /> </StackPanel> </StackPanel> </Border> <!-- Карточка 2: очередь ожидания — раньше был виден только счётчик, не сам список --> <Border Grid.Column="2" Background="White" Style="{StaticResource SectionBorderStyle}"> <DockPanel> <TextBlock DockPanel.Dock="Top" Text="Очередь ожидания (по услугам вашего окна)" FontWeight="Bold" Margin="0,0,0,12" /> <TextBlock DockPanel.Dock="Bottom" Text="Пусто" Style="{StaticResource SubLabelTextStyle}" Visibility="{Binding WaitingQueue.Count, Converter={StaticResource ZeroToVisibilityConverter}}" /> <ListView ItemsSource="{Binding WaitingQueue}" BorderThickness="0" Background="Transparent"> <ListView.View> <GridView> <GridViewColumn Header="Номер" Width="110" DisplayMemberBinding="{Binding Number}" /> <GridViewColumn Header="Услуга" Width="240" DisplayMemberBinding="{Binding ServiceName}" /> <GridViewColumn Header="Создан" Width="90" DisplayMemberBinding="{Binding CreatedAt, StringFormat=HH:mm}" /> </GridView> </ListView.View> </ListView> </DockPanel> </Border> <!-- Карточка 3: что уже обслужено за смену --> <Border Grid.Column="4" Background="White" Style="{StaticResource SectionBorderStyle}"> <StackPanel> <TextBlock Text="Обслужено за смену" FontWeight="Bold" Margin="0,0,0,8" /> <ItemsControl ItemsSource="{Binding ServedToday}"> <ItemsControl.ItemTemplate> <DataTemplate> <Border BorderBrush="#EEEEEE" BorderThickness="0,0,0,1" Padding="0,8"> <StackPanel> <TextBlock Text="{Binding Number}" FontWeight="Bold" /> <TextBlock Text="{Binding ServiceName}" Style="{StaticResource SubLabelTextStyle}" /> </StackPanel> </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </StackPanel> </Border> </Grid> <!-- Оверлей паузы — перекрывает всё окно (Grid.RowSpan="3", последний элемент рисуется поверх остальных), продолжить работу можно только повторным вводом пароля, который реально проверяется на сервере (см. OperatorViewModel.UnlockAsync). --> <Grid Grid.Row="0" Grid.RowSpan="3" Background="#CC0C123C" Visibility="{Binding IsPaused, Converter={StaticResource BooleanToVisibilityConverter}}"> <Border Background="White" CornerRadius="8" Padding="32" Width="360" HorizontalAlignment="Center" VerticalAlignment="Center"> <StackPanel> <TextBlock Text="Работа приостановлена" Style="{StaticResource HeaderTextStyle}" HorizontalAlignment="Center" Margin="0,0,0,4" /> <TextBlock Text="Введите свой пароль, чтобы продолжить" Style="{StaticResource SubLabelTextStyle}" HorizontalAlignment="Center" Margin="0,0,0,20" /> <PasswordBox x:Name="UnlockPasswordBox" Margin="0,0,0,12" /> <Button Content="{Binding IsUnlocking, Converter={StaticResource BusyToButtonTextConverter}, ConverterParameter='Проверка…|Разблокировать', FallbackValue=Разблокировать}" Click="UnlockButton_Click" IsDefault="True" IsEnabled="{Binding IsUnlocking, Converter={StaticResource InverseBoolConverter}}" HorizontalAlignment="Stretch" Margin="0,0,0,8" /> <TextBlock Text="{Binding UnlockError}" Style="{StaticResource DestructiveTextStyle}" TextWrapping="Wrap" HorizontalAlignment="Center" /> </StackPanel> </Border> </Grid> </Grid> </Window>