From 346260bb3fa57e404689710e179e5ac271a77511 Mon Sep 17 00:00:00 2001 From: DyCTaTOR <125912249+DyCTaTOR@users.noreply.github.com> Date: Mon, 6 May 2024 11:24:06 +0400 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F=203?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PlumbingRepair/PlumbingRepair/FormStore.cs | 2 +- .../BusinessLogics/OrderLogic.cs | 2 +- .../BusinessLogics/StoreLogic.cs | 2 +- .../BindingModels/StoreBindingModel.cs | 2 +- .../ViewModels/StoreViewModel.cs | 2 +- .../Implements/StoreStorage.cs | 168 +++++++ ... 20240506071751_InitialCreate.Designer.cs} | 427 +++++++++++------- ...on1.cs => 20240506071751_InitialCreate.cs} | 313 +++++++------ .../PlumbingRepairDataBaseModelSnapshot.cs | 77 ++++ .../Models/Store.cs | 110 +++++ .../Models/StoreWork.cs | 27 ++ .../PlumbingRepairDataBase.cs | 2 + 12 files changed, 827 insertions(+), 307 deletions(-) create mode 100644 PlumbingRepair/PlumbingRepairDataBaseImplement/Implements/StoreStorage.cs rename PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/{20240326163755_Migration1.Designer.cs => 20240506071751_InitialCreate.Designer.cs} (68%) rename PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/{20240326163755_Migration1.cs => 20240506071751_InitialCreate.cs} (66%) create mode 100644 PlumbingRepair/PlumbingRepairDataBaseImplement/Models/Store.cs create mode 100644 PlumbingRepair/PlumbingRepairDataBaseImplement/Models/StoreWork.cs diff --git a/PlumbingRepair/PlumbingRepair/FormStore.cs b/PlumbingRepair/PlumbingRepair/FormStore.cs index f97a178..18a31b3 100644 --- a/PlumbingRepair/PlumbingRepair/FormStore.cs +++ b/PlumbingRepair/PlumbingRepair/FormStore.cs @@ -56,7 +56,7 @@ namespace PlumbingRepairView Id = _id ?? 0, StoreName = NameTextBox.Text, StoreAdress = AdressTextBox.Text, - OpeningDate = OpeningDatePicker.Value.Date, + OpeningDate = DateTime.SpecifyKind(OpeningDatePicker.Value.Date, DateTimeKind.Utc), WorkMaxCount = (int)VolumeNumericUpDown.Value, StoreWorks = _listStores }; diff --git a/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/OrderLogic.cs b/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/OrderLogic.cs index e9ea620..ab03ff4 100644 --- a/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/OrderLogic.cs @@ -93,7 +93,7 @@ namespace PlumbingRepairBusinessLogic.BusinessLogics if (model.Status == OrderStatus.Готов) { - model.DateImplement = DateTime.Now; + model.DateImplement = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc); var work = _workStorage.GetElement(new() { Id = viewModel.WorkId }); if (work == null) diff --git a/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/StoreLogic.cs b/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/StoreLogic.cs index c1edd12..3dbf31d 100644 --- a/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/StoreLogic.cs +++ b/PlumbingRepair/PlumbingRepairBusinessLogic/BusinessLogics/StoreLogic.cs @@ -54,7 +54,7 @@ namespace PlumbingRepairBusinessLogic.BusinessLogics else { element.StoreWorks[work.Id] = (work, quantity); - _logger.LogInformation("AddWork. Added {quantity} new package {package} to '{StoreName}' store", quantity, work.WorkName, element.StoreName); + _logger.LogInformation("AddWork. Added {quantity} new work {work} to '{StoreName}' store", quantity, work.WorkName, element.StoreName); } _storeStorage.Update(new() diff --git a/PlumbingRepair/PlumbingRepairContracts/BindingModels/StoreBindingModel.cs b/PlumbingRepair/PlumbingRepairContracts/BindingModels/StoreBindingModel.cs index 82e6fd9..1f28f1a 100644 --- a/PlumbingRepair/PlumbingRepairContracts/BindingModels/StoreBindingModel.cs +++ b/PlumbingRepair/PlumbingRepairContracts/BindingModels/StoreBindingModel.cs @@ -12,7 +12,7 @@ namespace PlumbingRepairContracts.BindingModels public int Id { get; set; } public string StoreName { get; set; } = string.Empty; public string StoreAdress { get; set; } = string.Empty; - public DateTime OpeningDate { get; set; } = DateTime.Now; + public DateTime OpeningDate { get; set; } public Dictionary StoreWorks { get; set; } = new(); public int WorkMaxCount { get; set; } } diff --git a/PlumbingRepair/PlumbingRepairContracts/ViewModels/StoreViewModel.cs b/PlumbingRepair/PlumbingRepairContracts/ViewModels/StoreViewModel.cs index d96e17d..257f00d 100644 --- a/PlumbingRepair/PlumbingRepairContracts/ViewModels/StoreViewModel.cs +++ b/PlumbingRepair/PlumbingRepairContracts/ViewModels/StoreViewModel.cs @@ -17,7 +17,7 @@ namespace PlumbingRepairContracts.ViewModels [DisplayName("Адрес магазина")] public string StoreAdress { get; set; } = string.Empty; [DisplayName("Дата открытия")] - public DateTime OpeningDate { get; set; } = DateTime.Now; + public DateTime OpeningDate { get; set; } [DisplayName("Вместимость магазина")] public int WorkMaxCount { get; set; } } diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Implements/StoreStorage.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Implements/StoreStorage.cs new file mode 100644 index 0000000..dcf3789 --- /dev/null +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Implements/StoreStorage.cs @@ -0,0 +1,168 @@ +using Microsoft.EntityFrameworkCore; +using PlumbingRepairContracts.BindingModels; +using PlumbingRepairContracts.SearchModels; +using PlumbingRepairContracts.StoragesContracts; +using PlumbingRepairContracts.ViewModels; +using PlumbingRepairDataBaseImplement.Models; +using PlumbingRepairDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlumbingRepairDataBaseImplement.Implements +{ + public class StoreStorage : IStoreStorage + { + public StoreViewModel? Delete(StoreBindingModel model) + { + using var context = new PlumbingRepairDataBase(); + + var element = context.Stores + .Include(x => x.Works) + .FirstOrDefault(rec => rec.Id == model.Id); + + if (element != null) + { + context.Stores.Remove(element); + context.SaveChanges(); + + return element.GetViewModel; + } + + return null; + } + + public StoreViewModel? GetElement(StoreSearchModel model) + { + if (string.IsNullOrEmpty(model.StoreName) && !model.Id.HasValue) + { + return null; + } + + using var context = new PlumbingRepairDataBase(); + + return context.Stores + .Include(x => x.Works) + .ThenInclude(x => x.Work) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.StoreName) && x.StoreName == model.StoreName) || (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public List GetFilteredList(StoreSearchModel model) + { + if (string.IsNullOrEmpty(model.StoreName)) + { + return new(); + } + + using var context = new PlumbingRepairDataBase(); + + return context.Stores + .Include(x => x.Works) + .ThenInclude(x => x.Work) + .Where(x => x.StoreName.Contains(model.StoreName)) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFullList() + { + using var context = new PlumbingRepairDataBase(); + return context.Stores + .Include(x => x.Works) + .ThenInclude(x => x.Work) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public StoreViewModel? Insert(StoreBindingModel model) + { + using var context = new PlumbingRepairDataBase(); + var newStore = Store.Create(context, model); + if (newStore == null) + { + return null; + } + context.Stores.Add(newStore); + context.SaveChanges(); + return newStore.GetViewModel; + } + + public bool SellWork(IWorkModel model, int quantity) + { + using var context = new PlumbingRepairDataBase(); + using var transaction = context.Database.BeginTransaction(); + try + { + foreach (var store in context.Stores + .Include(x => x.Works) + .ThenInclude(x => x.Work) + .ToList() + .Where(x => x.StoreWorks.ContainsKey(model.Id))) + { + int countInCurrentStore = store.StoreWorks[model.Id].Item2; + if (countInCurrentStore <= quantity) + { + var elem = context.StoreWorks + .Where(x => x.WorkId == model.Id) + .FirstOrDefault(x => x.StoreId == store.Id); + context.StoreWorks.Remove(elem); + store.StoreWorks.Remove(model.Id); + quantity -= countInCurrentStore; + } + else + { + store.StoreWorks[model.Id] = (store.StoreWorks[model.Id].Item1, countInCurrentStore - quantity); + quantity = 0; + store.UpdateWorks(context, new() + { + Id = store.Id, + StoreWorks = store.StoreWorks, + }); + } + if (quantity == 0) + { + context.SaveChanges(); + transaction.Commit(); + return true; + } + } + transaction.Rollback(); + return false; + } + catch + { + transaction.Rollback(); + throw; + } + } + + public StoreViewModel? Update(StoreBindingModel model) + { + using var context = new PlumbingRepairDataBase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var store = context.Stores.FirstOrDefault(rec => rec.Id == model.Id); + if (store == null) + { + return null; + } + store.Update(model); + context.SaveChanges(); + store.UpdateWorks(context, model); + transaction.Commit(); + return store.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + } +} diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.Designer.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.Designer.cs similarity index 68% rename from PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.Designer.cs rename to PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.Designer.cs index 329c818..4c9f553 100644 --- a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.Designer.cs +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.Designer.cs @@ -1,175 +1,252 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using PlumbingRepairDataBaseImplement; - -#nullable disable - -namespace PlumbingRepairDataBaseImplement.Migrations -{ - [DbContext(typeof(PlumbingRepairDataBase))] - [Migration("20240326163755_Migration1")] - partial class Migration1 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.17") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Component", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("text"); - - b.Property("Cost") - .HasColumnType("double precision"); - - b.HasKey("Id"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Count") - .HasColumnType("integer"); - - b.Property("DateCreate") - .HasColumnType("timestamp with time zone"); - - b.Property("DateImplement") - .HasColumnType("timestamp with time zone"); - - b.Property("Status") - .HasColumnType("integer"); - - b.Property("Sum") - .HasColumnType("double precision"); - - b.Property("WorkId") - .HasColumnType("integer"); - - b.Property("WorkName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("WorkId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Price") - .HasColumnType("double precision"); - - b.Property("WorkName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Works"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.WorkComponent", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ComponentId") - .HasColumnType("integer"); - - b.Property("Count") - .HasColumnType("integer"); - - b.Property("WorkId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ComponentId"); - - b.HasIndex("WorkId"); - - b.ToTable("WorkComponents"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Order", b => - { - b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") - .WithMany("Orders") - .HasForeignKey("WorkId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Work"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.WorkComponent", b => - { - b.HasOne("PlumbingRepairDataBaseImplement.Models.Component", "Component") - .WithMany("WorkComponents") - .HasForeignKey("ComponentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") - .WithMany("Components") - .HasForeignKey("WorkId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Work"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Component", b => - { - b.Navigation("WorkComponents"); - }); - - modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using PlumbingRepairDataBaseImplement; + +#nullable disable + +namespace PlumbingRepairDataBaseImplement.Migrations +{ + [DbContext(typeof(PlumbingRepairDataBase))] + [Migration("20240506071751_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.17") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateCreate") + .HasColumnType("timestamp with time zone"); + + b.Property("DateImplement") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.Property("WorkId") + .HasColumnType("integer"); + + b.Property("WorkName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("WorkId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Store", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("OpeningDate") + .HasColumnType("timestamp with time zone"); + + b.Property("StoreAdress") + .IsRequired() + .HasColumnType("text"); + + b.Property("StoreName") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorkMaxCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Stores"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.StoreWork", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("StoreId") + .HasColumnType("integer"); + + b.Property("WorkId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("StoreId"); + + b.HasIndex("WorkId"); + + b.ToTable("StoreWorks"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("WorkName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Works"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.WorkComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("WorkId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("WorkId"); + + b.ToTable("WorkComponents"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Order", b => + { + b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") + .WithMany("Orders") + .HasForeignKey("WorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Work"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.StoreWork", b => + { + b.HasOne("PlumbingRepairDataBaseImplement.Models.Store", "Store") + .WithMany("Works") + .HasForeignKey("StoreId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") + .WithMany() + .HasForeignKey("WorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Store"); + + b.Navigation("Work"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.WorkComponent", b => + { + b.HasOne("PlumbingRepairDataBaseImplement.Models.Component", "Component") + .WithMany("WorkComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") + .WithMany("Components") + .HasForeignKey("WorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Work"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Component", b => + { + b.Navigation("WorkComponents"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Store", b => + { + b.Navigation("Works"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.cs similarity index 66% rename from PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.cs rename to PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.cs index 62b3884..75024b4 100644 --- a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240326163755_Migration1.cs +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/20240506071751_InitialCreate.cs @@ -1,127 +1,186 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace PlumbingRepairDataBaseImplement.Migrations -{ - /// - public partial class Migration1 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Components", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - ComponentName = table.Column(type: "text", nullable: false), - Cost = table.Column(type: "double precision", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Components", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Works", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - WorkName = table.Column(type: "text", nullable: false), - Price = table.Column(type: "double precision", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Works", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Orders", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - WorkId = table.Column(type: "integer", nullable: false), - WorkName = table.Column(type: "text", nullable: false), - Count = table.Column(type: "integer", nullable: false), - 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) - }, - constraints: table => - { - table.PrimaryKey("PK_Orders", x => x.Id); - table.ForeignKey( - name: "FK_Orders_Works_WorkId", - column: x => x.WorkId, - principalTable: "Works", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "WorkComponents", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - WorkId = table.Column(type: "integer", nullable: false), - ComponentId = table.Column(type: "integer", nullable: false), - Count = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_WorkComponents", x => x.Id); - table.ForeignKey( - name: "FK_WorkComponents_Components_ComponentId", - column: x => x.ComponentId, - principalTable: "Components", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_WorkComponents_Works_WorkId", - column: x => x.WorkId, - principalTable: "Works", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_Orders_WorkId", - table: "Orders", - column: "WorkId"); - - migrationBuilder.CreateIndex( - name: "IX_WorkComponents_ComponentId", - table: "WorkComponents", - column: "ComponentId"); - - migrationBuilder.CreateIndex( - name: "IX_WorkComponents_WorkId", - table: "WorkComponents", - column: "WorkId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Orders"); - - migrationBuilder.DropTable( - name: "WorkComponents"); - - migrationBuilder.DropTable( - name: "Components"); - - migrationBuilder.DropTable( - name: "Works"); - } - } -} +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace PlumbingRepairDataBaseImplement.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Components", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ComponentName = table.Column(type: "text", nullable: false), + Cost = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Components", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Stores", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + StoreName = table.Column(type: "text", nullable: false), + StoreAdress = table.Column(type: "text", nullable: false), + OpeningDate = table.Column(type: "timestamp with time zone", nullable: false), + WorkMaxCount = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Stores", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Works", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + WorkName = table.Column(type: "text", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Works", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + WorkId = table.Column(type: "integer", nullable: false), + WorkName = table.Column(type: "text", nullable: false), + Count = table.Column(type: "integer", nullable: false), + 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) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Works_WorkId", + column: x => x.WorkId, + principalTable: "Works", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "StoreWorks", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + WorkId = table.Column(type: "integer", nullable: false), + StoreId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_StoreWorks", x => x.Id); + table.ForeignKey( + name: "FK_StoreWorks_Stores_StoreId", + column: x => x.StoreId, + principalTable: "Stores", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StoreWorks_Works_WorkId", + column: x => x.WorkId, + principalTable: "Works", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "WorkComponents", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + WorkId = table.Column(type: "integer", nullable: false), + ComponentId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_WorkComponents", x => x.Id); + table.ForeignKey( + name: "FK_WorkComponents_Components_ComponentId", + column: x => x.ComponentId, + principalTable: "Components", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_WorkComponents_Works_WorkId", + column: x => x.WorkId, + principalTable: "Works", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Orders_WorkId", + table: "Orders", + column: "WorkId"); + + migrationBuilder.CreateIndex( + name: "IX_StoreWorks_StoreId", + table: "StoreWorks", + column: "StoreId"); + + migrationBuilder.CreateIndex( + name: "IX_StoreWorks_WorkId", + table: "StoreWorks", + column: "WorkId"); + + migrationBuilder.CreateIndex( + name: "IX_WorkComponents_ComponentId", + table: "WorkComponents", + column: "ComponentId"); + + migrationBuilder.CreateIndex( + name: "IX_WorkComponents_WorkId", + table: "WorkComponents", + column: "WorkId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Orders"); + + migrationBuilder.DropTable( + name: "StoreWorks"); + + migrationBuilder.DropTable( + name: "WorkComponents"); + + migrationBuilder.DropTable( + name: "Stores"); + + migrationBuilder.DropTable( + name: "Components"); + + migrationBuilder.DropTable( + name: "Works"); + } + } +} diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/PlumbingRepairDataBaseModelSnapshot.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/PlumbingRepairDataBaseModelSnapshot.cs index 704e78d..50d8d44 100644 --- a/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/PlumbingRepairDataBaseModelSnapshot.cs +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Migrations/PlumbingRepairDataBaseModelSnapshot.cs @@ -79,6 +79,59 @@ namespace PlumbingRepairDataBaseImplement.Migrations b.ToTable("Orders"); }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Store", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("OpeningDate") + .HasColumnType("timestamp with time zone"); + + b.Property("StoreAdress") + .IsRequired() + .HasColumnType("text"); + + b.Property("StoreName") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorkMaxCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Stores"); + }); + + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.StoreWork", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("StoreId") + .HasColumnType("integer"); + + b.Property("WorkId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("StoreId"); + + b.HasIndex("WorkId"); + + b.ToTable("StoreWorks"); + }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => { b.Property("Id") @@ -136,6 +189,25 @@ namespace PlumbingRepairDataBaseImplement.Migrations b.Navigation("Work"); }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.StoreWork", b => + { + b.HasOne("PlumbingRepairDataBaseImplement.Models.Store", "Store") + .WithMany("Works") + .HasForeignKey("StoreId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PlumbingRepairDataBaseImplement.Models.Work", "Work") + .WithMany() + .HasForeignKey("WorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Store"); + + b.Navigation("Work"); + }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.WorkComponent", b => { b.HasOne("PlumbingRepairDataBaseImplement.Models.Component", "Component") @@ -160,6 +232,11 @@ namespace PlumbingRepairDataBaseImplement.Migrations b.Navigation("WorkComponents"); }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Store", b => + { + b.Navigation("Works"); + }); + modelBuilder.Entity("PlumbingRepairDataBaseImplement.Models.Work", b => { b.Navigation("Components"); diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/Store.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/Store.cs new file mode 100644 index 0000000..09a2557 --- /dev/null +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/Store.cs @@ -0,0 +1,110 @@ +using PlumbingRepairContracts.BindingModels; +using PlumbingRepairContracts.ViewModels; +using PlumbingRepairDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlumbingRepairDataBaseImplement.Models +{ + public class Store : IStoreModel + { + [Required] + public string StoreName { get; private set; } = string.Empty; + [Required] + public string StoreAdress { get; private set; } = string.Empty; + [Required] + public DateTime OpeningDate { get; private set; } + [Required] + public int WorkMaxCount { get; private set; } + + public int Id { get; private set; } + + + private Dictionary _storeWorks = null; + [NotMapped] + public Dictionary StoreWorks + { + get + { + if (_storeWorks == null) + { + _storeWorks = Works + .ToDictionary(recPC => recPC.WorkId, recPC => (recPC.Work as IWorkModel, recPC.Count)); + } + return _storeWorks; + } + } + + [ForeignKey("StoreId")] + public virtual List Works { get; set; } = new(); + + public static Store Create(PlumbingRepairDataBase context, StoreBindingModel model) + { + return new Store() + { + Id = model.Id, + StoreName = model.StoreName, + StoreAdress = model.StoreAdress, + OpeningDate = model.OpeningDate, + WorkMaxCount = model.WorkMaxCount, + Works = model.StoreWorks.Select(x => new StoreWork + { + Work = context.Works.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(StoreBindingModel model) + { + StoreName = model.StoreName; + StoreAdress = model.StoreAdress; + OpeningDate = model.OpeningDate; + WorkMaxCount = model.WorkMaxCount; + } + + public StoreViewModel GetViewModel => new() + { + Id = Id, + StoreName = StoreName, + StoreAdress = StoreAdress, + OpeningDate = OpeningDate, + WorkMaxCount = WorkMaxCount, + StoreWorks = StoreWorks + }; + + public void UpdateWorks(PlumbingRepairDataBase context, StoreBindingModel model) + { + var storeWorks = context.StoreWorks.Where(rec => rec.StoreId == model.Id).ToList(); + if (storeWorks != null && storeWorks.Count > 0) + { // удалили те, которых нет в модели + context.StoreWorks.RemoveRange(storeWorks.Where(rec => !model.StoreWorks.ContainsKey(rec.WorkId))); + context.SaveChanges(); + // обновили количество у существующих записей + foreach (var updateWork in storeWorks) + { + updateWork.Count = model.StoreWorks[updateWork.WorkId].Item2; + model.StoreWorks.Remove(updateWork.WorkId); + } + context.SaveChanges(); + } + var store = context.Stores.First(x => x.Id == Id); + foreach (var sw in model.StoreWorks) + { + context.StoreWorks.Add(new StoreWork + { + Store = store, + Work = context.Works.First(x => x.Id == sw.Key), + Count = sw.Value.Item2 + }); + context.SaveChanges(); + } + _storeWorks = null; + } + } +} diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/StoreWork.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/StoreWork.cs new file mode 100644 index 0000000..214d7b3 --- /dev/null +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/Models/StoreWork.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlumbingRepairDataBaseImplement.Models +{ + public class StoreWork + { + public int Id { get; set; } + + [Required] + public int WorkId { get; set; } + + [Required] + public int StoreId { get; set; } + + [Required] + public int Count { get; set; } + + public virtual Store Store { get; set; } = new(); + + public virtual Work Work { get; set; } = new(); + } +} diff --git a/PlumbingRepair/PlumbingRepairDataBaseImplement/PlumbingRepairDataBase.cs b/PlumbingRepair/PlumbingRepairDataBaseImplement/PlumbingRepairDataBase.cs index 0b82341..8aef125 100644 --- a/PlumbingRepair/PlumbingRepairDataBaseImplement/PlumbingRepairDataBase.cs +++ b/PlumbingRepair/PlumbingRepairDataBaseImplement/PlumbingRepairDataBase.cs @@ -23,5 +23,7 @@ namespace PlumbingRepairDataBaseImplement public virtual DbSet Works { set; get; } public virtual DbSet WorkComponents { set; get; } public virtual DbSet Orders { set; get; } + public virtual DbSet Stores { set; get; } + public virtual DbSet StoreWorks { set; get; } } }