From 2a95ec552463b8d4b2fba5c03afb027988eb1801 Mon Sep 17 00:00:00 2001 From: Kate Date: Sun, 21 May 2023 13:53:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BB=D1=808?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FileImplementationExtension.cs | 27 ++ .../Implements/BackUpInfo.cs | 37 +++ .../Implements/MessageInfoStorage.cs | 85 +++-- PrecastConcreteFileImplement/Models/Client.cs | 14 +- .../Models/Component.cs | 11 +- .../Models/Implementer.cs | 21 +- .../Models/Message.cs | 17 +- PrecastConcreteFileImplement/Models/Order.cs | 43 +-- .../Models/Reinforced.cs | 16 +- PrecastConcretePlant/DataGridViewExtension.cs | 58 ++++ PrecastConcretePlant/FormClients.cs | 10 +- PrecastConcretePlant/FormComponents.cs | 43 +-- PrecastConcretePlant/FormImplementers.cs | 36 +-- PrecastConcretePlant/FormMails.cs | 11 +- PrecastConcretePlant/FormMain.Designer.cs | 11 +- PrecastConcretePlant/FormMain.cs | 113 +++---- PrecastConcretePlant/FormReinforced.cs | 91 +++--- PrecastConcretePlant/FormReinforceds.cs | 64 ++-- .../PrecastConcretePlantContracts.dll | Bin 0 -> 32256 bytes .../PrecastConcretePlantDataModels.dll | Bin 0 -> 6656 bytes .../PrecastConcretePlantDatabaseImplement.dll | Bin 0 -> 86528 bytes .../PrecastConcretePlantFileImplement.dll | Bin 0 -> 41472 bytes .../PrecastConcretePlantListImplement.dll | Bin 0 -> 27136 bytes PrecastConcretePlant/Program.cs | 98 +++--- .../BusinessLogic/BackUpLogic.cs | 117 +++++++ .../Attributes/ColumnAttribute.cs | 26 ++ .../Attributes/GridViewAutoSize.cs | 20 ++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 + .../BindingModels/MessageInfoBindingModel.cs | 3 +- .../BusinessLogicsContracts/IBackUpLogic.cs | 14 + .../DI/DependencyManager.cs | 43 +++ .../DI/IDependencyContainer.cs | 18 ++ .../DI/IImplementationExtension.cs | 14 + .../DI/ServiceDependencyContainer.cs | 64 ++++ .../DI/ServiceProviderLoader.cs | 57 ++++ .../DI/UnityDependencyContainer.cs | 40 +++ .../PrecastConcretePlantContracts.csproj | 6 + .../StoragesContracts/IBackUpInfo.cs | 14 + .../ViewModels/ClientViewModel.cs | 18 +- .../ViewModels/ComponentViewModel.cs | 14 +- .../ViewModels/ImplementerViewModel.cs | 22 +- .../ViewModels/MessageInfoViewModel.cs | 30 +- .../ViewModels/OrderViewModel.cs | 48 +-- .../ViewModels/ReinforcedViewModel.cs | 15 +- .../DatabaseImplementationExtension.cs | 28 ++ .../Implements/BackUpInfo.cs | 34 ++ .../Implements/ClientStorage.cs | 22 +- .../20230517160304_AddMessage.Designer.cs | 301 ++++++++++++++++++ .../Migrations/20230517160304_AddMessage.cs | 49 +++ .../Migrations/20230518101319_8lr.Designer.cs | 301 ++++++++++++++++++ .../Migrations/20230518101319_8lr.cs | 22 ++ .../Models/Client.cs | 16 +- .../Models/Component.cs | 11 +- .../Models/Implementer.cs | 17 +- .../Models/Message.cs | 9 + .../Models/Order.cs | 29 +- .../Models/Reinforced.cs | 10 +- .../Models/IMessageInfoModel.cs | 2 +- .../Implements/BackUpInfo.cs | 22 ++ .../Implements/MessageInfoStorage.cs | 1 + .../Implements/OrderStorage.cs | 44 +-- .../ListImplementationExtension.cs | 23 ++ .../Models/Message.cs | 2 + 63 files changed, 1854 insertions(+), 491 deletions(-) create mode 100644 PrecastConcreteFileImplement/FileImplementationExtension.cs create mode 100644 PrecastConcreteFileImplement/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlant/DataGridViewExtension.cs create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantFileImplement.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll create mode 100644 PrecastConcretePlantBusinessLogic/BusinessLogic/BackUpLogic.cs create mode 100644 PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs create mode 100644 PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 PrecastConcretePlantContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 PrecastConcretePlantContracts/DI/DependencyManager.cs create mode 100644 PrecastConcretePlantContracts/DI/IDependencyContainer.cs create mode 100644 PrecastConcretePlantContracts/DI/IImplementationExtension.cs create mode 100644 PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs create mode 100644 PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs create mode 100644 PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/DatabaseImplementationExtension.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.Designer.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.Designer.cs create mode 100644 PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.cs create mode 100644 PrecastConcretePlantListImplement/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlantListImplement/ListImplementationExtension.cs diff --git a/PrecastConcreteFileImplement/FileImplementationExtension.cs b/PrecastConcreteFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..b0d03d0 --- /dev/null +++ b/PrecastConcreteFileImplement/FileImplementationExtension.cs @@ -0,0 +1,27 @@ +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantFileImplement +{ + public class FileImplementationExtension : IImplementationExtension + { + public int Priority => 1; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/PrecastConcreteFileImplement/Implements/BackUpInfo.cs b/PrecastConcreteFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..2016697 --- /dev/null +++ b/PrecastConcreteFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,37 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + var source = DataFileSingleton.GetInstance(); + + return (List?)source.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T)) + ?.GetValue(source); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + + return null; + } + } +} diff --git a/PrecastConcreteFileImplement/Implements/MessageInfoStorage.cs b/PrecastConcreteFileImplement/Implements/MessageInfoStorage.cs index b9dd573..473cc8a 100644 --- a/PrecastConcreteFileImplement/Implements/MessageInfoStorage.cs +++ b/PrecastConcreteFileImplement/Implements/MessageInfoStorage.cs @@ -3,55 +3,50 @@ using PrecastConcretePlantContracts.SearchModels; using PrecastConcretePlantContracts.StoragesContracts; using PrecastConcretePlantContracts.ViewModels; using PrecastConcretePlantFileImplement.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace PrecastConcretePlantFileImplement.Implements { - public class MessageInfoStorage : IMessageInfoStorage - { - private readonly DataFileSingleton source; - public MessageInfoStorage() - { - source = DataFileSingleton.GetInstance(); - } - public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) - { - if (model.MessageId == null) - return null; - return source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel; - } + public class MessageInfoStorage : IMessageInfoStorage + { + private readonly DataFileSingleton source; + public MessageInfoStorage() + { + source = DataFileSingleton.GetInstance(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (model.MessageId == null) + return null; + return source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel; + } - public List GetFilteredList(MessageInfoSearchModel model) - { - if (!model.ClientId.HasValue) - return new(); - return source.Messages - .Where(x => x.ClientId == model.ClientId) - .Select(x => x.GetViewModel) - .ToList(); - } + public List GetFilteredList(MessageInfoSearchModel model) + { + if (!model.ClientId.HasValue) + return new(); + return source.Messages + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } - public List GetFullList() - { - return source.Messages - .Select(x => x.GetViewModel) - .ToList(); - } + public List GetFullList() + { + return source.Messages + .Select(x => x.GetViewModel) + .ToList(); + } - public MessageInfoViewModel? Insert(MessageInfoBindingModel model) - { - var newMessage = Message.Create(model); - if (newMessage == null) - { - return null; - } - source.Messages.Add(newMessage); - source.SaveMessages(); - return newMessage.GetViewModel; - } - } + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = Message.Create(model); + if (newMessage == null) + { + return null; + } + source.Messages.Add(newMessage); + source.SaveMessages(); + return newMessage.GetViewModel; + } + } } diff --git a/PrecastConcreteFileImplement/Models/Client.cs b/PrecastConcreteFileImplement/Models/Client.cs index f30e3f0..341d4ae 100644 --- a/PrecastConcreteFileImplement/Models/Client.cs +++ b/PrecastConcreteFileImplement/Models/Client.cs @@ -4,18 +4,24 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Client : IClientModel { - public int Id { get; private set; } - public string ClientFIO { get; private set; } = string.Empty; - public string Email { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; public static Client? Create(ClientBindingModel? model) { if (model == null) diff --git a/PrecastConcreteFileImplement/Models/Component.cs b/PrecastConcreteFileImplement/Models/Component.cs index cc02730..320d3f9 100644 --- a/PrecastConcreteFileImplement/Models/Component.cs +++ b/PrecastConcreteFileImplement/Models/Component.cs @@ -4,17 +4,22 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Component : IComponentModel { - public int Id { get; private set; } - public string ComponentName { get; private set; } = string.Empty; - public double Cost { get; set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { if (model == null) diff --git a/PrecastConcreteFileImplement/Models/Implementer.cs b/PrecastConcreteFileImplement/Models/Implementer.cs index 3cf5a75..b64f06c 100644 --- a/PrecastConcreteFileImplement/Models/Implementer.cs +++ b/PrecastConcreteFileImplement/Models/Implementer.cs @@ -4,23 +4,26 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { - public string ImplementerFIO { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; - - public int WorkExperience { get; private set; } - - public int Qualification { get; private set; } - - public int Id { get; private set; } + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; + [DataMember] + public int WorkExperience { get; private set; } + [DataMember] + public int Qualification { get; private set; } + [DataMember] + public int Id { get; private set; } public static Implementer? Create(XElement element) { diff --git a/PrecastConcreteFileImplement/Models/Message.cs b/PrecastConcreteFileImplement/Models/Message.cs index dbb7edd..9f8ad37 100644 --- a/PrecastConcreteFileImplement/Models/Message.cs +++ b/PrecastConcreteFileImplement/Models/Message.cs @@ -4,24 +4,27 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Message : IMessageInfoModel { + [DataMember] public string MessageId { get; private set; } = string.Empty; - + [DataMember] public int? ClientId { get; private set; } - + [DataMember] public string SenderName { get; private set; } = string.Empty; - + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; - + [DataMember] public string Subject { get; private set; } = string.Empty; - + [DataMember] public string Body { get; private set; } = string.Empty; public static Message? Create(MessageInfoBindingModel model) @@ -75,6 +78,8 @@ namespace PrecastConcretePlantFileImplement.Models new XAttribute("MessageId", MessageId), new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) - ); + ); + + public int Id => throw new NotImplementedException(); } } diff --git a/PrecastConcreteFileImplement/Models/Order.cs b/PrecastConcreteFileImplement/Models/Order.cs index b0f336a..8f36a55 100644 --- a/PrecastConcreteFileImplement/Models/Order.cs +++ b/PrecastConcreteFileImplement/Models/Order.cs @@ -5,26 +5,32 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Order : IOrderModel { - public int? ImplementerId { get; set; } - public int ClientId { get; private set; } - public int ReinforcedId { get; private set; } - public int Count { get; private set; } - - public double Sum { get; private set; } - - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - - public DateTime DateCreate { get; private set; } = DateTime.Now; - - public DateTime? DateImplement { get; private set; } + [DataMember] + public int? ImplementerId { get; set; } + [DataMember] + public int ClientId { get; private set; } + [DataMember] + public int ReinforcedId { get; private set; } + [DataMember] + public int Count { get; private set; } + [DataMember] + public double Sum { get; private set; } + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] + public DateTime? DateImplement { get; private set; } public int Id { get; private set; } @@ -55,7 +61,8 @@ namespace PrecastConcretePlantFileImplement.Models return null; } - var order = new Order() + DateTime.TryParse(element.Element("DateImplement")!.Value, out DateTime dateImpl); + var order = new Order() { Id = Convert.ToInt32(element.Attribute("Id")!.Value), ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.Value), @@ -63,12 +70,10 @@ namespace PrecastConcretePlantFileImplement.Models ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), - Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), - DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null) - }; - - DateTime.TryParse(element.Element("DateImplement")!.Value, out DateTime dateImpl); - order.DateImplement = dateImpl; + Status = (OrderStatus)Convert.ToInt32(element.Element("Status")!.Value), + DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null), + DateImplement = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null), + }; return order; } diff --git a/PrecastConcreteFileImplement/Models/Reinforced.cs b/PrecastConcreteFileImplement/Models/Reinforced.cs index d8eb2c3..e633201 100644 --- a/PrecastConcreteFileImplement/Models/Reinforced.cs +++ b/PrecastConcreteFileImplement/Models/Reinforced.cs @@ -4,20 +4,26 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { - public class Reinforced : IReinforcedModel + [DataContract] + public class Reinforced : IReinforcedModel { - public int Id { get; private set; } - public string ReinforcedName { get; private set; } = string.Empty; - public double Price { get; private set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ReinforcedName { get; private set; } = string.Empty; + [DataMember] + public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _ReinforcedComponents = null; - public Dictionary ReinforcedComponents + [DataMember] + public Dictionary ReinforcedComponents { get { diff --git a/PrecastConcretePlant/DataGridViewExtension.cs b/PrecastConcretePlant/DataGridViewExtension.cs new file mode 100644 index 0000000..8670a56 --- /dev/null +++ b/PrecastConcretePlant/DataGridViewExtension.cs @@ -0,0 +1,58 @@ +using PrecastConcretePlantContracts.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantView +{ + public static class DataGridViewExtension + { + public static void FillandConfigGrid(this DataGridView grid, List? data) + { + if (data == null) + { + return; + } + + grid.DataSource = data; + + var type = typeof(T); + var properties = type.GetProperties(); + + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем {column.Name}"); + } + + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства {property.Name}"); + } + + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} diff --git a/PrecastConcretePlant/FormClients.cs b/PrecastConcretePlant/FormClients.cs index e174da1..16bcf29 100644 --- a/PrecastConcretePlant/FormClients.cs +++ b/PrecastConcretePlant/FormClients.cs @@ -35,14 +35,8 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); + dataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/PrecastConcretePlant/FormComponents.cs b/PrecastConcretePlant/FormComponents.cs index 86097d9..645a508 100644 --- a/PrecastConcretePlant/FormComponents.cs +++ b/PrecastConcretePlant/FormComponents.cs @@ -2,6 +2,7 @@ using PrecastConcretePlant; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -35,16 +36,8 @@ namespace PrecastConcretePlantView { 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("Загрузка компонентов"); + DataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) @@ -56,31 +49,21 @@ namespace PrecastConcretePlantView private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + LoadData(); + } - if (service is FormComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } private void ChangeButton_Click(object sender, EventArgs e) { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - - if (service is FormComponent form) - { - form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); - - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } } } private void DeleteButton_Click(object sender, EventArgs e) diff --git a/PrecastConcretePlant/FormImplementers.cs b/PrecastConcretePlant/FormImplementers.cs index 81fb05c..66027ec 100644 --- a/PrecastConcretePlant/FormImplementers.cs +++ b/PrecastConcretePlant/FormImplementers.cs @@ -2,6 +2,7 @@ using PrecastConcretePlant; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; namespace PrecastConcretePlantView { @@ -23,45 +24,36 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка исполнителей"); } + catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки исполнителей"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + var form = DependencyManager.Instance.Resolve(); + + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } private void ButtonUpd_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/PrecastConcretePlant/FormMails.cs b/PrecastConcretePlant/FormMails.cs index 7bf0c74..c1c6910 100644 --- a/PrecastConcretePlant/FormMails.cs +++ b/PrecastConcretePlant/FormMails.cs @@ -21,15 +21,8 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["ClientId"].Visible = false; - DataGridView.Columns["MessageId"].Visible = false; - DataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка писем"); + DataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка писем"); } catch (Exception ex) { diff --git a/PrecastConcretePlant/FormMain.Designer.cs b/PrecastConcretePlant/FormMain.Designer.cs index 840ba22..f2314db 100644 --- a/PrecastConcretePlant/FormMain.Designer.cs +++ b/PrecastConcretePlant/FormMain.Designer.cs @@ -46,13 +46,14 @@ OrderReadyButton = new Button(); IssuedOrderButton = new Button(); UpdateListButton = new Button(); + бекапToolStripMenuItem = new ToolStripMenuItem(); MenuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); SuspendLayout(); // // MenuStrip // - MenuStrip.Items.AddRange(new ToolStripItem[] { СправочникиToolStripMenuItem, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, элписьмаToolStripMenuItem }); + MenuStrip.Items.AddRange(new ToolStripItem[] { СправочникиToolStripMenuItem, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, элписьмаToolStripMenuItem, бекапToolStripMenuItem }); MenuStrip.Location = new Point(0, 0); MenuStrip.Name = "MenuStrip"; MenuStrip.Size = new Size(953, 24); @@ -195,6 +196,13 @@ UpdateListButton.UseVisualStyleBackColor = true; UpdateListButton.Click += UpdateListButton_Click; // + // бекапToolStripMenuItem + // + бекапToolStripMenuItem.Name = "бекапToolStripMenuItem"; + бекапToolStripMenuItem.Size = new Size(51, 20); + бекапToolStripMenuItem.Text = "Бекап"; + бекапToolStripMenuItem.Click += бекапToolStripMenuItem_Click; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); @@ -238,5 +246,6 @@ private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem элписьмаToolStripMenuItem; + private ToolStripMenuItem бекапToolStripMenuItem; } } \ No newline at end of file diff --git a/PrecastConcretePlant/FormMain.cs b/PrecastConcretePlant/FormMain.cs index b8d1dc3..a8bdeda 100644 --- a/PrecastConcretePlant/FormMain.cs +++ b/PrecastConcretePlant/FormMain.cs @@ -3,6 +3,7 @@ using PrecastConcretePlant; using PrecastConcretePlantBusinessLogic.BusinessLogic; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using PrecastConcretePlantDataModels.Enums; using PrecastConcretePlantView; using System; @@ -24,14 +25,16 @@ namespace PrecastConcretePlantView private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; + private readonly IBackUpLogic _backUpLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + public FormMain(ILogger logger, IBackUpLogic backUpLogic, IWorkProcess workProcess, IOrderLogic orderLogic, IReportLogic reportLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workProcess = workProcess; + _backUpLogic = backUpLogic; } private void FormMain_Load(object sender, EventArgs e) @@ -45,17 +48,7 @@ namespace PrecastConcretePlantView try { - var list = _orderLogic.ReadList(null); - - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["ReinforcedId"].Visible = false; - DataGridView.Columns["ClientId"].Visible = false; - DataGridView.Columns["ImplementerId"].Visible = false; - DataGridView.Columns["DateImplement"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - + DataGridView.FillandConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) @@ -67,33 +60,21 @@ namespace PrecastConcretePlantView private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - - if (service is FormComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforceds)); - - if (service is FormReinforceds form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void CreateOrderButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); } private void TakeOrderInWorkButton_Click(object sender, EventArgs e) @@ -201,63 +182,63 @@ namespace PrecastConcretePlantView private void компонентыПоИзделиямToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportReinforcedComponents)); - if (service is FormReportReinforcedComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void списокЗаказовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - if (service is FormReportOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic - )) as IImplementerLogic)!, _orderLogic); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); MessageBox.Show("Процесс обработки запущен", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBoxButtons.OK, MessageBoxIcon.Information); } private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); - if (service is FormImplementers form) - { - form.ShowDialog(); - } - } - - private void элПисьмаToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormMails)); - if (service is FormMails form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void элписьмаToolStripMenuItem_Click_1(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMails)); - if (service is FormMails form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void бекапToolStripMenuItem_Click(object sender, EventArgs e) + { + try { - form.ShowDialog(); + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); } } } diff --git a/PrecastConcretePlant/FormReinforced.cs b/PrecastConcretePlant/FormReinforced.cs index 8eb1f29..a8e50db 100644 --- a/PrecastConcretePlant/FormReinforced.cs +++ b/PrecastConcretePlant/FormReinforced.cs @@ -13,6 +13,7 @@ using PrecastConcretePlantContracts.SearchModels; using PrecastConcretePlantDataModels.Models; using Microsoft.Extensions.Logging; using PrecastConcretePlant; +using PrecastConcretePlantContracts.DI; namespace PrecastConcretePlantView { @@ -84,64 +85,58 @@ namespace PrecastConcretePlantView MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void AddButton_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforcedComponent)); + private void AddButton_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); - if (service is FormReinforcedComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); + _logger.LogInformation("Добавление нового компонента: { ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count); - if (_reinforcedComponents.ContainsKey(form.Id)) - { - _reinforcedComponents[form.Id] = (form.ComponentModel, form.Count); - } + if (_reinforcedComponents.ContainsKey(form.Id)) + { + _reinforcedComponents[form.Id] = (form.ComponentModel, form.Count); + } + else + { + _reinforcedComponents.Add(form.Id, (form.ComponentModel, form.Count)); + } - else - { - _reinforcedComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } + LoadData(); + } + } - LoadData(); - } - } - } + private void ChangeButton_Click(object sender, EventArgs e) + { + if (DataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells[0].Value); - private void ChangeButton_Click(object sender, EventArgs e) - { - if (DataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforcedComponent)); + form.Id = id; + form.Count = _reinforcedComponents[id].Item2; - if (service is FormReinforcedComponent form) - { - int id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _reinforcedComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } + _logger.LogInformation("Изменение компонента: { ComponentName} - { Count} ", form.ComponentModel.ComponentName, form.Count); + _reinforcedComponents[id] = (form.ComponentModel, form.Count); - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _reinforcedComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } + LoadData(); + } + } + } - private void DeleteButton_Click(object sender, EventArgs e) + private void DeleteButton_Click(object sender, EventArgs e) { if (DataGridView.SelectedRows.Count == 1) { diff --git a/PrecastConcretePlant/FormReinforceds.cs b/PrecastConcretePlant/FormReinforceds.cs index 92bce01..1bbb75a 100644 --- a/PrecastConcretePlant/FormReinforceds.cs +++ b/PrecastConcretePlant/FormReinforceds.cs @@ -11,6 +11,7 @@ using Microsoft.Extensions.Logging; using PrecastConcretePlant; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; namespace PrecastConcretePlantView { @@ -35,17 +36,8 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ReinforcedName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["ReinforcedComponents"].Visible = false; - } - - _logger.LogInformation("Загрузка ЖБИ"); + DataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка ЖБИ"); } catch (Exception ex) @@ -55,36 +47,32 @@ namespace PrecastConcretePlantView } } - private void AddButton_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforced)); + private void AddButton_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); - if (service is FormReinforced form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - private void ChangeButton_Click(object sender, EventArgs e) - { - if (DataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforced)); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } - if (service is FormReinforced form) - { - form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + private void ChangeButton_Click(object sender, EventArgs e) + { + if (DataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - } - private void DeleteButton_Click(object sender, EventArgs e) + form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void DeleteButton_Click(object sender, EventArgs e) { if (DataGridView.SelectedRows.Count == 1) { diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..efbe63fff6031347add2a94703cab478f8e8c0cc GIT binary patch literal 32256 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 literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..019d829d2a788afbc53c00006eac9e8f965e72e9 GIT binary patch literal 6656 zcmeHLYit}>6+W{wyV=;WV<&Zz=DCRz>Za+&c{V9Dwc~Z#rE%BO`+jp?_uO;Ny>n-020n3yR3g&QFJC5l6<2OO60Z)&p>AFAdMmv=`@+gs zmE9Ls4j(q$M9HxWj$TaUbjz~6L{=o6vXwBbL~1aTDB5|EY-wp)9k?FqC)%y3WK7=q zbal4(XjP(F=_Z;7Nz9k-080t<9(1BMNk{y+S-|njb{q&fHZVpIOFUjvp!Xz#Bl z8f2n}=mRdq%yx)q4rI?IiH2wDuEr;b;vsz;{M{iw>4{?=_!P$moy;|e8=PzjqC-i? zb#mZjY&{@2(Hqc1tq0L39bwuqGKH;Yb8=x z_#d=Yk**e^CR&>fh{(dvcEH`51?t%c;Z$3@qpDD^;1RR77C~k{zEcSz;Cv=FC%coI zx;Jgu&H+Wq1g5YrIv*mM!qtm{&UlVt66crf8UZsA0Yr8n~w#X84O1j^#l$oY8l+a%jGdN_h5PYo841e$x==4=L>B zS?y%aGKPa|7J3|gHhL3!v!tKL{nAdno;L!U=w@IWZIHNKVz0!s#Jv*lm8b(_Gzsh= zL(*~F@2lk;Hv<<@61bE$0TZ+hn#J^vvIfWPJ(;_egmL*hlxlt`9jRsb6}_Nl8vha+ITo6d~m&rTnCnpM?C&$|)&7Ppjx{ z<$IF;m84aLC7lv;5)GB3jiQ1v+?lg*H^zap5qA^n)r@Kpy+)4#chMJs11jTpBt1uA zIvRZvxJgQU`Mc8ob1IK|T*_afFM|HNq!&iN0{Z6~k8O=Io{;u0Nqk0H{!Qbt53B6? z9qntttqPC&oi+u0U;4Q~to^$78sd)PE{`CCsLWv&FpeA|GLHx{X#w3#bAfY^RRsKe zU@LV1=h8x88#0YRw*)wkmI3GEM2=wZtORyo)gm~w*8msNO~6IiK@p6(1-O`Q1umiW zz@^wz5scpiTuyx2t)SaTJ5IGdilEW>?2GxN#3j@zkBCOuDOkz2r)-*f))a>}(1>o9 z#c;UqQgg2Hh!lEcFPdK~MgHqII8sM3mU>{>+l$mrr zQB3yPrYWQ&H+h$^gk$6=ozDAy{L4OJSmU;n6Zt?sAY4~3h^ke6wm{-f7BEA)>mIco z-_;P@3+elS?HuVpR>FM33PkmJ_UJ|5DkH4CaB6IyT`bua5|NUW?ulUomO(1}%9h70 zmwkbeSgmA`5q@4#y1oOjorOv1>P|xm0?D9*4H3|xeI7{somXY5yT#{uTl5!o!=xcc z>bC&wU~gGBjd3F<>sU)gj0g7+C3Bwb zROKl{FIcwg89BEq3W|i=&fkI=;Y{F`aDxqoDsT`kRm;y6b7{cHIksz$dl;7&y_RlH zx`unLJp6R7VRa34k~6PGA37|kw($P$c4c|$3&;t|Th&)&Jl!k1Bv&t>xty7D_5qwe zwOh8fqEgalCaSNu1rke?d1d-x=wD&s)6>TxJU4xM`h;)%ZH#+^1+Y2+yVL%$yJF>$bxmPO%}J-4E_%t}y4d#@7L64c($(2ch{mbCY`f|!?%#5>vtBJ-BU z)h>+c!l*8c>Iz16@hCud+?QY!h|s9Gf(InG<@~#SII`e?qnGyBR{yb_DDfdPeAuy% zx(e)O$vE#Ξ)c|8Sq}h~83ZU2wzRF|jq-4F|0^)DE_k;g(E&k`L!Nk4V4*kGADk zzu)jer%+TLuy`ZFtQ+t`hCg2}8N6vI^ywq~0yG?H=`~IJ=s?-@3_Ru_n4Pu`<2izJ zoXvLQ{q(-viVy#ZWuET+tv}o(#J&7O^%iPGb|UJVW_+1jb6RbqjvUzQCa6v zOL$nDYuG1C`7CAb?%lX$D^;^-3$j3^+P>QS?$qhR+}EwSj~<+d<*K%IOed;bznU7ZvOR7pTXCN z>Nk}@fJ+KpfmfXz_%ZN3NWiB><77*t)pFD@v^u0N^g4O4v%&doO1p#uL_tg*tPIEt z|H9Kxq)j(f|29(=G|~NdYf$j+XH$_%a*j!4q=OUE{SbT#yy@wf+mm({IF@p)q04ZCv`VW|o4+mE#S}7S7{(=jp~{MycgJf_WUwRIk$pyxVryI>*%s zd#*I+;ozzx=6dGW6HgKqF!9H&3r`0;B``-p&cKx};T@k>s(|ko{M|HxZpnBC139lE z$5X8vbN-6_x8m~GoxSmTm9ZvXD0{-nUf;TR!lJzmXo--N*_#{d_S14xKeaQY_R^XquB7ZRe literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..db0659431ca3f97d3ee48b225dd0ac2cf7fd0cc8 GIT binary patch literal 86528 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 literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..0f720108f00bd49eb0ac12d43ba8f4b38c7a23e1 GIT binary patch literal 27136 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 X+XxJ*|7Xk;`EAtSZ4~})2mXHnay;g6 literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/Program.cs b/PrecastConcretePlant/Program.cs index 5e9cab1..2a0d909 100644 --- a/PrecastConcretePlant/Program.cs +++ b/PrecastConcretePlant/Program.cs @@ -12,25 +12,22 @@ using PrecastConcretePlantBusinessLogic.BusinessLogics; using PrecastConcretePlantView; using PrecastConcretePlantBusinessLogic.MailWorker; using PrecastConcretePlantContracts.BindingModels; +using PrecastConcretePlantContracts.DI; namespace PrecastConcretePlant { 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(); - try + InitDependency(); + try { - var mailSender = _serviceProvider.GetService(); - mailSender?.MailConfig(new MailConfigBindingModel + var mailSender = DependencyManager.Instance.Resolve(); + mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, @@ -44,54 +41,53 @@ namespace PrecastConcretePlant } catch (Exception ex) { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, "Error"); - } - Application.Run(_serviceProvider.GetRequiredService()); - } + var logger = DependencyManager.Instance.Resolve(); + logger?.LogError(ex, "Error"); + } + Application.Run(DependencyManager.Instance.Resolve()); + } - private static void ConfigureServices(ServiceCollection services) - { - services.AddLogging(option => - { + private static void InitDependency() + { + DependencyManager.InitDependency(); + + DependencyManager.Instance.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(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - } + DependencyManager.Instance.RegisterType(true); - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); - } + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); + } } \ No newline at end of file diff --git a/PrecastConcretePlantBusinessLogic/BusinessLogic/BackUpLogic.cs b/PrecastConcretePlantBusinessLogic/BusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..efa7206 --- /dev/null +++ b/PrecastConcretePlantBusinessLogic/BusinessLogic/BackUpLogic.cs @@ -0,0 +1,117 @@ +using Microsoft.Extensions.Logging; +using PrecastConcretePlantContracts.BindingModels; +using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantDataModels; +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization.Json; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantBusinessLogic.BusinessLogic +{ + public class BackUpLogic : IBackUpLogic + { + private readonly ILogger _logger; + + private readonly IBackUpInfo _backUpInfo; + + public BackUpLogic(ILogger logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + + public void CreateBackUp(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + + try + { + _logger.LogDebug("Clear folder"); + // зачистка папки и удаление старого архива + var dirInfo = new DirectoryInfo(model.FolderName); + + if (dirInfo.Exists) + { + foreach (var file in dirInfo.GetFiles()) + { + file.Delete(); + } + } + + _logger.LogDebug("Delete archive"); + string fileName = $"{model.FolderName}.zip"; + + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + + // берем метод для сохранения + _logger.LogDebug("Get assembly"); + var typeIId = typeof(IId); + var assembly = typeIId.Assembly; + + if (assembly == null) + { + throw new ArgumentNullException("Сборка не найдена", nameof(assembly)); + } + + var types = assembly.GetTypes(); + var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance); + _logger.LogDebug("Find {count} types", types.Length); + + foreach (var type in types) + { + if (type.IsInterface && type.GetInterface(typeIId.Name) != null) + { + var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); + + if (modelType == null) + { + throw new InvalidOperationException($"Не найден класс-модель для {type.Name}"); + } + + _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); + // вызываем метод на выполнение + method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName }); + } + } + + _logger.LogDebug("Create zip and remove folder"); + // архивируем + ZipFile.CreateFromDirectory(model.FolderName, fileName); + // удаляем папку + dirInfo.Delete(true); + } + catch (Exception) + { + throw; + } + } + + private void SaveToFile(string folderName) where T : class, new() + { + var records = _backUpInfo.GetList(); + + if (records == null) + { + _logger.LogWarning("{type} type get null list", typeof(T).Name); + + return; + } + + var jsonFormatter = new DataContractJsonSerializer(typeof(List)); + using var fs = new FileStream(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } +} diff --git a/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs b/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..3550640 --- /dev/null +++ b/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + public string Title { get; private set; } + public bool Visible { get; private set; } + public int Width { get; private set; } + public GridViewAutoSize GridViewAutoSize { get; private set; } + public bool IsUseAutoSize { get; private set; } + } +} diff --git a/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs b/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..288a8a8 --- /dev/null +++ b/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/PrecastConcretePlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/PrecastConcretePlantContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..7298dc5 --- /dev/null +++ b/PrecastConcretePlantContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs b/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs index 626a3e7..b3923b7 100644 --- a/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs +++ b/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,6 @@ namespace PrecastConcretePlantContracts.BindingModels public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } - } + public int Id => throw new NotImplementedException(); + } } diff --git a/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..383dd33 --- /dev/null +++ b/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using PrecastConcretePlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/PrecastConcretePlantContracts/DI/DependencyManager.cs b/PrecastConcretePlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..cfba2b3 --- /dev/null +++ b/PrecastConcretePlantContracts/DI/DependencyManager.cs @@ -0,0 +1,43 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + private static DependencyManager? _manager; + private static readonly object _locjObject = new(); + + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + + // регистрируем зависимости + ext.RegisterServices(); + } + + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/PrecastConcretePlantContracts/DI/IDependencyContainer.cs b/PrecastConcretePlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..5db1a11 --- /dev/null +++ b/PrecastConcretePlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public interface IDependencyContainer + { + void AddLogging(Action configure); + void RegisterType(bool isSingle) where U : class, T where T : class; + void RegisterType(bool isSingle) where T : class; + T Resolve(); + + } +} diff --git a/PrecastConcretePlantContracts/DI/IImplementationExtension.cs b/PrecastConcretePlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..10eb79d --- /dev/null +++ b/PrecastConcretePlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + public void RegisterServices(); + } +} diff --git a/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs b/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..dc6767e --- /dev/null +++ b/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,64 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public class ServiceDependencyContainer : IDependencyContainer + { + private ServiceProvider? _serviceProvider; + private readonly ServiceCollection _serviceCollection; + + public ServiceDependencyContainer() + { + _serviceCollection = new ServiceCollection(); + } + + public void AddLogging(Action configure) + { + _serviceCollection.AddLogging(configure); + } + + public void RegisterType(bool isSingle) where U : class, T where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + + _serviceProvider = null; + } + + public void RegisterType(bool isSingle) where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + + _serviceProvider = null; + } + + public T Resolve() + { + if (_serviceProvider == null) + { + _serviceProvider = _serviceCollection.BuildServiceProvider(); + } + + return _serviceProvider.GetService()!; + } + } +} diff --git a/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs b/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..cd3f10d --- /dev/null +++ b/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public class ServiceProviderLoader + { + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); + + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + + return source; + } + + private static string TryGetImplementationExtensionsFolder() + { + var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); + + while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } +} diff --git a/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs b/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..aaaceb1 --- /dev/null +++ b/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Logging; +using System.ComponentModel; +using Unity; +using Unity.Lifetime; +using Unity.Microsoft.Logging; + +namespace PrecastConcretePlantContracts.DI +{ + public class UnityDependencyContainer : IDependencyContainer + { + private readonly IUnityContainer _container; + + public UnityDependencyContainer() + { + _container = new UnityContainer(); + } + + public void AddLogging(Action configure) + { + var factory = LoggerFactory.Create(configure); + _container.AddExtension(new LoggingExtension(factory)); + } + + public void RegisterType(bool isSingle) where T : class + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + + } + + public T Resolve() + { + return _container.Resolve(); + } + + void IDependencyContainer.RegisterType(bool isSingle) + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + } + } +} diff --git a/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj b/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj index dae7eac..d55914a 100644 --- a/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj +++ b/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj @@ -6,6 +6,12 @@ enable + + + + + + diff --git a/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs b/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..01a0af0 --- /dev/null +++ b/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs b/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs index 95f9f51..a0464e3 100644 --- a/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ClientViewModel : IClientModel { - public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] - public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column(visible: false)] + public int Id { get; set; } + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column("Логин (эл. почта)", width: 150)] + public string Email { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs b/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs index 195195c..e224247 100644 --- a/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,11 +11,12 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Cost { get; set; } + [Column(visible: false)] + public int Id { get; set; } + [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; + [Column("Цена", width: 80)] + public double Cost { get; set; } } } diff --git a/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs b/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs index b41daf9..4181842 100644 --- a/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,19 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] - public int WorkExperience { get; set; } + [Column("Стаж работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } + [Column("Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Qualification { get; set; } } } diff --git a/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs b/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs index 6ad403b..7afb9dd 100644 --- a/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,20 +11,23 @@ namespace PrecastConcretePlantContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public int? ClientId { get; set; } - public int? ClientId { get; set; } + [Column("Имя отправителя", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] + public string SenderName { get; set; } = string.Empty; - [DisplayName("Имя отправителя")] - public string SenderName { get; set; } = string.Empty; + [Column("Дата отправления", width: 100)] + public DateTime DateDelivery { get; set; } - [DisplayName("Дата отправления")] - public DateTime DateDelivery { get; set; } + [Column("Тема", width: 150)] + public string Subject { get; set; } = string.Empty; - [DisplayName("Тема")] - public string Subject { get; set; } = string.Empty; - - [DisplayName("Содержание")] - public string Body { get; set; } = string.Empty; - } + [Column("Содержание", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Body { get; set; } = string.Empty; + [Column(visible: false)] + public int Id => throw new NotImplementedException(); + } } diff --git a/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs b/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs index 4ef43de..453662b 100644 --- a/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Enums; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Enums; using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; @@ -11,27 +12,30 @@ namespace PrecastConcretePlantContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } - public int ClientId { get; set; } - [DisplayName("Клиент")] - public string ClientFIO { get; set; } = string.Empty; - public int? ImplementerId { get; set; } - [DisplayName("ФИО исполнителя")] - public string? ImplementerFIO { get; set; } = string.Empty; - public int ReinforcedId { get; set; } - [DisplayName("ЖБИ")] - public string ReinforcedName { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } - [DisplayName("Сумма")] - public double Sum { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } + [Column(visible: false)] + public int ClientId { get; set; } + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int? ImplementerId { get; set; } + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string? ImplementerFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int ReinforcedId { get; set; } + [Column("ЖБИ", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string ReinforcedName { get; set; } = string.Empty; + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } } } diff --git a/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs b/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs index e6489a5..0ccf47a 100644 --- a/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs +++ b/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs @@ -1,4 +1,5 @@  +using PrecastConcretePlantContracts.Attributes; using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; @@ -11,12 +12,14 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ReinforcedViewModel : IReinforcedModel { - public int Id { get; set; } - [DisplayName("Название ЖБИ")] - public string ReinforcedName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary ReinforcedComponents + [Column(visible: false)] + public int Id { get; set; } + [Column("Название ЖБИ", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ReinforcedName { get; set; } = string.Empty; + [Column("Цена", width: 100)] + public double Price { get; set; } + [Column(visible: false)] + public Dictionary ReinforcedComponents { get; set; diff --git a/PrecastConcretePlantDataBaseImplemet/DatabaseImplementationExtension.cs b/PrecastConcretePlantDataBaseImplemet/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..4bbb21a --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/DatabaseImplementationExtension.cs @@ -0,0 +1,28 @@ +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantDatabaseImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantDatabaseImplement +{ + public class DatabaseImplementationExtension : IImplementationExtension + { + public int Priority => 2; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Implements/BackUpInfo.cs b/PrecastConcretePlantDataBaseImplemet/Implements/BackUpInfo.cs new file mode 100644 index 0000000..f27dac7 --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/Implements/BackUpInfo.cs @@ -0,0 +1,34 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new PrecastConcretePlantDatabase(); + return context.Set().ToList(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + + return null; + } + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Implements/ClientStorage.cs b/PrecastConcretePlantDataBaseImplemet/Implements/ClientStorage.cs index 863b5e9..a3113e7 100644 --- a/PrecastConcretePlantDataBaseImplemet/Implements/ClientStorage.cs +++ b/PrecastConcretePlantDataBaseImplemet/Implements/ClientStorage.cs @@ -43,19 +43,15 @@ namespace PrecastConcretePlantDatabaseImplement.Implements public ClientViewModel? GetElement(ClientSearchModel model) { - using var context = new PrecastConcretePlantDatabase(); - if (model.Id.HasValue) - { - return context.Clients - .FirstOrDefault(x => (x.Id == model.Id))?.GetViewModel; - } - else if (!string.IsNullOrEmpty(model.Email) && !string.IsNullOrEmpty(model.Password)) - { - return context.Clients - .FirstOrDefault(x => (x.Email == model.Email && x.Password == model.Password))?.GetViewModel; - } - return new(); - } + using var context = new PrecastConcretePlantDatabase(); + if (model.Id.HasValue) + return context.Clients.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + if (!string.IsNullOrEmpty(model.Email) && !string.IsNullOrEmpty(model.Password)) + return context.Clients.FirstOrDefault(x => x.Email.Equals(model.Email) && x.Password.Equals(model.Password))?.GetViewModel; + if (!string.IsNullOrEmpty(model.Email)) + return context.Clients.FirstOrDefault(x => x.Email.Equals(model.Email))?.GetViewModel; + return null; + } public ClientViewModel? Insert(ClientBindingModel model) { diff --git a/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.Designer.cs b/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.Designer.cs new file mode 100644 index 0000000..02b9e35 --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.Designer.cs @@ -0,0 +1,301 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PrecastConcretePlantDatabaseImplement; + +#nullable disable + +namespace PrecastConcretePlantDatabaseImplement.Migrations +{ + [DbContext(typeof(PrecastConcretePlantDatabase))] + [Migration("20230517160304_AddMessage")] + partial class AddMessage + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Message", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .IsRequired() + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("ReinforcedId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("ImplementerId"); + + b.HasIndex("ReinforcedId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Reinforced", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("ReinforcedName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Reinforceds"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.ReinforcedComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("ReinforcedId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("ReinforcedId"); + + b.ToTable("ReinforcedComponents"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Message", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Order", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Reinforced", "Reinforced") + .WithMany("Orders") + .HasForeignKey("ReinforcedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + + b.Navigation("Reinforced"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.ReinforcedComponent", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Component", "Component") + .WithMany("ReinforcedComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Reinforced", "Reinforced") + .WithMany("Components") + .HasForeignKey("ReinforcedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Reinforced"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Client", b => + { + b.Navigation("Messages"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Component", b => + { + b.Navigation("ReinforcedComponents"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Reinforced", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.cs b/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.cs new file mode 100644 index 0000000..dd05d29 --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/Migrations/20230517160304_AddMessage.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PrecastConcretePlantDatabaseImplement.Migrations +{ + /// + public partial class AddMessage : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + MessageId = table.Column(type: "nvarchar(450)", nullable: false), + ClientId = table.Column(type: "int", nullable: false), + SenderName = table.Column(type: "nvarchar(max)", nullable: false), + DateDelivery = table.Column(type: "datetime2", nullable: false), + Subject = table.Column(type: "nvarchar(max)", nullable: false), + Body = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.MessageId); + table.ForeignKey( + name: "FK_Messages_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Messages_ClientId", + table: "Messages", + column: "ClientId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Messages"); + } + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.Designer.cs b/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.Designer.cs new file mode 100644 index 0000000..de8ec62 --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.Designer.cs @@ -0,0 +1,301 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PrecastConcretePlantDatabaseImplement; + +#nullable disable + +namespace PrecastConcretePlantDatabaseImplement.Migrations +{ + [DbContext(typeof(PrecastConcretePlantDatabase))] + [Migration("20230518101319_8lr")] + partial class _8lr + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Message", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .IsRequired() + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("ReinforcedId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("ImplementerId"); + + b.HasIndex("ReinforcedId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Reinforced", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("ReinforcedName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Reinforceds"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.ReinforcedComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("ReinforcedId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("ReinforcedId"); + + b.ToTable("ReinforcedComponents"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Message", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Order", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Reinforced", "Reinforced") + .WithMany("Orders") + .HasForeignKey("ReinforcedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + + b.Navigation("Reinforced"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.ReinforcedComponent", b => + { + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Component", "Component") + .WithMany("ReinforcedComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PrecastConcretePlantDatabaseImplement.Models.Reinforced", "Reinforced") + .WithMany("Components") + .HasForeignKey("ReinforcedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Reinforced"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Client", b => + { + b.Navigation("Messages"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Component", b => + { + b.Navigation("ReinforcedComponents"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("PrecastConcretePlantDatabaseImplement.Models.Reinforced", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.cs b/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.cs new file mode 100644 index 0000000..0f5bb07 --- /dev/null +++ b/PrecastConcretePlantDataBaseImplemet/Migrations/20230518101319_8lr.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PrecastConcretePlantDatabaseImplement.Migrations +{ + /// + public partial class _8lr : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Client.cs b/PrecastConcretePlantDataBaseImplemet/Models/Client.cs index a1e55c4..8580ca5 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Client.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Client.cs @@ -6,23 +6,29 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace PrecastConcretePlantDatabaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } [Required] - public string ClientFIO { get; set; } = string.Empty; + [DataMember] + public string ClientFIO { get; set; } = string.Empty; [Required] - public string Email { get; set; } = string.Empty; + [DataMember] + public string Email { get; set; } = string.Empty; [Required] - public string Password { get; set; } = string.Empty; + [DataMember] + public string Password { get; set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Component.cs b/PrecastConcretePlantDataBaseImplemet/Models/Component.cs index 449d63a..231d3c3 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Component.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Component.cs @@ -6,18 +6,23 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace PrecastConcretePlantDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public string ComponentName { get; private set; } = string.Empty; [Required] - public double Cost { get; set; } + [DataMember] + public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List ReinforcedComponents { get; set; } = new(); diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Implementer.cs b/PrecastConcretePlantDataBaseImplemet/Models/Implementer.cs index 0db20f3..e9f2495 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Implementer.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Implementer.cs @@ -8,24 +8,31 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace PrecastConcretePlantDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; [Required] - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; [Required] - public int WorkExperience { get; private set; } + [DataMember] + public int WorkExperience { get; private set; } [Required] - public int Qualification { get; private set; } + [DataMember] + public int Qualification { get; private set; } [ForeignKey("ImplementerId")] public virtual List Orders { get; set; } = new(); diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Message.cs b/PrecastConcretePlantDataBaseImplemet/Models/Message.cs index 44460cc..73d9d42 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Message.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Message.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -13,15 +14,21 @@ namespace PrecastConcretePlantDatabaseImplement.Models public class Message : IMessageInfoModel { [Key] + [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } [Required] + [DataMember] public string SenderName { get; private set; } = string.Empty; [Required] + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; [Required] + [DataMember] public string Subject { get; private set; } = string.Empty; [Required] + [DataMember] public string Body { get; private set; } = string.Empty; public virtual Client Client { get; set; } @@ -52,5 +59,7 @@ namespace PrecastConcretePlantDatabaseImplement.Models SenderName = SenderName, DateDelivery = DateDelivery, }; + + public int Id => throw new NotImplementedException(); } } diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Order.cs b/PrecastConcretePlantDataBaseImplemet/Models/Order.cs index 2ecc9a1..1729284 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Order.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Order.cs @@ -6,29 +6,40 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace PrecastConcretePlantDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public int ClientId { get; set; } + [DataMember] + public int ClientId { get; set; } [Required] - public int ReinforcedId { get; private set; } + [DataMember] + public int ReinforcedId { get; private set; } [Required] - public int Count { get; private set; } - public int? ImplementerId { get; set; } + [DataMember] + public int Count { get; private set; } + [DataMember] + public int? ImplementerId { get; set; } [Required] - public double Sum { get; private set; } + [DataMember] + public double Sum { get; private set; } [Required] - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; [Required] - public DateTime DateCreate { get; private set; } = DateTime.Now; - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] + public DateTime? DateImplement { get; private set; } public virtual Reinforced Reinforced { get; set; } public virtual Client Client { get; set; } public virtual Implementer? Implementer { get; set; } diff --git a/PrecastConcretePlantDataBaseImplemet/Models/Reinforced.cs b/PrecastConcretePlantDataBaseImplemet/Models/Reinforced.cs index 53f235d..8e43000 100644 --- a/PrecastConcretePlantDataBaseImplemet/Models/Reinforced.cs +++ b/PrecastConcretePlantDataBaseImplemet/Models/Reinforced.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -13,11 +14,14 @@ namespace PrecastConcretePlantDatabaseImplement.Models { public class Reinforced : IReinforcedModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } [Required] - public string ReinforcedName { get; set; } = string.Empty; + [DataMember] + public string ReinforcedName { get; set; } = string.Empty; [Required] - public double Price { get; set; } + [DataMember] + public double Price { get; set; } private Dictionary? _reinforcedComponents = null; [NotMapped] public Dictionary ReinforcedComponents diff --git a/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs b/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs index 19ff002..d8e5ed6 100644 --- a/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs +++ b/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace PrecastConcretePlantDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs b/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..2c60cb0 --- /dev/null +++ b/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantListImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + throw new NotImplementedException(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + throw new NotImplementedException(); + } + } +} diff --git a/PrecastConcretePlantListImplement/Implements/MessageInfoStorage.cs b/PrecastConcretePlantListImplement/Implements/MessageInfoStorage.cs index 923ea94..bcc377c 100644 --- a/PrecastConcretePlantListImplement/Implements/MessageInfoStorage.cs +++ b/PrecastConcretePlantListImplement/Implements/MessageInfoStorage.cs @@ -2,6 +2,7 @@ using PrecastConcretePlantContracts.SearchModels; using PrecastConcretePlantContracts.StoragesContracts; using PrecastConcretePlantContracts.ViewModels; +using PrecastConcretePlantFileImplement; using PrecastConcretePlantListImplement.Models; using System; using System.Collections.Generic; diff --git a/PrecastConcretePlantListImplement/Implements/OrderStorage.cs b/PrecastConcretePlantListImplement/Implements/OrderStorage.cs index 35b7859..2e0a462 100644 --- a/PrecastConcretePlantListImplement/Implements/OrderStorage.cs +++ b/PrecastConcretePlantListImplement/Implements/OrderStorage.cs @@ -115,29 +115,29 @@ namespace PrecastConcretePlantListImplement.Implements return result; } - private OrderViewModel GetViewModel(Order order) - { - var viewModel = order.GetViewModel; - foreach (var reinforced in _source.Reinforceds) - { - if (reinforced.Id == order.ReinforcedId) - { - viewModel.ReinforcedName = reinforced.ReinforcedName; - break; - } - } - foreach (var client in _source.Clients) - { - if (client.Id == order.ClientId) - { - viewModel.ClientFIO = client.ClientFIO; - break; - } - } - return viewModel; - } + private OrderViewModel GetViewModel(Order order) + { + var viewModel = order.GetViewModel; + foreach (var reinforced in _source.Reinforceds) + { + if (reinforced.Id == order.ReinforcedId) + { + viewModel.ReinforcedName = reinforced.ReinforcedName; + break; + } + } + foreach (var client in _source.Clients) + { + if (client.Id == order.ClientId) + { + viewModel.ClientFIO = client.ClientFIO; + break; + } + } + return viewModel; + } - public List GetFullList() + public List GetFullList() { var result = new List(); diff --git a/PrecastConcretePlantListImplement/ListImplementationExtension.cs b/PrecastConcretePlantListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..092d178 --- /dev/null +++ b/PrecastConcretePlantListImplement/ListImplementationExtension.cs @@ -0,0 +1,23 @@ +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantListImplement.Implements; + +namespace PrecastConcretePlantListImplement +{ + public class ListImplementationExtension : IImplementationExtension + { + public int Priority => 0; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + + } +} diff --git a/PrecastConcretePlantListImplement/Models/Message.cs b/PrecastConcretePlantListImplement/Models/Message.cs index 9dcbacc..c3fa3a4 100644 --- a/PrecastConcretePlantListImplement/Models/Message.cs +++ b/PrecastConcretePlantListImplement/Models/Message.cs @@ -50,5 +50,7 @@ namespace PrecastConcretePlantListImplement.Models ClientId = ClientId, MessageId = MessageId }; + + public int Id => throw new NotImplementedException(); } } -- 2.25.1