- Отправить: поиск по прайсу → корзина (кол-во через NumericUpDown,
сумма/итого) → выбор грузополучателя + комментарий → создание заказа
POST /api/buyer/orders
- Core: CreateOrderAsync + DTO (BuyerOrderCreateRequest/ItemReq/Response)
- Отказы: заглушка с точным пояснением (нужен серверный эндпоинт;
RefuseItemsCount живёт только в локальной SQLite WinForms)
Итог: 6/7 разделов функциональны (Прайс-лист, Заказы, Накладные, Отчёты,
Справочник, Отправить), Отказы — заглушка. Собирается.
⚠️ Реальная отправка заказа (POST) не тестировалась — создаёт заказ на
проде; проверять вживую отдельно.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
105 lines
7.3 KiB
XML
105 lines
7.3 KiB
XML
<UserControl xmlns="https://github.com/avaloniaui"
|
||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||
xmlns:vm="using:Elfisa.Avalonia.ViewModels"
|
||
xmlns:conv="using:Avalonia.Data.Converters"
|
||
x:Class="Elfisa.Avalonia.Views.SendOrderView"
|
||
x:DataType="vm:SendOrderViewModel">
|
||
|
||
<DockPanel Margin="24">
|
||
<Grid DockPanel.Dock="Top" Margin="0,0,0,14">
|
||
<StackPanel Spacing="2" VerticalAlignment="Center">
|
||
<TextBlock Text="Отправить заказ" Classes="h1"/>
|
||
<TextBlock Text="Найдите позиции в прайсе, соберите корзину и отправьте поставщику" Classes="muted"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
|
||
<Border DockPanel.Dock="Bottom" Margin="0,10,0,0" Padding="10,7" CornerRadius="6"
|
||
Background="{DynamicResource AccentSoft}"
|
||
IsVisible="{Binding Status, Converter={x:Static conv:ObjectConverters.IsNotNull}}">
|
||
<TextBlock Text="{Binding Status}" Foreground="{DynamicResource AccentPressed}" TextWrapping="Wrap" FontSize="12.5"/>
|
||
</Border>
|
||
|
||
<Grid ColumnDefinitions="*,16,440">
|
||
|
||
<!-- Прайс: поиск + результаты -->
|
||
<Border Grid.Column="0" Classes="card" Padding="0" ClipToBounds="True">
|
||
<DockPanel>
|
||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="10" Margin="14">
|
||
<TextBox Text="{Binding Search}" Width="330" Watermark="поиск по наименованию…"/>
|
||
<Button Classes="primary" Content="Найти" Command="{Binding SearchCommand}" IsEnabled="{Binding !Busy}"/>
|
||
</StackPanel>
|
||
<Button DockPanel.Dock="Bottom" Classes="primary" Content="Добавить в заказ ▸"
|
||
Margin="14" HorizontalAlignment="Left"
|
||
Command="{Binding AddToCartCommand}"/>
|
||
<DataGrid ItemsSource="{Binding Results}" SelectedItem="{Binding SelectedResult}"
|
||
x:CompileBindings="False" AutoGenerateColumns="False" IsReadOnly="True"
|
||
HeadersVisibility="Column" CanUserResizeColumns="True" CanUserSortColumns="False">
|
||
<DataGrid.Columns>
|
||
<DataGridTextColumn Header="Наименование" Width="*" Binding="{Binding DrugName}"/>
|
||
<DataGridTextColumn Header="Поставщик" Width="120" Binding="{Binding SupplierName}"/>
|
||
<DataGridTextColumn Header="Цена" Width="100" Binding="{Binding Price, StringFormat='{}{0:N2}'}" CellStyleClasses="num"/>
|
||
</DataGrid.Columns>
|
||
</DataGrid>
|
||
</DockPanel>
|
||
</Border>
|
||
|
||
<!-- Корзина -->
|
||
<Border Grid.Column="2" Classes="card" Padding="16">
|
||
<DockPanel>
|
||
<TextBlock DockPanel.Dock="Top" Text="Корзина" Classes="h2" Margin="0,0,0,10"/>
|
||
|
||
<StackPanel DockPanel.Dock="Bottom" Spacing="10" Margin="0,12,0,0">
|
||
<StackPanel Spacing="5">
|
||
<TextBlock Text="Грузополучатель" Classes="muted"/>
|
||
<ComboBox ItemsSource="{Binding Locations}" SelectedItem="{Binding SelectedLocation}"
|
||
HorizontalAlignment="Stretch"/>
|
||
</StackPanel>
|
||
<TextBox Text="{Binding Comment}" Watermark="комментарий к заказу (необязательно)"/>
|
||
<Grid ColumnDefinitions="*,Auto">
|
||
<TextBlock Grid.Column="0" Text="Итого" FontWeight="SemiBold" VerticalAlignment="Center"
|
||
Foreground="{DynamicResource Text}"/>
|
||
<TextBlock Grid.Column="1" Text="{Binding CartTotal, StringFormat='{}{0:N2}'}"
|
||
FontWeight="Bold" FontSize="16" Foreground="{DynamicResource Accent}"/>
|
||
</Grid>
|
||
<Button Classes="primary" Content="Отправить заказ" HorizontalAlignment="Stretch"
|
||
Command="{Binding SendCommand}" IsEnabled="{Binding !Busy}"/>
|
||
</StackPanel>
|
||
|
||
<ScrollViewer>
|
||
<ItemsControl ItemsSource="{Binding Cart}" x:CompileBindings="False">
|
||
<ItemsControl.ItemTemplate>
|
||
<DataTemplate x:DataType="vm:CartItem">
|
||
<Border Padding="10" Margin="0,0,0,8" CornerRadius="9"
|
||
Background="{DynamicResource RowAlt}" BorderThickness="1" BorderBrush="{DynamicResource Border}">
|
||
<DockPanel>
|
||
<Button DockPanel.Dock="Right" Content="✕" Width="30" Height="30" Padding="0"
|
||
VerticalAlignment="Top" Background="Transparent"
|
||
Foreground="{DynamicResource Muted}" Cursor="Hand"
|
||
Command="{Binding $parent[ItemsControl].DataContext.RemoveFromCartCommand}"
|
||
CommandParameter="{Binding}"/>
|
||
<StackPanel Spacing="6">
|
||
<TextBlock Text="{Binding Name}" Foreground="{DynamicResource Text}"
|
||
TextWrapping="Wrap" MaxLines="2" TextTrimming="CharacterEllipsis"/>
|
||
<TextBlock Text="{Binding Supplier}" Classes="muted"/>
|
||
<Grid ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
|
||
<NumericUpDown Grid.Column="0" Value="{Binding Qty}" Minimum="1" Maximum="100000"
|
||
Increment="1" FormatString="0" Width="120"/>
|
||
<TextBlock Grid.Column="1" Text="{Binding Price, StringFormat='× {0:N2}'}"
|
||
Classes="muted" VerticalAlignment="Center" Margin="10,0"/>
|
||
<TextBlock Grid.Column="2" Text="{Binding LineSum, StringFormat='{}{0:N2}'}"
|
||
FontWeight="SemiBold" Foreground="{DynamicResource Text}"
|
||
VerticalAlignment="Center"/>
|
||
</Grid>
|
||
</StackPanel>
|
||
</DockPanel>
|
||
</Border>
|
||
</DataTemplate>
|
||
</ItemsControl.ItemTemplate>
|
||
</ItemsControl>
|
||
</ScrollViewer>
|
||
</DockPanel>
|
||
</Border>
|
||
</Grid>
|
||
</DockPanel>
|
||
</UserControl>
|