This commit is contained in:
gg12 darfren 2024-05-14 13:06:51 +04:00
parent b53646627e
commit 7be7815a51
7 changed files with 182 additions and 168 deletions

View File

@ -15,23 +15,23 @@ using System.Threading.Tasks;
namespace IceCreamShopBusinessLogic.BusinessLogic namespace IceCreamShopBusinessLogic.BusinessLogic
{ {
public class OrderLogic : IOrderLogic public class OrderLogic : IOrderLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly IShopStorage _shopStorage; private readonly IShopStorage _shopStorage;
private readonly IShopLogic _shopLogic; private readonly IShopLogic _shopLogic;
private readonly IIceCreamStorage _iceCreamStorage; private readonly IIceCreamStorage _iceCreamStorage;
static readonly object locker = new object(); static readonly object locker = new object();
public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IIceCreamStorage iceCreamStorage, ILogger<OrderLogic> logger) public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IIceCreamStorage iceCreamStorage, ILogger<OrderLogic> logger)
{ {
_orderStorage = orderStorage; _orderStorage = orderStorage;
_shopStorage = shopStorage; _shopStorage = shopStorage;
_logger = logger; _logger = logger;
_shopLogic = shopLogic; _shopLogic = shopLogic;
_iceCreamStorage = iceCreamStorage; _iceCreamStorage = iceCreamStorage;
} }
public OrderViewModel? ReadElement(OrderSearchModel model) public OrderViewModel? ReadElement(OrderSearchModel model)
{ {
if (model == null) if (model == null)
@ -50,148 +50,160 @@ namespace IceCreamShopBusinessLogic.BusinessLogic
} }
public List<OrderViewModel>? ReadList(OrderSearchModel? model) public List<OrderViewModel>? ReadList(OrderSearchModel? model)
{ {
_logger.LogInformation("ReadList. Id:{ Id}", model?.Id); _logger.LogInformation("ReadList. Id:{ Id}", model?.Id);
var list = model == null ? _orderStorage.GetFullList() : var list = model == null ? _orderStorage.GetFullList() :
_orderStorage.GetFilteredList(model); _orderStorage.GetFilteredList(model);
if (list == null) if (list == null)
{ {
_logger.LogWarning("ReadList return null list"); _logger.LogWarning("ReadList return null list");
return null; return null;
} }
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list; return list;
} }
public bool CreateOrder(OrderBindingModel model) public bool CreateOrder(OrderBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (model.Status != OrderStatus.Неизвестен) return false; if (model.Status != OrderStatus.Неизвестен) return false;
model.Status = OrderStatus.Принят; model.Status = OrderStatus.Принят;
if (_orderStorage.Insert(model) == null) if (_orderStorage.Insert(model) == null)
{ {
_logger.LogWarning("Insert operation failed"); _logger.LogWarning("Insert operation failed");
return false; return false;
} }
return true; return true;
} }
public bool CheckSupply(IIceCreamModel iceCream, int count) public bool CheckSupply(IIceCreamModel iceCream, int count)
{ {
if (count <= 0) if (count <= 0)
{ {
_logger.LogWarning("Check then supply operation error. IceCream count < 0."); _logger.LogWarning("Check then supply operation error. IceCream count < 0.");
return false; return false;
} }
int sumCapacity = 0; int sumCapacity = 0;
int sumCount = 0; int sumCount = 0;
sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum(); sumCapacity = _shopStorage.GetFullList().Select(x => x.MaxCapacity).Sum();
sumCount = _shopStorage.GetFullList().Select(x => x.ShopIceCreams.Select(y => y.Value.Item2).Sum()).Sum(); sumCount = _shopStorage.GetFullList().Select(x => x.ShopIceCreams.Select(y => y.Value.Item2).Sum()).Sum();
int freeSpace = sumCapacity - sumCount; int freeSpace = sumCapacity - sumCount;
if (freeSpace - count < 0) if (freeSpace - count < 0)
{ {
_logger.LogWarning("Check then supply operation error. There's no place for new IceCream in shops."); _logger.LogWarning("Check then supply operation error. There's no place for new IceCream in shops.");
return false; return false;
} }
foreach (var shop in _shopStorage.GetFullList()) foreach (var shop in _shopStorage.GetFullList())
{ {
freeSpace = shop.MaxCapacity; freeSpace = shop.MaxCapacity;
foreach (var doc in shop.ShopIceCreams) foreach (var doc in shop.ShopIceCreams)
{ {
freeSpace -= doc.Value.Item2; freeSpace -= doc.Value.Item2;
} }
if (freeSpace == 0) if (freeSpace == 0)
{ {
continue; continue;
} }
if (freeSpace - count >= 0) if (freeSpace - count >= 0)
{ {
if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, count)) if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, count))
count = 0; count = 0;
else else
{ {
_logger.LogWarning("Supply error"); _logger.LogWarning("Supply error");
return false; return false;
} }
} }
if (freeSpace - count < 0) if (freeSpace - count < 0)
{ {
if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, freeSpace)) if (_shopLogic.MakeSupply(new() { Id = shop.Id }, iceCream, freeSpace))
count -= freeSpace; count -= freeSpace;
else else
{ {
_logger.LogWarning("Supply error"); _logger.LogWarning("Supply error");
return false; return false;
} }
} }
if (count <= 0) if (count <= 0)
{ {
return true; return true;
} }
} }
return false; return false;
} }
public bool ChangeStatus(OrderBindingModel model, OrderStatus status) public bool ChangeStatus(OrderBindingModel model, OrderStatus status)
{ {
CheckModel(model, false); CheckModel(model, false);
var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id }); var element = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id });
if (element == null) if (element == null)
{ {
_logger.LogWarning("Read operation failed"); _logger.LogWarning("Read operation failed");
return false; return false;
} }
if (element.Status != status - 1 && status != OrderStatus.Ожидается && element.Status != OrderStatus.Ожидается) if(element.Status == OrderStatus.Ожидается) {
{ if (status != OrderStatus.Готов)
_logger.LogWarning("Status change operation failed"); {
throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный"); _logger.LogWarning("Status change operation failed");
} throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный");
model.Sum = element.Sum; }
model.Count = element.Count; }
model.IceCreamId = element.IceCreamId; else if(status == OrderStatus.Ожидается)
model.DateCreate = element.DateCreate; {
model.DateImplement = element.DateImplement; if (status != OrderStatus.Выполняется)
{
_logger.LogWarning("Status change operation failed");
throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный");
}
}
else if (element.Status != status - 1)
{
_logger.LogWarning("Status change operation failed");
throw new InvalidOperationException("Текущий статус заказа не может быть переведен в выбранный");
}
model.Sum = element.Sum;
model.Count = element.Count;
model.IceCreamId = element.IceCreamId;
model.DateCreate = element.DateCreate;
model.DateImplement = element.DateImplement;
if (element.ImplementerId.HasValue && element.ImplementerId != 0) if (element.ImplementerId.HasValue && element.ImplementerId != 0)
model.ImplementerId = element.ImplementerId; model.ImplementerId = element.ImplementerId;
if (status == OrderStatus.Готов) if (status == OrderStatus.Готов)
{ {
var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId }); var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId });
if (icecream == null) if (icecream == null)
{ {
_logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found."); _logger.LogWarning("Status update to " + status.ToString() + " operation failed. Document not found.");
return false; return false;
} }
if (CheckSupply(icecream, model.Count) == false) if (!CheckSupply(icecream, model.Count))
{ {
model.Status = OrderStatus.Ожидается; model.Status = OrderStatus.Ожидается;
_orderStorage.Update(model); _orderStorage.Update(model);
return false; return false;
} }
} }
model.Status = status; model.Status = status;
if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now;
_orderStorage.Update(model); _orderStorage.Update(model);
return true; return true;
} }
public bool TakeOrderInWork(OrderBindingModel model) public bool TakeOrderInWork(OrderBindingModel model)
{ {
lock (locker) lock (locker)
{ {
return ChangeStatus(model, OrderStatus.Выполняется); return ChangeStatus(model, OrderStatus.Выполняется);
} }
} }
public bool FinishOrder(OrderBindingModel model) public bool FinishOrder(OrderBindingModel model)
{ {
lock (locker) return ChangeStatus(model, OrderStatus.Готов);
{
return ChangeStatus(model, OrderStatus.Готов);
}
} }
public bool TakeOrderInWaiting(OrderBindingModel model) public bool TakeOrderInWaiting(OrderBindingModel model)
{ {
@ -199,30 +211,30 @@ namespace IceCreamShopBusinessLogic.BusinessLogic
} }
public bool DeliveryOrder(OrderBindingModel model) public bool DeliveryOrder(OrderBindingModel model)
{ {
return ChangeStatus(model, OrderStatus.Выдан); return ChangeStatus(model, OrderStatus.Выдан);
} }
private void CheckModel(OrderBindingModel model, bool withParams = private void CheckModel(OrderBindingModel model, bool withParams =
true) true)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
if (!withParams) if (!withParams)
{ {
return; return;
} }
if (model.Sum <= 0) if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum)); throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum));
} }
if (model.Count <= 0) if (model.Count <= 0)
{ {
throw new ArgumentNullException("Количество элементов в заказе должно быть больше 0", nameof(model.Count)); throw new ArgumentNullException("Количество элементов в заказе должно быть больше 0", nameof(model.Count));
} }
_logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id); _logger.LogInformation("Order. Sum:{ Cost}. Id: { Id}", model.Sum, model.Id);
} }
} }
} }

View File

@ -35,7 +35,9 @@ namespace IceCreamShopDatabaseImplement.Implements
(!model.ClientId.HasValue || x.ClientId == model.ClientId) (!model.ClientId.HasValue || x.ClientId == model.ClientId)
&& &&
(!model.Status.HasValue || x.Status == model.Status) (!model.Status.HasValue || x.Status == model.Status)
) &&
(!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId)
)
) )
.Select(x => x.GetViewModel) .Select(x => x.GetViewModel)
.ToList(); .ToList();