From c6e5fb354ff80d288021b179425b7f5d11503891 Mon Sep 17 00:00:00 2001 From: DavidMakarov Date: Sat, 27 Apr 2024 19:13:45 +0400 Subject: [PATCH] add DatabaseImplement (Storage and Models) --- .../BindingModels/MachineBindingModel.cs | 2 +- .../PlanProductionBindingModel.cs | 2 +- .../SearchModels/MachineSearchModel.cs | 2 +- .../SearchModels/ProductSearchModel.cs | 2 +- .../SearchModels/RequirementSearchModel.cs | 2 +- .../ViewModels/MachineViewModel.cs | 2 +- .../ViewModels/PlanProductionViewModel.cs | 2 +- .../FactoryDataModels/Models/IMachineModel.cs | 2 +- .../Models/IPlanProductionModel.cs | 2 +- .../FactoryDatabase.cs | 14 +- .../Implements/ExecutionPhaseStorage.cs | 7 +- .../Implements/MachineStorage.cs | 109 ++++++++++++++++ .../Implements/PlanProductionStorage.cs | 5 + .../Implements/ProductStorage.cs | 113 +++++++++++++++++ .../Implements/RequirementStorage.cs | 88 +++++++++++++ .../Implements/WorkpieceStorage.cs | 5 +- .../FactoryDatabaseImplement/Models/Client.cs | 5 + .../Models/ExecutionPhase.cs | 1 + .../Models/Machine.cs | 116 +++++++++++++++++ .../Models/MachinePlanProduction.cs | 10 +- .../Models/PlanProduction.cs | 10 +- .../Models/Product.cs | 120 ++++++++++++++++++ .../Models/ProductMachine.cs | 22 ++++ .../Models/Requirement.cs | 65 ++++++++++ .../Models/Workpiece.cs | 15 ++- 25 files changed, 691 insertions(+), 32 deletions(-) create mode 100644 Factory/FactoryDatabaseImplement/Implements/MachineStorage.cs create mode 100644 Factory/FactoryDatabaseImplement/Implements/ProductStorage.cs create mode 100644 Factory/FactoryDatabaseImplement/Implements/RequirementStorage.cs create mode 100644 Factory/FactoryDatabaseImplement/Models/Machine.cs create mode 100644 Factory/FactoryDatabaseImplement/Models/Product.cs create mode 100644 Factory/FactoryDatabaseImplement/Models/ProductMachine.cs create mode 100644 Factory/FactoryDatabaseImplement/Models/Requirement.cs diff --git a/Factory/FactoryContracts/BindingModels/MachineBindingModel.cs b/Factory/FactoryContracts/BindingModels/MachineBindingModel.cs index f1ed66c..143e3b2 100644 --- a/Factory/FactoryContracts/BindingModels/MachineBindingModel.cs +++ b/Factory/FactoryContracts/BindingModels/MachineBindingModel.cs @@ -14,6 +14,6 @@ namespace FactoryContracts.BindingModels public int ClientId { get; set; } - public Dictionary PlanProductionMachines { get; set; } = new(); + public Dictionary MachinePlanProductions { get; set; } = new(); } } diff --git a/Factory/FactoryContracts/BindingModels/PlanProductionBindingModel.cs b/Factory/FactoryContracts/BindingModels/PlanProductionBindingModel.cs index 2a36ec9..4b0c76a 100644 --- a/Factory/FactoryContracts/BindingModels/PlanProductionBindingModel.cs +++ b/Factory/FactoryContracts/BindingModels/PlanProductionBindingModel.cs @@ -12,7 +12,7 @@ namespace FactoryContracts.BindingModels public int Count { get; set; } - public DateTime Term { get; set; } + public DateTime Deadline { get; set; } public Dictionary PlanProductionWorkpieces { get; set; } = new(); } diff --git a/Factory/FactoryContracts/SearchModels/MachineSearchModel.cs b/Factory/FactoryContracts/SearchModels/MachineSearchModel.cs index 2dac7b0..e817ca3 100644 --- a/Factory/FactoryContracts/SearchModels/MachineSearchModel.cs +++ b/Factory/FactoryContracts/SearchModels/MachineSearchModel.cs @@ -4,6 +4,6 @@ { public int? Id { get; set; } - public string? Name { get; set; } + public string? MachineName { get; set; } } } diff --git a/Factory/FactoryContracts/SearchModels/ProductSearchModel.cs b/Factory/FactoryContracts/SearchModels/ProductSearchModel.cs index f3cbdcd..7480851 100644 --- a/Factory/FactoryContracts/SearchModels/ProductSearchModel.cs +++ b/Factory/FactoryContracts/SearchModels/ProductSearchModel.cs @@ -4,6 +4,6 @@ { public int? Id { get; set; } - public string? Name { get; set; } + public string? ProductName { get; set; } } } diff --git a/Factory/FactoryContracts/SearchModels/RequirementSearchModel.cs b/Factory/FactoryContracts/SearchModels/RequirementSearchModel.cs index 975ca91..a31f5e9 100644 --- a/Factory/FactoryContracts/SearchModels/RequirementSearchModel.cs +++ b/Factory/FactoryContracts/SearchModels/RequirementSearchModel.cs @@ -4,6 +4,6 @@ { public int? Id { get; set; } - public string? Name { get; set; } + public string? RequirementName { get; set; } } } diff --git a/Factory/FactoryContracts/ViewModels/MachineViewModel.cs b/Factory/FactoryContracts/ViewModels/MachineViewModel.cs index 522a2d8..7454c74 100644 --- a/Factory/FactoryContracts/ViewModels/MachineViewModel.cs +++ b/Factory/FactoryContracts/ViewModels/MachineViewModel.cs @@ -22,6 +22,6 @@ namespace FactoryContracts.ViewModels public string ClientLogin { get; set; } = string.Empty; [DisplayName("Планы производства")] - public Dictionary PlanProductionMachines { get; set; } = new(); + public Dictionary MachinePlanProductions { get; set; } = new(); } } diff --git a/Factory/FactoryContracts/ViewModels/PlanProductionViewModel.cs b/Factory/FactoryContracts/ViewModels/PlanProductionViewModel.cs index c106034..8b9ec77 100644 --- a/Factory/FactoryContracts/ViewModels/PlanProductionViewModel.cs +++ b/Factory/FactoryContracts/ViewModels/PlanProductionViewModel.cs @@ -18,7 +18,7 @@ namespace FactoryContracts.ViewModels [DisplayName("Количество")] public int Count { get; set; } [DisplayName("Срок выполнения")] - public DateTime Term { get; set; } + public DateTime Deadline { get; set; } [DisplayName("Заготовки")] public Dictionary PlanProductionWorkpieces { get; set; } = new(); } diff --git a/Factory/FactoryDataModels/Models/IMachineModel.cs b/Factory/FactoryDataModels/Models/IMachineModel.cs index 6752c47..122ff33 100644 --- a/Factory/FactoryDataModels/Models/IMachineModel.cs +++ b/Factory/FactoryDataModels/Models/IMachineModel.cs @@ -10,6 +10,6 @@ int ClientId { get; } - Dictionary PlanProductionMachines { get; } + Dictionary MachinePlanProductions { get; } } } diff --git a/Factory/FactoryDataModels/Models/IPlanProductionModel.cs b/Factory/FactoryDataModels/Models/IPlanProductionModel.cs index 4dc7872..795200e 100644 --- a/Factory/FactoryDataModels/Models/IPlanProductionModel.cs +++ b/Factory/FactoryDataModels/Models/IPlanProductionModel.cs @@ -10,7 +10,7 @@ int Count { get; } - DateTime Term { get; } + DateTime Deadline { get; } Dictionary PlanProductionWorkpieces { get; } } diff --git a/Factory/FactoryDatabaseImplement/FactoryDatabase.cs b/Factory/FactoryDatabaseImplement/FactoryDatabase.cs index 805c503..948f3f0 100644 --- a/Factory/FactoryDatabaseImplement/FactoryDatabase.cs +++ b/Factory/FactoryDatabaseImplement/FactoryDatabase.cs @@ -9,11 +9,13 @@ namespace FactoryDatabaseImplement { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseNpgsql(@"Host=localhost;Database=Factory;Username=postgres; Password = postgres"); + optionsBuilder.UseNpgsql(@"Host=localhost;Database=Factory;Username=postgres;Password = postgres"); } base.OnConfiguring(optionsBuilder); - } + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + AppContext.SetSwitch("Npgsql.DisableDataTimeInfinityConversions", true); + } public virtual DbSet Clients { set; get; } public virtual DbSet ExecutionPhases { set; get; } public virtual DbSet MachinePlanProductions { set; get; } @@ -21,9 +23,9 @@ namespace FactoryDatabaseImplement public virtual DbSet PlanProductionWorkpieces { set; get; } public virtual DbSet Workpieces { set; get; } public virtual DbSet WorkpieceProducts { set; get; } - - - - + public virtual DbSet Machines { set; get; } + public virtual DbSet ProductMachines { set; get; } + public virtual DbSet Products { set; get; } + public virtual DbSet Requirements { set; get; } } } \ No newline at end of file diff --git a/Factory/FactoryDatabaseImplement/Implements/ExecutionPhaseStorage.cs b/Factory/FactoryDatabaseImplement/Implements/ExecutionPhaseStorage.cs index 0a16fa0..e6554f8 100644 --- a/Factory/FactoryDatabaseImplement/Implements/ExecutionPhaseStorage.cs +++ b/Factory/FactoryDatabaseImplement/Implements/ExecutionPhaseStorage.cs @@ -3,6 +3,7 @@ using FactoryContracts.SearchModels; using FactoryContracts.StoragesContracts; using FactoryContracts.ViewModels; using FactoryDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; namespace FactoryDatabaseImplement.Implements { @@ -12,6 +13,7 @@ namespace FactoryDatabaseImplement.Implements { using var context = new FactoryDatabase(); return context.ExecutionPhases + .Include(x => x.Client) .Select(x => x.GetViewModel) .ToList(); } @@ -24,6 +26,7 @@ namespace FactoryDatabaseImplement.Implements } using var context = new FactoryDatabase(); return context.ExecutionPhases + .Include(x => x.Client) .Where(x => x.ExecutionPhaseName.Contains(model.ExecutionPhaseName)) .Select(x => x.GetViewModel) .ToList(); @@ -36,7 +39,7 @@ namespace FactoryDatabaseImplement.Implements return null; } using var context = new FactoryDatabase(); - return context.ExecutionPhases + return context.ExecutionPhases.Include(x => x.Client) .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ExecutionPhaseName) && x.ExecutionPhaseName == model.ExecutionPhaseName) || (model.Id.HasValue && x.Id == model.Id)) ?.GetViewModel; @@ -71,7 +74,7 @@ namespace FactoryDatabaseImplement.Implements public ExecutionPhaseViewModel? Delete(ExecutionPhaseBindingModel model) { using var context = new FactoryDatabase(); - var element = context.ExecutionPhases.FirstOrDefault(rec => rec.Id == model.Id); + var element = context.ExecutionPhases.Include(x => x.Client).FirstOrDefault(rec => rec.Id == model.Id); if (element != null) { context.ExecutionPhases.Remove(element); diff --git a/Factory/FactoryDatabaseImplement/Implements/MachineStorage.cs b/Factory/FactoryDatabaseImplement/Implements/MachineStorage.cs new file mode 100644 index 0000000..d683867 --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Implements/MachineStorage.cs @@ -0,0 +1,109 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.SearchModels; +using FactoryContracts.StoragesContracts; +using FactoryContracts.ViewModels; +using FactoryDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace FactoryDatabaseImplement.Implements +{ + public class MachineStorage : IMachineStorage + { + public List GetFullList() + { + using var context = new FactoryDatabase(); + return context.Machines + .Include(x => x.Client) + .Include(x => x.PlanProductions) + .ThenInclude(x => x.PlanProduction) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(MachineSearchModel model) + { + if (string.IsNullOrEmpty(model.MachineName)) + { + return new(); + } + using var context = new FactoryDatabase(); + return context.Machines + .Include(x => x.Client) + .Include(x => x.PlanProductions) + .ThenInclude(x => x.PlanProduction) + .Where(x => x.MachineName.Contains(model.MachineName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public MachineViewModel? GetElement(MachineSearchModel model) + { + if (string.IsNullOrEmpty(model.MachineName) && !model.Id.HasValue) + { + return null; + } + using var context = new FactoryDatabase(); + return context.Machines + .Include(x => x.Client) + .Include(x => x.PlanProductions) + .ThenInclude(x => x.PlanProduction) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.MachineName) && x.MachineName == model.MachineName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public MachineViewModel? Insert(MachineBindingModel model) + { + using var context = new FactoryDatabase(); + var newMachine = Machine.Create(context, model); + if (newMachine == null) + { + return null; + } + context.Machines.Add(newMachine); + context.SaveChanges(); + return newMachine.GetViewModel; + } + + public MachineViewModel? Update(MachineBindingModel model) + { + using var context = new FactoryDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var machine = context.Machines.FirstOrDefault(rec => rec.Id == model.Id); + if (machine == null) + { + return null; + } + machine.Update(model); + context.SaveChanges(); + machine.UpdatePlanProductions(context, model); + transaction.Commit(); + return machine.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + + public MachineViewModel? Delete(MachineBindingModel model) + { + using var context = new FactoryDatabase(); + var element = context.Machines + .Include(x => x.Client) + .Include(x => x.PlanProductions) + .ThenInclude(x => x.PlanProduction) + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Machines.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/Factory/FactoryDatabaseImplement/Implements/PlanProductionStorage.cs b/Factory/FactoryDatabaseImplement/Implements/PlanProductionStorage.cs index c1d8d28..4efe7d7 100644 --- a/Factory/FactoryDatabaseImplement/Implements/PlanProductionStorage.cs +++ b/Factory/FactoryDatabaseImplement/Implements/PlanProductionStorage.cs @@ -13,6 +13,7 @@ namespace FactoryDatabaseImplement.Implements { using var context = new FactoryDatabase(); var element = context.PlanProductions + .Include(x => x.Client) .Include(x => x.ExecutionPhase) .Include(x => x.Workpieces) .ThenInclude( x => x.Workpiece) @@ -35,6 +36,7 @@ namespace FactoryDatabaseImplement.Implements using var context = new FactoryDatabase(); if (model.Id.HasValue) return context.PlanProductions + .Include(x => x.Client) .Include(x => x.ExecutionPhase) .Include(x =>x.Workpieces) .ThenInclude(x => x.Workpiece) @@ -52,6 +54,7 @@ namespace FactoryDatabaseImplement.Implements { return context.PlanProductions .Where(x => x.Id == model.Id) + .Include(x => x.Client) .Include(x => x.ExecutionPhase) .Include(x => x.Workpieces) .ThenInclude(x => x.Workpiece) @@ -67,6 +70,7 @@ namespace FactoryDatabaseImplement.Implements { using var context = new FactoryDatabase(); return context.PlanProductions + .Include (x => x.Client) .Include(x => x.ExecutionPhase) .Include(x => x.Workpieces) .ThenInclude(x => x.Workpiece) @@ -94,6 +98,7 @@ namespace FactoryDatabaseImplement.Implements { using var context = new FactoryDatabase(); var order = context.PlanProductions + .Include(x => x.Client) .Include(x => x.ExecutionPhase) .Include(x => x.Workpieces) .ThenInclude(x => x.Workpiece) diff --git a/Factory/FactoryDatabaseImplement/Implements/ProductStorage.cs b/Factory/FactoryDatabaseImplement/Implements/ProductStorage.cs new file mode 100644 index 0000000..89af759 --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Implements/ProductStorage.cs @@ -0,0 +1,113 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.SearchModels; +using FactoryContracts.StoragesContracts; +using FactoryContracts.ViewModels; +using FactoryDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace FactoryDatabaseImplement.Implements +{ + public class ProductStorage : IProductStorage + { + public List GetFullList() + { + using var context = new FactoryDatabase(); + return context.Products + .Include(x => x.Client) + .Include(x => x.Requirement) + .Include(x => x.Machines) + .ThenInclude(x => x.Machine) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(ProductSearchModel model) + { + if (string.IsNullOrEmpty(model.ProductName)) + { + return new(); + } + using var context = new FactoryDatabase(); + return context.Products + .Include(x => x.Client) + .Include(x => x.Requirement) + .Include(x => x.Machines) + .ThenInclude(x => x.Machine) + .Where(x => x.ProductName.Contains(model.ProductName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ProductViewModel? GetElement(ProductSearchModel model) + { + if (string.IsNullOrEmpty(model.ProductName) && !model.Id.HasValue) + { + return null; + } + using var context = new FactoryDatabase(); + return context.Products + .Include(x => x.Client) + .Include(x => x.Requirement) + .Include(x => x.Machines) + .ThenInclude(x => x.Machine) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ProductName) && x.ProductName == model.ProductName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public ProductViewModel? Insert(ProductBindingModel model) + { + using var context = new FactoryDatabase(); + var newProduct = Product.Create(context, model); + if (newProduct == null) + { + return null; + } + context.Products.Add(newProduct); + context.SaveChanges(); + return newProduct.GetViewModel; + } + + public ProductViewModel? Update(ProductBindingModel model) + { + using var context = new FactoryDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var machine = context.Products.FirstOrDefault(rec => rec.Id == model.Id); + if (machine == null) + { + return null; + } + machine.Update(model); + context.SaveChanges(); + machine.UpdateMachines(context, model); + transaction.Commit(); + return machine.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + + public ProductViewModel? Delete(ProductBindingModel model) + { + using var context = new FactoryDatabase(); + var element = context.Products + .Include(x => x.Client) + .Include(x => x.Requirement) + .Include(x => x.Machines) + .ThenInclude(x => x.Machine) + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Products.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/Factory/FactoryDatabaseImplement/Implements/RequirementStorage.cs b/Factory/FactoryDatabaseImplement/Implements/RequirementStorage.cs new file mode 100644 index 0000000..81af52c --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Implements/RequirementStorage.cs @@ -0,0 +1,88 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.SearchModels; +using FactoryContracts.StoragesContracts; +using FactoryContracts.ViewModels; +using FactoryDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace FactoryDatabaseImplement.Implements +{ + public class RequirementStorage : IRequirementStorage + { + public List GetFullList() + { + using var context = new FactoryDatabase(); + return context.Requirements + .Include(x => x.Client) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(RequirementSearchModel model) + { + if (string.IsNullOrEmpty(model.RequirementName)) + { + return new(); + } + using var context = new FactoryDatabase(); + return context.Requirements + .Include(x => x.Client) + .Where(x => x.RequirementName.Contains(model.RequirementName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public RequirementViewModel? GetElement(RequirementSearchModel model) + { + if (string.IsNullOrEmpty(model.RequirementName) && !model.Id.HasValue) + { + return null; + } + using var context = new FactoryDatabase(); + return context.Requirements + .Include(x => x.Client) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.RequirementName) && x.RequirementName == model.RequirementName) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public RequirementViewModel? Insert(RequirementBindingModel model) + { + var newRequirement = Requirement.Create(model); + if (newRequirement == null) + { + return null; + } + using var context = new FactoryDatabase(); + context.Requirements.Add(newRequirement); + context.SaveChanges(); + return newRequirement.GetViewModel; + } + + public RequirementViewModel? Update(RequirementBindingModel model) + { + using var context = new FactoryDatabase(); + var component = context.Requirements.FirstOrDefault(x => x.Id == model.Id); + if (component == null) + { + return null; + } + component.Update(model); + context.SaveChanges(); + return component.GetViewModel; + } + + public RequirementViewModel? Delete(RequirementBindingModel model) + { + using var context = new FactoryDatabase(); + var element = context.Requirements.Include(x => x.Client).FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Requirements.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/Factory/FactoryDatabaseImplement/Implements/WorkpieceStorage.cs b/Factory/FactoryDatabaseImplement/Implements/WorkpieceStorage.cs index ba30a8d..2344ad8 100644 --- a/Factory/FactoryDatabaseImplement/Implements/WorkpieceStorage.cs +++ b/Factory/FactoryDatabaseImplement/Implements/WorkpieceStorage.cs @@ -13,6 +13,7 @@ namespace FactoryDatabaseImplement.Implements { using var context = new FactoryDatabase(); return context.Workpieces + .Include(x => x.Client) .Include(x => x.Products) .ThenInclude(x => x.Product) .ToList() @@ -28,6 +29,7 @@ namespace FactoryDatabaseImplement.Implements } using var context = new FactoryDatabase(); return context.Workpieces + .Include(x => x.Client) .Include(x => x.Products) .ThenInclude(x => x.Product) .Where(x => x.WorkpieceName.Contains(model.WorkpieceName)) @@ -44,6 +46,7 @@ namespace FactoryDatabaseImplement.Implements } using var context = new FactoryDatabase(); return context.Workpieces + .Include(x => x.Client) .Include(x => x.Products) .ThenInclude(x => x.Product) .FirstOrDefault(x => (!string.IsNullOrEmpty(model.WorkpieceName) && x.WorkpieceName == model.WorkpieceName) || @@ -91,7 +94,7 @@ namespace FactoryDatabaseImplement.Implements public WorkpieceViewModel? Delete(WorkpieceBindingModel model) { using var context = new FactoryDatabase(); - var element = context.Workpieces + var element = context.Workpieces.Include(x => x.Client) .Include(x => x.Products) .FirstOrDefault(rec => rec.Id == model.Id); if (element != null) diff --git a/Factory/FactoryDatabaseImplement/Models/Client.cs b/Factory/FactoryDatabaseImplement/Models/Client.cs index 885bbf9..b943b4c 100644 --- a/Factory/FactoryDatabaseImplement/Models/Client.cs +++ b/Factory/FactoryDatabaseImplement/Models/Client.cs @@ -1,5 +1,6 @@ using FactoryContracts.BindingModels; using FactoryContracts.ViewModels; +using FactoryDataModels.Enums; using FactoryDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -17,6 +18,7 @@ namespace FactoryDatabaseImplement.Models [Required] public string Password { get; private set; } = string.Empty; + public ClientRole Role { get; private set; } = ClientRole.Неизвестен; [ForeignKey("ClientId")] public virtual List ExecutionPhases{ get; set; } = new(); @@ -39,6 +41,7 @@ namespace FactoryDatabaseImplement.Models Login = model.Login, Email= model.Email, Password = model.Password, + Role = model.Role, }; } @@ -50,6 +53,7 @@ namespace FactoryDatabaseImplement.Models Login = model.Login, Email = model.Email, Password = model.Password, + Role = model.Role, }; } @@ -70,6 +74,7 @@ namespace FactoryDatabaseImplement.Models Login = Login, Email = Email, Password = Password, + Role = Role, }; } } \ No newline at end of file diff --git a/Factory/FactoryDatabaseImplement/Models/ExecutionPhase.cs b/Factory/FactoryDatabaseImplement/Models/ExecutionPhase.cs index 49cd212..761c9c9 100644 --- a/Factory/FactoryDatabaseImplement/Models/ExecutionPhase.cs +++ b/Factory/FactoryDatabaseImplement/Models/ExecutionPhase.cs @@ -69,6 +69,7 @@ namespace FactoryDatabaseImplement.Models ExecutionPhaseName = ExecutionPhaseName, ImplementerFIO = ImplementerFIO, ClientId = ClientId, + ClientLogin = Client.Login, Status = Status, }; } diff --git a/Factory/FactoryDatabaseImplement/Models/Machine.cs b/Factory/FactoryDatabaseImplement/Models/Machine.cs new file mode 100644 index 0000000..2634e0b --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Models/Machine.cs @@ -0,0 +1,116 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.ViewModels; +using FactoryDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace FactoryDatabaseImplement.Models +{ + public class Machine : IMachineModel + { + public int Id { get; private set; } + + [Required] + public int ClientId { get; private set; } + + public virtual Client Client { get; private set; } = new(); + + [Required] + public string MachineName { get; private set; } = string.Empty; + + [Required] + public DateTime ExploitationStartDate { get; private set; } = DateTime.Now; + + [Required] + public int Lifetime { get; private set; } + + public Dictionary _machinePlanProductions { get; private set; } = new(); + + [NotMapped] + public Dictionary MachinePlanProductions + { + get + { + if (_machinePlanProductions == null) + { + _machinePlanProductions = PlanProductions + .ToDictionary(recPC => recPC.PlanProductionId, recPC => (recPC.PlanProduction as IPlanProductionModel, recPC.Count)); + } + return _machinePlanProductions; + } + } + [ForeignKey("MachineId")] + public virtual List PlanProductions { get; private set; } = new(); + + [ForeignKey("MachineId")] + public virtual List Products { get; private set; } = new(); + + public static Machine Create(FactoryDatabase context, MachineBindingModel model) + { + if (model == null) + { + return null; + } + return new Machine() + { + Id = model.Id, + ClientId = model.ClientId, + MachineName = model.MachineName, + ExploitationStartDate = model.ExploitationStartDate, + Lifetime = model.Lifetime, + PlanProductions = model.MachinePlanProductions.Select(x => new MachinePlanProduction + { + PlanProduction = context.PlanProductions.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(MachineBindingModel model) + { + if (model == null) + { + return; + } + MachineName = model.MachineName; + } + + public MachineViewModel GetViewModel => new() + { + Id = Id, + ClientId = ClientId, + MachineName = MachineName, + ExploitationStartDate = ExploitationStartDate, + Lifetime = Lifetime, + ClientLogin = Client.Login, + MachinePlanProductions = MachinePlanProductions, + }; + public void UpdatePlanProductions(FactoryDatabase context, MachineBindingModel model) + { + var machinePlanProductions = context.MachinePlanProductions.Where(rec => rec.MachineId == model.Id).ToList(); + if (machinePlanProductions != null && machinePlanProductions.Count > 0) + { + context.MachinePlanProductions.RemoveRange(machinePlanProductions.Where(rec => !model.MachinePlanProductions.ContainsKey(rec.PlanProductionId))); + context.SaveChanges(); + foreach (var updatePlanProduction in machinePlanProductions) + { + updatePlanProduction.Count = model.MachinePlanProductions[updatePlanProduction.PlanProductionId].Item2; + model.MachinePlanProductions.Remove(updatePlanProduction.PlanProductionId); + } + context.SaveChanges(); + } + var machine = context.Machines.First(x => x.Id == Id); + foreach (var pc in model.MachinePlanProductions) + { + context.MachinePlanProductions.Add(new MachinePlanProduction + { + Machine = machine, + PlanProduction = context.PlanProductions.First(x => x.Id == pc.Key), + Count = pc.Value.Item2 + }); + context.SaveChanges(); + } + _machinePlanProductions = null; + } + } +} diff --git a/Factory/FactoryDatabaseImplement/Models/MachinePlanProduction.cs b/Factory/FactoryDatabaseImplement/Models/MachinePlanProduction.cs index 1c1e91c..68fde24 100644 --- a/Factory/FactoryDatabaseImplement/Models/MachinePlanProduction.cs +++ b/Factory/FactoryDatabaseImplement/Models/MachinePlanProduction.cs @@ -6,13 +6,17 @@ namespace FactoryDatabaseImplement.Models { public int Id { get; set; } - //[Required] - //public int MachineId { get; set; } + [Required] + public int MachineId { get; set; } [Required] public int PlanProductionId { get; set; } + + [Required] + public int Count { get; set; } + public virtual PlanProduction PlanProduction { get; set; } = new(); - //public virtual Machine Machine{ get; set; } = new(); + public virtual Machine Machine { get; set; } = new(); } } \ No newline at end of file diff --git a/Factory/FactoryDatabaseImplement/Models/PlanProduction.cs b/Factory/FactoryDatabaseImplement/Models/PlanProduction.cs index 8e87651..fc61170 100644 --- a/Factory/FactoryDatabaseImplement/Models/PlanProduction.cs +++ b/Factory/FactoryDatabaseImplement/Models/PlanProduction.cs @@ -22,7 +22,7 @@ namespace FactoryDatabaseImplement.Models [Required] public int Count { get; private set; } [Required] - public DateTime Term { get; private set; } + public DateTime Deadline { get; private set; } private Dictionary? _planProductionWorkpieces = null; @@ -57,7 +57,7 @@ namespace FactoryDatabaseImplement.Models Count = model.Count, ExecutionPhaseId = model.ExecutionPhaseId, ProductionName = model.ProductionName, - Term = model.Term, + Deadline = model.Deadline, Workpieces = model.PlanProductionWorkpieces.Select(x => new PlanProductionWorkpiece { Workpiece = context.Workpieces.First(y => y.Id == x.Key), @@ -75,7 +75,7 @@ namespace FactoryDatabaseImplement.Models Count = model.Count; ExecutionPhaseId = model.ExecutionPhaseId; ProductionName = model.ProductionName; - Term = model.Term; + Deadline = model.Deadline; } @@ -83,9 +83,11 @@ namespace FactoryDatabaseImplement.Models { Id = Id, ClientId = ClientId, + ClientLogin = Client.Login, ExecutionPhaseId = ExecutionPhaseId, + ExecutionPhaseName = ExecutionPhase.ExecutionPhaseName, ProductionName = ProductionName, - Term = Term, + Deadline = Deadline, Count = Count, PlanProductionWorkpieces = PlanProductionWorkpieces }; diff --git a/Factory/FactoryDatabaseImplement/Models/Product.cs b/Factory/FactoryDatabaseImplement/Models/Product.cs new file mode 100644 index 0000000..8fdf9e5 --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Models/Product.cs @@ -0,0 +1,120 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.ViewModels; +using FactoryDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace FactoryDatabaseImplement.Models +{ + public class Product : IProductModel + { + public int Id { get; private set; } + + [Required] + public int ClientId { get; private set; } + + public virtual Client Client { get; private set; } = new(); + + [Required] + public int RequirementId { get; private set; } + + public virtual Requirement Requirement { get; private set; } = new(); + + [Required] + public string ProductName { get; private set; } = string.Empty; + + public double Price { get; private set; } + + public Dictionary _productMachines { get; private set; } = new(); + + [NotMapped] + public Dictionary ProductMachines + { + get + { + if (_productMachines == null) + { + _productMachines = Machines + .ToDictionary(recPC => recPC.MachineId, recPC => (recPC.Machine as IMachineModel, recPC.Count)); + } + return _productMachines; + } + } + + [ForeignKey("ProductId")] + public virtual List Machines { get; private set; } = new(); + + [ForeignKey("ProductId")] + public virtual List Workpieces { get; private set; } = new(); + + public static Product Create(FactoryDatabase context, ProductBindingModel model) + { + if (model == null) + { + return null; + } + return new Product() + { + Id = model.Id, + ClientId = model.ClientId, + RequirementId = model.RequirementId, + ProductName = model.ProductName, + Price = model.Price, + Machines = model.ProductMachines.Select(x => new ProductMachine + { + Machine = context.Machines.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(ProductBindingModel model) + { + if (model == null) + { + return; + } + ProductName = model.ProductName; + Price = model.Price; + } + + public ProductViewModel GetViewModel => new() + { + Id = Id, + ClientId = ClientId, + RequirementId = RequirementId, + ProductName = ProductName, + ClientLogin = Client.Login, + RequirementName = Requirement.RequirementName, + Price = Price, + ProductMachines = ProductMachines, + }; + public void UpdateMachines(FactoryDatabase context, ProductBindingModel model) + { + var productMachines = context.ProductMachines.Where(rec => rec.ProductId == model.Id).ToList(); + if (productMachines != null && productMachines.Count > 0) + { + context.ProductMachines.RemoveRange(productMachines.Where(rec => !model.ProductMachines.ContainsKey(rec.MachineId))); + context.SaveChanges(); + foreach (var updateMachine in productMachines) + { + updateMachine.Count = model.ProductMachines[updateMachine.MachineId].Item2; + model.ProductMachines.Remove(updateMachine.MachineId); + } + context.SaveChanges(); + } + var machine = context.Machines.First(x => x.Id == Id); + foreach (var pc in model.ProductMachines) + { + context.ProductMachines.Add(new ProductMachine + { + Product = context.Products.First(x => x.Id == pc.Key), + Machine = machine, + Count = pc.Value.Item2 + }); + context.SaveChanges(); + } + _productMachines = null; + } + } +} diff --git a/Factory/FactoryDatabaseImplement/Models/ProductMachine.cs b/Factory/FactoryDatabaseImplement/Models/ProductMachine.cs new file mode 100644 index 0000000..e4406c8 --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Models/ProductMachine.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace FactoryDatabaseImplement.Models +{ + public class ProductMachine + { + public int Id { get; set; } + + [Required] + public int ProductId { get; set; } + + public virtual Product Product { get; set; } = new(); + + [Required] + public int MachineId { get; set; } + + public virtual Machine Machine { get; set; } = new(); + + [Required] + public int Count { get; set; } + } +} diff --git a/Factory/FactoryDatabaseImplement/Models/Requirement.cs b/Factory/FactoryDatabaseImplement/Models/Requirement.cs new file mode 100644 index 0000000..b194ed9 --- /dev/null +++ b/Factory/FactoryDatabaseImplement/Models/Requirement.cs @@ -0,0 +1,65 @@ +using FactoryContracts.BindingModels; +using FactoryContracts.ViewModels; +using FactoryDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace FactoryDatabaseImplement.Models +{ + public class Requirement : IRequirementModel + { + public int Id { get; private set; } + + [Required] + public int ClientId { get; private set; } + + public virtual Client Client { get; private set; } = new(); + + [Required] + public string RequirementName { get; private set; } = string.Empty; + + [Required] + public string Description { get; private set; } = string.Empty; + + [Required] + public int Lifetime { get; private set; } + + [ForeignKey("RequirementId")] + public virtual Product Product { get; private set; } = new(); + + public static Requirement Create(RequirementBindingModel model) + { + if (model == null) + { + return null; + } + return new Requirement() + { + Id = model.Id, + RequirementName = model.RequirementName, + Description = model.Description, + Lifetime = model.Lifetime, + ClientId = model.ClientId, + }; + } + + public void Update(RequirementBindingModel model) + { + if (model == null) + { + return; + } + RequirementName = model.RequirementName; + Description = model.Description; + } + + public RequirementViewModel GetViewModel => new() + { + Id = Id, + ClientId = ClientId, + RequirementName = RequirementName, + Lifetime = Lifetime, + ClientLogin = Client.Login, + }; + } +} diff --git a/Factory/FactoryDatabaseImplement/Models/Workpiece.cs b/Factory/FactoryDatabaseImplement/Models/Workpiece.cs index 7471cf6..30bb039 100644 --- a/Factory/FactoryDatabaseImplement/Models/Workpiece.cs +++ b/Factory/FactoryDatabaseImplement/Models/Workpiece.cs @@ -24,7 +24,7 @@ namespace FactoryDatabaseImplement.Models private Dictionary? _workpieceProducts = null; [NotMapped] - public Dictionary WorkpieceProducts + public Dictionary WorkpieceProducts { get { @@ -51,7 +51,7 @@ namespace FactoryDatabaseImplement.Models Cost = model.Cost, Material = model.Material, ClientId = model.ClientId, - Products = model.WorkpiecesProducts.Select(x => new WorkpieceProduct + Products = model.WorkpieceProducts.Select(x => new WorkpieceProduct { Product = context.Products.First(y => y.Id == x.Key), Count = x.Value.Item2 @@ -73,7 +73,8 @@ namespace FactoryDatabaseImplement.Models Cost = Cost, Material = Material, ClientId = ClientId, - WorkpiecesProducts = WorkpieceProducts + ClientLogin = Client.Login, + WorkpieceProducts = WorkpieceProducts }; public void UpdateProducts(FactoryDatabase context, WorkpieceBindingModel model) @@ -81,17 +82,17 @@ namespace FactoryDatabaseImplement.Models var workpieceProducts = context.WorkpieceProducts.Where(rec => rec.WorkpieceId == model.Id).ToList(); if (workpieceProducts != null && workpieceProducts.Count > 0) { - context.WorkpieceProducts.RemoveRange(workpieceProducts.Where(rec => !model.WorkpiecesProducts.ContainsKey(rec.ProductId))); + context.WorkpieceProducts.RemoveRange(workpieceProducts.Where(rec => !model.WorkpieceProducts.ContainsKey(rec.ProductId))); context.SaveChanges(); foreach (var updateProduct in workpieceProducts) { - updateProduct.Count = model.WorkComponents[updateProduct.ProductId].Item2; - model.WorkpiecesProducts.Remove(updateProduct.ProductId); + updateProduct.Count = model.WorkpieceProducts[updateProduct.ProductId].Item2; + model.WorkpieceProducts.Remove(updateProduct.ProductId); } context.SaveChanges(); } var workpiece = context.Workpieces.First(x => x.Id == Id); - foreach (var pc in model.WorkpiecesProducts) + foreach (var pc in model.WorkpieceProducts) { context.WorkpieceProducts.Add(new WorkpieceProduct {