diff --git a/Diner/DinerContracts/BindingModels/ImplementerBindingModel.cs b/Diner/DinerContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..419bb78 --- /dev/null +++ b/Diner/DinerContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,20 @@ +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.BindingModels { + public class ImplementerBindingModel : IImplementerModel { + public string ImplementerFIO { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public int WorkExperience { get; set; } + + public int Qualification { get; set; } + + public int ID { get; set; } + } +} diff --git a/Diner/DinerContracts/BindingModels/OrderBindingModel.cs b/Diner/DinerContracts/BindingModels/OrderBindingModel.cs index d556b47..5b66742 100644 --- a/Diner/DinerContracts/BindingModels/OrderBindingModel.cs +++ b/Diner/DinerContracts/BindingModels/OrderBindingModel.cs @@ -14,7 +14,9 @@ namespace DinerContracts.BindingModels public int ClientID { get; set; } - public int Count { get; set; } + public int? ImplementerID { get; set; } + + public int Count { get; set; } public double Sum { get; set; } @@ -25,5 +27,7 @@ namespace DinerContracts.BindingModels public DateTime? DateImplement { get; set; } public int ID { get; set; } + + public string ProductName { get; set; } = string.Empty; } } diff --git a/Diner/DinerContracts/BusinessLogicsContracts/IImplementerLogic.cs b/Diner/DinerContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..634788a --- /dev/null +++ b/Diner/DinerContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,19 @@ +using DinerContracts.BindingModels; +using DinerContracts.SearchModels; +using DinerContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.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/Diner/DinerContracts/BusinessLogicsContracts/IOrderLogic.cs b/Diner/DinerContracts/BusinessLogicsContracts/IOrderLogic.cs index 866aca8..96f829b 100644 --- a/Diner/DinerContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/Diner/DinerContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -13,10 +13,12 @@ namespace DinerContracts.BusinessLogicsContacts { List? ReadList(OrderSearchModel? model); - bool CreateOrder(OrderBindingModel model); + OrderViewModel? ReadElement(OrderSearchModel model); + + bool CreateOrder(OrderBindingModel model); bool TakeOrderInWork(OrderBindingModel model); bool FinishOrder(OrderBindingModel model); bool DeliveryOrder(OrderBindingModel model); - - } + + } } diff --git a/Diner/DinerContracts/BusinessLogicsContracts/IWorkProcess.cs b/Diner/DinerContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..a48f80e --- /dev/null +++ b/Diner/DinerContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,12 @@ +using DinerContracts.BusinessLogicsContacts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.BusinessLogicsContracts { + public interface IWorkProcess { + void Work(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } +} diff --git a/Diner/DinerContracts/SearchModels/ImplementerSearchModel.cs b/Diner/DinerContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..f22ad3e --- /dev/null +++ b/Diner/DinerContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,20 @@ +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.SearchModels { + public class ImplementerSearchModel { + public string? ImplementerFIO { get; set; } + + public string? Password { get; set; } + + public int? WorkExperience { get; set; } + + public int? Qualification { get; set; } + + public int? ID { get; set; } + } +} diff --git a/Diner/DinerContracts/SearchModels/OrderSearchModel.cs b/Diner/DinerContracts/SearchModels/OrderSearchModel.cs index afb6e2c..6100f4d 100644 --- a/Diner/DinerContracts/SearchModels/OrderSearchModel.cs +++ b/Diner/DinerContracts/SearchModels/OrderSearchModel.cs @@ -1,6 +1,8 @@ -using System; +using DinerDataModels.Enums; +using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Text; using System.Threading.Tasks; @@ -11,6 +13,8 @@ namespace DinerContracts.SearchModels public int? ID { get; set; } public DateTime? DateFrom { get; set; } public int? ClientID { get; set; } + public int? ImplementerID { get; set; } public DateTime? DateTo { get; set; } + public OrderStatus Status { get; set; } } } diff --git a/Diner/DinerContracts/StoragesContracts/IImplementerStorage.cs b/Diner/DinerContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..4b68935 --- /dev/null +++ b/Diner/DinerContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,20 @@ +using DinerContracts.BindingModels; +using DinerContracts.SearchModels; +using DinerContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.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/Diner/DinerContracts/ViewModels/ImplementerViewModel.cs b/Diner/DinerContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..e420dfb --- /dev/null +++ b/Diner/DinerContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,26 @@ +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.ViewModels { + public class ImplementerViewModel : IImplementerModel { + + [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; } + + public int ID { get; set; } + } +} diff --git a/Diner/DinerContracts/ViewModels/OrderViewModel.cs b/Diner/DinerContracts/ViewModels/OrderViewModel.cs index 31994ed..7a00d33 100644 --- a/Diner/DinerContracts/ViewModels/OrderViewModel.cs +++ b/Diner/DinerContracts/ViewModels/OrderViewModel.cs @@ -9,17 +9,17 @@ using System.Threading.Tasks; namespace DinerContracts.ViewModels { - public class OrderViewModel : IOrderModel - { + public class OrderViewModel : IOrderModel { public int ClientID { get; set; } public int SnackID { get; set; } + public int? ImplementerID { get; set; } [DisplayName("Количество")] public int Count { get; set; } [DisplayName("Сумма")] - public double Sum { get; set; } + public double Sum { get; set; } [DisplayName("Статус")] public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; @@ -39,5 +39,8 @@ namespace DinerContracts.ViewModels [DisplayName("Клиент")] public string ClientFIO { get; set; } = string.Empty; + + [DisplayName("Исполнитель")] + public string? ImplementerFIO { get; set; } = string.Empty; } } diff --git a/Diner/DinerDataBaseImplement/DinerDataBase.cs b/Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs similarity index 72% rename from Diner/DinerDataBaseImplement/DinerDataBase.cs rename to Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs index d9dd3ba..ebab4e9 100644 --- a/Diner/DinerDataBaseImplement/DinerDataBase.cs +++ b/Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs @@ -3,11 +3,11 @@ using Microsoft.EntityFrameworkCore; namespace DinerDataBaseImplement { - public class DinerDataBase : DbContext + public class DinerDatabaseBy6Work : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-O0N00SH\SQLEXPRESS;Initial Catalog=DinerDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-O0N00SH\SQLEXPRESS;Initial Catalog=DinerDatabaseBy6Work;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } @@ -16,5 +16,6 @@ namespace DinerDataBaseImplement public virtual DbSet ProductComponents { get; set; } public virtual DbSet Orders { get; set; } public virtual DbSet Clients { get; set; } + public virtual DbSet Implementers { get; set; } } } \ No newline at end of file diff --git a/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs b/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs index 39b2a25..c1d9cb2 100644 --- a/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs @@ -18,7 +18,7 @@ namespace DinerDataBaseImplement.Implements { if (newClient == null) { return null; } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); context.Clients.Add(newClient); context.SaveChanges(); @@ -29,7 +29,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? Update(ClientBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var client = context.Clients.FirstOrDefault(x => x.ID == model.ID); if (client == null) { return null; @@ -40,7 +40,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? Delete(ClientBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var element = context.Clients.FirstOrDefault(x => x.ID == model.ID); if (element != null) { context.Clients.Remove(element); @@ -51,7 +51,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? GetElement(ClientSearchModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); if (model.ID.HasValue) { return context.Clients .Include(x => x.Orders) @@ -71,7 +71,7 @@ namespace DinerDataBaseImplement.Implements { if (string.IsNullOrEmpty(model.ClientFIO)) { return new(); } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Clients .Include(x => x.Orders) @@ -81,7 +81,7 @@ namespace DinerDataBaseImplement.Implements { } public List GetFullList() { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Clients .Include(x => x.Orders) diff --git a/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs b/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs index 44d0bbc..df26f66 100644 --- a/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs @@ -16,7 +16,7 @@ namespace DinerDataBaseImplement.Implements { public FoodViewModel? Delete(FoodBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var element = context.Components.FirstOrDefault(x => x.ID == model.ID); if (element != null) { @@ -32,7 +32,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ComponentName) && !model.ID.HasValue) { return null; } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Components .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) || model.ID.HasValue && @@ -45,7 +45,7 @@ namespace DinerDataBaseImplement.Implements return new(); } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Components.Where(x => x.ComponentName.Contains(model.ComponentName)) .Select(x => x.GetViewModel).ToList(); @@ -53,7 +53,7 @@ namespace DinerDataBaseImplement.Implements public List GetFullList() { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Components.Select(x => x.GetViewModel).ToList(); } @@ -63,7 +63,7 @@ namespace DinerDataBaseImplement.Implements if (newComponent == null) { return null; } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); context.Components.Add(newComponent); context.SaveChanges(); return newComponent.GetViewModel; @@ -71,7 +71,7 @@ namespace DinerDataBaseImplement.Implements public FoodViewModel? Update(FoodBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var component = context.Components.FirstOrDefault(x => x.ID == model.ID); if (component == null) { return null; diff --git a/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs b/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..8ec23a4 --- /dev/null +++ b/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,89 @@ +using DinerContracts.BindingModels; +using DinerContracts.SearchModels; +using DinerContracts.StoragesContracts; +using DinerContracts.ViewModels; +using DinerDataBaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; + +namespace DinerDataBaseImplement.Implements { + public class ImplementerStorage : IImplementerStorage { + + public ImplementerViewModel? Insert(ImplementerBindingModel model) { + var newImplementer = Implementer.Create(model); + if (newImplementer == null) { + return null; + } + using var context = new DinerDatabaseBy6Work(); + context.Implementers.Add(newImplementer); + context.SaveChanges(); + + return context.Implementers + .Include(x => x.Orders) + .FirstOrDefault(x => x.ID == newImplementer.ID) + ?.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) { + using var context = new DinerDatabaseBy6Work(); + 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 DinerDatabaseBy6Work(); + var element = context.Implementers.FirstOrDefault(x => x.ID == model.ID); + if (element != null) { + context.Implementers.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) { + using var context = new DinerDatabaseBy6Work(); + if (model.ID.HasValue) { + return context.Implementers + .Include(x => x.Orders) + .FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID) + ?.GetViewModel; + } + return new(); + } + + public List GetFilteredList(ImplementerSearchModel model) { + if (string.IsNullOrEmpty(model.ImplementerFIO)) { + return new(); + } + using var context = new DinerDatabaseBy6Work(); + + return context.Implementers + .Include(x => x.Orders) + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFullList() { + using var context = new DinerDatabaseBy6Work(); + + return context.Implementers + .Include(x => x.Orders) + .Select(x => x.GetViewModel) + .ToList(); + } + + + } +} diff --git a/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs b/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs index 06008cd..016959e 100644 --- a/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs @@ -16,7 +16,7 @@ namespace DinerDataBaseImplement.Implements { public OrderViewModel? Delete(OrderBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var element = context.Orders.FirstOrDefault(x => x.ID == model.ID); if (element != null) { @@ -32,21 +32,21 @@ namespace DinerDataBaseImplement.Implements if (!model.ID.HasValue) { return null; } - using var context = new DinerDataBase(); - return context.Orders - .Include(x => x.Snack) - .Include(x => x.Client) - .FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID) - ?.GetViewModel; - } + using var context = new DinerDatabaseBy6Work(); + return context.Orders.Include(x => x.Snack) + .Include(x => x.Client) + .FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID)?.GetViewModel; + + } public List GetFilteredList(OrderSearchModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); if (!model.ID.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { return context.Orders .Include(x => x.Snack) .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) .Select(x => x.GetViewModel) .ToList(); @@ -55,6 +55,7 @@ namespace DinerDataBaseImplement.Implements return context.Orders .Include(x => x.Snack) .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => x.ID == model.ID) .Select(x => x.GetViewModel) .ToList(); @@ -63,21 +64,29 @@ namespace DinerDataBaseImplement.Implements return context.Orders .Include(x => x.Snack) .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => x.ClientID == model.ClientID) .Select(x => x.GetViewModel) .ToList(); } - return new(); + return context.Orders + .Include(x => x.Snack) + .Include(x => x.Client) + .Include(x => x.Implementer) + .Where(x => model.Status == x.Status) + .Select(x => x.GetViewModel) + .ToList(); } public List GetFullList() { - using var context = new DinerDataBase(); - return context.Orders.Include(x => x.Snack).Include(x => x.Client).Select(x => x.GetViewModel).ToList(); + using var context = new DinerDatabaseBy6Work(); + return context.Orders.Include(x => x.Snack).Include(x => x.Client).Include(x => x.Implementer) + .Select(x => x.GetViewModel).ToList(); } public OrderViewModel? Insert(OrderBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var newOrder = Order.Create(model); if (newOrder == null) { return null; @@ -85,11 +94,11 @@ namespace DinerDataBaseImplement.Implements context.Orders.Add(newOrder); context.SaveChanges(); return context.Orders.Include(x => x.Snack) - .Include(x => x.Client) - .FirstOrDefault(x => x.ID == newOrder.ID)?.GetViewModel; + .Include(x => x.Client) + .FirstOrDefault(x => x.ID == newOrder.ID)?.GetViewModel; } public OrderViewModel? Update(OrderBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var order = context.Orders.FirstOrDefault(x => x.ID == model.ID); if (order == null) { return null; } order.Update(model); @@ -97,6 +106,7 @@ namespace DinerDataBaseImplement.Implements return context.Orders .Include(x => x.Snack) .Include(x => x.Client) + .Include(x => x.Implementer) .FirstOrDefault(x => x.ID == model.ID)? .GetViewModel; } diff --git a/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs b/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs index 85390bc..605e770 100644 --- a/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs @@ -17,7 +17,7 @@ namespace DinerDataBaseImplement.Implements { public SnackViewModel? Delete(SnackBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var element = context.Snacks .Include(x => x.Components) .Include(x => x.Orders) @@ -36,7 +36,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ProductName) && !model.ID.HasValue) { return null; } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component) @@ -50,7 +50,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ProductName)) { return new(); } - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component) @@ -61,7 +61,7 @@ namespace DinerDataBaseImplement.Implements public List GetFullList() { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component).ToList() @@ -70,7 +70,7 @@ namespace DinerDataBaseImplement.Implements public SnackViewModel? Insert(SnackBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); var newProduct = Snack.Create(context, model); if (newProduct == null) { return null; @@ -82,7 +82,7 @@ namespace DinerDataBaseImplement.Implements public SnackViewModel? Update(SnackBindingModel model) { - using var context = new DinerDataBase(); + using var context = new DinerDatabaseBy6Work(); using var transcation = context.Database.BeginTransaction(); try { diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs new file mode 100644 index 0000000..97a8c40 --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs @@ -0,0 +1,260 @@ +// +using System; +using DinerDataBaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + [DbContext(typeof(DinerDatabaseBy6Work))] + [Migration("20240513154945_InitMigration")] + partial class InitMigration + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerID") + .IsRequired() + .HasColumnType("int"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.HasIndex("ClientID"); + + b.HasIndex("ImplementerID"); + + b.HasIndex("SnackID"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Snacks"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.HasIndex("ComponentID"); + + b.HasIndex("SnackID"); + + b.ToTable("ProductComponents"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.HasOne("DinerDataBaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") + .WithMany("Orders") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + + b.Navigation("Snack"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.HasOne("DinerDataBaseImplement.Models.Food", "Component") + .WithMany("SnackFood") + .HasForeignKey("ComponentID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") + .WithMany("Components") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Navigation("SnackFood"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.cs b/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs similarity index 81% rename from Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.cs rename to Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs index d1af37c..fb50314 100644 --- a/Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.cs +++ b/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs @@ -40,6 +40,22 @@ namespace DinerDataBaseImplement.Migrations table.PrimaryKey("PK_Components", x => x.ID); }); + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + ID = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ImplementerFIO = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false), + WorkExperience = table.Column(type: "int", nullable: false), + Qualification = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.ID); + }); + migrationBuilder.CreateTable( name: "Snacks", columns: table => new @@ -62,6 +78,7 @@ namespace DinerDataBaseImplement.Migrations .Annotation("SqlServer:Identity", "1, 1"), SnackID = table.Column(type: "int", nullable: false), ClientID = table.Column(type: "int", nullable: false), + ImplementerID = table.Column(type: "int", nullable: false), Count = table.Column(type: "int", nullable: false), Sum = table.Column(type: "float", nullable: false), Status = table.Column(type: "int", nullable: false), @@ -77,6 +94,12 @@ namespace DinerDataBaseImplement.Migrations principalTable: "Clients", principalColumn: "ID", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerID", + column: x => x.ImplementerID, + principalTable: "Implementers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_Orders_Snacks_SnackID", column: x => x.SnackID, @@ -117,6 +140,11 @@ namespace DinerDataBaseImplement.Migrations table: "Orders", column: "ClientID"); + migrationBuilder.CreateIndex( + name: "IX_Orders_ImplementerID", + table: "Orders", + column: "ImplementerID"); + migrationBuilder.CreateIndex( name: "IX_Orders_SnackID", table: "Orders", @@ -145,6 +173,9 @@ namespace DinerDataBaseImplement.Migrations migrationBuilder.DropTable( name: "Clients"); + migrationBuilder.DropTable( + name: "Implementers"); + migrationBuilder.DropTable( name: "Components"); diff --git a/Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs similarity index 81% rename from Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.Designer.cs rename to Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs index 079f0bc..e9272b3 100644 --- a/Diner/DinerDataBaseImplement/Migrations/20240511111831_InitMigration.Designer.cs +++ b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs @@ -11,9 +11,9 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DinerDataBaseImplement.Migrations { - [DbContext(typeof(DinerDataBase))] - [Migration("20240511111831_InitMigration")] - partial class InitMigration + [DbContext(typeof(DinerDatabaseBy6Work))] + [Migration("20240513162929_Migration01")] + partial class Migration01 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -70,6 +70,33 @@ namespace DinerDataBaseImplement.Migrations b.ToTable("Components"); }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => { b.Property("ID") @@ -90,6 +117,9 @@ namespace DinerDataBaseImplement.Migrations b.Property("DateImplement") .HasColumnType("datetime2"); + b.Property("ImplementerID") + .HasColumnType("int"); + b.Property("SnackID") .HasColumnType("int"); @@ -103,6 +133,8 @@ namespace DinerDataBaseImplement.Migrations b.HasIndex("ClientID"); + b.HasIndex("ImplementerID"); + b.HasIndex("SnackID"); b.ToTable("Orders"); @@ -162,6 +194,10 @@ namespace DinerDataBaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerID"); + b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") .WithMany("Orders") .HasForeignKey("SnackID") @@ -170,6 +206,8 @@ namespace DinerDataBaseImplement.Migrations b.Navigation("Client"); + b.Navigation("Implementer"); + b.Navigation("Snack"); }); @@ -202,6 +240,11 @@ namespace DinerDataBaseImplement.Migrations b.Navigation("SnackFood"); }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => { b.Navigation("Components"); diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs new file mode 100644 index 0000000..8f20dcb --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + /// + public partial class Migration01 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Orders_Implementers_ImplementerID", + table: "Orders"); + + migrationBuilder.AlterColumn( + name: "ImplementerID", + table: "Orders", + type: "int", + nullable: true, + oldClrType: typeof(int), + oldType: "int"); + + migrationBuilder.AddForeignKey( + name: "FK_Orders_Implementers_ImplementerID", + table: "Orders", + column: "ImplementerID", + principalTable: "Implementers", + principalColumn: "ID"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Orders_Implementers_ImplementerID", + table: "Orders"); + + migrationBuilder.AlterColumn( + name: "ImplementerID", + table: "Orders", + type: "int", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "int", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Orders_Implementers_ImplementerID", + table: "Orders", + column: "ImplementerID", + principalTable: "Implementers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs new file mode 100644 index 0000000..e7af826 --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs @@ -0,0 +1,261 @@ +// +using System; +using DinerDataBaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + [DbContext(typeof(DinerDatabaseBy6Work))] + [Migration("20240515115440_Migration02")] + partial class Migration02 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerID") + .HasColumnType("int"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.HasIndex("ClientID"); + + b.HasIndex("ImplementerID"); + + b.HasIndex("SnackID"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Snacks"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.HasIndex("ComponentID"); + + b.HasIndex("SnackID"); + + b.ToTable("ProductComponents"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.HasOne("DinerDataBaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerID"); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") + .WithMany("Orders") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + + b.Navigation("Snack"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.HasOne("DinerDataBaseImplement.Models.Food", "Component") + .WithMany("SnackFood") + .HasForeignKey("ComponentID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") + .WithMany("Components") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Navigation("SnackFood"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs b/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs new file mode 100644 index 0000000..ba3258d --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + /// + public partial class Migration02 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProductName", + table: "Orders", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProductName", + table: "Orders"); + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs new file mode 100644 index 0000000..8070078 --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs @@ -0,0 +1,257 @@ +// +using System; +using DinerDataBaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + [DbContext(typeof(DinerDatabaseBy6Work))] + [Migration("20240515121617_Migration03")] + partial class Migration03 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ClientID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerID") + .HasColumnType("int"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.HasIndex("ClientID"); + + b.HasIndex("ImplementerID"); + + b.HasIndex("SnackID"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.ToTable("Snacks"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ComponentID") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SnackID") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.HasIndex("ComponentID"); + + b.HasIndex("SnackID"); + + b.ToTable("ProductComponents"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => + { + b.HasOne("DinerDataBaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerID"); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") + .WithMany("Orders") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + + b.Navigation("Snack"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => + { + b.HasOne("DinerDataBaseImplement.Models.Food", "Component") + .WithMany("SnackFood") + .HasForeignKey("ComponentID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") + .WithMany("Components") + .HasForeignKey("SnackID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => + { + b.Navigation("SnackFood"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs new file mode 100644 index 0000000..972c43c --- /dev/null +++ b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DinerDataBaseImplement.Migrations +{ + /// + public partial class Migration03 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProductName", + table: "Orders"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProductName", + table: "Orders", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + } + } +} diff --git a/Diner/DinerDataBaseImplement/Migrations/DinerDataBaseModelSnapshot.cs b/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs similarity index 81% rename from Diner/DinerDataBaseImplement/Migrations/DinerDataBaseModelSnapshot.cs rename to Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs index 57ee7ab..f785777 100644 --- a/Diner/DinerDataBaseImplement/Migrations/DinerDataBaseModelSnapshot.cs +++ b/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs @@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DinerDataBaseImplement.Migrations { - [DbContext(typeof(DinerDataBase))] - partial class DinerDataBaseModelSnapshot : ModelSnapshot + [DbContext(typeof(DinerDatabaseBy6Work))] + partial class DinerDatabaseBy6WorkModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { @@ -67,6 +67,33 @@ namespace DinerDataBaseImplement.Migrations b.ToTable("Components"); }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => { b.Property("ID") @@ -87,6 +114,9 @@ namespace DinerDataBaseImplement.Migrations b.Property("DateImplement") .HasColumnType("datetime2"); + b.Property("ImplementerID") + .HasColumnType("int"); + b.Property("SnackID") .HasColumnType("int"); @@ -100,6 +130,8 @@ namespace DinerDataBaseImplement.Migrations b.HasIndex("ClientID"); + b.HasIndex("ImplementerID"); + b.HasIndex("SnackID"); b.ToTable("Orders"); @@ -159,6 +191,10 @@ namespace DinerDataBaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerID"); + b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") .WithMany("Orders") .HasForeignKey("SnackID") @@ -167,6 +203,8 @@ namespace DinerDataBaseImplement.Migrations b.Navigation("Client"); + b.Navigation("Implementer"); + b.Navigation("Snack"); }); @@ -199,6 +237,11 @@ namespace DinerDataBaseImplement.Migrations b.Navigation("SnackFood"); }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => { b.Navigation("Components"); diff --git a/Diner/DinerDataBaseImplement/Models/Implementer.cs b/Diner/DinerDataBaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..1d8ef00 --- /dev/null +++ b/Diner/DinerDataBaseImplement/Models/Implementer.cs @@ -0,0 +1,62 @@ +using DinerContracts.BindingModels; +using DinerContracts.ViewModels; +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerDataBaseImplement.Models { + public class Implementer : IImplementerModel { + + [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; } + + public int ID { get; set; } + + [ForeignKey("ImplementerID")] + public virtual List Orders { get; set; } = new(); + + public static Implementer? Create(ImplementerBindingModel? model) { + if (model == null) { + return null; + } + return new Implementer() { + ImplementerFIO = model.ImplementerFIO, + Password = model.Password, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + ID = model.ID + }; + } + + public void Update(ImplementerBindingModel? model) { + if (model == null) { + return; + } + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + Qualification = model.Qualification; + } + + public ImplementerViewModel GetViewModel => new() { + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + ID = ID + }; + } +} diff --git a/Diner/DinerDataBaseImplement/Models/Order.cs b/Diner/DinerDataBaseImplement/Models/Order.cs index b4b7f56..f1f3eec 100644 --- a/Diner/DinerDataBaseImplement/Models/Order.cs +++ b/Diner/DinerDataBaseImplement/Models/Order.cs @@ -1,21 +1,25 @@ using DinerContracts.BindingModels; using DinerContracts.ViewModels; using DinerDataBaseImplement.Implements; +using DinerDataBaseImplement.Migrations; using DinerDataModels.Enums; using DinerDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Net.Http.Headers; using System.Xml.Linq; namespace DinerDataBaseImplement.Models { public class Order : IOrderModel { - [Required] + [ForeignKey("SnackID")] public int SnackID { get; set; } [Required] public int ClientID { get; set; } + public int? ImplementerID { get; set; } [Required] public int Count { get; set; } @@ -34,8 +38,9 @@ namespace DinerDataBaseImplement.Models public virtual Snack Snack { get; set; } public virtual Client Client { get; set; } + public virtual Implementer? Implementer { get; set; } - public static Order? Create(OrderBindingModel? model) + public static Order? Create(OrderBindingModel model) { if (model == null) return null; return new Order() @@ -47,18 +52,21 @@ namespace DinerDataBaseImplement.Models Status = model.Status, DateCreate = model.DateCreate, DateImplement = model.DateImplement, - ClientID = model.ClientID + ClientID = model.ClientID, + ImplementerID = model.ImplementerID, }; } public void Update(OrderBindingModel? model) { if (model == null) return; - Sum = model.Sum; + if (model.Sum != 0) { + Sum = model.Sum; + } Status = model.Status; DateImplement = model?.DateImplement; - } - public OrderViewModel GetViewModel => new() - { + ImplementerID = model?.ImplementerID; + } + public OrderViewModel GetViewModel => new() { ID = ID, SnackID = SnackID, Count = Count, @@ -66,10 +74,12 @@ namespace DinerDataBaseImplement.Models Status = Status, DateCreate = DateCreate, DateImplement = DateImplement, - ProductName = Snack.ProductName, ClientID = ClientID, - ClientFIO = Client.ClientFIO + ImplementerID = ImplementerID, + ClientFIO = Client.ClientFIO, + ImplementerFIO = Implementer?.ImplementerFIO, + ProductName = Snack.ProductName }; - - } + }; } + diff --git a/Diner/DinerDataBaseImplement/Models/Snack.cs b/Diner/DinerDataBaseImplement/Models/Snack.cs index 484e738..74666b5 100644 --- a/Diner/DinerDataBaseImplement/Models/Snack.cs +++ b/Diner/DinerDataBaseImplement/Models/Snack.cs @@ -44,7 +44,7 @@ namespace DinerDataBaseImplement.Models [ForeignKey("SnackID")] public virtual List Orders { get; set; } = new(); - public static Snack? Create(DinerDataBase context,SnackBindingModel model) + public static Snack? Create(DinerDatabaseBy6Work context,SnackBindingModel model) { return new Snack() { @@ -72,7 +72,7 @@ namespace DinerDataBaseImplement.Models ProductComponents = ProductComponents }; - public void UpdateComponents(DinerDataBase context, SnackBindingModel model) { + public void UpdateComponents(DinerDatabaseBy6Work context, SnackBindingModel model) { var productComponents = context.ProductComponents.Where(rec => rec.SnackID == model.ID).ToList(); if (ProductComponents != null && ProductComponents.Count > 0) { context.ProductComponents.RemoveRange(productComponents.Where(rec => !model.ProductComponents.ContainsKey(rec.ComponentID))); diff --git a/Diner/DinerDataModels/Models/IImplementerModel.cs b/Diner/DinerDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..fc13188 --- /dev/null +++ b/Diner/DinerDataModels/Models/IImplementerModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerDataModels.Models { + public interface IImplementerModel : IID { + string ImplementerFIO { get; } + string Password { get; } + int WorkExperience { get; } + int Qualification { get; } + } +} diff --git a/Diner/DinerDataModels/Models/IOrderModel.cs b/Diner/DinerDataModels/Models/IOrderModel.cs index 4701d7a..0420de5 100644 --- a/Diner/DinerDataModels/Models/IOrderModel.cs +++ b/Diner/DinerDataModels/Models/IOrderModel.cs @@ -11,7 +11,9 @@ namespace DinerDataModels.Models { int SnackID { get; } int Count { get; } - double Sum { get; } + int ClientID { get; } + int? ImplementerID { get; } + double Sum { get; } OrderStatus Status { get; } DateTime DateCreate { get; } DateTime? DateImplement { get; } diff --git a/Diner/DinerListImplement/DataListSingleton.cs b/Diner/DinerListImplement/DataListSingleton.cs index 37ff0c8..e6819c5 100644 --- a/Diner/DinerListImplement/DataListSingleton.cs +++ b/Diner/DinerListImplement/DataListSingleton.cs @@ -15,12 +15,14 @@ namespace DinerListImplement public List Snacks { get; set; } public List Orders { get; set; } public List Clients { get; set; } + public List Implementers { get; set; } private DataListSingleton() { Foods = new List(); Snacks = new List(); Orders = new List(); Clients = new List(); + Implementers = new List(); } public static DataListSingleton GetInstance() { if (_instance == null) _instance = new DataListSingleton(); diff --git a/Diner/DinerListImplement/Implements/ClientStorage.cs b/Diner/DinerListImplement/Implements/ClientStorage.cs index 5b96ff5..7d41eca 100644 --- a/Diner/DinerListImplement/Implements/ClientStorage.cs +++ b/Diner/DinerListImplement/Implements/ClientStorage.cs @@ -22,7 +22,7 @@ namespace DinerListImplement.Implements { model.ID = 1; foreach (var client in _source.Clients) { if (model.ID <= client.ID) { - model.ID = client.ID; + model.ID = client.ID + 1; } } var newClient = Client.Create(model); diff --git a/Diner/DinerListImplement/Implements/ImplementerStorage.cs b/Diner/DinerListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..e425706 --- /dev/null +++ b/Diner/DinerListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,95 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; +using DinerContracts.StoragesContracts; +using DinerContracts.ViewModels; +using DinerListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerListImplement.Implements { + public class ImplementerStorage : IImplementerStorage { + + private readonly DataListSingleton _source; + + public ImplementerStorage() { + _source = DataListSingleton.GetInstance(); + } + + 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 element = _source.Implementers[i]; + _source.Implementers.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.ID.HasValue) { + return null; + } + foreach (var implementer in _source.Implementers) { + if ((!string.IsNullOrEmpty(model.ImplementerFIO) && + implementer.ImplementerFIO == model.ImplementerFIO) || + (model.ID.HasValue && implementer.ID == model.ID)) { + return implementer.GetViewModel; + } + } + return null; + } + + public List GetFilteredList(ImplementerSearchModel model) { + var result = new List(); + if (string.IsNullOrEmpty(model.ImplementerFIO)) { + return result; + } + foreach (var implementer in _source.Implementers) { + if (implementer.ImplementerFIO.Contains(model.ImplementerFIO)) { + result.Add(implementer.GetViewModel); + } + } + return result; + } + + public List GetFullList() { + var result = new List(); + foreach (var implementer in _source.Implementers) { + result.Add(implementer.GetViewModel); + } + return result; + } + + + } +} diff --git a/Diner/DinerListImplement/Models/Implementer.cs b/Diner/DinerListImplement/Models/Implementer.cs new file mode 100644 index 0000000..149fece --- /dev/null +++ b/Diner/DinerListImplement/Models/Implementer.cs @@ -0,0 +1,50 @@ +using DinerContracts.BindingModels; +using DinerContracts.ViewModels; +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerListImplement.Models { + public class Implementer : IImplementerModel { + public string ImplementerFIO { get; private set; } = string.Empty; + + public string Password { get; private set; } = string.Empty; + + public int WorkExperience { get; private set; } + + public int Qualification { get; private set; } + + public int ID { get; set; } + + public static Implementer? Create(ImplementerBindingModel? model) { + if (model == null) { + return null; + } + return new Implementer() { + 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; + Qualification = model.Qualification; + } + + public ImplementerViewModel GetViewModel => new() { + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + ID = ID + }; + } +} diff --git a/Diner/DinerListImplement/Models/Order.cs b/Diner/DinerListImplement/Models/Order.cs index 41ce708..49b659f 100644 --- a/Diner/DinerListImplement/Models/Order.cs +++ b/Diner/DinerListImplement/Models/Order.cs @@ -14,6 +14,10 @@ namespace DinerListImplement.Models { public int SnackID { 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; } @@ -26,6 +30,12 @@ namespace DinerListImplement.Models public int ID { get; private set; } + public string? ProductName { get; private set; } + + public string? ClientFIO { get; private set; } + + public string? ImplementerFIO { get; private set; } + public static Order? Create(OrderBindingModel? model) { if (model == null) return null; return new Order() @@ -37,6 +47,8 @@ namespace DinerListImplement.Models Status = model.Status, DateCreate = model.DateCreate, DateImplement = model.DateImplement, + ClientID = model.ClientID, + ImplementerID = model.ImplementerID, }; } public void Update(OrderBindingModel? model) { @@ -52,7 +64,12 @@ namespace DinerListImplement.Models Sum = Sum, Status = Status, DateCreate = DateCreate, - DateImplement = DateImplement + DateImplement = DateImplement, + ClientID = ClientID, + ImplementerID = ImplementerID, + ProductName = ProductName, + ClientFIO = ClientFIO, + ImplementerFIO = ImplementerFIO }; } } diff --git a/Diner/DinerRestAPI/Program.cs b/Diner/DinerRestAPI/Program.cs index eb7762b..c01ec09 100644 --- a/Diner/DinerRestAPI/Program.cs +++ b/Diner/DinerRestAPI/Program.cs @@ -4,6 +4,7 @@ using DinerContracts.BusinessLogicsContracts; using DinerContracts.StoragesContracts; using DinerDataBaseImplement.Implements; using DineryBusinessLogic.BusinessLogic; +using DocumentFormat.OpenXml.VariantTypes; using Microsoft.OpenApi.Models; namespace DinerRestAPI { @@ -17,10 +18,12 @@ namespace DinerRestAPI { builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); + builder.Services.AddTransient(); // Add services to the container. diff --git a/Diner/DinerRestApi/Controllers/ImplementerController.cs b/Diner/DinerRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..25fe1e3 --- /dev/null +++ b/Diner/DinerRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,89 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContacts; +using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; +using DinerContracts.ViewModels; +using DinerDataModels.Enums; +using DocumentFormat.OpenXml.Office2010.PowerPoint; +using Microsoft.AspNetCore.Mvc; + +namespace DinerRestApi.Controllers { + + [Route("api/[controller]/[action]")] + [ApiController] + + public class ImplementerController : Controller { + + private readonly ILogger _logger; + private readonly IOrderLogic _order; + private readonly IImplementerLogic _logic; + + public ImplementerController(ILogger logger, IOrderLogic order, IImplementerLogic implementerLogic) { + _logger = logger; + _order = order; + _logic = implementerLogic; + } + + [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? GetNewOrderss() { + 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, $"Ошибка перевода заказа с №{model.ID} в работу"); + throw; + } + } + + [HttpPost] + public void FinishOrder(OrderBindingModel model) { + try { + _order.FinishOrder(model); + } + catch (Exception ex) { + _logger.LogError(ex, $"Ошибка отметки о готовности заказа с №{model.ID}"); + throw; + } + } + } +} diff --git a/Diner/DinerShopImplement/DataFileSingleton.cs b/Diner/DinerShopImplement/DataFileSingleton.cs index eb85557..5d51c21 100644 --- a/Diner/DinerShopImplement/DataFileSingleton.cs +++ b/Diner/DinerShopImplement/DataFileSingleton.cs @@ -20,16 +20,20 @@ namespace DinerFileImplement private readonly string ClientFileName = "Client.xml"; + private readonly string ImplementerFileName = "Implementer.xml"; + public List Foods { get; set; } public List Orders { get; private set; } public List Snacks { get; private set; } public List Clients { get; private set; } + public List Implementers { get; private set; } private DataFileSingleton() { Foods = LoadData(FoodFileName, "Food", x => Food.Create(x)!)!; Snacks = LoadData(SnackFileName, "Snack", x => Snack.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)!)!; } public static DataFileSingleton GetInstance() { if (instance == null) instance = new DataFileSingleton(); @@ -42,7 +46,9 @@ namespace DinerFileImplement public void SaveOrder() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClient() => SaveData(Clients, ClientFileName, "Clients", - x => x.GetXElement); + x => x.GetXElement); + public void SaveImplementer() => SaveData(Implementers, ImplementerFileName, "Implementers", + x => x.GetXElement); private static void SaveData(List data, string filename, string xmlNodeName, Func selectFunction) diff --git a/Diner/DinerShopImplement/Implements/ImplementerStorage.cs b/Diner/DinerShopImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..fc30d04 --- /dev/null +++ b/Diner/DinerShopImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,75 @@ +using DinerContracts.BindingModels; +using DinerContracts.SearchModels; +using DinerContracts.StoragesContracts; +using DinerContracts.ViewModels; +using DinerFileImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerFileImplement.Implements { + public class ImplementerStorage : IImplementerStorage { + + private readonly DataFileSingleton _source; + + private ImplementerStorage() { + _source = DataFileSingleton.GetInstance(); + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) { + model.ID = _source.Implementers.Count > 0 ? _source.Implementers.Max(x => x.ID) + 1 : 1; + var newImplementer = Implementer.Create(model); + if (newImplementer == null) { + return null; + } + _source.Implementers.Add(newImplementer); + _source.SaveImplementer(); + return newImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) { + var implementer = _source.Implementers.FirstOrDefault(x => x.ID == model.ID); + if (implementer == null) { + return null; + } + implementer.Update(model); + _source.SaveImplementer(); + return implementer.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) { + var element = _source.Implementers.FirstOrDefault(x => x.ID == model.ID); + if ( element != null) { + _source.Implementers.Remove(element); + _source.SaveImplementer(); + return element.GetViewModel; + } + return null; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.ID.HasValue) { + return null; + } + return _source.Implementers.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ImplementerFIO) && + x.ImplementerFIO == model.ImplementerFIO) || + model.ID.HasValue && x.ID == model.ID)?.GetViewModel; + } + + public List GetFilteredList(ImplementerSearchModel model) { + if (string.IsNullOrEmpty(model.ImplementerFIO)) { + return new(); + } + return _source.Implementers.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Select(x => x.GetViewModel).ToList(); + } + + public List GetFullList() { + return _source.Implementers.Select(x => x.GetViewModel).ToList(); + } + + + } +} diff --git a/Diner/DinerShopImplement/Models/Client.cs b/Diner/DinerShopImplement/Models/Client.cs index 9d198de..8cbbea9 100644 --- a/Diner/DinerShopImplement/Models/Client.cs +++ b/Diner/DinerShopImplement/Models/Client.cs @@ -1,4 +1,4 @@ -using DinerContracts.BindingModels; + using DinerContracts.BindingModels; using DinerContracts.ViewModels; using DinerDataModels.Models; using System; @@ -57,6 +57,6 @@ namespace DinerFileImplement.Models { public XElement GetXElement => new("Client", new XAttribute("ID", ID), new XElement("ClientFIO", ClientFIO), new XElement("Email", Email), - new XElement("Password", Password.ToString())); + new XElement("Password", Password)); } } diff --git a/Diner/DinerShopImplement/Models/Implementer.cs b/Diner/DinerShopImplement/Models/Implementer.cs new file mode 100644 index 0000000..5775c76 --- /dev/null +++ b/Diner/DinerShopImplement/Models/Implementer.cs @@ -0,0 +1,70 @@ +using DinerContracts.BindingModels; +using DinerContracts.ViewModels; +using DinerDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace DinerFileImplement.Models { + public class Implementer : IImplementerModel { + public string ImplementerFIO { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + + public int WorkExperience { get; set; } + + public int Qualification { get; set; } + + public int ID { get; set; } + + public static Implementer? Create(ImplementerBindingModel? model) { + if (model == null) { + return null; + } + return new Implementer() { + ImplementerFIO = model.ImplementerFIO, + Password = model.Password, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + ID = model.ID + }; + } + public static Implementer? Create(XElement element) { + if (element == null) { + return null; + } + return new Implementer() { + ImplementerFIO = element.Element("ImplementerFIO")!.Value, + Password = element.Element("Password")!.Value, + WorkExperience = Convert.ToInt32(element.Element("WorkExperience")!.Value), + Qualification = Convert.ToInt32(element.Element("Qualification")!.Value), + ID = Convert.ToInt32(element.Element("ID")!.Value) + }; + } + public void Update (ImplementerBindingModel? model) { + if (model == null) { + return; + } + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + Qualification = model.Qualification; + } + + public ImplementerViewModel GetViewModel => new() { + ImplementerFIO = ImplementerFIO, + Password = Password, + Qualification = Qualification, + WorkExperience = WorkExperience, + ID = ID + }; + + public XElement GetXElement => new("Implementer", new XAttribute("ID", ID), + new XElement("ImplementerFIO", ImplementerFIO), + new XElement("Password", Password), + new XElement("Qualification", Qualification.ToString()), + new XElement("WorkExperience", WorkExperience.ToString()), + new XAttribute("ID", ID)); + } +} diff --git a/Diner/DinerShopImplement/Models/Order.cs b/Diner/DinerShopImplement/Models/Order.cs index 16a97fc..4e04bf2 100644 --- a/Diner/DinerShopImplement/Models/Order.cs +++ b/Diner/DinerShopImplement/Models/Order.cs @@ -8,13 +8,17 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Xml.Schema; namespace DinerFileImplement.Models { - internal class Order : IOrderModel - { + internal class Order : IOrderModel { public int SnackID { get; private set; } + public int ClientID { get; private set; } + + public int? ImplementerID { get; set; } + public int Count { get; set; } public double Sum { get; private set; } @@ -27,6 +31,11 @@ namespace DinerFileImplement.Models public int ID { get; private set; } + public string? ProductName { get; private set; } + + public string ClientFIO { get; private set; } + + public string ImplementerFIO { get; private set; } public static Order? Create(OrderBindingModel? model) { @@ -40,6 +49,8 @@ namespace DinerFileImplement.Models Status = model.Status, DateCreate = model.DateCreate, DateImplement = model.DateImplement, + ClientID = model.ClientID, + ImplementerID = model.ImplementerID }; } public static Order? Create(XElement element) { @@ -54,6 +65,8 @@ namespace DinerFileImplement.Models DateCreate = Convert.ToDateTime(element.Element("DateCreate")!.Value), DateImplement = string.IsNullOrEmpty(element.Element("DateImplement")!.Value) ? null : Convert.ToDateTime(element.Element("DateImplement")!.Value), + ClientID = Convert.ToInt32(element.Element("ClientID")!.Value), + ImplementerID = Convert.ToInt32(element.Element("ImplementerID")!.Value) }; } public void Update(OrderBindingModel? model) @@ -71,6 +84,10 @@ namespace DinerFileImplement.Models Status = Status, DateCreate = DateCreate, DateImplement = DateImplement, + ClientID = ClientID, + ImplementerID = ImplementerID, + ClientFIO = ClientFIO, + ImplementerFIO = ImplementerFIO }; public XElement GetXElement => new("Order", new XAttribute("ID", ID), new XElement("SnackID", SnackID), @@ -78,7 +95,11 @@ namespace DinerFileImplement.Models new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), new XElement("DateCreate", DateCreate.ToString()), - new XElement("DateImplement", DateImplement.ToString())); + new XElement("DateImplement", DateImplement.ToString()), + new XElement("ClientID", ClientID.ToString()), + new XElement("ImplementerID", ImplementerID.ToString()), + new XElement("ClientFIO", ClientFIO), + new XElement("ImplementerFIO", ImplementerFIO)); } } diff --git a/Diner/DinerView/FormCreateOrder.Designer.cs b/Diner/DinerView/FormCreateOrder.Designer.cs index 65c70ed..d0fd4c1 100644 --- a/Diner/DinerView/FormCreateOrder.Designer.cs +++ b/Diner/DinerView/FormCreateOrder.Designer.cs @@ -20,121 +20,143 @@ 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() - { - labelProduct = new Label(); - comboBoxProduct = new ComboBox(); - labelCount = new Label(); - textBoxCount = new TextBox(); - label1 = new Label(); - textBoxSum = new TextBox(); - buttonCancel = new Button(); - buttonSave = new Button(); - SuspendLayout(); - // - // labelProduct - // - labelProduct.AutoSize = true; - labelProduct.Location = new Point(12, 9); - labelProduct.Name = "labelProduct"; - labelProduct.Size = new Size(37, 15); - labelProduct.TabIndex = 0; - labelProduct.Text = "Cнэк:"; - // - // comboBoxProduct - // - comboBoxProduct.BackColor = SystemColors.ButtonShadow; - comboBoxProduct.DropDownStyle = ComboBoxStyle.DropDownList; - comboBoxProduct.FormattingEnabled = true; - comboBoxProduct.Location = new Point(93, 6); - comboBoxProduct.Name = "comboBoxProduct"; - comboBoxProduct.Size = new Size(289, 23); - comboBoxProduct.TabIndex = 3; - comboBoxProduct.SelectedIndexChanged += comboBoxProduct_SelectedIndexChanged; - // - // labelCount - // - labelCount.AutoSize = true; - labelCount.Location = new Point(12, 37); - labelCount.Name = "labelCount"; - labelCount.Size = new Size(75, 15); - labelCount.TabIndex = 4; - labelCount.Text = "Количество:"; - // - // textBoxCount - // - textBoxCount.Location = new Point(93, 34); - textBoxCount.Name = "textBoxCount"; - textBoxCount.Size = new Size(289, 23); - textBoxCount.TabIndex = 5; - textBoxCount.TextChanged += textBoxCount_TextChanged; - // - // label1 - // - label1.AutoSize = true; - label1.Location = new Point(12, 66); - label1.Name = "label1"; - label1.Size = new Size(48, 15); - label1.TabIndex = 6; - label1.Text = "Сумма:"; - // - // textBoxSum - // - textBoxSum.Location = new Point(93, 63); - textBoxSum.Name = "textBoxSum"; - textBoxSum.ReadOnly = true; - textBoxSum.Size = new Size(289, 23); - textBoxSum.TabIndex = 7; - // - // buttonCancel - // - buttonCancel.Location = new Point(307, 92); - buttonCancel.Name = "buttonCancel"; - buttonCancel.Size = new Size(75, 23); - buttonCancel.TabIndex = 8; - buttonCancel.Text = "Отмена"; - buttonCancel.UseVisualStyleBackColor = true; - buttonCancel.Click += buttonCancel_Click; - // - // buttonSave - // - buttonSave.Location = new Point(226, 92); - buttonSave.Name = "buttonSave"; - buttonSave.Size = new Size(75, 23); - buttonSave.TabIndex = 9; - buttonSave.Text = "Сохранить"; - buttonSave.UseVisualStyleBackColor = true; - buttonSave.Click += buttonSave_Click; - // - // FormCreateOrder - // - AutoScaleDimensions = new SizeF(7F, 15F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(394, 122); - Controls.Add(buttonSave); - Controls.Add(buttonCancel); - Controls.Add(textBoxSum); - Controls.Add(label1); - Controls.Add(textBoxCount); - Controls.Add(labelCount); - Controls.Add(comboBoxProduct); - Controls.Add(labelProduct); - Name = "FormCreateOrder"; - Text = "Заказ"; - Load += FormCreateOrder_Load; - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + labelProduct = new Label(); + comboBoxProduct = new ComboBox(); + labelCount = new Label(); + textBoxCount = new TextBox(); + label1 = new Label(); + textBoxSum = new TextBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + labelClient = new Label(); + comboBoxClient = new ComboBox(); + SuspendLayout(); + // + // labelProduct + // + labelProduct.AutoSize = true; + labelProduct.Location = new Point(12, 39); + labelProduct.Name = "labelProduct"; + labelProduct.Size = new Size(37, 15); + labelProduct.TabIndex = 0; + labelProduct.Text = "Cнэк:"; + // + // comboBoxProduct + // + comboBoxProduct.BackColor = SystemColors.ButtonShadow; + comboBoxProduct.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxProduct.FormattingEnabled = true; + comboBoxProduct.Location = new Point(93, 36); + comboBoxProduct.Name = "comboBoxProduct"; + comboBoxProduct.Size = new Size(289, 23); + comboBoxProduct.TabIndex = 3; + comboBoxProduct.SelectedIndexChanged += comboBoxProduct_SelectedIndexChanged; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(12, 67); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(75, 15); + labelCount.TabIndex = 4; + labelCount.Text = "Количество:"; + // + // textBoxCount + // + textBoxCount.Location = new Point(93, 64); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(289, 23); + textBoxCount.TabIndex = 5; + textBoxCount.TextChanged += textBoxCount_TextChanged; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 96); + label1.Name = "label1"; + label1.Size = new Size(48, 15); + label1.TabIndex = 6; + label1.Text = "Сумма:"; + // + // textBoxSum + // + textBoxSum.Location = new Point(93, 93); + textBoxSum.Name = "textBoxSum"; + textBoxSum.ReadOnly = true; + textBoxSum.Size = new Size(289, 23); + textBoxSum.TabIndex = 7; + // + // buttonCancel + // + buttonCancel.Location = new Point(307, 122); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 8; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(226, 122); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 9; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // labelClient + // + labelClient.AutoSize = true; + labelClient.Location = new Point(12, 9); + labelClient.Name = "labelClient"; + labelClient.Size = new Size(49, 15); + labelClient.TabIndex = 10; + labelClient.Text = "Клиент:"; + // + // comboBoxClient + // + comboBoxClient.BackColor = SystemColors.ButtonShadow; + comboBoxClient.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(93, 7); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(289, 23); + comboBoxClient.TabIndex = 11; + // + // FormCreateOrder + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(394, 156); + Controls.Add(comboBoxClient); + Controls.Add(labelClient); + Controls.Add(buttonSave); + Controls.Add(buttonCancel); + Controls.Add(textBoxSum); + Controls.Add(label1); + Controls.Add(textBoxCount); + Controls.Add(labelCount); + Controls.Add(comboBoxProduct); + Controls.Add(labelProduct); + Name = "FormCreateOrder"; + Text = "Заказ"; + Load += FormCreateOrder_Load; + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private Label labelProduct; + private Label labelProduct; private ComboBox comboBoxProduct; private Label labelCount; private TextBox textBoxCount; @@ -142,5 +164,7 @@ private TextBox textBoxSum; private Button buttonCancel; private Button buttonSave; - } + private Label labelClient; + private ComboBox comboBoxClient; + } } \ No newline at end of file diff --git a/Diner/DinerView/FormCreateOrder.cs b/Diner/DinerView/FormCreateOrder.cs index a4ace2e..0f357e6 100644 --- a/Diner/DinerView/FormCreateOrder.cs +++ b/Diner/DinerView/FormCreateOrder.cs @@ -1,5 +1,6 @@ using DinerContracts.BindingModels; using DinerContracts.BusinessLogicsContacts; +using DinerContracts.BusinessLogicsContracts; using DinerContracts.SearchModels; using DinerDataModels.Enums; using Microsoft.Extensions.Logging; @@ -20,13 +21,15 @@ namespace DinerView private readonly ILogger _logger; private readonly ISnackLogic _logicSnack; private readonly IOrderLogic _logicOrder; + private readonly IClientLogic _clientLogic; - public FormCreateOrder(ILogger logger, ISnackLogic logicSnack, IOrderLogic logicOrder) + public FormCreateOrder(ILogger logger, ISnackLogic logicSnack, IOrderLogic logicOrder, IClientLogic clientLogic) { InitializeComponent(); _logger = logger; _logicSnack = logicSnack; _logicOrder = logicOrder; + _clientLogic = clientLogic; } private void CalcSum() @@ -72,14 +75,20 @@ namespace DinerView MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - _logger.LogInformation("Создание заказа"); + if (comboBoxClient.SelectedValue == null) { + MessageBox.Show("Выбирите клиента", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Создание заказа"); try { var operationResult = _logicOrder.CreateOrder(new OrderBindingModel { SnackID = Convert.ToInt32(comboBoxProduct.SelectedValue), Count = Convert.ToInt32(textBoxCount.Text), - Sum = Convert.ToDouble(textBoxSum.Text), + ProductName = comboBoxProduct.SelectedValue.ToString(), + Sum = Convert.ToDouble(textBoxSum.Text), + ClientID = Convert.ToInt32(comboBoxClient.SelectedValue) }); if (!operationResult) throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); @@ -113,9 +122,17 @@ namespace DinerView comboBoxProduct.DataSource = list; comboBoxProduct.SelectedItem = null; } + + var listClient = _clientLogic.ReadList(null); + if (listClient != null) { + comboBoxClient.DisplayMember = "ClientFIO"; + comboBoxClient.ValueMember = "ID"; + comboBoxClient.DataSource = listClient; + comboBoxClient.SelectedItem = null; + } } catch (Exception ex) { - _logger.LogError(ex, "Ошибка загрузки списка снэков"); + _logger.LogError(ex, "Ошибка загрузки списка снэков или клиентов"); MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } diff --git a/Diner/DinerView/FormImplementer.Designer.cs b/Diner/DinerView/FormImplementer.Designer.cs new file mode 100644 index 0000000..f942f22 --- /dev/null +++ b/Diner/DinerView/FormImplementer.Designer.cs @@ -0,0 +1,157 @@ +namespace DinerView { + 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() { + labelFIO = new Label(); + labelPassword = new Label(); + labelWorkExperience = new Label(); + labelQualification = new Label(); + textBoxFIO = new TextBox(); + textBoxPaassword = new TextBox(); + textBoxWorkExperience = new TextBox(); + textBoxQualification = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelFIO + // + labelFIO.AutoSize = true; + labelFIO.Location = new Point(12, 19); + labelFIO.Name = "labelFIO"; + labelFIO.Size = new Size(37, 15); + labelFIO.TabIndex = 1; + labelFIO.Text = "ФИО:"; + // + // labelPassword + // + labelPassword.AutoSize = true; + labelPassword.Location = new Point(12, 50); + labelPassword.Name = "labelPassword"; + labelPassword.Size = new Size(49, 15); + labelPassword.TabIndex = 2; + labelPassword.Text = "Пароль"; + // + // labelWorkExperience + // + labelWorkExperience.AutoSize = true; + labelWorkExperience.Location = new Point(12, 88); + labelWorkExperience.Name = "labelWorkExperience"; + labelWorkExperience.Size = new Size(82, 15); + labelWorkExperience.TabIndex = 3; + labelWorkExperience.Text = "Стаж работы:"; + // + // labelQualification + // + labelQualification.AutoSize = true; + labelQualification.Location = new Point(180, 88); + labelQualification.Name = "labelQualification"; + labelQualification.Size = new Size(88, 15); + labelQualification.TabIndex = 4; + labelQualification.Text = "Квалификация"; + // + // textBoxFIO + // + textBoxFIO.Location = new Point(67, 16); + textBoxFIO.Name = "textBoxFIO"; + textBoxFIO.Size = new Size(305, 23); + textBoxFIO.TabIndex = 5; + // + // textBoxPaassword + // + textBoxPaassword.Location = new Point(67, 47); + textBoxPaassword.Name = "textBoxPaassword"; + textBoxPaassword.Size = new Size(305, 23); + textBoxPaassword.TabIndex = 6; + // + // textBoxWorkExperience + // + textBoxWorkExperience.Location = new Point(100, 85); + textBoxWorkExperience.Name = "textBoxWorkExperience"; + textBoxWorkExperience.Size = new Size(69, 23); + textBoxWorkExperience.TabIndex = 7; + // + // textBoxQualification + // + textBoxQualification.Location = new Point(274, 85); + textBoxQualification.Name = "textBoxQualification"; + textBoxQualification.Size = new Size(98, 23); + textBoxQualification.TabIndex = 8; + // + // buttonSave + // + buttonSave.Location = new Point(216, 124); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 10; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 124); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 9; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(394, 159); + Controls.Add(buttonSave); + Controls.Add(buttonCancel); + Controls.Add(textBoxQualification); + Controls.Add(textBoxWorkExperience); + Controls.Add(textBoxPaassword); + Controls.Add(textBoxFIO); + Controls.Add(labelQualification); + Controls.Add(labelWorkExperience); + Controls.Add(labelPassword); + Controls.Add(labelFIO); + Name = "FormImplementer"; + Text = "Implementer"; + Load += FormImplementer_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelFIO; + private Label labelPassword; + private Label labelWorkExperience; + private Label labelQualification; + private TextBox textBoxFIO; + private TextBox textBoxPaassword; + private TextBox textBoxWorkExperience; + private TextBox textBoxQualification; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/Diner/DinerView/FormImplementer.cs b/Diner/DinerView/FormImplementer.cs new file mode 100644 index 0000000..84f8cc2 --- /dev/null +++ b/Diner/DinerView/FormImplementer.cs @@ -0,0 +1,100 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DinerView { + 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) { + textBoxFIO.Text = view.ImplementerFIO; + textBoxPaassword.Text = view.Password; + textBoxQualification.Text = view.Qualification.ToString(); + textBoxWorkExperience.Text = view.WorkExperience.ToString(); + } + } + catch (Exception ex) { + _logger.LogError(ex, "Ошибка получения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void buttonSave_Click(object sender, EventArgs e) { + if (string.IsNullOrEmpty(textBoxFIO.Text)) { + MessageBox.Show("Заполните ФИО", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxPaassword.Text)) { + MessageBox.Show("Придумайте пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxQualification.Text)) { + MessageBox.Show("Укажите квалификацию", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxWorkExperience.Text)) { + MessageBox.Show("Укажите стаж работы", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение исполнителя"); + try { + var model = new ImplementerBindingModel { + ID = _ID ?? 0, + ImplementerFIO = textBoxFIO.Text, + Password = textBoxPaassword.Text, + Qualification = Convert.ToInt32(textBoxQualification.Text), + WorkExperience = Convert.ToInt32(textBoxWorkExperience.Text), + }; + var operationResult = _ID.HasValue ? _logic.Update(model) : _logic.Create(model); + if (!operationResult) { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) { + _logger.LogError(ex, "Ошибка сохранения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/Diner/DinerView/FormImplementer.resx b/Diner/DinerView/FormImplementer.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Diner/DinerView/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/Diner/DinerView/FormImplementers.Designer.cs b/Diner/DinerView/FormImplementers.Designer.cs new file mode 100644 index 0000000..a894c7b --- /dev/null +++ b/Diner/DinerView/FormImplementers.Designer.cs @@ -0,0 +1,115 @@ +namespace DinerView { + 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() { + dataGridView = new DataGridView(); + buttonAdd = new Button(); + buttonCange = new Button(); + buttonDelete = new Button(); + buttonUpdate = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.BackgroundColor = SystemColors.ButtonHighlight; + dataGridView.BorderStyle = BorderStyle.None; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Left; + dataGridView.Location = new Point(0, 0); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersVisible = false; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(468, 450); + dataGridView.TabIndex = 1; + // + // buttonAdd + // + buttonAdd.Location = new Point(509, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(95, 35); + buttonAdd.TabIndex = 2; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonCange + // + buttonCange.Location = new Point(509, 53); + buttonCange.Name = "buttonCange"; + buttonCange.Size = new Size(95, 35); + buttonCange.TabIndex = 3; + buttonCange.Text = "Изменить"; + buttonCange.UseVisualStyleBackColor = true; + buttonCange.Click += buttonCange_Click; + // + // buttonDelete + // + buttonDelete.Location = new Point(509, 94); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(95, 35); + buttonDelete.TabIndex = 4; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += buttonDelete_Click; + // + // buttonUpdate + // + buttonUpdate.Location = new Point(509, 135); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(95, 35); + buttonUpdate.TabIndex = 5; + buttonUpdate.Text = "Обновить"; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += buttonUpdate_Click; + // + // FormImplementers + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = SystemColors.ActiveBorder; + ClientSize = new Size(635, 450); + Controls.Add(buttonUpdate); + Controls.Add(buttonDelete); + Controls.Add(buttonCange); + Controls.Add(buttonAdd); + Controls.Add(dataGridView); + Name = "FormImplementers"; + Text = "Исполнители"; + Load += FormImplementers_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonAdd; + private Button buttonCange; + private Button buttonDelete; + private Button buttonUpdate; + } +} \ No newline at end of file diff --git a/Diner/DinerView/FormImplementers.cs b/Diner/DinerView/FormImplementers.cs new file mode 100644 index 0000000..748cbe1 --- /dev/null +++ b/Diner/DinerView/FormImplementers.cs @@ -0,0 +1,91 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DinerView { + public partial class FormImplementers : Form { + + private readonly ILogger _logger; + private readonly IImplementerLogic _logic; + + public FormImplementers(ILogger logger, IImplementerLogic logic) { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormImplementers_Load(object sender, EventArgs e) { + LoadData(); + } + + private void LoadData() { + try { + var list = _logic.ReadList(null); + if (list != null) { + dataGridView.DataSource = list; + dataGridView.Columns["ID"].Visible = false; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка клиентов"); + } + catch (Exception ex) { + _logger.LogError(ex, "Ошибка загрузки клиентов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonUpdate_Click(object sender, EventArgs e) { + LoadData(); + } + + private void buttonAdd_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 buttonCange_Click(object sender, EventArgs e) { + if (dataGridView.SelectedRows.Count == 1) { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + if (service is FormImplementer form) { + form.ID = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["ID"].Value); + if (form.ShowDialog() == DialogResult.OK) { + LoadData(); + } + } + } + } + + private void buttonDelete_Click(object sender, EventArgs e) { + if (dataGridView.SelectedRows.Count == 1) { + if (MessageBox.Show("Удалить запись", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["ID"].Value); + _logger.LogInformation("Удаление компонента"); + try { + if (!_logic.Delete(new ImplementerBindingModel { ID = id})) { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах"); + } + LoadData(); + } + catch (Exception ex) { + _logger.LogError(ex, "Ошибка удаления компонента"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + } +} diff --git a/Diner/DinerView/FormImplementers.resx b/Diner/DinerView/FormImplementers.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Diner/DinerView/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/Diner/DinerView/FormMain.Designer.cs b/Diner/DinerView/FormMain.Designer.cs index 126c067..3858d91 100644 --- a/Diner/DinerView/FormMain.Designer.cs +++ b/Diner/DinerView/FormMain.Designer.cs @@ -31,17 +31,17 @@ toolStripMenuItemMenu = new ToolStripMenuItem(); toolStripMenuItemFoods = new ToolStripMenuItem(); toolStripMenuItemSnacks = new ToolStripMenuItem(); + toolStripMenuItemClient = new ToolStripMenuItem(); + toolStripMenuItemImplementer = new ToolStripMenuItem(); toolStripMenuItemReport = new ToolStripMenuItem(); FoodsToolStripMenuItem = new ToolStripMenuItem(); FoodSnacksToolStripMenuItem = new ToolStripMenuItem(); ordersToolStripMenuItem = new ToolStripMenuItem(); + toolStripMenuItemStartOfWork = new ToolStripMenuItem(); dataGridView = new DataGridView(); buttonCreateOrder = new Button(); - buttonInWork = new Button(); - buttonIsReady = new Button(); buttonIsDelivery = new Button(); buttonUpdateList = new Button(); - toolStripMenuItemClient = new ToolStripMenuItem(); menuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -49,16 +49,16 @@ // menuStrip // menuStrip.BackColor = SystemColors.Control; - menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItemMenu, toolStripMenuItemReport }); + menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItemMenu, toolStripMenuItemReport, toolStripMenuItemStartOfWork }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(951, 24); + menuStrip.Size = new Size(1114, 24); menuStrip.TabIndex = 0; menuStrip.Text = "Справочник"; // // toolStripMenuItemMenu // - toolStripMenuItemMenu.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItemFoods, toolStripMenuItemSnacks, toolStripMenuItemClient }); + toolStripMenuItemMenu.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItemFoods, toolStripMenuItemSnacks, toolStripMenuItemClient, toolStripMenuItemImplementer }); toolStripMenuItemMenu.Name = "toolStripMenuItemMenu"; toolStripMenuItemMenu.Size = new Size(94, 20); toolStripMenuItemMenu.Text = "Справочники"; @@ -66,17 +66,31 @@ // toolStripMenuItemFoods // toolStripMenuItemFoods.Name = "toolStripMenuItemFoods"; - toolStripMenuItemFoods.Size = new Size(180, 22); + toolStripMenuItemFoods.Size = new Size(149, 22); toolStripMenuItemFoods.Text = "Продукты"; toolStripMenuItemFoods.Click += toolStripMenuItemFoods_Click; // // toolStripMenuItemSnacks // toolStripMenuItemSnacks.Name = "toolStripMenuItemSnacks"; - toolStripMenuItemSnacks.Size = new Size(180, 22); + toolStripMenuItemSnacks.Size = new Size(149, 22); toolStripMenuItemSnacks.Text = "Снэки"; toolStripMenuItemSnacks.Click += toolStripMenuItemSnacks_Click; // + // toolStripMenuItemClient + // + toolStripMenuItemClient.Name = "toolStripMenuItemClient"; + toolStripMenuItemClient.Size = new Size(149, 22); + toolStripMenuItemClient.Text = "Клиенты"; + toolStripMenuItemClient.Click += toolStripMenuItemClient_Click; + // + // toolStripMenuItemImplementer + // + toolStripMenuItemImplementer.Name = "toolStripMenuItemImplementer"; + toolStripMenuItemImplementer.Size = new Size(149, 22); + toolStripMenuItemImplementer.Text = "Исполнители"; + toolStripMenuItemImplementer.Click += toolStripMenuItemImplementer_Click; + // // toolStripMenuItemReport // toolStripMenuItemReport.DropDownItems.AddRange(new ToolStripItem[] { FoodsToolStripMenuItem, FoodSnacksToolStripMenuItem, ordersToolStripMenuItem }); @@ -105,6 +119,13 @@ ordersToolStripMenuItem.Text = "Список заказов"; ordersToolStripMenuItem.Click += ordersToolStripMenuItem_Click; // + // toolStripMenuItemStartOfWork + // + toolStripMenuItemStartOfWork.Name = "toolStripMenuItemStartOfWork"; + toolStripMenuItemStartOfWork.Size = new Size(92, 20); + toolStripMenuItemStartOfWork.Text = "Запуск работ"; + toolStripMenuItemStartOfWork.Click += toolStripMenuItemStartOfWork_Click; + // // dataGridView // dataGridView.AllowUserToAddRows = false; @@ -119,12 +140,12 @@ dataGridView.ReadOnly = true; dataGridView.RowHeadersVisible = false; dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; - dataGridView.Size = new Size(726, 426); + dataGridView.Size = new Size(889, 426); dataGridView.TabIndex = 0; // // buttonCreateOrder // - buttonCreateOrder.Location = new Point(732, 36); + buttonCreateOrder.Location = new Point(895, 40); buttonCreateOrder.Name = "buttonCreateOrder"; buttonCreateOrder.Size = new Size(212, 39); buttonCreateOrder.TabIndex = 2; @@ -132,29 +153,9 @@ buttonCreateOrder.UseVisualStyleBackColor = true; buttonCreateOrder.Click += buttonCreateOrder_Click; // - // buttonInWork - // - buttonInWork.Location = new Point(732, 81); - buttonInWork.Name = "buttonInWork"; - buttonInWork.Size = new Size(212, 39); - buttonInWork.TabIndex = 3; - buttonInWork.Text = "Отдать на выполнение"; - buttonInWork.UseVisualStyleBackColor = true; - buttonInWork.Click += buttonInWork_Click; - // - // buttonIsReady - // - buttonIsReady.Location = new Point(732, 126); - buttonIsReady.Name = "buttonIsReady"; - buttonIsReady.Size = new Size(212, 39); - buttonIsReady.TabIndex = 4; - buttonIsReady.Text = "Заказ готов"; - buttonIsReady.UseVisualStyleBackColor = true; - buttonIsReady.Click += buttonIsReady_Click; - // // buttonIsDelivery // - buttonIsDelivery.Location = new Point(732, 171); + buttonIsDelivery.Location = new Point(895, 100); buttonIsDelivery.Name = "buttonIsDelivery"; buttonIsDelivery.Size = new Size(212, 39); buttonIsDelivery.TabIndex = 5; @@ -164,7 +165,7 @@ // // buttonUpdateList // - buttonUpdateList.Location = new Point(732, 216); + buttonUpdateList.Location = new Point(895, 159); buttonUpdateList.Name = "buttonUpdateList"; buttonUpdateList.Size = new Size(212, 39); buttonUpdateList.TabIndex = 6; @@ -172,23 +173,14 @@ buttonUpdateList.UseVisualStyleBackColor = true; buttonUpdateList.Click += buttonUpdateList_Click; // - // toolStripMenuItemClient - // - toolStripMenuItemClient.Name = "toolStripMenuItemClient"; - toolStripMenuItemClient.Size = new Size(180, 22); - toolStripMenuItemClient.Text = "Клиенты"; - toolStripMenuItemClient.Click += toolStripMenuItemClient_Click; - // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = SystemColors.ScrollBar; - ClientSize = new Size(951, 450); + ClientSize = new Size(1114, 450); Controls.Add(buttonUpdateList); Controls.Add(buttonIsDelivery); - Controls.Add(buttonIsReady); - Controls.Add(buttonInWork); Controls.Add(buttonCreateOrder); Controls.Add(dataGridView); Controls.Add(menuStrip); @@ -211,8 +203,6 @@ private ToolStripMenuItem toolStripMenuItemFoods; private ToolStripMenuItem toolStripMenuItemSnacks; private Button buttonCreateOrder; - private Button buttonInWork; - private Button buttonIsReady; private Button buttonIsDelivery; private Button buttonUpdateList; private ToolStripMenuItem toolStripMenuItemReport; @@ -220,5 +210,7 @@ private ToolStripMenuItem FoodSnacksToolStripMenuItem; private ToolStripMenuItem ordersToolStripMenuItem; private ToolStripMenuItem toolStripMenuItemClient; + private ToolStripMenuItem toolStripMenuItemStartOfWork; + private ToolStripMenuItem toolStripMenuItemImplementer; } } \ No newline at end of file diff --git a/Diner/DinerView/FormMain.cs b/Diner/DinerView/FormMain.cs index ec09511..458ecb4 100644 --- a/Diner/DinerView/FormMain.cs +++ b/Diner/DinerView/FormMain.cs @@ -1,6 +1,7 @@ using DinerContracts.BindingModels; using DinerContracts.BusinessLogicsContacts; using DinerContracts.BusinessLogicsContracts; +using DinerDataBaseImplement.Models; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -19,11 +20,13 @@ namespace DinerView 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) { @@ -38,8 +41,10 @@ namespace DinerView dataGridView.DataSource = list; dataGridView.Columns["SnackID"].Visible = false; dataGridView.Columns["ClientID"].Visible = false; - dataGridView.Columns["ID"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView.Columns["ImplementerID"].Visible = false; + dataGridView.Columns["ID"].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader; dataGridView.Columns["Sum"].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } _logger.LogInformation("Загрузка заказов"); } @@ -156,9 +161,22 @@ namespace DinerView private void toolStripMenuItemClient_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormClient)); - if (service is FormClient form) { + if (service is FormClient form) { form.ShowDialog(); } } + + private void toolStripMenuItemImplementer_Click(object sender, EventArgs e) { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementers form) { + form.ShowDialog(); + } + } + + private void toolStripMenuItemStartOfWork_Click(object sender, EventArgs e) { + _workProcess.Work((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } } } diff --git a/Diner/DinerView/Program.cs b/Diner/DinerView/Program.cs index 69d9bf1..25a50cc 100644 --- a/Diner/DinerView/Program.cs +++ b/Diner/DinerView/Program.cs @@ -39,14 +39,17 @@ namespace DinerView }); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -62,6 +65,8 @@ namespace DinerView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs index b2f38bd..369d38c 100644 --- a/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs +++ b/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs @@ -55,7 +55,7 @@ namespace DineryBusinessLogic.BusinessLogic { if (model == null) { throw new ArgumentNullException(nameof(model)); } - _logger.LogInformation($"ReadElement. Login:{model.ClientFIO}.ID:{model.ID}"); + _logger.LogInformation($"ReadElement. Login:{model.Email}.ID:{model.ID}"); var element = _storage.GetElement(model); if (element == null) { _logger.LogWarning("ReadElement. element not found"); @@ -69,7 +69,7 @@ namespace DineryBusinessLogic.BusinessLogic { _logger.LogInformation($"ReadList. CLientID:{model?.ID}"); var list = model == null ? _storage.GetFullList() : _storage.GetFilteredList(model); if (list == null) { - _logger.LogWarning("ReadList. return nell list"); + _logger.LogWarning("ReadList. return null list"); return null; } _logger.LogInformation($"ReadList. Count:{list.Count}"); @@ -98,9 +98,9 @@ namespace DineryBusinessLogic.BusinessLogic { } _logger.LogInformation($"Client. ID:{model.ID}.FIO:{model.ClientFIO}.Email:{model.Email}.Password:{model.Password}"); var element = _storage.GetElement(new ClientSearchModel { - ClientFIO = model.ClientFIO, + Email = model.Email, }); - if (element != null && element.ClientFIO == model.ClientFIO) { + if (element != null && element.Email == model.Email) { throw new InvalidOperationException("Клиент с таким логином уже есть"); } } diff --git a/Diner/DineryBusinessLogic/BusinessLogic/ImplementerLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/ImplementerLogic.cs new file mode 100644 index 0000000..6bca427 --- /dev/null +++ b/Diner/DineryBusinessLogic/BusinessLogic/ImplementerLogic.cs @@ -0,0 +1,111 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; +using DinerContracts.StoragesContracts; +using DinerContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata.Ecma335; +using System.Text; +using System.Threading.Tasks; + +namespace DineryBusinessLogic.BusinessLogic { + public class ImplementerLogic : IImplementerLogic { + + private readonly ILogger _logger; + private readonly IImplementerStorage _storage; + + public ImplementerLogic(ILogger logger, IImplementerStorage storage) { + _logger = logger; + _storage = storage; + } + + public bool Create(ImplementerBindingModel model) { + CheckModel(model); + if (_storage.Insert(model) == null) { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + public bool Delete(ImplementerBindingModel model) { + CheckModel(model, false); + _logger.LogInformation($"Delete. ID:{model.ID}"); + if (_storage.Delete(model) == null) { + _logger.LogWarning("Delete operation failed"); + return false; + } + return false; + } + + public bool Update(ImplementerBindingModel model) { + CheckModel(model); + if (_storage.Update(model) == null) { + _logger.LogWarning("Update operation failde"); + return false; + } + return true; + } + + public ImplementerViewModel? ReadElement(ImplementerSearchModel model) { + if (model == null) { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation($"ReadElement. FIO:{model.ImplementerFIO}.ID:{model.ID}"); + var element = _storage.GetElement(model); + if (element == null) { + _logger.LogWarning("ReadElement. element not fount"); + return null; + } + _logger.LogInformation($"ReadElement. find.ID:{element.ID}"); + return element; + } + + public List? ReadList(ImplementerSearchModel? model) { + _logger.LogInformation($"ReadList. ImplementerID:{model?.ID}"); + var list = model == null ? _storage.GetFullList() : _storage.GetFilteredList(model); + if (list == null) { + _logger.LogWarning("ReadList. return null list"); + return null; + } + _logger.LogInformation($"ReadList. Count:{list.Count}"); + return list; + } + + + 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("Нет пароля"); + } + if (string.IsNullOrEmpty((model.WorkExperience).ToString())) { + throw new ArgumentNullException("Не указан стаж"); + } + if (string.IsNullOrEmpty((model.Qualification).ToString())) { + throw new ArgumentNullException("Нет квалификации"); + } + if (string.IsNullOrEmpty((model.ID).ToString())) { + throw new ArgumentNullException("Нет ID пользователя", nameof(model.ID)); + } + _logger.LogInformation($"Implementer. ID:{model.ID}.ImplementerFIO:{model.ImplementerFIO}.WorkExperience:{model.WorkExperience}." + + $"Qualification:{model.Qualification}"); + var element = _storage.GetElement(new ImplementerSearchModel { + ImplementerFIO = model.ImplementerFIO + }); + if (element != null && element.ImplementerFIO == model.ImplementerFIO) { + throw new InvalidOperationException("Исполнитель с таким ФИО уже есть"); + } + } + } +} diff --git a/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs index db13088..384fd7a 100644 --- a/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs @@ -45,7 +45,21 @@ namespace DineryBusinessLogic.BusinessLogic return StatusUpdate(model, OrderStatus.Готов); } - public List? ReadList(OrderSearchModel? model) + public OrderViewModel? ReadElement(OrderSearchModel model) { + if (model == null) { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation($"ReadElement. ImplementerLogin:{model.ImplementerID}.ID:{model.ID}"); + var element = _orderStorage.GetElement(model); + if (element == null) { + _logger.LogWarning("ReadElement. element not found"); + return null; + } + _logger.LogInformation($"ReadElement. findID:{element.ID}"); + return element; + } + + public List? ReadList(OrderSearchModel? model) { _logger.LogInformation("ReadList. ID:{ID}", model?.ID); var list = model == null? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model); @@ -72,13 +86,17 @@ namespace DineryBusinessLogic.BusinessLogic if (model.ClientID < 0) { throw new ArgumentNullException("Некорректный идентификатор у клиента", nameof(model.ClientID)); } + if (model.ImplementerID < 0) { + throw new ArgumentNullException("Некорректный идентификатор у исполнителя", nameof(model.ImplementerID)); + } _logger.LogInformation("Order. SnackID:{SnackID}. Count:{Count}. Sum:{Sum}. Status:{Status}. " + - "DateCreate:{DateCreate}. DateImplement:{DateImplement}. ID:{ID}, ClientId: {ClientId}", + "DateCreate:{DateCreate}. DateImplement:{DateImplement}. ID:{ID}. ClientId: {ClientId}. " + + "ImplementerID: {ImplementerId}", model.SnackID, model.Count, model.Sum, model.Status, model.DateCreate, model.DateImplement, model.ID, - model.ClientID); + model.ClientID, model.ImplementerID); } private bool StatusUpdate(OrderBindingModel model, OrderStatus newOrderStatus) { - CheckModel(model, false); + var viewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID }); if (viewModel == null) { @@ -89,13 +107,19 @@ namespace DineryBusinessLogic.BusinessLogic return false; } model.Status = newOrderStatus; - if (model.Status == OrderStatus.Готов) { + if (viewModel.ImplementerID.HasValue) { + model.ImplementerID = viewModel.ImplementerID; + } + if (model.Status == OrderStatus.Готов) { model.DateImplement = DateTime.Now; } else { model.DateImplement = viewModel.DateImplement; } - if (_orderStorage.Update(model) == null) { + + CheckModel(model, false); + + if (_orderStorage.Update(model) == null) { _logger.LogWarning("Update operarion failed"); return false; } diff --git a/Diner/DineryBusinessLogic/BusinessLogic/WorkModelling.cs b/Diner/DineryBusinessLogic/BusinessLogic/WorkModelling.cs new file mode 100644 index 0000000..1646f0f --- /dev/null +++ b/Diner/DineryBusinessLogic/BusinessLogic/WorkModelling.cs @@ -0,0 +1,125 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContacts; +using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; +using DinerContracts.ViewModels; +using DinerDataModels.Enums; +using DocumentFormat.OpenXml.Office2010.Excel; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DineryBusinessLogic.BusinessLogic { + public class WorkModelling : IWorkProcess { + + private readonly ILogger _logger; + + private readonly Random _rnd; + + private IOrderLogic? _orderLogic; + + public WorkModelling(ILogger logger) { + _logger = logger; + _rnd = new Random(1000); + } + + public void Work(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 {orders.Count} orders"); + 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, orders); + await Task.Run(async () => { + foreach (var order in orders) { + try { + _logger.LogDebug($"DoWork. Worker {implementer.ID} try get order {order.ID}"); + // пытаемся назначить заказ на исполнителя + var notOccupied = _orderLogic.TakeOrderInWork(new OrderBindingModel { + ID = order.ID, + ImplementerID = implementer.ID + }); + // делаем работу + if (notOccupied) { + await Task.Delay(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, ImplementerID = implementer.ID }); + + await Task.Delay(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; + } + // отдыхаем + Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); + } + }); + } + + // Ищем заказ, которые уже в работе(вдруг исполнителя прервали) + private async Task RunOrderInWork(ImplementerViewModel implementer, List orders) { + if (_orderLogic == null || implementer == null || orders == null || orders.Count == 0) { + return; + } + try { + var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel { + ImplementerID = implementer.ID, + Status = OrderStatus.Выполняется + })); + if (runOrder == null) { + return; + } + + _logger.LogDebug($"DoWork. Worker {implementer.ID} back to order {runOrder.ID}"); + // доделываем работу + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count); + _logger.LogDebug($"DoWork. Worker{implementer.ID} finish order {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; + } + } + } +}