From 136591c7a7aadd66dd8d0169484c44f9b66a58d3 Mon Sep 17 00:00:00 2001 From: "yuliya.mavrina@internet.ru" Date: Sun, 19 May 2024 23:49:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=5F2=D1=81=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RenovationWork/RenovationWork/FormMain.cs | 108 +++--- .../BusinessLogics/OrderLogic.cs | 322 ++++++++---------- .../BusinessLogics/ShopLogic.cs | 321 +++++++++-------- .../DataFileSingleton.cs | 104 +++--- .../Implements/OrderStorage.cs | 158 +++++---- 5 files changed, 497 insertions(+), 516 deletions(-) diff --git a/RenovationWork/RenovationWork/FormMain.cs b/RenovationWork/RenovationWork/FormMain.cs index a968b62..3344d1a 100644 --- a/RenovationWork/RenovationWork/FormMain.cs +++ b/RenovationWork/RenovationWork/FormMain.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; +using RenovationWorkDataModels.Enums; namespace RenovationWorkView { @@ -76,54 +77,67 @@ namespace RenovationWorkView } } - private void buttonTakeOrderInWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel { Id = id }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка передачи заказа в работу"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + private OrderBindingModel CreateBindingModel(int id, bool isDone = false) + { + return new OrderBindingModel + { + Id = id, + RepairId = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["RepairId"].Value), + Status = Enum.Parse(dataGridView.SelectedRows[0].Cells["Status"].Value.ToString()), + Count = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Count"].Value), + Sum = double.Parse(dataGridView.SelectedRows[0].Cells["Sum"].Value.ToString()), + DateCreate = DateTime.Parse(dataGridView.SelectedRows[0].Cells["DateCreate"].Value.ToString()), + }; + } - private void buttonOrderReady_Click(object sender, EventArgs e) + private void buttonTakeOrderInWork_Click(object sender, EventArgs e) { - if (dataGridView.SelectedRows.Count == 1) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); - try - { - var operationResult = _orderLogic.FinishOrder(new OrderBindingModel { Id = id }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о готовности заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); + try + { + var operationResult = _orderLogic.TakeOrderInWork(CreateBindingModel(id)); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка передачи заказа в работу"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void buttonIssuedOrder_Click(object sender, EventArgs e) + private void buttonOrderReady_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); + try + { + var operationResult = _orderLogic.FinishOrder(CreateBindingModel(id)); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void buttonIssuedOrder_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { @@ -131,7 +145,7 @@ namespace RenovationWorkView _logger.LogInformation("Заказ No{id}. Меняется статус на 'Выдан'", id); try { - var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel {Id = id}); + var operationResult = _orderLogic.DeliveryOrder(CreateBindingModel(id)); if (!operationResult) { throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); @@ -147,7 +161,7 @@ namespace RenovationWorkView } } - private void buttonRef_Click(object sender, EventArgs e) + private void buttonRef_Click(object sender, EventArgs e) { LoadData(); } diff --git a/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/OrderLogic.cs b/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/OrderLogic.cs index 2795148..e239cec 100644 --- a/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/OrderLogic.cs @@ -14,123 +14,99 @@ using Microsoft.Extensions.Logging; namespace RenovationWorkBusinessLogic.BusinessLogics { - public class OrderLogic : IOrderLogic - { - private readonly ILogger _logger; - private readonly IOrderStorage _orderStorage; - private readonly IShopLogic _shopLogic; - private readonly IRepairStorage _repairStorage; - private readonly IShopStorage _shopStorage; - public OrderLogic(ILogger logger, IOrderStorage orderStorage, - IRepairStorage repairStorage, IShopLogic shopLogic, IShopStorage shopStorage) - { - _logger = logger; - _orderStorage = orderStorage; - _repairStorage = repairStorage; - _shopLogic = shopLogic; - _shopStorage = shopStorage; - } - public bool CreateOrder(OrderBindingModel model) - { - CheckModel(model); - if (model.Status != OrderStatus.Неизвестен) - { - _logger.LogWarning("Insert operation failed. Order status incorrect."); - return false; - } - model.Status = OrderStatus.Принят; - if (_orderStorage.Insert(model) == null) - { - model.Status = OrderStatus.Неизвестен; - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } - private bool StatusUpdate(OrderBindingModel model, OrderStatus status) - { - var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); - if (element == null) - { - _logger.LogWarning("Read operation failed"); - return false; - } - CheckModel(element); - if (element.Status != status - 1) - { - _logger.LogWarning("Status change operation failed"); - throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); - } - if (element.Status == OrderStatus.Готов) - { - var repair = _repairStorage.GetElement(new RepairSearchModel() { Id = model.RepairId }); - if (repair == null) - { - _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); - return false; - } - if (CheckSupply(repair, model.Count) == false) - { - _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Shop supply error."); - return false; - } - } - model.Status = status; - if (model.Status == OrderStatus.Выдан) - model.DateImplement = DateTime.Now; - _orderStorage.Update(model); - return true; - } - public bool DeliveryOrder(OrderBindingModel model) - { - return StatusUpdate(model, OrderStatus.Выдан); - } + public class OrderLogic : IOrderLogic + { + private readonly ILogger _logger; + private readonly IOrderStorage _orderStorage; + private readonly IShopLogic _shopLogic; + private readonly IRepairStorage _repairStorage; + private readonly IShopStorage _shopStorage; + public OrderLogic(ILogger logger, IOrderStorage orderStorage, + IRepairStorage repairStorage, IShopLogic shopLogic, IShopStorage shopStorage) + { + _logger = logger; + _orderStorage = orderStorage; + _repairStorage = repairStorage; + _shopLogic = shopLogic; + _shopStorage = shopStorage; + } + public bool CreateOrder(OrderBindingModel model) + { + CheckModel(model); + if (model.Status != OrderStatus.Неизвестен) + { + _logger.LogWarning("Insert operation failed. Order status incorrect."); + return false; + } + model.Status = OrderStatus.Принят; + if (_orderStorage.Insert(model) == null) + { + model.Status = OrderStatus.Неизвестен; + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + private bool StatusUpdate(OrderBindingModel model, OrderStatus status) + { + CheckModel(model); + var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); + if (element == null) + { + _logger.LogWarning("Read operation failed"); + return false; + } + if (element.Status != status - 1) + { + _logger.LogWarning("Status change operation failed"); + throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); + } + if (element.Status == OrderStatus.Готов) + { + var repair = _repairStorage.GetElement(new RepairSearchModel() { Id = model.RepairId }); + if (repair == null) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); + return false; + } + if (CheckSupply(repair, model.Count) == false) + { + _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Shop supply error."); + return false; + } + } + model.Status = status; + if (model.Status == OrderStatus.Выдан) + model.DateImplement = DateTime.Now; + _orderStorage.Update(model); + return true; + } + public bool DeliveryOrder(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Выдан); + } - public bool FinishOrder(OrderBindingModel model) - { - return StatusUpdate(model, OrderStatus.Готов); - } - public bool TakeOrderInWork(OrderBindingModel model) - { - return StatusUpdate(model, OrderStatus.Выполняется); - } - public List? ReadList(OrderSearchModel? model) - { - _logger.LogInformation("ReadList. OrderId:{Id}", model?.Id); - var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model); - if (list == null) - { - _logger.LogWarning("ReadList return null list"); - return null; - } - _logger.LogInformation("ReadList. Count:{Count}", list.Count); - return list; - } - private void CheckModel(OrderBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (model.RepairId < 0) - { - throw new ArgumentNullException("Некорректный идентификатор документа", nameof(model.RepairId)); - } - if (model.Count <= 0) - { - throw new ArgumentNullException("Количество работ в заказе должно быть больше 0", nameof(model.Count)); - } - if (model.Sum <= 0) - { - throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum)); - } - _logger.LogInformation("Order. Count: {Count}. Sum: {Sum}. Id: {Id}", model.Count, model.Sum, model.Id); - } - private void CheckModel(OrderViewModel model, bool withParams = true) + public bool FinishOrder(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Готов); + } + public bool TakeOrderInWork(OrderBindingModel model) + { + return StatusUpdate(model, OrderStatus.Выполняется); + } + public List? ReadList(OrderSearchModel? model) + { + _logger.LogInformation("ReadList. OrderId:{Id}", model?.Id); + var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + private void CheckModel(OrderBindingModel model, bool withParams = true) { if (model == null) { @@ -140,10 +116,6 @@ namespace RenovationWorkBusinessLogic.BusinessLogics { return; } - if (model.RepairId < 0) - { - throw new ArgumentNullException("Некорректный идентификатор документа", nameof(model.RepairId)); - } if (model.Count <= 0) { throw new ArgumentNullException("Количество работ в заказе должно быть больше 0", nameof(model.Count)); @@ -155,59 +127,59 @@ namespace RenovationWorkBusinessLogic.BusinessLogics _logger.LogInformation("Order. Count: {Count}. Sum: {Sum}. Id: {Id}", model.Count, model.Sum, model.Id); } private bool CheckSupply(IRepairModel repair, int count) - { - if (count <= 0) - { - _logger.LogWarning("Check then supply operation error. Repair count < 0."); - return false; - } - int sumCapacity = 0; - int sumCount = 0; - sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); - sumCount = _shopStorage.GetFullList().Select(x => x.ShopRepairs.Select(y => y.Value.Item2).Sum()).Sum(); - int freeSpace = sumCapacity - sumCount; - if (freeSpace - count < 0) - { - _logger.LogWarning("Check then supply operation error. There's no place for new Repair in shops."); - return false; - } - foreach (var shop in _shopStorage.GetFullList()) - { - freeSpace = shop.MaxCapacity; - foreach (var doc in shop.ShopRepairs) - { - freeSpace -= doc.Value.Item2; - } - if (freeSpace == 0) - { - continue; - } - if (freeSpace - count >= 0) - { - if (_shopLogic.ReplenishRepairs(new() { Id = shop.Id }, repair, count)) - count = 0; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (freeSpace - count < 0) - { - if (_shopLogic.ReplenishRepairs(new() { Id = shop.Id }, repair, freeSpace)) - count -= freeSpace; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (count <= 0) - { - return true; - } - } - return false; - } - } + { + if (count <= 0) + { + _logger.LogWarning("Check then supply operation error. Repair count < 0."); + return false; + } + int sumCapacity = 0; + int sumCount = 0; + sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); + sumCount = _shopStorage.GetFullList().Select(x => x.ShopRepairs.Select(y => y.Value.Item2).Sum()).Sum(); + int freeSpace = sumCapacity - sumCount; + if (freeSpace - count < 0) + { + _logger.LogWarning("Check then supply operation error. There's no place for new Repair in shops."); + return false; + } + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace = shop.MaxCapacity; + foreach (var doc in shop.ShopRepairs) + { + freeSpace -= doc.Value.Item2; + } + if (freeSpace == 0) + { + continue; + } + if (freeSpace - count >= 0) + { + if (_shopLogic.ReplenishRepairs(new() { Id = shop.Id }, repair, count)) + count = 0; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (freeSpace - count < 0) + { + if (_shopLogic.ReplenishRepairs(new() { Id = shop.Id }, repair, freeSpace)) + count -= freeSpace; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (count <= 0) + { + return true; + } + } + return false; + } + } } \ No newline at end of file diff --git a/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/ShopLogic.cs b/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/ShopLogic.cs index 53ffe56..e469ca8 100644 --- a/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/ShopLogic.cs +++ b/RenovationWork/RenovationWorkBusinessLogic/BusinessLogics/ShopLogic.cs @@ -13,164 +13,163 @@ using Microsoft.Extensions.Logging; namespace RenovationWorkBusinessLogic.BusinessLogics { - public class ShopLogic : IShopLogic - { - private readonly ILogger _logger; - private readonly IShopStorage _shopStorage; - public ShopLogic(ILogger logger, IShopStorage ShopStorage) - { - _logger = logger; - _shopStorage = ShopStorage; - } - public List? ReadList(ShopSearchModel? model) - { - _logger.LogInformation("ReadList. ShopName:{ShopName}. Id:{ Id}", model?.ShopName, model?.Id); - var list = model == null ? _shopStorage.GetFullList() : - _shopStorage.GetFilteredList(model); - if (list == null) - { - _logger.LogWarning("ReadList return null list"); - return null; - } - _logger.LogInformation("ReadList. Count:{Count}", list.Count); - return list; - } - public ShopViewModel? ReadElement(ShopSearchModel model) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - _logger.LogInformation("ReadElement. ShopName:{ShopName}.Id:{ Id}", model.ShopName, model.Id); - var element = _shopStorage.GetElement(model); - if (element == null) - { - _logger.LogWarning("ReadElement element not found"); - return null; - } - _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); - return element; - } - public bool Create(ShopBindingModel model) - { - CheckModel(model); - if (_shopStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } - public bool Update(ShopBindingModel model) - { - CheckModel(model); - if (_shopStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } - public bool Delete(ShopBindingModel model) - { - CheckModel(model, false); - _logger.LogInformation("Delete. Id:{Id}", model.Id); - if (_shopStorage.Delete(model) == null) - { - _logger.LogWarning("Delete operation failed"); - return false; - } - return true; - } - public bool ReplenishRepairs(ShopSearchModel model, IRepairModel repair, int count) - { - { - _logger.LogInformation("Try to replenish repairs. ShopName:{ShopName}. Id:{Id}", model.ShopName, model.Id); - if (model == null) - { - _logger.LogWarning("Read operation failed"); - throw new ArgumentNullException(nameof(model)); - } - ShopViewModel? curModel = ReadElement(model); - if (curModel == null) - { - _logger.LogWarning("Read operation failed"); - throw new ArgumentNullException(nameof(curModel)); - } - if (repair == null) - { - _logger.LogWarning("Read operation failed"); - throw new ArgumentNullException(nameof(repair)); - } - if (count <= 0) - { - _logger.LogWarning("Read operation failed"); - throw new ArgumentException("Количество должно быть положительным"); - } - int countItems = curModel.ShopRepairs.Select(x => x.Value.Item2).Sum(); - if (curModel.MaxCapacity - countItems >= count) - { - if (curModel.ShopRepairs.TryGetValue(repair.Id, out var sameDocument)) - { - curModel.ShopRepairs[repair.Id] = (repair, sameDocument.Item2 + count); - _logger.LogInformation("Same repair found by supply. Added {0} of {1} in {2} shop", count, repair.RepairName, curModel.ShopName); - } - else - { - curModel.ShopRepairs[repair.Id] = (repair, count); - _logger.LogInformation("New repair added by supply. Added {0} of {1} in {2} shop", count, repair.RepairName, curModel.ShopName); - } - _shopStorage.Update(new() - { - Id = curModel.Id, - ShopName = curModel.ShopName, - Address = curModel.Address, - OpeningDate = curModel.OpeningDate, - ShopRepairs = curModel.ShopRepairs, - MaxCapacity = curModel.MaxCapacity - }); - } - else - { - _logger.LogWarning("Required shop is overflowed"); - return false; - } - return true; - } - } - private void CheckModel(ShopBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (string.IsNullOrEmpty(model.ShopName)) - { - throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName)); - } - if (string.IsNullOrEmpty(model.Address)) - { - throw new ArgumentNullException("Нет адреса магазина", nameof(model.Address)); - } - _logger.LogInformation("Shop. ShopName:{ShopName}.Address:{Address}. DateOpen:{DateOpen}. Id: { Id}", - model.ShopName, model.Address, model.OpeningDate, model.Id); - var element = _shopStorage.GetElement(new ShopSearchModel - { - ShopName = model.ShopName - }); - if (element != null && element.Id != model.Id) - { - throw new InvalidOperationException("Магазин с таким названием уже есть"); - } - } - public bool SellRepairs(IRepairModel repair, int count) - { - return _shopStorage.SellRepairs(repair, count); - } - } -} - + public class ShopLogic : IShopLogic + { + private readonly ILogger _logger; + private readonly IShopStorage _shopStorage; + public ShopLogic(ILogger logger, IShopStorage ShopStorage) + { + _logger = logger; + _shopStorage = ShopStorage; + } + public List? ReadList(ShopSearchModel? model) + { + _logger.LogInformation("ReadList. ShopName:{ShopName}. Id:{ Id}", model?.ShopName, model?.Id); + var list = model == null ? _shopStorage.GetFullList() : + _shopStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + public ShopViewModel? ReadElement(ShopSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ShopName:{ShopName}.Id:{ Id}", model.ShopName, model.Id); + var element = _shopStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + public bool Create(ShopBindingModel model) + { + CheckModel(model); + if (_shopStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool Update(ShopBindingModel model) + { + CheckModel(model); + if (_shopStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + public bool Delete(ShopBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_shopStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + public bool ReplenishRepairs(ShopSearchModel model, IRepairModel repair, int count) + { + { + _logger.LogInformation("Try to replenish repairs. ShopName:{ShopName}. Id:{Id}", model.ShopName, model.Id); + if (model == null) + { + _logger.LogWarning("Read operation failed"); + throw new ArgumentNullException(nameof(model)); + } + ShopViewModel? curModel = ReadElement(model); + if (curModel == null) + { + _logger.LogWarning("Read operation failed"); + throw new ArgumentNullException(nameof(curModel)); + } + if (repair == null) + { + _logger.LogWarning("Read operation failed"); + throw new ArgumentNullException(nameof(repair)); + } + if (count <= 0) + { + _logger.LogWarning("Read operation failed"); + throw new ArgumentException("Количество должно быть положительным"); + } + int countItems = curModel.ShopRepairs.Select(x => x.Value.Item2).Sum(); + if (curModel.MaxCapacity - countItems >= count) + { + if (curModel.ShopRepairs.TryGetValue(repair.Id, out var sameDocument)) + { + curModel.ShopRepairs[repair.Id] = (repair, sameDocument.Item2 + count); + _logger.LogInformation("Same repair found by supply. Added {0} of {1} in {2} shop", count, repair.RepairName, curModel.ShopName); + } + else + { + curModel.ShopRepairs[repair.Id] = (repair, count); + _logger.LogInformation("New repair added by supply. Added {0} of {1} in {2} shop", count, repair.RepairName, curModel.ShopName); + } + _shopStorage.Update(new() + { + Id = curModel.Id, + ShopName = curModel.ShopName, + Address = curModel.Address, + OpeningDate = curModel.OpeningDate, + ShopRepairs = curModel.ShopRepairs, + MaxCapacity = curModel.MaxCapacity + }); + } + else + { + _logger.LogWarning("Required shop is overflowed"); + return false; + } + return true; + } + } + private void CheckModel(ShopBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ShopName)) + { + throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName)); + } + if (string.IsNullOrEmpty(model.Address)) + { + throw new ArgumentNullException("Нет адреса магазина", nameof(model.Address)); + } + _logger.LogInformation("Shop. ShopName:{ShopName}.Address:{Address}. DateOpen:{DateOpen}. Id: { Id}", + model.ShopName, model.Address, model.OpeningDate, model.Id); + var element = _shopStorage.GetElement(new ShopSearchModel + { + ShopName = model.ShopName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Магазин с таким названием уже есть"); + } + } + public bool SellRepairs(IRepairModel repair, int count) + { + return _shopStorage.SellRepairs(repair, count); + } + } +} \ No newline at end of file diff --git a/RenovationWork/RenovationWorkFileImplement/DataFileSingleton.cs b/RenovationWork/RenovationWorkFileImplement/DataFileSingleton.cs index 4dff837..3ceceb5 100644 --- a/RenovationWork/RenovationWorkFileImplement/DataFileSingleton.cs +++ b/RenovationWork/RenovationWorkFileImplement/DataFileSingleton.cs @@ -9,59 +9,59 @@ using RenovationWorkFileImplement.Models; namespace RenovationWorkFileImplement { - internal class DataFileSingleton - { - private static DataFileSingleton? instance; - private readonly string ComponentFileName = "Component.xml"; - private readonly string OrderFileName = "Order.xml"; - private readonly string RepairFileName = "Repair.xml"; - private readonly string ShopFileName = "Shops.xml"; - public List Shops { get; private set; } - public List Components { get; private set; } - public List Orders { get; private set; } - public List Repairs { get; private set; } + internal class DataFileSingleton + { + private static DataFileSingleton? instance; + private readonly string ComponentFileName = "Component.xml"; + private readonly string OrderFileName = "Order.xml"; + private readonly string RepairFileName = "Repair.xml"; + private readonly string ShopFileName = "Shops.xml"; + public List Shops { get; private set; } + public List Components { get; private set; } + public List Orders { get; private set; } + public List Repairs { get; private set; } - public static DataFileSingleton GetInstance() - { - if (instance == null) - { - instance = new DataFileSingleton(); - } - return instance; - } - public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement); - public void SaveRepairs() => SaveData(Repairs, RepairFileName, "Repairs", x => x.GetXElement); - public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); - public void SaveShops() => SaveData(Shops, ShopFileName,"Shops", x => x.GetXElement); - private DataFileSingleton() - { - Components = LoadData(ComponentFileName, "Component", x => - Component.Create(x)!)!; - Repairs = LoadData(RepairFileName, "Repair", x => - Repair.Create(x)!)!; - Orders = LoadData(OrderFileName, "Order", x => - Order.Create(x)!)!; - Shops = LoadData(ShopFileName, "Shop", x => - Shop.Create(x)!)!; - } - private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) - { - if (File.Exists(filename)) - { - return - XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList(); - } - return new List(); - } - private static void SaveData(List data, string filename, string xmlNodeName, Func selectFunction) - { - if (data != null) - { - new XDocument(new XElement(xmlNodeName, - data.Select(selectFunction).ToArray())).Save(filename); - } - } + public static DataFileSingleton GetInstance() + { + if (instance == null) + { + instance = new DataFileSingleton(); + } + return instance; + } + public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement); + public void SaveRepairs() => SaveData(Repairs, RepairFileName, "Repairs", x => x.GetXElement); + public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); + public void SaveShops() => SaveData(Shops, ShopFileName, "Shops", x => x.GetXElement); + private DataFileSingleton() + { + Components = LoadData(ComponentFileName, "Component", x => + Component.Create(x)!)!; + Repairs = LoadData(RepairFileName, "Repair", x => + Repair.Create(x)!)!; + Orders = LoadData(OrderFileName, "Order", x => + Order.Create(x)!)!; + Shops = LoadData(ShopFileName, "Shop", x => + Shop.Create(x)!)!; + } + private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) + { + if (File.Exists(filename)) + { + return + XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList(); + } + return new List(); + } + private static void SaveData(List data, string filename, string xmlNodeName, Func selectFunction) + { + if (data != null) + { + new XDocument(new XElement(xmlNodeName, + data.Select(selectFunction).ToArray())).Save(filename); + } + } - } + } } \ No newline at end of file diff --git a/RenovationWork/RenovationWorkFileImplement/Implements/OrderStorage.cs b/RenovationWork/RenovationWorkFileImplement/Implements/OrderStorage.cs index 586c135..b873f6a 100644 --- a/RenovationWork/RenovationWorkFileImplement/Implements/OrderStorage.cs +++ b/RenovationWork/RenovationWorkFileImplement/Implements/OrderStorage.cs @@ -11,86 +11,82 @@ using RenovationWorkFileImplement.Models; namespace RenovationWorkFileImplement.Implements { - public class OrderStorage : IOrderStorage - { - private readonly DataFileSingleton source; - public OrderStorage() - { - source = DataFileSingleton.GetInstance(); - } - public List GetFullList() - { - return source.Orders.Select(x => AccessRepairStorage(x.GetViewModel)).ToList(); - } - public List GetFilteredList(OrderSearchModel model) - { - if (!model.Id.HasValue) - { - return new(); - } - return source.Orders.Where(x => x.Id == model.Id) - .Select(x => AccessRepairStorage(x.GetViewModel)) - .ToList(); - } - public OrderViewModel? GetElement(OrderSearchModel model) - { - if (!model.Id.HasValue) - { - return null; - } - return AccessRepairStorage(source.Orders.FirstOrDefault( - x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel - ); - } - public OrderViewModel? Insert(OrderBindingModel model) - { - model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1; - var newOrder = Order.Create(model); - if (newOrder == null) - { - return null; - } - source.Orders.Add(newOrder); - source.SaveOrders(); - return AccessRepairStorage(newOrder.GetViewModel); - } - public OrderViewModel? Update(OrderBindingModel model) - { - var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); - if (order == null) - { - return null; - } - order.Update(model); - source.SaveOrders(); - return AccessRepairStorage(order.GetViewModel); - } - public OrderViewModel? Delete(OrderBindingModel model) - { - var element = source.Orders.FirstOrDefault(x => x.Id == - model.Id); - if (element != null) - { - source.Orders.Remove(element); - source.SaveOrders(); - return AccessRepairStorage(element.GetViewModel); - } - return null; - } - public OrderViewModel? AccessRepairStorage(OrderViewModel model) - { - if (model == null) - return null; - foreach (var Repair in source.Repairs) - { - if (Repair.Id == model.RepairId) - { - model.RepairName = Repair.RepairName; - break; - } - } - return model; - } - } + public class OrderStorage : IOrderStorage + { + private readonly DataFileSingleton source; + public OrderStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Orders.Select(x => AccessRepairStorage(x.GetViewModel)).ToList(); + } + public List GetFilteredList(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return new(); + } + return source.Orders.Where(x => x.Id == model.Id) + .Select(x => AccessRepairStorage(x.GetViewModel)) + .ToList(); + } + public OrderViewModel? GetElement(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + return AccessRepairStorage(source.Orders.FirstOrDefault( + x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel + ); + } + public OrderViewModel? Insert(OrderBindingModel model) + { + model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1; + var newOrder = Order.Create(model); + if (newOrder == null) + { + return null; + } + source.Orders.Add(newOrder); + source.SaveOrders(); + return AccessRepairStorage(newOrder.GetViewModel); + } + public OrderViewModel? Update(OrderBindingModel model) + { + var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + source.SaveOrders(); + return AccessRepairStorage(order.GetViewModel); + } + public OrderViewModel? Delete(OrderBindingModel model) + { + var element = source.Orders.FirstOrDefault(x => x.Id == + model.Id); + if (element != null) + { + source.Orders.Remove(element); + source.SaveOrders(); + return AccessRepairStorage(element.GetViewModel); + } + return null; + } + public OrderViewModel? AccessRepairStorage(OrderViewModel model) + { + if (model == null) + return null; + var repair = source.Repairs.FirstOrDefault(x => (x.Id == model.RepairId)); + if (repair == null) + return model; + model.RepairName = repair.RepairName; + return model; + } + } }