From f6e89b60405cc867a6a19d370c384e0a374e34d1 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 2 Dec 2024 17:51:40 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D1=82=D0=B8=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5.=20=D1=81=D0=BB=D0=BE=D0=BC=D0=B0=D0=BB=D0=BE=D1=81?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Entities/Order.cs | 28 +-- .../Entities/OrderDetail.cs | 2 +- .../Forms/FormOrder.Designer.cs | 3 +- .../ProjectRepairCompany/Forms/FormOrder.cs | 179 ++++++++++-------- .../ProjectRepairCompany/Forms/FormOrders.cs | 25 ++- .../Implementations/OrderRepository.cs | 120 +++++++----- 6 files changed, 191 insertions(+), 166 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs index 27d03fa..a310fc8 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs @@ -14,34 +14,22 @@ public class Order public DateTime DateIssue { get; private set; } public int FullPrice { get; private set; } public int MasterId { get; private set; } - public List OrderDetails { get; private set; } - - private Order() + public IEnumerable OrderDetails { get; private set; } = []; + + public static Order CreateOperation(int id, int fullPrice, int masterId, DateTime dateCompletion, + DateTime dateIssue, IEnumerable orderDetails) { - OrderDetails = new List(); - } - - public static Order CreateOperation(int id, int fullPrice, int masterId, DateTime dateCompletion, DateTime dateIssue) - { - if (dateCompletion > DateTime.Now || dateIssue > DateTime.Now) - { - throw new ArgumentException("Дата начала работы и дата завершения не могут быть в будущем."); - } + return new Order { Id = id, - OrderDate = DateTime.Now, // Автоматически задается текущая дата + OrderDate = DateTime.Now, DateCompletion = dateCompletion, DateIssue = dateIssue, FullPrice = fullPrice, - MasterId = masterId + MasterId = masterId, + OrderDetails = orderDetails }; } - - public void AddOrderDetail(int detailId, int detailCount) - { - var orderDetail = OrderDetail.CreateOperation(this.Id, detailId, detailCount); - OrderDetails.Add(orderDetail); - } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/OrderDetail.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/OrderDetail.cs index c465ed8..00073f2 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Entities/OrderDetail.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Entities/OrderDetail.cs @@ -10,7 +10,7 @@ public class OrderDetail { public int OrderId { get; private set; } public int DetailId { get; private set; } - public int DetailCount { get; private set; } + public int DetailCount { get; private set; } public static OrderDetail CreateOperation(int orderId, int detailId, int detailCount) { diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.Designer.cs index f7dff8a..ac512f3 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.Designer.cs @@ -165,6 +165,7 @@ groupBox1.Size = new Size(401, 224); groupBox1.TabIndex = 12; groupBox1.TabStop = false; + groupBox1.Text = "Деталь"; // // dataGridView // @@ -183,7 +184,7 @@ // // Detail // - Detail.HeaderText = "Деталь"; + Detail.HeaderText = "Название детали"; Detail.Name = "Detail"; // // DetailCount diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.cs index 517f83d..4199710 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrder.cs @@ -1,5 +1,7 @@ using ProjectRepairCompany.Entities; +using ProjectRepairCompany.Entities.Enums; using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; using System; using System.Collections.Generic; using System.Diagnostics.Metrics; @@ -8,100 +10,121 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; -namespace ProjectRepairCompany.Forms +namespace ProjectRepairCompany.Forms; + +public partial class FormOrder : Form { - public partial class FormOrder : Form + private readonly IOrderRepository _orderRepository; + private int? _orderId; + + public int Id { - private readonly IOrderRepository _orderRepository; - private readonly IDetailRepository _detailRepository; - private int? _orderId; - - public int Id - { - set - { - try - { - var order = _orderRepository.ReadOrderById(value); - if (order == null) - { - throw new InvalidOperationException(nameof(order)); - } - numericUpDownFullPrice.Value = order.FullPrice; - comboBoxMaster.SelectedValue = order.MasterId; - dateTimeCompletion.Value = order.DateCompletion; - dateTimeIssue.Value = order.DateIssue; - - foreach (var detail in order.OrderDetails) - { - dataGridView.Rows.Add(detail.DetailId, detail.DetailCount); - } - - _orderId = value; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - - public FormOrder(IOrderRepository orderRepository, IMasterRepository masterRepository, IDetailRepository detailRepository) - { - InitializeComponent(); - - _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); - _detailRepository = detailRepository ?? throw new ArgumentNullException(nameof(detailRepository)); - - comboBoxMaster.DataSource = masterRepository.ReadMasters(); - comboBoxMaster.DisplayMember = "MasterName"; - comboBoxMaster.ValueMember = "Id"; - - Detail.DataSource = _detailRepository.ReadDetails(); - Detail.DisplayMember = "NameDetail"; - Detail.ValueMember = "Id"; - } - - private void ButtonSave_Click(object sender, EventArgs e) + set { try { - if (dataGridView.RowCount < 1 || comboBoxMaster.SelectedIndex < 0) + var order = _orderRepository.ReadOrderById(value); + if (order == null) { - throw new Exception("Имеются незаполненные поля."); + throw new InvalidOperationException(nameof(order)); } - var order = Order.CreateOperation(_orderId ?? 0, Convert.ToInt32(numericUpDownFullPrice.Value), - (int)comboBoxMaster.SelectedValue, dateTimeCompletion.Value, dateTimeIssue.Value); + comboBoxMaster.SelectedValue = order.MasterId; + numericUpDownFullPrice.Value = (decimal)order.FullPrice; + dateTimeCompletion.Value = order.DateCompletion; + dateTimeIssue.Value = order.DateIssue; - foreach (DataGridViewRow row in dataGridView.Rows) + dataGridView.Rows.Clear(); + foreach (var detail in order.OrderDetails) { - if (row.Cells["Detail"].Value != null && row.Cells["DetailCount"].Value != null) - { - var detailId = (int)row.Cells["Detail"].Value; - var detailCount = (int)row.Cells["DetailCount"].Value; - order.AddOrderDetail(detailId, detailCount); - } + dataGridView.Rows.Add(detail.DetailId, detail.DetailCount); } - if (_orderId.HasValue) - { - _orderRepository.UpdateOrder(order); - } - else - { - _orderRepository.CreateOrder(order); - } - - Close(); + _orderId = value; } catch (Exception ex) { - MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } } - - - private void ButtonCancel_Click(object sender, EventArgs e) => Close(); } + + public FormOrder(IOrderRepository orderRepository, IMasterRepository masterRepository, IDetailRepository detailRepository) + { + InitializeComponent(); + + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + + + comboBoxMaster.DataSource = masterRepository.ReadMasters(); + comboBoxMaster.DisplayMember = "MasterName"; + comboBoxMaster.ValueMember = "Id"; + + Detail.DataSource = detailRepository.ReadDetails(); + Detail.DisplayMember = "NameDetail"; + Detail.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridView.RowCount < 1 || comboBoxMaster.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля."); + } + + var order = CreateOrder(); + if (_orderId.HasValue) + { + _orderRepository.UpdateOrder(order); + } + else + { + _orderRepository.CreateOrder(order); + } + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private List CreateListOrderDetailsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridView.Rows) + { + if (row.Cells["Detail"].Value == null || + row.Cells["DetailCount"].Value == null) + { + continue; + } + list.Add(OrderDetail.CreateOperation(0, + Convert.ToInt32(row.Cells["Detail"].Value), + Convert.ToInt32(row.Cells["DetailCount"].Value))); + } + return list; + } + private Order CreateOrder() + { + var orderDetails = CreateListOrderDetailsFromDataGrid(); + + return Order.CreateOperation( + _orderId ?? 0, + Convert.ToInt32(numericUpDownFullPrice.Value), + (int)comboBoxMaster.SelectedValue, + dateTimeCompletion.Value, + dateTimeIssue.Value, + orderDetails + ); + } + + + } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.cs index b040713..3ff9cfa 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.cs @@ -1,5 +1,6 @@ using ProjectRepairCompany.Entities; using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; using System; using System.Collections.Generic; using System.ComponentModel; @@ -61,9 +62,14 @@ namespace ProjectRepairCompany.Forms try { var form = _container.Resolve(); - form.Id = findId; - form.ShowDialog(); - LoadList(); + + form.Id = findId; + + if (form.ShowDialog() == DialogResult.OK) + { + LoadList(); + dataGridView.Refresh(); + } } catch (Exception ex) { @@ -93,17 +99,8 @@ namespace ProjectRepairCompany.Forms } } - private void LoadList() - { - try - { - dataGridView.DataSource = _orderRepository.ReadOrders(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка загрузки данных", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + private void LoadList() => dataGridView.DataSource =_orderRepository.ReadOrders(); + private bool TryGetIdentifierFromSelectRow(out int id) { diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs index 6c2ece1..7846265 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs @@ -25,85 +25,101 @@ public class OrderRepository : IOrderRepository } public void CreateOrder(Order order) { - _logger.LogInformation("Добавление объекта"); - _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(order)); + _logger.LogInformation("Добавление нового заказа."); + _logger.LogDebug("Объект заказа: {json}", JsonConvert.SerializeObject(order)); + try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); + var queryInsert = @" -INSERT INTO ""Order"" (OrderDate, DateCompletion, DateIssue, FullPrice, MasterId) -VALUES (@OrderDate, @DateCompletion, @DateIssue, @FullPrice, @MasterId); -SELECT MAX(Id) FROM ""Order"""; + INSERT INTO ""Order"" (OrderDate, DateCompletion, DateIssue, FullPrice, MasterId) + VALUES (@OrderDate, @DateCompletion, @DateIssue, @FullPrice, @MasterId) + RETURNING Id"; + var orderId = connection.QueryFirst(queryInsert, order, transaction); + _logger.LogInformation("Новый заказ создан с Id {OrderId}", orderId); + var querySubInsert = @" -INSERT INTO OrderDetail (OrderId, DetailId, DetailCount) -VALUES (@OrderId, @DetailId, @DetailCount)"; - foreach (var elem in order.OrderDetails) + INSERT INTO OrderDetail (OrderId, DetailId, DetailCount) + VALUES (@OrderId, @DetailId, @DetailCount)"; + + foreach (var elem in order.OrderDetails) { - connection.Execute(querySubInsert, new {orderId, elem.DetailId, elem.DetailCount}, transaction); + _logger.LogDebug("Добавление детали: DetailId = {DetailId}, DetailCount = {DetailCount}", + elem.DetailId, elem.DetailCount); + connection.Execute(querySubInsert, new { orderId, elem.DetailId, elem.DetailCount }, transaction); } + transaction.Commit(); + _logger.LogInformation("Заказ с деталями успешно добавлен."); } catch (Exception ex) { - _logger.LogError(ex, "Ошибка добавления"); + _logger.LogError(ex, "Ошибка при добавлении заказа."); throw; } } + public void UpdateOrder(Order order) +{ + _logger.LogInformation("Обновление заказа с Id {OrderId}", order.Id); + _logger.LogDebug("Обновляемый объект заказа: {json}", JsonConvert.SerializeObject(order)); + + try { - _logger.LogInformation("Обновление объекта"); - _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(order)); - try + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + + var queryUpdate = @" + UPDATE ""Order"" + SET DateCompletion = @DateCompletion, + DateIssue = @DateIssue, + FullPrice = @FullPrice, + MasterId = @MasterId + WHERE Id = @Id"; + + connection.Execute(queryUpdate, new { - using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - connection.Open(); - using var transaction = connection.BeginTransaction(); + order.Id, + order.DateCompletion, + order.DateIssue, + order.FullPrice, + order.MasterId + }, transaction); - var queryUpdate = @" - UPDATE ""Order"" - SET DateCompletion = @DateCompletion, - DateIssue = @DateIssue, - FullPrice = @FullPrice, - MasterId = @MasterId - WHERE Id = @Id"; + _logger.LogInformation("Заказ с Id {OrderId} обновлен.", order.Id); - connection.Execute(queryUpdate, new + var queryDeleteDetails = "DELETE FROM OrderDetail WHERE OrderId = @OrderId"; + connection.Execute(queryDeleteDetails, new { order.Id }, transaction); + + var queryInsertDetails = @" + INSERT INTO OrderDetail (OrderId, DetailId, DetailCount) + VALUES (@OrderId, @DetailId, @DetailCount)"; + + foreach (var detail in order.OrderDetails) + { + connection.Execute(queryInsertDetails, new { order.Id, - order.DateCompletion, - order.DateIssue, - order.FullPrice, - order.MasterId + detail.DetailId, + detail.DetailCount }, transaction); - - var queryDeleteDetails = "DELETE FROM OrderDetail WHERE OrderId = @OrderId"; - connection.Execute(queryDeleteDetails, new { order.Id }, transaction); - - var queryInsertDetails = @" - INSERT INTO OrderDetail (OrderId, DetailId, DetailCount) - VALUES (@OrderId, @DetailId, @DetailCount)"; - - foreach (var detail in order.OrderDetails) - { - connection.Execute(queryInsertDetails, new - { - order.Id, - detail.DetailId, - detail.DetailCount - }, transaction); - } - - transaction.Commit(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка при обновлении"); - throw; } + + transaction.Commit(); + _logger.LogInformation("Детали для заказа с Id {OrderId} обновлены.", order.Id); } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при обновлении заказа с Id {OrderId}.", order.Id); + throw; + } +} + public void DeleteOrder(int id)