From e948a1c60f261181e64cb6bd942dd013fde3deae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9?= Date: Sat, 1 Apr 2023 16:27:37 +0400 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=91=D0=94=20=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HardwareShopDatabase.cs | 2 +- .../Models/Purchase.cs | 140 ++++++++++++++++-- 2 files changed, 131 insertions(+), 11 deletions(-) diff --git a/HardwareShop/HardwareShopDatabaseImplement/HardwareShopDatabase.cs b/HardwareShop/HardwareShopDatabaseImplement/HardwareShopDatabase.cs index ef5e47a..2bbe3d7 100644 --- a/HardwareShop/HardwareShopDatabaseImplement/HardwareShopDatabase.cs +++ b/HardwareShop/HardwareShopDatabaseImplement/HardwareShopDatabase.cs @@ -33,7 +33,7 @@ namespace HardwareShopDatabaseImplement public virtual DbSet Orders { set; get; } - public virtual DbSet Purchase { set; get; } + public virtual DbSet Purchases { set; get; } public virtual DbSet PurchasesBuilds { set; get; } diff --git a/HardwareShop/HardwareShopDatabaseImplement/Models/Purchase.cs b/HardwareShop/HardwareShopDatabaseImplement/Models/Purchase.cs index 890a348..0a35865 100644 --- a/HardwareShop/HardwareShopDatabaseImplement/Models/Purchase.cs +++ b/HardwareShop/HardwareShopDatabaseImplement/Models/Purchase.cs @@ -1,8 +1,9 @@ -using HardwareShopDataModels.Enums; +using HardwareShopContracts.BindingModels; +using HardwareShopContracts.ViewModels; +using HardwareShopDataModels.Enums; using HardwareShopDataModels.Models; -using HardwareShopDataModels.Models; -using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; +using System.Diagnostics; namespace HardwareShopDatabaseImplement.Models { @@ -20,18 +21,137 @@ namespace HardwareShopDatabaseImplement.Models public virtual User User { get; set; } - [NotMapped] - public Dictionary? PurchaseBuilds { get; set; } - - [NotMapped] - public Dictionary PurchaseGoods { get; set; } = new(); - - [ForeignKey("PurchaseId")] public virtual List? Builds { get; set; } + public Dictionary? _purchaseBuilds = null; + + [NotMapped] + public Dictionary? PurchaseBuilds + { + get + { + if (_purchaseBuilds == null) + { + _purchaseBuilds = Builds.ToDictionary(recPB => recPB.BuildID, recPB => (recPB.Build as IBuildModel, recPB.Count)); + } + return _purchaseBuilds; + } + } + [ForeignKey("PurchaseId")] public virtual List Goods { get; set; } = new(); + public Dictionary? _purchaseGoods = null; + [NotMapped] + public Dictionary? PurchaseGoods + { + get + { + if (_purchaseGoods == null) + { + _purchaseGoods = Goods.ToDictionary(recPG => recPG.GoodID, recPG => (recPG.Good as IGoodModel, recPG.Count)); + } + return _purchaseGoods; + } + } + + public static Purchase Create(HardwareShopDatabase context, PurchaseBindingModel model) + { + return new Purchase() + { + Id = model.Id, + Sum = model.Sum, + PurchaseStatus = model.PurchaseStatus, + DatePurchase = model.DatePurchase, + UserID = model.UserID, + Builds = model.PurchaseBuilds.Select(x => new PurchaseBuild + { + Build = context.Builds.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList(), + Goods = model.PurchaseGoods.Select(x => new PurchaseGood + { + Good = context.Goods.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(PurchaseBindingModel model) + { + PurchaseStatus = model.PurchaseStatus; + DatePurchase = model.DatePurchase; + } + + public PurchaseViewModel GetViewModel => new() + { + Id = Id, + Sum = Sum, + PurchaseStatus = PurchaseStatus, + DatePurchase = DatePurchase, + UserID = UserID, + UserEmail = User.Email, + PurchaseBuilds = PurchaseBuilds, + PurchaseGoods = PurchaseGoods + }; + + public void UpdateBuilds(HardwareShopDatabase context, PurchaseBindingModel model) + { + var purchaseBuilds = context.PurchasesBuilds.Where(rec => rec.PurchaseID == model.Id).ToList(); + if (purchaseBuilds != null && purchaseBuilds.Count > 0) + { + context.PurchasesBuilds.RemoveRange(purchaseBuilds.Where(rec => !model.PurchaseBuilds.ContainsKey(rec.BuildID))); + context.SaveChanges(); + foreach (var updateBuild in purchaseBuilds) + { + updateBuild.Count = model.PurchaseBuilds[updateBuild.BuildID].Item2; + model.PurchaseBuilds.Remove(updateBuild.BuildID); + } + context.SaveChanges(); + } + var purchase = context.Purchases.First(x => x.Id == Id); + foreach (var dc in model.PurchaseBuilds) + { + context.PurchasesBuilds.Add(new PurchaseBuild + { + Purchase = purchase, + Build = context.Builds.First(x => x.Id == dc.Key), + Count = dc.Value.Item2 + }); + context.SaveChanges(); + } + _purchaseBuilds = null; + } + + public void UpdateGoods(HardwareShopDatabase context, PurchaseBindingModel model) + { + var purchaseGoods = context.PurchasesGoods.Where(rec => rec.PurchaseID == model.Id).ToList(); + if (purchaseGoods != null && purchaseGoods.Count > 0) + { // удалили те в бд, которых нет в модели + context.PurchasesGoods.RemoveRange(purchaseGoods.Where(rec => !model.PurchaseGoods.ContainsKey(rec.GoodID))); + context.SaveChanges(); + // обновили количество у существующих записей + foreach (var updateGood in purchaseGoods) + { + updateGood.Count = model.PurchaseGoods[updateGood.GoodID].Item2; + model.PurchaseGoods.Remove(updateGood.GoodID); + } + context.SaveChanges(); + } + var purchase = context.Purchases.First(x => x.Id == Id); + //добавляем в бд блюда которые есть в моделе, но ещё нет в бд + foreach (var dc in model.PurchaseGoods) + { + context.PurchasesGoods.Add(new PurchaseGood + { + Purchase = purchase, + Good = context.Goods.First(x => x.Id == dc.Key), + Count = dc.Value.Item2 + }); + context.SaveChanges(); + } + _purchaseGoods = null; + } } }