Compare commits

...

2 Commits

10 changed files with 167 additions and 6 deletions

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AutoService.Models
{
public interface IProceedRepository
{
public void SaveOrder(IEnumerable<Work> works, Order order);
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AutoService.Models
{
public class Order
{
public string ClientName { get; set; }
public string AutoModel { get; set; }
public int ServiceId { get; set; }
public int TotalPrice { get; set; }
public int DiscountPercent { get; set; }
}
}

View File

@ -0,0 +1,76 @@
using Microsoft.Extensions.Options;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AutoService.Models
{
public class ProceedRepository : BaseRepository, IProceedRepository
{
public ProceedRepository(IOptions<DatabaseSettings> databaseSettings) : base(databaseSettings)
{
}
public void SaveOrder(IEnumerable<Work> works, Order order)
{
try
{
OpenConnection();
string sql1 = "INSERT INTO orders (id, client_name, car_model, service_id, total_amount, discount_percent, order_date) VALUES(0, @ClientName, @AutoModel, @ServiceId, @TotalAmount, @DiscountPercent, @Date);";
string sql2 = "SELECT LAST_INSERT_ID() as id;";
string sql3 = "INSERT INTO auto_service_db.order_items (id, order_id, work_id, work_price) VALUES(0, @OrderId, @WorkId, @WorkPrice);";
using var transaction = connection.BeginTransaction();
int newId;
try
{
using (var mc = new MySqlCommand(sql1, connection, transaction))
{
mc.Parameters.AddWithValue("@ClientName", order.ClientName);
mc.Parameters.AddWithValue("@AutoModel", order.AutoModel);
mc.Parameters.AddWithValue("@ServiceId", order.ServiceId);
mc.Parameters.AddWithValue("@TotalAmount", order.TotalPrice);
mc.Parameters.AddWithValue("@DiscountPercent", order.DiscountPercent);
mc.Parameters.AddWithValue("@Date", DateTime.Now);
mc.ExecuteNonQuery();
}
using (var mc = new MySqlCommand(sql2, connection, transaction))
{
var result = mc.ExecuteScalar();
if (result != null)
{
newId = Convert.ToInt32(result);
}
else
{
throw new Exception("Это печально всё");
}
}
foreach (var work in works)
{
using (var mc = new MySqlCommand(sql3, connection, transaction))
{
mc.Parameters.AddWithValue("@OrderId", newId);
mc.Parameters.AddWithValue("@WorkId", work.Id);
mc.Parameters.AddWithValue("@WorkPrice", work.Price);
mc.ExecuteNonQuery();
}
}
transaction.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
CloseConnection();
}catch(Exception e)
{
Console.WriteLine(e);
}
}
}
}

View File

@ -8,6 +8,7 @@ namespace AutoService.Models
{ {
public class Work public class Work
{ {
public int Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
public int Price { get; set; } public int Price { get; set; }

View File

@ -16,7 +16,7 @@ namespace AutoService.Models
public IEnumerable<Work> GetByServiceId(int serviceId) public IEnumerable<Work> GetByServiceId(int serviceId)
{ {
string sql = "SELECT work_name, price FROM works WHERE service_id=@SID"; string sql = "SELECT id, work_name, price FROM works WHERE service_id=@SID";
List<Work> result = new(); List<Work> result = new();
try try
{ {
@ -28,6 +28,7 @@ namespace AutoService.Models
{ {
result.Add(new Work() result.Add(new Work()
{ {
Id = reader.GetInt32("id"),
Title = reader.GetString("work_name"), Title = reader.GetString("work_name"),
Price = reader.GetInt32("price") Price = reader.GetInt32("price")

View File

@ -33,6 +33,7 @@ namespace AutoService
s.AddTransient<ReceiptWindow>(); s.AddTransient<ReceiptWindow>();
s.AddSingleton<IWorkRepository,WorkRepository>(); s.AddSingleton<IWorkRepository,WorkRepository>();
s.AddSingleton<IServiceRepository, ServiceRepository>(); s.AddSingleton<IServiceRepository, ServiceRepository>();
s.AddSingleton<IProceedRepository, ProceedRepository>();
s.AddSingleton<LocalContainer>(); s.AddSingleton<LocalContainer>();

View File

@ -1,4 +1,5 @@
using AutoService.Models; using AutoService.Models;
using Avalonia.Controls.ApplicationLifetimes;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -38,6 +39,7 @@ namespace AutoService.ViewModels
_container = localContainer; _container = localContainer;
ClientName = ""; ClientName = "";
AutoModel = ""; AutoModel = "";
try try
{ {
services = new ObservableCollection<Service>(_serviceRepository.GetAll()); services = new ObservableCollection<Service>(_serviceRepository.GetAll());
@ -54,6 +56,7 @@ namespace AutoService.ViewModels
[RelayCommand] [RelayCommand]
public async Task StartWorksWindowAsync() public async Task StartWorksWindowAsync()
{ {
var _currentWindow = (App.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).MainWindow;
if (ClientName.Length > 2 && AutoModel.Length > 2) if (ClientName.Length > 2 && AutoModel.Length > 2)
{ {
if (!_container.StringValues.ContainsKey("ClientName")) if (!_container.StringValues.ContainsKey("ClientName"))
@ -72,11 +75,13 @@ namespace AutoService.ViewModels
{ {
_container.StringValues["AutoModel"] = AutoModel; _container.StringValues["AutoModel"] = AutoModel;
} }
_container.SelectedService = SelectedService;
var vm = _serviceProvider.GetRequiredService<WorksWindowVM>(); var vm = _serviceProvider.GetRequiredService<WorksWindowVM>();
var win = _serviceProvider.GetRequiredService<WorksWindow>(); var win = _serviceProvider.GetRequiredService<WorksWindow>();
win.DataContext = vm; win.DataContext = vm;
vm.SetWindow(win);
win.Show(); win.Show();
_currentWindow.Close();
} }
else else
{ {

View File

@ -1,6 +1,8 @@
using AutoService.Models; using AutoService.Models;
using Avalonia.Controls;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@ -17,6 +19,9 @@ namespace AutoService.ViewModels
private readonly LocalContainer _localContainer; private readonly LocalContainer _localContainer;
private readonly IProceedRepository _proceedRepository;
public Button Btn { get; set; }
[ObservableProperty] [ObservableProperty]
private ObservableCollection<Work> works; private ObservableCollection<Work> works;
@ -31,10 +36,16 @@ namespace AutoService.ViewModels
[ObservableProperty] [ObservableProperty]
private double totalPrice; private double totalPrice;
public ReceiptWindowVM(IServiceProvider serviceProvider, ObservableCollection<Work> works, LocalContainer localContainer) private ReceiptWindow _currentWindow;
public ReceiptWindowVM(IServiceProvider serviceProvider, ObservableCollection<Work> works, LocalContainer localContainer, ProceedRepository proceedRepository)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_localContainer = localContainer; _localContainer = localContainer;
_proceedRepository = proceedRepository;
Works = works; Works = works;
foreach (var item in Works) sumPrice += item.Price; foreach (var item in Works) sumPrice += item.Price;
if (sumPrice >= 10_000) discount = 0.1; if (sumPrice >= 10_000) discount = 0.1;
@ -47,7 +58,33 @@ namespace AutoService.ViewModels
[RelayCommand] [RelayCommand]
public void ProceedTransaction() public void ProceedTransaction()
{ {
Order order = new Order
{
ClientName = _localContainer.StringValues["ClientName"],
AutoModel = _localContainer.StringValues["AutoModel"],
DiscountPercent=(int)(discount*100),
ServiceId=_localContainer.SelectedService.Id,
TotalPrice=(int)TotalPrice
};
_proceedRepository.SaveOrder(Works, order);
Btn.IsEnabled = false;
} }
[RelayCommand]
public void ReturnToMain()
{
var vm = _serviceProvider.GetRequiredService<MainWindowVM>();
var win = _serviceProvider.GetRequiredService<MainWindow>();
win.DataContext = vm;
win.Show();
_currentWindow.Close();
}
public void SetWindow(ReceiptWindow window)
{
_currentWindow = window;
}
} }
} }

View File

@ -20,7 +20,7 @@ namespace AutoService.ViewModels
[ObservableProperty] [ObservableProperty]
private ObservableCollection<WorkIsChecked> works; private ObservableCollection<WorkIsChecked> works;
private WorksWindow _currentWindow;
public WorksWindowVM(IServiceProvider serviceProvider, IWorkRepository workRepository, LocalContainer container) public WorksWindowVM(IServiceProvider serviceProvider, IWorkRepository workRepository, LocalContainer container)
{ {
@ -47,10 +47,18 @@ namespace AutoService.ViewModels
{ {
if (work.IsChecked) selectedWorks.Add(work.Work); if (work.IsChecked) selectedWorks.Add(work.Work);
} }
var vm = ActivatorUtilities.CreateInstance<ReceiptWindowVM>(_serviceProvider, selectedWorks, _localContainer); var procRep = _serviceProvider.GetRequiredService<IProceedRepository>();
var vm = ActivatorUtilities.CreateInstance<ReceiptWindowVM>(_serviceProvider, selectedWorks, _localContainer, procRep);
var win = _serviceProvider.GetRequiredService<ReceiptWindow>(); var win = _serviceProvider.GetRequiredService<ReceiptWindow>();
win.DataContext = vm; win.DataContext = vm;
vm.SetWindow(win);
vm.Btn = win.ProceedBtn;
win.Show(); win.Show();
_currentWindow.Close();
}
public void SetWindow(WorksWindow window)
{
_currentWindow = window;
} }
} }

View File

@ -28,6 +28,8 @@
<TextBlock Text="Итого к оплате: "/> <TextBlock Text="Итого к оплате: "/>
<TextBlock Text="{Binding TotalPrice}"/> <TextBlock Text="{Binding TotalPrice}"/>
</StackPanel> </StackPanel>
<Button Content="Подтвердить!" Command="{Binding ProceedTransactionCommand}"/> <Button Content="Подтвердить!" Command="{Binding ProceedTransactionCommand}" x:Name="ProceedBtn"/>
<Button Content="Вернуться в окно выбора услуг" Command="{Binding ReturnToMainCommand}"/>
</StackPanel> </StackPanel>
</Window> </Window>