Запускает работы (осталось выставлять исполнителя)

This commit is contained in:
Павел Сорокин 2023-04-06 16:48:08 +04:00
parent 60de33e6ff
commit c6e142294f
4 changed files with 56 additions and 22 deletions

View File

@ -83,6 +83,10 @@ namespace ShipyardBusinessLogic.BusinessLogics
return false;
}
model.Status = newStatus;
if (viewModel.ImplementerId.HasValue)
{
model.ImplementerId = viewModel.ImplementerId;
}
if (model.Status == OrderStatus.Готов) model.DateImplement = DateTime.Now;
else
{
@ -116,7 +120,19 @@ namespace ShipyardBusinessLogic.BusinessLogics
public OrderViewModel? ReadElement(OrderSearchModel model)
{
throw new NotImplementedException();
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. Id:{ Id}", model.Id);
var element = _orderStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
}
}

View File

@ -3,6 +3,7 @@ using ShipyardContracts.BindingModels;
using ShipyardContracts.BusinessLogicsContracts;
using ShipyardContracts.SearchModels;
using ShipyardContracts.ViewModels;
using ShipyardDataModels.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
@ -29,17 +30,24 @@ namespace ShipyardBusinessLogic.BusinessLogics
{
_orderLogic = orderLogic;
var implementers = implementerLogic.ReadList(null);
if (implementers == null)
{
_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");
return;
}
_logger.LogDebug("DoWork for {Count} orders", orders.Count);
foreach (var implementer in implementers)
{
@ -47,17 +55,14 @@ namespace ShipyardBusinessLogic.BusinessLogics
}
}
/// <summary>
/// Иммитация работы исполнителя
/// </summary>
/// <param name="implementer"></param>
/// <param name="orders"></param>
// Иммитация работы исполнителя
private async Task WorkerWorkAsync(ImplementerViewModel implementer, List<OrderViewModel> orders)
{
if (_orderLogic == null || implementer == null)
{
return;
}
await RunOrderInWork(implementer);
await Task.Run(() =>
@ -67,18 +72,21 @@ namespace ShipyardBusinessLogic.BusinessLogics
try
{
_logger.LogDebug("DoWork. Worker {Id} try get order {Order}", implementer.Id, order.Id);
// пытаемся назначить заказ на исполнителя
_orderLogic.TakeOrderInWork(new OrderBindingModel
{
Id = order.Id,
// ImplementerId = implementer.Id
ImplementerId = implementer.Id
});
// делаем работу
Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count);
_logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id);
_orderLogic.FinishOrder(new OrderBindingModel
{
Id = order.Id
Id = order.Id,
});
}
// кто-то мог уже перехватить заказ, игнорируем ошибку
@ -92,43 +100,46 @@ namespace ShipyardBusinessLogic.BusinessLogics
_logger.LogError(ex, "Error while do work");
throw;
}
// отдыхаем
Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
}
});
}
/// <summary>
/// Ищем заказ, которые уже в работе (вдруг исполнителя прервали)
/// </summary>
/// <param name="implementer"></param>
/// <returns></returns>
//Ищем заказ, которые уже в работе (вдруг исполнителя прервали)
private async Task RunOrderInWork(ImplementerViewModel implementer)
{
if (_orderLogic == null || implementer == null)
{
return;
}
try
{
var runOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel
{
// ImplementerId = implementer.Id,
// Status = OrderStatus.Выполняется
ImplementerId = implementer.Id,
Status = OrderStatus.Выполняется
}));
if (runOrder == null)
{
return;
}
_logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id);
// доделываем работу
Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count);
_logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id);
_orderLogic.FinishOrder(new OrderBindingModel
{
Id = runOrder.Id
});
// отдыхаем
Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
}

View File

@ -1,4 +1,5 @@
using System;
using ShipyardDataModels.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -14,5 +15,6 @@ namespace ShipyardContracts.SearchModels
public DateTime? DateFrom { get; set; }
public DateTime? DateTo { get; set; }
public OrderStatus? Status { get; set; }
}
}

View File

@ -45,7 +45,9 @@ namespace ShipyardDataBaseImplement.Implements
.Include(x=>x.Ship)
.Include(x=>x.Client)
.Include(x=>x.Implementer)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
.FirstOrDefault(x => (model.Status == null || model.Status != null && model.Status == x.Status) &&
model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId ||
model.Id.HasValue && x.Id == model.Id)
?.GetViewModel;
}
@ -92,10 +94,13 @@ namespace ShipyardDataBaseImplement.Implements
.Select(x => x.GetViewModel)
.ToList();
}
else
{
return new();
}
return context.Orders
.Include(x => x.Ship)
.Include(x => x.Client)
.Include(x => x.Implementer)
.Where(x => model.Status == x.Status)
.Select(x => x.GetViewModel)
.ToList();
}
public List<OrderViewModel> GetFullList()