ISEbd-21.Fedotov.I.A.LabWork06 #6

Closed
Ilfedotov.01 wants to merge 3 commits from ISEbd-21.Fedotov.I.A.LabWork06 into ISEbd-21.Fedotov.I.A.LabWork05
11 changed files with 647 additions and 61 deletions
Showing only changes of commit a40ac05641 - Show all commits

View File

@ -14,9 +14,9 @@ namespace DinerContracts.BindingModels
public int ClientID { get; set; } public int ClientID { get; set; }
public int? ImplementerID { get; set; } public int? ImplementerID { get; set; }
public int Count { get; set; } public int Count { get; set; }
public double Sum { get; set; } public double Sum { get; set; }
@ -27,5 +27,7 @@ namespace DinerContracts.BindingModels
public DateTime? DateImplement { get; set; } public DateTime? DateImplement { get; set; }
public int ID { get; set; } public int ID { get; set; }
public string ProductName { get; set; } = string.Empty;
} }
} }

View File

@ -33,13 +33,11 @@ namespace DinerDataBaseImplement.Implements
return null; return null;
} }
using var context = new DinerDatabaseBy6Work(); using var context = new DinerDatabaseBy6Work();
return context.Orders return context.Orders.Include(x => x.Snack)
.Include(x => x.Snack) .Include(x => x.Client)
.Include(x => x.Client) .FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID)?.GetViewModel;
.Include(x => x.Implementer)
.FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID) }
?.GetViewModel;
}
public List<OrderViewModel> GetFilteredList(OrderSearchModel model) public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
{ {
@ -71,16 +69,13 @@ namespace DinerDataBaseImplement.Implements
.Select(x => x.GetViewModel) .Select(x => x.GetViewModel)
.ToList(); .ToList();
} }
else if ((int)model.Status >= 0) { return context.Orders
return context.Orders .Include(x => x.Snack)
.Include(x => x.Snack) .Include(x => x.Client)
.Include(x => x.Client) .Include(x => x.Implementer)
.Include(x => x.Implementer) .Where(x => model.Status == x.Status)
.Where(x => x.Status >= 0) .Select(x => x.GetViewModel)
.Select(x => x.GetViewModel) .ToList();
.ToList();
}
return new();
} }
public List<OrderViewModel> GetFullList() public List<OrderViewModel> GetFullList()
@ -98,7 +93,9 @@ namespace DinerDataBaseImplement.Implements
} }
context.Orders.Add(newOrder); context.Orders.Add(newOrder);
context.SaveChanges(); context.SaveChanges();
return newOrder.GetViewModel; return context.Orders.Include(x => x.Snack)
.Include(x => x.Client)
.FirstOrDefault(x => x.ID == newOrder.ID)?.GetViewModel;
} }
public OrderViewModel? Update(OrderBindingModel model) { public OrderViewModel? Update(OrderBindingModel model) {
using var context = new DinerDatabaseBy6Work(); using var context = new DinerDatabaseBy6Work();

View File

@ -0,0 +1,261 @@
// <auto-generated />
using System;
using DinerDataBaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DinerDataBaseImplement.Migrations
{
[DbContext(typeof(DinerDatabaseBy6Work))]
[Migration("20240515115440_Migration02")]
partial class Migration02
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ClientFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Clients");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ComponentName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<double>("Price")
.HasColumnType("float");
b.HasKey("ID");
b.ToTable("Components");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ImplementerFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("Qualification")
.HasColumnType("int");
b.Property<int>("WorkExperience")
.HasColumnType("int");
b.HasKey("ID");
b.ToTable("Implementers");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("ClientID")
.HasColumnType("int");
b.Property<int>("Count")
.HasColumnType("int");
b.Property<DateTime>("DateCreate")
.HasColumnType("datetime2");
b.Property<DateTime?>("DateImplement")
.HasColumnType("datetime2");
b.Property<int?>("ImplementerID")
.HasColumnType("int");
b.Property<string>("ProductName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("SnackID")
.HasColumnType("int");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<double>("Sum")
.HasColumnType("float");
b.HasKey("ID");
b.HasIndex("ClientID");
b.HasIndex("ImplementerID");
b.HasIndex("SnackID");
b.ToTable("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<double>("Price")
.HasColumnType("float");
b.Property<string>("ProductName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Snacks");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("ComponentID")
.HasColumnType("int");
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("SnackID")
.HasColumnType("int");
b.HasKey("ID");
b.HasIndex("ComponentID");
b.HasIndex("SnackID");
b.ToTable("ProductComponents");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b =>
{
b.HasOne("DinerDataBaseImplement.Models.Client", "Client")
.WithMany("Orders")
.HasForeignKey("ClientID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer")
.WithMany("Orders")
.HasForeignKey("ImplementerID");
b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack")
.WithMany("Orders")
.HasForeignKey("SnackID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Client");
b.Navigation("Implementer");
b.Navigation("Snack");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b =>
{
b.HasOne("DinerDataBaseImplement.Models.Food", "Component")
.WithMany("SnackFood")
.HasForeignKey("ComponentID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DinerDataBaseImplement.Models.Snack", "Product")
.WithMany("Components")
.HasForeignKey("SnackID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Component");
b.Navigation("Product");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b =>
{
b.Navigation("SnackFood");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b =>
{
b.Navigation("Components");
b.Navigation("Orders");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DinerDataBaseImplement.Migrations
{
/// <inheritdoc />
public partial class Migration02 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ProductName",
table: "Orders",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ProductName",
table: "Orders");
}
}
}

View File

@ -0,0 +1,257 @@
// <auto-generated />
using System;
using DinerDataBaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DinerDataBaseImplement.Migrations
{
[DbContext(typeof(DinerDatabaseBy6Work))]
[Migration("20240515121617_Migration03")]
partial class Migration03
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ClientFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Clients");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ComponentName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<double>("Price")
.HasColumnType("float");
b.HasKey("ID");
b.ToTable("Components");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ImplementerFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("Qualification")
.HasColumnType("int");
b.Property<int>("WorkExperience")
.HasColumnType("int");
b.HasKey("ID");
b.ToTable("Implementers");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("ClientID")
.HasColumnType("int");
b.Property<int>("Count")
.HasColumnType("int");
b.Property<DateTime>("DateCreate")
.HasColumnType("datetime2");
b.Property<DateTime?>("DateImplement")
.HasColumnType("datetime2");
b.Property<int?>("ImplementerID")
.HasColumnType("int");
b.Property<int>("SnackID")
.HasColumnType("int");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<double>("Sum")
.HasColumnType("float");
b.HasKey("ID");
b.HasIndex("ClientID");
b.HasIndex("ImplementerID");
b.HasIndex("SnackID");
b.ToTable("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<double>("Price")
.HasColumnType("float");
b.Property<string>("ProductName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Snacks");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("ComponentID")
.HasColumnType("int");
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("SnackID")
.HasColumnType("int");
b.HasKey("ID");
b.HasIndex("ComponentID");
b.HasIndex("SnackID");
b.ToTable("ProductComponents");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b =>
{
b.HasOne("DinerDataBaseImplement.Models.Client", "Client")
.WithMany("Orders")
.HasForeignKey("ClientID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer")
.WithMany("Orders")
.HasForeignKey("ImplementerID");
b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack")
.WithMany("Orders")
.HasForeignKey("SnackID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Client");
b.Navigation("Implementer");
b.Navigation("Snack");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b =>
{
b.HasOne("DinerDataBaseImplement.Models.Food", "Component")
.WithMany("SnackFood")
.HasForeignKey("ComponentID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DinerDataBaseImplement.Models.Snack", "Product")
.WithMany("Components")
.HasForeignKey("SnackID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Component");
b.Navigation("Product");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b =>
{
b.Navigation("SnackFood");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b =>
{
b.Navigation("Components");
b.Navigation("Orders");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DinerDataBaseImplement.Migrations
{
/// <inheritdoc />
public partial class Migration03 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ProductName",
table: "Orders");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ProductName",
table: "Orders",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
}
}

View File

@ -19,7 +19,7 @@ namespace DinerDataBaseImplement.Models
[Required] [Required]
public int ClientID { get; set; } public int ClientID { get; set; }
public int? ImplementerID { get; set; } public int? ImplementerID { get; set; }
[Required] [Required]
public int Count { get; set; } public int Count { get; set; }
@ -53,35 +53,33 @@ namespace DinerDataBaseImplement.Models
DateCreate = model.DateCreate, DateCreate = model.DateCreate,
DateImplement = model.DateImplement, DateImplement = model.DateImplement,
ClientID = model.ClientID, ClientID = model.ClientID,
ImplementerID = model.ImplementerID ImplementerID = model.ImplementerID,
}; };
} }
public void Update(OrderBindingModel? model) public void Update(OrderBindingModel? model)
{ {
if (model == null) return; if (model == null) return;
Sum = model.Sum; if (model.Sum != 0) {
Sum = model.Sum;
}
Status = model.Status; Status = model.Status;
DateImplement = model?.DateImplement; DateImplement = model?.DateImplement;
} ImplementerID = model?.ImplementerID;
public OrderViewModel GetViewModel { }
get public OrderViewModel GetViewModel => new() {
{ ID = ID,
using var context = new DinerDatabaseBy6Work(); SnackID = SnackID,
return new OrderViewModel { Count = Count,
ID = ID, Sum = Sum,
SnackID = SnackID, Status = Status,
Count = Count, DateCreate = DateCreate,
Sum = Sum, DateImplement = DateImplement,
Status = Status, ClientID = ClientID,
DateCreate = DateCreate, ImplementerID = ImplementerID,
DateImplement = DateImplement, ClientFIO = Client.ClientFIO,
ProductName = context.Snacks.FirstOrDefault(x => x.ID == SnackID)?.ProductName ?? string.Empty, ImplementerFIO = Implementer?.ImplementerFIO,
ClientID = ClientID, ProductName = Snack.ProductName
ClientFIO = context.Clients.FirstOrDefault(x => x.ID == ClientID)?.ClientFIO ?? string.Empty, };
ImplementerID = ImplementerID, };
ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty,
};
}
}
}
} }

View File

@ -11,7 +11,9 @@ namespace DinerDataModels.Models
{ {
int SnackID { get; } int SnackID { get; }
int Count { get; } int Count { get; }
double Sum { get; } int ClientID { get; }
int? ImplementerID { get; }
double Sum { get; }
OrderStatus Status { get; } OrderStatus Status { get; }
DateTime DateCreate { get; } DateTime DateCreate { get; }
DateTime? DateImplement { get; } DateTime? DateImplement { get; }

View File

@ -86,7 +86,8 @@ namespace DinerView
{ {
SnackID = Convert.ToInt32(comboBoxProduct.SelectedValue), SnackID = Convert.ToInt32(comboBoxProduct.SelectedValue),
Count = Convert.ToInt32(textBoxCount.Text), Count = Convert.ToInt32(textBoxCount.Text),
Sum = Convert.ToDouble(textBoxSum.Text), ProductName = comboBoxProduct.SelectedValue.ToString(),
Sum = Convert.ToDouble(textBoxSum.Text),
ClientID = Convert.ToInt32(comboBoxClient.SelectedValue) ClientID = Convert.ToInt32(comboBoxClient.SelectedValue)
}); });

View File

@ -96,7 +96,7 @@ namespace DineryBusinessLogic.BusinessLogic
model.ClientID, model.ImplementerID); model.ClientID, model.ImplementerID);
} }
private bool StatusUpdate(OrderBindingModel model, OrderStatus newOrderStatus) { private bool StatusUpdate(OrderBindingModel model, OrderStatus newOrderStatus) {
CheckModel(model, false);
var viewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID }); var viewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID });
if (viewModel == null) if (viewModel == null)
{ {
@ -107,13 +107,19 @@ namespace DineryBusinessLogic.BusinessLogic
return false; return false;
} }
model.Status = newOrderStatus; model.Status = newOrderStatus;
if (model.Status == OrderStatus.Готов) { if (viewModel.ImplementerID.HasValue) {
model.ImplementerID = viewModel.ImplementerID;
}
if (model.Status == OrderStatus.Готов) {
model.DateImplement = DateTime.Now; model.DateImplement = DateTime.Now;
} }
else { else {
model.DateImplement = viewModel.DateImplement; model.DateImplement = viewModel.DateImplement;
} }
if (_orderStorage.Update(model) == null) {
CheckModel(model, false);
if (_orderStorage.Update(model) == null) {
_logger.LogWarning("Update operarion failed"); _logger.LogWarning("Update operarion failed");
return false; return false;
} }

