From 9af6400a6263c9a54aa756f57bc2bba34e87ede4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D0=BD=D0=B0=20=D0=A7=D1=83=D0=B1?= =?UTF-8?q?=D1=8B=D0=BA=D0=B8=D0=BD=D0=B0?= Date: Wed, 8 May 2024 09:35:27 +0400 Subject: [PATCH] =?UTF-8?q?6=20=D0=BB=D0=B0=D0=B1=D0=B0)))=20=D0=B2=D1=80?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/WorkModeling.cs | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/WorkModeling.cs b/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/WorkModeling.cs index 92d13a2..f721d7d 100644 --- a/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/WorkModeling.cs +++ b/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/WorkModeling.cs @@ -16,15 +16,18 @@ namespace ConfectioneryBusinessLogic.BusinessLogics public class WorkModeling : IWorkProcess { private readonly ILogger _logger; + private readonly Random _rnd; + private IOrderLogic? _orderLogic; + public WorkModeling(ILogger logger) { _logger = logger; _rnd = new Random(1000); } - public void DoWork(IImplementerLogic implementerLogic, IOrderLogic - orderLogic) + + public void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic) { _orderLogic = orderLogic; var implementers = implementerLogic.ReadList(null); @@ -33,11 +36,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics _logger.LogWarning("DoWork. Implementers is null"); return; } - var orders = _orderLogic.ReadList(new OrderSearchModel - { - Status = - OrderStatus.Принят - }); + var orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят }); if (orders == null || orders.Count == 0) { _logger.LogWarning("DoWork. Orders is null or empty"); @@ -49,26 +48,27 @@ namespace ConfectioneryBusinessLogic.BusinessLogics Task.Run(() => WorkerWorkAsync(implementer, orders)); } } + /// /// Иммитация работы исполнителя /// /// /// - private async Task WorkerWorkAsync(ImplementerViewModel implementer, - List orders) + private async Task WorkerWorkAsync(ImplementerViewModel implementer, List orders) { if (_orderLogic == null || implementer == null) { return; } await RunOrderInWork(implementer); + await Task.Run(() => { foreach (var order in orders) { try { - _logger.LogDebug("DoWork. Worker {Id} try get order { Order}", implementer.Id, order.Id); + _logger.LogDebug("DoWork. Worker {Id} try get order {Order}", implementer.Id, order.Id); // пытаемся назначить заказ на исполнителя _orderLogic.TakeOrderInWork(new OrderBindingModel { @@ -77,11 +77,13 @@ namespace ConfectioneryBusinessLogic.BusinessLogics }); // делаем работу Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count); - _logger.LogDebug("DoWork. Worker {Id} finish order{ Order}", implementer.Id, order.Id); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id); _orderLogic.FinishOrder(new OrderBindingModel { Id = order.Id }); + // отдыхаем + Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); } // кто-то мог уже перехватить заказ, игнорируем ошибку catch (InvalidOperationException ex) @@ -94,11 +96,11 @@ namespace ConfectioneryBusinessLogic.BusinessLogics _logger.LogError(ex, "Error while do work"); throw; } - // отдыхаем - Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100)); + } }); } + /// /// Ищем заказ, которые уже в работе (вдруг исполнителя прервали) /// @@ -112,8 +114,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics } try { - var runOrder = await Task.Run(() => _orderLogic.ReadElement(new - OrderSearchModel + var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel { ImplementerId = implementer.Id, Status = OrderStatus.Выполняется @@ -122,6 +123,7 @@ namespace ConfectioneryBusinessLogic.BusinessLogics { return; } + _logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id); // доделываем работу Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count);