diff --git a/FoodOrders/FoodOrderDatabaseImplement/FoodOrdersDataBase.cs b/FoodOrders/FoodOrderDatabaseImplement/FoodOrdersDataBase.cs index 63941a4..f9158b4 100644 --- a/FoodOrders/FoodOrderDatabaseImplement/FoodOrdersDataBase.cs +++ b/FoodOrders/FoodOrderDatabaseImplement/FoodOrdersDataBase.cs @@ -20,5 +20,6 @@ namespace FoodOrdersDatabaseImplement public virtual DbSet FoodComponents { set; get; } public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } - } + public virtual DbSet Implementers { set; get; } + } } diff --git a/FoodOrders/FoodOrderDatabaseImplement/Implements/ImplementerStorage.cs b/FoodOrders/FoodOrderDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..5badffb --- /dev/null +++ b/FoodOrders/FoodOrderDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,99 @@ +using FoodOrderDatabaseImplement.Models; +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.StoragesContracts; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDatabaseImplement; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrderDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var context = new FoodOrdersDataBase(); + var element = context.Implementers.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Implementers.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return null; + } + using var context = new FoodOrdersDataBase(); + return context.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) && string.IsNullOrEmpty(model.Password)) + { + return new(); + } + using var context = new FoodOrdersDataBase(); + if (!string.IsNullOrEmpty(model.ImplementerFIO)) + { + return context.Implementers + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + + return context.Implementers + .Where(x => x.Password.Contains(model.Password)) + .Select(x => x.GetViewModel) + .ToList(); + + } + + public List GetFullList() + { + using var context = new FoodOrdersDataBase(); + return context.Implementers + .Select(x => x.GetViewModel) + .ToList(); + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + var newImplementer = Implementer.Create(model); + if (newImplementer == null) + { + return null; + } + using var context = new FoodOrdersDataBase(); + context.Implementers.Add(newImplementer); + context.SaveChanges(); + return newImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var context = new FoodOrdersDataBase(); + var implementer = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (implementer == null) + { + return null; + } + implementer.Update(model); + context.SaveChanges(); + return implementer.GetViewModel; + } + } +} diff --git a/FoodOrders/FoodOrderDatabaseImplement/Implements/OrderStorage.cs b/FoodOrders/FoodOrderDatabaseImplement/Implements/OrderStorage.cs index c7137f9..46c307f 100644 --- a/FoodOrders/FoodOrderDatabaseImplement/Implements/OrderStorage.cs +++ b/FoodOrders/FoodOrderDatabaseImplement/Implements/OrderStorage.cs @@ -17,41 +17,47 @@ namespace FoodOrderDatabaseImplement.Implements return context.Orders.Select(x => x.GetViewModel).ToList(); } - public List GetFilteredList(OrderSearchModel model) + public List GetFilteredList(OrderSearchModel model) { + if (model is null) + { + return new(); + } using var context = new FoodOrdersDataBase(); - if (!model.Id.HasValue) - { + if (model.DateTo != null && model.DateFrom != null && model.ClientId.HasValue) + { return context.Orders - .Include(x => x.Food) - .Include(x => x.Client) - .Where(x => x.Id == model.Id) + .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo && x.ClientId == model.ClientId) + .ToList() .Select(x => x.GetViewModel) .ToList(); } - else if (model.DateFrom != null && model.DateTo != null) + + else if (model.DateTo != null && model.DateFrom != null) { return context.Orders - .Include(x => x.Food) - .Include(x => x.Client) .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + .ToList() .Select(x => x.GetViewModel) .ToList(); } else if (model.ClientId.HasValue) { return context.Orders - .Include(x => x.Food) - .Include(x => x.Client) .Where(x => x.ClientId == model.ClientId) + .ToList() .Select(x => x.GetViewModel) .ToList(); } + return context.Orders + .Where(x => x.Status == model.Status) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); - return context.Orders.Where(x => x.Id == model.Id).Select(x => x.GetViewModel).ToList(); - } + } - public OrderViewModel? GetElement(OrderSearchModel model) + public OrderViewModel? GetElement(OrderSearchModel model) { if (!model.Id.HasValue) { diff --git a/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.Designer.cs b/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.Designer.cs similarity index 83% rename from FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.Designer.cs rename to FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.Designer.cs index 0673ceb..1ffba93 100644 --- a/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.Designer.cs +++ b/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FoodOrderDatabaseImplement.Migrations { [DbContext(typeof(FoodOrdersDataBase))] - [Migration("20231122135912_Init")] + [Migration("20231122170335_Init")] partial class Init { /// @@ -37,7 +37,7 @@ namespace FoodOrderDatabaseImplement.Migrations .IsRequired() .HasColumnType("text"); - b.Property("Login") + b.Property("Email") .IsRequired() .HasColumnType("text"); @@ -50,6 +50,33 @@ namespace FoodOrderDatabaseImplement.Migrations b.ToTable("Clients"); }); + modelBuilder.Entity("FoodOrderDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Component", b => { b.Property("Id") @@ -147,6 +174,9 @@ namespace FoodOrderDatabaseImplement.Migrations .IsRequired() .HasColumnType("text"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -159,6 +189,8 @@ namespace FoodOrderDatabaseImplement.Migrations b.HasIndex("FoodId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -195,6 +227,10 @@ namespace FoodOrderDatabaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("FoodOrderDatabaseImplement.Models.Implementer", null) + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + b.Navigation("Client"); b.Navigation("Food"); @@ -205,6 +241,11 @@ namespace FoodOrderDatabaseImplement.Migrations b.Navigation("Orders"); }); + modelBuilder.Entity("FoodOrderDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Component", b => { b.Navigation("FoodComponents"); diff --git a/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.cs b/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.cs similarity index 81% rename from FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.cs rename to FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.cs index 67c2fb9..472fb4e 100644 --- a/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122135912_Init.cs +++ b/FoodOrders/FoodOrderDatabaseImplement/Migrations/20231122170335_Init.cs @@ -19,7 +19,7 @@ namespace FoodOrderDatabaseImplement.Migrations Id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ClientFIO = table.Column(type: "text", nullable: false), - Login = table.Column(type: "text", nullable: false), + Email = table.Column(type: "text", nullable: false), Password = table.Column(type: "text", nullable: false) }, constraints: table => @@ -55,6 +55,22 @@ namespace FoodOrderDatabaseImplement.Migrations table.PrimaryKey("PK_Foods", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ImplementerFIO = table.Column(type: "text", nullable: false), + WorkExperience = table.Column(type: "integer", nullable: false), + Qualification = table.Column(type: "integer", nullable: false), + Password = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.Id); + }); + migrationBuilder.CreateTable( name: "FoodComponents", columns: table => new @@ -96,7 +112,8 @@ namespace FoodOrderDatabaseImplement.Migrations Sum = table.Column(type: "double precision", nullable: false), Status = table.Column(type: "integer", nullable: false), DateCreate = table.Column(type: "timestamp with time zone", nullable: false), - DateImplement = table.Column(type: "timestamp with time zone", nullable: true) + DateImplement = table.Column(type: "timestamp with time zone", nullable: true), + ImplementerId = table.Column(type: "integer", nullable: true) }, constraints: table => { @@ -113,6 +130,11 @@ namespace FoodOrderDatabaseImplement.Migrations principalTable: "Foods", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerId", + column: x => x.ImplementerId, + principalTable: "Implementers", + principalColumn: "Id"); }); migrationBuilder.CreateIndex( @@ -134,6 +156,11 @@ namespace FoodOrderDatabaseImplement.Migrations name: "IX_Orders_FoodId", table: "Orders", column: "FoodId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ImplementerId", + table: "Orders", + column: "ImplementerId"); } /// @@ -153,6 +180,9 @@ namespace FoodOrderDatabaseImplement.Migrations migrationBuilder.DropTable( name: "Foods"); + + migrationBuilder.DropTable( + name: "Implementers"); } } } diff --git a/FoodOrders/FoodOrderDatabaseImplement/Migrations/FoodOrdersDataBaseModelSnapshot.cs b/FoodOrders/FoodOrderDatabaseImplement/Migrations/FoodOrdersDataBaseModelSnapshot.cs index b622df4..50ecb37 100644 --- a/FoodOrders/FoodOrderDatabaseImplement/Migrations/FoodOrdersDataBaseModelSnapshot.cs +++ b/FoodOrders/FoodOrderDatabaseImplement/Migrations/FoodOrdersDataBaseModelSnapshot.cs @@ -34,7 +34,7 @@ namespace FoodOrderDatabaseImplement.Migrations .IsRequired() .HasColumnType("text"); - b.Property("Login") + b.Property("Email") .IsRequired() .HasColumnType("text"); @@ -47,6 +47,33 @@ namespace FoodOrderDatabaseImplement.Migrations b.ToTable("Clients"); }); + modelBuilder.Entity("FoodOrderDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Component", b => { b.Property("Id") @@ -144,6 +171,9 @@ namespace FoodOrderDatabaseImplement.Migrations .IsRequired() .HasColumnType("text"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -156,6 +186,8 @@ namespace FoodOrderDatabaseImplement.Migrations b.HasIndex("FoodId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -192,6 +224,10 @@ namespace FoodOrderDatabaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("FoodOrderDatabaseImplement.Models.Implementer", null) + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + b.Navigation("Client"); b.Navigation("Food"); @@ -202,6 +238,11 @@ namespace FoodOrderDatabaseImplement.Migrations b.Navigation("Orders"); }); + modelBuilder.Entity("FoodOrderDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Component", b => { b.Navigation("FoodComponents"); diff --git a/FoodOrders/FoodOrderDatabaseImplement/Models/Implementer.cs b/FoodOrders/FoodOrderDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..7ecb8e5 --- /dev/null +++ b/FoodOrders/FoodOrderDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,59 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDataModel.Models; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using FoodOrdersDatabaseImplement.Models; + +namespace FoodOrderDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; set; } + + [Required] + public string ImplementerFIO { get; set; } = string.Empty; + + [Required] + public int WorkExperience { get; set; } + [Required] + public int Qualification { get; set; } + + [Required] + public string Password { get; set; } = string.Empty; + + + [ForeignKey("ImplementerId")] + public virtual List Orders { get; set; } = new(); + + public static Implementer Create(ImplementerBindingModel model) + { + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + Password = model.Password + }; + } + + public void Update(ImplementerBindingModel model) + { + ImplementerFIO = model.ImplementerFIO; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + Password = model.Password; + } + + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + WorkExperience = WorkExperience, + Qualification = Qualification, + Password = Password + }; + + } +} diff --git a/FoodOrders/FoodOrderFileImplement/DataFileSingleton.cs b/FoodOrders/FoodOrderFileImplement/DataFileSingleton.cs index 7c9e753..1820eae 100644 --- a/FoodOrders/FoodOrderFileImplement/DataFileSingleton.cs +++ b/FoodOrders/FoodOrderFileImplement/DataFileSingleton.cs @@ -16,13 +16,15 @@ namespace FoodOrderFileImplement private readonly string OrderFileName = "Order.xml"; private readonly string FoodFileName = "Food.xml"; private readonly string ClientFileName = "Client.xml"; + private readonly string ImplementerFileName = "Implementer.xml"; - public List Components { get; private set; } + public List Components { get; private set; } public List Orders { get; private set; } public List Foods { get; private set; } public List Clients { get; private set; } - public static DataFileSingleton GetInstance() + public List Implementers { get; private set; } + public static DataFileSingleton GetInstance() { if (instance == null) { @@ -35,14 +37,16 @@ namespace FoodOrderFileImplement public void SaveFoods() => SaveData(Foods, FoodFileName, "Foods", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); + public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); - private DataFileSingleton() + private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; Foods = LoadData(FoodFileName, "Food", x => Food.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; - } + Implementers = LoadData(ImplementerFileName, "Implementers", x => Implementer.Create(x)!)!; + } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/FoodOrders/FoodOrderFileImplement/Implements/ImplementerStorage.cs b/FoodOrders/FoodOrderFileImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..9b5d8b9 --- /dev/null +++ b/FoodOrders/FoodOrderFileImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,90 @@ +using FoodOrderFileImplement.Models; +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.StoragesContracts; +using FoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrderFileImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataFileSingleton source; + public ImplementerStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Implementers + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(ImplementerSearchModel + model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && string.IsNullOrEmpty(model.Password)) + { + return new(); + } + return source.Implementers + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO) || x.Password.Contains(model.Password)) + .Select(x => x.GetViewModel) + .ToList(); + } + 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 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.SaveImplementers(); + 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.SaveImplementers(); + 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.SaveImplementers(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/FoodOrders/FoodOrderFileImplement/Models/Implementer.cs b/FoodOrders/FoodOrderFileImplement/Models/Implementer.cs new file mode 100644 index 0000000..f04181b --- /dev/null +++ b/FoodOrders/FoodOrderFileImplement/Models/Implementer.cs @@ -0,0 +1,77 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDataModel.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace FoodOrderFileImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + public string ImplementerFIO { get; private set; } = string.Empty; + public int WorkExperience { get; set; } + public int Qualification { get; set; } + public string Password { get; private set; } = string.Empty; + public static Implementer? Create(ImplementerBindingModel model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + Password = model.Password, + }; + } + public static Implementer? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Implementer() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ImplementerFIO = element.Element("ImplementerFIO")!.Value, + WorkExperience = Convert.ToInt32(element.Attribute("WorkExperience")!.Value), + Qualification = Convert.ToInt32(element.Attribute("Qualification")!.Value), + Password = element.Element("Password")!.Value, + }; + } + public void Update(ImplementerBindingModel model) + { + if (model == null) + { + return; + } + ImplementerFIO = model.ImplementerFIO; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + Password = model.Password; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + WorkExperience = WorkExperience, + Qualification = Qualification, + Password = Password, + }; + public XElement GetXElement => new("Implementer", + new XAttribute("Id", Id), + new XElement("ImplementerFIO", ImplementerFIO), + new XElement("WorkExperience", WorkExperience), + new XElement("Qualification", Qualification), + new XElement("Password", Password) + ); + } +} diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/ImplementerLogic.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/ImplementerLogic.cs new file mode 100644 index 0000000..5d3c8cb --- /dev/null +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/ImplementerLogic.cs @@ -0,0 +1,122 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.BusinessLogicsContracts; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.StoragesContracts; +using FoodOrdersContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrderBusinessLogic.BusinessLogic +{ + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + private readonly IImplementerStorage _implementerStorage; + public ImplementerLogic(ILogger logger, IImplementerStorage + implementerStorage) + { + _logger = logger; + _implementerStorage = implementerStorage; + } + public List? ReadList(ImplementerSearchModel? model) + { + _logger.LogInformation("ReadList. ImplementerName:{ImplementerFIO}.Id:{ Id}", model?.ImplementerFIO, model?.Id); + var list = model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + public ImplementerViewModel? ReadElement(ImplementerSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ImplementerName:{ImplementerFIO}. Id:{ Id}", model.ImplementerFIO, model.Id); + var element = _implementerStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + public bool Create(ImplementerBindingModel model) + { + CheckModel(model); + if (_implementerStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + public bool Update(ImplementerBindingModel model) + { + CheckModel(model); + if (_implementerStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + public bool Delete(ImplementerBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_implementerStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } + private void CheckModel(ImplementerBindingModel model, bool withParams = + true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + throw new ArgumentNullException("Нет имени исполнителя", nameof(model.ImplementerFIO)); + } + if (model.WorkExperience < 0) + { + throw new ArgumentNullException("Нет стажа исполнителя", nameof(model.WorkExperience)); + } + if (model.Qualification < 0) + { + throw new ArgumentNullException("Нет квалификации исполнителя", nameof(model.Qualification)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля клиента", nameof(model.Password)); + } + _logger.LogInformation("Implementer. ImplementerName:{ImplementerName}. Id: { Id}", model.ImplementerFIO, model.Id); + var element = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = model.ImplementerFIO + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Исполнитель с таким логином уже есть"); + } + } + } +} diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/OrderLogic.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/OrderLogic.cs index c464003..1628db3 100644 --- a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/OrderLogic.cs @@ -46,39 +46,63 @@ namespace PlumbingRepairBusinessLogic.BusinessLogic return true; } - public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus) - { - CheckModel(model); - if (model.Status + 1 != newStatus) - { - _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order status incorrect."); - return false; - } + public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus) + { + var viewModel = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); + if (viewModel == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (viewModel.Status + 1 != newStatus) + { + _logger.LogWarning("Update operation failed. Order status incorrect."); + return false; + } + model.Status = newStatus; + model.DateCreate = viewModel.DateCreate; + model.Sum = viewModel.Sum; + model.Count = viewModel.Count; + model.DateImplement = viewModel.DateImplement; + model.FoodId = viewModel.FoodId; + model.FoodName = viewModel.FoodName; + model.ClientId = viewModel.ClientId; + model.ClientName = viewModel.ClientName; + if (viewModel.ImplementerId.HasValue) + { + model.ImplementerId = viewModel.ImplementerId; + } + if (!string.IsNullOrEmpty(viewModel.ImplementerName)) + { + model.ImplementerName = viewModel.ImplementerName; + } + if (model.Status == OrderStatus.Готов) + { + model.DateImplement = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); + } + else + { + model.DateImplement = viewModel.DateImplement; - model.Status = newStatus; + } + CheckModel(model); + if (_orderStorage.Update(model) == null) + { + model.Status--; + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } - if (model.Status == OrderStatus.Выдан) - model.DateImplement = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); - - if (_orderStorage.Update(model) == null) - { - model.Status--; - _logger.LogWarning("Update operation failed"); - return false; - } - - return true; - } - - public bool TakeOrderInWork(OrderBindingModel model) + public bool TakeOrderInWork(OrderBindingModel model) { return StatusUpdate(model, OrderStatus.Выполняется); } public bool DeliveryOrder(OrderBindingModel model) { - return StatusUpdate(model, OrderStatus.Готов); + return StatusUpdate(model, OrderStatus.Выдан); } public bool FinishOrder(OrderBindingModel model) @@ -131,5 +155,20 @@ namespace PlumbingRepairBusinessLogic.BusinessLogic _logger.LogInformation("Order. OrderId:{Id}.Sum:{ Sum}. FoodId: { FoodId}", model.Id, model.Sum, model.FoodId); } - } + public OrderViewModel? ReadElement(OrderSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + var element = _orderStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; + } + } } diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/WorkModeling.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/WorkModeling.cs new file mode 100644 index 0000000..08f6c49 --- /dev/null +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogic/WorkModeling.cs @@ -0,0 +1,158 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.BusinessLogicsContracts; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDataModel.Enums; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrderBusinessLogic.BusinessLogic +{ + + public class WorkModeling : IWorkProcess + { + private readonly ILogger _logger; + + private readonly Random _rnd; + + private IOrderLogic? _orderLogic; + + public WorkModeling(ILogger logger) + { + _logger = logger; + _rnd = new Random(1000); + } + + public void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic) + { + _orderLogic = orderLogic; + var implementers = implementerLogic.ReadList(null); + if (implementers == null) + { + _logger.LogWarning("DoWork. Implementers is null"); + return; + } + var orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят }); + if (orders == null || orders.Count == 0) + { + _logger.LogWarning("DoWork. Orders is null or empty"); + return; + } + _logger.LogDebug("DoWork for {Count} orders", orders.Count); + foreach (var implementer in implementers) + { + Task.Run(() => WorkerWorkAsync(implementer, orders)); + } + } + + /// + /// Иммитация работы исполнителя + /// + /// + /// + private async Task WorkerWorkAsync(ImplementerViewModel implementer, List orders) + { + if (_orderLogic == null || implementer == null) + { + return; + } + await RunOrderInWork(implementer); + + await Task.Run(() => + { + foreach (var order in orders) + { + try + { + _logger.LogDebug("DoWork. Worker {Id} try get order {Order}", implementer.Id, order.Id); + // пытаемся назначить заказ на исполнителя + _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = order.Id, + ImplementerId = implementer.Id, + ImplementerName = implementer.ImplementerFIO + + + }); + // делаем работу + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = order.Id, + + + }); + // отдыхаем + Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); + } + // кто-то мог уже перехватить заказ, игнорируем ошибку + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + // заканчиваем выполнение имитации в случае иной ошибки + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + + } + }); + } + + /// + /// Ищем заказ, которые уже в работе (вдруг исполнителя прервали) + /// + /// + /// + private async Task RunOrderInWork(ImplementerViewModel implementer) + { + if (_orderLogic == null || implementer == null) + { + return; + } + try + { + var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel + { + ImplementerId = implementer.Id, + Status = OrderStatus.Выполняется + })); + if (runOrder == null) + { + return; + } + + _logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id); + // доделываем работу + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = runOrder.Id, + ImplementerId = implementer.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; + } + } + } +} diff --git a/FoodOrders/FoodOrdersContracts/BindingModels/ImplementerBindingModel.cs b/FoodOrders/FoodOrdersContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..1bda850 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,22 @@ +using FoodOrdersDataModel.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.BindingModels +{ + public class ImplementerBindingModel : IImplementerModel + { + public int Id { get; set; } + + public string ImplementerFIO { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public int WorkExperience { get; set; } + + public int Qualification { get; set; } + } +} diff --git a/FoodOrders/FoodOrdersContracts/BindingModels/OrderBindingModel.cs b/FoodOrders/FoodOrdersContracts/BindingModels/OrderBindingModel.cs index f69ee72..ca63176 100644 --- a/FoodOrders/FoodOrdersContracts/BindingModels/OrderBindingModel.cs +++ b/FoodOrders/FoodOrdersContracts/BindingModels/OrderBindingModel.cs @@ -15,8 +15,10 @@ namespace FoodOrdersContracts.BindingModels public string FoodName { get; set; } = string.Empty; public int ClientId { get; set; } public string ClientName { get; set; } = string.Empty; + public int? ImplementerId { get; set; } + public string? ImplementerName { get; set; } = string.Empty; - public int Count { get; set; } + public int Count { get; set; } public double Sum { get; set; } diff --git a/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IImplementerLogic.cs b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..cd0b557 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,24 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.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/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IOrderLogic.cs b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IOrderLogic.cs index 1ebe74a..341b82a 100644 --- a/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -7,7 +7,8 @@ namespace FoodOrdersContracts.BusinessLogicsContracts public interface IOrderLogic { 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/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IWorkProcess.cs b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..6296cd9 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.BusinessLogicsContracts +{ + public interface IWorkProcess + { + void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } +} diff --git a/FoodOrders/FoodOrdersContracts/SearchModels/ImplementerSearchModel.cs b/FoodOrders/FoodOrdersContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..97cc441 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.SearchModels +{ + public class ImplementerSearchModel + { + public int? Id { get; set; } + + public string? ImplementerFIO { get; set; } + + public string? Password { get; set; } + } +} diff --git a/FoodOrders/FoodOrdersContracts/SearchModels/OrderSearchModel.cs b/FoodOrders/FoodOrdersContracts/SearchModels/OrderSearchModel.cs index c30fe03..4864a50 100644 --- a/FoodOrders/FoodOrdersContracts/SearchModels/OrderSearchModel.cs +++ b/FoodOrders/FoodOrdersContracts/SearchModels/OrderSearchModel.cs @@ -1,4 +1,5 @@ -using System; +using FoodOrdersDataModel.Enums; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -10,7 +11,9 @@ namespace FoodOrdersContracts.SearchModels { public int? Id { get; set; } public int? ClientId { get; set; } - public DateTime? DateFrom { get; set; } + public int? ImplementerId { get; set; } + public OrderStatus Status { get; set; } + public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } } } diff --git a/FoodOrders/FoodOrdersContracts/StoragesContracts/IImplementerStorage.cs b/FoodOrders/FoodOrdersContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..5c61132 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,26 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.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/FoodOrders/FoodOrdersContracts/ViewModels/ImplementerViewModel.cs b/FoodOrders/FoodOrdersContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..9808cb4 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,27 @@ +using FoodOrdersDataModel.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.ViewModels +{ + public class ImplementerViewModel : IImplementerModel + { + public int Id { get; set; } + + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; } = string.Empty; + + [DisplayName("Пароль")] + public string Password { get; set; } = string.Empty; + + [DisplayName("Стаж работы")] + public int WorkExperience { get; set; } + + [DisplayName("Квалификация")] + public int Qualification { get; set; } + } +} diff --git a/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs b/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs index f7e0e0b..199f448 100644 --- a/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs +++ b/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs @@ -20,7 +20,10 @@ namespace FoodOrdersContracts.ViewModels [DisplayName("Клиент")] public string ClientName { get; set; } = string.Empty; [DisplayName(" Кол-во ")] - public int Count { get; set; } + public int? ImplementerId { get; set; } + [DisplayName("Исполнитель")] + public string? ImplementerName { get; set; } = string.Empty; + public int Count { get; set; } [DisplayName(" Сумма ")] public double Sum { get; set; } diff --git a/FoodOrders/FoodOrdersDataModel/Models/IImplementerModel.cs b/FoodOrders/FoodOrdersDataModel/Models/IImplementerModel.cs new file mode 100644 index 0000000..1c910a9 --- /dev/null +++ b/FoodOrders/FoodOrdersDataModel/Models/IImplementerModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersDataModel.Models +{ + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + string Password { get; } + int WorkExperience { get; } + int Qualification { get; } + } +} diff --git a/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs b/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs index b85883e..4e455d6 100644 --- a/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs +++ b/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs @@ -14,12 +14,15 @@ namespace FoodOrdersListImplement public List Orders { get; set; } public List Foods { get; set; } public List Clients { get; set; } - private DataListSingleton() + public List Implementers { get; set; } + private DataListSingleton() { Components = new List(); Orders = new List(); Foods = new List(); - } + Clients = new List(); + Implementers = new List(); + } public static DataListSingleton GetInstance() { if (_instance == null) diff --git a/FoodOrders/FoodOrdersListImplement/FoodOrdersListImplement.csproj b/FoodOrders/FoodOrdersListImplement/FoodOrdersListImplement.csproj index 5b834b9..800100b 100644 --- a/FoodOrders/FoodOrdersListImplement/FoodOrdersListImplement.csproj +++ b/FoodOrders/FoodOrdersListImplement/FoodOrdersListImplement.csproj @@ -13,6 +13,7 @@ + diff --git a/FoodOrders/FoodOrdersListImplement/Implements/ImplementerStorage.cs b/FoodOrders/FoodOrdersListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..91802d5 --- /dev/null +++ b/FoodOrders/FoodOrdersListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,126 @@ +using FoodOrdersListImplement.Models; +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.StoragesContracts; +using FoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersListImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataListSingleton _source; + + public ImplementerStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var result = new List(); + + foreach (var implementer in _source.Implementers) + { + result.Add(implementer.GetViewModel); + } + + return result; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + var result = new List(); + + if (string.IsNullOrEmpty(model.ImplementerFIO) && string.IsNullOrEmpty(model.Password)) + { + return result; + } + + foreach (var implementer in _source.Implementers) + { + if (implementer.ImplementerFIO.Contains(model.ImplementerFIO) || implementer.Password.Contains(model.Password)) + { + result.Add(implementer.GetViewModel); + } + } + + return result; + } + + 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 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; + } + } +} diff --git a/FoodOrders/FoodOrdersListImplement/Models/Implementer.cs b/FoodOrders/FoodOrdersListImplement/Models/Implementer.cs new file mode 100644 index 0000000..09d568a --- /dev/null +++ b/FoodOrders/FoodOrdersListImplement/Models/Implementer.cs @@ -0,0 +1,55 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDataModel.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersListImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + public string ImplementerFIO { get; private set; } = string.Empty; + public int WorkExperience { get; set; } + + public int Qualification { get; set; } + public string Password { get; private set; } = string.Empty; + public static Implementer? Create(ImplementerBindingModel? model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + Password = model.Password + }; + } + public void Update(ImplementerBindingModel? model) + { + if (model == null) + { + return; + } + ImplementerFIO = model.ImplementerFIO; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + Password = model.Password; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + WorkExperience = WorkExperience, + Qualification = Qualification, + Password = Password + }; + } +} diff --git a/FoodOrders/FoodOrdersRestApi/Controllers/ImplementerController.cs b/FoodOrders/FoodOrdersRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..d24b8a1 --- /dev/null +++ b/FoodOrders/FoodOrdersRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,107 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.BusinessLogicsContracts; +using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.ViewModels; +using FoodOrdersDataModel.Enums; +using Microsoft.AspNetCore.Mvc; + +namespace FoodOrdersRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class ImplementerController : Controller + { + private readonly ILogger _logger; + + private readonly IOrderLogic _order; + + private readonly IImplementerLogic _logic; + + public ImplementerController(IOrderLogic order, IImplementerLogic logic, ILogger logger) + { + _logger = logger; + _order = order; + _logic = logic; + } + + [HttpGet] + public ImplementerViewModel? Login(string login, string password) + { + try + { + return _logic.ReadElement(new ImplementerSearchModel + { + ImplementerFIO = login, + Password = password + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка авторизации сотрудника"); + throw; + } + } + + [HttpGet] + public List? GetNewOrders() + { + try + { + return _order.ReadList(new OrderSearchModel + { + Status = OrderStatus.Принят + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения новых заказов"); + throw; + } + } + + [HttpGet] + public OrderViewModel? GetImplementerOrder(int implementerId) + { + try + { + return _order.ReadElement(new OrderSearchModel + { + ImplementerId = implementerId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения текущего заказа исполнителя"); + throw; + } + } + + [HttpPost] + public void TakeOrderInWork(OrderBindingModel model) + { + try + { + _order.TakeOrderInWork(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу", model.Id); + throw; + } + } + + [HttpPost] + public void FinishOrder(OrderBindingModel model) + { + try + { + _order.FinishOrder(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа с №{Id}", model.Id); + throw; + } + } + } +} diff --git a/FoodOrders/FoodOrdersView/FormCreateOrder.Designer.cs b/FoodOrders/FoodOrdersView/FormCreateOrder.Designer.cs index 1050915..65bf2d0 100644 --- a/FoodOrders/FoodOrdersView/FormCreateOrder.Designer.cs +++ b/FoodOrders/FoodOrdersView/FormCreateOrder.Designer.cs @@ -1,144 +1,166 @@ namespace FoodOrdersView { - partial class FormCreateOrder - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; + partial class FormCreateOrder + { + /// + /// 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); - } + /// + /// 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 + #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() - { - this.WorkNameLabel = new System.Windows.Forms.Label(); - this.CountLabel = new System.Windows.Forms.Label(); - this.SumLabel = new System.Windows.Forms.Label(); - this.FoodComboBox = new System.Windows.Forms.ComboBox(); - this.CountTextBox = new System.Windows.Forms.TextBox(); - this.SumTextBox = new System.Windows.Forms.TextBox(); - this.SaveButton = new System.Windows.Forms.Button(); - this.ButtonCancel = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // WorkNameLabel - // - this.WorkNameLabel.AutoSize = true; - this.WorkNameLabel.Location = new System.Drawing.Point(25, 15); - this.WorkNameLabel.Name = "WorkNameLabel"; - this.WorkNameLabel.Size = new System.Drawing.Size(59, 15); - this.WorkNameLabel.TabIndex = 0; - this.WorkNameLabel.Text = "Изделие: "; - // - // CountLabel - // - this.CountLabel.AutoSize = true; - this.CountLabel.Location = new System.Drawing.Point(25, 44); - this.CountLabel.Name = "CountLabel"; - this.CountLabel.Size = new System.Drawing.Size(78, 15); - this.CountLabel.TabIndex = 1; - this.CountLabel.Text = "Количество: "; - // - // SumLabel - // - this.SumLabel.AutoSize = true; - this.SumLabel.Location = new System.Drawing.Point(25, 76); - this.SumLabel.Name = "SumLabel"; - this.SumLabel.Size = new System.Drawing.Size(51, 15); - this.SumLabel.TabIndex = 2; - this.SumLabel.Text = "Сумма: "; - // - // FoodComboBox - // - this.FoodComboBox.FormattingEnabled = true; - this.FoodComboBox.Location = new System.Drawing.Point(111, 15); - this.FoodComboBox.Name = "FoodComboBox"; - this.FoodComboBox.Size = new System.Drawing.Size(214, 23); - this.FoodComboBox.TabIndex = 4; - this.FoodComboBox.SelectedIndexChanged += new System.EventHandler(this.FoodComboBox_SelectedIndexChanged); - // - // CountTextBox - // - this.CountTextBox.Location = new System.Drawing.Point(111, 44); - this.CountTextBox.Name = "CountTextBox"; - this.CountTextBox.Size = new System.Drawing.Size(214, 23); - this.CountTextBox.TabIndex = 5; - this.CountTextBox.TextChanged += new System.EventHandler(this.CountTextBox_TextChanged); - // - // SumTextBox - // - this.SumTextBox.Enabled = false; - this.SumTextBox.Location = new System.Drawing.Point(111, 73); - this.SumTextBox.Name = "SumTextBox"; - this.SumTextBox.Size = new System.Drawing.Size(214, 23); - this.SumTextBox.TabIndex = 6; - // - // SaveButton - // - this.SaveButton.Location = new System.Drawing.Point(111, 115); - this.SaveButton.Name = "SaveButton"; - this.SaveButton.Size = new System.Drawing.Size(95, 23); - this.SaveButton.TabIndex = 7; - this.SaveButton.Text = "Сохранить"; - this.SaveButton.UseVisualStyleBackColor = true; - this.SaveButton.MouseClick += new System.Windows.Forms.MouseEventHandler(this.SaveButton_Click); - // - // ButtonCancel - // - this.ButtonCancel.Location = new System.Drawing.Point(230, 115); - this.ButtonCancel.Name = "ButtonCancel"; - this.ButtonCancel.Size = new System.Drawing.Size(95, 23); - this.ButtonCancel.TabIndex = 8; - this.ButtonCancel.Text = "Отменить"; - this.ButtonCancel.UseVisualStyleBackColor = true; - this.ButtonCancel.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ButtonCancel_Click); - // - // FormCreateOrder - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(350, 146); - this.Controls.Add(this.ButtonCancel); - this.Controls.Add(this.SaveButton); - this.Controls.Add(this.SumTextBox); - this.Controls.Add(this.CountTextBox); - this.Controls.Add(this.FoodComboBox); - this.Controls.Add(this.SumLabel); - this.Controls.Add(this.CountLabel); - this.Controls.Add(this.WorkNameLabel); - this.Name = "FormCreateOrder"; - this.Text = "Заказ"; - this.ResumeLayout(false); - this.PerformLayout(); + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + WorkNameLabel = new Label(); + CountLabel = new Label(); + SumLabel = new Label(); + FoodComboBox = new ComboBox(); + CountTextBox = new TextBox(); + SumTextBox = new TextBox(); + SaveButton = new Button(); + ButtonCancel = new Button(); + label1 = new Label(); + ClientcomboBox = new ComboBox(); + SuspendLayout(); + // + // WorkNameLabel + // + WorkNameLabel.AutoSize = true; + WorkNameLabel.Location = new Point(25, 15); + WorkNameLabel.Name = "WorkNameLabel"; + WorkNameLabel.Size = new Size(59, 15); + WorkNameLabel.TabIndex = 0; + WorkNameLabel.Text = "Изделие: "; + // + // CountLabel + // + CountLabel.AutoSize = true; + CountLabel.Location = new Point(25, 44); + CountLabel.Name = "CountLabel"; + CountLabel.Size = new Size(78, 15); + CountLabel.TabIndex = 1; + CountLabel.Text = "Количество: "; + // + // SumLabel + // + SumLabel.AutoSize = true; + SumLabel.Location = new Point(25, 105); + SumLabel.Name = "SumLabel"; + SumLabel.Size = new Size(51, 15); + SumLabel.TabIndex = 2; + SumLabel.Text = "Сумма: "; + // + // FoodComboBox + // + FoodComboBox.FormattingEnabled = true; + FoodComboBox.Location = new Point(111, 15); + FoodComboBox.Name = "FoodComboBox"; + FoodComboBox.Size = new Size(214, 23); + FoodComboBox.TabIndex = 4; + FoodComboBox.SelectedIndexChanged += FoodComboBox_SelectedIndexChanged; + // + // CountTextBox + // + CountTextBox.Location = new Point(111, 44); + CountTextBox.Name = "CountTextBox"; + CountTextBox.Size = new Size(214, 23); + CountTextBox.TabIndex = 5; + CountTextBox.TextChanged += CountTextBox_TextChanged; + // + // SumTextBox + // + SumTextBox.Enabled = false; + SumTextBox.Location = new Point(111, 102); + SumTextBox.Name = "SumTextBox"; + SumTextBox.Size = new Size(214, 23); + SumTextBox.TabIndex = 6; + // + // SaveButton + // + SaveButton.Location = new Point(111, 148); + SaveButton.Name = "SaveButton"; + SaveButton.Size = new Size(95, 23); + SaveButton.TabIndex = 7; + SaveButton.Text = "Сохранить"; + SaveButton.UseVisualStyleBackColor = true; + SaveButton.MouseClick += SaveButton_Click; + // + // ButtonCancel + // + ButtonCancel.Location = new Point(230, 148); + ButtonCancel.Name = "ButtonCancel"; + ButtonCancel.Size = new Size(95, 23); + ButtonCancel.TabIndex = 8; + ButtonCancel.Text = "Отменить"; + ButtonCancel.UseVisualStyleBackColor = true; + ButtonCancel.MouseClick += ButtonCancel_Click; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(25, 76); + label1.Name = "label1"; + label1.Size = new Size(46, 15); + label1.TabIndex = 9; + label1.Text = "Клиент"; + // + // ClientcomboBox + // + ClientcomboBox.FormattingEnabled = true; + ClientcomboBox.Location = new Point(111, 73); + ClientcomboBox.Name = "ClientcomboBox"; + ClientcomboBox.Size = new Size(214, 23); + ClientcomboBox.TabIndex = 10; + // + // FormCreateOrder + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(350, 183); + Controls.Add(ClientcomboBox); + Controls.Add(label1); + Controls.Add(ButtonCancel); + Controls.Add(SaveButton); + Controls.Add(SumTextBox); + Controls.Add(CountTextBox); + Controls.Add(FoodComboBox); + Controls.Add(SumLabel); + Controls.Add(CountLabel); + Controls.Add(WorkNameLabel); + Name = "FormCreateOrder"; + Text = "Заказ"; + ResumeLayout(false); + PerformLayout(); + } - } + #endregion - #endregion - - private Label WorkNameLabel; - private Label CountLabel; - private Label SumLabel; - private ComboBox FoodComboBox; - private TextBox CountTextBox; - private TextBox SumTextBox; - private Button SaveButton; - private Button ButtonCancel; - } + private Label WorkNameLabel; + private Label CountLabel; + private Label SumLabel; + private ComboBox FoodComboBox; + private TextBox CountTextBox; + private TextBox SumTextBox; + private Button SaveButton; + private Button ButtonCancel; + private Label label1; + private ComboBox ClientcomboBox; + } } \ No newline at end of file diff --git a/FoodOrders/FoodOrdersView/FormCreateOrder.cs b/FoodOrders/FoodOrdersView/FormCreateOrder.cs index 06dd858..718d86c 100644 --- a/FoodOrders/FoodOrdersView/FormCreateOrder.cs +++ b/FoodOrders/FoodOrdersView/FormCreateOrder.cs @@ -14,133 +14,140 @@ using System.Windows.Forms; namespace FoodOrdersView { - public partial class FormCreateOrder : Form - { - private readonly ILogger _logger; - private readonly IFoodLogic _logicW; - private readonly IOrderLogic _logicO; + public partial class FormCreateOrder : Form + { + private readonly ILogger _logger; + private readonly IFoodLogic _logicFood; + private readonly IOrderLogic _logicOrder; + private readonly IClientLogic _logicClient; - public FormCreateOrder(ILogger logger, IFoodLogic logicF, IOrderLogic logicO) - { - InitializeComponent(); - _logger = logger; - _logicW = logicF; - _logicO = logicO; - LoadData(); - } + public FormCreateOrder(ILogger logger, IFoodLogic logicCar, IOrderLogic logicOrder, IClientLogic logicClient) + { + InitializeComponent(); + _logger = logger; + _logicFood = logicCar; + _logicOrder = logicOrder; + _logicClient = logicClient; + LoadData(); + } - private void FormCreateOrder_Load(object sender, EventArgs e) - { - LoadData(); - } + private void LoadData() + { + _logger.LogInformation("Загрузка изделий для заказа"); - private void LoadData() - { - _logger.LogInformation("Загрузка изделий для заказа"); + try + { + var listC = _logicClient.ReadList(null); + var list = _logicFood.ReadList(null); + if (list != null && listC != null) + { + FoodComboBox.DisplayMember = "FoodName"; + FoodComboBox.ValueMember = "Id"; + FoodComboBox.DataSource = list; + FoodComboBox.SelectedItem = null; - try - { - var list = _logicW.ReadList(null); - if (list != null) - { - FoodComboBox.DisplayMember = "FoodName"; - FoodComboBox.ValueMember = "Id"; - FoodComboBox.DataSource = list; - FoodComboBox.SelectedItem = null; - } + ClientcomboBox.DisplayMember = "Email"; + ClientcomboBox.ValueMember = "Id"; + ClientcomboBox.DataSource = listC; + ClientcomboBox.SelectedItem = null; + } - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки списка изделий"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка изделий"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } - private void CalcSum() - { - if (FoodComboBox.SelectedValue != null && !string.IsNullOrEmpty(CountTextBox.Text)) - { - try - { - int id = Convert.ToInt32(FoodComboBox.SelectedValue); + private void FormCreateOrder_Load(object sender, EventArgs e) + { + LoadData(); + } - var product = _logicW.ReadElement(new FoodSearchModel - { - Id = id - }); + private void CalcSum() + { + if (FoodComboBox.SelectedValue != null && !string.IsNullOrEmpty(CountTextBox.Text)) + { + try + { + int id = Convert.ToInt32(FoodComboBox.SelectedValue); - int count = Convert.ToInt32(CountTextBox.Text); - SumTextBox.Text = Math.Round(count * (product?.Price ?? 0), 2).ToString(); - _logger.LogInformation("Расчет суммы заказа"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка расчета суммы заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + var car = _logicFood.ReadElement(new FoodSearchModel + { + Id = id + }); - private void CountTextBox_TextChanged(object sender, EventArgs e) - { - CalcSum(); - } + int count = Convert.ToInt32(CountTextBox.Text); + SumTextBox.Text = Math.Round(count * (car?.Price ?? 0), 2).ToString(); + _logger.LogInformation("Расчет суммы заказа"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка расчета суммы заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void FoodComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - CalcSum(); - } + private void CountTextBox_TextChanged(object sender, EventArgs e) + { + CalcSum(); + } - private void SaveButton_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(CountTextBox.Text)) - { - MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } + private void FoodComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + CalcSum(); + } - if (FoodComboBox.SelectedValue == null) - { - MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } + private void SaveButton_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(CountTextBox.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - _logger.LogInformation("Создание заказа"); + if (FoodComboBox.SelectedValue == null) + { + MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - try - { - var operationResult = _logicO.CreateOrder(new OrderBindingModel - { - FoodId = Convert.ToInt32(FoodComboBox.SelectedValue), - FoodName = FoodComboBox.Text, - ClientId = 0, - ClientName = "Admin", - Count = Convert.ToInt32(CountTextBox.Text), - Sum = Convert.ToDouble(SumTextBox.Text) - }) ; + _logger.LogInformation("Создание заказа"); - if (!operationResult) - { - throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); - } + try + { + var operationResult = _logicOrder.CreateOrder(new OrderBindingModel + { + FoodId = Convert.ToInt32(FoodComboBox.SelectedValue), + FoodName = FoodComboBox.Text, + ClientId = Convert.ToInt32(ClientcomboBox.SelectedValue), + ClientName = ClientcomboBox.Text, + Count = Convert.ToInt32(CountTextBox.Text), + Sum = Convert.ToDouble(SumTextBox.Text), + }); - MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); - DialogResult = DialogResult.OK; - Close(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка создания заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + if (!operationResult) + { + throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); + } - private void ButtonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } + 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/FoodOrders/FoodOrdersView/FormImplementer.Designer.cs b/FoodOrders/FoodOrdersView/FormImplementer.Designer.cs new file mode 100644 index 0000000..92bf36e --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementer.Designer.cs @@ -0,0 +1,164 @@ +namespace FoodOrdersView +{ + 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() + { + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); + ImplementerNameTextBox = new TextBox(); + PasswordTextBox = new TextBox(); + WorkExtextBox = new TextBox(); + QualificationtextBox = new TextBox(); + label4 = new Label(); + save_button = new Button(); + cancel_button = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(8, 11); + label1.Name = "label1"; + label1.Size = new Size(34, 15); + label1.TabIndex = 0; + label1.Text = "ФИО"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(8, 40); + label2.Name = "label2"; + label2.Size = new Size(49, 15); + label2.TabIndex = 1; + label2.Text = "Пароль"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(8, 69); + label3.Name = "label3"; + label3.Size = new Size(35, 15); + label3.TabIndex = 2; + label3.Text = "Стаж"; + // + // ImplementerNameTextBox + // + ImplementerNameTextBox.Location = new Point(52, 8); + ImplementerNameTextBox.Name = "ImplementerNameTextBox"; + ImplementerNameTextBox.Size = new Size(321, 23); + ImplementerNameTextBox.TabIndex = 3; + // + // PasswordTextBox + // + PasswordTextBox.Location = new Point(63, 37); + PasswordTextBox.Name = "PasswordTextBox"; + PasswordTextBox.Size = new Size(310, 23); + PasswordTextBox.TabIndex = 4; + // + // WorkExtextBox + // + WorkExtextBox.Location = new Point(52, 66); + WorkExtextBox.Name = "WorkExtextBox"; + WorkExtextBox.Size = new Size(321, 23); + WorkExtextBox.TabIndex = 5; + // + // QualificationtextBox + // + QualificationtextBox.Location = new Point(102, 95); + QualificationtextBox.Name = "QualificationtextBox"; + QualificationtextBox.Size = new Size(271, 23); + QualificationtextBox.TabIndex = 6; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(8, 98); + label4.Name = "label4"; + label4.Size = new Size(88, 15); + label4.TabIndex = 7; + label4.Text = "Квалификация"; + // + // save_button + // + save_button.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + save_button.Location = new Point(60, 124); + save_button.Name = "save_button"; + save_button.Size = new Size(75, 23); + save_button.TabIndex = 8; + save_button.Text = "Сохранить"; + save_button.UseVisualStyleBackColor = true; + save_button.Click += save_button_Click; + // + // cancel_button + // + cancel_button.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + cancel_button.Location = new Point(256, 124); + cancel_button.Name = "cancel_button"; + cancel_button.Size = new Size(75, 23); + cancel_button.TabIndex = 9; + cancel_button.Text = "Отмена"; + cancel_button.UseVisualStyleBackColor = true; + cancel_button.Click += cancel_button_Click; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(385, 153); + Controls.Add(cancel_button); + Controls.Add(save_button); + Controls.Add(label4); + Controls.Add(QualificationtextBox); + Controls.Add(WorkExtextBox); + Controls.Add(PasswordTextBox); + Controls.Add(ImplementerNameTextBox); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Name = "FormImplementer"; + Text = "FormImplementer"; + this.Load += new System.EventHandler(this.FormImplementer_Load); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private Label label3; + private TextBox ImplementerNameTextBox; + private TextBox PasswordTextBox; + private TextBox WorkExtextBox; + private TextBox QualificationtextBox; + private Label label4; + private Button save_button; + private Button cancel_button; + } +} \ No newline at end of file diff --git a/FoodOrders/FoodOrdersView/FormImplementer.cs b/FoodOrders/FoodOrdersView/FormImplementer.cs new file mode 100644 index 0000000..c416a76 --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementer.cs @@ -0,0 +1,121 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.BusinessLogicsContracts; +using FoodOrdersContracts.SearchModels; +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 FoodOrdersView +{ + 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) + { + ImplementerNameTextBox.Text = view.ImplementerFIO; + PasswordTextBox.Text = view.Password.ToString(); + WorkExtextBox.Text = view.WorkExperience.ToString(); + QualificationtextBox.Text = view.Qualification.ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + private void save_button_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(ImplementerNameTextBox.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(PasswordTextBox.Text)) + { + MessageBox.Show("Заполните пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(WorkExtextBox.Text)) + { + MessageBox.Show("Заполните стаж", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(QualificationtextBox.Text)) + { + MessageBox.Show("Заполните квалификацию", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + _logger.LogInformation("Сохранение исполнителя"); + + try + { + var model = new ImplementerBindingModel + { + Id = _id ?? 0, + ImplementerFIO = ImplementerNameTextBox.Text, + Password = PasswordTextBox.Text, + WorkExperience = Convert.ToInt32(WorkExtextBox.Text), + Qualification = Convert.ToInt32(QualificationtextBox.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 cancel_button_Click(object sender, EventArgs e) + { + + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/FoodOrders/FoodOrdersView/FormImplementer.resx b/FoodOrders/FoodOrdersView/FormImplementer.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementer.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/FoodOrders/FoodOrdersView/FormImplementers.Designer.cs b/FoodOrders/FoodOrdersView/FormImplementers.Designer.cs new file mode 100644 index 0000000..698fa56 --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementers.Designer.cs @@ -0,0 +1,113 @@ +namespace FoodOrdersView +{ + 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(); + AddButton = new Button(); + ChangeButton = new Button(); + DeleteButton = new Button(); + UpdateButton = new Button(); + ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); + SuspendLayout(); + // + // DataGridView + // + DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DataGridView.Location = new Point(12, 12); + DataGridView.Name = "DataGridView"; + DataGridView.RowTemplate.Height = 25; + DataGridView.Size = new Size(574, 426); + DataGridView.TabIndex = 0; + // + // AddButton + // + AddButton.Location = new Point(592, 12); + AddButton.Name = "AddButton"; + AddButton.Size = new Size(128, 42); + AddButton.TabIndex = 1; + AddButton.Text = "Добавить"; + AddButton.UseVisualStyleBackColor = true; + AddButton.Click += AddButton_Click; + // + // ChangeButton + // + ChangeButton.Location = new Point(592, 60); + ChangeButton.Name = "ChangeButton"; + ChangeButton.Size = new Size(128, 42); + ChangeButton.TabIndex = 2; + ChangeButton.Text = "Изменить"; + ChangeButton.UseVisualStyleBackColor = true; + ChangeButton.Click += ChangeButton_Click; + // + // DeleteButton + // + DeleteButton.Location = new Point(592, 108); + DeleteButton.Name = "DeleteButton"; + DeleteButton.Size = new Size(128, 42); + DeleteButton.TabIndex = 3; + DeleteButton.Text = "Удалить"; + DeleteButton.UseVisualStyleBackColor = true; + DeleteButton.Click += DeleteButton_Click; + // + // UpdateButton + // + UpdateButton.Location = new Point(592, 156); + UpdateButton.Name = "UpdateButton"; + UpdateButton.Size = new Size(128, 42); + UpdateButton.TabIndex = 4; + UpdateButton.Text = "Обновить"; + UpdateButton.UseVisualStyleBackColor = true; + UpdateButton.Click += UpdateButton_Click; + // + // FormImplementers + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(UpdateButton); + Controls.Add(DeleteButton); + Controls.Add(ChangeButton); + Controls.Add(AddButton); + Controls.Add(DataGridView); + Name = "FormImplementers"; + Text = "FormImplementers"; + Load += FormImplementers_Load; + ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView DataGridView; + private Button AddButton; + private Button ChangeButton; + private Button DeleteButton; + private Button UpdateButton; + } +} \ No newline at end of file diff --git a/FoodOrders/FoodOrdersView/FormImplementers.cs b/FoodOrders/FoodOrdersView/FormImplementers.cs new file mode 100644 index 0000000..39cf8ba --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementers.cs @@ -0,0 +1,119 @@ +using FoodOrdersContracts.BindingModels; +using FoodOrdersContracts.BusinessLogicsContracts; +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 FoodOrdersView +{ + public partial class FormImplementers : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _logic; + public FormImplementers(ILogger logger, IImplementerLogic + logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + LoadData(); + } + 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 AddButton_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + if (service is FormImplementer form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void ChangeButton_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 DeleteButton_Click(object sender, EventArgs e) + { + if (DataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = + Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление исполнителя"); + try + { + if (!_logic.Delete(new ImplementerBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении.Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления компонента"); + MessageBox.Show(ex.Message, "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void UpdateButton_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/FoodOrders/FoodOrdersView/FormImplementers.resx b/FoodOrders/FoodOrdersView/FormImplementers.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/FoodOrders/FoodOrdersView/FormImplementers.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/FoodOrders/FoodOrdersView/FormMain.Designer.cs b/FoodOrders/FoodOrdersView/FormMain.Designer.cs index d09e42c..c93d58b 100644 --- a/FoodOrders/FoodOrdersView/FormMain.Designer.cs +++ b/FoodOrders/FoodOrdersView/FormMain.Designer.cs @@ -36,22 +36,23 @@ списокКомпонентовToolStripMenuItem = new ToolStripMenuItem(); компоненToolStripMenuItem = new ToolStripMenuItem(); списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + исполнителиToolStripMenuItem = new ToolStripMenuItem(); + начатьРаботуToolStripMenuItem = new ToolStripMenuItem(); dataGridView1 = new DataGridView(); CreateOrderButton = new Button(); - TakeOrderInWorkButton = new Button(); - OrderReadyButton = new Button(); - IssuedOrderButton = new Button(); UpdateListButton = new Button(); + IssuedOrderButton = new Button(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); SuspendLayout(); // // menuStrip1 // - menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem }); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem, начатьРаботуToolStripMenuItem }); menuStrip1.Location = new Point(0, 0); menuStrip1.Name = "menuStrip1"; - menuStrip1.Size = new Size(700, 24); + menuStrip1.Size = new Size(744, 24); menuStrip1.TabIndex = 0; menuStrip1.Text = "menuStrip1"; // @@ -104,20 +105,41 @@ списокЗаказовToolStripMenuItem.Text = "Список заказов"; списокЗаказовToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(67, 20); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + // + // исполнителиToolStripMenuItem + // + исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; + исполнителиToolStripMenuItem.Size = new Size(94, 20); + исполнителиToolStripMenuItem.Text = "Исполнители"; + исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; + // + // начатьРаботуToolStripMenuItem + // + начатьРаботуToolStripMenuItem.Name = "начатьРаботуToolStripMenuItem"; + начатьРаботуToolStripMenuItem.Size = new Size(99, 20); + начатьРаботуToolStripMenuItem.Text = "Начать работу"; + начатьРаботуToolStripMenuItem.Click += начатьРаботуToolStripMenuItem_Click; + // // dataGridView1 // dataGridView1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView1.Location = new Point(0, 27); + dataGridView1.Location = new Point(12, 27); dataGridView1.Name = "dataGridView1"; dataGridView1.RowTemplate.Height = 25; - dataGridView1.Size = new Size(568, 341); + dataGridView1.Size = new Size(600, 341); dataGridView1.TabIndex = 1; // // CreateOrderButton // CreateOrderButton.Anchor = AnchorStyles.Right; - CreateOrderButton.Location = new Point(574, 27); + CreateOrderButton.Location = new Point(618, 27); CreateOrderButton.Name = "CreateOrderButton"; CreateOrderButton.Size = new Size(122, 41); CreateOrderButton.TabIndex = 2; @@ -125,43 +147,10 @@ CreateOrderButton.UseVisualStyleBackColor = true; CreateOrderButton.Click += CreateOrderButton_Click; // - // TakeOrderInWorkButton - // - TakeOrderInWorkButton.Anchor = AnchorStyles.Right; - TakeOrderInWorkButton.Location = new Point(574, 74); - TakeOrderInWorkButton.Name = "TakeOrderInWorkButton"; - TakeOrderInWorkButton.Size = new Size(122, 41); - TakeOrderInWorkButton.TabIndex = 3; - TakeOrderInWorkButton.Text = "Отдать на выполнение"; - TakeOrderInWorkButton.UseVisualStyleBackColor = true; - TakeOrderInWorkButton.Click += TakeOrderInWorkButton_Click; - // - // OrderReadyButton - // - OrderReadyButton.Anchor = AnchorStyles.Right; - OrderReadyButton.Location = new Point(574, 121); - OrderReadyButton.Name = "OrderReadyButton"; - OrderReadyButton.Size = new Size(122, 41); - OrderReadyButton.TabIndex = 4; - OrderReadyButton.Text = "Заказ готов"; - OrderReadyButton.UseVisualStyleBackColor = true; - OrderReadyButton.Click += OrderReadyButton_Click; - // - // IssuedOrderButton - // - IssuedOrderButton.Anchor = AnchorStyles.Right; - IssuedOrderButton.Location = new Point(574, 168); - IssuedOrderButton.Name = "IssuedOrderButton"; - IssuedOrderButton.Size = new Size(122, 41); - IssuedOrderButton.TabIndex = 5; - IssuedOrderButton.Text = "Заказ выдан"; - IssuedOrderButton.UseVisualStyleBackColor = true; - IssuedOrderButton.Click += IssuedOrderButton_Click; - // // UpdateListButton // UpdateListButton.Anchor = AnchorStyles.Right; - UpdateListButton.Location = new Point(574, 215); + UpdateListButton.Location = new Point(618, 121); UpdateListButton.Name = "UpdateListButton"; UpdateListButton.Size = new Size(122, 41); UpdateListButton.TabIndex = 6; @@ -169,15 +158,24 @@ UpdateListButton.UseVisualStyleBackColor = true; UpdateListButton.Click += UpdateListButton_Click; // + // IssuedOrderButton + // + IssuedOrderButton.Anchor = AnchorStyles.Right; + IssuedOrderButton.Location = new Point(618, 74); + IssuedOrderButton.Name = "IssuedOrderButton"; + IssuedOrderButton.Size = new Size(122, 41); + IssuedOrderButton.TabIndex = 7; + IssuedOrderButton.Text = "Изменить"; + IssuedOrderButton.UseVisualStyleBackColor = true; + IssuedOrderButton.Click += IssuedOrderButton_Click_1; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(700, 380); - Controls.Add(UpdateListButton); + ClientSize = new Size(744, 380); Controls.Add(IssuedOrderButton); - Controls.Add(OrderReadyButton); - Controls.Add(TakeOrderInWorkButton); + Controls.Add(UpdateListButton); Controls.Add(CreateOrderButton); Controls.Add(dataGridView1); Controls.Add(menuStrip1); @@ -200,13 +198,14 @@ private ToolStripMenuItem компонентыToolStripMenuItem; private DataGridView dataGridView1; private Button CreateOrderButton; - private Button TakeOrderInWorkButton; - private Button OrderReadyButton; - private Button IssuedOrderButton; private Button UpdateListButton; private ToolStripMenuItem отчетыToolStripMenuItem; private ToolStripMenuItem списокКомпонентовToolStripMenuItem; private ToolStripMenuItem компоненToolStripMenuItem; private ToolStripMenuItem списокЗаказовToolStripMenuItem; + private ToolStripMenuItem клиентыToolStripMenuItem; + private ToolStripMenuItem исполнителиToolStripMenuItem; + private ToolStripMenuItem начатьРаботуToolStripMenuItem; + private Button IssuedOrderButton; } } \ No newline at end of file diff --git a/FoodOrders/FoodOrdersView/FormMain.cs b/FoodOrders/FoodOrdersView/FormMain.cs index 5488166..a39a093 100644 --- a/FoodOrders/FoodOrdersView/FormMain.cs +++ b/FoodOrders/FoodOrdersView/FormMain.cs @@ -11,13 +11,15 @@ namespace FoodOrdersView private readonly ILogger _logger; private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportlogic; + private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IReportLogic reportLogic, IOrderLogic orderLogic) + 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) @@ -37,6 +39,7 @@ namespace FoodOrdersView dataGridView1.DataSource = list; dataGridView1.Columns["FoodId"].Visible = false; dataGridView1.Columns["ClientId"].Visible = false; + dataGridView1.Columns["ImplementerId"].Visible = false; } _logger.LogInformation("Загрузка заказов"); @@ -213,5 +216,68 @@ namespace FoodOrdersView MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } } + + private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) + { + + var service = Program.ServiceProvider?.GetService(typeof(FormClients)); + if (service is FormClients form) + { + form.ShowDialog(); + } + } + + private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementers form) + { + form.ShowDialog(); + } + } + + private void начатьРаботуToolStripMenuItem_Click(object sender, EventArgs e) + { + _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void IssuedOrderButton_Click_1(object sender, EventArgs e) + { + if (dataGridView1.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); + + try + { + var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel + { + Id = id, + FoodId = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["FoodId"].Value), + FoodName = dataGridView1.SelectedRows[0].Cells["FoodName"].Value.ToString(), + Status = Enum.Parse(dataGridView1.SelectedRows[0].Cells["Status"].Value.ToString()), + Count = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Count"].Value), + Sum = double.Parse(dataGridView1.SelectedRows[0].Cells["Sum"].Value.ToString()), + DateCreate = DateTime.Parse(dataGridView1.SelectedRows[0].Cells["DateCreate"].Value.ToString()), + + }); + + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + + _logger.LogInformation("Заказ №{id} выдан", id); + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } } } diff --git a/FoodOrders/FoodOrdersView/Program.cs b/FoodOrders/FoodOrdersView/Program.cs index cc1cc78..6f965b5 100644 --- a/FoodOrders/FoodOrdersView/Program.cs +++ b/FoodOrders/FoodOrdersView/Program.cs @@ -40,18 +40,21 @@ namespace FoodOrdersView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -61,6 +64,8 @@ namespace FoodOrdersView services.AddTransient(); services.AddTransient(); services.AddTransient<>(); - } + services.AddTransient(); + services.AddTransient(); + } } } \ No newline at end of file diff --git a/FoodOrders/Temp.txt b/FoodOrders/Temp.txt new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/FoodOrders/Temp.txt @@ -0,0 +1 @@ + \ No newline at end of file