Внедрение сущности исполнитель, фикс заказов, обновление бд

This commit is contained in:
Артем Харламов 2023-05-14 18:42:16 +04:00
parent 846a768f74
commit fc22f666e1
30 changed files with 1274 additions and 220 deletions

View File

@ -0,0 +1,126 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.BusinessLogicsContracts;
using AbstractFoodOrdersContracts.SearchModels;
using AbstractFoodOrdersContracts.StoragesContracts;
using AbstractFoodOrdersContracts.ViewModels;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersBusinessLogic.BusinessLogics
{
public class ImplementerLogic:IImplementerLogic
{
private readonly ILogger _logger;
private readonly IImplementerStorage _implementerStorage;
public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage)
{
_logger = logger;
_implementerStorage = implementerStorage;
}
public List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model)
{
_logger.LogInformation("ReadList. Id:{Id}. ImplementerFIO:{ImplementerFIO}. Password:{Password}", model?.Id, model?.ImplementerFIO, model?.Password);
var list = model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
public ImplementerViewModel? ReadElement(ImplementerSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. Id:{Id}. ImplementerFIO:{ImplementerFIO}. Password:{Password}", model.Id, model.ImplementerFIO, model.Password);
var element = _implementerStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
public bool Create(ImplementerBindingModel model)
{
CheckModel(model);
if (_implementerStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Update(ImplementerBindingModel model)
{
CheckModel(model);
if (_implementerStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
public bool Delete(ImplementerBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_implementerStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
private void CheckModel(ImplementerBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.ImplementerFIO))
{
throw new ArgumentNullException("Нет ФИО исполнителя", nameof(model.ImplementerFIO));
}
if (string.IsNullOrEmpty(model.Password))
{
throw new ArgumentNullException("Нет пароля исполнителя", nameof(model.Password));
}
if (model.WorkExperience < 0)
{
throw new ArgumentNullException("Опыт работы не может быть меньше 0!", nameof(model.WorkExperience));
}
if (model.Qualification < 0)
{
throw new ArgumentNullException("Квалификация не может быть меньше 0!", nameof(model.Qualification));
}
_logger.LogInformation("Implementer. ImplementerFIO:{ImplementerFIO}. Password:{Password}. Id:{Id}", model.ImplementerFIO, model.Password, model.Id);
var element = _implementerStorage.GetElement(new ImplementerSearchModel
{
ImplementerFIO = model.ImplementerFIO
});
if (element != null && element.Id != model.Id)
{
throw new InvalidOperationException("Исполнитель с таким ФИО уже зарегестрирован");
}
}
}
}

View File

@ -17,7 +17,8 @@ namespace AbstractFoodOrdersBusinessLogic.BusinessLogics
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage) static readonly object _locker = new object();
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage)
{ {
_logger = logger; _logger = logger;
_orderStorage = orderStorage; _orderStorage = orderStorage;
@ -34,7 +35,23 @@ namespace AbstractFoodOrdersBusinessLogic.BusinessLogics
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list; return list;
} }
public bool CreateOrder(OrderBindingModel model) public OrderViewModel? ReadElement(OrderSearchModel? model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. ImplementerId:{ImplementerId}. OrderStatus:{OrderStatus}. Id:{Id}", model.ImplementerId, model.OrderStatus, 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;
}
public bool CreateOrder(OrderBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (model.Status != OrderStatus.Неизвестен) if (model.Status != OrderStatus.Неизвестен)
@ -49,8 +66,11 @@ namespace AbstractFoodOrdersBusinessLogic.BusinessLogics
} }
public bool TakeOrderInWork(OrderBindingModel model) public bool TakeOrderInWork(OrderBindingModel model)
{ {
return ChangeStatus(model, OrderStatus.Выполняется); lock (_locker)
} {
return ChangeStatus(model, OrderStatus.Выполняется);
}
}
public bool FinishOrder(OrderBindingModel model) public bool FinishOrder(OrderBindingModel model)
{ {
return ChangeStatus(model, OrderStatus.Готов); return ChangeStatus(model, OrderStatus.Готов);

View File

@ -0,0 +1,18 @@
using AbstractFoodOrdersDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.BindingModels
{
public class ImplementerBindingModel:IImplementerModel
{
public int Id { get; set; }
public string ImplementerFIO { get; set; } = String.Empty;
public string Password { get; set; } = String.Empty;
public int WorkExperience { get; set; }
public int Qualification { get; set; }
}
}

View File

@ -18,6 +18,7 @@ namespace AbstractFoodOrdersContracts.BindingModels
public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; public OrderStatus Status { get; set; } = OrderStatus.Неизвестен;
public DateTime DateCreate { get; set; } = DateTime.Now; public DateTime DateCreate { get; set; } = DateTime.Now;
public DateTime? DateImplement { get; set; } public DateTime? DateImplement { get; set; }
public int? ImplementerId { get; set; }
} }
} }

View File

@ -0,0 +1,20 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.SearchModels;
using AbstractFoodOrdersContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.BusinessLogicsContracts
{
public interface IImplementerLogic
{
List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model);
ImplementerViewModel? ReadElement(ImplementerSearchModel model);
bool Create(ImplementerBindingModel model);
bool Update(ImplementerBindingModel model);
bool Delete(ImplementerBindingModel model);
}
}

View File

