From 131a107746eabf4bbf0b9765a8c766ea2d99f3d5 Mon Sep 17 00:00:00 2001 From: "ns.potapov" Date: Mon, 20 May 2024 03:54:09 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BB=D0=BE=D0=B2=D0=B8=D0=BB=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=20=D0=BC=D0=B0=D0=B3=D0=B0=D0=B7?= =?UTF-8?q?=D0=B8=D0=BD=D1=8B:=20=D1=83=20=D0=BC=D0=B0=D0=B3=D0=B0=D0=B7?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B8=D1=81=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D1=82=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B5=D0=B9=20?= =?UTF-8?q?=D1=81=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/OrderLogic.cs | 3 + .../BusinessLogics/ShopLogic.cs | 7 +- .../ViewModels/ShopViewModel.cs | 2 +- .../Implements/SecureStorage.cs | 35 +-- .../Implements/ShopStorage.cs | 6 +- .../20240519222424_AddShops.Designer.cs | 248 ++++++++++++++++++ .../Migrations/20240519222424_AddShops.cs | 78 ++++++ .../SecuritySystemDatabaseModelSnapshot.cs | 77 ++++++ .../SecuritySystemView/FormMain.Designer.cs | 29 +- SecuritySystem/SecuritySystemView/FormMain.cs | 10 + .../SecuritySystemView/FormMain.resx | 2 +- SecuritySystem/SecuritySystemView/Program.cs | 2 + .../Shop/FormShop.Designer.cs | 27 +- .../SecuritySystemView/Shop/FormShop.cs | 10 +- .../SecuritySystemView/Shop/FormShop.resx | 12 +- .../Shop/FormShopSell.Designer.cs | 125 +++++++++ .../SecuritySystemView/Shop/FormShopSell.cs | 85 ++++++ .../SecuritySystemView/Shop/FormShopSell.resx | 120 +++++++++ 18 files changed, 832 insertions(+), 46 deletions(-) create mode 100644 SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.Designer.cs create mode 100644 SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.cs create mode 100644 SecuritySystem/SecuritySystemView/Shop/FormShopSell.Designer.cs create mode 100644 SecuritySystem/SecuritySystemView/Shop/FormShopSell.cs create mode 100644 SecuritySystem/SecuritySystemView/Shop/FormShopSell.resx diff --git a/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/OrderLogic.cs b/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/OrderLogic.cs index d8663ec..844b960 100644 --- a/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/OrderLogic.cs @@ -58,6 +58,9 @@ namespace SecuritySystemBusinessLogic.BusinessLogics _logger.LogWarning("Read operation failed"); return false; } + model.SecureId = element.SecureId; + model.Count = element.Count; + model.Sum = element.Sum; if (element.Status != targetStatus - 1) { _logger.LogWarning("Status change operation failed"); diff --git a/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/ShopLogic.cs b/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/ShopLogic.cs index 7d1e93d..de7e5f2 100644 --- a/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/ShopLogic.cs +++ b/SecuritySystem/SecuritySystemBusinessLogic/BusinessLogics/ShopLogic.cs @@ -153,6 +153,11 @@ namespace SecuritySystemBusinessLogic.BusinessLogics _logger.LogInformation("Shop element found. ID: {0}, Name: {1}", shopElement.Id, shopElement.Name); + if (GetFreeSpace(shopElement.Id) < count) + { + throw new InvalidOperationException("В магазине не хватает места"); + } + if (shopElement.ShopSecures.TryGetValue(secure.Id, out var sameSecure)) { shopElement.ShopSecures[secure.Id] = (secure, sameSecure.Item2 + count); @@ -187,7 +192,7 @@ namespace SecuritySystemBusinessLogic.BusinessLogics foreach (var shop in shops) { int shopFreeSpace = GetFreeSpace(shop.Id); - if (shopFreeSpace >= 0) + if (shopFreeSpace > 0) { int min = Math.Min(count, shopFreeSpace); count -= min; diff --git a/SecuritySystem/SecuritySystemContracts/ViewModels/ShopViewModel.cs b/SecuritySystem/SecuritySystemContracts/ViewModels/ShopViewModel.cs index e8bc4ca..1fb3d93 100644 --- a/SecuritySystem/SecuritySystemContracts/ViewModels/ShopViewModel.cs +++ b/SecuritySystem/SecuritySystemContracts/ViewModels/ShopViewModel.cs @@ -10,7 +10,7 @@ namespace SecuritySystemContracts.ViewModels public string Name { get; set; } = string.Empty; [DisplayName("Адрес")] public string Address { get; set; } = string.Empty; - [DisplayName("Макс. кол-во товара")] + [DisplayName("Вместимость")] public int MaxSecuresCount { get; set; } [DisplayName("Дата открытия")] public DateTime OpeningDate { get; set; } diff --git a/SecuritySystem/SecuritySystemDatabaseImplement/Implements/SecureStorage.cs b/SecuritySystem/SecuritySystemDatabaseImplement/Implements/SecureStorage.cs index fba3c62..e002da6 100644 --- a/SecuritySystem/SecuritySystemDatabaseImplement/Implements/SecureStorage.cs +++ b/SecuritySystem/SecuritySystemDatabaseImplement/Implements/SecureStorage.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; using SecuritySystemContracts.BindingModels; using SecuritySystemContracts.SearchModels; using SecuritySystemContracts.StoragesContracts; @@ -15,41 +16,25 @@ namespace SecuritySystemDatabaseImplement.Implements return context.Secures .Include(x => x.Components) .ThenInclude(x => x.Component) - .ToList() .Select(x => x.GetViewModel) .ToList(); } public List GetFilteredList(SecureSearchModel model) { - if (string.IsNullOrEmpty(model.SecureName)) + var secures = GetFullList(); + if (model.Id != null) { - return new(); + secures = secures.Where(x => x.Id == model.Id).ToList(); } - using var context = new SecuritySystemDatabase(); - return context.Secures - .Include(x => x.Components) - .ThenInclude(x => x.Component) - .Where(x => x.SecureName.Contains(model.SecureName)) - .ToList() - .Select(x => x.GetViewModel) - .ToList(); + if (!model.SecureName.IsNullOrEmpty()) + { + secures = secures.Where(x => x.SecureName == model.SecureName).ToList(); + } + return secures; } public SecureViewModel? GetElement(SecureSearchModel model) { - if (string.IsNullOrEmpty(model.SecureName) && - !model.Id.HasValue) - { - return null; - } - using var context = new SecuritySystemDatabase(); - return context.Secures - .Include(x => x.Components) - .ThenInclude(x => x.Component) - .FirstOrDefault(x => (!string.IsNullOrEmpty(model.SecureName) && - x.SecureName == model.SecureName) || - (model.Id.HasValue && x.Id == - model.Id)) - ?.GetViewModel; + return GetFilteredList(model).FirstOrDefault(); } public SecureViewModel? Insert(SecureBindingModel model) { diff --git a/SecuritySystem/SecuritySystemDatabaseImplement/Implements/ShopStorage.cs b/SecuritySystem/SecuritySystemDatabaseImplement/Implements/ShopStorage.cs index 4e7adb6..865b9bd 100644 --- a/SecuritySystem/SecuritySystemDatabaseImplement/Implements/ShopStorage.cs +++ b/SecuritySystem/SecuritySystemDatabaseImplement/Implements/ShopStorage.cs @@ -49,7 +49,6 @@ namespace SecuritySystemDatabaseImplement.Implements return context.Shops .Include(x => x.Secures) .ThenInclude(x => x.Secure) - .ToList() .Select(x => x.GetViewModel) .ToList(); } @@ -114,7 +113,10 @@ namespace SecuritySystemDatabaseImplement.Implements } shop.Update(model); context.SaveChanges(); - shop.UpdateSecures(context, model); + if (model.ShopSecures.Count > 0) + { + shop.UpdateSecures(context, model); + } transaction.Commit(); return shop.GetViewModel; } diff --git a/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.Designer.cs b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.Designer.cs new file mode 100644 index 0000000..b92f5c2 --- /dev/null +++ b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.Designer.cs @@ -0,0 +1,248 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SecuritySystemDatabaseImplement; + +#nullable disable + +namespace SecuritySystemDatabaseImplement.Migrations +{ + [DbContext(typeof(SecuritySystemDatabase))] + [Migration("20240519222424_AddShops")] + partial class AddShops + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("SecureId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("SecureId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Secure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SecureName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Secures"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.SecureComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SecureId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("SecureId"); + + b.ToTable("SecureComponents"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("MaxSecuresCount") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OpeningDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.ShopSecure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SecureId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("SecureId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopSecures"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Order", b => + { + b.HasOne("SecuritySystemDatabaseImplement.Models.Secure", "Secure") + .WithMany("Orders") + .HasForeignKey("SecureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Secure"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.SecureComponent", b => + { + b.HasOne("SecuritySystemDatabaseImplement.Models.Component", "Component") + .WithMany("SecureComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SecuritySystemDatabaseImplement.Models.Secure", "Secure") + .WithMany("Components") + .HasForeignKey("SecureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Secure"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.ShopSecure", b => + { + b.HasOne("SecuritySystemDatabaseImplement.Models.Secure", "Secure") + .WithMany() + .HasForeignKey("SecureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SecuritySystemDatabaseImplement.Models.Shop", "Shop") + .WithMany("Secures") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Secure"); + + b.Navigation("Shop"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Component", b => + { + b.Navigation("SecureComponents"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Secure", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Shop", b => + { + b.Navigation("Secures"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.cs b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.cs new file mode 100644 index 0000000..3685c83 --- /dev/null +++ b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/20240519222424_AddShops.cs @@ -0,0 +1,78 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SecuritySystemDatabaseImplement.Migrations +{ + /// + public partial class AddShops : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Shops", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false), + Address = table.Column(type: "nvarchar(max)", nullable: false), + OpeningDate = table.Column(type: "datetime2", nullable: false), + MaxSecuresCount = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Shops", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "ShopSecures", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + SecureId = table.Column(type: "int", nullable: false), + ShopId = table.Column(type: "int", nullable: false), + Count = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ShopSecures", x => x.Id); + table.ForeignKey( + name: "FK_ShopSecures_Secures_SecureId", + column: x => x.SecureId, + principalTable: "Secures", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ShopSecures_Shops_ShopId", + column: x => x.ShopId, + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ShopSecures_SecureId", + table: "ShopSecures", + column: "SecureId"); + + migrationBuilder.CreateIndex( + name: "IX_ShopSecures_ShopId", + table: "ShopSecures", + column: "ShopId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ShopSecures"); + + migrationBuilder.DropTable( + name: "Shops"); + } + } +} diff --git a/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/SecuritySystemDatabaseModelSnapshot.cs b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/SecuritySystemDatabaseModelSnapshot.cs index bfa036c..93bb68c 100644 --- a/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/SecuritySystemDatabaseModelSnapshot.cs +++ b/SecuritySystem/SecuritySystemDatabaseImplement/Migrations/SecuritySystemDatabaseModelSnapshot.cs @@ -121,6 +121,59 @@ namespace SecuritySystemDatabaseImplement.Migrations b.ToTable("SecureComponents"); }); + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("MaxSecuresCount") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OpeningDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.ShopSecure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("SecureId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("SecureId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopSecures"); + }); + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Order", b => { b.HasOne("SecuritySystemDatabaseImplement.Models.Secure", "Secure") @@ -151,6 +204,25 @@ namespace SecuritySystemDatabaseImplement.Migrations b.Navigation("Secure"); }); + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.ShopSecure", b => + { + b.HasOne("SecuritySystemDatabaseImplement.Models.Secure", "Secure") + .WithMany() + .HasForeignKey("SecureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SecuritySystemDatabaseImplement.Models.Shop", "Shop") + .WithMany("Secures") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Secure"); + + b.Navigation("Shop"); + }); + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Component", b => { b.Navigation("SecureComponents"); @@ -162,6 +234,11 @@ namespace SecuritySystemDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("SecuritySystemDatabaseImplement.Models.Shop", b => + { + b.Navigation("Secures"); + }); #pragma warning restore 612, 618 } } diff --git a/SecuritySystem/SecuritySystemView/FormMain.Designer.cs b/SecuritySystem/SecuritySystemView/FormMain.Designer.cs index 8177b93..a987d3d 100644 --- a/SecuritySystem/SecuritySystemView/FormMain.Designer.cs +++ b/SecuritySystem/SecuritySystemView/FormMain.Designer.cs @@ -33,13 +33,14 @@ ComponentsToolStripMenuItem = new ToolStripMenuItem(); SecuresToolStripMenuItem = new ToolStripMenuItem(); магазиныToolStripMenuItem = new ToolStripMenuItem(); + пополнениеМагазинаToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); buttonCreateOrder = new Button(); buttonTakeOrderInWork = new Button(); buttonOrderReady = new Button(); button4 = new Button(); buttonRefresh = new Button(); - пополнениеМагазинаToolStripMenuItem = new ToolStripMenuItem(); + продатьПродукциюToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -47,7 +48,7 @@ // menuStrip // menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, пополнениеМагазинаToolStripMenuItem }); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, пополнениеМагазинаToolStripMenuItem, продатьПродукциюToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.Size = new Size(1043, 28); @@ -64,24 +65,31 @@ // ComponentsToolStripMenuItem // ComponentsToolStripMenuItem.Name = "ComponentsToolStripMenuItem"; - ComponentsToolStripMenuItem.Size = new Size(224, 26); + ComponentsToolStripMenuItem.Size = new Size(182, 26); ComponentsToolStripMenuItem.Text = "Компоненты"; ComponentsToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click; // // SecuresToolStripMenuItem // SecuresToolStripMenuItem.Name = "SecuresToolStripMenuItem"; - SecuresToolStripMenuItem.Size = new Size(224, 26); + SecuresToolStripMenuItem.Size = new Size(182, 26); SecuresToolStripMenuItem.Text = "Изделия"; SecuresToolStripMenuItem.Click += SecuresToolStripMenuItem_Click; // // магазиныToolStripMenuItem // магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem"; - магазиныToolStripMenuItem.Size = new Size(224, 26); + магазиныToolStripMenuItem.Size = new Size(182, 26); магазиныToolStripMenuItem.Text = "Магазины"; магазиныToolStripMenuItem.Click += ShopsToolStripMenuItem_Click; // + // пополнениеМагазинаToolStripMenuItem + // + пополнениеМагазинаToolStripMenuItem.Name = "пополнениеМагазинаToolStripMenuItem"; + пополнениеМагазинаToolStripMenuItem.Size = new Size(182, 24); + пополнениеМагазинаToolStripMenuItem.Text = "Пополнение магазина"; + пополнениеМагазинаToolStripMenuItem.Click += SupplyShopToolStripMenuItem_Click; + // // dataGridView // dataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; @@ -151,12 +159,12 @@ buttonRefresh.UseVisualStyleBackColor = true; buttonRefresh.Click += ButtonRefresh_Click; // - // пополнениеМагазинаToolStripMenuItem + // продатьПродукциюToolStripMenuItem // - пополнениеМагазинаToolStripMenuItem.Name = "пополнениеМагазинаToolStripMenuItem"; - пополнениеМагазинаToolStripMenuItem.Size = new Size(182, 24); - пополнениеМагазинаToolStripMenuItem.Text = "Пополнение магазина"; - пополнениеМагазинаToolStripMenuItem.Click += SupplyShopToolStripMenuItem_Click; + продатьПродукциюToolStripMenuItem.Name = "продатьПродукциюToolStripMenuItem"; + продатьПродукциюToolStripMenuItem.Size = new Size(165, 24); + продатьПродукциюToolStripMenuItem.Text = "Продать продукцию"; + продатьПродукциюToolStripMenuItem.Click += продатьПродукциюToolStripMenuItem_Click; // // FormMain // @@ -195,5 +203,6 @@ private Button buttonRefresh; private ToolStripMenuItem магазиныToolStripMenuItem; private ToolStripMenuItem пополнениеМагазинаToolStripMenuItem; + private ToolStripMenuItem продатьПродукциюToolStripMenuItem; } } \ No newline at end of file diff --git a/SecuritySystem/SecuritySystemView/FormMain.cs b/SecuritySystem/SecuritySystemView/FormMain.cs index 0e33e70..2513410 100644 --- a/SecuritySystem/SecuritySystemView/FormMain.cs +++ b/SecuritySystem/SecuritySystemView/FormMain.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using SecuritySystemContracts.BindingModels; using SecuritySystemContracts.BusinessLogicsContracts; +using SecuritySystemView.Shop; namespace SecuritySystemView { @@ -154,5 +155,14 @@ namespace SecuritySystemView form.ShowDialog(); } } + + private void продатьПродукциюToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormShopSell)); + if (service is FormShopSell form) + { + form.ShowDialog(); + } + } } } diff --git a/SecuritySystem/SecuritySystemView/FormMain.resx b/SecuritySystem/SecuritySystemView/FormMain.resx index c17a880..6c82d08 100644 --- a/SecuritySystem/SecuritySystemView/FormMain.resx +++ b/SecuritySystem/SecuritySystemView/FormMain.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object] diff --git a/SecuritySystem/SecuritySystemView/Program.cs b/SecuritySystem/SecuritySystemView/Program.cs index 583f994..b767de7 100644 --- a/SecuritySystem/SecuritySystemView/Program.cs +++ b/SecuritySystem/SecuritySystemView/Program.cs @@ -5,6 +5,7 @@ using SecuritySystemBusinessLogic.BusinessLogics; using SecuritySystemContracts.BusinessLogicsContracts; using SecuritySystemContracts.StoragesContracts; using SecuritySystemDatabaseImplement.Implements; +using SecuritySystemView.Shop; namespace SecuritySystemView { @@ -51,6 +52,7 @@ namespace SecuritySystemView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShop.Designer.cs b/SecuritySystem/SecuritySystemView/Shop/FormShop.Designer.cs index cdaf9ef..72c066e 100644 --- a/SecuritySystem/SecuritySystemView/Shop/FormShop.Designer.cs +++ b/SecuritySystem/SecuritySystemView/Shop/FormShop.Designer.cs @@ -38,10 +38,12 @@ ColumnId = new DataGridViewTextBoxColumn(); ColumnName = new DataGridViewTextBoxColumn(); ColumnCount = new DataGridViewTextBoxColumn(); - colorDialog1 = new ColorDialog(); buttonSave = new Button(); buttonCancel = new Button(); + numericUpDownCapacity = new NumericUpDown(); + labelCapacity = new Label(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownCapacity).BeginInit(); SuspendLayout(); // // labelName @@ -153,11 +155,30 @@ buttonCancel.UseVisualStyleBackColor = true; buttonCancel.Click += buttonCancel_Click; // + // numericUpDownCapacity + // + numericUpDownCapacity.Location = new Point(510, 71); + numericUpDownCapacity.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + numericUpDownCapacity.Name = "numericUpDownCapacity"; + numericUpDownCapacity.Size = new Size(150, 27); + numericUpDownCapacity.TabIndex = 7; + // + // labelCapacity + // + labelCapacity.AutoSize = true; + labelCapacity.Location = new Point(398, 76); + labelCapacity.Name = "labelCapacity"; + labelCapacity.Size = new Size(103, 20); + labelCapacity.TabIndex = 8; + labelCapacity.Text = "Вместимость:"; + // // FormShop // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(672, 450); + Controls.Add(labelCapacity); + Controls.Add(numericUpDownCapacity); Controls.Add(buttonCancel); Controls.Add(buttonSave); Controls.Add(dataGridView); @@ -171,6 +192,7 @@ Text = "Магазин"; Load += FormShop_Load; ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownCapacity).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -187,8 +209,9 @@ private DataGridViewTextBoxColumn ColumnId; private DataGridViewTextBoxColumn ColumnName; private DataGridViewTextBoxColumn ColumnCount; - private ColorDialog colorDialog1; private Button buttonSave; private Button buttonCancel; + private NumericUpDown numericUpDownCapacity; + private Label labelCapacity; } } \ No newline at end of file diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShop.cs b/SecuritySystem/SecuritySystemView/Shop/FormShop.cs index 6ea11d3..48d0310 100644 --- a/SecuritySystem/SecuritySystemView/Shop/FormShop.cs +++ b/SecuritySystem/SecuritySystemView/Shop/FormShop.cs @@ -37,6 +37,7 @@ namespace SecuritySystemView textBoxName.Text = view.Name; textBoxAddress.Text = view.Address; dateTimePickerOpeningDate.Value = view.OpeningDate; + numericUpDownCapacity.Value = view.MaxSecuresCount; _shopSecures = view.ShopSecures ?? new Dictionary(); LoadData(); } @@ -85,6 +86,12 @@ namespace SecuritySystemView return; } + if (numericUpDownCapacity.Value <= 0) + { + MessageBox.Show("Вместимость должна быть больше нуля", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение магазина"); try @@ -95,7 +102,8 @@ namespace SecuritySystemView Name = textBoxName.Text, Address = textBoxAddress.Text, OpeningDate = dateTimePickerOpeningDate.Value.Date, - ShopSecures = _shopSecures + ShopSecures = _shopSecures, + MaxSecuresCount = (int)numericUpDownCapacity.Value }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShop.resx b/SecuritySystem/SecuritySystemView/Shop/FormShop.resx index 09810c9..cb70e49 100644 --- a/SecuritySystem/SecuritySystemView/Shop/FormShop.resx +++ b/SecuritySystem/SecuritySystemView/Shop/FormShop.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object] @@ -126,7 +126,13 @@ True - - 17, 17 + + True + + + True + + + True \ No newline at end of file diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShopSell.Designer.cs b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.Designer.cs new file mode 100644 index 0000000..a162169 --- /dev/null +++ b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.Designer.cs @@ -0,0 +1,125 @@ +namespace SecuritySystemView.Shop +{ + partial class FormShopSell + { + /// + /// 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() + { + buttonSell = new Button(); + buttonCancel = new Button(); + comboBoxSecure = new ComboBox(); + numericUpDownCount = new NumericUpDown(); + labelSecure = new Label(); + labelCount = new Label(); + ((System.ComponentModel.ISupportInitialize)numericUpDownCount).BeginInit(); + SuspendLayout(); + // + // buttonSell + // + buttonSell.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonSell.Location = new Point(573, 89); + buttonSell.Name = "buttonSell"; + buttonSell.Size = new Size(94, 29); + buttonSell.TabIndex = 0; + buttonSell.Text = "Продать"; + buttonSell.UseVisualStyleBackColor = true; + buttonSell.Click += buttonSell_Click; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.Location = new Point(673, 89); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 1; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // comboBoxSecure + // + comboBoxSecure.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + comboBoxSecure.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSecure.FormattingEnabled = true; + comboBoxSecure.Location = new Point(84, 9); + comboBoxSecure.Name = "comboBoxSecure"; + comboBoxSecure.Size = new Size(683, 28); + comboBoxSecure.TabIndex = 2; + // + // numericUpDownCount + // + numericUpDownCount.Location = new Point(108, 43); + numericUpDownCount.Name = "numericUpDownCount"; + numericUpDownCount.Size = new Size(150, 27); + numericUpDownCount.TabIndex = 3; + // + // labelSecure + // + labelSecure.AutoSize = true; + labelSecure.Location = new Point(12, 12); + labelSecure.Name = "labelSecure"; + labelSecure.Size = new Size(66, 20); + labelSecure.TabIndex = 4; + labelSecure.Text = "Продукт"; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(12, 45); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(90, 20); + labelCount.TabIndex = 5; + labelCount.Text = "Количество"; + // + // FormShopSell + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(779, 130); + Controls.Add(labelCount); + Controls.Add(labelSecure); + Controls.Add(numericUpDownCount); + Controls.Add(comboBoxSecure); + Controls.Add(buttonCancel); + Controls.Add(buttonSell); + Name = "FormShopSell"; + Text = "Продажа товара"; + Load += FormShopSell_Load; + ((System.ComponentModel.ISupportInitialize)numericUpDownCount).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonSell; + private Button buttonCancel; + private ComboBox comboBoxSecure; + private NumericUpDown numericUpDownCount; + private Label labelSecure; + private Label labelCount; + } +} \ No newline at end of file diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShopSell.cs b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.cs new file mode 100644 index 0000000..c77f13e --- /dev/null +++ b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.cs @@ -0,0 +1,85 @@ +using Microsoft.Extensions.Logging; +using SecuritySystemContracts.BindingModels; +using SecuritySystemContracts.BusinessLogicsContracts; + +namespace SecuritySystemView.Shop +{ + public partial class FormShopSell : Form + { + private readonly IShopLogic _shopLogic; + private readonly ISecureLogic _secureLogic; + private readonly ILogger _logger; + public FormShopSell(ILogger logger, IShopLogic shopLogic, ISecureLogic secureLogic) + { + InitializeComponent(); + _logger = logger; + _shopLogic = shopLogic; + _secureLogic = secureLogic; + } + + private void FormShopSell_Load(object sender, EventArgs e) + { + _logger.LogInformation("Загрузка продукции для продажи"); + try + { + var list = _secureLogic.ReadList(null); + if (list != null) + { + comboBoxSecure.DisplayMember = "SecureName"; + comboBoxSecure.ValueMember = "Id"; + comboBoxSecure.DataSource = list; + comboBoxSecure.SelectedItem = null; + } + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка продукции"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonSell_Click(object sender, EventArgs e) + { + if (numericUpDownCount.Value < 1) + { + MessageBox.Show("Количество продукта должно быть больше нуля", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxSecure.SelectedValue == null) + { + MessageBox.Show("Выберите продукт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Создание продажи"); + try + { + var operationResult = _shopLogic.SellSecures( + new SecureBindingModel + { + Id = Convert.ToInt32(comboBoxSecure.SelectedValue) + }, + Convert.ToInt32(numericUpDownCount.Value) + ); + if (!operationResult) + { + throw new Exception("Ошибка при создании продажи. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания продажи"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/SecuritySystem/SecuritySystemView/Shop/FormShopSell.resx b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SecuritySystem/SecuritySystemView/Shop/FormShopSell.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file