diff --git a/ProjectGSM/Entities/Route.cs b/ProjectGSM/Entities/Route.cs index c241f92..c4ce289 100644 --- a/ProjectGSM/Entities/Route.cs +++ b/ProjectGSM/Entities/Route.cs @@ -13,7 +13,7 @@ public class Route public string End_Point { get; private set; } = string.Empty; public float Route_Length { get; private set; } - public static Route CreateEntity(int route_id, string start_point, string end_point, float length) + public static Route CreateEntity (int route_id, string start_point, string end_point, float length) { return new Route { diff --git a/ProjectGSM/Entities/RouteSheet.cs b/ProjectGSM/Entities/RouteSheet.cs index ab757c5..6a44e17 100644 --- a/ProjectGSM/Entities/RouteSheet.cs +++ b/ProjectGSM/Entities/RouteSheet.cs @@ -9,19 +9,19 @@ namespace ProjectGSM.Entities; public class RouteSheet { - public int Trip_ID { get; private set; } + public int RouteSheet_ID { get; private set; } public DateTime Start_Date { get; private set; } public DateTime End_Date { get; private set; } public float Fuel_Consumption { get; private set; } public int Car_ID { get; private set; } public int Driver_ID { get; private set; } - public IEnumerable Routes { get; private set; } = []; + public IEnumerable Routes { get; private set; } = []; - public static RouteSheet CreateOperation(int trip_id, DateTime start_date, DateTime end_date, float consumption, int car_id, int driver_id, IEnumerable routes) + public static RouteSheet CreateOperation(int routeSheet_id, DateTime start_date, DateTime end_date, float consumption, int car_id, int driver_id, IEnumerable routes) { return new RouteSheet { - Trip_ID = trip_id, + RouteSheet_ID = routeSheet_id, Start_Date = start_date, End_Date = end_date, Fuel_Consumption = consumption, diff --git a/ProjectGSM/Entities/Trip_Route.cs b/ProjectGSM/Entities/Trip_Route.cs new file mode 100644 index 0000000..0d6aab5 --- /dev/null +++ b/ProjectGSM/Entities/Trip_Route.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGSM.Entities; + +public class Trip_Route +{ + public int RouteSheet_ID { get; private set; } + public int Route_ID { get; private set; } + + public static Trip_Route CreateElement(int routeSheet_ID, int route_id) + { + return new Trip_Route + { + RouteSheet_ID = routeSheet_ID, + Route_ID = route_id + }; + } +} diff --git a/ProjectGSM/FormGSM.cs b/ProjectGSM/FormGSM.cs index c4756c0..891bbb1 100644 --- a/ProjectGSM/FormGSM.cs +++ b/ProjectGSM/FormGSM.cs @@ -23,7 +23,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -36,7 +36,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -49,7 +49,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -62,7 +62,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -75,7 +75,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -88,7 +88,7 @@ namespace ProjectGSM } catch (Exception ex) { - MessageBox.Show(ex.Message, "?????? ??? ????????", + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } diff --git a/ProjectGSM/Forms/FormCar.Designer.cs b/ProjectGSM/Forms/FormCar.Designer.cs index 95fe80b..111b697 100644 --- a/ProjectGSM/Forms/FormCar.Designer.cs +++ b/ProjectGSM/Forms/FormCar.Designer.cs @@ -31,7 +31,7 @@ Car_Mark = new Label(); Car_Model = new Label(); Car_Type = new Label(); - labelСategoryRights = new Label(); + License = new Label(); Consumption_Rate = new Label(); textBoxCarModel = new TextBox(); textBoxCarMark = new TextBox(); @@ -70,14 +70,14 @@ Car_Type.TabIndex = 2; Car_Type.Text = "Тип машины:"; // - // labelСategoryRights + // License // - labelСategoryRights.AutoSize = true; - labelСategoryRights.Location = new Point(24, 130); - labelСategoryRights.Name = "labelСategoryRights"; - labelСategoryRights.Size = new Size(84, 20); - labelСategoryRights.TabIndex = 3; - labelСategoryRights.Text = "Категория:"; + License.AutoSize = true; + License.Location = new Point(24, 130); + License.Name = "License"; + License.Size = new Size(84, 20); + License.TabIndex = 3; + License.Text = "Категория:"; // // Consumption_Rate // @@ -159,7 +159,7 @@ Controls.Add(textBoxCarMark); Controls.Add(textBoxCarModel); Controls.Add(Consumption_Rate); - Controls.Add(labelСategoryRights); + Controls.Add(License); Controls.Add(Car_Type); Controls.Add(Car_Model); Controls.Add(Car_Mark); @@ -176,7 +176,7 @@ private Label Car_Mark; private Label Car_Model; private Label Car_Type; - private Label labelСategoryRights; + private Label License; private Label Consumption_Rate; private TextBox textBoxCarModel; private TextBox textBoxCarMark; diff --git a/ProjectGSM/Forms/FormPetrolStations.cs b/ProjectGSM/Forms/FormPetrolStations.cs index 635ed2e..14660b9 100644 --- a/ProjectGSM/Forms/FormPetrolStations.cs +++ b/ProjectGSM/Forms/FormPetrolStations.cs @@ -38,7 +38,7 @@ namespace ProjectGSM.Forms MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } - id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Driver_ID"].Value); + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Fuel_ID"].Value); return true; } diff --git a/ProjectGSM/Forms/FormRouteSheet.cs b/ProjectGSM/Forms/FormRouteSheet.cs index a86aa42..4f9ea75 100644 --- a/ProjectGSM/Forms/FormRouteSheet.cs +++ b/ProjectGSM/Forms/FormRouteSheet.cs @@ -23,11 +23,11 @@ namespace ProjectGSM.Forms _routeSheetRepository = routeSheetRepository ?? throw new ArgumentNullException(nameof(routeSheetRepository)); - comboBoxCarID.DataSource = routeSheetRepository.ReadTrips(); + comboBoxCarID.DataSource = carRepository.ReadCars(); comboBoxCarID.DisplayMember = "Car_Mark"; comboBoxCarID.ValueMember = "Car_ID"; - comboBoxDriverID.DataSource = routeSheetRepository.ReadTrips(); + comboBoxDriverID.DataSource = driverRepository.ReadDrivers(); comboBoxDriverID.DisplayMember = "Firstname"; comboBoxDriverID.ValueMember = "Driver_ID"; @@ -36,19 +36,6 @@ namespace ProjectGSM.Forms ColumnRoute.ValueMember = "Route_ID"; } - private List CreateListDriversFromDataGrid() - { - var list = new List(); - foreach (DataGridViewRow row in dataGridViewRoutes.Rows) - { - if (row.Cells["ColumnRoute"].Value == null || row.Cells["ColumnEndPoint"].Value == null) - continue; - - list.Add(Route.CreateEntity(0, (string)row.Cells["ColumnRoute"].Value, (string)row.Cells["ColumnEndPoint"].Value, 0)); - } - return list; - } - private void buttonSave_Click(object sender, EventArgs e) { try @@ -56,7 +43,7 @@ namespace ProjectGSM.Forms if (comboBoxCarID.SelectedIndex < 0 || comboBoxDriverID.SelectedIndex < 0 || dataGridViewRoutes.RowCount < 0) throw new Exception("Имеются незаполненные поля"); - _routeSheetRepository.CreateTrip(RouteSheet.CreateOperation(0, dateTimePickerStartDate.Value, dateTimePickerEndDate.Value, (float)numericUpDownConsumptionRate.Value, (int)comboBoxCarID.SelectedValue!, (int)comboBoxDriverID.SelectedValue!, CreateListDriversFromDataGrid())); + _routeSheetRepository.CreateRouteSheet(RouteSheet.CreateOperation(0, dateTimePickerStartDate.Value, dateTimePickerEndDate.Value, (float)numericUpDownConsumptionRate.Value, (int)comboBoxCarID.SelectedValue!, (int)comboBoxDriverID.SelectedValue!, CreateListDriversFromDataGrid())); Close(); } catch (Exception ex) @@ -67,5 +54,19 @@ namespace ProjectGSM.Forms } private void buttonCancel_Click(object sender, EventArgs e) => Close(); + + private List CreateListDriversFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewRoutes.Rows) + { + if (row.Cells["ColumnRoute"].Value == null) + continue; + + list.Add(Trip_Route.CreateElement(0, Convert.ToInt32(row.Cells["ColumnRoute"].Value))); + } + return list; + } + } } \ No newline at end of file diff --git a/ProjectGSM/Forms/FormRouteSheets.cs b/ProjectGSM/Forms/FormRouteSheets.cs index 190ac92..5a5b9c3 100644 --- a/ProjectGSM/Forms/FormRouteSheets.cs +++ b/ProjectGSM/Forms/FormRouteSheets.cs @@ -29,7 +29,7 @@ namespace ProjectGSM.Forms throw new ArgumentNullException(nameof(routeSheetRepository)); } - private void LoadList() => dataGridView.DataSource = _routeSheetRepository.ReadTrips(); + private void LoadList() => dataGridView.DataSource = _routeSheetRepository.ReadRouteSheet(); private void buttonAdd_Click(object sender, EventArgs e) { diff --git a/ProjectGSM/Program.cs b/ProjectGSM/Program.cs index c3e2ca5..a7a59c0 100644 --- a/ProjectGSM/Program.cs +++ b/ProjectGSM/Program.cs @@ -1,6 +1,11 @@ using ProjectGSM.Repositories; +using ProjectGSM.Repositories.Implementation; using ProjectGSM.Repositories.Implementations; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; using Unity; +using Serilog; +using Unity.Microsoft.Logging; namespace ProjectGSM { @@ -20,14 +25,31 @@ namespace ProjectGSM private static IUnityContainer CreateContainer() { var container = new UnityContainer(); + + container.AddExtension(new LoggingExtension(CreateLoggerFactory())); + container.RegisterType(); container.RegisterType(); container.RegisterType(); container.RegisterType(); container.RegisterType(); container.RegisterType(); + container.RegisterType(); + return container; } + private static LoggerFactory CreateLoggerFactory() + { + var loggerFactory = new LoggerFactory(); + loggerFactory.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json") + .Build()) + .CreateLogger()); + return loggerFactory; + } + } } \ No newline at end of file diff --git a/ProjectGSM/ProjectGSM.csproj b/ProjectGSM/ProjectGSM.csproj index accbdf0..cd889fa 100644 --- a/ProjectGSM/ProjectGSM.csproj +++ b/ProjectGSM/ProjectGSM.csproj @@ -9,7 +9,18 @@ + + + + + + + + + + + @@ -27,4 +38,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/ProjectGSM/Repositories/IConnectionString.cs b/ProjectGSM/Repositories/IConnectionString.cs new file mode 100644 index 0000000..bcdd342 --- /dev/null +++ b/ProjectGSM/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGSM.Repositories; + +public interface IConnectionString +{ + public string ConnectionString { get; } +} diff --git a/ProjectGSM/Repositories/IRouteSheetRepository.cs b/ProjectGSM/Repositories/IRouteSheetRepository.cs index 1a4c65d..3c15916 100644 --- a/ProjectGSM/Repositories/IRouteSheetRepository.cs +++ b/ProjectGSM/Repositories/IRouteSheetRepository.cs @@ -9,7 +9,7 @@ namespace ProjectGSM.Repositories; public interface IRouteSheetRepository { - IEnumerable ReadTrips(DateTime? dateFrom = null, DateTime? dateTo = null, int? carId = null, int? driverId = null, int? routeId = null); + IEnumerable ReadRouteSheet(DateTime? dateFrom = null, DateTime? dateTo = null, int? carId = null, int? driverId = null, int? routeId = null); - void CreateTrip(RouteSheet trip); + void CreateRouteSheet(RouteSheet routeSheet); } diff --git a/ProjectGSM/Repositories/Implementation/CarRepository.cs b/ProjectGSM/Repositories/Implementation/CarRepository.cs index c618d45..ebf6593 100644 --- a/ProjectGSM/Repositories/Implementation/CarRepository.cs +++ b/ProjectGSM/Repositories/Implementation/CarRepository.cs @@ -1,34 +1,123 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using ProjectGSM.Entities; +using Dapper; +using Newtonsoft.Json; +using Npgsql; namespace ProjectGSM.Repositories.Implementations; public class CarRepository : ICarRepository { + + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public CarRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateCar(Car car) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(car)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Car (Car_Mark, Car_Model, Car_Type, License, Consumption_Rate) +VALUES (@Car_Mark, @Car_Model, @Car_Type, @License, @Consumption_Rate)"; + connection.Execute(queryInsert, car); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteCar(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Car + WHERE Car_ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Car ReadCarByID(int id) { - return Car.CreateEntity(0, string.Empty, string.Empty, 0, 0, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Car + WHERE Car_ID=@id"; + var car = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(car)); + return car; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadCars() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Car"; + var cars = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(cars)); + return cars; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdateCar(Car car) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(car)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Car + SET + Car_Mark=@Car_Mark, + Car_Model=@Car_Model, + Car_Type=@Car_Type, + License=@License, + Consumption_Rate=@Consumption_Rate + WHERE Car_ID=@Car_ID"; + connection.Execute(queryUpdate, car); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/ProjectGSM/Repositories/Implementation/ConnectionString.cs b/ProjectGSM/Repositories/Implementation/ConnectionString.cs new file mode 100644 index 0000000..cf7e414 --- /dev/null +++ b/ProjectGSM/Repositories/Implementation/ConnectionString.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGSM.Repositories.Implementation; +public class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Server=localhost; Port=5432;Database= postgres;User Id=postgres; Password=postgres"; +} diff --git a/ProjectGSM/Repositories/Implementation/DriverRepository.cs b/ProjectGSM/Repositories/Implementation/DriverRepository.cs index 40e14a3..ff6a679 100644 --- a/ProjectGSM/Repositories/Implementation/DriverRepository.cs +++ b/ProjectGSM/Repositories/Implementation/DriverRepository.cs @@ -1,34 +1,121 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectGSM.Entities; +using Dapper; namespace ProjectGSM.Repositories.Implementations; public class DriverRepository : IDriverRepository { + + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public DriverRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateDriver(Driver driver) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(driver)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Driver (Firstname, Secondname, Driver_License) +VALUES (@Firstname, @Secondname, @Driver_License)"; + connection.Execute(queryInsert, driver); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteDriver(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Driver + WHERE Driver_ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Driver ReadDriverByID(int id) { - return Driver.CreateEntity(0, string.Empty, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Driver + WHERE Driver_ID=@id"; + var driver = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(driver)); + return driver; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadDrivers() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Driver"; + var drivers = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(drivers)); + return drivers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdateDriver(Driver driver) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(driver)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Driver + SET + Firstname=@Firstname, + Secondname=@Secondname, + Driver_License=@Driver_License + WHERE Driver_ID=@Driver_ID"; + connection.Execute(queryUpdate, driver); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/ProjectGSM/Repositories/Implementation/PetrolStationRepository.cs b/ProjectGSM/Repositories/Implementation/PetrolStationRepository.cs index f6f9ece..4ebec13 100644 --- a/ProjectGSM/Repositories/Implementation/PetrolStationRepository.cs +++ b/ProjectGSM/Repositories/Implementation/PetrolStationRepository.cs @@ -1,34 +1,120 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectGSM.Entities; +using Dapper; namespace ProjectGSM.Repositories.Implementations; public class PetrolStationRepository : IPetrolStationRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public PetrolStationRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreatePetrolStation(PetrolStation fuel) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(fuel)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO PetrolStation (Fuel_Type, Price_Per_Liter, Amount) +VALUES (@Fuel_Type, @Price_Per_Liter, @Amount)"; + connection.Execute(queryInsert, fuel); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeletePetrolStation(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM PetrolStation + WHERE Fuel_ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public PetrolStation ReadPetrolStationByID(int id) { - return PetrolStation.CreateEntity(0, 0, 0, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM PetrolStation + WHERE Fuel_ID=@id"; + var fuel = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(fuel)); + return fuel; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadPetrolStations() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM PetrolStation"; + var fuels = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(fuels)); + return fuels; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdatePetrolStation(PetrolStation PetrolStation) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(PetrolStation)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE PetrolStation + SET + Fuel_Type=@Fuel_Type, + Price_Per_Liter=@Price_Per_Liter, + Amount=@Amount + WHERE Fuel_ID=@Fuel_ID"; + connection.Execute(queryUpdate, PetrolStation); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/ProjectGSM/Repositories/Implementation/RefillRepository.cs b/ProjectGSM/Repositories/Implementation/RefillRepository.cs index ad829f0..cae5c9a 100644 --- a/ProjectGSM/Repositories/Implementation/RefillRepository.cs +++ b/ProjectGSM/Repositories/Implementation/RefillRepository.cs @@ -1,21 +1,57 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectGSM.Entities; +using Dapper; namespace ProjectGSM.Repositories.Implementations; public class RefillRepository : IRefillRepository { + + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + public RefillRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + + public void CreateRefill(Refill refill) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(refill)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Refill (Refill_Date, Quantity, Fuel_ID, Car_ID) +VALUES (@Refill_Date, @Quantity, @Fuel_ID, @Car_ID)"; + connection.Execute(queryInsert, refill); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadRefills(DateTime? dateFrom = null, DateTime? dateTo = null, int? fuelId = null, int? carId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Refill"; + var refills = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(refills)); + return refills; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectGSM/Repositories/Implementation/RouteRepository.cs b/ProjectGSM/Repositories/Implementation/RouteRepository.cs index 2e31bdf..308e7a4 100644 --- a/ProjectGSM/Repositories/Implementation/RouteRepository.cs +++ b/ProjectGSM/Repositories/Implementation/RouteRepository.cs @@ -1,34 +1,122 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectGSM.Entities; +using Dapper; + namespace ProjectGSM.Repositories.Implementations; public class RouteRepository : IRouteRepository { + + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public RouteRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateRoute(Route route) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(route)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Route (Start_Point, End_Point, Route_Length) +VALUES (@Start_Point, @End_Point, @Route_Length)"; + connection.Execute(queryInsert, route); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteRoute(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Route + WHERE Route_ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Route ReadRouteByID(int id) { - return Route.CreateEntity(0, string.Empty, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Route + WHERE Route_ID=@id"; + var route = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(route)); + return route; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadRoutes() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Route"; + var routes = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(routes)); + return routes; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdateRoute(Route route) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(route)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Route + SET + Start_Point=@Start_Point, + End_Point=@End_Point, + Route_Length=@Route_Length + WHERE Route_ID=@Route_ID"; + connection.Execute(queryUpdate, route); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/ProjectGSM/Repositories/Implementation/RouteSheetRepository.cs b/ProjectGSM/Repositories/Implementation/RouteSheetRepository.cs index d012897..9cb08b0 100644 --- a/ProjectGSM/Repositories/Implementation/RouteSheetRepository.cs +++ b/ProjectGSM/Repositories/Implementation/RouteSheetRepository.cs @@ -1,21 +1,78 @@ -using ProjectGSM.Entities; -using ProjectGSM.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectGSM.Entities; +using Dapper; namespace ProjectGSM.Repositories.Implementations; public class RouteSheetRepository : IRouteSheetRepository { - public void CreateTrip(RouteSheet routeSheet) + + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public RouteSheetRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; } - public IEnumerable ReadTrips(DateTime? dateFrom = null, DateTime? dateTo = null, int? carId = null, int? driverId = null, int? routeId = null) + + public void CreateRouteSheet(RouteSheet routeSheet) { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(routeSheet)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" + INSERT INTO RouteSheet (Start_Date, End_Date, Fuel_Consumption, Car_ID, Driver_ID) + VALUES (@Start_Date, @End_Date, @Fuel_Consumption, @Car_ID, @Driver_ID); + SELECT MAX(RouteSheet_ID) FROM RouteSheet"; + var RouteSheetId = connection.QueryFirst(queryInsert, routeSheet, transaction); + var querySubInsert = @" + INSERT INTO Trip_Route (RouteSheet_ID, Route_ID) + VALUES (@RouteSheetID, @Route_ID)"; + foreach (var elem in routeSheet.Routes) + { + connection.Execute(querySubInsert, new + { + RouteSheetId, + elem.Route_ID + }, transaction); + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } + + public IEnumerable ReadRouteSheet(DateTime? dateFrom = null, DateTime? dateTo = null, int? carId = null, int? driverId = null, int? routeId = null) + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM RouteSheet"; + var routeSheets = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(routeSheets)); + return routeSheets; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } + + } diff --git a/ProjectGSM/appsettings.json b/ProjectGSM/appsettings.json new file mode 100644 index 0000000..540cd04 --- /dev/null +++ b/ProjectGSM/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file