@ -12,7 +12,8 @@ namespace AbstractFoodOrdersContracts.BusinessLogicsContracts
public interface IOrderLogic public interface IOrderLogic
{ {
List<OrderViewModel>? ReadList(OrderSearchModel? model); List<OrderViewModel>? ReadList(OrderSearchModel? model);
bool CreateOrder(OrderBindingModel model); OrderViewModel? ReadElement(OrderSearchModel? model);
bool CreateOrder(OrderBindingModel model);
bool TakeOrderInWork(OrderBindingModel model); bool TakeOrderInWork(OrderBindingModel model);
bool FinishOrder(OrderBindingModel model); bool FinishOrder(OrderBindingModel model);
bool DeliveryOrder(OrderBindingModel model); bool DeliveryOrder(OrderBindingModel model);

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.BusinessLogicsContracts
{
public interface IWorkProcess
{
/// <summary>
/// Запуск работ
/// </summary>
void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic);
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.SearchModels
{
public class ImplementerSearchModel
{
public int? Id { get; set; }
public string? ImplementerFIO { get; set; }
public string? Password { get; set; }
}
}

View File

@ -1,4 +1,5 @@
using System; using AbstractFoodOrdersDataModels.Enums;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -12,5 +13,7 @@ namespace AbstractFoodOrdersContracts.SearchModels
public DateTime? DateFrom { get; set; } public DateTime? DateFrom { get; set; }
public DateTime? DateTo { get; set; } public DateTime? DateTo { get; set; }
public int? ClientId { get; set; } public int? ClientId { get; set; }
} public int? ImplementerId { get; set; }
public OrderStatus? OrderStatus { get; set; }
}
} }

View File

@ -0,0 +1,21 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.SearchModels;
using AbstractFoodOrdersContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.StoragesContracts
{
public interface IImplementerStorage
{
List<ImplementerViewModel> GetFullList();
List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model);
ImplementerViewModel? GetElement(ImplementerSearchModel model);
ImplementerViewModel? Insert(ImplementerBindingModel model);
ImplementerViewModel? Update(ImplementerBindingModel model);
ImplementerViewModel? Delete(ImplementerBindingModel model);
}
}

View File

@ -0,0 +1,23 @@
using AbstractFoodOrdersDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersContracts.ViewModels
{
public class ImplementerViewModel:IImplementerModel
{
public int Id { get; set; }
[DisplayName("ФИО")]
public string ImplementerFIO { get; set; } = String.Empty;
[DisplayName("Пароль")]
public string Password { get; set; } = String.Empty;
[DisplayName("Опыт работы")]
public int WorkExperience { get; set; }
[DisplayName("Квалификация")]
public int Qualification { get; set; }
}
}

View File

@ -16,7 +16,10 @@ namespace AbstractFoodOrdersContracts.ViewModels
public int DishId { get; set; } public int DishId { get; set; }
[DisplayName("Изделие")] [DisplayName("Изделие")]
public string DishName { get; set; } = string.Empty; public string DishName { get; set; } = string.Empty;
public int ClientId { get; set; } public int? ImplementerId { get; set; }
[DisplayName("Исполнитель")]
public string? ImplementerFIO { get; set; }
public int ClientId { get; set; }
[DisplayName("ФИО клиента")] [DisplayName("ФИО клиента")]
public string ClientFIO { get; set; } = string.Empty; public string ClientFIO { get; set; } = string.Empty;
[DisplayName("Количество")] [DisplayName("Количество")]

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersDataModels.Models
{
public interface IImplementerModel:IId
{
string ImplementerFIO { get; }
string Password { get; }
int WorkExperience { get; }
int Qualification { get; }
}
}

View File

@ -15,6 +15,7 @@ namespace AbstractFoodOrdersDataModels.Models
OrderStatus Status { get; } OrderStatus Status { get; }
DateTime DateCreate { get; } DateTime DateCreate { get; }
DateTime? DateImplement { get; } DateTime? DateImplement { get; }
int? ImplementerId { get; }
} }
} }

View File

@ -26,5 +26,6 @@ namespace AbstractFoodOrdersDatabaseImplement
public virtual DbSet<DishComponent> DishComponents { set; get; } public virtual DbSet<DishComponent> DishComponents { set; get; }
public virtual DbSet<Order> Orders { set; get; } public virtual DbSet<Order> Orders { set; get; }
public virtual DbSet<Client> Clients { set; get; } public virtual DbSet<Client> Clients { set; get; }
} public virtual DbSet<Implementer> Implementers { set; get; }
}
} }

View File

@ -0,0 +1,96 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.SearchModels;
using AbstractFoodOrdersContracts.StoragesContracts;
using AbstractFoodOrdersContracts.ViewModels;
using AbstractFoodOrdersDatabaseImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersDatabaseImplement.Implements
{
public class ImplementerStorage:IImplementerStorage
{
public List<ImplementerViewModel> GetFullList()
{
using var context = new AbstractFoodOrdersDatabase();
return context.Implementers
.Select(x => x.GetViewModel)
.ToList();
}
public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
{
if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue)
{
return new();
}
if (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password))
{
using var context = new AbstractFoodOrdersDatabase();
return context.Implementers
.Where(x => x.ImplementerFIO.Equals(model.ImplementerFIO))
.Select(x => x.GetViewModel)
.ToList();
}
else
{
using var context = new AbstractFoodOrdersDatabase();
return context.Implementers
.Where(x => x.Id == model.Id)
.Select(x => x.GetViewModel)
.ToList();
}
}
public ImplementerViewModel? GetElement(ImplementerSearchModel model)
{
if (string.IsNullOrEmpty(model.ImplementerFIO) && string.IsNullOrEmpty(model.Password) && !model.Id.HasValue)
{
return null;
}
using var context = new AbstractFoodOrdersDatabase();
return context.Implementers
.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password)
&& x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password) ||
(model.Id.HasValue && x.Id == model.Id))
?.GetViewModel;
}
public ImplementerViewModel? Insert(ImplementerBindingModel model)
{
var newImplementer = Implementer.Create(model);
if (newImplementer == null)
{
return null;
}
using var context = new AbstractFoodOrdersDatabase();
context.Implementers.Add(newImplementer);
context.SaveChanges();
return newImplementer.GetViewModel;
}
public ImplementerViewModel? Update(ImplementerBindingModel model)
{
using var context = new AbstractFoodOrdersDatabase();
var component = context.Implementers.FirstOrDefault(x => x.Id == model.Id);
if (component == null)
{
return null;
}
component.Update(model);
context.SaveChanges();
return component.GetViewModel;
}
public ImplementerViewModel? Delete(ImplementerBindingModel model)
{
using var context = new AbstractFoodOrdersDatabase();
var element = context.Implementers.FirstOrDefault(rec => rec.Id == model.Id);
if (element != null)
{
context.Implementers.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
}
}

