diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ImplementerLogic.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ImplementerLogic.cs new file mode 100644 index 0000000..c1e236b --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ImplementerLogic.cs @@ -0,0 +1,174 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyBusinessLogic.BussinessLogic +{ + // Класс, реализующий логику для исполнителей + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + + private readonly IImplementerStorage _implementerStorage; + + // Конструктор + public ImplementerLogic(ILogger logger, IImplementerStorage implementerStorage) + { + _logger = logger; + _implementerStorage = implementerStorage; + } + + // Вывод всего отфильтрованного списка + public List? ReadList(ImplementerSearchModel? model) + { + _logger.LogInformation("ReadList. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model?.ImplementerFIO, model?.Id); + + // list хранит весь список в случае, если model пришло со значением null на вход метода + 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("ReadList. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model.ImplementerFIO, model?.Id); + + 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; + } + + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(ImplementerBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + // Так как при удалении передаём как параметр false + 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.Qualification <= 0) + { + throw new ArgumentNullException("Указана некорректная квалификация", nameof(model.Qualification)); + } + + // Проверка на наличие квалификации + if (model.WorkExperience < 0) + { + throw new ArgumentNullException("Указан некорректный стаж работы", nameof(model.WorkExperience)); + } + + _logger.LogInformation("Implementer. ImplementerFIO:{ImplementerFIO}. Password:{Password}. " + + "Qualification:{Qualification}. WorkExperience:{ WorkExperience}. Id:{Id}", + model.ImplementerFIO, model.Password, model.Qualification, model.WorkExperience, model.Id); + + // Для проверка на наличие такого же аккаунта + var element = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = model.ImplementerFIO, + }); + + // Если элемент найден и его Id не совпадает с Id переданного объекта + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Исполнитель с таким именем уже есть"); + } + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/OrderLogic.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/OrderLogic.cs index aeee864..f597b39 100644 --- a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/OrderLogic.cs +++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/OrderLogic.cs @@ -20,6 +20,8 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic private readonly IOrderStorage _orderStorage; + static readonly object locker = new object(); + // Конструктор public OrderLogic(ILogger logger, IOrderStorage orderStorage) { @@ -35,7 +37,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic // list хранит весь список в случае, если model пришло со значением null на вход метода var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model); - if(list == null) + if (list == null) { _logger.LogWarning("ReadList return null list"); @@ -47,8 +49,32 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic return list; } - // Создание чека - public bool CreateOrder(OrderBindingModel model) + // Вывод конкретного чека + public OrderViewModel? ReadElement(OrderSearchModel model) + { + 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; + } + + // Создание чека + public bool CreateOrder(OrderBindingModel model) { CheckModel(model); @@ -72,7 +98,10 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic public bool TakeOrderInWork(OrderBindingModel model) { - return StatusUpdate(model, OrderStatus.Выполняется); + lock (locker) + { + return StatusUpdate(model, OrderStatus.Выполняется); + } } public bool FinishOrder(OrderBindingModel model) @@ -152,8 +181,14 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic model.Status = newOrderStatus; - // Проверка на выдачу - if(model.Status == OrderStatus.Выдан) + // Помещаем id работника, не забываем про него... + if (viewModel.ImplementerId.HasValue) + { + model.ImplementerId = viewModel.ImplementerId; + } + + // Проверка на выдачу + if (model.Status == OrderStatus.Выдан) { model.DateImplement = DateTime.Now; } diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/WorkModeling.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/WorkModeling.cs new file mode 100644 index 0000000..3d984ed --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/WorkModeling.cs @@ -0,0 +1,162 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDataModels.Enums; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyBusinessLogic.BussinessLogic +{ + 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) + { + _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.Принят + }); + + 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) + { + Task.Run(() => WorkerWorkAsync(implementer, 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); + + _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = order.Id, + ImplementerId = implementer.Id + }); + + Thread.Sleep(implementer.WorkExperience * order.Count); + + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id); + + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = order.Id + }); + + Thread.Sleep(implementer.Qualification); + } + + // Игнорируем ошибку, если с заказом что-то случится + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + // В случае ошибки прервём выполнение имитации работы + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + }); + } + + // Ищем заказ, который уже во всю в работе (вдруг прервали исполнителя) + 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.Выполняется + })); + + if (runOrder == null) + { + return; + } + + _logger.LogDebug("DoWork {Id} back to order {Order}", implementer.Id, runOrder.Id); + + // Доделываем работу + Thread.Sleep(implementer.WorkExperience * 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); + } + + // Заказа может не быть, просто игнорируем ошибку + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + // Просто возникнет тупая ошибка, тогда заканчиваем выполнение имитации + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ImplementerBindingModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..fe05b28 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,23 @@ +using FurnitureAssemblyDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.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; } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/OrderBindingModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/OrderBindingModel.cs index d1e91f8..3ee7485 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/OrderBindingModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/OrderBindingModel.cs @@ -13,7 +13,9 @@ namespace FurnitureAssemblyContracts.BindingModels public int Id { get; set; } public int ClientId { get; set; } - + + public int? ImplementerId { get; set; } + public int FurnitureId { get; set; } public int Count { get; set; } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IImplementerLogic.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..48e5858 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,25 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.BusinessLogicsContracts +{ + // Бизнес-логика для исполнителей + public interface IImplementerLogic + { + List? ReadList(ImplementerSearchModel? model); + + ImplementerViewModel? ReadElement(ImplementerSearchModel model); + + bool Create(ImplementerBindingModel model); + + bool Update(ImplementerBindingModel model); + + bool Delete(ImplementerBindingModel model); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IOrderLogic.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IOrderLogic.cs index af2d139..1aa34f8 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -14,6 +14,8 @@ namespace FurnitureAssemblyContracts.BusinessLogicsContracts { List? ReadList(OrderSearchModel? model); + OrderViewModel? ReadElement(OrderSearchModel model); + bool CreateOrder(OrderBindingModel model); bool TakeOrderInWork(OrderBindingModel model); diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IWorkProcess.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..6c654db --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.BusinessLogicsContracts +{ + // Интерфейс для класса, имитирующего работу + public interface IWorkProcess + { + // Запуск работы + void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ClientSearchModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ClientSearchModel.cs index aedf7a5..18443ee 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ClientSearchModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ClientSearchModel.cs @@ -10,8 +10,6 @@ namespace FurnitureAssemblyContracts.SearchModels public class ClientSearchModel { public int? Id { get; set; } - public string? ClientFIO { get; set; } - public string? Email { get; set; } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ImplementerSearchModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..4821d93 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.SearchModels +{ + // Модель для поиска исполнителя + public class ImplementerSearchModel + { + public int? Id { get; set; } + + public string? ImplementerFIO { get; set; } + + public string? Password { get; set; } + + public int? WorkExperience { get; set; } + + public int? Qualification { get; set; } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs index ed7b8af..74973e7 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs @@ -1,4 +1,5 @@ -using System; +using FurnitureAssemblyDataModels.Enums; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,9 +16,15 @@ namespace FurnitureAssemblyContracts.SearchModels // для поиска по клиенту public int? ClientId { get; set; } + // Для поиска по исполнителю + public int? ImplementerId { get; set; } + // Два поля для возможности производить выборку public DateTime? DateFrom { get; set; } - public DateTime? DateTo { get; set;} + public DateTime? DateTo { get; set; } + + // Для статуса заказа + public OrderStatus? Status { get; set; } } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IImplementerStorage.cs b/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..f37fd81 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,27 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.StoragesContracts +{ + // Класс для хранилища исполнителей + public interface IImplementerStorage + { + List GetFullList(); + + List GetFilteredList(ImplementerSearchModel model); + + ImplementerViewModel? GetElement(ImplementerSearchModel model); + + ImplementerViewModel? Insert(ImplementerBindingModel model); + + ImplementerViewModel? Update(ImplementerBindingModel model); + + ImplementerViewModel? Delete(ImplementerBindingModel model); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..eb81af6 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,28 @@ +using FurnitureAssemblyDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyContracts.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; } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs index 418eee7..637df08 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs @@ -20,6 +20,11 @@ namespace FurnitureAssemblyContracts.ViewModels [DisplayName("ФИО клиента")] public string ClientFIO { get; set; } = string.Empty; + public int? ImplementerId { get; set; } + + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; } = string.Empty; + public int FurnitureId { get; set; } [DisplayName("Изделие")] diff --git a/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IImplementerModel.cs b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..75d8518 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IImplementerModel.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyDataModels.Models +{ + // Интерфейс, отвечающий за исполнителя + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + + string Password { get; } + + int WorkExperience { get; } + + int Qualification { get; } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IOrderModel.cs b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IOrderModel.cs index 0616975..307e337 100644 --- a/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IOrderModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IOrderModel.cs @@ -13,6 +13,12 @@ namespace FurnitureAssemblyDataModels.Models // id продукта int FurnitureId { get; } + // id клиента + int ClientId { get; } + + // id исполнителя + int? ImplementerId { get; } + // кол-во продуктов int Count { get; } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs index fc7ef0b..a823129 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs @@ -29,5 +29,7 @@ namespace FurnitureAssemblyDatabaseImplement public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } + public virtual DbSet Implementers { set; get; } + } } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ClientStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ClientStorage.cs index 311da05..1f88d52 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ClientStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ClientStorage.cs @@ -16,23 +16,23 @@ namespace FurnitureAssemblyDatabaseImplement.Implements { public ClientViewModel? GetElement(ClientSearchModel model) { - if (string.IsNullOrEmpty(model.Email) && !model.Id.HasValue) - { - return null; + if (string.IsNullOrEmpty(model.Email) && !model.Id.HasValue) + { + return null; } using var context = new FurnitureAssemblyDatabase(); - return context.Clients.FirstOrDefault(x => - (!(string.IsNullOrEmpty(model.Email)) && model.Email == x.Email) + return context.Clients.FirstOrDefault(x => + (!(string.IsNullOrEmpty(model.Email)) && model.Email == x.Email) || (model.Id.HasValue && model.Id == x.Id))?.GetViewModel; } public List GetFilteredList(ClientSearchModel model) { - if (string.IsNullOrEmpty(model.Email)) - { - return new(); + if (string.IsNullOrEmpty(model.Email)) + { + return new(); } using var context = new FurnitureAssemblyDatabase(); @@ -81,7 +81,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements public ClientViewModel? Delete(ClientBindingModel model) { using var context = new FurnitureAssemblyDatabase(); - + var client = context.Clients.FirstOrDefault(x => x.Id == model.Id); if (client == null) { diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/FurnitureStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/FurnitureStorage.cs index 6b6ab7d..4516b25 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/FurnitureStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/FurnitureStorage.cs @@ -47,7 +47,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements public FurnitureViewModel? GetElement(FurnitureSearchModel model) { - if (string.IsNullOrEmpty(model.FurnitureName) && !model.Id.HasValue) + if(string.IsNullOrEmpty(model.FurnitureName) && !model.Id.HasValue) { return null; } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ImplementerStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..5ba5b06 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,107 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + using var context = new FurnitureAssemblyDatabase(); + + if (model.Id.HasValue) + return context.Implementers.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + + if (model.ImplementerFIO != null && model.Password != null) + return context.Implementers.FirstOrDefault(x => x.ImplementerFIO + .Equals(model.ImplementerFIO) && x.Password.Equals(model.Password))?.GetViewModel; + + if (model.ImplementerFIO != null) + return context.Implementers.FirstOrDefault(x => x.ImplementerFIO + .Equals(model.ImplementerFIO))?.GetViewModel; + + return null; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (model == null) + { + return new(); + } + + if (model.ImplementerFIO != null) + { + using var context = new FurnitureAssemblyDatabase(); + + return context.Implementers + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + + return new(); + } + + public List GetFullList() + { + using var context = new FurnitureAssemblyDatabase(); + + return context.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + using var context = new FurnitureAssemblyDatabase(); + + var res = Implementer.Create(model); + + if (res != null) + { + context.Implementers.Add(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var context = new FurnitureAssemblyDatabase(); + + var res = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + res.Update(model); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var context = new FurnitureAssemblyDatabase(); + + var res = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + context.Implementers.Remove(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs index cca3470..f18466a 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs @@ -23,34 +23,37 @@ namespace FurnitureAssemblyDatabaseImplement.Implements using var context = new FurnitureAssemblyDatabase(); - return context.Orders.Include(x => x.Furniture).Include(x => x.Client). - FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) - ?.GetViewModel; - } + return context.Orders.Include(x => x.Furniture) + .Include(x => x.Client).Include(x => x.Implementer) + .FirstOrDefault(x => (model.Status == null || model.Status != null && model.Status.Equals(x.Status)) && + (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId) || + (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } public List GetFilteredList(OrderSearchModel model) { using var context = new FurnitureAssemblyDatabase(); - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue) + if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue && model.Status == null) { return new(); } return context.Orders - .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo || x.ClientId == model.ClientId) - .Include(x => x.Furniture) - .Include(x => x.Client) - .Select(x => x.GetViewModel) - .ToList(); + .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo || + x.ClientId == model.ClientId || model.Status.Equals(x.Status)) + .Include(x => x.Furniture).Include(x => x.Client) + .Include(x => x.Implementer).Select(x => x.GetViewModel) + .ToList(); - } + } public List GetFullList() { using var context = new FurnitureAssemblyDatabase(); return context.Orders.Include(x => x.Furniture).Include(x => x.Client) + .Include(x => x.Implementer) .Select(x => x.GetViewModel).ToList(); } @@ -64,11 +67,12 @@ namespace FurnitureAssemblyDatabaseImplement.Implements } using var context = new FurnitureAssemblyDatabase(); + context.Orders.Add(newOrder); context.SaveChanges(); return context.Orders.Include(x => x.Furniture).Include(x => x.Client) - .FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; + .Include(x => x.Implementer).FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; } public OrderViewModel? Update(OrderBindingModel model) @@ -77,7 +81,8 @@ namespace FurnitureAssemblyDatabaseImplement.Implements var order = context.Orders .Include(x => x.Furniture) .Include(x => x.Client) - .FirstOrDefault(x => x.Id == model.Id); + .Include(x => x.Implementer) + .FirstOrDefault(x => x.Id == model.Id); if (order == null) { @@ -90,6 +95,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements return context.Orders .Include(x => x.Furniture) .Include(x => x.Client) + .Include(x => x.Implementer) .FirstOrDefault(x => x.Id == model.Id) ?.GetViewModel; } @@ -101,8 +107,9 @@ namespace FurnitureAssemblyDatabaseImplement.Implements if (element != null) { - var deletedElement = context.Orders.Include(x => x.Furniture) - .Include(x => x.Client).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + // для более корректного отображения модели + var deletedElement = context.Orders.Include(x => x.Furniture).Include(x => x.Client) + .Include(x => x.Implementer).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; context.Orders.Remove(element); context.SaveChanges(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/WorkPieceStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/WorkPieceStorage.cs index d0faa55..4b7f266 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/WorkPieceStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/WorkPieceStorage.cs @@ -39,7 +39,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements public WorkPieceViewModel? GetElement(WorkPieceSearchModel model) { - if (string.IsNullOrEmpty(model.WorkPieceName) && !model.Id.HasValue) + if(string.IsNullOrEmpty(model.WorkPieceName) && !model.Id.HasValue) { return null; } @@ -55,7 +55,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements { var newWorkPiece = WorkPiece.Create(model); - if (newWorkPiece == null) + if(newWorkPiece == null) { return null; } @@ -88,7 +88,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements using var context = new FurnitureAssemblyDatabase(); var element = context.WorkPieces.FirstOrDefault(rec => rec.Id == model.Id); - if (element != null) + if(element != null) { context.WorkPieces.Remove(element); context.SaveChanges(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.Designer.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.Designer.cs new file mode 100644 index 0000000..d3cc852 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.Designer.cs @@ -0,0 +1,257 @@ +// +using System; +using FurnitureAssemblyDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace FurnitureAssemblyDatabaseImplement.Migrations +{ + [DbContext(typeof(FurnitureAssemblyDatabase))] + [Migration("20240621104629_lab6")] + partial class lab6 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.17") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Furniture", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FurnitureName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Furnitures"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.FurnitureWorkPiece", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("FurnitureId") + .HasColumnType("int"); + + b.Property("WorkPieceId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("FurnitureId"); + + b.HasIndex("WorkPieceId"); + + b.ToTable("FurnitureWorkPieces"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("FurnitureId") + .HasColumnType("int"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("FurnitureId"); + + b.HasIndex("ImplementerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Cost") + .HasColumnType("float"); + + b.Property("WorkPieceName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("WorkPieces"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.FurnitureWorkPiece", b => + { + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Furniture", "Furniture") + .WithMany("WorkPieces") + .HasForeignKey("FurnitureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", "WorkPiece") + .WithMany("FurnitureWorkPieces") + .HasForeignKey("WorkPieceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Furniture"); + + b.Navigation("WorkPiece"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Order", b => + { + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Furniture", "Furniture") + .WithMany("Orders") + .HasForeignKey("FurnitureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Order") + .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("Furniture"); + + b.Navigation("Implementer"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Furniture", b => + { + b.Navigation("Orders"); + + b.Navigation("WorkPieces"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Order"); + }); + + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => + { + b.Navigation("FurnitureWorkPieces"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.cs new file mode 100644 index 0000000..994045f --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/20240621104629_lab6.cs @@ -0,0 +1,67 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace FurnitureAssemblyDatabaseImplement.Migrations +{ + /// + public partial class lab6 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ImplementerId", + table: "Orders", + type: "int", + nullable: true); + + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ImplementerFIO = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false), + WorkExperience = table.Column(type: "int", nullable: false), + Qualification = table.Column(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"); + } + + /// + 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"); + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/FurnitureAssemblyDatabaseModelSnapshot.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/FurnitureAssemblyDatabaseModelSnapshot.cs index a09a783..32bede1 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/FurnitureAssemblyDatabaseModelSnapshot.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Migrations/FurnitureAssemblyDatabaseModelSnapshot.cs @@ -93,6 +93,33 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations b.ToTable("FurnitureWorkPieces"); }); + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -116,6 +143,9 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations b.Property("FurnitureId") .HasColumnType("int"); + b.Property("ImplementerId") + .HasColumnType("int"); + b.Property("Status") .HasColumnType("int"); @@ -128,6 +158,8 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations b.HasIndex("FurnitureId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -184,9 +216,15 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Order") + .HasForeignKey("ImplementerId"); + b.Navigation("Client"); b.Navigation("Furniture"); + + b.Navigation("Implementer"); }); modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b => @@ -201,6 +239,11 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations b.Navigation("WorkPieces"); }); + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Order"); + }); + modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => { b.Navigation("FurnitureWorkPieces"); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs index f7b7164..b2f1f02 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs @@ -24,12 +24,13 @@ namespace FurnitureAssemblyDatabaseImplement.Models public Dictionary? _furnitureWorkPieces = null; + // Это поле не будет "мапиться" в бд [NotMapped] public Dictionary FurnitureWorkPieces { get { - if (_furnitureWorkPieces == null) + if(_furnitureWorkPieces == null) { _furnitureWorkPieces = WorkPieces .ToDictionary(recPC => recPC.WorkPieceId, recPC => (recPC.WorkPiece as IWorkPieceModel, recPC.Count)); @@ -39,6 +40,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models } } + // Для реализации связи многие ко многим с заготовками [ForeignKey("FurnitureId")] public virtual List WorkPieces { get; set; } = new(); @@ -81,7 +83,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models { var furnitureWorkPieces = context.FurnitureWorkPieces.Where(rec => rec.FurnitureId == model.Id).ToList(); - if (furnitureWorkPieces != null && furnitureWorkPieces.Count > 0) + if(furnitureWorkPieces != null && furnitureWorkPieces.Count > 0) { // удалили те, которых нет в модели context.FurnitureWorkPieces.RemoveRange(furnitureWorkPieces.Where(rec => !model.FurnitureWorkPieces.ContainsKey(rec.FurnitureId))); @@ -99,7 +101,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models var furniture = context.Furnitures.First(x => x.Id == Id); - foreach (var pc in model.FurnitureWorkPieces) + foreach(var pc in model.FurnitureWorkPieces) { context.FurnitureWorkPieces.Add(new FurnitureWorkPiece { diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..fc93d8b --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,86 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDataModels.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 FurnitureAssemblyDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; 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 { get; set; } = new(); + + public static Implementer? Create(ImplementerBindingModel model) + { + if (model == null) + { + return null; + } + + return new Implementer() + { + Id = model.Id, + Password = model.Password, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience + }; + } + + public static Implementer Create(ImplementerViewModel model) + { + return new Implementer + { + Id = model.Id, + Password = model.Password, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience + }; + } + + public void Update(ImplementerBindingModel model) + { + if (model == null) + { + return; + } + + Id = model.Id; + Password = model.Password; + ImplementerFIO = model.ImplementerFIO; + Qualification = model.Qualification; + WorkExperience = model.WorkExperience; + } + + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + Password = Password, + ImplementerFIO = ImplementerFIO, + Qualification = Qualification, + WorkExperience = WorkExperience + }; + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs index af813a4..b47e03f 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs @@ -5,7 +5,6 @@ using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -19,6 +18,10 @@ namespace FurnitureAssemblyDatabaseImplement.Models [Required] public int FurnitureId { get; private set; } + [Required] + public int ClientId { get; private set; } + + public int? ImplementerId { get; private set; } [Required] public int Count { get; private set; } @@ -34,13 +37,14 @@ namespace FurnitureAssemblyDatabaseImplement.Models public DateTime? DateImplement { get; private set; } - [Required] - public int ClientId { get; private set; } // Для передачи названия изделия - public virtual Furniture Furniture { get; set; } = new(); + public virtual Furniture Furniture { get; set; } // Для передачи имени клиента - public virtual Client Client { get; set; } = new(); + public virtual Client Client { get; set; } + + // Для передачи имени исполнителя + public virtual Implementer? Implementer { get; set; } public static Order? Create(OrderBindingModel model) { @@ -54,6 +58,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models Id = model.Id, FurnitureId = model.FurnitureId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -69,6 +74,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models return; } + ImplementerId = model.ImplementerId; Status = model.Status; DateImplement = model.DateImplement; } @@ -78,13 +84,15 @@ namespace FurnitureAssemblyDatabaseImplement.Models Id = Id, FurnitureId = FurnitureId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, DateCreate = DateCreate, DateImplement = DateImplement, FurnitureName = Furniture.FurnitureName, - ClientFIO = Client.ClientFIO + ClientFIO = Client.ClientFIO, + ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty }; } } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/WorkPiece.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/WorkPiece.cs index 8dcce39..7bf4529 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/WorkPiece.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/WorkPiece.cs @@ -21,12 +21,13 @@ namespace FurnitureAssemblyDatabaseImplement.Models [Required] public double Cost { get; set; } + // для реализации связи многие ко многим с изделиями [ForeignKey("WorkPieceId")] public virtual List FurnitureWorkPieces { get; set; } = new(); public static WorkPiece? Create(WorkPieceBindingModel model) { - if (model == null) + if(model == null) { return null; } @@ -51,7 +52,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models public void Update(WorkPieceBindingModel model) { - if (model == null) + if(model == null) { return; } diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/DataFileSingleton.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/DataFileSingleton.cs index 5eac740..f24c7b5 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/DataFileSingleton.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/DataFileSingleton.cs @@ -20,6 +20,8 @@ namespace FurnitureAssemblyFileImplement private readonly string ClientFileName = "Client.xml"; + private readonly string ImplementerFileName = "Implementer.xml"; + public List WorkPieces { get; private set; } public List Orders { get; private set; } @@ -28,6 +30,8 @@ namespace FurnitureAssemblyFileImplement public List Clients { get; private set; } + public List Implementers { get; private set; } + public static DataFileSingleton GetInstance() { if (instance == null) @@ -46,6 +50,8 @@ namespace FurnitureAssemblyFileImplement public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); + public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); + private DataFileSingleton() { @@ -53,6 +59,7 @@ namespace FurnitureAssemblyFileImplement Furnitures = LoadData(FurnitureFileName, "Furniture", x => Furniture.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; + Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) @@ -67,7 +74,7 @@ namespace FurnitureAssemblyFileImplement private static void SaveData(List data, string filename, string xmlNodeName, Func selectFunction) { - if(data != null) + if (data != null) { new XDocument(new XElement(xmlNodeName, data.Select(selectFunction).ToArray())).Save(filename); } diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/ImplementerStorage.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..6fe21ff --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,112 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyFileImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyFileImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataFileSingleton source; + + public ImplementerStorage() + { + source = DataFileSingleton.GetInstance(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (model.Id.HasValue) + return source.Implementers + .FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + + if (model.ImplementerFIO != null && model.Password != null) + return source.Implementers.FirstOrDefault(x => x.ImplementerFIO + .Equals(model.ImplementerFIO) && x.Password.Equals(model.Password))?.GetViewModel; + + if (model.ImplementerFIO != null) + return source.Implementers + .FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO))?.GetViewModel; + + return null; + } + + + public List GetFullList() + { + return source.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (model == null) + { + return new(); + } + + if (model.ImplementerFIO != null) + { + return source.Implementers + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + + return new(); + } + + 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 implementer = source.Implementers.FirstOrDefault(x => x.Id == model.Id); + + if (implementer == null) + { + return null; + } + + implementer.Update(model); + source.SaveImplementers(); + + return implementer.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; + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs index 48f7198..5ecc2f4 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs @@ -28,20 +28,24 @@ namespace FurnitureAssemblyFileImplement.Implements return null; } - return source.Orders - .FirstOrDefault(x => - (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + if (model.ImplementerId.HasValue && model.Status != null) + return source.Orders.FirstOrDefault(x => x.ImplementerId == model.ImplementerId && model.Status + .Equals(x.Status))?.GetViewModel; + + return source.Orders + .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; } public List GetFilteredList(OrderSearchModel model) { - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue) + if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue && model.Status == null) { return new(); } - + return source.Orders - .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo || x.ClientId == model.ClientId) + .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo + || x.ClientId == model.ClientId || model.Status.Equals(x.Status)) .Select(x => GetViewModel(x)).ToList(); } @@ -50,7 +54,7 @@ namespace FurnitureAssemblyFileImplement.Implements return source.Orders.Select(x => GetViewModel(x)).ToList(); } - // Для загрузки названий изделия в заказе + // Для загрузки названий изделия и исполнителя в заказе private OrderViewModel GetViewModel(Order order) { var viewModel = order.GetViewModel; @@ -59,7 +63,9 @@ namespace FurnitureAssemblyFileImplement.Implements var client = source.Clients.FirstOrDefault(x => x.Id == order.ClientId); - if (furniture != null) + var implementer = source.Implementers.FirstOrDefault(x => x.Id == order.ImplementerId); + + if (furniture != null) { viewModel.FurnitureName = furniture.FurnitureName; } @@ -69,7 +75,12 @@ namespace FurnitureAssemblyFileImplement.Implements viewModel.ClientFIO = client.ClientFIO; } - return viewModel; + if (implementer != null) + { + viewModel.ImplementerFIO = implementer.ImplementerFIO; + } + + return viewModel; } public OrderViewModel? Insert(OrderBindingModel model) diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs new file mode 100644 index 0000000..2d1f696 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs @@ -0,0 +1,89 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace FurnitureAssemblyFileImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + + public string ImplementerFIO { get; private set; } = string.Empty; + + public string Password { get; private set; } = string.Empty; + + public int WorkExperience { get; private set; } + + public int Qualification { get; private set; } + + public static Implementer? Create(ImplementerBindingModel model) + { + if (model == null) + { + return null; + } + + return new Implementer() + { + Id = model.Id, + Password = model.Password, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience + }; + } + + public static Implementer? Create(XElement element) + { + if (element == null) + { + return null; + } + + return new Implementer() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + Password = element.Element("Password")!.Value, + ImplementerFIO = element.Element("ImplementerFIO")!.Value, + Qualification = Convert.ToInt32(element.Element("Qualification")!.Value), + WorkExperience = Convert.ToInt32(element.Element("WorkExperience")!.Value) + }; + } + + public void Update(ImplementerBindingModel model) + { + if (model == null) + { + return; + } + + Id = model.Id; + Password = model.Password; + ImplementerFIO = model.ImplementerFIO; + Qualification = model.Qualification; + WorkExperience = model.WorkExperience; + } + + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + Password = Password, + ImplementerFIO = ImplementerFIO, + Qualification = Qualification, + WorkExperience = WorkExperience + }; + + public XElement GetXElement => new("Order", + new XAttribute("Id", Id), + new XElement("Password", Password), + new XElement("ImplementerFIO", ImplementerFIO), + new XElement("Qualification", Qualification), + new XElement("WorkExperience", WorkExperience)); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs index eb9b6c9..4384655 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs @@ -20,7 +20,9 @@ namespace FurnitureAssemblyFileImplement.Models 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; } @@ -42,6 +44,7 @@ namespace FurnitureAssemblyFileImplement.Models Id = model.Id, FurnitureId = model.FurnitureId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -62,6 +65,7 @@ namespace FurnitureAssemblyFileImplement.Models Id = Convert.ToInt32(element.Attribute("Id")!.Value), FurnitureId = Convert.ToInt32(element.Element("FurnitureId")!.Value), ClientId = Convert.ToInt32(element.Attribute("Id")!.Value), + ImplementerId = Convert.ToInt32(element.Attribute("ImplementerId")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), @@ -87,6 +91,7 @@ namespace FurnitureAssemblyFileImplement.Models Id = Id, FurnitureId = FurnitureId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, @@ -98,6 +103,7 @@ namespace FurnitureAssemblyFileImplement.Models new XAttribute("Id", Id), new XElement("FurnitureId", FurnitureId.ToString()), new XElement("ClientId", ClientId.ToString()), + new XElement("ImplementerId", ImplementerId.ToString()), new XElement("Count", Count.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/DataListSingleton.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/DataListSingleton.cs index be68b1e..5964c4b 100644 --- a/FurnitureAssembly/FurnitureAssemblyListImplement/DataListSingleton.cs +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/DataListSingleton.cs @@ -24,17 +24,21 @@ namespace FurnitureAssemblyListImplement // Список для хранения клиентов public List Clients { get; set; } + // Список для хранения исполнителей + public List Implementers { get; set; } + public DataListSingleton() { WorkPiece = new List(); Furnitures = new List(); Orders = new List(); Clients = new List(); + Implementers = new List(); } public static DataListSingleton GetInstance() { - if(_instance == null) + if (_instance == null) { _instance = new DataListSingleton(); } diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/ImplementerStorage.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..a6e3d64 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,130 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyListImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + // Поле для работы со списком исполнителей + private readonly DataListSingleton _source; + + public ImplementerStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var result = new List(); + + foreach (var implementer in _source.Implementers) + { + result.Add(implementer.GetViewModel); + } + + return result; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + var result = new List(); + + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + return result; + } + + foreach (var implementer in _source.Implementers) + { + if (implementer.ImplementerFIO.Contains(model.ImplementerFIO)) + { + result.Add(implementer.GetViewModel); + } + } + + return result; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return null; + } + + foreach (var implementer in _source.Implementers) + { + if ((!string.IsNullOrEmpty(model.ImplementerFIO) && implementer.ImplementerFIO == model.ImplementerFIO) || + (model.Id.HasValue && implementer.Id == model.Id)) + { + return implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + model.Id = 1; + + foreach (var implementer in _source.Implementers) + { + if (model.Id <= implementer.Id) + { + model.Id = implementer.Id + 1; + } + } + + var newImplementer = Implementer.Create(model); + + if (newImplementer == null) + { + return null; + } + + _source.Implementers.Add(newImplementer); + + return newImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + foreach (var implementer in _source.Implementers) + { + if (implementer.Id == model.Id) + { + implementer.Update(model); + + return implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + for (int i = 0; i < _source.Implementers.Count; ++i) + { + if (_source.Implementers[i].Id == model.Id) + { + var element = _source.Implementers[i]; + _source.Implementers.RemoveAt(i); + + return element.GetViewModel; + } + } + + return null; + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs index af581b7..3c579ae 100644 --- a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs @@ -90,7 +90,7 @@ namespace FurnitureAssemblyListImplement.Implements return null; } - // Метод для записи названия изделия на форме с заказами + // Метод для записи названия изделия на форме с заказами и исполнителя private OrderViewModel GetViewModel(Order order) { var viewModel = order.GetViewModel; @@ -114,7 +114,17 @@ namespace FurnitureAssemblyListImplement.Implements } } - return viewModel; + foreach (var implementer in _source.Implementers) + { + if (implementer.Id == order.ImplementerId) + { + viewModel.ImplementerFIO = implementer.ImplementerFIO; + + break; + } + } + + return viewModel; } // При создании заказа определяем для него новый id: ищем max id и прибавляем к нему 1 diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Implementer.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Implementer.cs new file mode 100644 index 0000000..7afd835 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Implementer.cs @@ -0,0 +1,66 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssemblyListImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + + public string ImplementerFIO { get; private set; } = string.Empty; + + public string Password { get; private set; } = string.Empty; + + public int WorkExperience { get; private set; } + + public int Qualification { get; private set; } + + // Метод для создания объекта от класса-компонента на основе класса-BindingModel + public static Implementer? Create(ImplementerBindingModel? model) + { + if (model == null) + { + return null; + } + + return new Implementer() + { + Id = model.Id, + Password = model.Password, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience + }; + } + + // Метод изменения существующего объекта + public void Update(ImplementerBindingModel? model) + { + if (model == null) + { + return; + } + + Password = model.Password; + ImplementerFIO = model.ImplementerFIO; + Qualification = model.Qualification; + WorkExperience = model.WorkExperience; + } + + // Метод для создания объекта класса ViewModel на основе данных объекта класса-компонента + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + Password = Password, + ImplementerFIO = ImplementerFIO, + Qualification = Qualification, + WorkExperience = WorkExperience + }; + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Order.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Order.cs index 2a0c8a6..4be1f57 100644 --- a/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Order.cs +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/Order.cs @@ -21,6 +21,8 @@ namespace FurnitureAssemblyListImplement.Models public int FurnitureId { get; private set; } + public int? ImplementerId { get; private set; } + public int Count { get; private set; } public double Sum { get; private set; } @@ -33,7 +35,7 @@ namespace FurnitureAssemblyListImplement.Models public static Order? Create(OrderBindingModel? model) { - if(model == null) + if (model == null) { return null; } @@ -43,6 +45,7 @@ namespace FurnitureAssemblyListImplement.Models Id = model.Id, FurnitureId = model.FurnitureId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -54,10 +57,11 @@ namespace FurnitureAssemblyListImplement.Models // Метод изменения существующего объекта public void Update(OrderBindingModel? model) { - if(model == null) + if (model == null) { return; } + Status = model.Status; DateImplement = model.DateImplement; } @@ -68,6 +72,7 @@ namespace FurnitureAssemblyListImplement.Models Id = Id, FurnitureId = FurnitureId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, diff --git a/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ClientController.cs b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ClientController.cs index a3a1938..2b89a71 100644 --- a/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ClientController.cs +++ b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ClientController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc; namespace FurnitureAssemblyRestApi.Controllers { + // Указание для контроллера, что Route будет строиться по названиям контроллера и метода (так как у нас два Post-метода) [Route("api/[controller]/[action]")] [ApiController] public class ClientController : Controller @@ -25,6 +26,7 @@ namespace FurnitureAssemblyRestApi.Controllers { try { + // Поиск записи по переданным логину и паролю return _logic.ReadElement(new ClientSearchModel { Email = login, @@ -43,6 +45,7 @@ namespace FurnitureAssemblyRestApi.Controllers { try { + // Создание клиента _logic.Create(model); } catch (Exception ex) @@ -57,6 +60,7 @@ namespace FurnitureAssemblyRestApi.Controllers { try { + // Изменение клиента _logic.Update(model); } catch (Exception ex) diff --git a/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ImplementerController.cs b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..4e2db8a --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,112 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.SearchModels; +using FurnitureAssemblyContracts.ViewModels; +using FurnitureAssemblyDataModels.Enums; +using Microsoft.AspNetCore.Mvc; + +namespace FurnitureAssemblyRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class ImplementerController : Controller + { + private readonly ILogger _logger; + + private readonly IOrderLogic _order; + + private readonly IImplementerLogic _logic; + + public ImplementerController(IOrderLogic order, IImplementerLogic logic, ILogger logger) + { + _logger = logger; + _order = order; + _logic = logic; + } + + [HttpGet] + public ImplementerViewModel? Login(string login, string password) + { + try + { + return _logic.ReadElement(new ImplementerSearchModel + { + ImplementerFIO = login, + Password = password + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка авторизации сотрудника"); + + throw; + } + } + + [HttpGet] + public List? GetNewOrders() + { + try + { + return _order.ReadList(new OrderSearchModel + { + Status = OrderStatus.Принят + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения новых заказов"); + + throw; + } + } + + [HttpGet] + public OrderViewModel? GetImplementerOrder(int implementerId) + { + try + { + return _order.ReadElement(new OrderSearchModel + { + ImplementerId = implementerId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения текущего заказа исполнителя"); + + throw; + } + } + + [HttpPost] + public void TakeOrderInWork(OrderBindingModel model) + { + try + { + _order.TakeOrderInWork(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу", model.Id); + + throw; + } + } + + [HttpPost] + public void FinishOrder(OrderBindingModel model) + { + try + { + _order.FinishOrder(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа с №{ Id}", model.Id); + + throw; + } + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/MainController.cs b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/MainController.cs index f0e4453..703051d 100644 --- a/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/MainController.cs +++ b/FurnitureAssembly/FurnitureAssemblyRestApi/Controllers/MainController.cs @@ -6,6 +6,9 @@ using Microsoft.AspNetCore.Mvc; namespace FurnitureAssemblyRestApi.Controllers { + // Контроллер с логикой по заказам и изделиям + + // Настройка контроллер для использования нескольких Post и Get запросов [Route("api/[controller]/[action]")] [ApiController] public class MainController : Controller diff --git a/FurnitureAssembly/FurnitureAssemblyRestApi/Program.cs b/FurnitureAssembly/FurnitureAssemblyRestApi/Program.cs index eb2af12..56fced8 100644 --- a/FurnitureAssembly/FurnitureAssemblyRestApi/Program.cs +++ b/FurnitureAssembly/FurnitureAssemblyRestApi/Program.cs @@ -16,16 +16,19 @@ builder.Logging.AddLog4Net("log4net.config"); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); +// app.UseSwaggerUI builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "FurnitureAssemblyRestApi", Version = "v1" }); @@ -38,6 +41,7 @@ if (app.Environment.IsDevelopment()) { app.UseSwagger(); + // Swagger app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "FurnitureAssemblyRestApi v1")); } diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormClients.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormClients.Designer.cs index 2ee87d5..19aef8d 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/FormClients.Designer.cs +++ b/FurnitureAssembly/FurnitureAssemblyView/FormClients.Designer.cs @@ -28,61 +28,55 @@ /// private void InitializeComponent() { - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.buttonDelete = new System.Windows.Forms.Button(); - this.buttonRef = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.SuspendLayout(); - // - // dataGridView - // - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(10, 9); - this.dataGridView.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowHeadersWidth = 51; - this.dataGridView.RowTemplate.Height = 29; - this.dataGridView.Size = new System.Drawing.Size(509, 320); - this.dataGridView.TabIndex = 0; - // - // buttonDelete - // - this.buttonDelete.Location = new System.Drawing.Point(558, 26); - this.buttonDelete.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonDelete.Name = "buttonDelete"; - this.buttonDelete.Size = new System.Drawing.Size(109, 22); - this.buttonDelete.TabIndex = 1; - this.buttonDelete.Text = "Удалить"; - this.buttonDelete.UseVisualStyleBackColor = true; - this.buttonDelete.Click += new System.EventHandler(this.ButtonDelete_Click); - // - // buttonRef - // - this.buttonRef.Location = new System.Drawing.Point(558, 77); - this.buttonRef.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonRef.Name = "buttonRef"; - this.buttonRef.Size = new System.Drawing.Size(109, 22); - this.buttonRef.TabIndex = 2; - this.buttonRef.Text = "Обновить"; - this.buttonRef.UseVisualStyleBackColor = true; - this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click); - // - // FormClients - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(700, 338); - this.Controls.Add(this.buttonRef); - this.Controls.Add(this.buttonDelete); - this.Controls.Add(this.dataGridView); - this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.Name = "FormClients"; - this.Text = "Клиенты"; - this.Load += new System.EventHandler(this.FormClients_Load); - this.Click += new System.EventHandler(this.FormClients_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.ResumeLayout(false); - + dataGridView = new DataGridView(); + buttonDelete = new Button(); + buttonRef = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 12); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(582, 426); + dataGridView.TabIndex = 0; + // + // buttonDelete + // + buttonDelete.Location = new Point(638, 35); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(125, 29); + buttonDelete.TabIndex = 1; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += ButtonDelete_Click; + // + // buttonRef + // + buttonRef.Location = new Point(638, 103); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(125, 29); + buttonRef.TabIndex = 2; + buttonRef.Text = "Обновить"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // FormClients + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(buttonRef); + Controls.Add(buttonDelete); + Controls.Add(dataGridView); + Name = "FormClients"; + Text = "Клиенты"; + Load += FormClients_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); } #endregion diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormCreateOrder.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormCreateOrder.Designer.cs index 024fc55..c09cebb 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/FormCreateOrder.Designer.cs +++ b/FurnitureAssembly/FurnitureAssemblyView/FormCreateOrder.Designer.cs @@ -28,130 +28,126 @@ /// private void InitializeComponent() { - this.labelFurniture = new System.Windows.Forms.Label(); - this.labelCount = new System.Windows.Forms.Label(); - this.labelSum = new System.Windows.Forms.Label(); - this.comboBoxFurniture = new System.Windows.Forms.ComboBox(); - this.textBoxCount = new System.Windows.Forms.TextBox(); - this.textBoxSum = new System.Windows.Forms.TextBox(); - this.buttonSave = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.labelClient = new System.Windows.Forms.Label(); - this.comboBoxClient = new System.Windows.Forms.ComboBox(); - this.SuspendLayout(); + labelFurniture = new Label(); + labelCount = new Label(); + labelSum = new Label(); + comboBoxFurniture = new ComboBox(); + textBoxCount = new TextBox(); + textBoxSum = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + labelClient = new Label(); + comboBoxClient = new ComboBox(); + SuspendLayout(); // // labelFurniture // - this.labelFurniture.AutoSize = true; - this.labelFurniture.Location = new System.Drawing.Point(21, 18); - this.labelFurniture.Name = "labelFurniture"; - this.labelFurniture.Size = new System.Drawing.Size(56, 15); - this.labelFurniture.TabIndex = 0; - this.labelFurniture.Text = "Изделие:"; - // - // labelCount - // - this.labelCount.AutoSize = true; - this.labelCount.Location = new System.Drawing.Point(21, 86); - this.labelCount.Name = "labelCount"; - this.labelCount.Size = new System.Drawing.Size(75, 15); - this.labelCount.TabIndex = 1; - this.labelCount.Text = "Количество:"; - // - // labelSum - // - this.labelSum.AutoSize = true; - this.labelSum.Location = new System.Drawing.Point(21, 118); - this.labelSum.Name = "labelSum"; - this.labelSum.Size = new System.Drawing.Size(48, 15); - this.labelSum.TabIndex = 2; - this.labelSum.Text = "Сумма:"; + labelFurniture.AutoSize = true; + labelFurniture.Location = new Point(24, 24); + labelFurniture.Name = "labelFurniture"; + labelFurniture.Size = new Size(71, 20); + labelFurniture.TabIndex = 0; + labelFurniture.Text = "Изделие:"; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(24, 114); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(93, 20); + labelCount.TabIndex = 1; + labelCount.Text = "Количество:"; + // + // labelSum + // + labelSum.AutoSize = true; + labelSum.Location = new Point(24, 157); + labelSum.Name = "labelSum"; + labelSum.Size = new Size(58, 20); + labelSum.TabIndex = 2; + labelSum.Text = "Сумма:"; // // comboBoxFurniture // - this.comboBoxFurniture.FormattingEnabled = true; - this.comboBoxFurniture.Location = new System.Drawing.Point(145, 16); - this.comboBoxFurniture.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.comboBoxFurniture.Name = "comboBoxFurniture"; - this.comboBoxFurniture.Size = new System.Drawing.Size(244, 23); - this.comboBoxFurniture.TabIndex = 3; - // - // textBoxCount - // - this.textBoxCount.Location = new System.Drawing.Point(145, 83); - this.textBoxCount.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.textBoxCount.Name = "textBoxCount"; - this.textBoxCount.Size = new System.Drawing.Size(244, 23); - this.textBoxCount.TabIndex = 4; - this.textBoxCount.TextChanged += new System.EventHandler(this.TextBoxCount_TextChanged); - // - // textBoxSum - // - this.textBoxSum.Location = new System.Drawing.Point(145, 116); - this.textBoxSum.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.textBoxSum.Name = "textBoxSum"; - this.textBoxSum.Size = new System.Drawing.Size(244, 23); - this.textBoxSum.TabIndex = 5; - // - // buttonSave - // - this.buttonSave.Location = new System.Drawing.Point(201, 149); - this.buttonSave.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(82, 22); - this.buttonSave.TabIndex = 6; - this.buttonSave.Text = "Сохранить"; - this.buttonSave.UseVisualStyleBackColor = true; - // - // buttonCancel - // - this.buttonCancel.Location = new System.Drawing.Point(298, 149); - this.buttonCancel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(82, 22); - this.buttonCancel.TabIndex = 7; - this.buttonCancel.Text = "Отмена"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // labelClient - // - this.labelClient.AutoSize = true; - this.labelClient.Location = new System.Drawing.Point(21, 52); - this.labelClient.Name = "labelClient"; - this.labelClient.Size = new System.Drawing.Size(60, 15); - this.labelClient.TabIndex = 8; - this.labelClient.Text = "Заказчик:"; - // - // comboBoxClient - // - this.comboBoxClient.FormattingEnabled = true; - this.comboBoxClient.Location = new System.Drawing.Point(145, 50); - this.comboBoxClient.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.comboBoxClient.Name = "comboBoxClient"; - this.comboBoxClient.Size = new System.Drawing.Size(244, 23); - this.comboBoxClient.TabIndex = 9; - // - // FormCreateOrder - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(419, 192); - this.Controls.Add(this.comboBoxClient); - this.Controls.Add(this.labelClient); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonSave); - this.Controls.Add(this.textBoxSum); - this.Controls.Add(this.textBoxCount); - this.Controls.Add(this.comboBoxFurniture); - this.Controls.Add(this.labelSum); - this.Controls.Add(this.labelCount); - this.Controls.Add(this.labelFurniture); - this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.Name = "FormCreateOrder"; - this.Text = "Заказ"; - this.ResumeLayout(false); - this.PerformLayout(); - + comboBoxFurniture.FormattingEnabled = true; + comboBoxFurniture.Location = new Point(166, 21); + comboBoxFurniture.Name = "comboBoxFurniture"; + comboBoxFurniture.Size = new Size(278, 28); + comboBoxFurniture.TabIndex = 3; + comboBoxFurniture.SelectedIndexChanged += ComboBoxFurniture_SelectedIndexChanged; + // + // textBoxCount + // + textBoxCount.Location = new Point(166, 111); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(278, 27); + textBoxCount.TabIndex = 4; + textBoxCount.TextChanged += TextBoxCount_TextChanged; + // + // textBoxSum + // + textBoxSum.Location = new Point(166, 154); + textBoxSum.Name = "textBoxSum"; + textBoxSum.Size = new Size(278, 27); + textBoxSum.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(230, 199); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(340, 199); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // labelClient + // + labelClient.AutoSize = true; + labelClient.Location = new Point(24, 69); + labelClient.Name = "labelClient"; + labelClient.Size = new Size(74, 20); + labelClient.TabIndex = 8; + labelClient.Text = "Заказчик:"; + // + // comboBoxClient + // + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(166, 66); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(278, 28); + comboBoxClient.TabIndex = 9; + // + // FormCreateOrder + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(479, 256); + Controls.Add(comboBoxClient); + Controls.Add(labelClient); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxSum); + Controls.Add(textBoxCount); + Controls.Add(comboBoxFurniture); + Controls.Add(labelSum); + Controls.Add(labelCount); + Controls.Add(labelFurniture); + Name = "FormCreateOrder"; + Text = "Заказ"; + Load += FormCreateOrder_Load; + ResumeLayout(false); + PerformLayout(); } #endregion diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.Designer.cs new file mode 100644 index 0000000..1e22db5 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.Designer.cs @@ -0,0 +1,162 @@ +namespace FurnitureAssemblyView +{ + partial class FormImplementer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelFIO = new Label(); + labelPassword = new Label(); + labelWorkExperience = new Label(); + labelQualification = new Label(); + textBoxImplementerFIO = new TextBox(); + textBoxPassword = new TextBox(); + textBoxWorkExperience = new TextBox(); + textBoxQualification = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelFIO + // + labelFIO.AutoSize = true; + labelFIO.Location = new Point(38, 27); + labelFIO.Name = "labelFIO"; + labelFIO.Size = new Size(45, 20); + labelFIO.TabIndex = 0; + labelFIO.Text = "ФИО:"; + // + // labelPassword + // + labelPassword.AutoSize = true; + labelPassword.Location = new Point(38, 79); + labelPassword.Name = "labelPassword"; + labelPassword.Size = new Size(65, 20); + labelPassword.TabIndex = 1; + labelPassword.Text = "Пароль:"; + // + // labelWorkExperience + // + labelWorkExperience.AutoSize = true; + labelWorkExperience.Location = new Point(38, 136); + labelWorkExperience.Name = "labelWorkExperience"; + labelWorkExperience.Size = new Size(102, 20); + labelWorkExperience.TabIndex = 2; + labelWorkExperience.Text = "Стаж работы:"; + // + // labelQualification + // + labelQualification.AutoSize = true; + labelQualification.Location = new Point(319, 136); + labelQualification.Name = "labelQualification"; + labelQualification.Size = new Size(114, 20); + labelQualification.TabIndex = 3; + labelQualification.Text = "Квалификация:"; + // + // textBoxImplementerFIO + // + textBoxImplementerFIO.Location = new Point(160, 24); + textBoxImplementerFIO.Name = "textBoxImplementerFIO"; + textBoxImplementerFIO.Size = new Size(436, 27); + textBoxImplementerFIO.TabIndex = 4; + // + // textBoxPassword + // + textBoxPassword.Location = new Point(160, 76); + textBoxPassword.Name = "textBoxPassword"; + textBoxPassword.Size = new Size(436, 27); + textBoxPassword.TabIndex = 5; + // + // textBoxWorkExperience + // + textBoxWorkExperience.Location = new Point(160, 133); + textBoxWorkExperience.Name = "textBoxWorkExperience"; + textBoxWorkExperience.Size = new Size(126, 27); + textBoxWorkExperience.TabIndex = 6; + // + // textBoxQualification + // + textBoxQualification.Location = new Point(444, 133); + textBoxQualification.Name = "textBoxQualification"; + textBoxQualification.Size = new Size(152, 27); + textBoxQualification.TabIndex = 7; + // + // buttonSave + // + buttonSave.Location = new Point(387, 178); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 8; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(502, 178); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 9; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(662, 224); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxQualification); + Controls.Add(textBoxWorkExperience); + Controls.Add(textBoxPassword); + Controls.Add(textBoxImplementerFIO); + Controls.Add(labelQualification); + Controls.Add(labelWorkExperience); + Controls.Add(labelPassword); + Controls.Add(labelFIO); + Name = "FormImplementer"; + Text = "Исполнитель"; + Load += FormImplementer_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelFIO; + private Label labelPassword; + private Label labelWorkExperience; + private Label labelQualification; + private TextBox textBoxImplementerFIO; + private TextBox textBoxPassword; + private TextBox textBoxWorkExperience; + private TextBox textBoxQualification; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.cs new file mode 100644 index 0000000..2ecffd5 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.cs @@ -0,0 +1,138 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.SearchModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FurnitureAssemblyView +{ + public partial class FormImplementer : Form + { + private readonly ILogger _logger; + + private readonly IImplementerLogic _logic; + + private int? _id; + + public int Id { set { _id = value; } } + + // Конструктор + public FormImplementer(ILogger logger, IImplementerLogic logic) + { + InitializeComponent(); + + _logger = logger; + _logic = logic; + } + + // При загрузке формы + private void FormImplementer_Load(object sender, EventArgs e) + { + // Проверка на заполнение поля id. Если оно заполнено, то пробуем получить запись и выести её на экран + if (_id.HasValue) + { + try + { + _logger.LogInformation("Получение исполнителя"); + + var view = _logic.ReadElement(new ImplementerSearchModel { Id = _id.Value }); + + if (view != null) + { + textBoxImplementerFIO.Text = view.ImplementerFIO; + textBoxPassword.Text = view.Password; + textBoxWorkExperience.Text = view.WorkExperience.ToString(); + textBoxQualification.Text = view.Qualification.ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения исполнителя"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + // Проверка на заполнение поля с ФИО исполнителя + if (string.IsNullOrEmpty(textBoxImplementerFIO.Text)) + { + MessageBox.Show("Заполните ФИО", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return; + } + + // Проверка на заполнение поля с паролем + if (string.IsNullOrEmpty(textBoxPassword.Text)) + { + MessageBox.Show("Введите пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return; + } + + // Проверка на заполнение поля со стажем + if (string.IsNullOrEmpty(textBoxWorkExperience.Text)) + { + MessageBox.Show("Введите ваш стаж", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return; + } + + // Проверка на заполнение поля с квалификацией + if (string.IsNullOrEmpty(textBoxQualification.Text)) + { + MessageBox.Show("Введите свою квалификацию", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return; + } + + _logger.LogInformation("Сохранение исполнителя"); + + try + { + var model = new ImplementerBindingModel + { + Id = _id ?? 0, + ImplementerFIO = textBoxImplementerFIO.Text, + Password = textBoxPassword.Text, + WorkExperience = Convert.ToInt16(textBoxWorkExperience.Text), + Qualification = Convert.ToInt16(textBoxQualification.Text) + }; + + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); + + if (!operationResult) + { + throw new Exception("Ошибка при сохранеии. Дополнительная информация в логах."); + } + + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения исполнителя"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.resx b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementer.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.Designer.cs new file mode 100644 index 0000000..9835b5c --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.Designer.cs @@ -0,0 +1,114 @@ +namespace FurnitureAssemblyView +{ + partial class FormImplementers + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + buttonCreate = new Button(); + buttonChange = new Button(); + buttonDelete = new Button(); + buttonUpdate = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 12); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(768, 426); + dataGridView.TabIndex = 0; + // + // buttonCreate + // + buttonCreate.Location = new Point(805, 22); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(160, 29); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += ButtonCreate_Click; + // + // buttonChange + // + buttonChange.Location = new Point(805, 90); + buttonChange.Name = "buttonChange"; + buttonChange.Size = new Size(160, 29); + buttonChange.TabIndex = 2; + buttonChange.Text = "Изменить"; + buttonChange.UseVisualStyleBackColor = true; + buttonChange.Click += ButtonChange_Click; + // + // buttonDelete + // + buttonDelete.Location = new Point(805, 153); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(160, 29); + buttonDelete.TabIndex = 3; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += ButtonDelete_Click; + // + // buttonUpdate + // + buttonUpdate.Location = new Point(805, 218); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(160, 29); + buttonUpdate.TabIndex = 4; + buttonUpdate.Text = "Обновить"; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += ButtonUpdate_Click; + // + // FormImplementers + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(991, 450); + Controls.Add(buttonUpdate); + Controls.Add(buttonDelete); + Controls.Add(buttonChange); + Controls.Add(buttonCreate); + Controls.Add(dataGridView); + Name = "FormImplementers"; + Text = "Исполнители"; + Load += FormImplementers_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonCreate; + private Button buttonChange; + private Button buttonDelete; + private Button buttonUpdate; + } +} \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.cs b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.cs new file mode 100644 index 0000000..b05211a --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.cs @@ -0,0 +1,127 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FurnitureAssemblyView +{ + public partial class FormImplementers : Form + { + private readonly ILogger _logger; + + private readonly IImplementerLogic _logic; + + public FormImplementers(ILogger logger, IImplementerLogic logic) + { + InitializeComponent(); + + _logger = logger; + _logic = logic; + } + + private void FormImplementers_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + + // Растягиваем колонку Название на всю ширину, колонку Id скрываем + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + + _logger.LogInformation("Загрузка исполнителей"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки исполнителей"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + + if (service is FormImplementer form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void ButtonChange_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + + if (service is FormImplementer form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void ButtonDelete_Click(object sender, EventArgs e) + { + // Проверяем наличие выделенной строки + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + + _logger.LogInformation("Удаление исполнителя"); + + try + { + if (!_logic.Delete(new ImplementerBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void ButtonUpdate_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.resx b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyView/FormImplementers.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs index d3f2f6b..f850eb0 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs +++ b/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs @@ -28,203 +28,187 @@ /// private void InitializeComponent() { - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.buttonCreateOrder = new System.Windows.Forms.Button(); - this.buttonTakeOrderInWork = new System.Windows.Forms.Button(); - this.buttonOrderReady = new System.Windows.Forms.Button(); - this.buttonIssuedOrder = new System.Windows.Forms.Button(); - this.buttonRefresh = new System.Windows.Forms.Button(); - this.menuStrip = new System.Windows.Forms.MenuStrip(); - this.toolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.workPieceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.furnitureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.reportsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.workPiecesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.workPieceFurnituresToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ordersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.workWithClientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.clientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.menuStrip.SuspendLayout(); - this.SuspendLayout(); + dataGridView = new DataGridView(); + buttonCreateOrder = new Button(); + buttonIssuedOrder = new Button(); + buttonRefresh = new Button(); + menuStrip = new MenuStrip(); + toolStripMenuItem = new ToolStripMenuItem(); + workPieceToolStripMenuItem = new ToolStripMenuItem(); + furnitureToolStripMenuItem = new ToolStripMenuItem(); + reportsToolStripMenuItem = new ToolStripMenuItem(); + workPiecesToolStripMenuItem = new ToolStripMenuItem(); + workPieceFurnituresToolStripMenuItem = new ToolStripMenuItem(); + ordersToolStripMenuItem = new ToolStripMenuItem(); + workWithClientsToolStripMenuItem = new ToolStripMenuItem(); + clientsToolStripMenuItem = new ToolStripMenuItem(); + workWithImplementerToolStripMenuItem = new ToolStripMenuItem(); + implementerToolStripMenuItem = new ToolStripMenuItem(); + startingWorkToolStripMenuItem = new ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + menuStrip.SuspendLayout(); + SuspendLayout(); // // dataGridView // - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(10, 27); - this.dataGridView.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowHeadersWidth = 51; - this.dataGridView.RowTemplate.Height = 29; - this.dataGridView.Size = new System.Drawing.Size(820, 302); - this.dataGridView.TabIndex = 0; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(11, 36); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(1010, 403); + dataGridView.TabIndex = 0; // // buttonCreateOrder // - this.buttonCreateOrder.Location = new System.Drawing.Point(887, 50); - this.buttonCreateOrder.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonCreateOrder.Name = "buttonCreateOrder"; - this.buttonCreateOrder.Size = new System.Drawing.Size(206, 34); - this.buttonCreateOrder.TabIndex = 1; - this.buttonCreateOrder.Text = "Создать заказ"; - this.buttonCreateOrder.UseVisualStyleBackColor = true; - // - // buttonTakeOrderInWork - // - this.buttonTakeOrderInWork.Location = new System.Drawing.Point(887, 107); - this.buttonTakeOrderInWork.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; - this.buttonTakeOrderInWork.Size = new System.Drawing.Size(206, 36); - this.buttonTakeOrderInWork.TabIndex = 2; - this.buttonTakeOrderInWork.Text = "Отдать на выполнение"; - this.buttonTakeOrderInWork.UseVisualStyleBackColor = true; - this.buttonTakeOrderInWork.Click += new System.EventHandler(this.ButtonTakeOrderInWork_Click); - // - // buttonOrderReady - // - this.buttonOrderReady.Location = new System.Drawing.Point(887, 165); - this.buttonOrderReady.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonOrderReady.Name = "buttonOrderReady"; - this.buttonOrderReady.Size = new System.Drawing.Size(206, 31); - this.buttonOrderReady.TabIndex = 3; - this.buttonOrderReady.Text = "Заказ готов"; - this.buttonOrderReady.UseVisualStyleBackColor = true; - this.buttonOrderReady.Click += new System.EventHandler(this.ButtonOrderReady_Click); + buttonCreateOrder.Location = new Point(1057, 67); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(235, 46); + buttonCreateOrder.TabIndex = 1; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += ButtonCreateOrder_Click; // // buttonIssuedOrder // - this.buttonIssuedOrder.Location = new System.Drawing.Point(887, 217); - this.buttonIssuedOrder.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonIssuedOrder.Name = "buttonIssuedOrder"; - this.buttonIssuedOrder.Size = new System.Drawing.Size(206, 33); - this.buttonIssuedOrder.TabIndex = 4; - this.buttonIssuedOrder.Text = "Заказ выдан"; - this.buttonIssuedOrder.UseVisualStyleBackColor = true; - this.buttonIssuedOrder.Click += new System.EventHandler(this.ButtonIssuedOrder_Click); + buttonIssuedOrder.Location = new Point(1057, 133); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(235, 44); + buttonIssuedOrder.TabIndex = 4; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += ButtonIssuedOrder_Click; // // buttonRefresh // - this.buttonRefresh.Location = new System.Drawing.Point(887, 269); - this.buttonRefresh.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.buttonRefresh.Name = "buttonRefresh"; - this.buttonRefresh.Size = new System.Drawing.Size(206, 29); - this.buttonRefresh.TabIndex = 5; - this.buttonRefresh.Text = "Обновить"; - this.buttonRefresh.UseVisualStyleBackColor = true; - this.buttonRefresh.Click += new System.EventHandler(this.ButtonRef_Click); + buttonRefresh.Location = new Point(1057, 203); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(235, 39); + buttonRefresh.TabIndex = 5; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += ButtonRef_Click; // // menuStrip // - this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); - this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem, - this.reportsToolStripMenuItem, - this.workWithClientsToolStripMenuItem}); - this.menuStrip.Location = new System.Drawing.Point(0, 0); - this.menuStrip.Name = "menuStrip"; - this.menuStrip.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); - this.menuStrip.Size = new System.Drawing.Size(1135, 24); - this.menuStrip.TabIndex = 6; - this.menuStrip.Text = "menuStrip"; + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem, reportsToolStripMenuItem, workWithClientsToolStripMenuItem, workWithImplementerToolStripMenuItem, startingWorkToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Padding = new Padding(6, 3, 0, 3); + menuStrip.Size = new Size(1331, 30); + menuStrip.TabIndex = 6; + menuStrip.Text = "menuStrip"; // // toolStripMenuItem // - this.toolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.workPieceToolStripMenuItem, - this.furnitureToolStripMenuItem}); - this.toolStripMenuItem.Name = "toolStripMenuItem"; - this.toolStripMenuItem.Size = new System.Drawing.Size(94, 20); - this.toolStripMenuItem.Text = "Справочники"; + toolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { workPieceToolStripMenuItem, furnitureToolStripMenuItem }); + toolStripMenuItem.Name = "toolStripMenuItem"; + toolStripMenuItem.Size = new Size(117, 24); + toolStripMenuItem.Text = "Справочники"; // // workPieceToolStripMenuItem // - this.workPieceToolStripMenuItem.Name = "workPieceToolStripMenuItem"; - this.workPieceToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.workPieceToolStripMenuItem.Text = "Заготовки"; + workPieceToolStripMenuItem.Name = "workPieceToolStripMenuItem"; + workPieceToolStripMenuItem.Size = new Size(162, 26); + workPieceToolStripMenuItem.Text = "Заготовки"; + workPieceToolStripMenuItem.Click += WorkPieceToolStripMenuItem_Click; // // furnitureToolStripMenuItem // - this.furnitureToolStripMenuItem.Name = "furnitureToolStripMenuItem"; - this.furnitureToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.furnitureToolStripMenuItem.Text = "Изделия"; + furnitureToolStripMenuItem.Name = "furnitureToolStripMenuItem"; + furnitureToolStripMenuItem.Size = new Size(162, 26); + furnitureToolStripMenuItem.Text = "Изделия"; + furnitureToolStripMenuItem.Click += FurnitureToolStripMenuItem_Click; // // reportsToolStripMenuItem // - this.reportsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.workPiecesToolStripMenuItem, - this.workPieceFurnituresToolStripMenuItem, - this.ordersToolStripMenuItem}); - this.reportsToolStripMenuItem.Name = "reportsToolStripMenuItem"; - this.reportsToolStripMenuItem.Size = new System.Drawing.Size(60, 20); - this.reportsToolStripMenuItem.Text = "Отчёты"; + reportsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { workPiecesToolStripMenuItem, workPieceFurnituresToolStripMenuItem, ordersToolStripMenuItem }); + reportsToolStripMenuItem.Name = "reportsToolStripMenuItem"; + reportsToolStripMenuItem.Size = new Size(73, 24); + reportsToolStripMenuItem.Text = "Отчёты"; // // workPiecesToolStripMenuItem // - this.workPiecesToolStripMenuItem.Name = "workPiecesToolStripMenuItem"; - this.workPiecesToolStripMenuItem.Size = new System.Drawing.Size(203, 22); - this.workPiecesToolStripMenuItem.Text = "Список заготовок"; - this.workPiecesToolStripMenuItem.Click += new System.EventHandler(this.WorkPiecesToolStripMenuItem_Click); + workPiecesToolStripMenuItem.Name = "workPiecesToolStripMenuItem"; + workPiecesToolStripMenuItem.Size = new Size(256, 26); + workPiecesToolStripMenuItem.Text = "Список заготовок"; + workPiecesToolStripMenuItem.Click += WorkPiecesToolStripMenuItem_Click; // // workPieceFurnituresToolStripMenuItem // - this.workPieceFurnituresToolStripMenuItem.Name = "workPieceFurnituresToolStripMenuItem"; - this.workPieceFurnituresToolStripMenuItem.Size = new System.Drawing.Size(203, 22); - this.workPieceFurnituresToolStripMenuItem.Text = "Заготовки по изделиям"; - this.workPieceFurnituresToolStripMenuItem.Click += new System.EventHandler(this.WorkPieceFurnituresToolStripMenuItem_Click); + workPieceFurnituresToolStripMenuItem.Name = "workPieceFurnituresToolStripMenuItem"; + workPieceFurnituresToolStripMenuItem.Size = new Size(256, 26); + workPieceFurnituresToolStripMenuItem.Text = "Заготовки по изделиям"; + workPieceFurnituresToolStripMenuItem.Click += WorkPieceFurnituresToolStripMenuItem_Click; // // ordersToolStripMenuItem // - this.ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - this.ordersToolStripMenuItem.Size = new System.Drawing.Size(203, 22); - this.ordersToolStripMenuItem.Text = "Список заказов"; - this.ordersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); + ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; + ordersToolStripMenuItem.Size = new Size(256, 26); + ordersToolStripMenuItem.Text = "Список заказов"; + ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; // // workWithClientsToolStripMenuItem // - this.workWithClientsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.clientsToolStripMenuItem}); - this.workWithClientsToolStripMenuItem.Name = "workWithClientsToolStripMenuItem"; - this.workWithClientsToolStripMenuItem.Size = new System.Drawing.Size(129, 20); - this.workWithClientsToolStripMenuItem.Text = "Работа с клиентами"; + workWithClientsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { clientsToolStripMenuItem }); + workWithClientsToolStripMenuItem.Name = "workWithClientsToolStripMenuItem"; + workWithClientsToolStripMenuItem.Size = new Size(161, 24); + workWithClientsToolStripMenuItem.Text = "Работа с клиентами"; // // clientsToolStripMenuItem // - this.clientsToolStripMenuItem.Name = "clientsToolStripMenuItem"; - this.clientsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.clientsToolStripMenuItem.Text = "Клиенты"; - this.clientsToolStripMenuItem.Click += new System.EventHandler(this.ClientsToolStripMenuItem_Click); + clientsToolStripMenuItem.Name = "clientsToolStripMenuItem"; + clientsToolStripMenuItem.Size = new Size(152, 26); + clientsToolStripMenuItem.Text = "Клиенты"; + clientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; + // + // workWithImplementerToolStripMenuItem + // + workWithImplementerToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { implementerToolStripMenuItem }); + workWithImplementerToolStripMenuItem.Name = "workWithImplementerToolStripMenuItem"; + workWithImplementerToolStripMenuItem.Size = new Size(196, 24); + workWithImplementerToolStripMenuItem.Text = "Работа с исполнителями"; + // + // implementerToolStripMenuItem + // + implementerToolStripMenuItem.Name = "implementerToolStripMenuItem"; + implementerToolStripMenuItem.Size = new Size(185, 26); + implementerToolStripMenuItem.Text = "Исполнители"; + implementerToolStripMenuItem.Click += ImplementerToolStripMenuItem_Click; + // + // startingWorkToolStripMenuItem + // + startingWorkToolStripMenuItem.Name = "startingWorkToolStripMenuItem"; + startingWorkToolStripMenuItem.Size = new Size(114, 24); + startingWorkToolStripMenuItem.Text = "Запуск работ"; + startingWorkToolStripMenuItem.Click += StartingWorkToolStripMenuItem_Click; // // FormMain // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1135, 338); - this.Controls.Add(this.buttonRefresh); - this.Controls.Add(this.buttonIssuedOrder); - this.Controls.Add(this.buttonOrderReady); - this.Controls.Add(this.buttonTakeOrderInWork); - this.Controls.Add(this.buttonCreateOrder); - this.Controls.Add(this.dataGridView); - this.Controls.Add(this.menuStrip); - this.MainMenuStrip = this.menuStrip; - this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.Name = "FormMain"; - this.Text = "Сборка мебели"; - this.Load += new System.EventHandler(this.FormMain_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.menuStrip.ResumeLayout(false); - this.menuStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1331, 474); + Controls.Add(buttonRefresh); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormMain"; + Text = "Сборка мебели"; + Load += FormMain_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } #endregion private DataGridView dataGridView; private Button buttonCreateOrder; - private Button buttonTakeOrderInWork; - private Button buttonOrderReady; private Button buttonIssuedOrder; private Button buttonRefresh; private MenuStrip menuStrip; @@ -237,5 +221,8 @@ private ToolStripMenuItem ordersToolStripMenuItem; private ToolStripMenuItem workWithClientsToolStripMenuItem; private ToolStripMenuItem clientsToolStripMenuItem; - } + private ToolStripMenuItem workWithImplementerToolStripMenuItem; + private ToolStripMenuItem implementerToolStripMenuItem; + private ToolStripMenuItem startingWorkToolStripMenuItem; + } } \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormMain.cs b/FurnitureAssembly/FurnitureAssemblyView/FormMain.cs index 644fe1c..fcbbead 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/FormMain.cs +++ b/FurnitureAssembly/FurnitureAssemblyView/FormMain.cs @@ -22,13 +22,16 @@ namespace FurnitureAssemblyView private readonly IReportLogic _reportLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic) + private readonly IWorkProcess _workProcess; + + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; + _workProcess = workProcess; } private void FormMain_Load(object sender, EventArgs e) @@ -49,8 +52,10 @@ namespace FurnitureAssemblyView dataGridView.DataSource = list; dataGridView.Columns["FurnitureId"].Visible = false; dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["ImplementerId"].Visible = false; dataGridView.Columns["FurnitureName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } _logger.LogInformation("Загрузка заказов"); @@ -94,64 +99,6 @@ namespace FurnitureAssemblyView } - private void ButtonTakeOrderInWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); - - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel - { - Id = id - }); - - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка передачи заказа в работу"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - - private void ButtonOrderReady_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); - - try - { - var operationResult = _orderLogic.FinishOrder(new OrderBindingModel - { - Id = id - }); - - if (!operationResult) - { - throw new Exception("Заказ не отправлен в сборку. Дополнительная информация в логах."); - } - - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о готовности заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - private void ButtonIssuedOrder_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) @@ -232,5 +179,22 @@ namespace FurnitureAssemblyView form.ShowDialog(); } } + + private void StartingWorkToolStripMenuItem_Click(object sender, EventArgs e) + { + _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void ImplementerToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + + if (service is FormImplementers form) + { + form.ShowDialog(); + } + } } } diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormMain.resx b/FurnitureAssembly/FurnitureAssemblyView/FormMain.resx index 81a9e3d..6c82d08 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/FormMain.resx +++ b/FurnitureAssembly/FurnitureAssemblyView/FormMain.resx @@ -1,4 +1,64 @@ - + + + diff --git a/FurnitureAssembly/FurnitureAssemblyView/Program.cs b/FurnitureAssembly/FurnitureAssemblyView/Program.cs index d83fad6..9b0249b 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/Program.cs +++ b/FurnitureAssembly/FurnitureAssemblyView/Program.cs @@ -44,12 +44,15 @@ namespace FurnitureAssemblyView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -65,6 +68,8 @@ namespace FurnitureAssemblyView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyView/ReportOrders.rdlc b/FurnitureAssembly/FurnitureAssemblyView/ReportOrders.rdlc index a11be69..e12fb88 100644 --- a/FurnitureAssembly/FurnitureAssemblyView/ReportOrders.rdlc +++ b/FurnitureAssembly/FurnitureAssemblyView/ReportOrders.rdlc @@ -1,599 +1,600 @@ - + - 0 - - - - System.Data.DataSet - /* Local Connection */ - - 10791c83-cee8-4a38-bbd0-245fc17cefb3 - - - - - - FurnitureAssemblyContractsViewModels - /* Local Query */ - - - - Id - System.Int32 - - - DateCreate - System.DateTime - - - FurnitureName - System.String - - - Sum - System.Decimal - - - OrderStatus - FurnitureAssemblyDataModels.OrderStatus - - - - FurnitureAssemblyContracts.ViewModels - ReportOrdersViewModel - FurnitureAssemblyContracts.ViewModels.ReportOrdersViewModel, ConfectioneryContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - - - - - - - - - true - true - - - - - =Parameters!ReportParameterPeriod.Value - - - - - - - ReportParameterPeriod - 1cm - 1cm + 0 + + + + System.Data.DataSet + /* Local Connection */ + + 10791c83-cee8-4a38-bbd0-245fc17cefb3 + + + + + + FurnitureAssemblyContractsViewModels + /* Local Query */ + + + + Id + System.Int32 + + + DateCreate + System.DateTime + + + FurnitureName + System.String + + + Sum + System.Decimal + + + OrderStatus + FurnitureAssemblyDataModels.OrderStatus + + + + FurnitureAssemblyContracts.ViewModels + ReportOrdersViewModel + FurnitureAssemblyContracts.ViewModels.ReportOrdersViewModel, ConfectioneryContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + true + true + + + + + =Parameters!ReportParameterPeriod.Value + + + + + + + ReportParameterPeriod + 1cm + 1cm + 21cm + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Заказы + + + + + + + 1cm + 21cm + 1 + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.5cm + + + 3.21438cm + + + 8.23317cm + + + 3.02917cm + + + 2.87042cm + + + + + 0.6cm + + + + + true + true + + + + + Номер + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Дата создания + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Изделие + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Статус заказа + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Сумма + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + =Fields!Id.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!DateCreate.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!FurnitureName.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!OrderStatus.Value + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =Fields!Sum.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + After + + + + + + + DataSetOrders + 2.48391cm + 0.55245cm + 1.2cm + 19.84713cm + 2 + + + + + + true + true + + + + + Итого: + + + + + + + 4cm + 15.39958cm + 0.6cm + 2.5cm + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Sum(Fields!Sum.Value, "DataSetOrders") + + + + + + + 4cm + 17.89958cm + 0.6cm + 2.5cm + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + 5.72875cm + - - Middle - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - Заказы - - - - - - - 1cm - 21cm - 1 - - - Middle - 2pt - 2pt - 2pt - 2pt - - - - - - - 2.5cm - - - 3.21438cm - - - 8.23317cm - - - 3.02917cm - - - 2.87042cm - - - - - 0.6cm - - - - - true - true - - - - - Номер - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Дата создания - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Изделие - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Статус заказа - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Сумма - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - 0.6cm - - - - - true - true - - - - - =Fields!Id.Value - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!DateCreate.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!FurnitureName.Value - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!OrderStatus.Value - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Sum.Value - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - - - - - - - - - - - - - - After - - - - - - - DataSetOrders - 2.48391cm - 0.55245cm - 1.2cm - 19.84714cm - 2 - - - - - - true - true - - - - - Итого: - - - - - - - 4cm - 15.39958cm - 0.6cm - 2.5cm - 3 - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Sum(Fields!Sum.Value, "DataSetOrders") - - - - - - - 4cm - 17.89958cm - 0.6cm - 2.5cm - 4 - - - 2pt - 2pt - 2pt - 2pt - - - - 5.72875cm -