AccountingWarehouseProducts.../AccountingWarehouseProducts/AccountingWarehouseProductsDatabaseImplement/Models/Warehouse.cs

100 lines
3.5 KiB
C#

using AccountingWarehouseProductsContracts.BindingModels;
using AccountingWarehouseProductsContracts.ViewModels;
using AccountingWarehouseProductsDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AccountingWarehouseProductsDatabaseImplement.Models
{
public class Warehouse
{
public int Id { get; set; }
[Required]
public string WarehouseName { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
[Required]
public int Capacity { get; set; }
private Dictionary<int, (IProductModel, int)>? _warehouseProduct = null;
[NotMapped]
public Dictionary<int, (IProductModel, int)> WarehouseProducts
{
get
{
if (_warehouseProduct == null)
{
_warehouseProduct = Products.ToDictionary(recWP => recWP.ProductId, recWP => (recWP.Product as IProductModel, recWP.Count));
}
return _warehouseProduct;
}
}
[ForeignKey("WarehouseId")]
public virtual List<WarehouseProduct> Products { get; set; } = new();
public static Warehouse Create(AccountingWarehouseProductsDatabase context, WarehouseBindingModel model)
{
return new Warehouse()
{
Id = model.Id,
WarehouseName = model.WarehouseName,
Address = model.Address,
Capacity = model.Capacity,
Products = model.WarehouseProducts.Select(x => new WarehouseProduct
{
Product = context.Products.First(y => y.Id == x.Key),
Count = x.Value.Item2
}).ToList(),
};
}
public WarehouseViewModel GetViewModel => new()
{
Id = Id,
WarehouseName = WarehouseName,
Address = Address,
Capacity = Capacity,
WarehouseProducts = WarehouseProducts
};
public void UpdateProducts(AccountingWarehouseProductsDatabase context, WarehouseBindingModel model)
{
var warehouseProduct = context.WarehouseProduct.Where(rec => rec.WarehouseId == model.Id).ToList();
if (warehouseProduct != null && warehouseProduct.Count > 0)
{
context.WarehouseProduct.RemoveRange(warehouseProduct.Where(rec => !model.WarehouseProducts.ContainsKey(rec.ProductId)));
context.SaveChanges();
foreach (var updateProduct in warehouseProduct)
{
updateProduct.Count = model.WarehouseProducts[updateProduct.ProductId].Item2;
model.WarehouseProducts.Remove(updateProduct.ProductId);
}
context.SaveChanges();
}
var warehouse = context.Warehouses.First(x => x.Id == Id);
foreach (var rc in model.WarehouseProducts)
{
context.WarehouseProduct.Add(new WarehouseProduct
{
Warehouse = warehouse,
Product = context.Products.First(x => x.Id == rc.Key),
Count = rc.Value.Item2
});
context.SaveChanges();
}
_warehouseProduct = null;
}
}
}