View File

@ -17,7 +17,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
public List<OrderViewModel> GetFullList() public List<OrderViewModel> GetFullList()
{ {
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
return context.Orders.Include(x => x.Client) return context.Orders.Include(x => x.Client).Include(x => x.Implementer)
.Select(x => AccessDishStorage(x.GetViewModel, context)) .Select(x => AccessDishStorage(x.GetViewModel, context))
.ToList(); .ToList();
} }
@ -30,7 +30,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
if (model.ClientId.HasValue) if (model.ClientId.HasValue)
{ {
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
return context.Orders.Include(x => x.Client) return context.Orders.Include(x => x.Client).Include(x => x.Implementer)
.Where(x => x.ClientId == model.ClientId) .Where(x => x.ClientId == model.ClientId)
.Select(x => AccessDishStorage(x.GetViewModel, context)) .Select(x => AccessDishStorage(x.GetViewModel, context))
.ToList(); .ToList();
@ -38,7 +38,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
else if (!model.DateFrom.HasValue || !model.DateTo.HasValue) else if (!model.DateFrom.HasValue || !model.DateTo.HasValue)
{ {
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
return context.Orders.Include(x => x.Client) return context.Orders.Include(x => x.Client).Include(x => x.Implementer)
.Where(x => x.Id == model.Id) .Where(x => x.Id == model.Id)
.Select(x => AccessDishStorage(x.GetViewModel, context)) .Select(x => AccessDishStorage(x.GetViewModel, context))
.ToList(); .ToList();
@ -46,7 +46,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
else else
{ {
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
return context.Orders.Include(x => x.Client) return context.Orders.Include(x => x.Client).Include(x => x.Implementer)
.Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo)
.Select(x => AccessDishStorage(x.GetViewModel, context)) .Select(x => AccessDishStorage(x.GetViewModel, context))
.ToList(); .ToList();
@ -54,15 +54,25 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
} }
public OrderViewModel? GetElement(OrderSearchModel model) public OrderViewModel? GetElement(OrderSearchModel model)
{ {
if (!model.Id.HasValue) if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.OrderStatus.HasValue)
{ {
return new(); return new();
} }
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
return AccessDishStorage(context.Orders.Include(x => x.Client) if (!model.Id.HasValue)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) {
?.GetViewModel, context); return AccessDishStorage(context.Orders.Include(x => x.Client).Include(x => x.Implementer)
} .FirstOrDefault(x => model.ImplementerId.HasValue && model.OrderStatus.HasValue
&& x.Status == model.OrderStatus && x.ImplementerId == model.ImplementerId)
?.GetViewModel, context);
}
else
{
return AccessDishStorage(context.Orders.Include(x => x.Client).Include(x => x.Implementer)
.FirstOrDefault(x => x.Id == model.Id)
?.GetViewModel, context);
}
}
public OrderViewModel? Insert(OrderBindingModel model) public OrderViewModel? Insert(OrderBindingModel model)
{ {
using var context = new AbstractFoodOrdersDatabase(); using var context = new AbstractFoodOrdersDatabase();
@ -84,7 +94,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Implements
{ {
return null; return null;
} }
order.Update(model); order.Update(context, model);
context.SaveChanges(); context.SaveChanges();
return AccessDishStorage(order.GetViewModel, context); return AccessDishStorage(order.GetViewModel, context);
} }

View File

@ -0,0 +1,257 @@
// <auto-generated />
using System;
using AbstractFoodOrdersDatabaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace AbstractFoodOrdersDatabaseImplement.Migrations
{
[DbContext(typeof(AbstractFoodOrdersDatabase))]
[Migration("20230514143654_ImplementerUpdate")]
partial class ImplementerUpdate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.5")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.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("AbstractFoodOrdersDatabaseImplement.Models.Component", 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>("Cost")
.HasColumnType("float");
b.HasKey("Id");
b.ToTable("Components");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Dish", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("DishName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<double>("Price")
.HasColumnType("float");
b.HasKey("Id");
b.ToTable("Dishes");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.DishComponent", 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>("DishId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("ComponentId");
b.HasIndex("DishId");
b.ToTable("DishComponents");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.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("AbstractFoodOrdersDatabaseImplement.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>("DishId")
.HasColumnType("int");
b.Property<int?>("ImplementerId")
.HasColumnType("int");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<double>("Sum")
.HasColumnType("float");
b.HasKey("Id");
b.HasIndex("ClientId");
b.HasIndex("DishId");
b.HasIndex("ImplementerId");
b.ToTable("Orders");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.DishComponent", b =>
{
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Component", "Component")
.WithMany("DishComponents")
.HasForeignKey("ComponentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Dish", "Dish")
.WithMany("Components")
.HasForeignKey("DishId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Component");
b.Navigation("Dish");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Order", b =>
{
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Client", "Client")
.WithMany("ClientOrders")
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Dish", "Dish")
.WithMany("Orders")
.HasForeignKey("DishId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Implementer", "Implementer")
.WithMany("Orders")
.HasForeignKey("ImplementerId");
b.Navigation("Client");
b.Navigation("Dish");
b.Navigation("Implementer");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Client", b =>
{
b.Navigation("ClientOrders");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Component", b =>
{
b.Navigation("DishComponents");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Dish", b =>
{
b.Navigation("Components");
b.Navigation("Orders");
});
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Implementer", b =>
{
b.Navigation("Orders");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,67 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AbstractFoodOrdersDatabaseImplement.Migrations
{
/// <inheritdoc />
public partial class ImplementerUpdate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "ImplementerId",
table: "Orders",
type: "int",
nullable: true);
migrationBuilder.CreateTable(
name: "Implementers",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
ImplementerFIO = table.Column<string>(type: "nvarchar(max)", nullable: false),
Password = table.Column<string>(type: "nvarchar(max)", nullable: false),
WorkExperience = table.Column<int>(type: "int", nullable: false),
Qualification = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Implementers", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_Orders_ImplementerId",
table: "Orders",
column: "ImplementerId");
migrationBuilder.AddForeignKey(
name: "FK_Orders_Implementers_ImplementerId",
table: "Orders",
column: "ImplementerId",
principalTable: "Implementers",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Orders_Implementers_ImplementerId",
table: "Orders");
migrationBuilder.DropTable(
name: "Implementers");
migrationBuilder.DropIndex(
name: "IX_Orders_ImplementerId",
table: "Orders");
migrationBuilder.DropColumn(
name: "ImplementerId",
table: "Orders");
}
}
}

View File

@ -113,6 +113,33 @@ namespace AbstractFoodOrdersDatabaseImplement.Migrations
b.ToTable("DishComponents"); b.ToTable("DishComponents");
}); });
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.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("AbstractFoodOrdersDatabaseImplement.Models.Order", b => modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Order", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -136,6 +163,9 @@ namespace AbstractFoodOrdersDatabaseImplement.Migrations
b.Property<int>("DishId") b.Property<int>("DishId")
.HasColumnType("int"); .HasColumnType("int");
b.Property<int?>("ImplementerId")
.HasColumnType("int");
b.Property<int>("Status") b.Property<int>("Status")
.HasColumnType("int"); .HasColumnType("int");
@ -148,6 +178,8 @@ namespace AbstractFoodOrdersDatabaseImplement.Migrations
b.HasIndex("DishId"); b.HasIndex("DishId");
b.HasIndex("ImplementerId");
b.ToTable("Orders"); b.ToTable("Orders");
}); });
@ -184,9 +216,15 @@ namespace AbstractFoodOrdersDatabaseImplement.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("AbstractFoodOrdersDatabaseImplement.Models.Implementer", "Implementer")
.WithMany("Orders")
.HasForeignKey("ImplementerId");
b.Navigation("Client"); b.Navigation("Client");
b.Navigation("Dish"); b.Navigation("Dish");
b.Navigation("Implementer");
}); });
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Client", b => modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Client", b =>
@ -205,6 +243,11 @@ namespace AbstractFoodOrdersDatabaseImplement.Migrations
b.Navigation("Orders"); b.Navigation("Orders");
}); });
modelBuilder.Entity("AbstractFoodOrdersDatabaseImplement.Models.Implementer", b =>
{
b.Navigation("Orders");
});
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
} }

