From d0a85724da554e2397f1bc1c721f6ffd34549c68 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Thu, 18 Apr 2024 18:48:25 +0400 Subject: [PATCH 1/6] add implementer in FlowerShopContracts --- .../BindingModels/ImplementerBindingModel.cs | 13 +++++ .../BindingModels/OrderBindingModel.cs | 3 +- .../IImplementerLogic.cs | 15 ++++++ .../SearchModels/ImplementerSearchModel.cs | 8 +++ .../SearchModels/OrderSearchModel.cs | 6 ++- .../StoragesContracts/IImplementerStorage.cs | 16 ++++++ .../ViewModels/ImplementerViewModel.cs | 18 +++++++ .../ViewModels/OrderViewModel.cs | 7 ++- .../Models/IImplementerModel.cs | 11 +++++ .../Models/IOrderModel.cs | 1 + .../DataListSingleton.cs | 2 + .../Implements/OrderStorage.cs | 21 +++++++- .../Models/Implementer.cs | 49 +++++++++++++++++++ .../FlowerShopListImplement/Models/Order.cs | 4 ++ 14 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs create mode 100644 FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs create mode 100644 FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs create mode 100644 FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs create mode 100644 FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs create mode 100644 FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs create mode 100644 FlowerShop/FlowerShopListImplement/Models/Implementer.cs diff --git a/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs b/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..b5ab22c --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,13 @@ +using FlowerShopDataModels.Models; + +namespace FlowerShopContracts.BindingModels +{ + public class ImplementerBindingModel : IImplementerModel + { + public int Id { get; set; } + public string ImplementerFIO { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public int WorkExperience { get; set; } + public int Qualification { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs index 6888013..83ced06 100644 --- a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs +++ b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs @@ -8,7 +8,8 @@ namespace FlowerShopContracts.BindingModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } - public int Count { get; set; } + public int ImplementerId { get; set; } = 0; + public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; public DateTime DateCreate { get; set; } = DateTime.Now; diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..fe3b9ba --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,15 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; + +namespace FlowerShopContracts.BusinessLogicsContracts +{ + public interface IImplementerLogic + { + List? ReadList(ImplementerSearchModel? model); + ImplementerViewModel? ReadElement(ImplementerSearchModel model); + bool Create(ImplementerBindingModel model); + bool Update(ImplementerBindingModel model); + bool Delete(ImplementerBindingModel model); + } +} diff --git a/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..4c14254 --- /dev/null +++ b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,8 @@ +namespace FlowerShopContracts.SearchModels +{ + public class ImplementerSearchModel + { + public int? Id { get; set; } + public string? ImplementerFIO { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs index b4a01e5..49b04da 100644 --- a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs +++ b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs @@ -1,10 +1,14 @@ -namespace FlowerShopContracts.SearchModels +using FlowerShopDataModels.Enums; + +namespace FlowerShopContracts.SearchModels { public class OrderSearchModel { public int? Id { get; set; } public int? ClientId { get; set; } + public int? ImplementerId { get; set; } public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } + public OrderStatus Status { get; set; } } } diff --git a/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs b/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..23f4e4a --- /dev/null +++ b/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,16 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; + +namespace FlowerShopContracts.StoragesContracts +{ + public interface IImplementerStorage + { + List GetFullList(); + List GetFilteredList(ImplementerSearchModel model); + ImplementerViewModel? GetElement(ImplementerSearchModel model); + ImplementerViewModel? Insert(ImplementerBindingModel model); + ImplementerViewModel? Update(ImplementerBindingModel model); + ImplementerViewModel? Delete(ImplementerBindingModel model); + } +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..c798605 --- /dev/null +++ b/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,18 @@ +using FlowerShopDataModels.Models; +using System.ComponentModel; + +namespace FlowerShopContracts.ViewModels +{ + public class ImplementerViewModel : IImplementerModel + { + public int Id { get; set; } + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; } = string.Empty; + [DisplayName("Пароль")] + public string Password { get; set; } = string.Empty; + [DisplayName("Опыт исполнителя")] + public int WorkExperience { get; set; } + [DisplayName("Квалификация исполнителя")] + public int Qualification { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs index a70d495..9fd1640 100644 --- a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs +++ b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs @@ -10,12 +10,15 @@ namespace FlowerShopContracts.ViewModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } + public int ImplementerId { get; set; } = 0; [DisplayName("Изделие")] public string FlowerName { get; set; } = string.Empty; [DisplayName("ФИО клиента")] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; }=string.Empty; + [DisplayName("Количество")] + public int Count { get; set; } [DisplayName("Сумма")] public double Sum { get; set; } [DisplayName("Статус")] diff --git a/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs b/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..dc0a61c --- /dev/null +++ b/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs @@ -0,0 +1,11 @@ +namespace FlowerShopDataModels.Models +{ + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + string Password { get; } + int WorkExperience { get; } + int Qualification { get; } + } + +} diff --git a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs index aa308a9..35fc0f6 100644 --- a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs +++ b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs @@ -6,6 +6,7 @@ namespace FlowerShopDataModels.Models { int FlowerId { get; } int ClientId { get; } + int ImplementerId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/FlowerShop/FlowerShopListImplement/DataListSingleton.cs b/FlowerShop/FlowerShopListImplement/DataListSingleton.cs index 4537e21..a1a6cb6 100644 --- a/FlowerShop/FlowerShopListImplement/DataListSingleton.cs +++ b/FlowerShop/FlowerShopListImplement/DataListSingleton.cs @@ -9,12 +9,14 @@ namespace FlowerShopListImplement public List Orders { get; set; } public List Flowers { get; set; } public List Clients { get; set; } + public List Implementers { get; set; } private DataListSingleton() { Components = new List(); Orders = new List(); Flowers = new List(); Clients = new List(); + Implementers = new List(); } public static DataListSingleton GetInstance() { diff --git a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs index 7e1abb6..f6d0d0a 100644 --- a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs @@ -40,6 +40,17 @@ namespace FlowerShopListImplement.Implements } return result; } + else if (model.ImplementerId.HasValue) + { + foreach (var order in _source.Orders) + { + if (order.Id == model.Id && order.ImplementerId == model.ImplementerId) + { + result.Add(AttachNames(order.GetViewModel)); + } + } + return result; + } foreach (var order in _source.Orders) { if (order.Id == model.Id && order.DateCreate >= model.DateFrom && order.DateCreate <= model.DateTo) @@ -125,7 +136,15 @@ namespace FlowerShopListImplement.Implements return model; } } - return model; + foreach (var implementer in _source.Implementers) + { + if (implementer.Id == model.ImplementerId) + { + model.ImplementerFIO = implementer.ImplementerFIO; + return model; + } + } + return model; } } } diff --git a/FlowerShop/FlowerShopListImplement/Models/Implementer.cs b/FlowerShop/FlowerShopListImplement/Models/Implementer.cs new file mode 100644 index 0000000..25e8d9c --- /dev/null +++ b/FlowerShop/FlowerShopListImplement/Models/Implementer.cs @@ -0,0 +1,49 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; + +namespace FlowerShopListImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + public string ImplementerFIO { get; private set; } + public string Password { get; private set; } + public int WorkExperience { get; private set; } + public int Qualification { get; private set; } + public static Implementer? Create(ImplementerBindingModel? model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Password = model.Password, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + }; + } + public void Update(ImplementerBindingModel? model) + { + if (model == null) + { + return; + } + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + }; + } +} diff --git a/FlowerShop/FlowerShopListImplement/Models/Order.cs b/FlowerShop/FlowerShopListImplement/Models/Order.cs index cff9cf2..9c26708 100644 --- a/FlowerShop/FlowerShopListImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopListImplement/Models/Order.cs @@ -10,6 +10,7 @@ namespace FlowerShopListImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } + public int ImplementerId { get; private set; } public int Count { get; set; } public double Sum { get; private set; } public OrderStatus Status { get; set; } @@ -26,6 +27,7 @@ namespace FlowerShopListImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -42,6 +44,7 @@ namespace FlowerShopListImplement.Models Id = model.Id; FlowerId = model.FlowerId; ClientId = model.ClientId; + ImplementerId = model.ImplementerId; Count = model.Count; Sum = model.Sum; Status = model.Status; @@ -53,6 +56,7 @@ namespace FlowerShopListImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, From d74d872e8ac44e4d0b6373b2caa22b3f049ff591 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Thu, 18 Apr 2024 20:14:21 +0400 Subject: [PATCH 2/6] add FileImplement and DatabaseImplement --- .../SearchModels/ImplementerSearchModel.cs | 1 + .../SearchModels/OrderSearchModel.cs | 2 +- .../FlowerShopDatabase.cs | 1 + .../Implements/ImplementerStorage.cs | 90 +++++++++++++++ .../Implements/OrderStorage.cs | 4 +- .../Models/Implementer.cs | 56 ++++++++++ .../Models/Order.cs | 1 + .../DataFileSingleton.cs | 4 + .../Implements/ImplementerStorage.cs | 97 ++++++++++++++++ .../Implements/OrderStorage.cs | 8 +- .../Models/Implementer.cs | 70 ++++++++++++ .../FlowerShopFileImplement/Models/Order.cs | 8 +- .../Implements/ImplementerStorage.cs | 104 ++++++++++++++++++ .../Implements/OrderStorage.cs | 8 +- 14 files changed, 447 insertions(+), 7 deletions(-) create mode 100644 FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs create mode 100644 FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs create mode 100644 FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs create mode 100644 FlowerShop/FlowerShopFileImplement/Models/Implementer.cs create mode 100644 FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs diff --git a/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs index 4c14254..785eed1 100644 --- a/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs +++ b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs @@ -4,5 +4,6 @@ { public int? Id { get; set; } public string? ImplementerFIO { get; set; } + public string? Password { get; set; } } } diff --git a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs index 49b04da..e9651d2 100644 --- a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs +++ b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs @@ -9,6 +9,6 @@ namespace FlowerShopContracts.SearchModels public int? ImplementerId { get; set; } public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } - public OrderStatus Status { get; set; } + public OrderStatus? Status { get; set; } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs index 08f100f..733f6a0 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs @@ -20,5 +20,6 @@ namespace FlowerShopDatabaseImplement public virtual DbSet FlowerComponents { set; get; } public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } + public virtual DbSet Implementers { set; get; } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..75e5cc4 --- /dev/null +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,90 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopDatabaseImplement.Models; + +namespace FlowerShopDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public List GetFullList() + { + using var Context = new FlowerShopDatabase(); + + return Context.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + return new(); + } + using var Context = new FlowerShopDatabase(); + return Context.Implementers.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)).Select(x => x.GetViewModel).ToList(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return null; + } + + using var Context = new FlowerShopDatabase(); + + return Context.Implementers.FirstOrDefault(x => + (!string.IsNullOrEmpty(model.ImplementerFIO) && x.ImplementerFIO == model.ImplementerFIO && (!string.IsNullOrEmpty(model.Password) ? x.Password == model.Password : true)) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + var NewImplementer = Implementer.Create(model); + if (NewImplementer == null) + { + return null; + } + using var Context = new FlowerShopDatabase(); + + Context.Implementers.Add(NewImplementer); + Context.SaveChanges(); + + return NewImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var Context = new FlowerShopDatabase(); + + var Implementer = Context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Implementer == null) + { + return null; + } + + Implementer.Update(model); + Context.SaveChanges(); + + return Implementer.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var Context = new FlowerShopDatabase(); + + var Implementer = Context.Implementers.FirstOrDefault(rec => rec.Id == model.Id); + if (Implementer == null) + { + return null; + } + + Context.Implementers.Remove(Implementer); + Context.SaveChanges(); + + return Implementer.GetViewModel; + } + } +} diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs index b6c2941..a07dde6 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs @@ -29,7 +29,9 @@ namespace FlowerShopDatabaseImplement.Implements .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); return context.Orders .Where(x => (model.Id.HasValue && x.Id == model.Id) - || (model.ClientId.HasValue && x.ClientId == model.ClientId)) + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId) + || (model.Status.HasValue && x.Status == model.Status)) .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); } public OrderViewModel? GetElement(OrderSearchModel model) diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..98d68f1 --- /dev/null +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,56 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using FlowerShopDataModels.Models; + +namespace FlowerShopDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; set; } + [Required] + public string ImplementerFIO { get; set; } = string.Empty; + [Required] + public string Password { get; set; } = string.Empty; + [Required] + public int WorkExperience { get; set; } + [Required] + public int Qualification { get; set; } + [ForeignKey("ImplementerId")] + public virtual List Order { get; set; } = new(); + public static Implementer? Create(ImplementerBindingModel? Model) + { + if (Model == null) + return null; + + return new Implementer() + { + Id = Model.Id, + ImplementerFIO = Model.ImplementerFIO, + Password = Model.Password, + WorkExperience = Model.WorkExperience, + Qualification = Model.Qualification + }; + } + public void Update(ImplementerBindingModel Model) + { + if (Model == null) + { + return; + } + ImplementerFIO = Model.ImplementerFIO; + Password = Model.Password; + WorkExperience = Model.WorkExperience; + Qualification = Model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification + }; + } +} diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs index 7145d3d..f2bdb9b 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs @@ -11,6 +11,7 @@ namespace FlowerShopDatabaseImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } + public int ImplementerId { get; private set; } [Required] public int Count { get; set; } [Required] diff --git a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs index 42e8fe4..af08faf 100644 --- a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs +++ b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs @@ -10,10 +10,12 @@ namespace FlowerShopFileImplement private readonly string OrderFileName = "Order.xml"; private readonly string FlowerFileName = "Flower.xml"; private readonly string ClientFileName = "Client.xml"; + private readonly string ImplementerFileName = "Implementer.xml" public List Components { get; private set; } public List Orders { get; private set; } public List Flowers { get; private set; } public List Clients { get; private set; } + public List Implementers { get; private set; } public static DataFileSingleton GetInstance() { if (instance == null) @@ -26,12 +28,14 @@ namespace FlowerShopFileImplement public void SaveFlowers() => SaveData(Flowers, FlowerFileName, "Flowers", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); + public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; Flowers = LoadData(FlowerFileName, "Flower", x => Flower.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; + Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!); } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..02ff35c --- /dev/null +++ b/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,97 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopFileImplement.Models; + +namespace FlowerShopFileImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataFileSingleton _source; + + public ImplementerStorage() + { + _source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return _source.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ImplementerSearchModel Model) + { + if (Model == null) + return new(); + + if (Model.Id.HasValue) + { + var Res = GetElement(Model); + return Res != null ? new() { Res } : new(); + } + + if (Model.ImplementerFIO != null) + { + return _source.Implementers + .Where(x => x.ImplementerFIO.Equals(Model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + + return new(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (model.Id.HasValue) + return _source.Implementers.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + + if (model.ImplementerFIO != null && model.Password != null) + return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO) && x.Password.Equals(model.Password))?.GetViewModel; + + if (model.ImplementerFIO != null) + return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO))?.GetViewModel; + + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + model.Id = _source.Implementers.Count > 0 ? _source.Implementers.Max(x => x.Id) + 1 : 1; + + var Res = Implementer.Create(model); + if (Res != null) + { + _source.Implementers.Add(Res); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + var Res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Res != null) + { + Res.Update(model); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + var Res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Res != null) + { + _source.Implementers.Remove(Res); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + } +} diff --git a/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs index ff602a5..23ac5dc 100644 --- a/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs @@ -22,12 +22,16 @@ namespace FlowerShopFileImplement.Implements if (model.DateFrom.HasValue) { return source.Orders - .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + && (!model.ClientId.HasValue || x.ClientId == model.ClientId) + && (!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId)) .Select(GetViewModel) .ToList(); } return source.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ClientId.HasValue && x.ClientId == model.ClientId)) + .Where(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId)) .Select(GetViewModel) .ToList(); } diff --git a/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs new file mode 100644 index 0000000..290e43a --- /dev/null +++ b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs @@ -0,0 +1,70 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; +using System.Xml.Linq; + +namespace FlowerShopFileImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + 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 static Implementer? Create(ImplementerBindingModel Model) + { + if (Model == null) + return null; + + return new() + { + Id = Model.Id, + ImplementerFIO = Model.ImplementerFIO, + Password = Model.Password, + WorkExperience = Model.WorkExperience, + Qualification = Model.Qualification, + }; + } + public static Implementer? Create(XElement Element) + { + if (Element == null) + return null; + + return new() + { + Id = Convert.ToInt32(Element.Attribute("Id")!.Value), + ImplementerFIO = Element.Element("ImplementerFIO")!.Value, + Password = Element.Element("Password")!.Value, + WorkExperience = Convert.ToInt32(Element.Element("WorkExperience")!.Value), + Qualification = Convert.ToInt32(Element.Element("Qualification")!.Value), + }; + } + public void Update(ImplementerBindingModel Model) + { + if (Model == null) + return; + + ImplementerFIO = Model.ImplementerFIO; + Password = Model.Password; + WorkExperience = Model.WorkExperience; + Qualification = Model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + }; + public XElement GetXElement => new( + "Implementer", + new XAttribute("Id", Id), + new XElement("ImplementerFIO", ImplementerFIO), + new XElement("Password", Password), + new XElement("WorkExperience", WorkExperience), + new XElement("Qualification", Qualification) + ); + } +} diff --git a/FlowerShop/FlowerShopFileImplement/Models/Order.cs b/FlowerShop/FlowerShopFileImplement/Models/Order.cs index 3661227..9812a33 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Order.cs @@ -11,6 +11,7 @@ namespace FlowerShopFileImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } + public int ImplementerId { get; private set; } public int Count { get; private set; } public double Sum { get; set; } public OrderStatus Status { get; set; } @@ -27,6 +28,7 @@ namespace FlowerShopFileImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -45,6 +47,7 @@ namespace FlowerShopFileImplement.Models Id = Convert.ToInt32(element.Attribute("Id")!.Value), FlowerId = Convert.ToInt32(element.Element("FlowerId")!.Value), ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), + ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.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), @@ -61,6 +64,7 @@ namespace FlowerShopFileImplement.Models Id = model.Id; FlowerId = model.FlowerId; ClientId = model.ClientId; + ImplementerId = model.ImplementerId; Count = model.Count; Sum = model.Sum; Status = model.Status; @@ -72,6 +76,7 @@ namespace FlowerShopFileImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, @@ -83,7 +88,8 @@ namespace FlowerShopFileImplement.Models new XAttribute("Id", Id), new XElement("FlowerId", FlowerId.ToString()), new XElement("ClientId", ClientId.ToString()), - new XElement("Count", Count.ToString()), + new XElement("ImplementerId", ImplementerId.ToString()), + new XElement("Count", Count.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), new XElement("DateCreate", DateCreate.ToString()), diff --git a/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..9ef72c3 --- /dev/null +++ b/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,104 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopListImplement.Models; + +namespace FlowerShopListImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataListSingleton _source; + + public ImplementerStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var Result = new List(); + + foreach (var Implementer in _source.Implementers) + { + Result.Add(Implementer.GetViewModel); + } + + return Result; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO)) + return new(); + + return _source.Implementers + .Where(x => (!string.IsNullOrEmpty(model.ImplementerFIO) && x.ImplementerFIO.Contains(model.ImplementerFIO))) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + foreach (var Implementer in _source.Implementers) + { + if ((model.Id.HasValue && Implementer.Id == model.Id) || + (!string.IsNullOrEmpty(model.ImplementerFIO) && Implementer.ImplementerFIO == model.ImplementerFIO)) + { + return Implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + model.Id = 1; + foreach (var Implementer in _source.Implementers) + { + if (model.Id <= Implementer.Id) + { + model.Id = Implementer.Id + 1; + } + } + + var NewImplementer = Implementer.Create(model); + if (NewImplementer == null) + return null; + + _source.Implementers.Add(NewImplementer); + return NewImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + foreach (var Implementer in _source.Implementers) + { + if (Implementer.Id == model.Id) + { + Implementer.Update(model); + return Implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + for (int i = 0; i < _source.Implementers.Count; ++i) + { + if (_source.Implementers[i].Id == model.Id) + { + var Implementer = _source.Implementers[i]; + _source.Implementers.RemoveAt(i); + + return Implementer.GetViewModel; + } + } + + return null; + } + } +} diff --git a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs index 86bbf74..7a0f2e9 100644 --- a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs @@ -28,12 +28,16 @@ namespace FlowerShopListImplement.Implements if (model.DateFrom.HasValue) { return _source.Orders - .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + && (!model.ClientId.HasValue || x.ClientId == model.ClientId) + && (!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId)) .Select(x => AttachNames(x.GetViewModel)) .ToList(); } return _source.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ClientId.HasValue && x.ClientId == model.ClientId)) + .Where(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId)) .Select(x => AttachNames(x.GetViewModel)) .ToList(); } From 1726a3c9d7164c6e61e41ac4df6e5184aa4abf37 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Thu, 18 Apr 2024 22:03:18 +0400 Subject: [PATCH 3/6] add forms, logic interfaces and implements, controller fix storage implements, contracts full lab6 --- .../FlowerShop/FormImplementer.Designer.cs | 172 ++++++++++++++++++ FlowerShop/FlowerShop/FormImplementer.cs | 105 +++++++++++ FlowerShop/FlowerShop/FormImplementer.resx | 120 ++++++++++++ .../FlowerShop/FormImplementers.Designer.cs | 135 ++++++++++++++ FlowerShop/FlowerShop/FormImplementers.cs | 111 +++++++++++ FlowerShop/FlowerShop/FormImplementers.resx | 120 ++++++++++++ FlowerShop/FlowerShop/FormMain.Designer.cs | 66 +++---- FlowerShop/FlowerShop/FormMain.cs | 23 ++- FlowerShop/FlowerShop/Program.cs | 5 + .../BusinessLogics/ImplementerLogic.cs | 128 +++++++++++++ .../BusinessLogics/OrderLogic.cs | 36 +++- .../BusinessLogics/WorkModeling.cs | 120 ++++++++++++ .../BindingModels/OrderBindingModel.cs | 2 +- .../BusinessLogicsContracts/IOrderLogic.cs | 1 + .../BusinessLogicsContracts/IWorkProcess.cs | 8 + .../ViewModels/OrderViewModel.cs | 2 +- .../Models/IOrderModel.cs | 2 +- .../FlowerShopDatabaseImplement.csproj | 4 - .../Implements/OrderStorage.cs | 4 - ... => 20240418172148_InitCreate.Designer.cs} | 45 ++++- ...create.cs => 20240418172148_InitCreate.cs} | 32 +++- .../FlowerShopDatabaseModelSnapshot.cs | 41 +++++ .../Models/Order.cs | 5 +- .../DataFileSingleton.cs | 4 +- .../FlowerShopFileImplement/Models/Order.cs | 2 +- .../FlowerShopListImplement/Models/Order.cs | 2 +- .../Controllers/ImplementerController.cs | 100 ++++++++++ 27 files changed, 1333 insertions(+), 62 deletions(-) create mode 100644 FlowerShop/FlowerShop/FormImplementer.Designer.cs create mode 100644 FlowerShop/FlowerShop/FormImplementer.cs create mode 100644 FlowerShop/FlowerShop/FormImplementer.resx create mode 100644 FlowerShop/FlowerShop/FormImplementers.Designer.cs create mode 100644 FlowerShop/FlowerShop/FormImplementers.cs create mode 100644 FlowerShop/FlowerShop/FormImplementers.resx create mode 100644 FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs create mode 100644 FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs create mode 100644 FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs rename FlowerShop/FlowerShopDatabaseImplement/Migrations/{20240404125520_initcreate.Designer.cs => 20240418172148_InitCreate.Designer.cs} (81%) rename FlowerShop/FlowerShopDatabaseImplement/Migrations/{20240404125520_initcreate.cs => 20240418172148_InitCreate.cs} (80%) create mode 100644 FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs diff --git a/FlowerShop/FlowerShop/FormImplementer.Designer.cs b/FlowerShop/FlowerShop/FormImplementer.Designer.cs new file mode 100644 index 0000000..b5e4521 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.Designer.cs @@ -0,0 +1,172 @@ +namespace FlowerShopView +{ + partial class FormImplementer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + FioTextBox = new TextBox(); + FioLabel = new Label(); + PasswordTextBox = new TextBox(); + PasswordLabel = new Label(); + WorkExperienceLabel = new Label(); + WorkExperienceNumericUpDown = new NumericUpDown(); + QualificationNumericUpDown = new NumericUpDown(); + QualificationLabel = new Label(); + CancelButton = new Button(); + SaveButton = new Button(); + ((System.ComponentModel.ISupportInitialize)WorkExperienceNumericUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)QualificationNumericUpDown).BeginInit(); + SuspendLayout(); + // + // FioTextBox + // + FioTextBox.Location = new Point(137, 9); + FioTextBox.Margin = new Padding(3, 2, 3, 2); + FioTextBox.Name = "FioTextBox"; + FioTextBox.Size = new Size(335, 23); + FioTextBox.TabIndex = 3; + // + // FioLabel + // + FioLabel.AutoSize = true; + FioLabel.Location = new Point(10, 12); + FioLabel.Name = "FioLabel"; + FioLabel.Size = new Size(112, 15); + FioLabel.TabIndex = 2; + FioLabel.Text = "ФИО исполнителя:"; + // + // PasswordTextBox + // + PasswordTextBox.Location = new Point(137, 40); + PasswordTextBox.Margin = new Padding(3, 2, 3, 2); + PasswordTextBox.Name = "PasswordTextBox"; + PasswordTextBox.Size = new Size(335, 23); + PasswordTextBox.TabIndex = 5; + // + // PasswordLabel + // + PasswordLabel.AutoSize = true; + PasswordLabel.Location = new Point(10, 43); + PasswordLabel.Name = "PasswordLabel"; + PasswordLabel.Size = new Size(52, 15); + PasswordLabel.TabIndex = 4; + PasswordLabel.Text = "Пароль:"; + // + // WorkExperienceLabel + // + WorkExperienceLabel.AutoSize = true; + WorkExperienceLabel.Location = new Point(10, 75); + WorkExperienceLabel.Name = "WorkExperienceLabel"; + WorkExperienceLabel.Size = new Size(84, 15); + WorkExperienceLabel.TabIndex = 6; + WorkExperienceLabel.Text = "Опыт работы:"; + // + // WorkExperienceNumericUpDown + // + WorkExperienceNumericUpDown.Location = new Point(137, 73); + WorkExperienceNumericUpDown.Margin = new Padding(3, 2, 3, 2); + WorkExperienceNumericUpDown.Name = "WorkExperienceNumericUpDown"; + WorkExperienceNumericUpDown.Size = new Size(108, 23); + WorkExperienceNumericUpDown.TabIndex = 8; + // + // QualificationNumericUpDown + // + QualificationNumericUpDown.Location = new Point(137, 106); + QualificationNumericUpDown.Margin = new Padding(3, 2, 3, 2); + QualificationNumericUpDown.Name = "QualificationNumericUpDown"; + QualificationNumericUpDown.Size = new Size(108, 23); + QualificationNumericUpDown.TabIndex = 10; + // + // QualificationLabel + // + QualificationLabel.AutoSize = true; + QualificationLabel.Location = new Point(10, 108); + QualificationLabel.Name = "QualificationLabel"; + QualificationLabel.Size = new Size(91, 15); + QualificationLabel.TabIndex = 9; + QualificationLabel.Text = "Квалификация:"; + // + // CancelButton + // + CancelButton.Location = new Point(353, 142); + CancelButton.Margin = new Padding(3, 2, 3, 2); + CancelButton.Name = "CancelButton"; + CancelButton.Size = new Size(119, 30); + CancelButton.TabIndex = 12; + CancelButton.Text = "Отмена"; + CancelButton.UseVisualStyleBackColor = true; + CancelButton.Click += CancelButton_Click; + // + // SaveButton + // + SaveButton.Location = new Point(233, 142); + SaveButton.Margin = new Padding(3, 2, 3, 2); + SaveButton.Name = "SaveButton"; + SaveButton.Size = new Size(114, 30); + SaveButton.TabIndex = 11; + SaveButton.Text = "Сохранить"; + SaveButton.UseVisualStyleBackColor = true; + SaveButton.Click += SaveButton_Click; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(482, 183); + Controls.Add(CancelButton); + Controls.Add(SaveButton); + Controls.Add(QualificationNumericUpDown); + Controls.Add(QualificationLabel); + Controls.Add(WorkExperienceNumericUpDown); + Controls.Add(WorkExperienceLabel); + Controls.Add(PasswordTextBox); + Controls.Add(PasswordLabel); + Controls.Add(FioTextBox); + Controls.Add(FioLabel); + Margin = new Padding(3, 2, 3, 2); + Name = "FormImplementer"; + Text = "Исполнитель"; + Load += FormImplementer_Load; + ((System.ComponentModel.ISupportInitialize)WorkExperienceNumericUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)QualificationNumericUpDown).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox FioTextBox; + private Label FioLabel; + private TextBox PasswordTextBox; + private Label PasswordLabel; + private Label WorkExperienceLabel; + private NumericUpDown WorkExperienceNumericUpDown; + private NumericUpDown QualificationNumericUpDown; + private Label QualificationLabel; + private Button CancelButton; + private Button SaveButton; + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormImplementer.cs b/FlowerShop/FlowerShop/FormImplementer.cs new file mode 100644 index 0000000..1376e46 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.cs @@ -0,0 +1,105 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using Microsoft.Extensions.Logging; + +namespace FlowerShopView +{ + public partial class FormImplementer : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _logic; + + private int? _id; + + public int Id { set { _id = value; } } + + public FormImplementer(ILogger Logger, IImplementerLogic Logic) + { + InitializeComponent(); + + _logger = Logger; + _logic = Logic; + } + + private void FormImplementer_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + try + { + _logger.LogInformation("Получение исполнителя"); + + var View = _logic.ReadElement(new ImplementerSearchModel + { + Id = _id.Value + }); + + if (View != null) + { + FioTextBox.Text = View.ImplementerFIO; + PasswordTextBox.Text = View.Password; + WorkExperienceNumericUpDown.Value = View.WorkExperience; + QualificationNumericUpDown.Value = View.Qualification; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void SaveButton_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(FioTextBox.Text)) + { + MessageBox.Show("Заполните ФИО", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (string.IsNullOrEmpty(PasswordTextBox.Text)) + { + MessageBox.Show("Заполните пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + _logger.LogInformation("Сохранение исполнителя"); + + try + { + var Model = new ImplementerBindingModel + { + Id = _id ?? 0, + ImplementerFIO = FioTextBox.Text, + Password = PasswordTextBox.Text, + WorkExperience = (int)WorkExperienceNumericUpDown.Value, + Qualification = (int)QualificationNumericUpDown.Value + }; + + var OperationResult = _id.HasValue ? _logic.Update(Model) : _logic.Create(Model); + if (!OperationResult) + { + throw new Exception("Ошибка при создании или обновлении. Дополнительная информация в логах."); + } + + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void CancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/FlowerShop/FlowerShop/FormImplementer.resx b/FlowerShop/FlowerShop/FormImplementer.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormImplementers.Designer.cs b/FlowerShop/FlowerShop/FormImplementers.Designer.cs new file mode 100644 index 0000000..d86d181 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.Designer.cs @@ -0,0 +1,135 @@ +namespace FlowerShopView +{ + partial class FormImplementers + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + ToolsPanel = new Panel(); + RefreshButton = new Button(); + DeleteButton = new Button(); + UpdateButton = new Button(); + AddButton = new Button(); + DataGridView = new DataGridView(); + ToolsPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); + SuspendLayout(); + // + // ToolsPanel + // + ToolsPanel.Controls.Add(RefreshButton); + ToolsPanel.Controls.Add(DeleteButton); + ToolsPanel.Controls.Add(UpdateButton); + ToolsPanel.Controls.Add(AddButton); + ToolsPanel.Location = new Point(532, 9); + ToolsPanel.Margin = new Padding(3, 2, 3, 2); + ToolsPanel.Name = "ToolsPanel"; + ToolsPanel.Size = new Size(116, 320); + ToolsPanel.TabIndex = 3; + // + // RefreshButton + // + RefreshButton.Location = new Point(3, 126); + RefreshButton.Margin = new Padding(3, 2, 3, 2); + RefreshButton.Name = "RefreshButton"; + RefreshButton.Size = new Size(110, 27); + RefreshButton.TabIndex = 3; + RefreshButton.Text = "Обновить"; + RefreshButton.UseVisualStyleBackColor = true; + RefreshButton.Click += RefreshButton_Click; + // + // DeleteButton + // + DeleteButton.Location = new Point(3, 84); + DeleteButton.Margin = new Padding(3, 2, 3, 2); + DeleteButton.Name = "DeleteButton"; + DeleteButton.Size = new Size(110, 27); + DeleteButton.TabIndex = 2; + DeleteButton.Text = "Удалить"; + DeleteButton.UseVisualStyleBackColor = true; + DeleteButton.Click += DeleteButton_Click; + // + // UpdateButton + // + UpdateButton.Location = new Point(3, 42); + UpdateButton.Margin = new Padding(3, 2, 3, 2); + UpdateButton.Name = "UpdateButton"; + UpdateButton.Size = new Size(110, 27); + UpdateButton.TabIndex = 1; + UpdateButton.Text = "Изменить"; + UpdateButton.UseVisualStyleBackColor = true; + UpdateButton.Click += UpdateButton_Click; + // + // AddButton + // + AddButton.Location = new Point(3, 2); + AddButton.Margin = new Padding(3, 2, 3, 2); + AddButton.Name = "AddButton"; + AddButton.Size = new Size(110, 27); + AddButton.TabIndex = 0; + AddButton.Text = "Добавить"; + AddButton.UseVisualStyleBackColor = true; + AddButton.Click += AddButton_Click; + // + // DataGridView + // + DataGridView.AllowUserToAddRows = false; + DataGridView.AllowUserToDeleteRows = false; + DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DataGridView.Location = new Point(10, 9); + DataGridView.Margin = new Padding(3, 2, 3, 2); + DataGridView.Name = "DataGridView"; + DataGridView.ReadOnly = true; + DataGridView.RowHeadersWidth = 51; + DataGridView.RowTemplate.Height = 29; + DataGridView.Size = new Size(516, 320); + DataGridView.TabIndex = 2; + // + // FormImplementers + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(653, 338); + Controls.Add(ToolsPanel); + Controls.Add(DataGridView); + Margin = new Padding(3, 2, 3, 2); + Name = "FormImplementers"; + Text = "Исполнители"; + Load += FormImplementers_Load; + ToolsPanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel ToolsPanel; + private Button RefreshButton; + private Button DeleteButton; + private Button UpdateButton; + private Button AddButton; + private DataGridView DataGridView; + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormImplementers.cs b/FlowerShop/FlowerShop/FormImplementers.cs new file mode 100644 index 0000000..4ebd464 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.cs @@ -0,0 +1,111 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace FlowerShopView +{ + public partial class FormImplementers : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _implementerLogic; + + public FormImplementers(ILogger Logger, IImplementerLogic ImplementerLogic) + { + InitializeComponent(); + + _logger = Logger; + _implementerLogic = ImplementerLogic; + } + + private void LoadData() + { + try + { + var List = _implementerLogic.ReadList(null); + + if (List != null) + { + DataGridView.DataSource = List; + DataGridView.Columns["Id"].Visible = false; + DataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + + _logger.LogInformation("Загрузка исполнителей"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки исполнителей"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void FormImplementers_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void AddButton_Click(object sender, EventArgs e) + { + var Service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + + if (Service is FormImplementer Form) + { + if (Form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void UpdateButton_Click(object sender, EventArgs e) + { + if (DataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementer Form) + { + 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) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление исполнителя"); + + try + { + if (!_implementerLogic.Delete(new ImplementerBindingModel + { + Id = Id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void RefreshButton_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/FlowerShop/FlowerShop/FormImplementers.resx b/FlowerShop/FlowerShop/FormImplementers.resx new file mode 100644 index 0000000..a395bff --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormMain.Designer.cs b/FlowerShop/FlowerShop/FormMain.Designer.cs index 02185c0..76e33b8 100644 --- a/FlowerShop/FlowerShop/FormMain.Designer.cs +++ b/FlowerShop/FlowerShop/FormMain.Designer.cs @@ -32,6 +32,8 @@ справочникиToolStripMenuItem = new ToolStripMenuItem(); ЦветыToolStripMenuItem = new ToolStripMenuItem(); КомпонентыToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + исполнителиToolStripMenuItem = new ToolStripMenuItem(); отчётыToolStripMenuItem = new ToolStripMenuItem(); списокЦветковToolStripMenuItem = new ToolStripMenuItem(); компонентыПоЦветамToolStripMenuItem = new ToolStripMenuItem(); @@ -39,17 +41,15 @@ dataGridView = new DataGridView(); buttonCreateOrder = new Button(); buttonTakeOrderInWork = new Button(); - buttonOrderReady = new Button(); - buttonIssuedOrder = new Button(); buttonRef = new Button(); - клиентыToolStripMenuItem = new ToolStripMenuItem(); + запускToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); // // menuStrip1 // - menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem }); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускToolStripMenuItem }); menuStrip1.Location = new Point(0, 0); menuStrip1.Name = "menuStrip1"; menuStrip1.Size = new Size(964, 24); @@ -58,7 +58,7 @@ // // справочникиToolStripMenuItem // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ЦветыToolStripMenuItem, КомпонентыToolStripMenuItem, клиентыToolStripMenuItem }); + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ЦветыToolStripMenuItem, КомпонентыToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; справочникиToolStripMenuItem.Size = new Size(94, 20); справочникиToolStripMenuItem.Text = "Справочники"; @@ -77,6 +77,20 @@ КомпонентыToolStripMenuItem.Text = "Компоненты"; КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(180, 22); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + // + // исполнителиToolStripMenuItem + // + исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; + исполнителиToolStripMenuItem.Size = new Size(180, 22); + исполнителиToolStripMenuItem.Text = "Исполнители"; + исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; + // // отчётыToolStripMenuItem // отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЦветковToolStripMenuItem, компонентыПоЦветамToolStripMenuItem, списокЗаказовToolStripMenuItem }); @@ -129,48 +143,28 @@ // buttonTakeOrderInWork.Location = new Point(775, 110); buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - buttonTakeOrderInWork.Size = new Size(158, 34); + buttonTakeOrderInWork.Size = new Size(158, 32); buttonTakeOrderInWork.TabIndex = 3; buttonTakeOrderInWork.Text = "Отдать на выполнение"; buttonTakeOrderInWork.UseVisualStyleBackColor = true; buttonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; // - // buttonOrderReady - // - buttonOrderReady.Location = new Point(775, 168); - buttonOrderReady.Name = "buttonOrderReady"; - buttonOrderReady.Size = new Size(158, 34); - buttonOrderReady.TabIndex = 4; - buttonOrderReady.Text = "Заказ готов"; - buttonOrderReady.UseVisualStyleBackColor = true; - buttonOrderReady.Click += ButtonOrderReady_Click; - // - // buttonIssuedOrder - // - buttonIssuedOrder.Location = new Point(775, 230); - buttonIssuedOrder.Name = "buttonIssuedOrder"; - buttonIssuedOrder.Size = new Size(158, 34); - buttonIssuedOrder.TabIndex = 5; - buttonIssuedOrder.Text = "Заказ выдан"; - buttonIssuedOrder.UseVisualStyleBackColor = true; - buttonIssuedOrder.Click += ButtonIssuedOrder_Click; - // // buttonRef // - buttonRef.Location = new Point(775, 289); + buttonRef.Location = new Point(775, 165); buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(158, 34); + buttonRef.Size = new Size(158, 32); buttonRef.TabIndex = 6; buttonRef.Text = "Обновить список"; buttonRef.UseVisualStyleBackColor = true; buttonRef.Click += ButtonRef_Click; // - // клиентыToolStripMenuItem + // запускToolStripMenuItem // - клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(180, 22); - клиентыToolStripMenuItem.Text = "Клиенты"; - клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + запускToolStripMenuItem.Name = "запускToolStripMenuItem"; + запускToolStripMenuItem.Size = new Size(92, 20); + запускToolStripMenuItem.Text = "Запуск работ"; + запускToolStripMenuItem.Click += запускToolStripMenuItem_Click; // // FormMain // @@ -178,8 +172,6 @@ AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(964, 450); Controls.Add(buttonRef); - Controls.Add(buttonIssuedOrder); - Controls.Add(buttonOrderReady); Controls.Add(buttonTakeOrderInWork); Controls.Add(buttonCreateOrder); Controls.Add(dataGridView); @@ -204,13 +196,13 @@ private DataGridView dataGridView; private Button buttonCreateOrder; private Button buttonTakeOrderInWork; - private Button buttonOrderReady; - private Button buttonIssuedOrder; private Button buttonRef; private ToolStripMenuItem отчётыToolStripMenuItem; private ToolStripMenuItem списокЦветковToolStripMenuItem; private ToolStripMenuItem компонентыПоЦветамToolStripMenuItem; private ToolStripMenuItem списокЗаказовToolStripMenuItem; private ToolStripMenuItem клиентыToolStripMenuItem; + private ToolStripMenuItem исполнителиToolStripMenuItem; + private ToolStripMenuItem запускToolStripMenuItem; } } \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormMain.cs b/FlowerShop/FlowerShop/FormMain.cs index 417aec2..dd21605 100644 --- a/FlowerShop/FlowerShop/FormMain.cs +++ b/FlowerShop/FlowerShop/FormMain.cs @@ -10,12 +10,14 @@ namespace FlowerShopView private readonly ILogger _logger; private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic) + private readonly IWorkProcess _workProcess; + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; + _workProcess = workProcess; } private void FormMain_Load(object sender, EventArgs e) { @@ -32,8 +34,10 @@ namespace FlowerShopView dataGridView.DataSource = list; dataGridView.Columns["FlowerId"].Visible = false; dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["ImplementerId"].Visible = false; dataGridView.Columns["FlowerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } } catch (Exception ex) @@ -179,11 +183,26 @@ namespace FlowerShopView private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)) ; + var service = Program.ServiceProvider?.GetService(typeof(FormClients)); if (service is FormClients form) { form.ShowDialog(); } } + + 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) + { + _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение",MessageBoxButtons.OK, MessageBoxIcon.Information); + } } } diff --git a/FlowerShop/FlowerShop/Program.cs b/FlowerShop/FlowerShop/Program.cs index 02d21f6..d334694 100644 --- a/FlowerShop/FlowerShop/Program.cs +++ b/FlowerShop/FlowerShop/Program.cs @@ -39,12 +39,15 @@ namespace FlowerShopView 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(); @@ -60,6 +63,8 @@ namespace FlowerShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..98a1cad --- /dev/null +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,128 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace FlowerShopBusinessLogic.BusinessLogics +{ + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + private readonly IImplementerStorage _implementerStorage; + public ImplementerLogic(ILogger Logger, IImplementerStorage ImplementerStorage) + { + _logger = Logger; + _implementerStorage = ImplementerStorage; + } + public List? ReadList(ImplementerSearchModel? Model) + { + _logger.LogInformation("ReadList. ImplementerFIO: {ImplementerFIO}. Password: {Password}. Id: {Id}", + Model?.ImplementerFIO, Model?.Password?.Length, Model?.Id); + + var List = Model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(Model); + + if (List == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + + _logger.LogInformation("ReadList. Count: {Count}", List.Count); + return List; + } + public ImplementerViewModel? ReadElement(ImplementerSearchModel Model) + { + if (Model is null) + { + throw new ArgumentNullException(nameof(Model)); + } + + _logger.LogInformation("ReadElement. ImplementerFIO: {ImplementerFIO}. Password: {Password}. Id: {Id}", + Model?.ImplementerFIO, Model?.Password?.Length, Model?.Id); + + var Element = _implementerStorage.GetElement(Model); + + if (Element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + + _logger.LogInformation("ReadElement find. Id: {Id}", Element.Id); + return Element; + } + public bool Create(ImplementerBindingModel Model) + { + CheckModel(Model); + + if (_implementerStorage.Insert(Model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + + return true; + } + public bool Update(ImplementerBindingModel Model) + { + CheckModel(Model); + + if (_implementerStorage.Update(Model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + + return true; + } + public bool Delete(ImplementerBindingModel Model) + { + CheckModel(Model, false); + + _logger.LogInformation("Delete. Id:{Id}", Model.Id); + + if (_implementerStorage.Delete(Model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + private void CheckModel(ImplementerBindingModel Model, bool WithParams = true) + { + if (Model == null) + throw new ArgumentNullException(nameof(Model)); + + if (!WithParams) + return; + + if (string.IsNullOrEmpty(Model.ImplementerFIO)) + throw new ArgumentNullException("Нет ФИО исполнителя", nameof(Model.ImplementerFIO)); + + if (string.IsNullOrEmpty(Model.Password)) + throw new ArgumentNullException("Нет пароля исполнителя", nameof(Model.Password)); + + if (Model.WorkExperience < 0) + throw new ArgumentNullException("Стаж должен быть неотрицательным целым числом", nameof(Model.WorkExperience)); + + if (Model.Qualification < 0) + throw new ArgumentNullException("Квалификация должна быть неотрицательным целым числом", nameof(Model.Qualification)); + + _logger.LogInformation("Implementer. ImplementerFIO: {ImplementerFIO}. Password: {Password}. WorkExperience: {WorkExperience}. Qualification: {Qualification}. Id: {Id}", + Model.ImplementerFIO, Model.Password, Model.WorkExperience, Model.Qualification, Model.Id); + + var Implementer = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = Model.ImplementerFIO + }); + + if (Implementer != null && Implementer.Id != Model.Id) + { + throw new InvalidOperationException("Исполнитель с таким ФИО уже есть"); + } + } + } +} diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs index 12c6b6d..8b61226 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs @@ -1,4 +1,5 @@ -using FlowerShopContracts.BindingModels; +using DocumentFormat.OpenXml.EMMA; +using FlowerShopContracts.BindingModels; using FlowerShopContracts.BusinessLogicsContracts; using FlowerShopContracts.SearchModels; using FlowerShopContracts.StoragesContracts; @@ -12,6 +13,7 @@ namespace FlowerShopBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + static readonly object _locker = new object(); public OrderLogic(ILogger logger, IOrderStorage orderStorage) { _logger = logger; @@ -29,7 +31,28 @@ namespace FlowerShopBusinessLogic.BusinessLogics _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; } - public bool CreateOrder(OrderBindingModel model) + public OrderViewModel? ReadElement(OrderSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + _logger.LogInformation("ReadList. ClientId: {ClientId}. Status: {Status}. ImplementerId: {ImplementerId}. DateFrom: {DateFrom}. DateTo: {DateTo}. OrderId: {Id}", + model?.ClientId, model?.Status, model?.ImplementerId, model?.DateFrom, model?.DateTo, model?.Id); + + var Order = _orderStorage.GetElement(model); + + if (Order == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + + _logger.LogInformation("ReadElement find. Id: {Id}", Order.Id); + return Order; + } + public bool CreateOrder(OrderBindingModel model) { CheckModel(model); if (model.Status != OrderStatus.Неизвестен) @@ -45,7 +68,10 @@ namespace FlowerShopBusinessLogic.BusinessLogics } public bool TakeOrderInWork(OrderBindingModel model) { - return ToNextStatus(model, OrderStatus.Выполняется); + lock (_locker) + { + return ToNextStatus(model, OrderStatus.Выполняется); + } } public bool FinishOrder(OrderBindingModel model) { @@ -71,7 +97,9 @@ namespace FlowerShopBusinessLogic.BusinessLogics model.FlowerId = element.FlowerId; model.DateCreate = element.DateCreate; model.DateImplement = element.DateImplement; - model.Status = element.Status; + model.ClientId = element.ClientId; + model.ImplementerId = element.ImplementerId; + model.Status = element.Status; model.Count = element.Count; model.Sum = element.Sum; diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs new file mode 100644 index 0000000..f720fa1 --- /dev/null +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -0,0 +1,120 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Enums; +using Microsoft.Extensions.Logging; + +namespace FlowerShopBusinessLogic.BusinessLogics +{ + public class WorkModeling : IWorkProcess + { + private readonly ILogger _logger; + private readonly Random _rnd; + private IOrderLogic? _orderLogic; + public WorkModeling(ILogger logger) + { + _logger = logger; + _rnd = new Random(1000); + } + public void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic) + { + _orderLogic = orderLogic; + var implementers = implementerLogic.ReadList(null); + if (implementers == null) + { + _logger.LogWarning("DoWork. Implementers is null"); + return; + } + var orders = _orderLogic.ReadList(new OrderSearchModel + { + Status = OrderStatus.Принят + }); + if (orders == null || orders.Count == 0) + { + _logger.LogWarning("DoWork. Orders is null or empty"); + return; + } + _logger.LogDebug("DoWork for {Count} orders", orders.Count); + foreach (var implementer in implementers) + { + Task.Run(() => WorkerWorkAsync(implementer, orders)); + } + } + private async Task WorkerWorkAsync(ImplementerViewModel implementer, List orders) + { + if (_orderLogic == null || implementer == null) + { + return; + } + await RunOrderInWork(implementer); + await Task.Run(() => + { + foreach (var order in orders) + { + try + { + _logger.LogDebug("DoWork. Worker {Id} try get order { Order}", implementer.Id, order.Id); + _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = order.Id, + ImplementerId = implementer.Id + }); + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order{ Order}", implementer.Id, order.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = order.Id + }); + } + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); + } + }); + } + private async Task RunOrderInWork(ImplementerViewModel implementer) + { + if (_orderLogic == null || implementer == null) + { + return; + } + try + { + var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel + { + ImplementerId = implementer.Id, + Status = OrderStatus.Выполняется + })); + if (runOrder == null) + { + return; + } + _logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id); + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = runOrder.Id + }); + Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); + } + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs index 83ced06..0953b1b 100644 --- a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs +++ b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs @@ -8,7 +8,7 @@ namespace FlowerShopContracts.BindingModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } - public int ImplementerId { get; set; } = 0; + public int? ImplementerId { get; set; } public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs index 0449bf8..b6898cf 100644 --- a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -7,6 +7,7 @@ namespace FlowerShopContracts.BusinessLogicsContracts public interface IOrderLogic { List? ReadList(OrderSearchModel? model); + OrderViewModel? ReadElement(OrderSearchModel? model); bool CreateOrder(OrderBindingModel model); bool TakeOrderInWork(OrderBindingModel model); bool FinishOrder(OrderBindingModel model); diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..ac363fe --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,8 @@ +namespace FlowerShopContracts.BusinessLogicsContracts +{ + public interface IWorkProcess + { + void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } + +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs index 9fd1640..96038ac 100644 --- a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs +++ b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs @@ -10,7 +10,7 @@ namespace FlowerShopContracts.ViewModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } - public int ImplementerId { get; set; } = 0; + public int? ImplementerId { get; set; } [DisplayName("Изделие")] public string FlowerName { get; set; } = string.Empty; [DisplayName("ФИО клиента")] diff --git a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs index 35fc0f6..5ab5137 100644 --- a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs +++ b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs @@ -6,7 +6,7 @@ namespace FlowerShopDataModels.Models { int FlowerId { get; } int ClientId { get; } - int ImplementerId { get; } + int? ImplementerId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabaseImplement.csproj b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabaseImplement.csproj index 6a2cfd7..436990e 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabaseImplement.csproj +++ b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabaseImplement.csproj @@ -21,8 +21,4 @@ - - - - diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs index a07dde6..6e454c2 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs @@ -17,10 +17,6 @@ namespace FlowerShopDatabaseImplement.Implements } public List GetFilteredList(OrderSearchModel model) { - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue) - { - return new(); - } using var context = new FlowerShopDatabase(); if (model.DateFrom.HasValue) return context.Orders diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.Designer.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs similarity index 81% rename from FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.Designer.cs rename to FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs index 9138f8b..0384535 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.Designer.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs @@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FlowerShopDatabaseImplement.Migrations { [DbContext(typeof(FlowerShopDatabase))] - [Migration("20240404125520_initcreate")] - partial class initcreate + [Migration("20240418172148_InitCreate")] + partial class InitCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -115,6 +115,33 @@ namespace FlowerShopDatabaseImplement.Migrations b.ToTable("FlowerComponents"); }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -138,6 +165,9 @@ namespace FlowerShopDatabaseImplement.Migrations b.Property("FlowerId") .HasColumnType("integer"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -148,6 +178,8 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasIndex("FlowerId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -177,6 +209,10 @@ namespace FlowerShopDatabaseImplement.Migrations .HasForeignKey("FlowerId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", null) + .WithMany("Order") + .HasForeignKey("ImplementerId"); }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => @@ -190,6 +226,11 @@ namespace FlowerShopDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Order"); + }); #pragma warning restore 612, 618 } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs similarity index 80% rename from FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.cs rename to FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs index 7a650bc..6bcd782 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240404125520_initcreate.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs @@ -6,7 +6,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FlowerShopDatabaseImplement.Migrations { - public partial class initcreate : Migration + public partial class InitCreate : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -53,6 +53,22 @@ namespace FlowerShopDatabaseImplement.Migrations table.PrimaryKey("PK_Flowers", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ImplementerFIO = table.Column(type: "text", nullable: false), + Password = table.Column(type: "text", nullable: false), + WorkExperience = table.Column(type: "integer", nullable: false), + Qualification = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.Id); + }); + migrationBuilder.CreateTable( name: "FlowerComponents", columns: table => new @@ -88,6 +104,7 @@ namespace FlowerShopDatabaseImplement.Migrations .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), FlowerId = table.Column(type: "integer", nullable: false), ClientId = table.Column(type: "integer", nullable: false), + ImplementerId = table.Column(type: "integer", nullable: true), Count = table.Column(type: "integer", nullable: false), Sum = table.Column(type: "double precision", nullable: false), Status = table.Column(type: "integer", nullable: false), @@ -103,6 +120,11 @@ namespace FlowerShopDatabaseImplement.Migrations principalTable: "Flowers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerId", + column: x => x.ImplementerId, + principalTable: "Implementers", + principalColumn: "Id"); }); migrationBuilder.CreateIndex( @@ -119,6 +141,11 @@ namespace FlowerShopDatabaseImplement.Migrations name: "IX_Orders_FlowerId", table: "Orders", column: "FlowerId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ImplementerId", + table: "Orders", + column: "ImplementerId"); } protected override void Down(MigrationBuilder migrationBuilder) @@ -137,6 +164,9 @@ namespace FlowerShopDatabaseImplement.Migrations migrationBuilder.DropTable( name: "Flowers"); + + migrationBuilder.DropTable( + name: "Implementers"); } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs index 0d55adb..0ccf3ca 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs @@ -113,6 +113,33 @@ namespace FlowerShopDatabaseImplement.Migrations b.ToTable("FlowerComponents"); }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -136,6 +163,9 @@ namespace FlowerShopDatabaseImplement.Migrations b.Property("FlowerId") .HasColumnType("integer"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -146,6 +176,8 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasIndex("FlowerId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -175,6 +207,10 @@ namespace FlowerShopDatabaseImplement.Migrations .HasForeignKey("FlowerId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", null) + .WithMany("Order") + .HasForeignKey("ImplementerId"); }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => @@ -188,6 +224,11 @@ namespace FlowerShopDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Order"); + }); #pragma warning restore 612, 618 } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs index f2bdb9b..87ff7a2 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs @@ -11,7 +11,7 @@ namespace FlowerShopDatabaseImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } - public int ImplementerId { get; private set; } + public int? ImplementerId { get; private set; } [Required] public int Count { get; set; } [Required] @@ -32,6 +32,7 @@ namespace FlowerShopDatabaseImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -45,6 +46,7 @@ namespace FlowerShopDatabaseImplement.Models { return; } + ImplementerId = model.ImplementerId; Status = model.Status; DateImplement = model.DateImplement; } @@ -53,6 +55,7 @@ namespace FlowerShopDatabaseImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, diff --git a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs index af08faf..b3c3b6f 100644 --- a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs +++ b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs @@ -10,7 +10,7 @@ namespace FlowerShopFileImplement private readonly string OrderFileName = "Order.xml"; private readonly string FlowerFileName = "Flower.xml"; private readonly string ClientFileName = "Client.xml"; - private readonly string ImplementerFileName = "Implementer.xml" + private readonly string ImplementerFileName = "Implementer.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Flowers { get; private set; } @@ -35,7 +35,7 @@ namespace FlowerShopFileImplement Flowers = LoadData(FlowerFileName, "Flower", x => Flower.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; - Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!); + Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/FlowerShop/FlowerShopFileImplement/Models/Order.cs b/FlowerShop/FlowerShopFileImplement/Models/Order.cs index 9812a33..594dec8 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Order.cs @@ -11,7 +11,7 @@ namespace FlowerShopFileImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } - public int ImplementerId { get; private set; } + public int? ImplementerId { get; private set; } public int Count { get; private set; } public double Sum { get; set; } public OrderStatus Status { get; set; } diff --git a/FlowerShop/FlowerShopListImplement/Models/Order.cs b/FlowerShop/FlowerShopListImplement/Models/Order.cs index 9c26708..d36c7d6 100644 --- a/FlowerShop/FlowerShopListImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopListImplement/Models/Order.cs @@ -10,7 +10,7 @@ namespace FlowerShopListImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } - public int ImplementerId { get; private set; } + public int? ImplementerId { get; private set; } public int Count { get; set; } public double Sum { get; private set; } public OrderStatus Status { get; set; } diff --git a/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs b/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..a2fd78d --- /dev/null +++ b/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,100 @@ +using DocumentFormat.OpenXml.Office2010.Excel; +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Enums; +using Microsoft.AspNetCore.Mvc; + +namespace FlowerShopRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class ImplementerController : Controller + { + private readonly ILogger _logger; + private readonly IOrderLogic _order; + private readonly IImplementerLogic _logic; + public ImplementerController(IOrderLogic order, IImplementerLogic logic, ILogger logger) + { + _logger = logger; + _order = order; + _logic = logic; + } + [HttpGet] + public ImplementerViewModel? Login(string login, string password) + { + try + { + return _logic.ReadElement(new ImplementerSearchModel + { + ImplementerFIO = login, + Password = password + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка авторизации сотрудника"); + throw; + } + } + [HttpGet] + public List? GetNewOrders() + { + try + { + return _order.ReadList(new OrderSearchModel + { + Status = OrderStatus.Принят + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения новых заказов"); + throw; + } + } + [HttpGet] + public OrderViewModel? GetImplementerOrder(int implementerId) + { + try + { + return _order.ReadElement(new OrderSearchModel + { + ImplementerId = implementerId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения текущего заказа исполнителя"); + throw; + } + } + [HttpPost] + public void TakeOrderInWork(OrderBindingModel model) + { + try + { + _order.TakeOrderInWork(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу", model.Id); + throw; + } + } + [HttpPost] + public void FinishOrder(OrderBindingModel model) + { + try + { + _order.FinishOrder(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа с №{ Id}", model.Id); + throw; + } + } + } +} \ No newline at end of file From b92c24b8d3faa92143d5fbdd1c5744f1f0b0db99 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Mon, 22 Apr 2024 20:38:34 +0400 Subject: [PATCH 4/6] fix logic, formmain, full lab6 --- FlowerShop/FlowerShop/FormCreateOrder.cs | 1 + FlowerShop/FlowerShop/FormMain.Designer.cs | 344 +++++++++--------- FlowerShop/FlowerShop/FormMain.cs | 52 --- FlowerShop/FlowerShop/FormMain.resx | 2 +- .../BusinessLogics/OrderLogic.cs | 7 +- .../BusinessLogics/WorkModeling.cs | 248 +++++++------ .../Implements/OrderStorage.cs | 104 +++--- ... => 20240422161656_InitCreate.Designer.cs} | 20 +- ...Create.cs => 20240422161656_InitCreate.cs} | 17 +- .../FlowerShopDatabaseModelSnapshot.cs | 18 +- .../Models/Order.cs | 6 + 11 files changed, 428 insertions(+), 391 deletions(-) rename FlowerShop/FlowerShopDatabaseImplement/Migrations/{20240418172148_InitCreate.Designer.cs => 20240422161656_InitCreate.Designer.cs} (93%) rename FlowerShop/FlowerShopDatabaseImplement/Migrations/{20240418172148_InitCreate.cs => 20240422161656_InitCreate.cs} (94%) diff --git a/FlowerShop/FlowerShop/FormCreateOrder.cs b/FlowerShop/FlowerShop/FormCreateOrder.cs index 842786f..8ac37a0 100644 --- a/FlowerShop/FlowerShop/FormCreateOrder.cs +++ b/FlowerShop/FlowerShop/FormCreateOrder.cs @@ -103,6 +103,7 @@ namespace FlowerShopView { var operationResult = _logicO.CreateOrder(new OrderBindingModel { + ClientId = Convert.ToInt32(comboBoxClient.SelectedValue), FlowerId = Convert.ToInt32(comboBoxFlower.SelectedValue), Count = Convert.ToInt32(textBoxCount.Text), Sum = Convert.ToDouble(textBoxSum.Text) diff --git a/FlowerShop/FlowerShop/FormMain.Designer.cs b/FlowerShop/FlowerShop/FormMain.Designer.cs index 76e33b8..b8d27df 100644 --- a/FlowerShop/FlowerShop/FormMain.Designer.cs +++ b/FlowerShop/FlowerShop/FormMain.Designer.cs @@ -20,182 +20,190 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - menuStrip1 = new MenuStrip(); - справочникиToolStripMenuItem = new ToolStripMenuItem(); - ЦветыToolStripMenuItem = new ToolStripMenuItem(); - КомпонентыToolStripMenuItem = new ToolStripMenuItem(); - клиентыToolStripMenuItem = new ToolStripMenuItem(); - исполнителиToolStripMenuItem = new ToolStripMenuItem(); - отчётыToolStripMenuItem = new ToolStripMenuItem(); - списокЦветковToolStripMenuItem = new ToolStripMenuItem(); - компонентыПоЦветамToolStripMenuItem = new ToolStripMenuItem(); - списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); - dataGridView = new DataGridView(); - buttonCreateOrder = new Button(); - buttonTakeOrderInWork = new Button(); - buttonRef = new Button(); - запускToolStripMenuItem = new ToolStripMenuItem(); - menuStrip1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); - SuspendLayout(); - // - // menuStrip1 - // - menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускToolStripMenuItem }); - menuStrip1.Location = new Point(0, 0); - menuStrip1.Name = "menuStrip1"; - menuStrip1.Size = new Size(964, 24); - menuStrip1.TabIndex = 0; - menuStrip1.Text = "menuStrip1"; - // - // справочникиToolStripMenuItem - // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ЦветыToolStripMenuItem, КомпонентыToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); - справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(94, 20); - справочникиToolStripMenuItem.Text = "Справочники"; - // - // ЦветыToolStripMenuItem - // - ЦветыToolStripMenuItem.Name = "ЦветыToolStripMenuItem"; - ЦветыToolStripMenuItem.Size = new Size(180, 22); - ЦветыToolStripMenuItem.Text = "Цветы"; - ЦветыToolStripMenuItem.Click += ЦветыToolStripMenuItem_Click; - // - // КомпонентыToolStripMenuItem - // - КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; - КомпонентыToolStripMenuItem.Size = new Size(180, 22); - КомпонентыToolStripMenuItem.Text = "Компоненты"; - КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; - // - // клиентыToolStripMenuItem - // - клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(180, 22); - клиентыToolStripMenuItem.Text = "Клиенты"; - клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; - // - // исполнителиToolStripMenuItem - // - исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(180, 22); - исполнителиToolStripMenuItem.Text = "Исполнители"; - исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; - // - // отчётыToolStripMenuItem - // - отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЦветковToolStripMenuItem, компонентыПоЦветамToolStripMenuItem, списокЗаказовToolStripMenuItem }); - отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; - отчётыToolStripMenuItem.Size = new Size(60, 20); - отчётыToolStripMenuItem.Text = "Отчёты"; - // - // списокЦветковToolStripMenuItem - // - списокЦветковToolStripMenuItem.Name = "списокЦветковToolStripMenuItem"; - списокЦветковToolStripMenuItem.Size = new Size(204, 22); - списокЦветковToolStripMenuItem.Text = "Список цветков"; - списокЦветковToolStripMenuItem.Click += списокЦветковToolStripMenuItem_Click; - // - // компонентыПоЦветамToolStripMenuItem - // - компонентыПоЦветамToolStripMenuItem.Name = "компонентыПоЦветамToolStripMenuItem"; - компонентыПоЦветамToolStripMenuItem.Size = new Size(204, 22); - компонентыПоЦветамToolStripMenuItem.Text = "Компоненты по цветам"; - компонентыПоЦветамToolStripMenuItem.Click += компонентыПоЦветамToolStripMenuItem_Click; - // - // списокЗаказовToolStripMenuItem - // - списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; - списокЗаказовToolStripMenuItem.Size = new Size(204, 22); - списокЗаказовToolStripMenuItem.Text = "Список заказов"; - списокЗаказовToolStripMenuItem.Click += списокЗаказовToolStripMenuItem_Click; - // - // dataGridView - // - dataGridView.BackgroundColor = Color.White; - dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(12, 27); - dataGridView.Name = "dataGridView"; - dataGridView.RowTemplate.Height = 25; - dataGridView.Size = new Size(739, 411); - dataGridView.TabIndex = 1; - // - // buttonCreateOrder - // - buttonCreateOrder.Location = new Point(775, 55); - buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(158, 32); - buttonCreateOrder.TabIndex = 2; - buttonCreateOrder.Text = "Создать заказ"; - buttonCreateOrder.UseVisualStyleBackColor = true; - buttonCreateOrder.Click += ButtonCreateOrder_Click; - // - // buttonTakeOrderInWork - // - buttonTakeOrderInWork.Location = new Point(775, 110); - buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - buttonTakeOrderInWork.Size = new Size(158, 32); - buttonTakeOrderInWork.TabIndex = 3; - buttonTakeOrderInWork.Text = "Отдать на выполнение"; - buttonTakeOrderInWork.UseVisualStyleBackColor = true; - buttonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; - // - // buttonRef - // - buttonRef.Location = new Point(775, 165); - buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(158, 32); - buttonRef.TabIndex = 6; - buttonRef.Text = "Обновить список"; - buttonRef.UseVisualStyleBackColor = true; - buttonRef.Click += ButtonRef_Click; - // - // запускToolStripMenuItem - // - запускToolStripMenuItem.Name = "запускToolStripMenuItem"; - запускToolStripMenuItem.Size = new Size(92, 20); - запускToolStripMenuItem.Text = "Запуск работ"; - запускToolStripMenuItem.Click += запускToolStripMenuItem_Click; - // - // FormMain - // - AutoScaleDimensions = new SizeF(7F, 15F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(964, 450); - Controls.Add(buttonRef); - Controls.Add(buttonTakeOrderInWork); - Controls.Add(buttonCreateOrder); - Controls.Add(dataGridView); - Controls.Add(menuStrip1); - MainMenuStrip = menuStrip1; - Name = "FormMain"; - Text = "Цветочный магазин"; - Load += FormMain_Load; - menuStrip1.ResumeLayout(false); - menuStrip1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + menuStrip1 = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + ЦветыToolStripMenuItem = new ToolStripMenuItem(); + КомпонентыToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + исполнителиToolStripMenuItem = new ToolStripMenuItem(); + отчётыToolStripMenuItem = new ToolStripMenuItem(); + списокЦветковToolStripMenuItem = new ToolStripMenuItem(); + компонентыПоЦветамToolStripMenuItem = new ToolStripMenuItem(); + списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); + запускToolStripMenuItem = new ToolStripMenuItem(); + dataGridView = new DataGridView(); + buttonCreateOrder = new Button(); + buttonIssuedOrder = new Button(); + buttonRef = new Button(); + menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Padding = new Padding(7, 3, 0, 3); + menuStrip1.Size = new Size(1102, 30); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ЦветыToolStripMenuItem, КомпонентыToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // ЦветыToolStripMenuItem + // + ЦветыToolStripMenuItem.Name = "ЦветыToolStripMenuItem"; + ЦветыToolStripMenuItem.Size = new Size(185, 26); + ЦветыToolStripMenuItem.Text = "Цветы"; + ЦветыToolStripMenuItem.Click += ЦветыToolStripMenuItem_Click; + // + // КомпонентыToolStripMenuItem + // + КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; + КомпонентыToolStripMenuItem.Size = new Size(185, 26); + КомпонентыToolStripMenuItem.Text = "Компоненты"; + КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; + // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(185, 26); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + // + // исполнителиToolStripMenuItem + // + исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; + исполнителиToolStripMenuItem.Size = new Size(185, 26); + исполнителиToolStripMenuItem.Text = "Исполнители"; + исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; + // + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЦветковToolStripMenuItem, компонентыПоЦветамToolStripMenuItem, списокЗаказовToolStripMenuItem }); + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(73, 24); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // списокЦветковToolStripMenuItem + // + списокЦветковToolStripMenuItem.Name = "списокЦветковToolStripMenuItem"; + списокЦветковToolStripMenuItem.Size = new Size(258, 26); + списокЦветковToolStripMenuItem.Text = "Список цветков"; + списокЦветковToolStripMenuItem.Click += списокЦветковToolStripMenuItem_Click; + // + // компонентыПоЦветамToolStripMenuItem + // + компонентыПоЦветамToolStripMenuItem.Name = "компонентыПоЦветамToolStripMenuItem"; + компонентыПоЦветамToolStripMenuItem.Size = new Size(258, 26); + компонентыПоЦветамToolStripMenuItem.Text = "Компоненты по цветам"; + компонентыПоЦветамToolStripMenuItem.Click += компонентыПоЦветамToolStripMenuItem_Click; + // + // списокЗаказовToolStripMenuItem + // + списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; + списокЗаказовToolStripMenuItem.Size = new Size(258, 26); + списокЗаказовToolStripMenuItem.Text = "Список заказов"; + списокЗаказовToolStripMenuItem.Click += списокЗаказовToolStripMenuItem_Click; + // + // запускToolStripMenuItem + // + запускToolStripMenuItem.Name = "запускToolStripMenuItem"; + запускToolStripMenuItem.Size = new Size(114, 24); + запускToolStripMenuItem.Text = "Запуск работ"; + запускToolStripMenuItem.Click += запускToolStripMenuItem_Click; + // + // dataGridView + // + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(14, 36); + dataGridView.Margin = new Padding(3, 4, 3, 4); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 25; + dataGridView.Size = new Size(845, 548); + dataGridView.TabIndex = 1; + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(886, 73); + buttonCreateOrder.Margin = new Padding(3, 4, 3, 4); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(181, 43); + buttonCreateOrder.TabIndex = 2; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += ButtonCreateOrder_Click; + // + // buttonIssuedOrder + // + buttonIssuedOrder.Location = new Point(886, 147); + buttonIssuedOrder.Margin = new Padding(3, 4, 3, 4); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(181, 43); + buttonIssuedOrder.TabIndex = 3; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += ButtonIssuedOrder_Click; + // + // buttonRef + // + buttonRef.Location = new Point(886, 220); + buttonRef.Margin = new Padding(3, 4, 3, 4); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(181, 43); + buttonRef.TabIndex = 6; + buttonRef.Text = "Обновить список"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // FormMain + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1102, 600); + Controls.Add(buttonRef); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Margin = new Padding(3, 4, 3, 4); + Name = "FormMain"; + Text = "Цветочный магазин"; + Load += FormMain_Load; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private MenuStrip menuStrip1; + private MenuStrip menuStrip1; private ToolStripMenuItem справочникиToolStripMenuItem; private ToolStripMenuItem ЦветыToolStripMenuItem; private ToolStripMenuItem КомпонентыToolStripMenuItem; private DataGridView dataGridView; private Button buttonCreateOrder; - private Button buttonTakeOrderInWork; + private Button buttonIssuedOrder; private Button buttonRef; private ToolStripMenuItem отчётыToolStripMenuItem; private ToolStripMenuItem списокЦветковToolStripMenuItem; diff --git a/FlowerShop/FlowerShop/FormMain.cs b/FlowerShop/FlowerShop/FormMain.cs index dd21605..e19e7bc 100644 --- a/FlowerShop/FlowerShop/FormMain.cs +++ b/FlowerShop/FlowerShop/FormMain.cs @@ -35,9 +35,6 @@ namespace FlowerShopView dataGridView.Columns["FlowerId"].Visible = false; dataGridView.Columns["ClientId"].Visible = false; dataGridView.Columns["ImplementerId"].Visible = false; - dataGridView.Columns["FlowerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } } catch (Exception ex) @@ -71,55 +68,6 @@ namespace FlowerShopView LoadData(); } } - private void ButtonTakeOrderInWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel { Id = id }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка передачи заказа в работу"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - private void ButtonOrderReady_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", - id); - try - { - var operationResult = _orderLogic.FinishOrder(new - OrderBindingModel - { Id = id }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о готовности заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } private void ButtonIssuedOrder_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) diff --git a/FlowerShop/FlowerShop/FormMain.resx b/FlowerShop/FlowerShop/FormMain.resx index 5203d24..a0623c8 100644 --- a/FlowerShop/FlowerShop/FormMain.resx +++ b/FlowerShop/FlowerShop/FormMain.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object] diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs index 8b61226..0e7caba 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs @@ -1,5 +1,4 @@ -using DocumentFormat.OpenXml.EMMA; -using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BindingModels; using FlowerShopContracts.BusinessLogicsContracts; using FlowerShopContracts.SearchModels; using FlowerShopContracts.StoragesContracts; @@ -98,8 +97,8 @@ namespace FlowerShopBusinessLogic.BusinessLogics model.DateCreate = element.DateCreate; model.DateImplement = element.DateImplement; model.ClientId = element.ClientId; - model.ImplementerId = element.ImplementerId; - model.Status = element.Status; + if (!model.ImplementerId.HasValue) model.ImplementerId = element.ImplementerId; + model.Status = element.Status; model.Count = element.Count; model.Sum = element.Sum; diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs index f720fa1..051d3f5 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -9,112 +9,144 @@ namespace FlowerShopBusinessLogic.BusinessLogics { public class WorkModeling : IWorkProcess { - private readonly ILogger _logger; - private readonly Random _rnd; - private IOrderLogic? _orderLogic; - public WorkModeling(ILogger logger) - { - _logger = logger; - _rnd = new Random(1000); - } - public void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic) - { - _orderLogic = orderLogic; - var implementers = implementerLogic.ReadList(null); - if (implementers == null) - { - _logger.LogWarning("DoWork. Implementers is null"); - return; - } - var orders = _orderLogic.ReadList(new OrderSearchModel - { - Status = OrderStatus.Принят - }); - if (orders == null || orders.Count == 0) - { - _logger.LogWarning("DoWork. Orders is null or empty"); - return; - } - _logger.LogDebug("DoWork for {Count} orders", orders.Count); - foreach (var implementer in implementers) - { - Task.Run(() => WorkerWorkAsync(implementer, orders)); - } - } - private async Task WorkerWorkAsync(ImplementerViewModel implementer, List orders) - { - if (_orderLogic == null || implementer == null) - { - return; - } - await RunOrderInWork(implementer); - await Task.Run(() => - { - foreach (var order in orders) - { - try - { - _logger.LogDebug("DoWork. Worker {Id} try get order { Order}", implementer.Id, order.Id); - _orderLogic.TakeOrderInWork(new OrderBindingModel - { - Id = order.Id, - ImplementerId = implementer.Id - }); - Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count); - _logger.LogDebug("DoWork. Worker {Id} finish order{ Order}", implementer.Id, order.Id); - _orderLogic.FinishOrder(new OrderBindingModel - { - Id = order.Id - }); - } - catch (InvalidOperationException ex) - { - _logger.LogWarning(ex, "Error try get work"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error while do work"); - throw; - } - Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); - } - }); - } - private async Task RunOrderInWork(ImplementerViewModel implementer) - { - if (_orderLogic == null || implementer == null) - { - return; - } - try - { - var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel - { - ImplementerId = implementer.Id, - Status = OrderStatus.Выполняется - })); - if (runOrder == null) - { - return; - } - _logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id); - Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count); - _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id); - _orderLogic.FinishOrder(new OrderBindingModel - { - Id = runOrder.Id - }); - Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); - } - catch (InvalidOperationException ex) - { - _logger.LogWarning(ex, "Error try get work"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error while do work"); - throw; - } - } - } + private readonly ILogger _logger; + + private readonly Random _rnd; + + private IOrderLogic? _orderLogic; + + public WorkModeling(ILogger Logger) + { + _logger = Logger; + _rnd = new Random(1000); + } + + public void DoWork(IImplementerLogic ImplementerLogic, IOrderLogic OrderLogic) + { + _orderLogic = OrderLogic; + + var Implementers = ImplementerLogic.ReadList(null); + + if (Implementers == null) + { + _logger.LogWarning("DoWork. Implementers is null"); + return; + } + + var Orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят }); + var BeingProcessedOrders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Выполняется }); + // in case there are BeingProcessed orders but no Accepted orders + + if (Orders == null || BeingProcessedOrders == null || (Orders.Count == 0 && BeingProcessedOrders.Count == 0)) + { + _logger.LogWarning("DoWork. Orders is null or empty"); + return; + } + + _logger.LogDebug("DoWork for {Count} orders", Orders.Count); + + foreach (var Implementer in Implementers) + { + Task.Run(() => WorkerWorkAsync(Implementer, Orders)); + } + } + + private async Task WorkerWorkAsync(ImplementerViewModel Implementer, List Orders) + { + if (_orderLogic == null || Implementer == null) + { + return; + } + + await RunOrderInWork(Implementer); + + await Task.Run(() => + { + foreach (var Order in Orders) + { + try + { + _logger.LogDebug("WorkerWorkAsync. Worker {Id} try get order {Order}", Implementer.Id, Order.Id); + + // TakeOrderInWork will fail when the worker tries to change status to BeingProcessed when the order is already BeingProcessed + // which would happen when other worker already acquired that order + bool AcquireResult = _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = Order.Id, + ImplementerId = Implementer.Id + }); + + if (!AcquireResult) + { + _logger.LogDebug("WorkerWorkAsync. Worker {Id} tried to get order {Order} but it's already acquired by other worker", Implementer.Id, Order.Id); + continue; + } + + Thread.Sleep(Implementer.WorkExperience * _rnd.Next(100, 1000) * Order.Count); + + _logger.LogDebug("WorkerWorkAsync. Worker {Id} finish order {Order}", Implementer.Id, Order.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = Order.Id + }); + } + + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + + Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); + } + }); + } + + private async Task RunOrderInWork(ImplementerViewModel Implementer) + { + if (_orderLogic == null || Implementer == null) + return; + + try + { + var RunOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel + { + ImplementerId = Implementer.Id, + Status = OrderStatus.Выполняется + })); + + if (RunOrder == null) + { + return; + } + + _logger.LogDebug("RunOrderInWork. Worker {Id} back to order {Order}", Implementer.Id, RunOrder.Id); + Thread.Sleep(Implementer.WorkExperience * _rnd.Next(100, 300) * RunOrder.Count); + + _logger.LogDebug("RunOrderInWork. Worker {Id} finish order {Order}", Implementer.Id, RunOrder.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = RunOrder.Id + }); + + Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); + } + + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + } } \ No newline at end of file diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs index 6e454c2..30ff169 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs @@ -3,6 +3,7 @@ using FlowerShopContracts.SearchModels; using FlowerShopContracts.StoragesContracts; using FlowerShopContracts.ViewModels; using FlowerShopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; namespace FlowerShopDatabaseImplement.Implements { @@ -12,93 +13,96 @@ namespace FlowerShopDatabaseImplement.Implements { using var context = new FlowerShopDatabase(); return context.Orders - .Select(x => AccessFlowerStorage(x.GetViewModel)) - .ToList(); + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) + .Select(x => x.GetViewModel) + .ToList(); } public List GetFilteredList(OrderSearchModel model) { using var context = new FlowerShopDatabase(); if (model.DateFrom.HasValue) + { return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) - && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) - .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); + && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Select(x => x.GetViewModel) + .ToList(); + } + return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => (model.Id.HasValue && x.Id == model.Id) - || (model.ClientId.HasValue && x.ClientId == model.ClientId) - || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId) - || (model.Status.HasValue && x.Status == model.Status)) - .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId) + || (model.Status.HasValue && x.Status == model.Status)) + .Select(x => x.GetViewModel) + .ToList(); } public OrderViewModel? GetElement(OrderSearchModel model) { - if (!model.Id.HasValue) - { + if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.Status.HasValue) return null; - } + using var context = new FlowerShopDatabase(); - return AccessFlowerStorage(context.Orders.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel); + + return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) + .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ImplementerId.HasValue && model.Status.HasValue && x.ImplementerId == model.ImplementerId && x.Status == model.Status))? + .GetViewModel; } public OrderViewModel? Insert(OrderBindingModel model) { + if (model == null) + return null; + var newOrder = Order.Create(model); if (newOrder == null) - { return null; - } + using var context = new FlowerShopDatabase(); + context.Orders.Add(newOrder); context.SaveChanges(); - return AccessFlowerStorage(newOrder.GetViewModel); + + return context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; } + public OrderViewModel? Update(OrderBindingModel model) { using var context = new FlowerShopDatabase(); - var order = context.Orders.FirstOrDefault(x => x.Id == - model.Id); + + var order = context.Orders.FirstOrDefault(x => x.Id == model.Id); if (order == null) - { return null; - } + order.Update(model); context.SaveChanges(); - return AccessFlowerStorage(order.GetViewModel); + + return context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; } + public OrderViewModel? Delete(OrderBindingModel model) { using var context = new FlowerShopDatabase(); - var element = context.Orders.FirstOrDefault(rec => rec.Id == model.Id); - if (element != null) - { - context.Orders.Remove(element); - context.SaveChanges(); - return AccessFlowerStorage(element.GetViewModel); - } - return null; - } + var order = context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(rec => rec.Id == model.Id); - public static OrderViewModel AccessFlowerStorage(OrderViewModel model) - { - if (model == null) + if (order == null) return null; - using var context = new FlowerShopDatabase(); - foreach (var Flower in context.Flowers) - { - if (Flower.Id == model.FlowerId) - { - model.FlowerName = Flower.FlowerName; - break; - } - } - foreach (var client in context.Clients) - { - if (client.Id == model.ClientId) - { - model.ClientFIO = client.ClientFIO; - return model; - } - } - return model; + + context.Orders.Remove(order); + context.SaveChanges(); + + return order.GetViewModel; } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs similarity index 93% rename from FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs rename to FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs index 0384535..d6c1a9c 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.Designer.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FlowerShopDatabaseImplement.Migrations { [DbContext(typeof(FlowerShopDatabase))] - [Migration("20240418172148_InitCreate")] + [Migration("20240422161656_InitCreate")] partial class InitCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -176,6 +176,8 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasKey("Id"); + b.HasIndex("ClientId"); + b.HasIndex("FlowerId"); b.HasIndex("ImplementerId"); @@ -204,15 +206,27 @@ namespace FlowerShopDatabaseImplement.Migrations modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { - b.HasOne("FlowerShopDatabaseImplement.Models.Flower", null) + b.HasOne("FlowerShopDatabaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlowerShopDatabaseImplement.Models.Flower", "Flower") .WithMany("Orders") .HasForeignKey("FlowerId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", null) + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", "Implementer") .WithMany("Order") .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("Flower"); + + b.Navigation("Implementer"); }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs similarity index 94% rename from FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs rename to FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs index 6bcd782..e3cb0dc 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240418172148_InitCreate.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs @@ -114,6 +114,12 @@ namespace FlowerShopDatabaseImplement.Migrations constraints: table => { table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_Orders_Flowers_FlowerId", column: x => x.FlowerId, @@ -137,6 +143,11 @@ namespace FlowerShopDatabaseImplement.Migrations table: "FlowerComponents", column: "FlowerId"); + migrationBuilder.CreateIndex( + name: "IX_Orders_ClientId", + table: "Orders", + column: "ClientId"); + migrationBuilder.CreateIndex( name: "IX_Orders_FlowerId", table: "Orders", @@ -150,9 +161,6 @@ namespace FlowerShopDatabaseImplement.Migrations protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.DropTable( - name: "Clients"); - migrationBuilder.DropTable( name: "FlowerComponents"); @@ -162,6 +170,9 @@ namespace FlowerShopDatabaseImplement.Migrations migrationBuilder.DropTable( name: "Components"); + migrationBuilder.DropTable( + name: "Clients"); + migrationBuilder.DropTable( name: "Flowers"); diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs index 0ccf3ca..dc3a919 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs @@ -174,6 +174,8 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasKey("Id"); + b.HasIndex("ClientId"); + b.HasIndex("FlowerId"); b.HasIndex("ImplementerId"); @@ -202,15 +204,27 @@ namespace FlowerShopDatabaseImplement.Migrations modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { - b.HasOne("FlowerShopDatabaseImplement.Models.Flower", null) + b.HasOne("FlowerShopDatabaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlowerShopDatabaseImplement.Models.Flower", "Flower") .WithMany("Orders") .HasForeignKey("FlowerId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", null) + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", "Implementer") .WithMany("Order") .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("Flower"); + + b.Navigation("Implementer"); }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs index 87ff7a2..98ce151 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs @@ -10,8 +10,11 @@ namespace FlowerShopDatabaseImplement.Models { public int Id { get; private set; } public int FlowerId { get; private set; } + public virtual Flower Flower { get; set; } public int ClientId { get; private set; } + public virtual Client Client { get; set; } public int? ImplementerId { get; private set; } + public virtual Implementer? Implementer { get; set; } [Required] public int Count { get; set; } [Required] @@ -56,6 +59,9 @@ namespace FlowerShopDatabaseImplement.Models FlowerId = FlowerId, ClientId = ClientId, ImplementerId = ImplementerId, + FlowerName = Flower.FlowerName, + ClientFIO = Client.ClientFIO, + ImplementerFIO = Implementer?.ImplementerFIO, Count = Count, Sum = Sum, Status = Status, From 19e238d2cc447ea86195bd03dd01380983896b04 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Fri, 3 May 2024 12:50:47 +0400 Subject: [PATCH 5/6] fix WorkModeling --- .../FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs index 051d3f5..686187d 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -89,7 +89,8 @@ namespace FlowerShopBusinessLogic.BusinessLogics { Id = Order.Id }); - } + Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); + } catch (InvalidOperationException ex) { @@ -101,8 +102,6 @@ namespace FlowerShopBusinessLogic.BusinessLogics _logger.LogError(ex, "Error while do work"); throw; } - - Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); } }); } From 66344e9d47304d4282a93045c25b0d6f2fd82718 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Fri, 3 May 2024 13:52:55 +0400 Subject: [PATCH 6/6] delete comments from WorkModeling --- .../FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs index 686187d..51af8c8 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -10,9 +10,7 @@ namespace FlowerShopBusinessLogic.BusinessLogics public class WorkModeling : IWorkProcess { private readonly ILogger _logger; - private readonly Random _rnd; - private IOrderLogic? _orderLogic; public WorkModeling(ILogger Logger) @@ -35,7 +33,6 @@ namespace FlowerShopBusinessLogic.BusinessLogics var Orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят }); var BeingProcessedOrders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Выполняется }); - // in case there are BeingProcessed orders but no Accepted orders if (Orders == null || BeingProcessedOrders == null || (Orders.Count == 0 && BeingProcessedOrders.Count == 0)) { @@ -68,8 +65,6 @@ namespace FlowerShopBusinessLogic.BusinessLogics { _logger.LogDebug("WorkerWorkAsync. Worker {Id} try get order {Order}", Implementer.Id, Order.Id); - // TakeOrderInWork will fail when the worker tries to change status to BeingProcessed when the order is already BeingProcessed - // which would happen when other worker already acquired that order bool AcquireResult = _orderLogic.TakeOrderInWork(new OrderBindingModel { Id = Order.Id,