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 int Id { get; set; }
public string Title { get; set; }
public int Price { get; set; }

View File

@ -16,7 +16,7 @@ namespace AutoService.Models
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();
try
{
@ -28,6 +28,7 @@ namespace AutoService.Models
{
result.Add(new Work()
{
Id = reader.GetInt32("id"),
Title = reader.GetString("work_name"),
Price = reader.GetInt32("price")

View File

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

View File

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

View File

@ -1,6 +1,8 @@
using AutoService.Models;
using Avalonia.Controls;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@ -17,6 +19,9 @@ namespace AutoService.ViewModels
private readonly LocalContainer _localContainer;
private readonly IProceedRepository _proceedRepository;
public Button Btn { get; set; }
[ObservableProperty]
private ObservableCollection<Work> works;
@ -31,10 +36,16 @@ namespace AutoService.ViewModels
[ObservableProperty]
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;
_localContainer = localContainer;
_proceedRepository = proceedRepository;
Works = works;
foreach (var item in Works) sumPrice += item.Price;
if (sumPrice >= 10_000) discount = 0.1;
@ -47,7 +58,33 @@ namespace AutoService.ViewModels
[RelayCommand]
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,8 +20,8 @@ namespace AutoService.ViewModels
[ObservableProperty]
private ObservableCollection<WorkIsChecked> works;
private WorksWindow _currentWindow;
public WorksWindowVM(IServiceProvider serviceProvider, IWorkRepository workRepository, LocalContainer container)
{
_serviceProvider = serviceProvider;
@ -47,10 +47,18 @@ namespace AutoService.ViewModels
{
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>();
win.DataContext = vm;
vm.SetWindow(win);
vm.Btn = win.ProceedBtn;
win.Show();
_currentWindow.Close();
}
public void SetWindow(WorksWindow window)
{
_currentWindow = window;
}
}

View File

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