View File

@ -0,0 +1,63 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.ViewModels;
using AbstractFoodOrdersDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersDatabaseImplement.Models
{
public class Implementer:IImplementerModel
{
public int Id { get; private set; }
[Required]
public string ImplementerFIO { get; set; } = string.Empty;
[Required]
public string Password { get; set; } = string.Empty;
[Required]
public int WorkExperience { get; set; }
[Required]
public int Qualification { get; set; }
[ForeignKey("ImplementerId")]
public virtual List<Order> Orders { get; set; } = new List<Order>();
public static Implementer? Create(ImplementerBindingModel? model)
{
if (model == null)
{
return null;
}
return new Implementer()
{
Id = model.Id,
ImplementerFIO = model.ImplementerFIO,
Password = model.Password,
WorkExperience = model.WorkExperience,
Qualification = model.Qualification,
};
}
public void Update(ImplementerBindingModel? model)
{
if (model == null)
{
return;
}
ImplementerFIO = model.ImplementerFIO;
Password = model.Password;
WorkExperience = model.WorkExperience;
Qualification = model.Qualification;
}
public ImplementerViewModel GetViewModel => new()
{
Id = Id,
ImplementerFIO = ImplementerFIO,
Password = Password,
WorkExperience = WorkExperience,
Qualification = Qualification,
};
}
}

View File

@ -20,7 +20,9 @@ namespace AbstractFoodOrdersDatabaseImplement.Models
[Required] [Required]
public int ClientId { get; set; } public int ClientId { get; set; }
public virtual Client Client { get; set; } = new(); public virtual Client Client { get; set; } = new();
[Required] public int? ImplementerId { get; set; }
public virtual Implementer? Implementer { get; set; } = new();
[Required]
public int Count { get; private set; } public int Count { get; private set; }
[Required] [Required]
public double Sum { get; private set; } public double Sum { get; private set; }
@ -46,18 +48,22 @@ namespace AbstractFoodOrdersDatabaseImplement.Models
Sum = model.Sum, Sum = model.Sum,
Status = model.Status, Status = model.Status,
DateCreate = model.DateCreate, DateCreate = model.DateCreate,
DateImplement = model.DateImplement DateImplement = model.DateImplement,
}; ImplementerId = model.ImplementerId,
Implementer = model.ImplementerId.HasValue ? data.Implementers.First(x => x.Id == model.ImplementerId) : null,
};
} }
public void Update(OrderBindingModel? model) public void Update(AbstractFoodOrdersDatabase context, OrderBindingModel? model)
{ {
if (model == null) if (model == null)
{ {
return; return;
} }
Status = model.Status; Status = model.Status;
if (model.DateImplement.HasValue) DateImplement = model.DateImplement; if (model.ImplementerId.HasValue) ImplementerId = model.ImplementerId;
} if (model.ImplementerId.HasValue) Implementer = context.Implementers.First(x => x.Id == model.ImplementerId);
if (model.DateImplement.HasValue) DateImplement = model.DateImplement;
}
public OrderViewModel GetViewModel => new() public OrderViewModel GetViewModel => new()
{ {
Id = Id, Id = Id,
@ -68,7 +74,9 @@ namespace AbstractFoodOrdersDatabaseImplement.Models
Sum = Sum, Sum = Sum,
Status = Status, Status = Status,
DateCreate = DateCreate, DateCreate = DateCreate,
DateImplement = DateImplement DateImplement = DateImplement,
}; ImplementerId = ImplementerId,
ImplementerFIO = Implementer?.ImplementerFIO
};
} }
} }

