From 130ea7cc1dbeebbf4b178198b7c355b7625a5f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D0=B5=D0=BC=20=D0=A5=D0=B0=D1=80=D0=BB?= =?UTF-8?q?=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Mon, 6 Feb 2023 11:12:20 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/DishLogic.cs | 116 +++++++++++++++++ .../BusinessLogics/OrderLogic.cs | 120 ++++++++++++++++++ .../BindingModels/DishBindingModel.cs | 2 +- .../BindingModels/OrderBindingModel.cs | 2 +- .../BusinessLogicsContracts/IDishLogic.cs | 6 +- .../StoragesContracts/IDishStorage.cs | 6 +- .../ViewModels/OrderViewModel.cs | 4 +- .../Models/IOrderModel.cs | 2 +- .../DataListSingleton.cs | 4 +- .../Models/Dish.cs | 4 +- 10 files changed, 251 insertions(+), 15 deletions(-) create mode 100644 FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/DishLogic.cs create mode 100644 FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs diff --git a/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/DishLogic.cs b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/DishLogic.cs new file mode 100644 index 0000000..0b1cc44 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/DishLogic.cs @@ -0,0 +1,116 @@ +using AbstractFoodOrdersContracts.BusinessLogicsContracts; +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.StoragesContracts; +using AbstractFoodOrdersContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersBusinessLogic.BusinessLogics +{ + public class DishLogic : IDishLogic + { + private readonly ILogger _logger; + private readonly IDishStorage _dishStorage; + public DishLogic(ILogger logger, IDishStorage dishStorage) + { + _logger = logger; + _dishStorage = dishStorage; + } + public List? ReadList(DishSearchModel? model) + { + _logger.LogInformation("ReadList. DishName:{DishName}.Id:{ Id}", model?.DishName, model?.Id); + var list = model == null ? _dishStorage.GetFullList() : _dishStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + public DishViewModel? ReadElement(DishSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. DishName:{DishName}.Id:{ Id}", model.DishName, model.Id); + var element = _dishStorage.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(DishBindingModel model) + { + CheckModel(model); + if (_dishStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool Update(DishBindingModel model) + { + CheckModel(model); + if (_dishStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + public bool Delete(DishBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_dishStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + private void CheckModel(DishBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.DishName)) + { + throw new ArgumentNullException("Нет названия изделия", nameof(model.DishName)); + } + if (model.Price <= 0) + { + throw new ArgumentNullException("Цена изделия должна быть больше 0", nameof(model.Price)); + } + if (model.DishComponents == null || model.DishComponents.Count == 0) + { + throw new ArgumentNullException("Перечень компонентов не может быть пустым", nameof(model.DishComponents)); + } + _logger.LogInformation("Dish. DishName:{DishName}.Price:{Price}.Id: { Id}", model.DishName, model.Price, model.Id); + var element = _dishStorage.GetElement(new DishSearchModel + { + DishName = model.DishName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Изделие с таким названием уже есть"); + } + } + } +} diff --git a/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs new file mode 100644 index 0000000..b598f0d --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs @@ -0,0 +1,120 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.BusinessLogicsContracts; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.StoragesContracts; +using AbstractFoodOrdersContracts.ViewModels; +using AbstractFoodOrdersDataModels.Enums; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersBusinessLogic.BusinessLogics +{ + public class OrderLogic : IOrderLogic + { + private readonly ILogger _logger; + private readonly IOrderStorage _orderStorage; + public OrderLogic(ILogger logger, IOrderStorage orderStorage) + { + _logger = logger; + _orderStorage = orderStorage; + } + 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; + } + public bool CreateOrder(OrderBindingModel model) + { + CheckModel(model); + if (model.Status != OrderStatus.Неизвестен) + return false; + model.Status = OrderStatus.Принят; + if (_orderStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool TakeOrderInWork(OrderBindingModel model) + { + return ChangeStatus(model, OrderStatus.Выполняется); + } + public bool FinishOrder(OrderBindingModel model) + { + return ChangeStatus(model, OrderStatus.Готов); + } + public bool DeliveryOrder(OrderBindingModel model) + { + return ChangeStatus(model, OrderStatus.Выдан); + } + private void CheckModel(OrderBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (model.Count <= 0) + { + throw new ArgumentException("Колличество изделий в заказе не может быть меньше 1", nameof(model.Count)); + } + if (model.Sum <= 0) + { + throw new ArgumentException("Стоимость заказа на может быть меньше 1", nameof(model.Sum)); + } + if (model.DateImplement.HasValue && model.DateImplement < model.DateCreate) + { + throw new ArithmeticException($"Дата выдачи заказа {model.DateImplement} не может быть раньше даты его создания {model.DateCreate}"); + } + _logger.LogInformation("Reinforced. ReinforcedId:{ReinforcedId}.Count:{Count}.Sum:{Sum}Id:{Id}", + model.DishId, model.Count, model.Sum, model.Id); + } + private bool ChangeStatus(OrderBindingModel model, OrderStatus requiredStatus) + { + CheckModel(model, false); + var element = _orderStorage.GetElement(new OrderSearchModel() + { + Id = model.Id + }); + if (element == null) + { + throw new ArgumentNullException(nameof(element)); + } + model.DateCreate = element.DateCreate; + model.DishId = element.DishId; + model.DateImplement = element.DateImplement; + model.Status = element.Status; + model.Count = element.Count; + model.Sum = element.Sum; + if (requiredStatus - model.Status == 1) + { + model.Status = requiredStatus; + if (model.Status == OrderStatus.Выдан) + model.DateImplement = DateTime.Now; + if (_orderStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + _logger.LogWarning("Changing status operation faled: Current-{Status}:required-{requiredStatus}.", model.Status, requiredStatus); + throw new ArgumentException($"Невозможно приствоить статус {requiredStatus} заказу с текущим статусом {model.Status}"); + } + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/BindingModels/DishBindingModel.cs b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/DishBindingModel.cs index 5a45022..e48c8d1 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/BindingModels/DishBindingModel.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/DishBindingModel.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace AbstractFoodOrdersContracts.BindingModels { - public class ProductBindingModel : IDishModel + public class DishBindingModel : IDishModel { public int Id { get; set; } public string DishName { get; set; } = string.Empty; diff --git a/FoodOrders/AbstractFoodOrdersContracts/BindingModels/OrderBindingModel.cs b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/OrderBindingModel.cs index 21cf8d5..bdac97b 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/BindingModels/OrderBindingModel.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/OrderBindingModel.cs @@ -11,7 +11,7 @@ namespace AbstractFoodOrdersContracts.BindingModels public class OrderBindingModel : IOrderModel { public int Id { get; set; } - public int ProductId { get; set; } + public int DishId { get; set; } public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; diff --git a/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IDishLogic.cs b/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IDishLogic.cs index 8b231cc..f003613 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IDishLogic.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IDishLogic.cs @@ -13,9 +13,9 @@ namespace AbstractFoodOrdersContracts.BusinessLogicsContracts { List? ReadList(DishSearchModel? model); DishViewModel? ReadElement(DishSearchModel model); - bool Create(ProductBindingModel model); - bool Update(ProductBindingModel model); - bool Delete(ProductBindingModel model); + bool Create(DishBindingModel model); + bool Update(DishBindingModel model); + bool Delete(DishBindingModel model); } } diff --git a/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IDishStorage.cs b/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IDishStorage.cs index c3dcbac..8250a86 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IDishStorage.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IDishStorage.cs @@ -14,9 +14,9 @@ namespace AbstractFoodOrdersContracts.StoragesContracts List GetFullList(); List GetFilteredList(DishSearchModel model); DishViewModel? GetElement(DishSearchModel model); - DishViewModel? Insert(ProductBindingModel model); - DishViewModel? Update(ProductBindingModel model); - DishViewModel? Delete(ProductBindingModel model); + DishViewModel? Insert(DishBindingModel model); + DishViewModel? Update(DishBindingModel model); + DishViewModel? Delete(DishBindingModel model); } } diff --git a/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs index 1c19ca4..15a83a9 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs @@ -13,9 +13,9 @@ namespace AbstractFoodOrdersContracts.ViewModels { [DisplayName("Номер")] public int Id { get; set; } - public int ProductId { get; set; } + public int DishId { get; set; } [DisplayName("Изделие")] - public string ProductName { get; set; } = string.Empty; + public string DishName { get; set; } = string.Empty; [DisplayName("Количество")] public int Count { get; set; } [DisplayName("Сумма")] diff --git a/FoodOrders/AbstractFoodOrdersDataModels/Models/IOrderModel.cs b/FoodOrders/AbstractFoodOrdersDataModels/Models/IOrderModel.cs index fcef39d..e196a08 100644 --- a/FoodOrders/AbstractFoodOrdersDataModels/Models/IOrderModel.cs +++ b/FoodOrders/AbstractFoodOrdersDataModels/Models/IOrderModel.cs @@ -9,7 +9,7 @@ namespace AbstractFoodOrdersDataModels.Models { public interface IOrderModel : IId { - int ProductId { get; } + int DishId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs b/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs index 48da865..b4e1a01 100644 --- a/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs +++ b/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs @@ -12,12 +12,12 @@ namespace AbstractFoodOrdersListImplement private static DataListSingleton? _instance; public List Components { get; set; } public List Orders { get; set; } - public List Products { get; set; } + public List Dishes { get; set; } private DataListSingleton() { Components = new List(); Orders = new List(); - Products = new List(); + Dishes = new List(); } public static DataListSingleton GetInstance() { diff --git a/FoodOrders/AbstractFoodOrdersListImplement/Models/Dish.cs b/FoodOrders/AbstractFoodOrdersListImplement/Models/Dish.cs index 4759747..da864ae 100644 --- a/FoodOrders/AbstractFoodOrdersListImplement/Models/Dish.cs +++ b/FoodOrders/AbstractFoodOrdersListImplement/Models/Dish.cs @@ -19,7 +19,7 @@ namespace AbstractFoodOrdersListImplement.Models get; private set; } = new Dictionary(); - public static Dish? Create(ProductBindingModel? model) + public static Dish? Create(DishBindingModel? model) { if (model == null) { @@ -27,7 +27,7 @@ namespace AbstractFoodOrdersListImplement.Models } return new Dish(){ Id = model.Id, DishName = model.DishName, Price = model.Price, DishComponents = model.DishComponents }; } - public void Update(ProductBindingModel? model) + public void Update(DishBindingModel? model) { if (model == null) {