Blagodat/OknaFunciy/AddZakazWindow.axaml.cs

262 lines
8.9 KiB
C#
Raw Normal View History

2025-02-11 10:23:14 +00:00
using Avalonia.Controls;
using Avalonia.Interactivity;
2025-04-25 11:37:47 +00:00
using Avalonia.Media.Imaging;
2025-04-22 07:25:24 +00:00
using Demka_Snova_1.Hardik.Conect;
2025-02-11 10:23:14 +00:00
using Demka_Snova_1.Hardik.Conect.Dao;
2025-04-25 11:37:47 +00:00
using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
2025-02-11 10:23:14 +00:00
using System;
using System.Collections.Generic;
2025-04-25 11:37:47 +00:00
using System.IO;
2025-04-22 07:25:24 +00:00
using System.Linq;
2025-04-25 11:37:47 +00:00
using System.Text;
using System.Threading.Tasks;
2025-02-11 10:23:14 +00:00
namespace Demka_Snova_1.OknaFunciy;
public partial class AddZakazWindow : Window
{
2025-04-25 11:37:47 +00:00
private List<KlientDao> _allClients;
private List<uslugiDao> _allServices;
private List<SelectedService> _selectedServices = new();
private KlientDao _selectedClient;
private int _nextOrderId;
private string _generatedBarcodeData;
//private TextBox OrderNumberTextBox => this.FindControl<TextBox>("OrderNumberTextBox");
//private TextBox ClientSearchTextBoxTextBox => this.FindControl<TextBox>("ClientSearchTextBoxTextBox");
private TextBox ServiceSearchTextBox => this.FindControl<TextBox>("ServiceSearchTextBox");
//private TextBox TotalPriceTextBlock => this.FindControl<TextBox>("TotalPriceTextBlock");
//private DataGrid ClientsDataGrid => this.FindControl<DataGrid>("ClientsDataGrid");
//private DataGrid ServicesDataGrid => this.FindControl<DataGrid>("ServicesDataGrid");
//private DataGrid SelectedServicesDataGrid => this.FindControl<DataGrid>("SelectedServicesDataGrid");
2025-02-11 10:23:14 +00:00
public AddZakazWindow()
{
InitializeComponent();
2025-05-07 11:41:56 +00:00
this.DataContext = this;
2025-05-06 10:38:00 +00:00
this.Loaded += OnWindowLoaded;
2025-04-25 11:37:47 +00:00
}
2025-05-06 10:38:00 +00:00
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
LoadData();
}
2025-04-25 11:37:47 +00:00
private async void LoadData()
{
try
{
using (var db = new DatabaseConnection())
{
_allClients = db.GetAllKlienti();
_allServices = db.GetAllUslugi();
2025-05-07 11:41:56 +00:00
foreach (var service in _allServices)
2025-05-06 10:38:00 +00:00
{
2025-05-07 11:41:56 +00:00
service.Code = service.id.ToString();
2025-05-06 10:38:00 +00:00
}
2025-04-25 11:37:47 +00:00
var orders = db.GetAllOrders();
_nextOrderId = orders.Count > 0 ? orders.Max(o => o.ID) + 1 : 1;
OrderNumberTextBox.Text = _nextOrderId.ToString();
OrderNumberTextBox.Watermark = $"Рекомендуемый номер: {_nextOrderId}";
ClientsDataGrid.ItemsSource = _allClients;
ServicesDataGrid.ItemsSource = _allServices;
}
}
catch (Exception ex)
{
await ShowError($"Ошибка загрузки данных: {ex.Message}");
}
2025-04-22 07:25:24 +00:00
}
2025-04-25 11:37:47 +00:00
private void OrderNumberTextBox_KeyDown(object sender, Avalonia.Input.KeyEventArgs e)
2025-04-22 07:25:24 +00:00
{
2025-04-25 11:37:47 +00:00
if (e.Key == Avalonia.Input.Key.Enter)
2025-04-22 07:25:24 +00:00
{
2025-04-25 11:37:47 +00:00
if (int.TryParse(OrderNumberTextBox.Text, out int orderNum))
{
_nextOrderId = orderNum;
}
else
{
OrderNumberTextBox.Text = _nextOrderId.ToString();
}
2025-04-22 07:25:24 +00:00
}
2025-02-11 10:23:14 +00:00
}
2025-04-25 11:37:47 +00:00
private void ClientSearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
2025-05-07 11:41:56 +00:00
var searchText = ClientSearchTextBox.Text?.ToLower() ?? string.Empty;
if (_allClients != null)
{
ClientsDataGrid.ItemsSource = _allClients
.Where(c => c.Fio?.ToLower().Contains(searchText) == true ||
c.Code.ToString().Contains(searchText))
.ToList();
}
2025-04-25 11:37:47 +00:00
}
private void ServiceSearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
2025-02-11 10:23:14 +00:00
{
2025-04-25 11:37:47 +00:00
var searchText = ServiceSearchTextBox.Text.ToLower();
ServicesDataGrid.ItemsSource = _allServices
.Where(s => s.Name.ToLower().Contains(searchText) ||
2025-05-06 10:38:00 +00:00
s.Code.ToString().Contains(searchText))
2025-04-25 11:37:47 +00:00
.ToList();
}
private void ClientsDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_selectedClient = ClientsDataGrid.SelectedItem as KlientDao;
UpdateButtonsState();
}
private async void AddClientButton_Click(object sender, RoutedEventArgs e)
{
var addClientWindow = new AddClientWindow();
var result = await addClientWindow.ShowDialog<KlientDao>(this);
if (result != null)
{
try
{
using (var db = new DatabaseConnection())
{
_allClients.Add(result);
ClientsDataGrid.ItemsSource = _allClients;
ClientsDataGrid.SelectedItem = result;
}
}
catch (Exception ex)
{
await ShowError($"Ошибка при добавлении клиента: {ex.Message}");
}
}
}
2025-02-11 10:23:14 +00:00
2025-04-25 11:37:47 +00:00
private async void AddServiceButton_Click(object sender, RoutedEventArgs e)
{
var selectedService = ServicesDataGrid.SelectedItem as uslugiDao;
if (selectedService == null)
2025-02-11 10:23:14 +00:00
{
2025-04-25 11:37:47 +00:00
await ShowError("Выберите услугу из списка");
2025-02-11 10:23:14 +00:00
return;
}
2025-04-25 11:37:47 +00:00
/*var hoursWindow = new InputHoursWindow(selectedService.Name);
var hours = await hoursWindow.ShowDialog<int?>(this);
if (hours.HasValue && hours > 0)
2025-02-11 10:23:14 +00:00
{
2025-04-25 11:37:47 +00:00
_selectedServices.Add(new SelectedService
{
Id = selectedService.id.ToString(),
Name = selectedService.Name,
PrisePerH = selectedService.PrisePerH,
Hours = hours.Value
});
2025-02-11 10:23:14 +00:00
2025-04-25 11:37:47 +00:00
UpdateSelectedServices();
}*/
}
private void RemoveServiceButton_Click(object sender, RoutedEventArgs e)
{
var selected = SelectedServicesDataGrid.SelectedItem as SelectedService;
if (selected != null)
{
_selectedServices.Remove(selected);
UpdateSelectedServices();
}
2025-02-11 10:23:14 +00:00
}
2025-04-25 11:37:47 +00:00
private void UpdateSelectedServices()
{
SelectedServicesDataGrid.ItemsSource = _selectedServices.ToList();
TotalPriceTextBlock.Text = $"Итого: {_selectedServices.Sum(s => s.Total)} руб.";
UpdateButtonsState();
}
private async void SaveOrderButton_Click(object sender, RoutedEventArgs e)
{
if (_selectedClient == null || !_selectedServices.Any())
{
await ShowError("Выберите клиента и добавьте хотя бы одну услугу");
return;
}
try
{
using (var db = new DatabaseConnection())
{
var order = new ordersDao
{
ID = _nextOrderId,
CodeZakaz = _generatedBarcodeData,
Date = DateOnly.FromDateTime(DateTime.Now),
Time = TimeOnly.FromDateTime(DateTime.Now),
CodeClient = _selectedClient.Code.ToString(),
Usluga = string.Join(", ", _selectedServices.Select(s => $"{s.Name} ({s.Hours}ч)")),
Status = "Активен",
Prokat = _selectedServices.Sum(s => s.Hours)
};
db.AddOrder(order);
var orderData = $"датааказа={DateTime.Now:yyyy-MM-ddTHH:mm:ss}&номераказа={_nextOrderId}";
var base64Data = Convert.ToBase64String(Encoding.UTF8.GetBytes(orderData));
var orderLink = $"C:/Users/PC/source/Dopolnenia/Fails/Doky";
var linkPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
$"Ссылкааказа_{_nextOrderId}.txt");
File.WriteAllText(linkPath, orderLink);
var pdfPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
$"Штрих-код_{_nextOrderId}.pdf");
await ShowError($"Заказ №{_nextOrderId} успешно сохранен!\n" +
$"Штрих-код сохранен в: {pdfPath}\n" +
$"Ссылка сохранена в: {linkPath}");
this.Close();
}
}
catch (Exception ex)
{
await ShowError($"Ошибка при сохранении заказа: {ex.Message}");
}
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
2025-02-11 10:23:14 +00:00
{
this.Close();
}
2025-04-25 11:37:47 +00:00
private void UpdateButtonsState()
{
SaveOrderButton.IsEnabled = _selectedClient != null && _selectedServices.Any();
}
private async Task ShowError(string message)
2025-03-05 09:12:58 +00:00
{
var dialog = new Window
2025-02-11 10:23:14 +00:00
{
2025-04-25 11:37:47 +00:00
Title = "Информация",
Content = new TextBlock { Text = message },
Width = 400,
Height = 200,
2025-05-06 10:38:00 +00:00
WindowStartupLocation = WindowStartupLocation.CenterScreen
2025-03-05 09:12:58 +00:00
};
2025-05-06 10:38:00 +00:00
// await dialog.Show()
2025-03-05 09:12:58 +00:00
await dialog.ShowDialog(this);
}
}