View File

@ -14,13 +14,15 @@ namespace AbstractFoodOrdersListImplement
public List<Order> Orders { get; set; } public List<Order> Orders { get; set; }
public List<Dish> Dishes { get; set; } public List<Dish> Dishes { get; set; }
public List<Client> Clients { get; set; } public List<Client> Clients { get; set; }
private DataListSingleton() public List<Implementer> Implementers { get; set; }
private DataListSingleton()
{ {
Components = new List<Component>(); Components = new List<Component>();
Orders = new List<Order>(); Orders = new List<Order>();
Dishes = new List<Dish>(); Dishes = new List<Dish>();
Clients = new List<Client>(); Clients = new List<Client>();
} Implementers = new List<Implementer>();
}
public static DataListSingleton GetInstance() public static DataListSingleton GetInstance()
{ {
if (_instance == null) if (_instance == null)

View File

@ -13,118 +13,148 @@ namespace AbstractFoodOrdersListImplement.Implements
{ {
public class OrderStorage : IOrderStorage public class OrderStorage : IOrderStorage
{ {
private readonly DataListSingleton _source; private readonly DataListSingleton _source;
public OrderStorage() public OrderStorage()
{ {
_source = DataListSingleton.GetInstance(); _source = DataListSingleton.GetInstance();
} }
public List<OrderViewModel> GetFullList() public List<OrderViewModel> GetFullList()
{ {
var result = new List<OrderViewModel>(); var result = new List<OrderViewModel>();
foreach (var order in _source.Orders) foreach (var order in _source.Orders)
{ {
result.Add(AttachReinforcedName(order.GetViewModel)); result.Add(AccessDishStorage(order.GetViewModel));
} }
return result; return result;
} }
public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
{
var result = new List<OrderViewModel>();
if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue)
{
return result;
}
foreach (var order in _source.Orders)
{
if ((order.DateCreate >= model.DateFrom && order.DateCreate <= model.DateTo) || order.ClientId == model.ClientId)
{
result.Add(AttachReinforcedName(order.GetViewModel));
}
}
return result;
} public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
public OrderViewModel? GetElement(OrderSearchModel model) {
{ var result = new List<OrderViewModel>();
if (!model.Id.HasValue) if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.OrderStatus.HasValue)
{ {
return null; return result;
} }
foreach (var order in _source.Orders) if (model.ImplementerId.HasValue && model.OrderStatus.HasValue)
{ {
if (model.Id.HasValue && order.Id == model.Id) foreach (var order in _source.Orders)
{ {
return AttachReinforcedName(order.GetViewModel); if (order.Status == model.OrderStatus)
} {
} result.Add(AccessDishStorage(order.GetViewModel));
return null; }
}
}
else if (!model.DateFrom.HasValue || !model.DateTo.HasValue)
{
foreach (var order in _source.Orders)
{
if (order.Id == model.Id)
{
result.Add(AccessDishStorage(order.GetViewModel));
}
}
}
else
{
foreach (var order in _source.Orders)
{
if (order.DateCreate >= model.DateFrom && order.DateCreate <= model.DateTo)
{
result.Add(AccessDishStorage(order.GetViewModel));
}
}
}
return result;
}
} public OrderViewModel? GetElement(OrderSearchModel model)
public OrderViewModel? Insert(OrderBindingModel model) {
{ if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.OrderStatus.HasValue)
model.Id = 1; {
foreach (var order in _source.Orders) return null;
{ }
if (model.Id <= order.Id) if (!model.Id.HasValue)
{ {
model.Id = order.Id + 1; foreach (var order in _source.Orders)
} {
} if (model.ImplementerId.HasValue && model.OrderStatus.HasValue
var newOrder = Order.Create(model); && order.ImplementerId == model.ImplementerId && order.Status == model.OrderStatus)
if (newOrder == null) {
{ return AccessDishStorage(order.GetViewModel);
return null; }
} }
_source.Orders.Add(newOrder); }
return AttachReinforcedName(newOrder.GetViewModel); else
} {
public OrderViewModel? Update(OrderBindingModel model) foreach (var order in _source.Orders)
{ {
foreach (var order in _source.Orders) if (model.Id.HasValue && order.Id == model.Id)
{ {
if (order.Id == model.Id) return AccessDishStorage(order.GetViewModel);
{ }
order.Update(model); }
return AttachReinforcedName(order.GetViewModel); }
} return null;
} }
return null;
} public OrderViewModel? Insert(OrderBindingModel model)
public OrderViewModel? Delete(OrderBindingModel model) {
{ model.Id = 1;
for (int i = 0; i < _source.Orders.Count; ++i) foreach (var order in _source.Orders)
{ {
if (_source.Orders[i].Id == model.Id) if (model.Id <= order.Id)
{ {
var element = _source.Orders[i]; model.Id = order.Id + 1;
_source.Orders.RemoveAt(i); }
return AttachReinforcedName(element.GetViewModel); }
} var newOrder = Order.Create(model);
} if (newOrder == null)
return null; {
} return null;
private OrderViewModel AttachReinforcedName(OrderViewModel model) }
{ _source.Orders.Add(newOrder);
//Из всех мест, это выглядит наиболее подходящим, для данной манипуляции. return AccessDishStorage(newOrder.GetViewModel);
//При расположении ниже нарушится целостность данных }
//При расположении выше будет нарушен принцип разделения уровней
foreach (var reinforced in _source.Dishes) public OrderViewModel? Update(OrderBindingModel model)
{ {
if (reinforced.Id == model.DishId) foreach (var order in _source.Orders)
{ {
model.DishName = reinforced.DishName; if (order.Id == model.Id)
break; {
} order.Update(model);
} return AccessDishStorage(order.GetViewModel);
foreach (var client in _source.Clients) }
{ }
if (client.Id == model.ClientId) return null;
{ }
model.ClientFIO = client.ClientFIO;
break; public OrderViewModel? Delete(OrderBindingModel model)
} {
} for (int i = 0; i < _source.Orders.Count; ++i)
return model; {
} if (_source.Orders[i].Id == model.Id)
} {
var element = _source.Orders[i];
_source.Orders.RemoveAt(i);
return AccessDishStorage(element.GetViewModel);
}
}
return null;
}
public OrderViewModel AccessDishStorage(OrderViewModel model)
{
foreach (var pastry in _source.Dishes)
{
if (pastry.Id == model.DishId)
{
model.DishName = pastry.DishName;
break;
}
}
return model;
}
}
} }

