From 58ffae6460d81a483a3ca5bfe7ed291bb034951b Mon Sep 17 00:00:00 2001 From: Sergey Kozyrev Date: Tue, 20 Feb 2024 16:32:44 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SewingDresses/SewingDresses.sln | 49 ++++ .../BusinessLogic/ComponentLogic.cs | 115 +++++++++ .../BusinessLogic/DressLogic.cs | 111 +++++++++ .../BusinessLogic/OrderLogic.cs | 103 ++++++++ .../SewingDressesBusinessLogic.csproj | 14 ++ .../BindingModels/ComponentBindingModel.cs | 11 + .../BindingModels/DressBindingModel.cs | 12 + .../BindingModels/OrderBindingModel.cs | 16 ++ .../IComponentLogic.cs | 20 ++ .../BusinessLogicsContracts/IDressLogic.cs | 15 ++ .../BusinessLogicsContracts/IOrderLogic.cs | 15 ++ .../SearchModels/ComponentSearchModel.cs | 8 + .../SearchModels/DressSearchModel.cs | 8 + .../SearchModels/OrderSearchModel.cs | 7 + .../SewingDressesContracts.csproj | 20 ++ .../StoragesContracts/IComponentStorage.cs | 16 ++ .../StoragesContracts/IDressStorage.cs | 16 ++ .../StoragesContracts/IOrderStorage.cs | 21 ++ .../ViewModels/ComponentViewModel.cs | 14 ++ .../ViewModels/DressViewModel.cs | 15 ++ .../ViewModels/OrderViewModel.cs | 25 ++ .../Enums/OrderStatus.cs | 11 + SewingDresses/SewingDressesDataModels/IId.cs | 7 + .../Models/IComponentModel.cs | 8 + .../Models/IDressModel.cs | 9 + .../Models/IOrderModel.cs | 14 ++ .../SewingDressesDataModels.csproj | 9 + .../DataListSingleton.cs | 26 ++ .../Implements/ComponentStorage.cs | 104 ++++++++ .../Implements/DressStorage.cs | 104 ++++++++ .../Implements/OrderStorage.cs | 98 ++++++++ .../Models/Component.cs | 46 ++++ .../Models/Dress.cs | 52 ++++ .../Models/Order.cs | 59 +++++ .../SewingDressesListImplement.csproj | 15 ++ .../ComponentForm.Designer.cs | 118 +++++++++ .../SewingDressesView/ComponentForm.cs | 82 +++++++ .../SewingDressesView/ComponentForm.resx | 120 +++++++++ .../ComponentsForm.Designer.cs | 114 +++++++++ .../SewingDressesView/ComponentsForm.cs | 113 +++++++++ .../SewingDressesView/ComponentsForm.resx | 120 +++++++++ .../DressComponentForm.Designer.cs | 118 +++++++++ .../SewingDressesView/DressComponentForm.cs | 81 +++++++ .../SewingDressesView/DressComponentForm.resx | 120 +++++++++ .../SewingDressesView/DressForm.Designer.cs | 228 ++++++++++++++++++ SewingDresses/SewingDressesView/DressForm.cs | 215 +++++++++++++++++ .../SewingDressesView/DressForm.resx | 129 ++++++++++ .../SewingDressesView/DressesForm.Designer.cs | 114 +++++++++ .../SewingDressesView/DressesForm.cs | 113 +++++++++ .../SewingDressesView/DressesForm.resx | 120 +++++++++ .../SewingDressesView/MainForm.Designer.cs | 171 +++++++++++++ SewingDresses/SewingDressesView/MainForm.cs | 146 +++++++++++ SewingDresses/SewingDressesView/MainForm.resx | 123 ++++++++++ .../SewingDressesView/OrderForm.Designer.cs | 143 +++++++++++ SewingDresses/SewingDressesView/OrderForm.cs | 118 +++++++++ .../SewingDressesView/OrderForm.resx | 120 +++++++++ SewingDresses/SewingDressesView/Program.cs | 47 ++++ .../SewingDressesView.csproj | 17 ++ 58 files changed, 3983 insertions(+) create mode 100644 SewingDresses/SewingDresses.sln create mode 100644 SewingDresses/SewingDressesBusinessLogic/BusinessLogic/ComponentLogic.cs create mode 100644 SewingDresses/SewingDressesBusinessLogic/BusinessLogic/DressLogic.cs create mode 100644 SewingDresses/SewingDressesBusinessLogic/BusinessLogic/OrderLogic.cs create mode 100644 SewingDresses/SewingDressesBusinessLogic/SewingDressesBusinessLogic.csproj create mode 100644 SewingDresses/SewingDressesContracts/BindingModels/ComponentBindingModel.cs create mode 100644 SewingDresses/SewingDressesContracts/BindingModels/DressBindingModel.cs create mode 100644 SewingDresses/SewingDressesContracts/BindingModels/OrderBindingModel.cs create mode 100644 SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IComponentLogic.cs create mode 100644 SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IDressLogic.cs create mode 100644 SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IOrderLogic.cs create mode 100644 SewingDresses/SewingDressesContracts/SearchModels/ComponentSearchModel.cs create mode 100644 SewingDresses/SewingDressesContracts/SearchModels/DressSearchModel.cs create mode 100644 SewingDresses/SewingDressesContracts/SearchModels/OrderSearchModel.cs create mode 100644 SewingDresses/SewingDressesContracts/SewingDressesContracts.csproj create mode 100644 SewingDresses/SewingDressesContracts/StoragesContracts/IComponentStorage.cs create mode 100644 SewingDresses/SewingDressesContracts/StoragesContracts/IDressStorage.cs create mode 100644 SewingDresses/SewingDressesContracts/StoragesContracts/IOrderStorage.cs create mode 100644 SewingDresses/SewingDressesContracts/ViewModels/ComponentViewModel.cs create mode 100644 SewingDresses/SewingDressesContracts/ViewModels/DressViewModel.cs create mode 100644 SewingDresses/SewingDressesContracts/ViewModels/OrderViewModel.cs create mode 100644 SewingDresses/SewingDressesDataModels/Enums/OrderStatus.cs create mode 100644 SewingDresses/SewingDressesDataModels/IId.cs create mode 100644 SewingDresses/SewingDressesDataModels/Models/IComponentModel.cs create mode 100644 SewingDresses/SewingDressesDataModels/Models/IDressModel.cs create mode 100644 SewingDresses/SewingDressesDataModels/Models/IOrderModel.cs create mode 100644 SewingDresses/SewingDressesDataModels/SewingDressesDataModels.csproj create mode 100644 SewingDresses/SewingDressesListImplement/DataListSingleton.cs create mode 100644 SewingDresses/SewingDressesListImplement/Implements/ComponentStorage.cs create mode 100644 SewingDresses/SewingDressesListImplement/Implements/DressStorage.cs create mode 100644 SewingDresses/SewingDressesListImplement/Implements/OrderStorage.cs create mode 100644 SewingDresses/SewingDressesListImplement/Models/Component.cs create mode 100644 SewingDresses/SewingDressesListImplement/Models/Dress.cs create mode 100644 SewingDresses/SewingDressesListImplement/Models/Order.cs create mode 100644 SewingDresses/SewingDressesListImplement/SewingDressesListImplement.csproj create mode 100644 SewingDresses/SewingDressesView/ComponentForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/ComponentForm.cs create mode 100644 SewingDresses/SewingDressesView/ComponentForm.resx create mode 100644 SewingDresses/SewingDressesView/ComponentsForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/ComponentsForm.cs create mode 100644 SewingDresses/SewingDressesView/ComponentsForm.resx create mode 100644 SewingDresses/SewingDressesView/DressComponentForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/DressComponentForm.cs create mode 100644 SewingDresses/SewingDressesView/DressComponentForm.resx create mode 100644 SewingDresses/SewingDressesView/DressForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/DressForm.cs create mode 100644 SewingDresses/SewingDressesView/DressForm.resx create mode 100644 SewingDresses/SewingDressesView/DressesForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/DressesForm.cs create mode 100644 SewingDresses/SewingDressesView/DressesForm.resx create mode 100644 SewingDresses/SewingDressesView/MainForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/MainForm.cs create mode 100644 SewingDresses/SewingDressesView/MainForm.resx create mode 100644 SewingDresses/SewingDressesView/OrderForm.Designer.cs create mode 100644 SewingDresses/SewingDressesView/OrderForm.cs create mode 100644 SewingDresses/SewingDressesView/OrderForm.resx create mode 100644 SewingDresses/SewingDressesView/Program.cs create mode 100644 SewingDresses/SewingDressesView/SewingDressesView.csproj diff --git a/SewingDresses/SewingDresses.sln b/SewingDresses/SewingDresses.sln new file mode 100644 index 0000000..84768ba --- /dev/null +++ b/SewingDresses/SewingDresses.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34009.444 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SewingDressesContracts", "SewingDressesContracts\SewingDressesContracts.csproj", "{2E3AE66A-3036-4B42-BD1B-B58B70C4F581}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SewingDressesDataModels", "SewingDressesDataModels\SewingDressesDataModels.csproj", "{317807C6-FB9B-4330-BC13-97F997FCC34D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SewingDressesView", "SewingDressesView\SewingDressesView.csproj", "{E39E6495-2356-4AF8-8C24-C2C5E113341B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SewingDressesBusinessLogic", "SewingDressesBusinessLogic\SewingDressesBusinessLogic.csproj", "{3A0DDBD6-0799-4047-A316-C1EEC0F24DFE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SewingDressesListImplement", "SewingDressesListImplement\SewingDressesListImplement.csproj", "{0F2DC551-6221-4471-BBAA-C5C65E45E66C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2E3AE66A-3036-4B42-BD1B-B58B70C4F581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E3AE66A-3036-4B42-BD1B-B58B70C4F581}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E3AE66A-3036-4B42-BD1B-B58B70C4F581}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E3AE66A-3036-4B42-BD1B-B58B70C4F581}.Release|Any CPU.Build.0 = Release|Any CPU + {317807C6-FB9B-4330-BC13-97F997FCC34D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {317807C6-FB9B-4330-BC13-97F997FCC34D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {317807C6-FB9B-4330-BC13-97F997FCC34D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {317807C6-FB9B-4330-BC13-97F997FCC34D}.Release|Any CPU.Build.0 = Release|Any CPU + {E39E6495-2356-4AF8-8C24-C2C5E113341B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E39E6495-2356-4AF8-8C24-C2C5E113341B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E39E6495-2356-4AF8-8C24-C2C5E113341B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E39E6495-2356-4AF8-8C24-C2C5E113341B}.Release|Any CPU.Build.0 = Release|Any CPU + {3A0DDBD6-0799-4047-A316-C1EEC0F24DFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A0DDBD6-0799-4047-A316-C1EEC0F24DFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A0DDBD6-0799-4047-A316-C1EEC0F24DFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A0DDBD6-0799-4047-A316-C1EEC0F24DFE}.Release|Any CPU.Build.0 = Release|Any CPU + {0F2DC551-6221-4471-BBAA-C5C65E45E66C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F2DC551-6221-4471-BBAA-C5C65E45E66C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F2DC551-6221-4471-BBAA-C5C65E45E66C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F2DC551-6221-4471-BBAA-C5C65E45E66C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F9D79E6E-C2A7-4432-B00F-6B4E5F173DD5} + EndGlobalSection +EndGlobal diff --git a/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/ComponentLogic.cs b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/ComponentLogic.cs new file mode 100644 index 0000000..28f077b --- /dev/null +++ b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/ComponentLogic.cs @@ -0,0 +1,115 @@ +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesBusinessLogic.BusinessLogic +{ + public class ComponentLogic : IComponentLogic + { + private readonly ILogger _logger; + + private readonly IComponentStorage _componentStorage; + + public ComponentLogic(ILogger logger, IComponentStorage componentStorage) + { + _logger = logger; + _componentStorage = componentStorage; + } + + public List? ReadList(ComponentSearchModel? model) + { + _logger.LogInformation("ReadList. ComponentName:{ComponentName}. Id:{Id}", model?.ComponentName, model?.Id); + var list = model == null ? _componentStorage.GetFullList() : _componentStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public ComponentViewModel? ReadElement(ComponentSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ComponentName:{ComponentName}. Id:{Id}", model.ComponentName, model.Id); + var element = _componentStorage.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(ComponentBindingModel model) + { + CheckModel(model); + if (_componentStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Update(ComponentBindingModel model) + { + CheckModel(model); + if (_componentStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + public bool Delete(ComponentBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_componentStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + + private void CheckModel(ComponentBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ComponentName)) + { + throw new ArgumentNullException("Нет названия компонента", nameof(model.ComponentName)); + } + if (model.Cost <= 0) + { + throw new ArgumentNullException("Цена компонента должна быть больше 0", nameof(model.Cost)); + } + _logger.LogInformation("Component. ComponentName:{ComponentName}. Cost:{Cost}. Id:{Id}", model.ComponentName, model.Cost, model.Id); + var element = _componentStorage.GetElement(new ComponentSearchModel + { + ComponentName = model.ComponentName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Компонент с таким названием уже есть"); + } + } + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/DressLogic.cs b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/DressLogic.cs new file mode 100644 index 0000000..0649eba --- /dev/null +++ b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/DressLogic.cs @@ -0,0 +1,111 @@ +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesBusinessLogic.BusinessLogic +{ + public class DressLogic : IDressLogic + { + private readonly ILogger _logger; + private readonly IDressStorage _dressStorage; + + public DressLogic(ILogger logger, IDressStorage dressStorage) + { + _logger = logger; + _dressStorage = dressStorage; + } + + public List? ReadList(DressSearchModel? model) + { + _logger.LogInformation("ReadList. DressName:{DressName}. Id:{Id}", model?.DressName, model?.Id); + var list = model == null ? _dressStorage.GetFullList() : _dressStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public DressViewModel? ReadElement(DressSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. DressName:{DressName}. Id: {Id}", model.DressName, model.Id); + var element = _dressStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + + private void CheckModel(DressBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.DressName)) + { + throw new ArgumentNullException("Нет названия платья", nameof(model.DressComponents)); + } + if (model.Price <= 0) + { + throw new ArgumentNullException("Цена платья должна быть больше 0", nameof(model.Price)); + } + _logger.LogInformation("Dress. DressName:{DressName}. Price:{Price}. Id:{Id}", model.DressName, model.Price, model.Id); + var element = _dressStorage.GetElement(new DressSearchModel + { + DressName = model.DressName + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Платье с таким названием уже есть"); + } + } + public bool Create(DressBindingModel model) + { + CheckModel(model); + if (_dressStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool Update(DressBindingModel model) + { + CheckModel(model); + if (_dressStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + public bool Delete(DressBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_dressStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + } +} diff --git a/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/OrderLogic.cs b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/OrderLogic.cs new file mode 100644 index 0000000..a99f4f3 --- /dev/null +++ b/SewingDresses/SewingDressesBusinessLogic/BusinessLogic/OrderLogic.cs @@ -0,0 +1,103 @@ +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Enums; + +namespace SewingDressesBusinessLogic.BusinessLogic +{ + 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; + } + + private void CheckModel(OrderBindingModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (model.Count <= 0) + { + throw new ArgumentNullException("Количество заказов должно быть больше нуля"); + } + if (model.Sum <= 0) + { + throw new ArgumentNullException("Цена заказа должна быть больше нуля"); + } + _logger.LogInformation("Order. OrderId:{Id}. Sum:{Sum}", model.Id, model.Sum); + } + + 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; + + } + + private bool ChangeStatus(OrderBindingModel model, OrderStatus status) + { + var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); + if (element == null) + { + _logger.LogWarning("Find order failed"); + return false; + } + if (element.Status != status-1) + { + _logger.LogWarning("Status change failed"); + throw new InvalidOperationException("Невозможно перевести состояние заказа"); + } + model.Status = status; + if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; + _orderStorage.Update(model); + 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.Выдан); + } + } +} diff --git a/SewingDresses/SewingDressesBusinessLogic/SewingDressesBusinessLogic.csproj b/SewingDresses/SewingDressesBusinessLogic/SewingDressesBusinessLogic.csproj new file mode 100644 index 0000000..7d9b4b1 --- /dev/null +++ b/SewingDresses/SewingDressesBusinessLogic/SewingDressesBusinessLogic.csproj @@ -0,0 +1,14 @@ + + + + Library + net6.0 + enable + enable + + + + + + + diff --git a/SewingDresses/SewingDressesContracts/BindingModels/ComponentBindingModel.cs b/SewingDresses/SewingDressesContracts/BindingModels/ComponentBindingModel.cs new file mode 100644 index 0000000..674d662 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BindingModels/ComponentBindingModel.cs @@ -0,0 +1,11 @@ +using SewingDressesDataModels.Models; + +namespace SewingDressesContracts.BindingModels +{ + public class ComponentBindingModel : IComponentModel + { + public int Id { get; set; } + public string ComponentName { get; set; } = string.Empty; + public double Cost { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/BindingModels/DressBindingModel.cs b/SewingDresses/SewingDressesContracts/BindingModels/DressBindingModel.cs new file mode 100644 index 0000000..b891ef6 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BindingModels/DressBindingModel.cs @@ -0,0 +1,12 @@ +using SewingDressesDataModels.Models; + +namespace SewingDressesContracts.BindingModels +{ + public class DressBindingModel : IDressModel + { + public int Id { get; set; } + public string DressName { get; set; } = string.Empty; + public double Price { get; set; } + public Dictionary DressComponents { get; set; } = new(); + } +} diff --git a/SewingDresses/SewingDressesContracts/BindingModels/OrderBindingModel.cs b/SewingDresses/SewingDressesContracts/BindingModels/OrderBindingModel.cs new file mode 100644 index 0000000..f92a526 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BindingModels/OrderBindingModel.cs @@ -0,0 +1,16 @@ +using SewingDressesDataModels.Models; +using SewingDressesDataModels.Enums; + +namespace SewingDressesContracts.BindingModels +{ + public class OrderBindingModel : IOrderModel + { + public int Id { get; set; } + public int DressId { get; set; } + public int Count { get; set; } + public double Sum { get; set; } + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + public DateTime DateCreate { get; set; } = DateTime.Now; + public DateTime? DateImplement { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IComponentLogic.cs b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IComponentLogic.cs new file mode 100644 index 0000000..2441cdc --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IComponentLogic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.BusinessLogicsContracts +{ + public interface IComponentLogic + { + List? ReadList(ComponentSearchModel? model); + ComponentViewModel? ReadElement(ComponentSearchModel model); + bool Create(ComponentBindingModel model); + bool Update(ComponentBindingModel model); + bool Delete(ComponentBindingModel model); + } +} diff --git a/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IDressLogic.cs b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IDressLogic.cs new file mode 100644 index 0000000..0569203 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IDressLogic.cs @@ -0,0 +1,15 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.BusinessLogicsContracts +{ + public interface IDressLogic + { + List? ReadList(DressSearchModel? model); + DressViewModel? ReadElement(DressSearchModel? model); + bool Create(DressBindingModel? model); + bool Update(DressBindingModel? model); + bool Delete(DressBindingModel? model); + } +} diff --git a/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IOrderLogic.cs b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IOrderLogic.cs new file mode 100644 index 0000000..8486c9a --- /dev/null +++ b/SewingDresses/SewingDressesContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -0,0 +1,15 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.BusinessLogicsContracts +{ + public interface IOrderLogic + { + List? ReadList(OrderSearchModel? model); + bool CreateOrder(OrderBindingModel model); + bool TakeOrderInWork(OrderBindingModel model); + bool FinishOrder(OrderBindingModel model); + bool DeliveryOrder(OrderBindingModel model); + } +} diff --git a/SewingDresses/SewingDressesContracts/SearchModels/ComponentSearchModel.cs b/SewingDresses/SewingDressesContracts/SearchModels/ComponentSearchModel.cs new file mode 100644 index 0000000..47c0266 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/SearchModels/ComponentSearchModel.cs @@ -0,0 +1,8 @@ +namespace SewingDressesContracts.SearchModels +{ + public class ComponentSearchModel + { + public int? Id { get; set; } + public string? ComponentName { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/SearchModels/DressSearchModel.cs b/SewingDresses/SewingDressesContracts/SearchModels/DressSearchModel.cs new file mode 100644 index 0000000..efba10f --- /dev/null +++ b/SewingDresses/SewingDressesContracts/SearchModels/DressSearchModel.cs @@ -0,0 +1,8 @@ +namespace SewingDressesContracts.SearchModels +{ + public class DressSearchModel + { + public int? Id { get; set; } + public string? DressName { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/SearchModels/OrderSearchModel.cs b/SewingDresses/SewingDressesContracts/SearchModels/OrderSearchModel.cs new file mode 100644 index 0000000..be71aca --- /dev/null +++ b/SewingDresses/SewingDressesContracts/SearchModels/OrderSearchModel.cs @@ -0,0 +1,7 @@ +namespace SewingDressesContracts.SearchModels +{ + public class OrderSearchModel + { + public int? Id { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/SewingDressesContracts.csproj b/SewingDresses/SewingDressesContracts/SewingDressesContracts.csproj new file mode 100644 index 0000000..302662d --- /dev/null +++ b/SewingDresses/SewingDressesContracts/SewingDressesContracts.csproj @@ -0,0 +1,20 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + + + diff --git a/SewingDresses/SewingDressesContracts/StoragesContracts/IComponentStorage.cs b/SewingDresses/SewingDressesContracts/StoragesContracts/IComponentStorage.cs new file mode 100644 index 0000000..f7646ce --- /dev/null +++ b/SewingDresses/SewingDressesContracts/StoragesContracts/IComponentStorage.cs @@ -0,0 +1,16 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.StoragesContracts +{ + public interface IComponentStorage + { + List GetFullList(); + List GetFilteredList(ComponentSearchModel model); + ComponentViewModel? GetElement(ComponentSearchModel model); + ComponentViewModel? Insert(ComponentBindingModel model); + ComponentViewModel? Update(ComponentBindingModel model); + ComponentViewModel? Delete(ComponentBindingModel model); + } +} diff --git a/SewingDresses/SewingDressesContracts/StoragesContracts/IDressStorage.cs b/SewingDresses/SewingDressesContracts/StoragesContracts/IDressStorage.cs new file mode 100644 index 0000000..1140674 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/StoragesContracts/IDressStorage.cs @@ -0,0 +1,16 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.StoragesContracts +{ + public interface IDressStorage + { + List GetFullList(); + List GetFilteredList(DressSearchModel model); + DressViewModel? GetElement(DressSearchModel model); + DressViewModel? Insert(DressBindingModel model); + DressViewModel? Update(DressBindingModel model); + DressViewModel? Delete(DressBindingModel model); + } +} diff --git a/SewingDresses/SewingDressesContracts/StoragesContracts/IOrderStorage.cs b/SewingDresses/SewingDressesContracts/StoragesContracts/IOrderStorage.cs new file mode 100644 index 0000000..401ae97 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/StoragesContracts/IOrderStorage.cs @@ -0,0 +1,21 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.ViewModels; + +namespace SewingDressesContracts.StoragesContracts +{ + public interface IOrderStorage + { + List GetFullList(); + + List GetFilteredList(OrderSearchModel model); + + OrderViewModel? GetElement(OrderSearchModel model); + + OrderViewModel? Insert(OrderBindingModel model); + + OrderViewModel? Update(OrderBindingModel model); + + OrderViewModel? Delete(OrderBindingModel model); + } +} diff --git a/SewingDresses/SewingDressesContracts/ViewModels/ComponentViewModel.cs b/SewingDresses/SewingDressesContracts/ViewModels/ComponentViewModel.cs new file mode 100644 index 0000000..dbfc7d9 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/ViewModels/ComponentViewModel.cs @@ -0,0 +1,14 @@ +using SewingDressesDataModels.Models; +using System.ComponentModel; + +namespace SewingDressesContracts.ViewModels +{ + public class ComponentViewModel : IComponentModel + { + public int Id { get; set; } + [DisplayName("Название компонента")] + public string ComponentName { get; set; } = string.Empty; + [DisplayName("Цена")] + public double Cost { get; set; } + } +} diff --git a/SewingDresses/SewingDressesContracts/ViewModels/DressViewModel.cs b/SewingDresses/SewingDressesContracts/ViewModels/DressViewModel.cs new file mode 100644 index 0000000..ad1832d --- /dev/null +++ b/SewingDresses/SewingDressesContracts/ViewModels/DressViewModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; +using SewingDressesDataModels.Models; + +namespace SewingDressesContracts.ViewModels +{ + public class DressViewModel : IDressModel + { + public int Id { get; set; } + [DisplayName("Название платья")] + public string DressName { get; set; } = string.Empty; + [DisplayName("Цена")] + public double Price { get; set; } + public Dictionary DressComponents { get; set; } = new(); + } +} diff --git a/SewingDresses/SewingDressesContracts/ViewModels/OrderViewModel.cs b/SewingDresses/SewingDressesContracts/ViewModels/OrderViewModel.cs new file mode 100644 index 0000000..e61a9e7 --- /dev/null +++ b/SewingDresses/SewingDressesContracts/ViewModels/OrderViewModel.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; +using SewingDressesDataModels.Enums; +using SewingDressesDataModels.Models; + +namespace SewingDressesContracts.ViewModels +{ + public class OrderViewModel : IOrderModel + { + [DisplayName("Номер")] + public int Id { get; set; } + public int DressId { get; set; } + [DisplayName("Платье")] + public string DressName { get; set; } = string.Empty; + [DisplayName("Количество")] + public int Count { get; set; } + [DisplayName("Сумма")] + public double Sum { get; set; } + [DisplayName("Статус")] + public OrderStatus Status { get; set; } + [DisplayName("Дата создания")] + public DateTime DateCreate { get; set; } = DateTime.Now; + [DisplayName("Дата выполнения")] + public DateTime? DateImplement { get; set; } + } +} diff --git a/SewingDresses/SewingDressesDataModels/Enums/OrderStatus.cs b/SewingDresses/SewingDressesDataModels/Enums/OrderStatus.cs new file mode 100644 index 0000000..eca3062 --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/Enums/OrderStatus.cs @@ -0,0 +1,11 @@ +namespace SewingDressesDataModels.Enums +{ + public enum OrderStatus + { + Неизвестен = -1, + Принят = 0, + Выполняется = 1, + Готов = 2, + Выдан = 3 + } +} diff --git a/SewingDresses/SewingDressesDataModels/IId.cs b/SewingDresses/SewingDressesDataModels/IId.cs new file mode 100644 index 0000000..5c9c79d --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/IId.cs @@ -0,0 +1,7 @@ +namespace SewingDressesDataModels +{ + public interface IId + { + int Id { get; } + } +} diff --git a/SewingDresses/SewingDressesDataModels/Models/IComponentModel.cs b/SewingDresses/SewingDressesDataModels/Models/IComponentModel.cs new file mode 100644 index 0000000..0d48f7c --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/Models/IComponentModel.cs @@ -0,0 +1,8 @@ +namespace SewingDressesDataModels.Models +{ + public interface IComponentModel : IId + { + string ComponentName { get; } + double Cost { get; } + } +} diff --git a/SewingDresses/SewingDressesDataModels/Models/IDressModel.cs b/SewingDresses/SewingDressesDataModels/Models/IDressModel.cs new file mode 100644 index 0000000..93dc297 --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/Models/IDressModel.cs @@ -0,0 +1,9 @@ +namespace SewingDressesDataModels.Models +{ + public interface IDressModel : IId + { + string DressName { get; } + double Price { get; } + Dictionary DressComponents { get; } + } +} diff --git a/SewingDresses/SewingDressesDataModels/Models/IOrderModel.cs b/SewingDresses/SewingDressesDataModels/Models/IOrderModel.cs new file mode 100644 index 0000000..377aa05 --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/Models/IOrderModel.cs @@ -0,0 +1,14 @@ +using SewingDressesDataModels.Enums; + +namespace SewingDressesDataModels.Models +{ + public interface IOrderModel : IId + { + int DressId { get; } + int Count { get; } + double Sum { get; } + OrderStatus Status { get; } + DateTime DateCreate { get; } + DateTime? DateImplement { get; } + } +} diff --git a/SewingDresses/SewingDressesDataModels/SewingDressesDataModels.csproj b/SewingDresses/SewingDressesDataModels/SewingDressesDataModels.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/SewingDresses/SewingDressesDataModels/SewingDressesDataModels.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/SewingDresses/SewingDressesListImplement/DataListSingleton.cs b/SewingDresses/SewingDressesListImplement/DataListSingleton.cs new file mode 100644 index 0000000..0bdf6ab --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/DataListSingleton.cs @@ -0,0 +1,26 @@ +using SewingDressesListImplement.Models; + +namespace SewingDressesListImplement +{ + public class DataListSingleton + { + private static DataListSingleton? _instance; + public List Components { get; set; } + public List Orders { get; set; } + public List Dresses { get; set; } + private DataListSingleton() + { + Components = new List(); + Orders = new List(); + Dresses = new List(); + } + public static DataListSingleton GetInstance() + { + if (_instance == null) + { + _instance = new DataListSingleton(); + } + return _instance; + } + } +} diff --git a/SewingDresses/SewingDressesListImplement/Implements/ComponentStorage.cs b/SewingDresses/SewingDressesListImplement/Implements/ComponentStorage.cs new file mode 100644 index 0000000..8f4e3f7 --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Implements/ComponentStorage.cs @@ -0,0 +1,104 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesListImplement.Models; + +namespace SewingDressesListImplement.Implements +{ + public class ComponentStorage : IComponentStorage + { + private readonly DataListSingleton _source; + public ComponentStorage() + { + _source = DataListSingleton.GetInstance(); + } + public List GetFullList() + { + var result = new List(); + foreach (var component in _source.Components) + { + result.Add(component.GetViewModel); + } + return result; + } + public List GetFilteredList(ComponentSearchModel model) + { + var result = new List(); + if (string.IsNullOrEmpty(model.ComponentName)) + { + return result; + } + foreach (var component in _source.Components) + { + if (component.ComponentName.Contains(model.ComponentName)) + { + result.Add(component.GetViewModel); + } + } + return result; + } + public ComponentViewModel? GetElement(ComponentSearchModel model) + { + if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue) + { + return null; + } + foreach (var component in _source.Components) + { + if ((!string.IsNullOrEmpty(model.ComponentName) && component.ComponentName == model.ComponentName) || + (model.Id.HasValue && component.Id == model.Id)) + { + return component.GetViewModel; + } + } + return null; + } + + public ComponentViewModel? Insert(ComponentBindingModel model) + { + model.Id = 1; + foreach(var component in _source.Components) + { + if (model.Id <= component.Id) + { + model.Id = component.Id + 1; + } + } + var newComponent = Component.Create(model); + if (newComponent == null) + { + return null; + } + _source.Components.Add(newComponent); + return newComponent.GetViewModel; + } + + public ComponentViewModel? Update(ComponentBindingModel model) + { + foreach (var component in _source.Components) + { + if (component.Id == model.Id) + { + component.Update(model); + return component.GetViewModel; + } + } + return null; + } + + public ComponentViewModel? Delete(ComponentBindingModel model) + { + for (int i = 0; i < _source.Components.Count; i++) + { + if (_source.Components[i].Id == model.Id) + { + var element = _source.Components[i]; + _source.Components.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + } +} diff --git a/SewingDresses/SewingDressesListImplement/Implements/DressStorage.cs b/SewingDresses/SewingDressesListImplement/Implements/DressStorage.cs new file mode 100644 index 0000000..7534fc6 --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Implements/DressStorage.cs @@ -0,0 +1,104 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesListImplement.Models; + +namespace SewingDressesListImplement.Implements +{ + public class DressStorage : IDressStorage + { + private readonly DataListSingleton _source; + public DressStorage() + { + _source = DataListSingleton.GetInstance(); + } + public List GetFullList() + { + var result = new List(); + foreach (var component in _source.Dresses) + { + result.Add(component.GetViewModel); + } + return result; + } + public List GetFilteredList(DressSearchModel model) + { + var result = new List(); + if (string.IsNullOrEmpty(model.DressName)) + { + return result; + } + foreach (var component in _source.Dresses) + { + if (component.DressName.Contains(model.DressName)) + { + result.Add(component.GetViewModel); + } + } + return result; + } + public DressViewModel? GetElement(DressSearchModel model) + { + if (string.IsNullOrEmpty(model.DressName) && !model.Id.HasValue) + { + return null; + } + foreach (var component in _source.Dresses) + { + if ((!string.IsNullOrEmpty(model.DressName) && component.DressName == model.DressName) || + (model.Id.HasValue && component.Id == model.Id)) + { + return component.GetViewModel; + } + } + return null; + } + + public DressViewModel? Insert(DressBindingModel model) + { + model.Id = 1; + foreach (var component in _source.Dresses) + { + if (model.Id <= component.Id) + { + model.Id = component.Id + 1; + } + } + var newDress = Dress.Create(model); + if (newDress == null) + { + return null; + } + _source.Dresses.Add(newDress); + return newDress.GetViewModel; + } + + public DressViewModel? Update(DressBindingModel model) + { + foreach (var component in _source.Dresses) + { + if (component.Id == model.Id) + { + component.Update(model); + return component.GetViewModel; + } + } + return null; + } + + public DressViewModel? Delete(DressBindingModel model) + { + for (int i = 0; i < _source.Dresses.Count; i++) + { + if (_source.Dresses[i].Id == model.Id) + { + var element = _source.Dresses[i]; + _source.Dresses.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + } +} diff --git a/SewingDresses/SewingDressesListImplement/Implements/OrderStorage.cs b/SewingDresses/SewingDressesListImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..7201f57 --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Implements/OrderStorage.cs @@ -0,0 +1,98 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using SewingDressesContracts.StoragesContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesListImplement.Models; +using System.Runtime.CompilerServices; + +namespace SewingDressesListImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + private readonly DataListSingleton _source; + public OrderStorage() + { + _source = DataListSingleton.GetInstance(); + } + public List GetFullList() + { + var result = new List(); + foreach (var order in _source.Orders) + { + result.Add(order.GetViewModel); + } + return result; + } + public List GetFilteredList(OrderSearchModel model) + { + var result = new List(); + + foreach (var order in _source.Orders) + { + if (order.Id == model.Id) + { + result.Add(order.GetViewModel); + } + } + return result; + } + public OrderViewModel? GetElement(OrderSearchModel model) + { + if (!model.Id.HasValue) + { + return null; + } + foreach (var order in _source.Orders) + { + if (model.Id.HasValue && order.Id == model.Id) + { + return order.GetViewModel; + } + } + return null; + } + public OrderViewModel? Insert(OrderBindingModel model) + { + model.Id = 1; + foreach (var order in _source.Orders) + { + if (model.Id <= order.Id) + { + model.Id = order.Id + 1; + } + } + var newOrder = Order.Create(model); + if (newOrder == null) + { + return null; + } + _source.Orders.Add(newOrder); + return newOrder.GetViewModel; + } + public OrderViewModel? Update(OrderBindingModel model) + { + foreach (var order in _source.Orders) + { + if (order.Id == model.Id) + { + order.Update(model); + return order.GetViewModel; + } + } + return null; + } + public OrderViewModel? Delete(OrderBindingModel model) + { + for (int i = 0; i < _source.Orders.Count; i++) + { + if (_source.Orders[i].Id == model.Id) + { + var element = _source.Orders[i]; + _source.Orders.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + } +} diff --git a/SewingDresses/SewingDressesListImplement/Models/Component.cs b/SewingDresses/SewingDressesListImplement/Models/Component.cs new file mode 100644 index 0000000..c41d5cb --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Models/Component.cs @@ -0,0 +1,46 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Models; + +namespace SewingDressesListImplement.Models +{ + public class Component : IComponentModel + { + public int Id { get; private set; } + + public string ComponentName { get; private set; } = string.Empty; + + public double Cost { get; set; } + + public static Component? Create(ComponentBindingModel? model) + { + if (model == null) + { + return null; + } + return new Component() + { + Id = model.Id, + ComponentName = model.ComponentName, + Cost = model.Cost + }; + } + + public void Update(ComponentBindingModel? model) + { + if (model == null) + { + return; + } + ComponentName = model.ComponentName; + Cost = model.Cost; + } + + public ComponentViewModel GetViewModel => new() + { + Id = Id, + ComponentName = ComponentName, + Cost = Cost + }; + } +} diff --git a/SewingDresses/SewingDressesListImplement/Models/Dress.cs b/SewingDresses/SewingDressesListImplement/Models/Dress.cs new file mode 100644 index 0000000..c26820a --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Models/Dress.cs @@ -0,0 +1,52 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Models; + + +namespace SewingDressesListImplement.Models +{ + public class Dress : IDressModel + { + public int Id { get; private set; } + + public string DressName { get; private set; } = string.Empty; + + public double Price { get; private set; } + + public Dictionary DressComponents { get; private set; } = new Dictionary(); + + public static Dress? Create(DressBindingModel? model) + { + if (model == null) + { + return null; + } + return new Dress() + { + Id = model.Id, + DressName = model.DressName, + Price = model.Price, + DressComponents = model.DressComponents + }; + } + + public void Update(DressBindingModel? model) + { + if (model == null) + { + return; + } + DressName = model.DressName; + Price = model.Price; + DressComponents = model.DressComponents; + } + + public DressViewModel GetViewModel => new() + { + Id = Id, + DressName = DressName, + Price = Price, + DressComponents = DressComponents + }; + } +} diff --git a/SewingDresses/SewingDressesListImplement/Models/Order.cs b/SewingDresses/SewingDressesListImplement/Models/Order.cs new file mode 100644 index 0000000..cbed685 --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/Models/Order.cs @@ -0,0 +1,59 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Enums; +using SewingDressesDataModels.Models; + +namespace SewingDressesListImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; private set; } + public int DressId { get; private set; } + public int Count { get; private set; } + public double Sum { get; private set; } + public OrderStatus Status { get; private set; } + public DateTime DateCreate { get; private set; } = DateTime.Now; + public DateTime? DateImplement { get; private set; } + + public static Order? Create(OrderBindingModel? model) + { + if (model == null) + { + return null; + } + return new Order + { + Id = model.Id, + DressId = model.DressId, + Count = model.Count, + Sum = model.Sum, + Status = model.Status, + DateCreate = model.DateCreate, + DateImplement = model.DateImplement + }; + } + + public void Update(OrderBindingModel? model) + { + if (model == null) + { + return; + } + DressId = model.DressId == 0 ? DressId : model.DressId; + Count = model.Count == 0 ? Count : model.Count; + Sum = model.Sum == 0 ? Sum : model.Sum; + Status = model.Status; + DateImplement = model.DateImplement; + } + public OrderViewModel GetViewModel => new() + { + Id = Id, + DressId = DressId, + Count = Count, + Sum = Sum, + Status = Status, + DateCreate = DateCreate, + DateImplement = DateImplement + }; + } +} diff --git a/SewingDresses/SewingDressesListImplement/SewingDressesListImplement.csproj b/SewingDresses/SewingDressesListImplement/SewingDressesListImplement.csproj new file mode 100644 index 0000000..48b8843 --- /dev/null +++ b/SewingDresses/SewingDressesListImplement/SewingDressesListImplement.csproj @@ -0,0 +1,15 @@ + + + + Library + net6.0 + enable + enable + + + + + + + + diff --git a/SewingDresses/SewingDressesView/ComponentForm.Designer.cs b/SewingDresses/SewingDressesView/ComponentForm.Designer.cs new file mode 100644 index 0000000..cd86a4a --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentForm.Designer.cs @@ -0,0 +1,118 @@ +namespace SewingDressesView +{ + partial class ComponentForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new Label(); + label2 = new Label(); + textBoxName = new TextBox(); + textBoxCost = new TextBox(); + buttonSave = new Button(); + CancelButton = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(26, 21); + label1.Name = "label1"; + label1.Size = new Size(80, 20); + label1.TabIndex = 0; + label1.Text = "Название:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(26, 63); + label2.Name = "label2"; + label2.Size = new Size(48, 20); + label2.TabIndex = 1; + label2.Text = "Цена:"; + // + // textBoxName + // + textBoxName.Location = new Point(141, 18); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(331, 27); + textBoxName.TabIndex = 2; + // + // textBoxCost + // + textBoxCost.Location = new Point(141, 63); + textBoxCost.Name = "textBoxCost"; + textBoxCost.Size = new Size(125, 27); + textBoxCost.TabIndex = 3; + // + // buttonSave + // + buttonSave.Location = new Point(234, 126); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // CancelButton + // + CancelButton.Location = new Point(378, 126); + CancelButton.Name = "CancelButton"; + CancelButton.Size = new Size(94, 29); + CancelButton.TabIndex = 5; + CancelButton.Text = "Отмена"; + CancelButton.UseVisualStyleBackColor = true; + CancelButton.Click += CancelButton_Click; + // + // ComponentForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(530, 182); + Controls.Add(CancelButton); + Controls.Add(buttonSave); + Controls.Add(textBoxCost); + Controls.Add(textBoxName); + Controls.Add(label2); + Controls.Add(label1); + Name = "ComponentForm"; + Text = "Компонент"; + Load += ComponentForm_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private TextBox textBoxName; + private TextBox textBoxCost; + private Button buttonSave; + private Button CancelButton; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/ComponentForm.cs b/SewingDresses/SewingDressesView/ComponentForm.cs new file mode 100644 index 0000000..fa099e9 --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentForm.cs @@ -0,0 +1,82 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.SearchModels; +using Microsoft.Extensions.Logging; + +namespace SewingDressesView +{ + public partial class ComponentForm : Form + { + private readonly ILogger _logger; + private readonly IComponentLogic _logic; + private int? _id; + public int Id { set { _id = value; } } + public ComponentForm(ILogger logger, IComponentLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void ComponentForm_Load(object sender, EventArgs e) + { + if (!_id.HasValue) + { + return; + } + try + { + _logger.LogInformation("Get component"); + var view = _logic.ReadElement(new ComponentSearchModel { Id = _id.Value }); + if (view != null) + { + textBoxName.Text = view.ComponentName; + textBoxCost.Text = view.Cost.ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Get component error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxName.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Save component"); + try + { + var model = new ComponentBindingModel + { + Id = _id ?? 0, + ComponentName = textBoxName.Text, + Cost = Convert.ToDouble(textBoxCost.Text) + }; + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополительная информация в логах"); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Save component error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void CancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/SewingDresses/SewingDressesView/ComponentForm.resx b/SewingDresses/SewingDressesView/ComponentForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/ComponentsForm.Designer.cs b/SewingDresses/SewingDressesView/ComponentsForm.Designer.cs new file mode 100644 index 0000000..3ab7ce4 --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentsForm.Designer.cs @@ -0,0 +1,114 @@ +namespace SewingDressesView +{ + partial class ComponentsForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + buttonAdd = new Button(); + buttonChange = new Button(); + buttonDelete = new Button(); + buttonReset = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 10); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(518, 428); + dataGridView.TabIndex = 0; + // + // buttonAdd + // + buttonAdd.Location = new Point(586, 41); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 29); + buttonAdd.TabIndex = 1; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonChange + // + buttonChange.Location = new Point(586, 113); + buttonChange.Name = "buttonChange"; + buttonChange.Size = new Size(94, 29); + buttonChange.TabIndex = 2; + buttonChange.Text = "Изменить"; + buttonChange.UseVisualStyleBackColor = true; + buttonChange.Click += buttonChange_Click; + // + // buttonDelete + // + buttonDelete.Location = new Point(586, 191); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(94, 29); + buttonDelete.TabIndex = 3; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += buttonDelete_Click; + // + // buttonReset + // + buttonReset.Location = new Point(586, 263); + buttonReset.Name = "buttonReset"; + buttonReset.Size = new Size(94, 29); + buttonReset.TabIndex = 4; + buttonReset.Text = "Обновить"; + buttonReset.UseVisualStyleBackColor = true; + buttonReset.Click += buttonReset_Click; + // + // ComponentsForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(728, 450); + Controls.Add(buttonReset); + Controls.Add(buttonDelete); + Controls.Add(buttonChange); + Controls.Add(buttonAdd); + Controls.Add(dataGridView); + Name = "ComponentsForm"; + Text = "ComponentsForm"; + Load += ComponentsForm_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonAdd; + private Button buttonChange; + private Button buttonDelete; + private Button buttonReset; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/ComponentsForm.cs b/SewingDresses/SewingDressesView/ComponentsForm.cs new file mode 100644 index 0000000..5d6b55a --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentsForm.cs @@ -0,0 +1,113 @@ +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SewingDressesView +{ + public partial class ComponentsForm : Form + { + private readonly ILogger _logger; + private readonly IComponentLogic _logic; + public ComponentsForm(ILogger logger, IComponentLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(ComponentForm)); + if (service is ComponentForm form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void buttonChange_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(ComponentForm)); + if (service is ComponentForm form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void buttonDelete_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Delete component"); + try + { + if (!_logic.Delete(new ComponentBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Delete component error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + } + + private void buttonReset_Click(object sender, EventArgs e) + { + LoadData(); + } + + private void ComponentsForm_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["ComponentName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Load components"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Load components error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/SewingDresses/SewingDressesView/ComponentsForm.resx b/SewingDresses/SewingDressesView/ComponentsForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SewingDresses/SewingDressesView/ComponentsForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressComponentForm.Designer.cs b/SewingDresses/SewingDressesView/DressComponentForm.Designer.cs new file mode 100644 index 0000000..eb96e5d --- /dev/null +++ b/SewingDresses/SewingDressesView/DressComponentForm.Designer.cs @@ -0,0 +1,118 @@ +namespace SewingDressesView +{ + partial class DressComponentForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new Label(); + label2 = new Label(); + comboBoxComponent = new ComboBox(); + textBoxCount = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(46, 32); + label1.Name = "label1"; + label1.Size = new Size(91, 20); + label1.TabIndex = 0; + label1.Text = "Компонент:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(46, 75); + label2.Name = "label2"; + label2.Size = new Size(93, 20); + label2.TabIndex = 1; + label2.Text = "Количество:"; + // + // comboBoxComponent + // + comboBoxComponent.FormattingEnabled = true; + comboBoxComponent.Location = new Point(158, 29); + comboBoxComponent.Name = "comboBoxComponent"; + comboBoxComponent.Size = new Size(259, 28); + comboBoxComponent.TabIndex = 2; + // + // textBoxCount + // + textBoxCount.Location = new Point(158, 72); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(259, 27); + textBoxCount.TabIndex = 3; + // + // buttonSave + // + buttonSave.Location = new Point(223, 131); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(323, 131); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // DressComponentForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(446, 189); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxCount); + Controls.Add(comboBoxComponent); + Controls.Add(label2); + Controls.Add(label1); + Name = "DressComponentForm"; + Text = "Компоненты платьев"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private ComboBox comboBoxComponent; + private TextBox textBoxCount; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressComponentForm.cs b/SewingDresses/SewingDressesView/DressComponentForm.cs new file mode 100644 index 0000000..cf200b4 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressComponentForm.cs @@ -0,0 +1,81 @@ +using Microsoft.VisualBasic.Logging; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Models; + +namespace SewingDressesView +{ + public partial class DressComponentForm : Form + { + private readonly List? _list; + public int Id + { + get + { + return Convert.ToInt32(comboBoxComponent.SelectedValue); + } + set + { + comboBoxComponent.SelectedValue = value; + } + } + public int Count + { + get { return Convert.ToInt32(textBoxCount.Text); } + set { textBoxCount.Text = value.ToString(); } + } + + + public IComponentModel? ComponentModel + { + get + { + if (_list == null) + return null; + foreach (var elem in _list) + { + if (elem.Id == Id) + return elem; + } + return null; + } + } + + public DressComponentForm(IComponentLogic logic) + { + InitializeComponent(); + _list = logic.ReadList(null); + if (_list != null) + { + comboBoxComponent.DisplayMember = "ComponentName"; + comboBoxComponent.ValueMember = "Id"; + comboBoxComponent.DataSource = _list; + comboBoxComponent.SelectedItem = null; + } + + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxComponent.SelectedValue == null) + { + MessageBox.Show("Выберите компонент", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + DialogResult = DialogResult.OK; + Close(); + + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/SewingDresses/SewingDressesView/DressComponentForm.resx b/SewingDresses/SewingDressesView/DressComponentForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressComponentForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressForm.Designer.cs b/SewingDresses/SewingDressesView/DressForm.Designer.cs new file mode 100644 index 0000000..bcfd4e8 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressForm.Designer.cs @@ -0,0 +1,228 @@ +namespace SewingDressesView +{ + partial class DressForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new Label(); + label2 = new Label(); + groupBox1 = new GroupBox(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonChange = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + IdColumn = new DataGridViewTextBoxColumn(); + ComponentColumn = new DataGridViewTextBoxColumn(); + CountColumn = new DataGridViewTextBoxColumn(); + textBoxName = new TextBox(); + textBoxCost = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(21, 19); + label1.Name = "label1"; + label1.Size = new Size(80, 20); + label1.TabIndex = 0; + label1.Text = "Название:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(21, 58); + label2.Name = "label2"; + label2.Size = new Size(86, 20); + label2.TabIndex = 1; + label2.Text = "Стоимость:"; + // + // groupBox1 + // + groupBox1.Controls.Add(buttonUpdate); + groupBox1.Controls.Add(buttonDelete); + groupBox1.Controls.Add(buttonChange); + groupBox1.Controls.Add(buttonAdd); + groupBox1.Controls.Add(dataGridView); + groupBox1.Location = new Point(21, 98); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(752, 340); + groupBox1.TabIndex = 2; + groupBox1.TabStop = false; + groupBox1.Text = "Компоненты"; + // + // buttonUpdate + // + buttonUpdate.Location = new Point(612, 212); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(94, 29); + buttonUpdate.TabIndex = 4; + buttonUpdate.Text = "Обновить"; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += buttonUpdate_Click; + // + // buttonDelete + // + buttonDelete.Location = new Point(612, 162); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(94, 29); + buttonDelete.TabIndex = 3; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += buttonDelete_Click; + // + // buttonChange + // + buttonChange.Location = new Point(612, 105); + buttonChange.Name = "buttonChange"; + buttonChange.Size = new Size(94, 29); + buttonChange.TabIndex = 2; + buttonChange.Text = "Изменить"; + buttonChange.UseVisualStyleBackColor = true; + buttonChange.Click += buttonChange_Click; + // + // buttonAdd + // + buttonAdd.Location = new Point(612, 52); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 29); + buttonAdd.TabIndex = 1; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Columns.AddRange(new DataGridViewColumn[] { IdColumn, ComponentColumn, CountColumn }); + dataGridView.Location = new Point(6, 29); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(562, 305); + dataGridView.TabIndex = 0; + // + // IdColumn + // + IdColumn.HeaderText = "Id"; + IdColumn.MinimumWidth = 6; + IdColumn.Name = "IdColumn"; + IdColumn.Visible = false; + IdColumn.Width = 125; + // + // ComponentColumn + // + ComponentColumn.HeaderText = "Компонент"; + ComponentColumn.MinimumWidth = 6; + ComponentColumn.Name = "ComponentColumn"; + ComponentColumn.Width = 125; + // + // CountColumn + // + CountColumn.HeaderText = "Количество"; + CountColumn.MinimumWidth = 6; + CountColumn.Name = "CountColumn"; + CountColumn.Width = 125; + // + // textBoxName + // + textBoxName.Location = new Point(125, 16); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(365, 27); + textBoxName.TabIndex = 3; + // + // textBoxCost + // + textBoxCost.Location = new Point(125, 58); + textBoxCost.Name = "textBoxCost"; + textBoxCost.Size = new Size(152, 27); + textBoxCost.TabIndex = 4; + // + // buttonSave + // + buttonSave.Location = new Point(533, 444); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 5; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(633, 444); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 6; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // DressForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 502); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxCost); + Controls.Add(textBoxName); + Controls.Add(groupBox1); + Controls.Add(label2); + Controls.Add(label1); + Name = "DressForm"; + Text = "Платья"; + Load += DressForm_Load; + groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private GroupBox groupBox1; + private DataGridView dataGridView; + private DataGridViewTextBoxColumn IdColumn; + private DataGridViewTextBoxColumn ComponentColumn; + private DataGridViewTextBoxColumn CountColumn; + private TextBox textBoxName; + private TextBox textBoxCost; + private Button buttonUpdate; + private Button buttonDelete; + private Button buttonChange; + private Button buttonAdd; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressForm.cs b/SewingDresses/SewingDressesView/DressForm.cs new file mode 100644 index 0000000..beab79c --- /dev/null +++ b/SewingDresses/SewingDressesView/DressForm.cs @@ -0,0 +1,215 @@ +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.ViewModels; +using SewingDressesDataModels.Models; +using SewingDressesContracts.SearchModels; +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; + +namespace SewingDressesView +{ + public partial class DressForm : Form + { + private readonly ILogger _logger; + private readonly IDressLogic _logic; + private int? _id; + private Dictionary _dressComponents; + public int Id + { + set { _id = value; } + } + public DressForm(ILogger logger, IDressLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + _dressComponents = new Dictionary(); + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(DressComponentForm)); + if (service is DressComponentForm form) + { + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Add new component: {ComponentName} - {Count} ", form.ComponentModel.ComponentName, form.Count); + if (_dressComponents.ContainsKey(form.Id)) + { + _dressComponents[form.Id] = (form.ComponentModel, form.Count); + } + else + { + _dressComponents.Add(form.Id, (form.ComponentModel, form.Count)); + } + LoadData(); + } + } + + } + + private void buttonChange_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = + Program.ServiceProvider?.GetService(typeof(DressComponentForm)); + if (service is DressComponentForm form) + { + int id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _dressComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Update component: {ComponentName} - {Count}", form.ComponentModel.ComponentName, form.Count); + _dressComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); + } + } + } + } + + private void buttonDelete_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + try + { + _logger.LogInformation("Delete component: {ComponentName}- {Count}", dataGridView.SelectedRows[0].Cells[1].Value); + _dressComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + LoadData(); + } + } + } + + private void buttonUpdate_Click(object sender, EventArgs e) + { + LoadData(); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxName.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxCost.Text)) + { + MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (_dressComponents == null || _dressComponents.Count == 0) + { + MessageBox.Show("Заполните компоненты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Save dress"); + try + { + var model = new DressBindingModel + { + Id = _id ?? 0, + DressName = textBoxName.Text, + Price = Convert.ToDouble(textBoxCost.Text), + DressComponents = _dressComponents + }; + var operationResult = _id.HasValue ? _logic.Update(model) : + _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Save dress error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void DressForm_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + _logger.LogInformation("Loading dress"); + try + { + var view = _logic.ReadElement(new DressSearchModel + { + Id = _id.Value + }); + if (view != null) + { + textBoxName.Text = view.DressName; + textBoxCost.Text = view.Price.ToString(); + _dressComponents = view.DressComponents ?? new + Dictionary(); + LoadData(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Load dress error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + private void LoadData() + { + _logger.LogInformation("Load dress component"); + try + { + if (_dressComponents != null) + { + dataGridView.Rows.Clear(); + foreach (var pc in _dressComponents) + { + dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); + } + textBoxCost.Text = CalcPrice().ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Load dress component Error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private double CalcPrice() + { + double price = 0; + foreach (var elem in _dressComponents) + { + price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); + } + return Math.Round(price * 1.1, 2); + } + } +} diff --git a/SewingDresses/SewingDressesView/DressForm.resx b/SewingDresses/SewingDressesView/DressForm.resx new file mode 100644 index 0000000..bc29a0e --- /dev/null +++ b/SewingDresses/SewingDressesView/DressForm.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressesForm.Designer.cs b/SewingDresses/SewingDressesView/DressesForm.Designer.cs new file mode 100644 index 0000000..95f03f6 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressesForm.Designer.cs @@ -0,0 +1,114 @@ +namespace SewingDressesView +{ + partial class DressesForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonReset = new Button(); + buttonDelete = new Button(); + buttonChange = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // buttonReset + // + buttonReset.Location = new Point(586, 263); + buttonReset.Name = "buttonReset"; + buttonReset.Size = new Size(94, 29); + buttonReset.TabIndex = 9; + buttonReset.Text = "Обновить"; + buttonReset.UseVisualStyleBackColor = true; + buttonReset.Click += buttonReset_Click; + // + // buttonDelete + // + buttonDelete.Location = new Point(586, 191); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(94, 29); + buttonDelete.TabIndex = 8; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += buttonDelete_Click; + // + // buttonChange + // + buttonChange.Location = new Point(586, 113); + buttonChange.Name = "buttonChange"; + buttonChange.Size = new Size(94, 29); + buttonChange.TabIndex = 7; + buttonChange.Text = "Изменить"; + buttonChange.UseVisualStyleBackColor = true; + buttonChange.Click += buttonChange_Click; + // + // buttonAdd + // + buttonAdd.Location = new Point(586, 41); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 29); + buttonAdd.TabIndex = 6; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 10); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(518, 428); + dataGridView.TabIndex = 5; + // + // DressesForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(763, 450); + Controls.Add(buttonReset); + Controls.Add(buttonDelete); + Controls.Add(buttonChange); + Controls.Add(buttonAdd); + Controls.Add(dataGridView); + Name = "DressesForm"; + Text = "DressesForm"; + Load += DressesForm_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button buttonReset; + private Button buttonDelete; + private Button buttonChange; + private Button buttonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/DressesForm.cs b/SewingDresses/SewingDressesView/DressesForm.cs new file mode 100644 index 0000000..04fa669 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressesForm.cs @@ -0,0 +1,113 @@ +using Microsoft.Extensions.Logging; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SewingDressesView +{ + public partial class DressesForm : Form + { + private readonly ILogger _logger; + private readonly IDressLogic _logic; + public DressesForm(ILogger logger, IDressLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(DressForm)); + if (service is DressForm form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void buttonChange_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(DressForm)); + if (service is DressForm form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void buttonDelete_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Delete component"); + try + { + if (!_logic.Delete(new DressBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Delete component error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + } + + private void buttonReset_Click(object sender, EventArgs e) + { + LoadData(); + } + + private void DressesForm_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["DressName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Load components"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Load components error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/SewingDresses/SewingDressesView/DressesForm.resx b/SewingDresses/SewingDressesView/DressesForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SewingDresses/SewingDressesView/DressesForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/MainForm.Designer.cs b/SewingDresses/SewingDressesView/MainForm.Designer.cs new file mode 100644 index 0000000..cee4ca6 --- /dev/null +++ b/SewingDresses/SewingDressesView/MainForm.Designer.cs @@ -0,0 +1,171 @@ +namespace SewingDressesView +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + buttonCreate = new Button(); + buttonDoOrder = new Button(); + buttonOrderReady = new Button(); + buttonOrderGive = new Button(); + buttonOrderUpdate = new Button(); + menuStrip1 = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + компонентыToolStripMenuItem = new ToolStripMenuItem(); + платьяToolStripMenuItem = new ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + menuStrip1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(2, 39); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(804, 447); + dataGridView.TabIndex = 0; + // + // buttonCreate + // + buttonCreate.Location = new Point(854, 62); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(194, 37); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать заказ"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += buttonCreate_Click; + // + // buttonDoOrder + // + buttonDoOrder.Location = new Point(854, 130); + buttonDoOrder.Name = "buttonDoOrder"; + buttonDoOrder.Size = new Size(194, 37); + buttonDoOrder.TabIndex = 2; + buttonDoOrder.Text = "Отдать на выполнение"; + buttonDoOrder.UseVisualStyleBackColor = true; + buttonDoOrder.Click += buttonDoOrder_Click; + // + // buttonOrderReady + // + buttonOrderReady.Location = new Point(854, 205); + buttonOrderReady.Name = "buttonOrderReady"; + buttonOrderReady.Size = new Size(194, 37); + buttonOrderReady.TabIndex = 3; + buttonOrderReady.Text = "Заказ готов"; + buttonOrderReady.UseVisualStyleBackColor = true; + buttonOrderReady.Click += buttonOrderReady_Click; + // + // buttonOrderGive + // + buttonOrderGive.Location = new Point(854, 280); + buttonOrderGive.Name = "buttonOrderGive"; + buttonOrderGive.Size = new Size(194, 37); + buttonOrderGive.TabIndex = 4; + buttonOrderGive.Text = "Заказ выдан"; + buttonOrderGive.UseVisualStyleBackColor = true; + buttonOrderGive.Click += buttonOrderGive_Click; + // + // buttonOrderUpdate + // + buttonOrderUpdate.Location = new Point(854, 357); + buttonOrderUpdate.Name = "buttonOrderUpdate"; + buttonOrderUpdate.Size = new Size(194, 37); + buttonOrderUpdate.TabIndex = 5; + buttonOrderUpdate.Text = "Обновить список"; + buttonOrderUpdate.UseVisualStyleBackColor = true; + buttonOrderUpdate.Click += buttonOrderUpdate_Click; + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(1096, 28); + menuStrip1.TabIndex = 6; + menuStrip1.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, платьяToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // компонентыToolStripMenuItem + // + компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; + компонентыToolStripMenuItem.Size = new Size(182, 26); + компонентыToolStripMenuItem.Text = "Компоненты"; + компонентыToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click; + // + // платьяToolStripMenuItem + // + платьяToolStripMenuItem.Name = "платьяToolStripMenuItem"; + платьяToolStripMenuItem.Size = new Size(182, 26); + платьяToolStripMenuItem.Text = "Платья"; + платьяToolStripMenuItem.Click += DressesToolStripMenuItem_Click; + // + // MainForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1096, 493); + Controls.Add(buttonOrderUpdate); + Controls.Add(buttonOrderGive); + Controls.Add(buttonOrderReady); + Controls.Add(buttonDoOrder); + Controls.Add(buttonCreate); + Controls.Add(dataGridView); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "MainForm"; + Text = "Магазин пошива одежды"; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonCreate; + private Button buttonDoOrder; + private Button buttonOrderReady; + private Button buttonOrderGive; + private Button buttonOrderUpdate; + private MenuStrip menuStrip1; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem компонентыToolStripMenuItem; + private ToolStripMenuItem платьяToolStripMenuItem; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/MainForm.cs b/SewingDresses/SewingDressesView/MainForm.cs new file mode 100644 index 0000000..4e37350 --- /dev/null +++ b/SewingDresses/SewingDressesView/MainForm.cs @@ -0,0 +1,146 @@ +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System.Windows.Forms; + +namespace SewingDressesView +{ + public partial class MainForm : Form + { + private readonly ILogger _logger; + private readonly IOrderLogic _orderLogic; + public MainForm(ILogger logger, IOrderLogic orderLogic) + { + InitializeComponent(); + _logger = logger; + _orderLogic = orderLogic; + } + private void LoadData() + { + try + { + var list = _orderLogic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["DressId"].Visible = false; + dataGridView.Columns["DressName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Load orders"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Load orders error"); + } + } + + private void ComponentsToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(ComponentsForm)); + if (service is ComponentsForm form) + { + form.ShowDialog(); + } + } + + private void DressesToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(DressForm)); + if (service is DressForm form) + { + form.ShowDialog(); + } + } + + private void buttonCreate_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(OrderForm)); + if (service is OrderForm form) + { + form.ShowDialog(); + LoadData(); + } + } + + private void buttonDoOrder_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Order №{id}. Change Status on 'In work'", id); + try + { + var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Change Status on 'In work' error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + } + + 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("Order №{id}. Change status on 'Ready'", + id); + try + { + var operationResult = _orderLogic.FinishOrder(new + OrderBindingModel + { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Change status on 'Ready' error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + } + + private void buttonOrderGive_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Order №{id}. Status change on 'Given'", id); + try + { + var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + _logger.LogInformation("Order №{id} given", id); + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Change status on 'Give' error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void buttonOrderUpdate_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/SewingDresses/SewingDressesView/MainForm.resx b/SewingDresses/SewingDressesView/MainForm.resx new file mode 100644 index 0000000..a0623c8 --- /dev/null +++ b/SewingDresses/SewingDressesView/MainForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/OrderForm.Designer.cs b/SewingDresses/SewingDressesView/OrderForm.Designer.cs new file mode 100644 index 0000000..9f4d082 --- /dev/null +++ b/SewingDresses/SewingDressesView/OrderForm.Designer.cs @@ -0,0 +1,143 @@ +namespace SewingDressesView +{ + partial class OrderForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); + comboBoxDress = new ComboBox(); + textBoxCount = new TextBox(); + textBoxSum = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(26, 21); + label1.Name = "label1"; + label1.Size = new Size(61, 20); + label1.TabIndex = 0; + label1.Text = "Платье:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(26, 65); + label2.Name = "label2"; + label2.Size = new Size(93, 20); + label2.TabIndex = 1; + label2.Text = "Количество:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(26, 107); + label3.Name = "label3"; + label3.Size = new Size(55, 20); + label3.TabIndex = 2; + label3.Text = "Сумма"; + // + // comboBoxDress + // + comboBoxDress.FormattingEnabled = true; + comboBoxDress.Location = new Point(142, 21); + comboBoxDress.Name = "comboBoxDress"; + comboBoxDress.Size = new Size(288, 28); + comboBoxDress.TabIndex = 3; + comboBoxDress.SelectedIndexChanged += comboBoxDress_SelectedIndexChanged; + // + // textBoxCount + // + textBoxCount.Location = new Point(142, 62); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(288, 27); + textBoxCount.TabIndex = 4; + textBoxCount.TextChanged += textBoxCount_TextChanged; + // + // textBoxSum + // + textBoxSum.Location = new Point(142, 100); + textBoxSum.Name = "textBoxSum"; + textBoxSum.Size = new Size(288, 27); + textBoxSum.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(222, 145); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(336, 145); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // OrderForm + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(484, 198); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxSum); + Controls.Add(textBoxCount); + Controls.Add(comboBoxDress); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Name = "OrderForm"; + Text = "OrderForm"; + Load += OrderForm_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private Label label3; + private ComboBox comboBoxDress; + private TextBox textBoxCount; + private TextBox textBoxSum; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/OrderForm.cs b/SewingDresses/SewingDressesView/OrderForm.cs new file mode 100644 index 0000000..fa7ffab --- /dev/null +++ b/SewingDresses/SewingDressesView/OrderForm.cs @@ -0,0 +1,118 @@ +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.BindingModels; +using SewingDressesContracts.SearchModels; +using Microsoft.Extensions.Logging; + + +namespace SewingDressesView +{ + public partial class OrderForm : Form + { + private readonly ILogger _logger; + private readonly IDressLogic _logicD; + private readonly IOrderLogic _logicO; + + public OrderForm(ILogger logger, IDressLogic logicD, IOrderLogic logicO) + { + InitializeComponent(); + _logger = logger; + _logicD = logicD; + _logicO = logicO; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxDress.SelectedValue == null) + { + MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Создание заказа"); + try + { + var operationResult = _logicO.CreateOrder(new OrderBindingModel + { + DressId = Convert.ToInt32(comboBoxDress.SelectedValue), + Count = Convert.ToInt32(textBoxCount.Text), + Sum = Convert.ToDouble(textBoxSum.Text) + }); + if (!operationResult) + { + throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Create order error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void CalcSum() + { + if (comboBoxDress.SelectedValue != null && !string.IsNullOrEmpty(textBoxCount.Text)) + { + try + { + int id = Convert.ToInt32(comboBoxDress.SelectedValue); + var dress = _logicD.ReadElement(new DressSearchModel + { + Id = id + }); + int count = Convert.ToInt32(textBoxCount.Text); + textBoxSum.Text = Math.Round(count * dress?.Price ?? 0, 2).ToString(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Calculate sum order error"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + + } + } + } + + private void comboBoxDress_SelectedIndexChanged(object sender, EventArgs e) + { + CalcSum(); + } + + private void textBoxCount_TextChanged(object sender, EventArgs e) + { + CalcSum(); + } + + private void OrderForm_Load(object sender, EventArgs e) + { + try + { + var list = _logicD.ReadList(null); + if (list != null) + { + comboBoxDress.DisplayMember = "DressName"; + comboBoxDress.ValueMember = "Id"; + comboBoxDress.DataSource = list; + comboBoxDress.SelectedItem = null; + _logger.LogInformation("Load dress for order"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Load dress for order error"); + + } + } + } +} diff --git a/SewingDresses/SewingDressesView/OrderForm.resx b/SewingDresses/SewingDressesView/OrderForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SewingDresses/SewingDressesView/OrderForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/Program.cs b/SewingDresses/SewingDressesView/Program.cs new file mode 100644 index 0000000..34e4274 --- /dev/null +++ b/SewingDresses/SewingDressesView/Program.cs @@ -0,0 +1,47 @@ +using SewingDressesBusinessLogic.BusinessLogic; +using SewingDressesContracts.BusinessLogicsContracts; +using SewingDressesContracts.StoragesContracts; +using SewingDressesListImplement.Implements; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using System.Drawing; + +namespace SewingDressesView +{ + internal static class Program + { + private static ServiceProvider? _serviceProvider; + public static ServiceProvider? ServiceProvider => _serviceProvider; + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + var services = new ServiceCollection(); + ConfigureServices(services); + _serviceProvider = services.BuildServiceProvider(); + Application.Run(_serviceProvider.GetRequiredService()); + } + private static void ConfigureServices(ServiceCollection services) + { + services.AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + } + } +} \ No newline at end of file diff --git a/SewingDresses/SewingDressesView/SewingDressesView.csproj b/SewingDresses/SewingDressesView/SewingDressesView.csproj new file mode 100644 index 0000000..3b367a9 --- /dev/null +++ b/SewingDresses/SewingDressesView/SewingDressesView.csproj @@ -0,0 +1,17 @@ + + + + WinExe + net6.0-windows + enable + true + enable + + + + + + + + + \ No newline at end of file