View File

@ -51,22 +51,26 @@ namespace DineryBusinessLogic.BusinessLogic {
if (_orderLogic == null || implementer == null) { if (_orderLogic == null || implementer == null) {
return; return;
} }
await RunOrderInWork(implementer); await RunOrderInWork(implementer, orders);
await Task.Run(() => { await Task.Run(async () => {
foreach (var order in orders) { foreach (var order in orders) {
try { try {
_logger.LogDebug($"DoWork. Worker {implementer.ID} try get order {order.ID}"); _logger.LogDebug($"DoWork. Worker {implementer.ID} try get order {order.ID}");
// пытаемся назначить заказ на исполнителя // пытаемся назначить заказ на исполнителя
_orderLogic.TakeOrderInWork(new OrderBindingModel { var notOccupied = _orderLogic.TakeOrderInWork(new OrderBindingModel {
ID = order.ID, ID = order.ID,
ImplementerID = implementer.ID ImplementerID = implementer.ID
}); });
// делаем работу // делаем работу
Thread.Sleep(implementer.WorkExperience + _rnd.Next(100, 1000) * order.Count); if (notOccupied) {
_logger.LogDebug($"DoWork. Worker {implementer.ID} finish order {order.ID}"); await Task.Delay(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count);
_orderLogic.FinishOrder(new OrderBindingModel {
ID = order.ID, _logger.LogDebug("DoWork. Worker {Id} finish order { Order}", implementer.ID, order.ID);
});
_orderLogic.FinishOrder(new OrderBindingModel { ID = order.ID, ImplementerID = implementer.ID });
await Task.Delay(implementer.Qualification * _rnd.Next(10, 100));
}
} }
// кто-то мог уже перехватить заказ, игнорируем ошибку // кто-то мог уже перехватить заказ, игнорируем ошибку
catch (InvalidOperationException ex) { catch (InvalidOperationException ex) {
@ -84,8 +88,8 @@ namespace DineryBusinessLogic.BusinessLogic {
} }
// Ищем заказ, которые уже в работе(вдруг исполнителя прервали) // Ищем заказ, которые уже в работе(вдруг исполнителя прервали)
private async Task RunOrderInWork(ImplementerViewModel implementer) { private async Task RunOrderInWork(ImplementerViewModel implementer, List<OrderViewModel> orders) {
if (_orderLogic == null || implementer == null) { if (_orderLogic == null || implementer == null || orders == null || orders.Count == 0) {
return; return;
} }
try { try {