View File

@ -15,7 +15,8 @@ namespace AbstractFoodOrdersListImplement.Models
public int Id { get; private set; } public int Id { get; private set; }
public int DishId { get; private set; } public int DishId { get; private set; }
public int ClientId { get; private set; } public int ClientId { get; private set; }
public int Count { get; private set; } public int? ImplementerId { get; private set; }
public int Count { get; private set; }
public double Sum { get; private set; } public double Sum { get; private set; }
public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен;
public DateTime DateCreate { get; private set; } = DateTime.Now; public DateTime DateCreate { get; private set; } = DateTime.Now;
@ -31,6 +32,7 @@ namespace AbstractFoodOrdersListImplement.Models
Id = model.Id, Id = model.Id,
DishId = model.DishId, DishId = model.DishId,
ClientId = model.ClientId, ClientId = model.ClientId,
ImplementerId = model.ImplementerId,
Count = model.Count, Count = model.Count,
Sum = model.Sum, Sum = model.Sum,
Status = model.Status, Status = model.Status,
@ -46,6 +48,7 @@ namespace AbstractFoodOrdersListImplement.Models
} }
DishId = model.DishId; DishId = model.DishId;
ClientId = model.ClientId; ClientId = model.ClientId;
ImplementerId = model.ImplementerId;
Count = model.Count; Count = model.Count;
Sum = model.Sum; Sum = model.Sum;
Status = model.Status; Status = model.Status;
@ -57,6 +60,7 @@ namespace AbstractFoodOrdersListImplement.Models
Id = Id, Id = Id,
DishId = DishId, DishId = DishId,
ClientId = ClientId, ClientId = ClientId,
ImplementerId = ImplementerId,
Count = Count, Count = Count,
Sum = Sum, Sum = Sum,
Status = Status, Status = Status,

View File

@ -15,11 +15,13 @@ namespace AbstractFoodOrdersFileImplement
private readonly string OrderFileName = "Order.xml"; private readonly string OrderFileName = "Order.xml";
private readonly string DishFileName = "Dish.xml"; private readonly string DishFileName = "Dish.xml";
private readonly string ClientFileName = "Client.xml"; private readonly string ClientFileName = "Client.xml";
public List<Component> Components { get; private set; } private readonly string ImplementerFileName = "Implementer.xml";
public List<Component> Components { get; private set; }
public List<Order> Orders { get; private set; } public List<Order> Orders { get; private set; }
public List<Dish> Dishes { get; private set; } public List<Dish> Dishes { get; private set; }
public List<Client> Clients { get; private set; } public List<Client> Clients { get; private set; }
public static DataFileSingleton GetInstance() public List<Implementer> Implementers { get; private set; }
public static DataFileSingleton GetInstance()
{ {
if (instance == null) if (instance == null)
{ {
@ -31,7 +33,8 @@ namespace AbstractFoodOrdersFileImplement
public void SaveDishes() => SaveData(Dishes, DishFileName, "Dishes", x => x.GetXElement); public void SaveDishes() => SaveData(Dishes, DishFileName, "Dishes", x => x.GetXElement);
public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement);
private DataFileSingleton() public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement);
private DataFileSingleton()
{ {
Components = LoadData(ComponentFileName, "Component", x => Components = LoadData(ComponentFileName, "Component", x =>
Component.Create(x)!)!; Component.Create(x)!)!;
@ -41,7 +44,8 @@ namespace AbstractFoodOrdersFileImplement
Order.Create(x)!)!; Order.Create(x)!)!;
Clients = LoadData(ClientFileName, "Client", x => Clients = LoadData(ClientFileName, "Client", x =>
Client.Create(x)!)!; Client.Create(x)!)!;
} Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!;
}
private static List<T>? LoadData<T>(string filename, string xmlNodeName, private static List<T>? LoadData<T>(string filename, string xmlNodeName,
Func<XElement, T> selectFunction) Func<XElement, T> selectFunction)
{ {

View File

@ -0,0 +1,86 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.SearchModels;
using AbstractFoodOrdersContracts.StoragesContracts;
using AbstractFoodOrdersContracts.ViewModels;
using AbstractFoodOrdersFileImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFoodOrdersFileImplement.Implements
{
public class ImplementerStorage:IImplementerStorage
{
private readonly DataFileSingleton source;
public ImplementerStorage()
{
source = DataFileSingleton.GetInstance();
}
public List<ImplementerViewModel> GetFullList()
{
return source.Implementers
.Select(x => x.GetViewModel)
.ToList();
}
public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
{
if (string.IsNullOrEmpty(model.ImplementerFIO))
{
return new();
}
return source.Implementers
.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO))
.Select(x => x.GetViewModel)
.ToList();
}
public ImplementerViewModel? GetElement(ImplementerSearchModel model)
{
if (string.IsNullOrEmpty(model.ImplementerFIO) && string.IsNullOrEmpty(model.Password) && !model.Id.HasValue)
{
return null;
}
return source.Implementers
.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password)
&& x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password) ||
(model.Id.HasValue && x.Id == model.Id))
?.GetViewModel;
}
public ImplementerViewModel? Insert(ImplementerBindingModel model)
{
model.Id = source.Implementers.Count > 0 ? source.Implementers.Max(x => x.Id) + 1 : 1;
var newImplementer = Implementer.Create(model);
if (newImplementer == null)
{
return null;
}
source.Implementers.Add(newImplementer);
source.SaveImplementers();
return newImplementer.GetViewModel;
}
public ImplementerViewModel? Update(ImplementerBindingModel model)
{
var ingredient = source.Implementers.FirstOrDefault(x => x.Id == model.Id);
if (ingredient == null)
{
return null;
}
ingredient.Update(model);
source.SaveImplementers();
return ingredient.GetViewModel;
}
public ImplementerViewModel? Delete(ImplementerBindingModel model)
{
var element = source.Implementers.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
source.Implementers.Remove(element);
source.SaveImplementers();
return element.GetViewModel;
}
return null;
}
}
}

View File

@ -6,6 +6,7 @@ using AbstractFoodOrdersFileImplement.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -22,90 +23,100 @@ namespace AbstractFoodOrdersFileImplement.Implements
public List<OrderViewModel> GetFullList() public List<OrderViewModel> GetFullList()
{ {
return source.Orders.Select(x => GetViewModel(x)).ToList(); return source.Orders.Select(x => x.GetViewModel)
.Select(y => { y.DishName = source.Dishes.FirstOrDefault(x => x.Id == y?.DishId)?.DishName; return y; }).ToList();
} }
public List<OrderViewModel> GetFilteredList(OrderSearchModel model) public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
{ {
if ((!model.DateFrom.HasValue || !model.DateTo.HasValue) && !model.ClientId.HasValue) if (!model.Id.HasValue || !model.DateFrom.HasValue || !model.DateTo.HasValue || !model.OrderStatus.HasValue)
{
return new();
}
if (model.OrderStatus.HasValue)
{ {
return new(); return source.Orders.Where(x => x.ImplementerId == model.ImplementerId)
} .Select(x => x.GetViewModel)
return source.Orders.Where(x => (model.DateFrom.HasValue && model.DateTo.HasValue && x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) ||( x.ClientId == model.ClientId))
.Select(x => GetViewModel(x))
.Select(y => { y.DishName = source.Dishes.FirstOrDefault(x => x.Id == y?.DishId)?.DishName; return y; }).ToList(); .Select(y => { y.DishName = source.Dishes.FirstOrDefault(x => x.Id == y?.DishId)?.DishName; return y; }).ToList();
} }
if (!model.DateFrom.HasValue || !model.DateTo.HasValue)
{
return source.Orders.Where(x => x.Id == model.Id)
.Select(x => x.GetViewModel)
.Select(y => { y.DishName = source.Dishes.FirstOrDefault(x => x.Id == y?.DishId)?.DishName; return y; }).ToList();
}
else
{
return source.Orders.Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo)
.Select(x => x.GetViewModel)
.Select(y => { y.DishName = source.Dishes.FirstOrDefault(x => x.Id == y?.DishId)?.DishName; return y; }).ToList();
}
}
public OrderViewModel? GetElement(OrderSearchModel model) public OrderViewModel? GetElement(OrderSearchModel model)
{ {
if (!model.Id.HasValue && !model.ClientId.HasValue) if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.OrderStatus.HasValue)
{
return null;
}
if (!model.Id.HasValue)
{ {
return null; return AccessDishStorage(source.Orders
} .FirstOrDefault(x => model.ImplementerId.HasValue && model.OrderStatus.HasValue
&& x.ImplementerId == model.ImplementerId && x.Status == model.OrderStatus)
return source.Orders.FirstOrDefault(x => x.ClientId == model.ClientId && x.Id == model.Id)?.GetViewModel; ?.GetViewModel);
} }
else
{
return AccessDishStorage(source.Orders
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
?.GetViewModel);
}
}
//для загрузки названий изделия в заказе //для загрузки названий изделия в заказе
private OrderViewModel GetViewModel(Order order) private OrderViewModel AccessDishStorage(OrderViewModel model)
{ {
var viewModel = order.GetViewModel; string? dishName = source.Dishes.FirstOrDefault(x => x.Id == model?.DishId)?.DishName;
if (dishName != null) model.DishName = dishName;
var manufacture = source.Dishes.FirstOrDefault(x => x.Id == order.DishId); return model;
}
if (manufacture != null)
{
viewModel.DishName = manufacture.DishName;
}
return viewModel;
}
public OrderViewModel? Insert(OrderBindingModel model) public OrderViewModel? Insert(OrderBindingModel model)
{ {
model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1; model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1;
var newOrder = Order.Create(model);
var newOrder = Order.Create(model); if (newOrder == null)
{
if (newOrder == null) return null;
{ }
return null; source.Orders.Add(newOrder);
} source.SaveOrders();
return AccessDishStorage(newOrder.GetViewModel);
source.Orders.Add(newOrder); }
source.SaveOrders();
return GetViewModel(newOrder);
}
public OrderViewModel? Update(OrderBindingModel model) public OrderViewModel? Update(OrderBindingModel model)
{ {
var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); var order = source.Orders.FirstOrDefault(x => x.Id == model.Id);
if (order == null)
if (order == null) {
{ return null;
return null; }
} order.Update(model);
source.SaveOrders();
order.Update(model); return AccessDishStorage(order.GetViewModel);
source.SaveOrders(); }
return GetViewModel(order);
}
public OrderViewModel? Delete(OrderBindingModel model) public OrderViewModel? Delete(OrderBindingModel model)
{ {
var element = source.Orders.FirstOrDefault(x => x.Id == model.Id); var element = source.Orders.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
if (element != null) {
{ source.Orders.Remove(element);
source.Orders.Remove(element); source.SaveOrders();
source.SaveOrders(); return AccessDishStorage(element.GetViewModel);
}
return GetViewModel(element); return null;
} }
return null;
}
} }
} }

View File

@ -0,0 +1,80 @@
using AbstractFoodOrdersContracts.BindingModels;
using AbstractFoodOrdersContracts.ViewModels;
using AbstractFoodOrdersDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace AbstractFoodOrdersFileImplement.Models
{
public class Implementer:IImplementerModel
{
public int Id { get; private set; }
public string ImplementerFIO { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public int WorkExperience { get; set; }
public int Qualification { get; set; }
public static Implementer? Create(ImplementerBindingModel? model)
{
if (model == null)
{
return null;
}
return new Implementer()
{
Id = model.Id,
ImplementerFIO = model.ImplementerFIO,
Password = model.Password,
WorkExperience = model.WorkExperience,
Qualification = model.Qualification,
};
}
public static Implementer? Create(XElement element)
{
if (element == null)
{
return null;
}
return new Implementer()
{
Id = Convert.ToInt32(element.Attribute("Id")!.Value),
ImplementerFIO = element.Attribute("ImplementerFIO")!.Value,
Password = element.Attribute("Password")!.Value,
WorkExperience = Convert.ToInt32(element.Attribute("WorkExperience")!.Value),
Qualification = Convert.ToInt32(element.Attribute("Qualification")!.Value),
};
}
public void Update(ImplementerBindingModel? model)
{
if (model == null)
{
return;
}
ImplementerFIO = model.ImplementerFIO;
Password = model.Password;
WorkExperience = model.WorkExperience;
Qualification = model.Qualification;
}
public ImplementerViewModel GetViewModel => new()
{
Id = Id,
ImplementerFIO = ImplementerFIO,
Password = Password,
WorkExperience = WorkExperience,
Qualification = Qualification
};
public XElement GetXElement => new("Implementer",
new XAttribute("Id", Id),
new XElement("ImplementerFIO", ImplementerFIO),
new XElement("Password", Password),
new XElement("WorkExperience", WorkExperience),
new XElement("Qualification", Qualification));
}
}

View File

@ -17,7 +17,8 @@ namespace AbstractFoodOrdersFileImplement.Models
public int Id { get; private set; } public int Id { get; private set; }
public int DishId { get; private set; } public int DishId { get; private set; }
public int ClientId { get; private set; } public int ClientId { get; private set; }
public int Count { get; private set; } public int? ImplementerId { get; private set; }
public int Count { get; private set; }
public double Sum { get; private set; } public double Sum { get; private set; }
public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен;
public DateTime DateCreate { get; private set; } = DateTime.Now; public DateTime DateCreate { get; private set; } = DateTime.Now;
@ -38,7 +39,8 @@ namespace AbstractFoodOrdersFileImplement.Models
Sum = model.Sum, Sum = model.Sum,
Status = model.Status, Status = model.Status,
DateCreate = model.DateCreate, DateCreate = model.DateCreate,
DateImplement = model.DateImplement DateImplement = model.DateImplement,
ImplementerId = model.ImplementerId
}; };
} }
public static Order? Create(XElement element) public static Order? Create(XElement element)
@ -57,8 +59,10 @@ namespace AbstractFoodOrdersFileImplement.Models
Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value),
DateCreate = Convert.ToDateTime(element.Element("DateCreate")!.Value), DateCreate = Convert.ToDateTime(element.Element("DateCreate")!.Value),
DateImplement = string.IsNullOrEmpty(element.Element("DateImplement")!.Value) ? null : DateImplement = string.IsNullOrEmpty(element.Element("DateImplement")!.Value) ? null :
Convert.ToDateTime(element.Element("DateImplement")!.Value) Convert.ToDateTime(element.Element("DateImplement")!.Value),
};
ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.Value),
};
} }
public void Update(OrderBindingModel? model) public void Update(OrderBindingModel? model)
{ {
@ -73,7 +77,8 @@ namespace AbstractFoodOrdersFileImplement.Models
Status = model.Status; Status = model.Status;
DateCreate = model.DateCreate; DateCreate = model.DateCreate;
DateImplement = model.DateImplement; DateImplement = model.DateImplement;
} ImplementerId = model.ImplementerId;
}
public OrderViewModel GetViewModel => new() public OrderViewModel GetViewModel => new()
{ {
Id = Id, Id = Id,
@ -84,12 +89,14 @@ namespace AbstractFoodOrdersFileImplement.Models
Status = Status, Status = Status,
DateCreate = DateCreate, DateCreate = DateCreate,
DateImplement = DateImplement, DateImplement = DateImplement,
}; ImplementerId = ImplementerId
};
public XElement GetXElement => new("Order", public XElement GetXElement => new("Order",
new XAttribute("Id", Id), new XAttribute("Id", Id),
new XElement("DishId", DishId), new XElement("DishId", DishId),
new XElement("ClientId", ClientId), new XElement("ClientId", ClientId),
new XElement("Count", Count.ToString()), new XElement("ImplementerId", ImplementerId.ToString()),
new XElement("Count", Count.ToString()),
new XElement("Sum", Sum.ToString()), new XElement("Sum", Sum.ToString()),
new XElement("Status", Status.ToString()), new XElement("Status", Status.ToString()),
new XElement("DateCreate", DateCreate.ToString()), new XElement("DateCreate", DateCreate.ToString()),