Лабораторная работа 8 (усложнёнка)

This commit is contained in:
nikbel2004@outlook.com 2024-05-22 17:07:35 +04:00
parent bb0f88f83a
commit 9d619f493f
224 changed files with 82485 additions and 1850 deletions

View File

@ -13,13 +13,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyListImplem
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyView", "FurnitureAssemblyView\FurnitureAssemblyView.csproj", "{77944C5A-53FC-437B-A563-E7C09C769859}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyView", "FurnitureAssemblyView\FurnitureAssemblyView.csproj", "{77944C5A-53FC-437B-A563-E7C09C769859}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyFileImplement", "FurnitureAssemblyFileImplement\FurnitureAssemblyFileImplement.csproj", "{2EF175D6-B6BD-442B-B81E-67E368553726}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyFileImplement", "FurnitureAssemblyFileImplement\FurnitureAssemblyFileImplement.csproj", "{C987B2B5-56C1-434F-BBCF-6453CF6E5193}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyDatabaseImplement", "FurnitureAssemblyDatabaseImplement\FurnitureAssemblyDatabaseImplement.csproj", "{C2302631-5038-4592-B75F-C03C3ABD510D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FurnitureAssemblyDatabaseImplement", "FurnitureAssemblyDatabaseImplement\FurnitureAssemblyDatabaseImplement.csproj", "{D236EEDD-7AAE-40FF-BE52-B637EEA89FA6}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnitureAssemblyRestApi", "FurnitureAssemblyRestApi\FurnitureAssemblyRestApi.csproj", "{8F808327-C893-4F7B-ACEC-A8F960D4C2F4}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnitureAssemblyRestApi", "FurnitureAssemblyRestApi\FurnitureAssemblyRestApi.csproj", "{8622D3F5-AC1F-4D70-AA32-720447AB632F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnitureAssemblyClientApp", "FurnitureAssemblyClientApp\FurnitureAssemblyClientApp.csproj", "{7125E0C7-C4DC-41D1-9365-06A8A7647302}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnitureAssemblyClientApp", "FurnitureAssemblyClientApp\FurnitureAssemblyClientApp.csproj", "{14EBC846-F344-4D99-9594-43509A3C1861}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnitureAssemblyShopApp", "FurnitureAssemblyShopApp\FurnitureAssemblyShopApp.csproj", "{9EC23C5C-03D2-4890-8FA0-7D42BE8802E2}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -47,22 +49,26 @@ Global
{77944C5A-53FC-437B-A563-E7C09C769859}.Debug|Any CPU.Build.0 = Debug|Any CPU {77944C5A-53FC-437B-A563-E7C09C769859}.Debug|Any CPU.Build.0 = Debug|Any CPU
{77944C5A-53FC-437B-A563-E7C09C769859}.Release|Any CPU.ActiveCfg = Release|Any CPU {77944C5A-53FC-437B-A563-E7C09C769859}.Release|Any CPU.ActiveCfg = Release|Any CPU
{77944C5A-53FC-437B-A563-E7C09C769859}.Release|Any CPU.Build.0 = Release|Any CPU {77944C5A-53FC-437B-A563-E7C09C769859}.Release|Any CPU.Build.0 = Release|Any CPU
{2EF175D6-B6BD-442B-B81E-67E368553726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C987B2B5-56C1-434F-BBCF-6453CF6E5193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2EF175D6-B6BD-442B-B81E-67E368553726}.Debug|Any CPU.Build.0 = Debug|Any CPU {C987B2B5-56C1-434F-BBCF-6453CF6E5193}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2EF175D6-B6BD-442B-B81E-67E368553726}.Release|Any CPU.ActiveCfg = Release|Any CPU {C987B2B5-56C1-434F-BBCF-6453CF6E5193}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2EF175D6-B6BD-442B-B81E-67E368553726}.Release|Any CPU.Build.0 = Release|Any CPU {C987B2B5-56C1-434F-BBCF-6453CF6E5193}.Release|Any CPU.Build.0 = Release|Any CPU
{C2302631-5038-4592-B75F-C03C3ABD510D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D236EEDD-7AAE-40FF-BE52-B637EEA89FA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2302631-5038-4592-B75F-C03C3ABD510D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D236EEDD-7AAE-40FF-BE52-B637EEA89FA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2302631-5038-4592-B75F-C03C3ABD510D}.Release|Any CPU.ActiveCfg = Release|Any CPU {D236EEDD-7AAE-40FF-BE52-B637EEA89FA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2302631-5038-4592-B75F-C03C3ABD510D}.Release|Any CPU.Build.0 = Release|Any CPU {D236EEDD-7AAE-40FF-BE52-B637EEA89FA6}.Release|Any CPU.Build.0 = Release|Any CPU
{8F808327-C893-4F7B-ACEC-A8F960D4C2F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8622D3F5-AC1F-4D70-AA32-720447AB632F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8F808327-C893-4F7B-ACEC-A8F960D4C2F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {8622D3F5-AC1F-4D70-AA32-720447AB632F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8F808327-C893-4F7B-ACEC-A8F960D4C2F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {8622D3F5-AC1F-4D70-AA32-720447AB632F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8F808327-C893-4F7B-ACEC-A8F960D4C2F4}.Release|Any CPU.Build.0 = Release|Any CPU {8622D3F5-AC1F-4D70-AA32-720447AB632F}.Release|Any CPU.Build.0 = Release|Any CPU
{7125E0C7-C4DC-41D1-9365-06A8A7647302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14EBC846-F344-4D99-9594-43509A3C1861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7125E0C7-C4DC-41D1-9365-06A8A7647302}.Debug|Any CPU.Build.0 = Debug|Any CPU {14EBC846-F344-4D99-9594-43509A3C1861}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7125E0C7-C4DC-41D1-9365-06A8A7647302}.Release|Any CPU.ActiveCfg = Release|Any CPU {14EBC846-F344-4D99-9594-43509A3C1861}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7125E0C7-C4DC-41D1-9365-06A8A7647302}.Release|Any CPU.Build.0 = Release|Any CPU {14EBC846-F344-4D99-9594-43509A3C1861}.Release|Any CPU.Build.0 = Release|Any CPU
{9EC23C5C-03D2-4890-8FA0-7D42BE8802E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9EC23C5C-03D2-4890-8FA0-7D42BE8802E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9EC23C5C-03D2-4890-8FA0-7D42BE8802E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9EC23C5C-03D2-4890-8FA0-7D42BE8802E2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -0,0 +1,41 @@
using FurnitureAssemblyBusinessLogic.BussinessLogic;
using FurnitureAssemblyBusinessLogic.MailWorker;
using FurnitureAssemblyBusinessLogic.OfficePackage.Implements;
using FurnitureAssemblyBusinessLogic.OfficePackage;
using FurnitureAssemblyContracts.BusinessLogicsContracts;
using FurnitureAssemblyContracts.DI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyBusinessLogic
{
public class BusinessLogicImplementationExtension : IBusinessLogicImplementationExtension
{
public int Priority => 0;
public void RegisterServices()
{
DependencyManager.Instance.RegisterType<IWorkPieceLogic, WorkPieceLogic>();
DependencyManager.Instance.RegisterType<IOrderLogic, OrderLogic>();
DependencyManager.Instance.RegisterType<IFurnitureLogic, FurnitureLogic>();
DependencyManager.Instance.RegisterType<IReportLogic, ReportLogic>();
DependencyManager.Instance.RegisterType<IClientLogic, ClientLogic>();
DependencyManager.Instance.RegisterType<IImplementerLogic, ImplementerLogic>();
DependencyManager.Instance.RegisterType<IMessageInfoLogic, MessageInfoLogic>();
DependencyManager.Instance.RegisterType<IShopLogic, ShopLogic>();
DependencyManager.Instance.RegisterType<AbstractSaveToExcel, SaveToExcel>();
DependencyManager.Instance.RegisterType<AbstractSaveToWord, SaveToWord>();
DependencyManager.Instance.RegisterType<AbstractSaveToPdf, SaveToPdf>();
DependencyManager.Instance.RegisterType<IWorkProcess, WorkModeling>();
DependencyManager.Instance.RegisterType<AbstractMailWorker, MailKitWorker>(true);
DependencyManager.Instance.RegisterType<IBackUpLogic, BackUpLogic>();
}
}
}

View File

@ -30,12 +30,10 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
public void CreateBackUp(BackUpSaveBindingModel model) public void CreateBackUp(BackUpSaveBindingModel model)
{ {
// Проверка наличия данных для бэкапа
if (_backUpInfo == null) if (_backUpInfo == null)
{ {
return; return;
} }
try try
{ {
_logger.LogDebug("Clear folder"); _logger.LogDebug("Clear folder");
@ -45,7 +43,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
if (dirInfo.Exists) if (dirInfo.Exists)
{ {
// ЛУЧШЕ ВЫБИРАТЬ ОТДЕЛЬНО СОЗДАННУЮ ПАПКУ (Рабочий стол не использовать, поскольку с него всё удалится) // ЛУЧШЕ ВЫБИРАТЬ ОТДЕЛЬНО СОЗДАННУЮ ПАПКУ (Не брать рабочий стол иначе с него всё удалится)
foreach (var file in dirInfo.GetFiles()) foreach (var file in dirInfo.GetFiles())
{ {
file.Delete(); file.Delete();
@ -64,7 +62,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
// Берём метод для сохранения // Берём метод для сохранения
_logger.LogDebug("Get assembly"); _logger.LogDebug("Get assembly");
// Получение сборки и типов
var typeIId = typeof(IId); var typeIId = typeof(IId);
var assembly = typeIId.Assembly; var assembly = typeIId.Assembly;
@ -78,7 +75,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
_logger.LogDebug("Find {count} types", types.Length); _logger.LogDebug("Find {count} types", types.Length);
// Перебор типов и вызов метода для сохранения данных
foreach (var type in types) foreach (var type in types)
{ {
// Проверка на то, является ли тип интерфейсом и унаследован ли он от IId // Проверка на то, является ли тип интерфейсом и унаследован ли он от IId
@ -93,7 +89,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
_logger.LogDebug("Call SaveToFile method for {name} type", type.Name); _logger.LogDebug("Call SaveToFile method for {name} type", type.Name);
// Вызываем метод на выполнение (Вызываем метод типа MethodInfo) // Вызываем метод на выполнение
method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName }); method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName });
} }
} }

View File

@ -19,14 +19,12 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
private readonly IImplementerStorage _implementerStorage; private readonly IImplementerStorage _implementerStorage;
// Конструктор
public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage) public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage)
{ {
_logger = logger; _logger = logger;
_implementerStorage = implementerStorage; _implementerStorage = implementerStorage;
} }
// Вывод всего отфильтрованного списка
public List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model) public List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model)
{ {
_logger.LogInformation("ReadList. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model?.ImplementerFIO, model?.Id); _logger.LogInformation("ReadList. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model?.ImplementerFIO, model?.Id);
@ -45,7 +43,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return list; return list;
} }
// Вывод конкретного элемента
public ImplementerViewModel? ReadElement(ImplementerSearchModel model) public ImplementerViewModel? ReadElement(ImplementerSearchModel model)
{ {
if (model == null) if (model == null)
@ -69,7 +66,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return element; return element;
} }
// Создание работника
public bool Create(ImplementerBindingModel model) public bool Create(ImplementerBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -84,7 +80,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return true; return true;
} }
// Обновление данных о работнике
public bool Update(ImplementerBindingModel model) public bool Update(ImplementerBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -99,7 +94,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return true; return true;
} }
// Удаление работника
public bool Delete(ImplementerBindingModel model) public bool Delete(ImplementerBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -151,7 +145,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
// Проверка на наличие квалификации // Проверка на наличие квалификации
if (model.WorkExperience < 0) if (model.WorkExperience < 0)
{ {
throw new ArgumentNullException("Указан некорректный стаж работы", nameof(model.WorkExperience)); throw new ArgumentNullException("Указан некоректный стаж работы", nameof(model.WorkExperience));
} }
_logger.LogInformation("Implementer. ImplementerFIO:{ImplementerFIO}. Password:{Password}. " + _logger.LogInformation("Implementer. ImplementerFIO:{ImplementerFIO}. Password:{Password}. " +

View File

@ -41,7 +41,30 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list.OrderByDescending(x => x.DateDelivery).ToList(); return list;
}
MessageInfoViewModel? IMessageInfoLogic.ReadElement(MessageInfoSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadList. ClientId:{ClientId}. MessageId:{MessageId}", model.ClientId, model?.MessageId);
var element = _messageInfoStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.MessageId);
return element;
} }
public bool Create(MessageInfoBindingModel model) public bool Create(MessageInfoBindingModel model)
@ -55,5 +78,17 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return true; return true;
} }
public bool Update(MessageInfoBindingModel model)
{
if (_messageInfoStorage.Update(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
} }
} }

View File

@ -21,20 +21,25 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly IShopLogic _shopLogic;
private readonly AbstractMailWorker _mailWorker; private readonly AbstractMailWorker _mailWorker;
private readonly IFurnitureStorage _furnitureStorage;
private readonly IClientLogic _clientLogic; private readonly IClientLogic _clientLogic;
private readonly object locker = new object(); private readonly object locker = new object();
// Конструктор // Конструктор
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker, IClientLogic clientLogic) public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IShopLogic shopLogic, IFurnitureStorage furnitureStorage, IClientLogic clientLogic, AbstractMailWorker mailWorker)
{ {
_logger = logger; _logger = logger;
_orderStorage = orderStorage; _orderStorage = orderStorage;
_mailWorker = mailWorker; _shopLogic = shopLogic;
_furnitureStorage = furnitureStorage;
_clientLogic = clientLogic; _clientLogic = clientLogic;
_mailWorker = mailWorker;
} }
// Вывод отфильтрованного списка компонентов // Вывод отфильтрованного списка компонентов
@ -98,8 +103,8 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
if (result == null) if (result == null)
{ {
model.Status = OrderStatus.Неизвестен;
_logger.LogWarning("Insert operation failed"); _logger.LogWarning("Insert operation failed");
return false; return false;
} }
@ -170,7 +175,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
throw new ArgumentNullException("Некорректный идентификатор у клиента", nameof(model.ClientId)); throw new ArgumentNullException("Некорректный идентификатор у клиента", nameof(model.ClientId));
} }
_logger.LogInformation("Order. OrderId:{Id}. Sum:{Sum}. ClientId:{ClientId}. FurnitureId:{Id}", model.Id, model.Sum, model.ClientId, model.FurnitureId); _logger.LogInformation("Order. OrderId:{Id}, Sum:{Sum}. FurnitureId:{Id}. Sum:{Sum}", model.Id, model.Sum, model.FurnitureId, model.Sum);
} }
// Обновление статуса заказа // Обновление статуса заказа
@ -185,7 +190,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
} }
// Проверка на возможность обновления статуса на следующий // Проверка на возможность обновления статуса на следующий
if (viewModel.Status + 1 != newOrderStatus) if (viewModel.Status + 1 != newOrderStatus && viewModel.Status != OrderStatus.Ожидание)
{ {
_logger.LogWarning("Status update operation failed. New status " + newOrderStatus.ToString() + "incorrect"); _logger.LogWarning("Status update operation failed. New status " + newOrderStatus.ToString() + "incorrect");
return false; return false;
@ -200,9 +205,26 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
} }
// Проверка на выдачу // Проверка на выдачу
if (model.Status == OrderStatus.Выдан) if (model.Status == OrderStatus.Готов || viewModel.Status == OrderStatus.Ожидание)
{ {
model.DateImplement = DateTime.Now; model.DateImplement = DateTime.Now;
var furniture = _furnitureStorage.GetElement(new() { Id = viewModel.FurnitureId });
if (furniture == null)
{
throw new ArgumentNullException(nameof(furniture));
}
if (!_shopLogic.AddFurnitures(furniture, viewModel.Count))
{
model.Status = OrderStatus.Ожидание;
_logger.LogWarning($"Невозможно выдать изделия, магазины переполнены. AddFurnitures operation failed. Shop is full.");
}
else
{
model.DateImplement = DateTime.Now;
}
} }
else else
{ {
@ -216,8 +238,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
if (result == null) if (result == null)
{ {
model.Status--;
_logger.LogWarning("Update operation failed"); _logger.LogWarning("Update operation failed");
return false; return false;

View File

@ -20,6 +20,8 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly IShopStorage _shopStorage;
private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToWord _saveToWord;
@ -27,12 +29,12 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
private readonly AbstractSaveToPdf _saveToPdf; private readonly AbstractSaveToPdf _saveToPdf;
// Инициализируем поля класса через контейнер // Инициализируем поля класса через контейнер
public ReportLogic(IFurnitureStorage furnitureStorage, public ReportLogic(IFurnitureStorage furnitureStorage, IOrderStorage orderStorage, IShopStorage shopStorage,
IOrderStorage orderStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf)
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf)
{ {
_furnitureStorage = furnitureStorage; _furnitureStorage = furnitureStorage;
_orderStorage = orderStorage; _orderStorage = orderStorage;
_shopStorage = shopStorage;
_saveToExcel = saveToExcel; _saveToExcel = saveToExcel;
_saveToWord = saveToWord; _saveToWord = saveToWord;
@ -67,6 +69,34 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return list; return list;
} }
// Получение списка изделий с указанием, в каких магазинах в наличии
public List<ReportShopFurnituresViewModel> GetShopFurnitures()
{
var shops = _shopStorage.GetFullList();
var list = new List<ReportShopFurnituresViewModel>();
foreach (var shop in shops)
{
var record = new ReportShopFurnituresViewModel
{
ShopName = shop.ShopName,
Furnitures = new List<(string, int)>(),
TotalCount = 0
};
foreach (var furniture in shop.ShopFurnitures)
{
record.Furnitures.Add(new(furniture.Value.Item1.FurnitureName, furniture.Value.Item2));
record.TotalCount += furniture.Value.Item2;
}
list.Add(record);
}
return list;
}
// Получение списка заказов за определённый период // Получение списка заказов за определённый период
public List<ReportOrdersViewModel> GetOrders(ReportBindingModel model) public List<ReportOrdersViewModel> GetOrders(ReportBindingModel model)
{ {
@ -81,6 +111,20 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
}).ToList(); }).ToList();
} }
// Получение списка заказов за весь период
public List<ReportGroupedOrdersViewModel> GetGroupedOrders()
{
return _orderStorage.GetFullList()
.GroupBy(x => x.DateCreate.Date)
.Select(x => new ReportGroupedOrdersViewModel
{
DateCreate = x.Key,
Count = x.Count(),
Sum = x.Sum(x => x.Sum)
})
.ToList();
}
// Сохранение мебели в файл-Word // Сохранение мебели в файл-Word
public void SaveFurnituresToWordFile(ReportBindingModel model) public void SaveFurnituresToWordFile(ReportBindingModel model)
{ {
@ -92,6 +136,17 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
}); });
} }
// Сохранение магазинов в файл-Word
public void SaveShopsToWordFile(ReportBindingModel model)
{
_saveToWord.CreateTable(new WordInfo
{
FileName = model.FileName,
Title = "Таблица магазинов",
Shops = _shopStorage.GetFullList()
});
}
// Сохранение заготовок с указанием изделий в файл_Excel // Сохранение заготовок с указанием изделий в файл_Excel
public void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model) public void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model)
{ {
@ -103,6 +158,17 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
}); });
} }
// Сохранение магазинов с указанием изделий в файл-Excel
public void SaveShopFurnituresToExcelFile(ReportBindingModel model)
{
_saveToExcel.CreateShopReport(new ExcelInfo
{
FileName = model.FileName,
Title = "Список магазинов",
ShopFurnitures = GetShopFurnitures()
});
}
// Сохранение заказов в файл-Pdf // Сохранение заказов в файл-Pdf
public void SaveOrdersToPdfFile(ReportBindingModel model) public void SaveOrdersToPdfFile(ReportBindingModel model)
{ {
@ -115,5 +181,16 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
Orders = GetOrders(model) Orders = GetOrders(model)
}); });
} }
//Сохранение заказов за весь период в файл-Pdf
public void SaveGroupedOrdersToPdfFile(ReportBindingModel model)
{
_saveToPdf.CreateGroupedDoc(new PdfInfo
{
FileName = model.FileName,
Title = "Список заказов",
GroupedOrders = GetGroupedOrders()
});
}
} }
} }

View File

@ -0,0 +1,267 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.BusinessLogicsContracts;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.StoragesContracts;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models;
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 ShopLogic : IShopLogic
{
private readonly ILogger _logger;
private readonly IShopStorage _shopStorage;
// Конструктор
public ShopLogic(ILogger<ShopLogic> logger, IShopStorage shopStorage)
{
_logger = logger;
_shopStorage = shopStorage;
}
// Вывод конкретного магазина
public ShopViewModel? ReadElement(ShopSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. ShopName:{ShopName}. Id:{Id}", model.ShopName, model.Id);
var element = _shopStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
// Вывод отфильтрованного списка компонентов
public List<ShopViewModel>? ReadList(ShopSearchModel? model)
{
_logger.LogInformation("ReadList. ShopName:{ShopName}. Id: {Id}", model?.ShopName, model?.Id);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _shopStorage.GetFullList() : _shopStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
// Пополнение магазина
public bool AddFurniture(ShopSearchModel model, IFurnitureModel furniture, int count)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (count <= 0)
{
throw new ArgumentNullException("Количество добавляемых изделий должно быть больше 0", nameof(count));
}
_logger.LogInformation("AddFurniture. ShopName:{ShopName}. Id: {Id}", model?.ShopName, model?.Id);
var shop = _shopStorage.GetElement(model);
if (shop == null)
{
_logger.LogWarning("Add Furniture operation failed");
return false;
}
if (shop.MaxCountFurnitures - shop.ShopFurnitures.Select(x => x.Value.Item2).Sum() < count)
{
throw new ArgumentNullException("Слишком много изделий для одного магазина", nameof(count));
}
if (!shop.ShopFurnitures.ContainsKey(furniture.Id))
{
shop.ShopFurnitures[furniture.Id] = (furniture, count);
}
else
{
shop.ShopFurnitures[furniture.Id] = (furniture, shop.ShopFurnitures[furniture.Id].Item2 + count);
}
_shopStorage.Update(new ShopBindingModel()
{
Id = shop.Id,
ShopName = shop.ShopName,
Address = shop.Address,
DateOpen = shop.DateOpen,
MaxCountFurnitures = shop.MaxCountFurnitures,
ShopFurnitures = shop.ShopFurnitures
});
return true;
}
// Создание магазина
public bool Create(ShopBindingModel model)
{
CheckModel(model);
if (_shopStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
// Обновление магазина
public bool Update(ShopBindingModel model)
{
CheckModel(model);
if (_shopStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
// Удаление магазина
public bool Delete(ShopBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_shopStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(ShopBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
// При удалении передаём как параметр false
if (!withParams)
{
return;
}
// Проверка на наличие названия магазина
if (string.IsNullOrEmpty(model.ShopName))
{
throw new ArgumentNullException("Отсутствует названия магазина", nameof(model.ShopName));
}
// Проверка на наличие адреса у магазина
if (string.IsNullOrEmpty(model.Address))
{
throw new ArgumentNullException("Отсутствует адреса магазина", nameof(model.Address));
}
_logger.LogInformation("Shop. ShopName:{ShopName}. Address:{Address}. Id: {Id}", model.ShopName, model.Address, model.Id);
// Проверка на наличие такого же магазина в списке
var element = _shopStorage.GetElement(new ShopSearchModel
{
ShopName = model.ShopName
});
// Если элемент найден и его Id не совпадает с Id переданного объекта
if (element != null && element.Id != model.Id)
{
throw new InvalidOperationException("Магазин с таким названием уже есть");
}
}
public bool AddFurnitures(IFurnitureModel model, int count)
{
if (count <= 0)
{
throw new ArgumentNullException("Количество добавляемых изделий должно быть больше 0", nameof(count));
}
_logger.LogInformation("AddFurnitures. Furniture: {Furniture}. Count: {Count}", model?.FurnitureName, count);
var capacity = _shopStorage.GetFullList().Select(x => x.MaxCountFurnitures - x.ShopFurnitures.Select(x => x.Value.Item2).Sum()).Sum() - count;
if (capacity < 0)
{
_logger.LogWarning("AddFurnitures operation failed. Sell {count} Furnitures ", -capacity);
return false;
}
foreach (var shop in _shopStorage.GetFullList())
{
if (shop.MaxCountFurnitures - shop.ShopFurnitures.Select(x => x.Value.Item2).Sum() < count)
{
if (!AddFurniture(new() { Id = shop.Id }, model, shop.MaxCountFurnitures - shop.ShopFurnitures.Select(x => x.Value.Item2).Sum()))
{
_logger.LogWarning("AddFurnitures operation failed.");
return false;
}
count -= shop.MaxCountFurnitures - shop.ShopFurnitures.Select(x => x.Value.Item2).Sum();
}
else
{
if (!AddFurniture(new() { Id = shop.Id }, model, count))
{
_logger.LogWarning("AddFurnitures operation failed.");
return false;
}
count -= count;
}
if (count == 0)
{
return true;
}
}
return true;
}
public bool SellFurnitures(IFurnitureModel model, int count)
{
return _shopStorage.SellFurnitures(model, count);
}
}
}

View File

@ -20,7 +20,6 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
private IOrderLogic? _orderLogic; private IOrderLogic? _orderLogic;
// Конструктор
public WorkModeling(ILogger<WorkModeling> logger) public WorkModeling(ILogger<WorkModeling> logger)
{ {
_logger = logger; _logger = logger;
@ -38,18 +37,14 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return; return;
} }
var orders = _orderLogic.ReadList(new OrderSearchModel var orders = _orderLogic.ReadList(new() { Status = OrderStatus.Принят });
if (orders == null)
{ {
Status = OrderStatus.Принят _logger.LogWarning("DoWork. Orders is null or empty");
});
if (orders == null || orders.Count == 0)
{
_logger.LogWarning("Dowork. Orders is null or empty");
return; return;
} }
_logger.LogDebug("DoWork for {count} orders", orders.Count); _logger.LogDebug("DoWork for {Count} orders", orders.Count);
foreach (var implementer in implementers) foreach (var implementer in implementers)
{ {
@ -65,6 +60,43 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return; return;
} }
await Task.Run(() =>
{
try
{
var runOrder = _orderLogic.ReadList(new OrderSearchModel
{
ImplementerId = implementer.Id,
Status = OrderStatus.Ожидание
});
if (runOrder == null)
{
return;
}
foreach (var order in runOrder)
{
_logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id);
_orderLogic.FinishOrder(new OrderBindingModel
{
Id = order.Id
});
}
}
// Заказа может не быть, просто игнорируем ошибку
catch (InvalidOperationException ex)
{
_logger.LogWarning(ex, "Error try get work");
}
// Может возникнуть иная ошибка, тогда просто заканчиваем выполнение имитации
catch (Exception ex)
{
_logger.LogError(ex, "Error while do work");
throw;
}
});
await RunOrderInWork(implementer); await RunOrderInWork(implementer);
await Task.Run(() => await Task.Run(() =>
@ -82,27 +114,25 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
ImplementerId = implementer.Id ImplementerId = implementer.Id
}); });
// Работу работаем, делаем-делаем // делаем работу
Thread.Sleep(implementer.WorkExperience * order.Count); Thread.Sleep(implementer.WorkExperience * order.Count);
_logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id); _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id);
_orderLogic.FinishOrder(new OrderBindingModel _orderLogic.FinishOrder(new OrderBindingModel
{ {
Id = order.Id Id = order.Id,
}); });
// Усёёё отдыхаем // Отдыхаем
Thread.Sleep(implementer.Qualification); Thread.Sleep(implementer.Qualification);
} }
// Кто-то мог уже перехватить заказ, игнорируем ошибку
// Игнорируем ошибку, если с заказом что-то случится
catch (InvalidOperationException ex) catch (InvalidOperationException ex)
{ {
_logger.LogWarning(ex, "Error try get work"); _logger.LogWarning(ex, "Error try get work");
} }
// Заканчиваем выполнение имитации в случае иной ошибки
// В случае ошибки прервём выполнение имитации работы
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error while do work"); _logger.LogError(ex, "Error while do work");
@ -112,7 +142,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
}); });
} }
// Ищем заказ, который уже во всю в работе (вдруг прервали исполнителя) // Ищем заказ, которые уже в работе (вдруг исполнителя прервали)
private async Task RunOrderInWork(ImplementerViewModel implementer) private async Task RunOrderInWork(ImplementerViewModel implementer)
{ {
if (_orderLogic == null || implementer == null) if (_orderLogic == null || implementer == null)
@ -133,7 +163,7 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
return; return;
} }
_logger.LogDebug("DoWork {Id} back to order {Order}", implementer.Id, runOrder.Id); _logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id);
// Доделываем работу // Доделываем работу
Thread.Sleep(implementer.WorkExperience * runOrder.Count); Thread.Sleep(implementer.WorkExperience * runOrder.Count);
@ -145,17 +175,15 @@ namespace FurnitureAssemblyBusinessLogic.BussinessLogic
Id = runOrder.Id Id = runOrder.Id
}); });
// Отдыхаем, хватит работы // Отдыхаем
Thread.Sleep(implementer.Qualification); Thread.Sleep(implementer.Qualification);
} }
// Заказа может не быть, просто игнорируем ошибку // Заказа может не быть, просто игнорируем ошибку
catch (InvalidOperationException ex) catch (InvalidOperationException ex)
{ {
_logger.LogWarning(ex, "Error try get work"); _logger.LogWarning(ex, "Error try get work");
} }
// Может возникнуть иная ошибка, тогда просто заканчиваем выполнение имитации
// Просто возникнет тупая ошибка, тогда заканчиваем выполнение имитации
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error while do work"); _logger.LogError(ex, "Error while do work");

View File

@ -8,13 +8,18 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" Version="2.20.0" /> <PackageReference Include="DocumentFormat.OpenXml" Version="2.20.0" />
<PackageReference Include="MailKit" Version="4.0.0" /> <PackageReference Include="MailKit" Version="4.5.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="PDFsharp-MigraDoc-GDI" Version="1.50.5147" /> <PackageReference Include="PDFsharp-MigraDoc-GDI" Version="1.50.5147" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\FurnitureAssemblyContracts\FurnitureAssemblyContracts.csproj" /> <ProjectReference Include="..\FurnitureAssemblyContracts\FurnitureAssemblyContracts.csproj" />
</ItemGroup> </ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy /Y &quot;$(TargetDir)*.dll&quot; &quot;$(SolutionDir)BusinessLogicImplementationExtensions\*.dll&quot;" />
</Target>
</Project> </Project>

View File

@ -86,6 +86,81 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage
SaveExcel(info); SaveExcel(info);
} }
public void CreateShopReport(ExcelInfo info)
{
CreateExcel(info);
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = 1,
Text = info.Title,
StyleInfo = ExcelStyleInfoType.Title
});
MergeCells(new ExcelMergeParameters
{
CellFromName = "A1",
CellToName = "C1"
});
uint rowIndex = 2;
foreach (var sm in info.ShopFurnitures)
{
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = rowIndex,
Text = sm.ShopName,
StyleInfo = ExcelStyleInfoType.Text
});
rowIndex++;
foreach (var (Furniture, Count) in sm.Furnitures)
{
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "B",
RowIndex = rowIndex,
Text = Furniture,
StyleInfo = ExcelStyleInfoType.TextWithBorder
});
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "C",
RowIndex = rowIndex,
Text = Count.ToString(),
StyleInfo = ExcelStyleInfoType.TextWithBorder
});
rowIndex++;
}
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = rowIndex,
Text = "Итого",
StyleInfo = ExcelStyleInfoType.Text
});
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "C",
RowIndex = rowIndex,
Text = sm.TotalCount.ToString(),
StyleInfo = ExcelStyleInfoType.Text
});
rowIndex++;
}
SaveExcel(info);
}
// Создание Excel-файла // Создание Excel-файла
protected abstract void CreateExcel(ExcelInfo info); protected abstract void CreateExcel(ExcelInfo info);

View File

@ -58,6 +58,36 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage
SavePdf(info); SavePdf(info);
} }
public void CreateGroupedDoc(PdfInfo info)
{
CreatePdf(info);
CreateParagraph(new PdfParagraph { Text = info.Title, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center });
CreateTable(new List<string> { "3cm", "3cm", "3cm" });
CreateRow(new PdfRowParameters
{
Texts = new List<string> { "Дата заказа", "Количество заказов", "Сумма" },
Style = "NormalTitle",
ParagraphAlignment = PdfParagraphAlignmentType.Center
});
foreach (var order in info.GroupedOrders)
{
CreateRow(new PdfRowParameters
{
Texts = new List<string> { order.DateCreate.ToShortDateString(), order.Count.ToString(), order.Sum.ToString() },
Style = "Normal",
ParagraphAlignment = PdfParagraphAlignmentType.Left
});
}
CreateParagraph(new PdfParagraph { Text = $"Итого: {info.GroupedOrders.Sum(x => x.Sum)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center });
SavePdf(info);
}
/// Создание Pdf-файла /// Создание Pdf-файла
protected abstract void CreatePdf(PdfInfo info); protected abstract void CreatePdf(PdfInfo info);

View File

@ -44,12 +44,64 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage
SaveWord(info); SaveWord(info);
} }
public void CreateTable(WordInfo info)
{
CreateWord(info);
CreateParagraph(new WordParagraph
{
Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) },
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Center
}
});
List<List<(string, WordTextProperties)>> rowList = new()
{
new()
{
new("Название", new WordTextProperties { Bold = true, Size = "24" } ),
new("Адрес", new WordTextProperties { Bold = true, Size = "24" } ),
new("Дата открытия", new WordTextProperties { Bold = true, Size = "24" } )
}
};
foreach (var shop in info.Shops)
{
List<(string, WordTextProperties)> cellList = new()
{
new(shop.ShopName, new WordTextProperties { Size = "24" }),
new(shop.Address, new WordTextProperties { Size = "24" }),
new(shop.DateOpen.ToShortDateString(), new WordTextProperties { Size = "24"})
};
rowList.Add(cellList);
}
CreateTable(new WordParagraph
{
RowTexts = rowList,
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Center
}
});
SaveWord(info);
}
// Создание Doc-файла // Создание Doc-файла
protected abstract void CreateWord(WordInfo info); protected abstract void CreateWord(WordInfo info);
// Создание абзаца с текстом // Создание абзаца с текстом
protected abstract void CreateParagraph(WordParagraph paragraph); protected abstract void CreateParagraph(WordParagraph paragraph);
// Создание таблицы
protected abstract void CreateTable(WordParagraph paragraph);
// Сохранение файла // Сохранение файла
protected abstract void SaveWord(WordInfo info); protected abstract void SaveWord(WordInfo info);
} }

View File

@ -18,5 +18,8 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
// Список заготовок по изделиям // Список заготовок по изделиям
public List<ReportFurnitureWorkPieceViewModel> FurnitureWorkPieces { get; set; } = new(); public List<ReportFurnitureWorkPieceViewModel> FurnitureWorkPieces { get; set; } = new();
// Список магазинов с изделиями
public List<ReportShopFurnituresViewModel> ShopFurnitures { get; set; } = new();
} }
} }

View File

@ -20,5 +20,8 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
// Перечень заказов за указанный период для вывода/сохранения // Перечень заказов за указанный период для вывода/сохранения
public List<ReportOrdersViewModel> Orders { get; set; } = new(); public List<ReportOrdersViewModel> Orders { get; set; } = new();
// Перечень заказов за весь период для вывода и сохранения
public List<ReportGroupedOrdersViewModel> GroupedOrders { get; set; } = new();
} }
} }

View File

@ -14,7 +14,10 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
public string Title { get; set; } = string.Empty; public string Title { get; set; } = string.Empty;
// Cписок заготовок для вывода и сохранения // Список заготовок для вывода и сохранения
public List<FurnitureViewModel> Furnitures { get; set; } = new(); public List<FurnitureViewModel> Furnitures { get; set; } = new();
// Список магазинов для вывода и сохранения
public List<ShopViewModel> Shops { get; set; } = new();
} }
} }

View File

@ -12,7 +12,9 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
// Набор текстов в абзаце (для случая, если в абзаце текст разных стилей) // Набор текстов в абзаце (для случая, если в абзаце текст разных стилей)
public List<(string, WordTextProperties)> Texts { get; set; } = new(); public List<(string, WordTextProperties)> Texts { get; set; } = new();
// Cвойства параграфа, если они есть // Свойства параграфа, если они есть
public WordTextProperties? TextProperties { get; set; } public WordTextProperties? TextProperties { get; set; }
public List<List<(string, WordTextProperties)>> RowTexts { get; set; } = new();
} }
} }

View File

@ -184,11 +184,8 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
}; };
var stylesheetExtensionList = new StylesheetExtensionList(); var stylesheetExtensionList = new StylesheetExtensionList();
var stylesheetExtension1 = new StylesheetExtension()
{
Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"
};
var stylesheetExtension1 = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
stylesheetExtension1.Append(new SlicerStyles() stylesheetExtension1.Append(new SlicerStyles()
{ {
@ -331,6 +328,7 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
}; };
row.InsertBefore(newCell, refCell); row.InsertBefore(newCell, refCell);
cell = newCell; cell = newCell;
} }

View File

@ -73,10 +73,7 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
if (!string.IsNullOrEmpty(paragraphProperties.Size)) if (!string.IsNullOrEmpty(paragraphProperties.Size))
{ {
paragraphMarkRunProperties.AppendChild(new FontSize paragraphMarkRunProperties.AppendChild(new FontSize { Val = paragraphProperties.Size });
{
Val = paragraphProperties.Size
});
} }
properties.AppendChild(paragraphMarkRunProperties); properties.AppendChild(paragraphMarkRunProperties);
@ -127,11 +124,7 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
docRun.AppendChild(properties); docRun.AppendChild(properties);
docRun.AppendChild(new Text docRun.AppendChild(new Text { Text = run.Item1, Space = SpaceProcessingModeValues.Preserve });
{
Text = run.Item1,
Space = SpaceProcessingModeValues.Preserve
});
docParagraph.AppendChild(docRun); docParagraph.AppendChild(docRun);
} }
@ -155,5 +148,75 @@ namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
_wordDocument.Dispose(); _wordDocument.Dispose();
} }
protected override void CreateTable(WordParagraph paragraph)
{
if (_docBody == null || paragraph == null)
{
return;
}
Table table = new Table();
var tableProp = new TableProperties();
tableProp.AppendChild(new TableLayout { Type = TableLayoutValues.Fixed });
tableProp.AppendChild(new TableBorders(
new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }
));
tableProp.AppendChild(new TableWidth { Type = TableWidthUnitValues.Auto });
table.AppendChild(tableProp);
TableGrid tableGrid = new TableGrid();
for (int j = 0; j < paragraph.RowTexts[0].Count; ++j)
{
tableGrid.AppendChild(new GridColumn() { Width = "3000" });
}
table.AppendChild(tableGrid);
for (int i = 0; i < paragraph.RowTexts.Count; ++i)
{
TableRow docRow = new TableRow();
for (int j = 0; j < paragraph.RowTexts[i].Count; ++j)
{
var docParagraph = new Paragraph();
docParagraph.AppendChild(CreateParagraphProperties(paragraph.RowTexts[i][j].Item2));
var docRun = new Run();
var properties = new RunProperties();
properties.AppendChild(new FontSize { Val = paragraph.RowTexts[i][j].Item2.Size });
if (paragraph.RowTexts[i][j].Item2.Bold)
{
properties.AppendChild(new Bold());
}
docRun.AppendChild(properties);
docRun.AppendChild(new Text { Text = paragraph.RowTexts[i][j].Item1, Space = SpaceProcessingModeValues.Preserve });
docParagraph.AppendChild(docRun);
TableCell docCell = new TableCell();
docCell.AppendChild(docParagraph);
docRow.AppendChild(docCell);
}
table.AppendChild(docRow);
}
_docBody.AppendChild(table);
}
} }
} }

View File

@ -13,6 +13,9 @@ namespace FurnitureAssemblyClientApp
// Поле, хранящее клиента, которого необходимо авторизовать // Поле, хранящее клиента, которого необходимо авторизовать
public static ClientViewModel? Client { get; set; } = null; public static ClientViewModel? Client { get; set; } = null;
// Для пагинации
public static int CurrentPage { get; set; } = 0;
public static void Connect(IConfiguration configuration) public static void Connect(IConfiguration configuration)
{ {
_client.BaseAddress = new Uri(configuration["IPAddress"]); _client.BaseAddress = new Uri(configuration["IPAddress"]);

View File

@ -3,6 +3,7 @@ using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyContracts.ViewModels;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Diagnostics; using System.Diagnostics;
using System.Text;
namespace FurnitureAssemblyClientApp.Controllers namespace FurnitureAssemblyClientApp.Controllers
{ {
@ -174,7 +175,6 @@ namespace FurnitureAssemblyClientApp.Controllers
// Для работы с письмами // Для работы с письмами
[HttpGet] [HttpGet]
[HttpGet]
public IActionResult Mails() public IActionResult Mails()
{ {
if (APIClient.Client == null) if (APIClient.Client == null)
@ -184,5 +184,48 @@ namespace FurnitureAssemblyClientApp.Controllers
return View(APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client.Id}")); return View(APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client.Id}"));
} }
// Возвращает кортеж с таблицой в html, текущей страницей писем, выключать ли кнопку пред. страницы, выключать ли кнопку след. страницы
[HttpGet]
public Tuple<string?, string?, bool, bool>? SwitchPage(bool isNext)
{
if (isNext)
{
APIClient.CurrentPage++;
}
else
{
if (APIClient.CurrentPage == 1)
{
return null;
}
APIClient.CurrentPage--;
}
var res = APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client!.Id}&page={APIClient.CurrentPage}");
if (isNext && (res == null || res.Count == 0))
{
APIClient.CurrentPage--;
return Tuple.Create<string?, string?, bool, bool>(null, null, APIClient.CurrentPage != 1, false);
}
StringBuilder htmlTable = new();
foreach (var mail in res)
{
htmlTable.Append("<tr>" +
$"<td>{mail.DateDelivery}</td>" +
$"<td>{mail.Subject}</td>" +
$"<td>{mail.Body}</td>" +
"<td>" + (mail.IsRead ? "Прочитано" : "Непрочитано") + "</td>" +
$"<td>{mail.Answer}</td>" +
"</tr>");
}
return Tuple.Create<string?, string?, bool, bool>(htmlTable.ToString(), APIClient.CurrentPage.ToString(), APIClient.CurrentPage != 1, true);
}
} }
} }

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
@ -7,7 +7,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.16" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,8 +3,8 @@
"windowsAuthentication": false, "windowsAuthentication": false,
"anonymousAuthentication": true, "anonymousAuthentication": true,
"iisExpress": { "iisExpress": {
"applicationUrl": "http://localhost:24381", "applicationUrl": "http://localhost:44103",
"sslPort": 44337 "sslPort": 44394
} }
}, },
"profiles": { "profiles": {
@ -12,7 +12,7 @@
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "https://localhost:7046;http://localhost:5147", "applicationUrl": "https://localhost:7218;http://localhost:5100",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -1,21 +1,11 @@
@using FurnitureAssemblyContracts.ViewModels @{
@model List<MessageInfoViewModel>
@{
ViewData["Title"] = "Mails"; ViewData["Title"] = "Mails";
} }
<div class="text-center"> <div class="text-center">
<h1 class="display-4">Заказы</h1> <h1 class="display-4">Письма</h1>
</div> </div>
<div class="text-center"> <div class="text-center">
@{
if (Model == null)
{
<h3 class="display-4">Авторизируйтесь</h3>
return;
}
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
@ -28,24 +18,67 @@
<th> <th>
Текст Текст
</th> </th>
<th>
Статус
</th>
<th>
Ответ
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="mails-table-body">
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.DateDelivery)
</td>
<td>
@Html.DisplayFor(modelItem => item.Subject)
</td>
<td>
@Html.DisplayFor(modelItem => item.Body)
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
} <ul class="pagination justify-content-center">
<li id="prev-page" class="page-item">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
<span class="sr-only">Предыдущая</span>
</a>
</li>
<li class="page-item">
<a id="current-page" class="page-link"></a>
</li>
<li id="next-page" class="page-item">
<a class="page-link" href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
<span class="sr-only">Следующая</span>
</a>
</li>
</ul>
</div> </div>
<script>
function onClicked(isNext) {
$.ajax({
method: "GET",
url: "/Home/SwitchPage",
data: { isNext: isNext },
success: function (result) {
if (result != null) {
if (result.item1 != null && result.item2 != null) {
$("#mails-table-body").html(result.item1);
$("#current-page").text(result.item2);
}
if (result.item3)
$("#prev-page").removeClass("page-item disabled");
else
$("#prev-page").addClass("page-item disabled");
if (result.item4)
$("#next-page").removeClass("page-item disabled");
else
$("#next-page").addClass("page-item disabled");
}
}
});
}
// Чтобы в первый раз загрузить данные и попасть на первую страницу
onClicked(true);
$("#prev-page").on('click', () => onClicked(false));
$("#next-page").on('click', () => onClicked(true));
</script>

View File

@ -7,6 +7,7 @@
<title>@ViewData["Title"] - FurnitureAssemblyClientApp</title> <title>@ViewData["Title"] - FurnitureAssemblyClientApp</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" /> <link rel="stylesheet" href="~/css/site.css" />
<link rel="stylesheet" href="~/FurnitureAssemblyClientApp.styles.css" asp-append-version="true" />
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script> <script src="~/js/site.js" asp-append-version="true"></script>
@ -26,10 +27,10 @@
<a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Index">Заказы</a> <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Index">Заказы</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Privacy">Личные данные</a> <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Mails">Письма</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Mails">Письма</a> <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Enter">Вход</a> <a class="nav-link text-dark" asparea="" asp-controller="Home" asp-action="Enter">Вход</a>

View File

@ -11,13 +11,14 @@ namespace FurnitureAssemblyContracts.Attributes
public class ColumnAttribute : Attribute public class ColumnAttribute : Attribute
{ {
public ColumnAttribute(string title = "", bool visible = true, int width = 0, public ColumnAttribute(string title = "", bool visible = true, int width = 0,
GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false, string format = "")
{ {
Title = title; Title = title;
Visible = visible; Visible = visible;
Width = width; Width = width;
GridViewAutoSize = gridViewAutoSize; GridViewAutoSize = gridViewAutoSize;
IsUseAutoSize = isUseAutoSize; IsUseAutoSize = isUseAutoSize;
Format = format;
} }
public string Title { get; private set; } public string Title { get; private set; }
@ -29,5 +30,7 @@ namespace FurnitureAssemblyContracts.Attributes
public GridViewAutoSize GridViewAutoSize { get; private set; } public GridViewAutoSize GridViewAutoSize { get; private set; }
public bool IsUseAutoSize { get; private set; } public bool IsUseAutoSize { get; private set; }
public string Format { get; private set; }
} }
} }

View File

@ -23,5 +23,9 @@ namespace FurnitureAssemblyContracts.BindingModels
public string Subject { get; set; } = string.Empty; public string Subject { get; set; } = string.Empty;
public string Body { get; set; } = string.Empty; public string Body { get; set; } = string.Empty;
public bool IsRead { get; set; } = false;
public string? Answer { get; set; } = string.Empty;
} }
} }

View File

@ -0,0 +1,25 @@
using FurnitureAssemblyDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.BindingModels
{
// Реализация сущности "Магазин"
public class ShopBindingModel : IShopModel
{
public string ShopName { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public DateTime DateOpen { get; set; } = DateTime.Now;
public Dictionary<int, (IFurnitureModel, int)> ShopFurnitures { get; set; } = new();
public int Id { get; set; }
public int MaxCountFurnitures { get; set; }
}
}

View File

@ -14,6 +14,10 @@ namespace FurnitureAssemblyContracts.BusinessLogicsContracts
{ {
List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model); List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
MessageInfoViewModel? ReadElement(MessageInfoSearchModel model);
bool Create(MessageInfoBindingModel model); bool Create(MessageInfoBindingModel model);
bool Update(MessageInfoBindingModel model);
} }
} }

View File

@ -13,16 +13,31 @@ namespace FurnitureAssemblyContracts.BusinessLogicsContracts
// Получение списка заготовок с указанием, в каких изделиях используются // Получение списка заготовок с указанием, в каких изделиях используются
List<ReportFurnitureWorkPieceViewModel> GetFurnitureWorkPiece(); List<ReportFurnitureWorkPieceViewModel> GetFurnitureWorkPiece();
//Получение списка мороженых с указанием, в каких магазинах в наличии
List<ReportShopFurnituresViewModel> GetShopFurnitures();
// Получение списка заказов за определённый период // Получение списка заказов за определённый период
List<ReportOrdersViewModel> GetOrders(ReportBindingModel model); List<ReportOrdersViewModel> GetOrders(ReportBindingModel model);
//Получение списка заказов за весь период
List<ReportGroupedOrdersViewModel> GetGroupedOrders();
// Сохранение изделий в файл-Word // Сохранение изделий в файл-Word
void SaveFurnituresToWordFile(ReportBindingModel model); void SaveFurnituresToWordFile(ReportBindingModel model);
//Сохранение магазинов в виде таблицы в файл-Word
void SaveShopsToWordFile(ReportBindingModel model);
// Сохранение заготовок с указанием изделий в файл-Excel // Сохранение заготовок с указанием изделий в файл-Excel
void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model); void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model);
//Сохранение магазинов с указанием мороженых в файл-Excel
void SaveShopFurnituresToExcelFile(ReportBindingModel model);
// Сохранение заказов в файл-Pdf // Сохранение заказов в файл-Pdf
void SaveOrdersToPdfFile(ReportBindingModel model); void SaveOrdersToPdfFile(ReportBindingModel model);
//Сохранение заказов за весь период в файл-Pdf
void SaveGroupedOrdersToPdfFile(ReportBindingModel model);
} }
} }

View File

@ -0,0 +1,32 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.BusinessLogicsContracts
{
// Бизнес-логика для магазина
public interface IShopLogic
{
List<ShopViewModel>? ReadList(ShopSearchModel? model);
ShopViewModel? ReadElement(ShopSearchModel model);
bool Create(ShopBindingModel model);
bool Update(ShopBindingModel model);
bool Delete(ShopBindingModel model);
bool AddFurniture(ShopSearchModel model, IFurnitureModel furniture, int count);
bool SellFurnitures(IFurnitureModel model, int count);
bool AddFurnitures(IFurnitureModel model, int count);
}
}

View File

@ -9,7 +9,7 @@ namespace FurnitureAssemblyContracts.BusinessLogicsContracts
// Интерфейс для класса, имитирующего работу // Интерфейс для класса, имитирующего работу
public interface IWorkProcess public interface IWorkProcess
{ {
// Запуск работы // Запуск работ
void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic);
} }
} }

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.DI namespace FurnitureAssemblyContracts.DI
{ {
// Менеджер для работы с зависимостями /// Менеджер для работы с зависимостями
public class DependencyManager public class DependencyManager
{ {
private readonly IDependencyContainer _dependencyManager; private readonly IDependencyContainer _dependencyManager;
@ -31,7 +31,7 @@ namespace FurnitureAssemblyContracts.DI
} }
} }
// Инициализация библиотек, в которых идут установки зависимостей // Иницализация библиотек, в которых идут установки зависомстей
public static void InitDependency() public static void InitDependency()
{ {
var ext = ServiceProviderLoader.GetImplementationExtensions(); var ext = ServiceProviderLoader.GetImplementationExtensions();
@ -41,8 +41,18 @@ namespace FurnitureAssemblyContracts.DI
throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям");
} }
// Регистрируем зависимости // Регистрируем зависимости хранилищ
ext.RegisterServices(); ext.RegisterServices();
var extBusiness = ServiceProviderLoader.GetBusinessLogicImplementationExtensions();
if (extBusiness == null)
{
throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям");
}
// Регистрируем зависимости бизнес-логики
extBusiness.RegisterServices();
} }
// Регистрация логгера // Регистрация логгера
@ -54,7 +64,8 @@ namespace FurnitureAssemblyContracts.DI
// Добавление зависимости // Добавление зависимости
public void RegisterType<T>(bool isSingle = false) where T : class => _dependencyManager.RegisterType<T>(isSingle); public void RegisterType<T>(bool isSingle = false) where T : class => _dependencyManager.RegisterType<T>(isSingle);
// Получение класса со всеми зависимостями // Получение класса со всеми зависмостями
public T Resolve<T>() => _dependencyManager.Resolve<T>(); public T Resolve<T>() => _dependencyManager.Resolve<T>();
} }
} }

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.DI
{
public interface IBusinessLogicImplementationExtension
{
public int Priority { get; }
// Регистрация сервисов
public void RegisterServices();
}
}

View File

@ -10,17 +10,16 @@ namespace FurnitureAssemblyContracts.DI
// Интерфейс установки зависимости между элементами // Интерфейс установки зависимости между элементами
public interface IDependencyContainer public interface IDependencyContainer
{ {
// Регистрация логгера //Регистрация логгера
void AddLogging(Action<ILoggingBuilder> configure); void AddLogging(Action<ILoggingBuilder> configure);
// Добавление зависимости //Добавление зависимости
void RegisterType<T, U>(bool isSingle) where U : class, T where T : void RegisterType<T, U>(bool isSingle) where U : class, T where T : class;
class;
// Добавление зависимости //Добавление зависимости
void RegisterType<T>(bool isSingle) where T : class; void RegisterType<T>(bool isSingle) where T : class;
// Получение класса со всеми зависимостями //Получение класса со всеми зависимостями
T Resolve<T>(); T Resolve<T>();
} }
} }

View File

@ -34,7 +34,6 @@ namespace FurnitureAssemblyContracts.DI
{ {
_serviceCollection.AddTransient<T, U>(); _serviceCollection.AddTransient<T, U>();
} }
_serviceProvider = null; _serviceProvider = null;
} }
@ -48,7 +47,6 @@ namespace FurnitureAssemblyContracts.DI
{ {
_serviceCollection.AddTransient<T>(); _serviceCollection.AddTransient<T>();
} }
_serviceProvider = null; _serviceProvider = null;
} }
@ -58,7 +56,6 @@ namespace FurnitureAssemblyContracts.DI
{ {
_serviceProvider = _serviceCollection.BuildServiceProvider(); _serviceProvider = _serviceCollection.BuildServiceProvider();
} }
return _serviceProvider.GetService<T>()!; return _serviceProvider.GetService<T>()!;
} }
} }

View File

@ -57,5 +57,51 @@ namespace FurnitureAssemblyContracts.DI
return $"{directory?.FullName}\\ImplementationExtensions"; return $"{directory?.FullName}\\ImplementationExtensions";
} }
public static IBusinessLogicImplementationExtension? GetBusinessLogicImplementationExtensions()
{
IBusinessLogicImplementationExtension? source = null;
var files = Directory.GetFiles(TryGetBusinessLogicImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories);
foreach (var file in files.Distinct())
{
Assembly asm = Assembly.LoadFrom(file);
foreach (var t in asm.GetExportedTypes())
{
if (t.IsClass && typeof(IBusinessLogicImplementationExtension).IsAssignableFrom(t))
{
if (source == null)
{
source = (IBusinessLogicImplementationExtension)Activator.CreateInstance(t)!;
}
else
{
var newSource = (IBusinessLogicImplementationExtension)Activator.CreateInstance(t)!;
if (newSource.Priority > source.Priority)
{
source = newSource;
}
}
}
}
}
return source;
}
private static string TryGetBusinessLogicImplementationExtensionsFolder()
{
var directory = new DirectoryInfo(Directory.GetCurrentDirectory());
while (directory != null && !directory.GetDirectories("BusinessLogicImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "BusinessLogicImplementationExtensions"))
{
directory = directory.Parent;
}
return $"{directory?.FullName}\\BusinessLogicImplementationExtensions";
}
} }
} }

View File

@ -27,6 +27,7 @@ namespace FurnitureAssemblyContracts.DI
public void RegisterType<T>(bool isSingle) where T : class public void RegisterType<T>(bool isSingle) where T : class
{ {
_container.RegisterType<T>(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); _container.RegisterType<T>(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient);
} }
public T Resolve<T>() public T Resolve<T>()

View File

@ -8,8 +8,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Unity" Version="5.10.0" /> <PackageReference Include="Unity" Version="5.11.10" />
<PackageReference Include="Unity.Microsoft.Logging" Version="5.10.0" /> <PackageReference Include="Unity.Microsoft.Logging" Version="5.11.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -13,6 +13,8 @@ namespace FurnitureAssemblyContracts.SearchModels
public string? Email { get; set; } public string? Email { get; set; }
public string? ClientFIO { get; set; }
public string? Password { get; set; } public string? Password { get; set; }
} }
} }

View File

@ -12,5 +12,9 @@ namespace FurnitureAssemblyContracts.SearchModels
public string? MessageId { get; set; } public string? MessageId { get; set; }
public int? ClientId { get; set; } public int? ClientId { get; set; }
public int? Page { get; set; }
public int? PageSize { get; set; }
} }
} }

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.SearchModels
{
// Для поиска сущности "Магазин"
public class ShopSearchModel
{
// Для поиска по идентификатору
public int? Id { get; set; }
// Для поиска по названию
public string? ShopName { get; set; }
}
}

View File

@ -19,5 +19,7 @@ namespace FurnitureAssemblyContracts.StoragesContracts
MessageInfoViewModel? GetElement(MessageInfoSearchModel model); MessageInfoViewModel? GetElement(MessageInfoSearchModel model);
MessageInfoViewModel? Insert(MessageInfoBindingModel model); MessageInfoViewModel? Insert(MessageInfoBindingModel model);
MessageInfoViewModel? Update(MessageInfoBindingModel model);
} }
} }

View File

@ -0,0 +1,30 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.StoragesContracts
{
// Класс для хранилища магазинов
public interface IShopStorage
{
List<ShopViewModel> GetFullList();
List<ShopViewModel> GetFilteredList(ShopSearchModel model);
ShopViewModel? GetElement(ShopSearchModel model);
ShopViewModel? Insert(ShopBindingModel model);
ShopViewModel? Update(ShopBindingModel model);
ShopViewModel? Delete(ShopBindingModel model);
bool SellFurnitures(IFurnitureModel model, int count);
}
}

View File

@ -18,7 +18,7 @@ namespace FurnitureAssemblyContracts.ViewModels
[Column(title: "ФИО клиента", width: 150)] [Column(title: "ФИО клиента", width: 150)]
public string ClientFIO { get; set; } = string.Empty; public string ClientFIO { get; set; } = string.Empty;
[Column(title: "Логин (эл. почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] [Column(title: "Логин (электронная почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)]
public string Email { get; set; } = string.Empty; public string Email { get; set; } = string.Empty;
[Column(title: "Пароль", width: 150)] [Column(title: "Пароль", width: 150)]

View File

@ -18,7 +18,7 @@ namespace FurnitureAssemblyContracts.ViewModels
[Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)]
public string FurnitureName { get; set; } = string.Empty; public string FurnitureName { get; set; } = string.Empty;
[Column(title: "Цена", width: 150)] [Column(title: "Цена", width: 150, format: "0.00")]
public double Price { get; set; } public double Price { get; set; }
[Column(visible: false)] [Column(visible: false)]

View File

@ -24,13 +24,19 @@ namespace FurnitureAssemblyContracts.ViewModels
[Column(title: "Отправитель", width: 150)] [Column(title: "Отправитель", width: 150)]
public string SenderName { get; set; } = string.Empty; public string SenderName { get; set; } = string.Empty;
[Column(title: "Дата отправки", width: 150)] [Column(title: "Дата отправки", width: 150, format: "D")]
public DateTime DateDelivery { get; set; } = DateTime.Now; public DateTime DateDelivery { get; set; } = DateTime.Now;
[Column(title: "Заголовок", width: 150)] [Column(title: "Заголовок", width: 150)]
public string Subject { get; set; } = string.Empty; public string Subject { get; set; } = string.Empty;
[Column(title: "Текст", width: 150)] [DisplayName("Текст")]
public string Body { get; set; } = string.Empty; public string Body { get; set; } = string.Empty;
[DisplayName("Прочитано")]
public bool IsRead { get; set; } = false;
[DisplayName("Ответ")]
public string? Answer { get; set; }
} }
} }

View File

@ -37,16 +37,16 @@ namespace FurnitureAssemblyContracts.ViewModels
[Column(title: "Количество", width: 150)] [Column(title: "Количество", width: 150)]
public int Count { get; set; } public int Count { get; set; }
[Column(title: "Сумма", width: 150)] [Column(title: "Сумма", width: 150, format: "0.00")]
public double Sum { get; set; } public double Sum { get; set; }
[Column(title: "Статус", width: 150)] [Column(title: "Статус", width: 150)]
public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; public OrderStatus Status { get; set; } = OrderStatus.Неизвестен;
[Column(title: "Дата создания", width: 150)] [Column(title: "Дата создания", width: 150, format: "D")]
public DateTime DateCreate { get; set; } = DateTime.Now; public DateTime DateCreate { get; set; } = DateTime.Now;
[Column(title: "Дата выполнения", width: 150)] [Column(title: "Дата выполнения", width: 150, format: "f")]
public DateTime? DateImplement { get; set; } public DateTime? DateImplement { get; set; }
} }
} }

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.ViewModels
{
public class ReportGroupedOrdersViewModel
{
public DateTime DateCreate { get; set; }
public int Count { get; set; }
public double Sum { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyContracts.ViewModels
{
public class ReportShopFurnituresViewModel
{
public string ShopName { get; set; } = string.Empty;
public int TotalCount { get; set; }
public List<(string Furniture, int Count)> Furnitures { get; set; } = new();
}
}

View File

@ -0,0 +1,36 @@
using FurnitureAssemblyContracts.Attributes;
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 ShopViewModel
{
[Column(visible: false)]
public int Id { get; set; }
[Column(title: "Название магазина", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)]
public string ShopName { get; set; } = string.Empty;
[Column(title: "Адрес магазина", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)]
public string Address { get; set; } = string.Empty;
[Column(title: "Дата открытия", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true, format: "f")]
public DateTime DateOpen { get; set; } = DateTime.Now;
[Column(visible: false)]
public Dictionary<int, (IFurnitureModel, int)> ShopFurnitures { get; set; } = new();
[Column(title: "Вместимость магазина", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)]
public int MaxCountFurnitures { get; set; }
[Column(visible: false)]
public List<Tuple<string, int>>? FurnitureCount { get; set; } = new();
}
}

View File

@ -15,7 +15,7 @@ namespace FurnitureAssemblyContracts.ViewModels
[Column(visible: false)] [Column(visible: false)]
public int Id { get; set; } public int Id { get; set; }
[Column(title: "Название заготовки", width: 150)] [Column(title: "Название заготовки", width: 150, format: "0.00")]
public string WorkPieceName { get; set; } = string.Empty; public string WorkPieceName { get; set; } = string.Empty;
[Column(title: "Цена", width: 150)] [Column(title: "Цена", width: 150)]

View File

@ -17,6 +17,8 @@ namespace FurnitureAssemblyDataModels.Enums
Готов = 2, Готов = 2,
Выдан = 3 Выдан = 3,
Ожидание = 4
} }
} }

View File

@ -20,5 +20,9 @@ namespace FurnitureAssemblyDataModels.Models
string Subject { get; } string Subject { get; }
string Body { get; } string Body { get; }
public bool IsRead { get; }
public string Answer { get; }
} }
} }

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyDataModels.Models
{
// Интерфейс сущности "Магазин"
public interface IShopModel : IId
{
// Название магазина
string ShopName { get; }
// Адрес магазина
string Address { get; }
// Дата открытия магазина
DateTime DateOpen { get; }
//максимальное кол-во изделий в магазине
int MaxCountFurnitures { get; }
// Изделия в магазине
Dictionary<int, (IFurnitureModel, int)> ShopFurnitures { get; }
}
}

View File

@ -27,6 +27,8 @@ namespace FurnitureAssemblyDatabaseImplement
DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>(); DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>();
DependencyManager.Instance.RegisterType<IShopStorage, ShopStorage>();
DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>(); DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>();
} }
} }

View File

@ -14,7 +14,7 @@ namespace FurnitureAssemblyDatabaseImplement
{ {
if (optionsBuilder.IsConfigured == false) if (optionsBuilder.IsConfigured == false)
{ {
optionsBuilder.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=FurnitureAssemblyDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); optionsBuilder.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=FurnitureAssemblyDatabaseFull;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
} }
base.OnConfiguring(optionsBuilder); base.OnConfiguring(optionsBuilder);
@ -28,6 +28,10 @@ namespace FurnitureAssemblyDatabaseImplement
public virtual DbSet<Order> Orders { set; get; } public virtual DbSet<Order> Orders { set; get; }
public virtual DbSet<Shop> Shops { set; get; }
public virtual DbSet<ShopFurniture> ShopFurnitures { get; set; }
public virtual DbSet<Client> Clients { set; get; } public virtual DbSet<Client> Clients { set; get; }
public virtual DbSet<Implementer> Implementers { set; get; } public virtual DbSet<Implementer> Implementers { set; get; }

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
@ -20,10 +20,6 @@
<ProjectReference Include="..\FurnitureAssemblyDataModels\FurnitureAssemblyDataModels.csproj" /> <ProjectReference Include="..\FurnitureAssemblyDataModels\FurnitureAssemblyDataModels.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy /Y &quot;$(TargetDir)*.dll&quot; &quot;$(SolutionDir)ImplementationExtensions\*.dll&quot;" /> <Exec Command="copy /Y &quot;$(TargetDir)*.dll&quot; &quot;$(SolutionDir)ImplementationExtensions\*.dll&quot;" />
</Target> </Target>

View File

@ -19,34 +19,18 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
if (model.Id.HasValue) 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<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
{ {
if (model == null)
{
return new();
}
if (model.ImplementerFIO != null)
{
using var context = new FurnitureAssemblyDatabase();
return context.Implementers return context.Implementers
.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) .Include(x => x.Orders)
.Select(x => x.GetViewModel) .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
.ToList(); ?.GetViewModel;
}
else if (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password))
{
return context.Implementers
.Include(x => x.Orders)
.FirstOrDefault(x => (x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password))
?.GetViewModel;
} }
return new(); return new();
@ -56,52 +40,92 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
return context.Implementers.Select(x => x.GetViewModel).ToList(); return context.Implementers
.Include(x => x.Orders)
.Select(x => x.GetViewModel)
.ToList();
}
public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
{
if (string.IsNullOrEmpty(model.ImplementerFIO))
{
return new();
}
using var context = new FurnitureAssemblyDatabase();
return context.Implementers
.Include(x => x.Orders)
.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO))
.Select(x => x.GetViewModel)
.ToList();
} }
public ImplementerViewModel? Insert(ImplementerBindingModel model) public ImplementerViewModel? Insert(ImplementerBindingModel model)
{ {
using var context = new FurnitureAssemblyDatabase(); var newImplementer = Implementer.Create(model);
var res = Implementer.Create(model); if (newImplementer == null)
if (res != null)
{ {
context.Implementers.Add(res); return null;
context.SaveChanges();
} }
return res?.GetViewModel; using var context = new FurnitureAssemblyDatabase();
context.Implementers.Add(newImplementer);
context.SaveChanges();
return context.Implementers
.Include(x => x.Orders)
.FirstOrDefault(x => x.Id == newImplementer.Id)
?.GetViewModel;
} }
public ImplementerViewModel? Update(ImplementerBindingModel model) public ImplementerViewModel? Update(ImplementerBindingModel model)
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
var res = context.Implementers.FirstOrDefault(x => x.Id == model.Id); var order = context.Implementers
.Include(x => x.Orders)
.FirstOrDefault(x => x.Id == model.Id);
if (res != null) if (order == null)
{ {
res.Update(model); return null;
context.SaveChanges();
} }
return res?.GetViewModel; order.Update(model);
context.SaveChanges();
return context.Implementers
.Include(x => x.Orders)
.FirstOrDefault(x => x.Id == model.Id)
?.GetViewModel;
} }
public ImplementerViewModel? Delete(ImplementerBindingModel model) public ImplementerViewModel? Delete(ImplementerBindingModel model)
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
var res = context.Implementers.FirstOrDefault(x => x.Id == model.Id); var element = context.Implementers
.FirstOrDefault(rec => rec.Id == model.Id);
if (res != null) if (element != null)
{ {
context.Implementers.Remove(res); // для отображения КОРРЕКТНОЙ ViewModel-и
var deletedElement = context.Implementers
.Include(x => x.Orders)
.FirstOrDefault(x => x.Id == model.Id)
?.GetViewModel;
context.Implementers.Remove(element);
context.SaveChanges(); context.SaveChanges();
return deletedElement;
} }
return res?.GetViewModel; return null;
} }
} }
} }

View File

@ -24,7 +24,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
return context.Messages return context.Messages
.FirstOrDefault(x => (x.MessageId == model.MessageId)) .FirstOrDefault(x => (x.MessageId.Equals(model.MessageId)))
?.GetViewModel; ?.GetViewModel;
} }
@ -32,10 +32,26 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
return context.Messages var list = new List<MessageInfoViewModel>();
if (model.ClientId.HasValue)
{
list = context.Messages
.Where(x => x.ClientId.HasValue && x.ClientId == model.ClientId) .Where(x => x.ClientId.HasValue && x.ClientId == model.ClientId)
.Select(x => x.GetViewModel) .Select(x => x.GetViewModel).ToList();
.ToList(); }
else
{
list = context.Messages
.Select(x => x.GetViewModel).ToList();
}
if (!(model.Page.HasValue && model.PageSize.HasValue))
{
return list.ToList();
}
return list.Skip((model.Page.Value - 1) * model.PageSize.Value).Take(model.PageSize.Value).ToList();
} }
public List<MessageInfoViewModel> GetFullList() public List<MessageInfoViewModel> GetFullList()
@ -63,5 +79,25 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
return newMessage.GetViewModel; return newMessage.GetViewModel;
} }
public MessageInfoViewModel? Update(MessageInfoBindingModel model)
{
using var context = new FurnitureAssemblyDatabase();
var message = context.Messages
.FirstOrDefault(x => x.MessageId.Equals(model.MessageId));
if (message == null)
{
return null;
}
message.Update(model);
context.SaveChanges();
return context.Messages
.FirstOrDefault(x => x.MessageId.Equals(model.MessageId))
?.GetViewModel;
}
} }
} }

View File

@ -16,36 +16,48 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
{ {
public OrderViewModel? GetElement(OrderSearchModel model) public OrderViewModel? GetElement(OrderSearchModel model)
{ {
using var context = new FurnitureAssemblyDatabase();
if (model.ImplementerId.HasValue && model.Status.HasValue)
{
return context.Orders
.Include(x => x.Furniture).Include(x => x.Client).Include(x => x.Implementer)
.FirstOrDefault(x => x.ImplementerId == model.ImplementerId && x.Status == model.Status)
?.GetViewModel;
}
if (model.ImplementerId.HasValue)
{
return context.Orders
.Include(x => x.Furniture).Include(x => x.Client).Include(x => x.Implementer)
.FirstOrDefault(x => x.ImplementerId == model.ImplementerId)?.GetViewModel;
}
if (!model.Id.HasValue) if (!model.Id.HasValue)
{ {
return null; return null;
} }
return context.Orders
using var context = new FurnitureAssemblyDatabase(); .Include(x => x.Furniture).Include(x => x.Client).Include(x => x.Implementer)
.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<OrderViewModel> GetFilteredList(OrderSearchModel model) public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
{ {
using var context = new FurnitureAssemblyDatabase();
if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue && model.Status == null) if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue && model.Status == null)
{ {
return new(); return new();
} }
using var context = new FurnitureAssemblyDatabase();
return context.Orders return context.Orders
.Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo || .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo ||
x.ClientId == model.ClientId || model.Status.Equals(x.Status)) x.ClientId == model.ClientId || model.Status.Equals(x.Status))
.Include(x => x.Furniture).Include(x => x.Client) .Include(x => x.Furniture)
.Include(x => x.Implementer).Select(x => x.GetViewModel) .Include(x => x.Client)
.Include(x => x.Implementer)
.Select(x => x.GetViewModel)
.ToList(); .ToList();
} }
public List<OrderViewModel> GetFullList() public List<OrderViewModel> GetFullList()
@ -53,8 +65,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
return context.Orders.Include(x => x.Furniture).Include(x => x.Client) return context.Orders.Include(x => x.Furniture).Include(x => x.Client)
.Include(x => x.Implementer) .Include(x => x.Implementer).Select(x => x.GetViewModel).ToList();
.Select(x => x.GetViewModel).ToList();
} }
public OrderViewModel? Insert(OrderBindingModel model) public OrderViewModel? Insert(OrderBindingModel model)
@ -67,7 +78,6 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
} }
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
context.Orders.Add(newOrder); context.Orders.Add(newOrder);
context.SaveChanges(); context.SaveChanges();
@ -78,11 +88,7 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
public OrderViewModel? Update(OrderBindingModel model) public OrderViewModel? Update(OrderBindingModel model)
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
var order = context.Orders var order = context.Orders.FirstOrDefault(x => x.Id == model.Id);
.Include(x => x.Furniture)
.Include(x => x.Client)
.Include(x => x.Implementer)
.FirstOrDefault(x => x.Id == model.Id);
if (order == null) if (order == null)
{ {
@ -92,24 +98,23 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
order.Update(model); order.Update(model);
context.SaveChanges(); context.SaveChanges();
return context.Orders return context.Orders.Include(x => x.Furniture).Include(x => x.Client)
.Include(x => x.Furniture) .Include(x => x.Implementer).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
.Include(x => x.Client)
.Include(x => x.Implementer)
.FirstOrDefault(x => x.Id == model.Id)
?.GetViewModel;
} }
public OrderViewModel? Delete(OrderBindingModel model) public OrderViewModel? Delete(OrderBindingModel model)
{ {
using var context = new FurnitureAssemblyDatabase(); using var context = new FurnitureAssemblyDatabase();
var element = context.Orders.FirstOrDefault(rec => rec.Id == model.Id); var element = context.Orders.Include(x => x.Furniture).Include(x => x.Client)
.FirstOrDefault(rec => rec.Id == model.Id);
if (element != null) if (element != null)
{ {
// для более корректного отображения модели // для отображения корректной ViewModel-и
var deletedElement = context.Orders.Include(x => x.Furniture).Include(x => x.Client) var deletedElement = context.Orders
.Include(x => x.Implementer).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; .Include(x => x.Furniture)
.Include(x => x.Client).Include(x => x.Implementer)
.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
context.Orders.Remove(element); context.Orders.Remove(element);
context.SaveChanges(); context.SaveChanges();

View File

@ -0,0 +1,179 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.StoragesContracts;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDatabaseImplement.Models;
using FurnitureAssemblyDataModels.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 ShopStorage : IShopStorage
{
public List<ShopViewModel> GetFullList()
{
using var context = new FurnitureAssemblyDatabase();
return context.Shops
.Include(x => x.Furnitures)
.ThenInclude(x => x.Furniture)
.ToList()
.Select(x => x.GetViewModel)
.ToList();
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName))
{
return new();
}
using var context = new FurnitureAssemblyDatabase();
return context.Shops
.Include(x => x.Furnitures)
.ThenInclude(x => x.Furniture)
.Where(x => x.ShopName.Contains(model.ShopName))
.ToList()
.Select(x => x.GetViewModel)
.ToList();
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
using var context = new FurnitureAssemblyDatabase();
return context.Shops
.Include(x => x.Furnitures)
.ThenInclude(x => x.Furniture)
.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) ||
(model.Id.HasValue && x.Id == model.Id))
?.GetViewModel;
}
public ShopViewModel? Insert(ShopBindingModel model)
{
using var context = new FurnitureAssemblyDatabase();
var newShop = Shop.Create(context, model);
if (newShop == null)
{
return null;
}
context.Shops.Add(newShop);
context.SaveChanges();
return newShop.GetViewModel;
}
public ShopViewModel? Update(ShopBindingModel model)
{
using var context = new FurnitureAssemblyDatabase();
using var transaction = context.Database.BeginTransaction();
try
{
var shop = context.Shops.FirstOrDefault(rec => rec.Id == model.Id);
if (shop == null)
{
return null;
}
shop.Update(model);
context.SaveChanges();
shop.UpdateFurnitures(context, model);
transaction.Commit();
return shop.GetViewModel;
}
catch
{
transaction.Rollback();
throw;
}
}
public ShopViewModel? Delete(ShopBindingModel model)
{
using var context = new FurnitureAssemblyDatabase();
var element = context.Shops
.Include(x => x.Furnitures)
.FirstOrDefault(rec => rec.Id == model.Id);
if (element != null)
{
context.Shops.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public bool SellFurnitures(IFurnitureModel model, int count)
{
using var context = new FurnitureAssemblyDatabase();
using var transaction = context.Database.BeginTransaction();
try
{
var shops = context.ShopFurnitures
.Include(x => x.Shop)
.ToList()
.Where(rec => rec.FurnitureId == model.Id);
if (shops == null)
{
return false;
}
foreach (var shop in shops)
{
if (shop.Count < count)
{
count -= shop.Count;
shop.Count = 0;
}
else
{
shop.Count = shop.Count - count;
count -= count;
}
if (count == 0)
{
context.SaveChanges();
transaction.Commit();
return true;
}
}
transaction.Rollback();
return false;
}
catch
{
transaction.Rollback();
throw;
}
}
}
}

View File

@ -12,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace FurnitureAssemblyDatabaseImplement.Migrations namespace FurnitureAssemblyDatabaseImplement.Migrations
{ {
[DbContext(typeof(FurnitureAssemblyDatabase))] [DbContext(typeof(FurnitureAssemblyDatabase))]
[Migration("20240518234238_InitialCreate")] [Migration("20240518232845_InitialCreate")]
partial class InitialCreate partial class InitialCreate
{ {
/// <inheritdoc /> /// <inheritdoc />
@ -128,6 +128,9 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Property<string>("MessageId") b.Property<string>("MessageId")
.HasColumnType("nvarchar(450)"); .HasColumnType("nvarchar(450)");
b.Property<string>("Answer")
.HasColumnType("nvarchar(max)");
b.Property<string>("Body") b.Property<string>("Body")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
@ -138,6 +141,9 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Property<DateTime>("DateDelivery") b.Property<DateTime>("DateDelivery")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<bool>("IsRead")
.HasColumnType("bit");
b.Property<string>("SenderName") b.Property<string>("SenderName")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
@ -196,6 +202,59 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.ToTable("Orders"); b.ToTable("Orders");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("DateOpen")
.HasColumnType("datetime2");
b.Property<int>("MaxCountFurnitures")
.HasColumnType("int");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.ShopFurniture", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("FurnitureId")
.HasColumnType("int");
b.Property<int>("ShopId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("FurnitureId");
b.HasIndex("ShopId");
b.ToTable("ShopFurnitures");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -259,7 +318,7 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
.IsRequired(); .IsRequired();
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer") b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer")
.WithMany("Order") .WithMany("Orders")
.HasForeignKey("ImplementerId"); .HasForeignKey("ImplementerId");
b.Navigation("Client"); b.Navigation("Client");
@ -269,6 +328,25 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Navigation("Implementer"); b.Navigation("Implementer");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.ShopFurniture", b =>
{
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Furniture", "Furniture")
.WithMany("Shops")
.HasForeignKey("FurnitureId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Shop", "Shop")
.WithMany("Furnitures")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Furniture");
b.Navigation("Shop");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b =>
{ {
b.Navigation("Messages"); b.Navigation("Messages");
@ -280,12 +358,19 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
{ {
b.Navigation("Orders"); b.Navigation("Orders");
b.Navigation("Shops");
b.Navigation("WorkPieces"); b.Navigation("WorkPieces");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b =>
{ {
b.Navigation("Order"); b.Navigation("Orders");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Shop", b =>
{
b.Navigation("Furnitures");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b =>

View File

@ -56,6 +56,22 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
table.PrimaryKey("PK_Implementers", x => x.Id); table.PrimaryKey("PK_Implementers", x => x.Id);
}); });
migrationBuilder.CreateTable(
name: "Shops",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
ShopName = table.Column<string>(type: "nvarchar(max)", nullable: false),
Address = table.Column<string>(type: "nvarchar(max)", nullable: false),
DateOpen = table.Column<DateTime>(type: "datetime2", nullable: false),
MaxCountFurnitures = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Shops", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "WorkPieces", name: "WorkPieces",
columns: table => new columns: table => new
@ -76,10 +92,12 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
{ {
MessageId = table.Column<string>(type: "nvarchar(450)", nullable: false), MessageId = table.Column<string>(type: "nvarchar(450)", nullable: false),
ClientId = table.Column<int>(type: "int", nullable: true), ClientId = table.Column<int>(type: "int", nullable: true),
IsRead = table.Column<bool>(type: "bit", nullable: false),
SenderName = table.Column<string>(type: "nvarchar(max)", nullable: false), SenderName = table.Column<string>(type: "nvarchar(max)", nullable: false),
DateDelivery = table.Column<DateTime>(type: "datetime2", nullable: false), DateDelivery = table.Column<DateTime>(type: "datetime2", nullable: false),
Subject = table.Column<string>(type: "nvarchar(max)", nullable: false), Subject = table.Column<string>(type: "nvarchar(max)", nullable: false),
Body = table.Column<string>(type: "nvarchar(max)", nullable: false) Body = table.Column<string>(type: "nvarchar(max)", nullable: false),
Answer = table.Column<string>(type: "nvarchar(max)", nullable: true)
}, },
constraints: table => constraints: table =>
{ {
@ -128,6 +146,33 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
principalColumn: "Id"); principalColumn: "Id");
}); });
migrationBuilder.CreateTable(
name: "ShopFurnitures",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
ShopId = table.Column<int>(type: "int", nullable: false),
FurnitureId = table.Column<int>(type: "int", nullable: false),
Count = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ShopFurnitures", x => x.Id);
table.ForeignKey(
name: "FK_ShopFurnitures_Furnitures_FurnitureId",
column: x => x.FurnitureId,
principalTable: "Furnitures",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_ShopFurnitures_Shops_ShopId",
column: x => x.ShopId,
principalTable: "Shops",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "FurnitureWorkPieces", name: "FurnitureWorkPieces",
columns: table => new columns: table => new
@ -184,6 +229,16 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
name: "IX_Orders_ImplementerId", name: "IX_Orders_ImplementerId",
table: "Orders", table: "Orders",
column: "ImplementerId"); column: "ImplementerId");
migrationBuilder.CreateIndex(
name: "IX_ShopFurnitures_FurnitureId",
table: "ShopFurnitures",
column: "FurnitureId");
migrationBuilder.CreateIndex(
name: "IX_ShopFurnitures_ShopId",
table: "ShopFurnitures",
column: "ShopId");
} }
/// <inheritdoc /> /// <inheritdoc />
@ -198,17 +253,23 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Orders"); name: "Orders");
migrationBuilder.DropTable(
name: "ShopFurnitures");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "WorkPieces"); name: "WorkPieces");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Clients"); name: "Clients");
migrationBuilder.DropTable(
name: "Implementers");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Furnitures"); name: "Furnitures");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Implementers"); name: "Shops");
} }
} }
} }

View File

@ -125,6 +125,9 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Property<string>("MessageId") b.Property<string>("MessageId")
.HasColumnType("nvarchar(450)"); .HasColumnType("nvarchar(450)");
b.Property<string>("Answer")
.HasColumnType("nvarchar(max)");
b.Property<string>("Body") b.Property<string>("Body")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
@ -135,6 +138,9 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Property<DateTime>("DateDelivery") b.Property<DateTime>("DateDelivery")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<bool>("IsRead")
.HasColumnType("bit");
b.Property<string>("SenderName") b.Property<string>("SenderName")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
@ -193,6 +199,59 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.ToTable("Orders"); b.ToTable("Orders");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("DateOpen")
.HasColumnType("datetime2");
b.Property<int>("MaxCountFurnitures")
.HasColumnType("int");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.ShopFurniture", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("FurnitureId")
.HasColumnType("int");
b.Property<int>("ShopId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("FurnitureId");
b.HasIndex("ShopId");
b.ToTable("ShopFurnitures");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -256,7 +315,7 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
.IsRequired(); .IsRequired();
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer") b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Implementer", "Implementer")
.WithMany("Order") .WithMany("Orders")
.HasForeignKey("ImplementerId"); .HasForeignKey("ImplementerId");
b.Navigation("Client"); b.Navigation("Client");
@ -266,6 +325,25 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
b.Navigation("Implementer"); b.Navigation("Implementer");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.ShopFurniture", b =>
{
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Furniture", "Furniture")
.WithMany("Shops")
.HasForeignKey("FurnitureId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("FurnitureAssemblyDatabaseImplement.Models.Shop", "Shop")
.WithMany("Furnitures")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Furniture");
b.Navigation("Shop");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Client", b =>
{ {
b.Navigation("Messages"); b.Navigation("Messages");
@ -277,12 +355,19 @@ namespace FurnitureAssemblyDatabaseImplement.Migrations
{ {
b.Navigation("Orders"); b.Navigation("Orders");
b.Navigation("Shops");
b.Navigation("WorkPieces"); b.Navigation("WorkPieces");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Implementer", b =>
{ {
b.Navigation("Order"); b.Navigation("Orders");
});
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.Shop", b =>
{
b.Navigation("Furnitures");
}); });
modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b => modelBuilder.Entity("FurnitureAssemblyDatabaseImplement.Models.WorkPiece", b =>

View File

@ -36,7 +36,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
{ {
get get
{ {
if(_furnitureWorkPieces == null) if (_furnitureWorkPieces == null)
{ {
_furnitureWorkPieces = WorkPieces _furnitureWorkPieces = WorkPieces
.ToDictionary(recPC => recPC.WorkPieceId, recPC => (recPC.WorkPiece as IWorkPieceModel, recPC.Count)); .ToDictionary(recPC => recPC.WorkPieceId, recPC => (recPC.WorkPiece as IWorkPieceModel, recPC.Count));
@ -53,6 +53,9 @@ namespace FurnitureAssemblyDatabaseImplement.Models
[ForeignKey("FurnitureId")] [ForeignKey("FurnitureId")]
public virtual List<Order> Orders { get; set; } = new(); public virtual List<Order> Orders { get; set; } = new();
[ForeignKey("FurnitureId")]
public virtual List<ShopFurniture> Shops { get; set; } = new();
public static Furniture Create(FurnitureAssemblyDatabase context, FurnitureBindingModel model) public static Furniture Create(FurnitureAssemblyDatabase context, FurnitureBindingModel model)
{ {
return new Furniture() return new Furniture()
@ -82,14 +85,11 @@ namespace FurnitureAssemblyDatabaseImplement.Models
FurnitureWorkPieces = FurnitureWorkPieces FurnitureWorkPieces = FurnitureWorkPieces
}; };
Dictionary<int, (IWorkPieceModel, int)> IFurnitureModel.FurnitureWorkPieces => throw new NotImplementedException();
public void UpdateWorkPieces(FurnitureAssemblyDatabase context, FurnitureBindingModel model) public void UpdateWorkPieces(FurnitureAssemblyDatabase context, FurnitureBindingModel model)
{ {
var furnitureWorkPieces = context.FurnitureWorkPieces.Where(rec => rec.FurnitureId == model.Id).ToList(); 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))); context.FurnitureWorkPieces.RemoveRange(furnitureWorkPieces.Where(rec => !model.FurnitureWorkPieces.ContainsKey(rec.FurnitureId)));
@ -107,13 +107,13 @@ namespace FurnitureAssemblyDatabaseImplement.Models
var furniture = context.Furnitures.First(x => x.Id == Id); var furniture = context.Furnitures.First(x => x.Id == Id);
foreach(var pc in model.FurnitureWorkPieces) foreach (var fwp in model.FurnitureWorkPieces)
{ {
context.FurnitureWorkPieces.Add(new FurnitureWorkPiece context.FurnitureWorkPieces.Add(new FurnitureWorkPiece
{ {
Furniture = furniture, Furniture = furniture,
WorkPiece = context.WorkPieces.First(x => x.Id == pc.Key), WorkPiece = context.WorkPieces.First(x => x.Id == fwp.Key),
Count = pc.Value.Item2 Count = fwp.Value.Item2
}); });
context.SaveChanges(); context.SaveChanges();

View File

@ -34,9 +34,9 @@ namespace FurnitureAssemblyDatabaseImplement.Models
[DataMember] [DataMember]
public int Qualification { get; set; } public int Qualification { get; set; }
// Для реализации связи один ко многим с заказами //для реализации связи один ко многим с заказами
[ForeignKey("ImplementerId")] [ForeignKey("ImplementerId")]
public virtual List<Order> Order { get; set; } = new(); public virtual List<Order> Orders { get; set; } = new();
public static Implementer? Create(ImplementerBindingModel model) public static Implementer? Create(ImplementerBindingModel model)
{ {

View File

@ -21,16 +21,28 @@ namespace FurnitureAssemblyDatabaseImplement.Models
[DataMember] [DataMember]
public string MessageId { get; set; } = string.Empty; public string MessageId { get; set; } = string.Empty;
[DataMember]
public int? ClientId { get; set; } public int? ClientId { get; set; }
public bool IsRead { get; private set; } = false;
[Required]
[DataMember]
public string SenderName { get; set; } = string.Empty; public string SenderName { get; set; } = string.Empty;
[Required]
[DataMember]
public DateTime DateDelivery { get; set; } = DateTime.Now; public DateTime DateDelivery { get; set; } = DateTime.Now;
[Required]
[DataMember]
public string Subject { get; set; } = string.Empty; public string Subject { get; set; } = string.Empty;
[DataMember]
public string Body { get; set; } = string.Empty; public string Body { get; set; } = string.Empty;
public string? Answer { get; private set; } = string.Empty;
public virtual Client? Client { get; set; } public virtual Client? Client { get; set; }
public static MessageInfo? Create(MessageInfoBindingModel model) public static MessageInfo? Create(MessageInfoBindingModel model)
@ -47,10 +59,23 @@ namespace FurnitureAssemblyDatabaseImplement.Models
SenderName = model.SenderName, SenderName = model.SenderName,
Body = model.Body, Body = model.Body,
DateDelivery = model.DateDelivery, DateDelivery = model.DateDelivery,
Subject = model.Subject Subject = model.Subject,
IsRead = model.IsRead,
Answer = model.Answer
}; };
} }
public void Update(MessageInfoBindingModel model)
{
if (model == null)
{
return;
}
IsRead = model.IsRead;
Answer = model.Answer;
}
public MessageInfoViewModel GetViewModel => new() public MessageInfoViewModel GetViewModel => new()
{ {
MessageId = MessageId, MessageId = MessageId,
@ -58,7 +83,9 @@ namespace FurnitureAssemblyDatabaseImplement.Models
SenderName = SenderName, SenderName = SenderName,
Body = Body, Body = Body,
DateDelivery = DateDelivery, DateDelivery = DateDelivery,
Subject = Subject Subject = Subject,
IsRead = IsRead,
Answer = Answer
}; };
} }
} }

View File

@ -0,0 +1,132 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.ViewModels;
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;
namespace FurnitureAssemblyDatabaseImplement.Models
{
public class Shop : IShopModel
{
public int Id { get; set; }
[Required]
public string ShopName { get; set; } = string.Empty;
[Required]
public string Address { get; set; } = string.Empty;
[Required]
public DateTime DateOpen { get; set; }
[Required]
public int MaxCountFurnitures { get; set; }
private Dictionary<int, (IFurnitureModel, int)>? _shopFurnitures = null;
[Required]
public Dictionary<int, (IFurnitureModel, int)> ShopFurnitures
{
get
{
if (_shopFurnitures == null)
{
_shopFurnitures = new();
Furnitures.ForEach(x =>
{
if (_shopFurnitures.ContainsKey(x.FurnitureId))
{
_shopFurnitures[x.FurnitureId] = (x.Furniture as IFurnitureModel, _shopFurnitures[x.FurnitureId].Item2 + x.Count);
}
else
{
_shopFurnitures[x.FurnitureId] = (x.Furniture as IFurnitureModel, x.Count);
}
});
}
return _shopFurnitures;
}
}
[ForeignKey("ShopId")]
public virtual List<ShopFurniture> Furnitures { get; set; } = new();
public static Shop? Create(FurnitureAssemblyDatabase context, ShopBindingModel model)
{
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
DateOpen = model.DateOpen,
Furnitures = model.ShopFurnitures.Select(x => new ShopFurniture
{
Furniture = context.Furnitures.First(y => y.Id == x.Key),
Count = x.Value.Item2
}).ToList(),
MaxCountFurnitures = model.MaxCountFurnitures
};
}
public void Update(ShopBindingModel model)
{
ShopName = model.ShopName;
Address = model.Address;
DateOpen = model.DateOpen;
MaxCountFurnitures = model.MaxCountFurnitures;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
DateOpen = DateOpen,
MaxCountFurnitures = MaxCountFurnitures,
ShopFurnitures = ShopFurnitures
};
public void UpdateFurnitures(FurnitureAssemblyDatabase context, ShopBindingModel model)
{
var shopFurnitures = context.ShopFurnitures.Where(rec => rec.ShopId == model.Id).ToList();
if (shopFurnitures != null && shopFurnitures.Count > 0)
{ // удалили те, которых нет в модели
context.ShopFurnitures.RemoveRange(shopFurnitures.Where(rec => !model.ShopFurnitures.ContainsKey(rec.FurnitureId)));
context.SaveChanges();
// обновили количество у существующих записей
foreach (var _shopFurnitures in shopFurnitures)
{
_shopFurnitures.Count = model.ShopFurnitures[_shopFurnitures.FurnitureId].Item2;
model.ShopFurnitures.Remove(_shopFurnitures.FurnitureId);
}
context.SaveChanges();
}
var shop = context.Shops.First(x => x.Id == Id);
foreach (var sm in model.ShopFurnitures)
{
context.ShopFurnitures.Add(new ShopFurniture
{
Shop = shop,
Furniture = context.Furnitures.First(x => x.Id == sm.Key),
Count = sm.Value.Item2
});
context.SaveChanges();
}
_shopFurnitures = null;
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyDatabaseImplement.Models
{
public class ShopFurniture
{
public int Id { get; set; }
[Required]
public int ShopId { get; set; }
[Required]
public int FurnitureId { get; set; }
[Required]
public int Count { get; set; }
public virtual Shop Shop { get; set; } = new();
public virtual Furniture Furniture { get; set; } = new();
}
}

View File

@ -32,7 +32,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
public static WorkPiece? Create(WorkPieceBindingModel model) public static WorkPiece? Create(WorkPieceBindingModel model)
{ {
if(model == null) if (model == null)
{ {
return null; return null;
} }
@ -57,7 +57,7 @@ namespace FurnitureAssemblyDatabaseImplement.Models
public void Update(WorkPieceBindingModel model) public void Update(WorkPieceBindingModel model)
{ {
if(model == null) if (model == null)
{ {
return; return;
} }

View File

@ -18,6 +18,8 @@ namespace FurnitureAssemblyFileImplement
private readonly string FurnitureFileName = "Furniture.xml"; private readonly string FurnitureFileName = "Furniture.xml";
private readonly string ShopFileName = "Shop.xml";
private readonly string ClientFileName = "Client.xml"; private readonly string ClientFileName = "Client.xml";
private readonly string ImplementerFileName = "Implementer.xml"; private readonly string ImplementerFileName = "Implementer.xml";
@ -30,6 +32,8 @@ namespace FurnitureAssemblyFileImplement
public List<Furniture> Furnitures { get; private set; } public List<Furniture> Furnitures { get; private set; }
public List<Shop> Shops { get; private set; }
public List<Client> Clients { get; private set; } public List<Client> Clients { get; private set; }
public List<Implementer> Implementers { get; private set; } public List<Implementer> Implementers { get; private set; }
@ -52,20 +56,23 @@ namespace FurnitureAssemblyFileImplement
public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
public void SaveShops() => SaveData(Shops, ShopFileName, "Shops", x => x.GetXElement);
public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement);
public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); public void SaveImplementers() => SaveData(Orders, ImplementerFileName, "Implementers", x => x.GetXElement);
public void SaveMessages() => SaveData(Messages, MessageFileName, "Messages", x => x.GetXElement); public void SaveMessages() => SaveData(Messages, MessageFileName, "Messages", x => x.GetXElement);
private DataFileSingleton() private DataFileSingleton()
{ {
WorkPieces = LoadData(WorkPieceFileName, "WorkPiece", x => WorkPiece.Create(x)!)!; WorkPieces = LoadData(WorkPieceFileName, "WorkPiece", x => WorkPiece.Create(x)!)!;
Furnitures = LoadData(FurnitureFileName, "Furniture", x => Furniture.Create(x)!)!; Furnitures = LoadData(FurnitureFileName, "Furniture", x => Furniture.Create(x)!)!;
Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
Shops = LoadData(ShopFileName, "Shop", x => Shop.Create(x)!)!;
Implementers = LoadData(ImplementerFileName, "Impleneter", x => Implementer.Create(x)!)!;
Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!;
Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!;
Messages = LoadData(MessageFileName, "Messages", x => MessageInfo.Create(x)!)!; Messages = LoadData(MessageFileName, "Messages", x => MessageInfo.Create(x)!)!;
} }

View File

@ -28,6 +28,8 @@ namespace FurnitureAssemblyFileImplement
DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>(); DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>();
DependencyManager.Instance.RegisterType<IShopStorage, ShopStorage>();
DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>(); DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>();
} }
} }

View File

@ -13,100 +13,72 @@ namespace FurnitureAssemblyFileImplement.Implements
{ {
public class ImplementerStorage : IImplementerStorage public class ImplementerStorage : IImplementerStorage
{ {
private readonly DataFileSingleton source; private readonly DataFileSingleton _source;
public ImplementerStorage() public ImplementerStorage()
{ {
source = DataFileSingleton.GetInstance(); _source = DataFileSingleton.GetInstance();
} }
public ImplementerViewModel? GetElement(ImplementerSearchModel model) public ImplementerViewModel? GetElement(ImplementerSearchModel model)
{ {
if (model.Id.HasValue) if (model.Id.HasValue) return _source.Implementers.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
return source.Implementers if (model.ImplementerFIO != null && model.Password != null) return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO) && x.Password.Equals(model.Password))?.GetViewModel;
.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; if (model.ImplementerFIO != null) return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO))?.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; return null;
} }
public List<ImplementerViewModel> GetFullList()
{
return source.Implementers.Select(x => x.GetViewModel).ToList();
}
public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model) public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
{ {
if (model == null) if (model == null)
{ {
return new(); return new();
} }
if (model.ImplementerFIO != null) if (model.ImplementerFIO != null)
{ {
return source.Implementers return _source.Implementers
.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO))
.Where(x => x.Id == model.Id)
.Select(x => x.GetViewModel) .Select(x => x.GetViewModel)
.ToList(); .ToList();
} }
return new(); return new();
} }
public List<ImplementerViewModel> GetFullList()
{
return _source.Implementers.Select(x => x.GetViewModel).ToList();
}
public ImplementerViewModel? Insert(ImplementerBindingModel model) public ImplementerViewModel? Insert(ImplementerBindingModel model)
{ {
model.Id = source.Implementers.Count > 0 ? source.Implementers.Max(x => x.Id) + 1 : 1; model.Id = _source.Implementers.Count > 0 ? _source.Implementers.Max(x => x.Id) + 1 : 1;
var res = Implementer.Create(model);
var newImplementer = Implementer.Create(model); if (res != null)
if (newImplementer == null)
{ {
return null; _source.Implementers.Add(res);
_source.SaveImplementers();
} }
return res?.GetViewModel;
source.Implementers.Add(newImplementer);
source.SaveImplementers();
return newImplementer.GetViewModel;
} }
public ImplementerViewModel? Update(ImplementerBindingModel model) public ImplementerViewModel? Update(ImplementerBindingModel model)
{ {
var implementer = source.Implementers.FirstOrDefault(x => x.Id == model.Id); var res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id);
if (res != null)
if (implementer == null)
{ {
return null; res.Update(model);
_source.SaveImplementers();
} }
return res?.GetViewModel;
implementer.Update(model);
source.SaveImplementers();
return implementer.GetViewModel;
} }
public ImplementerViewModel? Delete(ImplementerBindingModel model) public ImplementerViewModel? Delete(ImplementerBindingModel model)
{ {
var element = source.Implementers.FirstOrDefault(x => x.Id == model.Id); var res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id);
if (res != null)
if (element != null)
{ {
source.Implementers.Remove(element); _source.Implementers.Remove(res);
source.SaveImplementers(); _source.SaveImplementers();
return element.GetViewModel;
} }
return res?.GetViewModel;
return null;
} }
} }
} }

View File

@ -13,64 +13,62 @@ namespace FurnitureAssemblyFileImplement.Implements
{ {
public class MessageInfoStorage : IMessageInfoStorage public class MessageInfoStorage : IMessageInfoStorage
{ {
private readonly DataFileSingleton source; private readonly DataFileSingleton _source;
public MessageInfoStorage() public MessageInfoStorage()
{ {
source = DataFileSingleton.GetInstance(); _source = DataFileSingleton.GetInstance();
}
public List<MessageInfoViewModel> GetFullList()
{
return source.Messages.Select(x => GetViewModel(x)).ToList();
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{
if (!model.ClientId.HasValue)
{
return source.Messages
.Select(x => GetViewModel(x))
.ToList();
}
return source.Messages
.Where(x => x.ClientId == model.ClientId)
.Select(x => GetViewModel(x))
.ToList();
} }
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
{ {
if (!model.ClientId.HasValue) if (model.MessageId != null)
{ {
return _source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
}
return null; return null;
} }
return source.Messages.FirstOrDefault(x => (model.ClientId.HasValue && x.ClientId == model.ClientId))?.GetViewModel; public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{
var res = _source.Messages
.Where(x => !model.ClientId.HasValue || x.ClientId == model.ClientId)
.Select(x => x.GetViewModel);
if (!(model.Page.HasValue && model.PageSize.HasValue))
{
return res.ToList();
}
return res.Skip((model.Page.Value - 1) * model.PageSize.Value).Take(model.PageSize.Value).ToList();
}
public List<MessageInfoViewModel> GetFullList()
{
return _source.Messages
.Select(x => x.GetViewModel)
.ToList();
} }
public MessageInfoViewModel? Insert(MessageInfoBindingModel model) public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
{ {
model.MessageId = source.Messages.Count > 0 ? Convert.ToString(source.Messages.Count + 1) : "1";
var newMessage = MessageInfo.Create(model); var newMessage = MessageInfo.Create(model);
if (newMessage == null) if (newMessage == null)
{ {
return null; return null;
} }
_source.Messages.Add(newMessage);
source.Messages.Add(newMessage); _source.SaveMessages();
source.SaveOrders(); return newMessage.GetViewModel;
return GetViewModel(newMessage);
} }
// Для загрузки названий и имён в заказ public MessageInfoViewModel? Update(MessageInfoBindingModel model)
private MessageInfoViewModel GetViewModel(MessageInfo message)
{ {
return message.GetViewModel; var res = _source.Messages.FirstOrDefault(x => x.MessageId.Equals(model.MessageId));
if (res != null)
{
res.Update(model);
_source.SaveMessages();
}
return res?.GetViewModel;
} }
} }
} }

View File

@ -28,12 +28,21 @@ namespace FurnitureAssemblyFileImplement.Implements
return null; return null;
} }
if (model.ImplementerId.HasValue && model.Status != null) if (model.ImplementerId.HasValue && model.Status.HasValue)
return source.Orders.FirstOrDefault(x => x.ImplementerId == model.ImplementerId && model.Status {
.Equals(x.Status))?.GetViewModel;
return source.Orders return source.Orders
.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; .FirstOrDefault(x => x.ImplementerId == model.ImplementerId && x.Status == model.Status)
?.GetViewModel;
}
if (model.ImplementerId.HasValue)
{
return source.Orders
.FirstOrDefault(x => x.ImplementerId == model.ImplementerId)
?.GetViewModel;
}
return source.Orders.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
} }
public List<OrderViewModel> GetFilteredList(OrderSearchModel model) public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
@ -54,7 +63,7 @@ namespace FurnitureAssemblyFileImplement.Implements
return source.Orders.Select(x => GetViewModel(x)).ToList(); return source.Orders.Select(x => GetViewModel(x)).ToList();
} }
// Для загрузки названий изделия и исполнителя в заказе // Для загрузки названий изделия в заказе
private OrderViewModel GetViewModel(Order order) private OrderViewModel GetViewModel(Order order)
{ {
var viewModel = order.GetViewModel; var viewModel = order.GetViewModel;
@ -104,7 +113,7 @@ namespace FurnitureAssemblyFileImplement.Implements
{ {
var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); var order = source.Orders.FirstOrDefault(x => x.Id == model.Id);
if(order == null) if (order == null)
{ {
return null; return null;
} }
@ -119,7 +128,7 @@ namespace FurnitureAssemblyFileImplement.Implements
{ {
var order = source.Orders.FirstOrDefault(x => x.Id == model.Id); var order = source.Orders.FirstOrDefault(x => x.Id == model.Id);
if(order != null) if (order != null)
{ {
source.Orders.Remove(order); source.Orders.Remove(order);
source.SaveOrders(); source.SaveOrders();

View File

@ -0,0 +1,139 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.StoragesContracts;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models;
using FurnitureAssemblyFileImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyFileImplement.Implements
{
// Реализация интерфейса хранилища магазинов
public class ShopStorage : IShopStorage
{
private readonly DataFileSingleton _source;
public ShopStorage()
{
_source = DataFileSingleton.GetInstance();
}
public List<ShopViewModel> GetFullList()
{
return _source.Shops.Select(x => x.GetViewModel).ToList();
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName))
{
return new();
}
return _source.Shops.Where(x => x.ShopName.Contains(model.ShopName))
.Select(x => x.GetViewModel).ToList();
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
return _source.Shops.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName)
|| (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
}
public ShopViewModel? Insert(ShopBindingModel model)
{
model.Id = _source.Shops.Count > 0 ? _source.Shops.Max(x => x.Id) + 1 : 1;
var newShop = Shop.Create(model);
if (newShop == null)
{
return null;
}
_source.Shops.Add(newShop);
_source.SaveShops();
return newShop.GetViewModel;
}
public ShopViewModel? Update(ShopBindingModel model)
{
var shop = _source.Shops.FirstOrDefault(x => x.ShopName.Contains(model.ShopName) || x.Id == model.Id);
if (shop == null)
{
return null;
}
shop.Update(model);
_source.SaveShops();
return shop.GetViewModel;
}
public ShopViewModel? Delete(ShopBindingModel model)
{
var element = _source.Shops.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
_source.Shops.Remove(element);
_source.SaveShops();
return element.GetViewModel;
}
return null;
}
public bool SellFurnitures(IFurnitureModel model, int count)
{
if (_source.Shops.Select(x => x.ShopFurnitures.FirstOrDefault(x => x.Key == model.Id).Value.Item2).Sum() < count)
{
return false;
}
var list = _source.Shops.Where(x => x.ShopFurnitures.ContainsKey(model.Id));
foreach (var shop in list)
{
if (shop.ShopFurnitures[model.Id].Item2 < count)
{
count -= shop.ShopFurnitures[model.Id].Item2;
shop.ShopFurnitures[model.Id] = (shop.ShopFurnitures[model.Id].Item1, 0);
}
else
{
shop.ShopFurnitures[model.Id] = (shop.ShopFurnitures[model.Id].Item1, shop.ShopFurnitures[model.Id].Item2 - count);
count -= count;
}
Update(new()
{
ShopName = shop.ShopName,
Address = shop.Address,
DateOpen = shop.DateOpen,
MaxCountFurnitures = shop.MaxCountFurnitures,
ShopFurnitures = shop.ShopFurnitures
});
if (count == 0)
{
return true;
}
}
return true;
}
}
}

View File

@ -29,23 +29,6 @@ namespace FurnitureAssemblyFileImplement.Models
[DataMember] [DataMember]
public int Qualification { 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) public static Implementer? Create(XElement element)
{ {
if (element == null) if (element == null)
@ -53,13 +36,30 @@ namespace FurnitureAssemblyFileImplement.Models
return null; return null;
} }
return new Implementer() return new()
{ {
Id = Convert.ToInt32(element.Attribute("Id")!.Value), Id = Convert.ToInt32(element.Attribute("Id")!.Value),
ImplementerFIO = element.Element("FIO")!.Value,
Password = element.Element("Password")!.Value, Password = element.Element("Password")!.Value,
ImplementerFIO = element.Element("ImplementerFIO")!.Value,
Qualification = Convert.ToInt32(element.Element("Qualification")!.Value), Qualification = Convert.ToInt32(element.Element("Qualification")!.Value),
WorkExperience = Convert.ToInt32(element.Element("WorkExperience")!.Value) WorkExperience = Convert.ToInt32(element.Element("WorkExperience")!.Value),
};
}
public static Implementer? Create(ImplementerBindingModel model)
{
if (model == null)
{
return null;
}
return new()
{
Id = model.Id,
ImplementerFIO = model.ImplementerFIO,
Password = model.Password,
Qualification = model.Qualification,
WorkExperience = model.WorkExperience,
}; };
} }
@ -70,9 +70,8 @@ namespace FurnitureAssemblyFileImplement.Models
return; return;
} }
Id = model.Id;
Password = model.Password;
ImplementerFIO = model.ImplementerFIO; ImplementerFIO = model.ImplementerFIO;
Password = model.Password;
Qualification = model.Qualification; Qualification = model.Qualification;
WorkExperience = model.WorkExperience; WorkExperience = model.WorkExperience;
} }
@ -80,17 +79,17 @@ namespace FurnitureAssemblyFileImplement.Models
public ImplementerViewModel GetViewModel => new() public ImplementerViewModel GetViewModel => new()
{ {
Id = Id, Id = Id,
Password = Password,
ImplementerFIO = ImplementerFIO, ImplementerFIO = ImplementerFIO,
Password = Password,
Qualification = Qualification, Qualification = Qualification,
WorkExperience = WorkExperience
}; };
public XElement GetXElement => new("Order", public XElement GetXElement => new("Client",
new XAttribute("Id", Id), new XAttribute("Id", Id),
new XElement("FIO", ImplementerFIO),
new XElement("Password", Password), new XElement("Password", Password),
new XElement("ImplementerFIO", ImplementerFIO),
new XElement("Qualification", Qualification), new XElement("Qualification", Qualification),
new XElement("WorkExperience", WorkExperience)); new XElement("WorkExperience", WorkExperience)
);
} }
} }

View File

@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Linq; using System.Xml.Linq;
@ -15,7 +14,8 @@ namespace FurnitureAssemblyFileImplement.Models
[DataContract] [DataContract]
public class MessageInfo : IMessageInfoModel public class MessageInfo : IMessageInfoModel
{ {
public int Id { get; set; } [DataMember]
public int Id { get; private set; }
[DataMember] [DataMember]
public string MessageId { get; private set; } = string.Empty; public string MessageId { get; private set; } = string.Empty;
@ -23,6 +23,8 @@ namespace FurnitureAssemblyFileImplement.Models
[DataMember] [DataMember]
public int? ClientId { get; private set; } public int? ClientId { get; private set; }
public bool IsRead { get; private set; } = false;
[DataMember] [DataMember]
public string SenderName { get; private set; } = string.Empty; public string SenderName { get; private set; } = string.Empty;
@ -32,9 +34,11 @@ namespace FurnitureAssemblyFileImplement.Models
[DataMember] [DataMember]
public string Subject { get; private set; } = string.Empty; public string Subject { get; private set; } = string.Empty;
[DataMember]
public string Body { get; private set; } = string.Empty; public string Body { get; private set; } = string.Empty;
public string? Answer { get; private set; } = string.Empty;
public static MessageInfo? Create(MessageInfoBindingModel model) public static MessageInfo? Create(MessageInfoBindingModel model)
{ {
if (model == null) if (model == null)
@ -49,7 +53,9 @@ namespace FurnitureAssemblyFileImplement.Models
SenderName = model.SenderName, SenderName = model.SenderName,
Body = model.Body, Body = model.Body,
Subject = model.Subject, Subject = model.Subject,
DateDelivery = model.DateDelivery DateDelivery = model.DateDelivery,
IsRead = model.IsRead,
Answer = model.Answer
}; };
} }
@ -67,7 +73,9 @@ namespace FurnitureAssemblyFileImplement.Models
SenderName = element.Element("SenderName")!.Value, SenderName = element.Element("SenderName")!.Value,
Body = element.Element("Body")!.Value, Body = element.Element("Body")!.Value,
Subject = element.Element("Subject")!.Value, Subject = element.Element("Subject")!.Value,
DateDelivery = Convert.ToDateTime(element.Element("DateDelivery")!.Value) DateDelivery = Convert.ToDateTime(element.Element("DateDelivery")!.Value),
IsRead = Convert.ToBoolean(element.Element("IsRead")!.Value),
Answer = element.Element("Answer")!.Value
}; };
} }
@ -84,6 +92,9 @@ namespace FurnitureAssemblyFileImplement.Models
Body = model.Body; Body = model.Body;
Subject = model.Subject; Subject = model.Subject;
DateDelivery = model.DateDelivery; DateDelivery = model.DateDelivery;
IsRead = model.IsRead;
Answer = model.Answer;
} }
public MessageInfoViewModel GetViewModel => new() public MessageInfoViewModel GetViewModel => new()
@ -93,7 +104,9 @@ namespace FurnitureAssemblyFileImplement.Models
SenderName = SenderName, SenderName = SenderName,
Body = Body, Body = Body,
Subject = Subject, Subject = Subject,
DateDelivery = DateDelivery DateDelivery = DateDelivery,
IsRead = IsRead,
Answer = Answer
}; };
public XElement GetXElement => new("MessageInfo", public XElement GetXElement => new("MessageInfo",
@ -102,6 +115,8 @@ namespace FurnitureAssemblyFileImplement.Models
new XElement("SenderName", SenderName), new XElement("SenderName", SenderName),
new XElement("Body", Body), new XElement("Body", Body),
new XElement("Subject", Subject), new XElement("Subject", Subject),
new XElement("DateDelivery", DateDelivery.ToString())); new XElement("DateDelivery", DateDelivery.ToString()),
new XElement("IsRead", IsRead),
new XElement("Answer", Answer));
} }
} }

View File

@ -26,7 +26,7 @@ namespace FurnitureAssemblyFileImplement.Models
public int ClientId { get; private set; } public int ClientId { get; private set; }
[DataMember] [DataMember]
public int? ImplementerId { get; private set; } public int? ImplementerId { get; set; }
[DataMember] [DataMember]
public int Count { get; private set; } public int Count { get; private set; }
@ -76,7 +76,7 @@ namespace FurnitureAssemblyFileImplement.Models
Id = Convert.ToInt32(element.Attribute("Id")!.Value), Id = Convert.ToInt32(element.Attribute("Id")!.Value),
FurnitureId = Convert.ToInt32(element.Element("FurnitureId")!.Value), FurnitureId = Convert.ToInt32(element.Element("FurnitureId")!.Value),
ClientId = Convert.ToInt32(element.Attribute("Id")!.Value), ClientId = Convert.ToInt32(element.Attribute("Id")!.Value),
ImplementerId = Convert.ToInt32(element.Attribute("ImplementerId")!.Value), ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.Value),
Count = Convert.ToInt32(element.Element("Count")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value),
Sum = Convert.ToDouble(element.Element("Sum")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value),
Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value),
@ -93,6 +93,7 @@ namespace FurnitureAssemblyFileImplement.Models
return; return;
} }
ImplementerId = model.ImplementerId;
Status = model.Status; Status = model.Status;
DateImplement = model.DateImplement; DateImplement = model.DateImplement;
} }
@ -103,6 +104,7 @@ namespace FurnitureAssemblyFileImplement.Models
FurnitureId = FurnitureId, FurnitureId = FurnitureId,
ClientId = ClientId, ClientId = ClientId,
ImplementerId = ImplementerId, ImplementerId = ImplementerId,
ImplementerFIO = DataFileSingleton.GetInstance().Implementers.FirstOrDefault(x => x.Id == ImplementerId)?.ImplementerFIO ?? string.Empty,
Count = Count, Count = Count,
Sum = Sum, Sum = Sum,
Status = Status, Status = Status,
@ -114,7 +116,7 @@ namespace FurnitureAssemblyFileImplement.Models
new XAttribute("Id", Id), new XAttribute("Id", Id),
new XElement("FurnitureId", FurnitureId.ToString()), new XElement("FurnitureId", FurnitureId.ToString()),
new XElement("ClientId", ClientId.ToString()), new XElement("ClientId", ClientId.ToString()),
new XElement("ImplementerId", ImplementerId.ToString()), new XElement("ImplementerId", ImplementerId),
new XElement("Count", Count.ToString()), new XElement("Count", Count.ToString()),
new XElement("Sum", Sum.ToString()), new XElement("Sum", Sum.ToString()),
new XElement("Status", Status.ToString()), new XElement("Status", Status.ToString()),

View File

@ -0,0 +1,111 @@
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 Shop : IShopModel
{
public int Id { get; set; }
public string ShopName { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public DateTime DateOpen { get; set; }
public int MaxCountFurnitures { get; set; }
public Dictionary<int, int> countFurniture { get; private set; } = new();
public Dictionary<int, (IFurnitureModel, int)> _furnitures = null;
public Dictionary<int, (IFurnitureModel, int)> ShopFurnitures
{
get
{
if (_furnitures == null)
{
var source = DataFileSingleton.GetInstance();
_furnitures = countFurniture.ToDictionary(x => x.Key, y => ((source.Furnitures.FirstOrDefault(z => z.Id == y.Key) as IFurnitureModel)!, y.Value));
}
return _furnitures;
}
}
public static Shop? Create(ShopBindingModel model)
{
if (model == null)
{
return null;
}
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
DateOpen = model.DateOpen,
MaxCountFurnitures = model.MaxCountFurnitures,
countFurniture = model.ShopFurnitures.ToDictionary(x => x.Key, x => x.Value.Item2)
};
}
public static Shop? Create(XElement element)
{
if (element == null)
{
return null;
}
return new Shop()
{
Id = Convert.ToInt32(element.Attribute("Id")!.Value),
ShopName = element.Element("ShopName")!.Value,
Address = element.Element("Address")!.Value,
DateOpen = Convert.ToDateTime(element.Element("DateOpen")!.Value),
MaxCountFurnitures = Convert.ToInt32(element.Element("MaxCountFurnitures")!.Value),
countFurniture = element.Element("Furnitures")!.Elements("Furnitures").ToDictionary(x => Convert.ToInt32(x.Element("Key")?.Value), x => Convert.ToInt32(x.Element("Value")?.Value))
};
}
public void Update(ShopBindingModel? model)
{
if (model == null)
{
return;
}
ShopName = model.ShopName;
Address = model.Address;
DateOpen = model.DateOpen;
MaxCountFurnitures = model.MaxCountFurnitures;
countFurniture = model.ShopFurnitures.ToDictionary(x => x.Key, x => x.Value.Item2);
_furnitures = null;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
DateOpen = DateOpen,
MaxCountFurnitures = MaxCountFurnitures,
ShopFurnitures = ShopFurnitures
};
public XElement GetXElement => new("Shop",
new XAttribute("Id", Id),
new XElement("ShopName", ShopName),
new XElement("Address", Address),
new XElement("DateOpen", DateOpen.ToString()),
new XElement("MaxCountFurnitures", MaxCountFurnitures.ToString()),
new XElement("Furnitures", countFurniture.Select(x => new XElement("Furnitures",
new XElement("Key", x.Key),
new XElement("Value", x.Value))).ToArray()));
}
}

View File

@ -21,7 +21,10 @@ namespace FurnitureAssemblyListImplement
// Список для хранения заказов // Список для хранения заказов
public List<Order> Orders { get; set; } public List<Order> Orders { get; set; }
// Список для хранения клиентов // Список для хранения Магазинов
public List<Shop> Shops { get; set; }
// Список для хранения Клиентов
public List<Client> Clients { get; set; } public List<Client> Clients { get; set; }
// Список для хранения исполнителей // Список для хранения исполнителей
@ -35,6 +38,7 @@ namespace FurnitureAssemblyListImplement
WorkPiece = new List<WorkPiece>(); WorkPiece = new List<WorkPiece>();
Furnitures = new List<Furniture>(); Furnitures = new List<Furniture>();
Orders = new List<Order>(); Orders = new List<Order>();
Shops = new List<Shop>();
Clients = new List<Client>(); Clients = new List<Client>();
Implementers = new List<Implementer>(); Implementers = new List<Implementer>();
MessageInfos = new List<MessageInfo>(); MessageInfos = new List<MessageInfo>();
@ -42,7 +46,7 @@ namespace FurnitureAssemblyListImplement
public static DataListSingleton GetInstance() public static DataListSingleton GetInstance()
{ {
if (_instance == null) if(_instance == null)
{ {
_instance = new DataListSingleton(); _instance = new DataListSingleton();
} }

View File

@ -11,4 +11,8 @@
<ProjectReference Include="..\FurnitureAssemblyDataModels\FurnitureAssemblyDataModels.csproj" /> <ProjectReference Include="..\FurnitureAssemblyDataModels\FurnitureAssemblyDataModels.csproj" />
</ItemGroup> </ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy /Y &quot;$(TargetDir)*.dll&quot; &quot;$(SolutionDir)ImplementationExtensions\*.dll&quot;" />
</Target>
</Project> </Project>

View File

@ -13,76 +13,81 @@ namespace FurnitureAssemblyListImplement.Implements
{ {
public class MessageInfoStorage : IMessageInfoStorage public class MessageInfoStorage : IMessageInfoStorage
{ {
// Поле для работы со списком изделий
private readonly DataListSingleton _source; private readonly DataListSingleton _source;
public MessageInfoStorage() public MessageInfoStorage()
{ {
_source = DataListSingleton.GetInstance(); _source = DataListSingleton.GetInstance();
} }
public List<MessageInfoViewModel> GetFullList() public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
{ {
var result = new List<MessageInfoViewModel>(); foreach (var message in _source.MessageInfos)
foreach (var messageInfo in _source.MessageInfos)
{ {
result.Add(messageInfo.GetViewModel); if (model.MessageId != null && model.MessageId.Equals(message.MessageId))
return message.GetViewModel;
} }
return null;
return result;
} }
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{ {
var result = new List<MessageInfoViewModel>(); List<MessageInfoViewModel> result = new();
foreach (var item in _source.MessageInfos)
{
if (item.ClientId.HasValue && item.ClientId == model.ClientId)
{
result.Add(item.GetViewModel);
}
}
if (string.IsNullOrEmpty(model.MessageId)) if (!(model.Page.HasValue && model.PageSize.HasValue))
{ {
return result; return result;
} }
if (model.Page * model.PageSize >= result.Count)
foreach (var messageInfo in _source.MessageInfos)
{ {
if (messageInfo.ClientId == model.ClientId) return null;
{
result.Add(messageInfo.GetViewModel);
} }
List<MessageInfoViewModel> filteredResult = new();
for (var i = (model.Page.Value - 1) * model.PageSize.Value; i < model.Page.Value * model.PageSize.Value; i++)
{
filteredResult.Add(result[i]);
}
return filteredResult;
} }
public List<MessageInfoViewModel> GetFullList()
{
List<MessageInfoViewModel> result = new();
foreach (var item in _source.MessageInfos)
{
result.Add(item.GetViewModel);
}
return result; return result;
} }
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
{
if (string.IsNullOrEmpty(model.MessageId))
{
return null;
}
foreach (var messageInfo in _source.MessageInfos)
{
if (messageInfo.MessageId == model.MessageId)
{
return messageInfo.GetViewModel;
}
}
return null;
}
public MessageInfoViewModel? Insert(MessageInfoBindingModel model) public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
{ {
var newMessage = MessageInfo.Create(model); var newMessage = MessageInfo.Create(model);
if (newMessage == null) if (newMessage == null)
{ {
return null; return null;
} }
_source.MessageInfos.Add(newMessage); _source.MessageInfos.Add(newMessage);
return newMessage.GetViewModel; return newMessage.GetViewModel;
} }
public MessageInfoViewModel? Update(MessageInfoBindingModel model)
{
foreach (var message in _source.MessageInfos)
{
if (message.MessageId.Equals(model.MessageId))
{
message.Update(model);
return message.GetViewModel;
}
}
return null;
}
} }
} }

View File

@ -28,7 +28,7 @@ namespace FurnitureAssemblyListImplement.Implements
{ {
var result = new List<OrderViewModel>(); var result = new List<OrderViewModel>();
foreach(var order in _source.Orders) foreach (var order in _source.Orders)
{ {
result.Add(GetViewModel(order)); result.Add(GetViewModel(order));
} }
@ -41,12 +41,19 @@ namespace FurnitureAssemblyListImplement.Implements
{ {
var result = new List<OrderViewModel>(); var result = new List<OrderViewModel>();
if (!model.Id.HasValue) if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue)
{ {
return result; foreach (var order in _source.Orders)
{
if (order.DateCreate >= model.DateFrom && order.DateCreate <= model.DateTo)
{
result.Add(GetViewModel(order));
}
} }
if (model.ClientId.HasValue) return result;
}
else if (model.ClientId.HasValue)
{ {
foreach (var order in _source.Orders) foreach (var order in _source.Orders)
{ {
@ -55,17 +62,27 @@ namespace FurnitureAssemblyListImplement.Implements
result.Add(GetViewModel(order)); result.Add(GetViewModel(order));
} }
} }
}
if (model.DateFrom.HasValue && model.DateTo.HasValue) return result;
}
else if (model.Status.HasValue)
{ {
foreach (var order in _source.Orders) foreach (var order in _source.Orders)
{ {
if (order.Id == model.Id || model.DateFrom <= order.DateCreate && order.DateCreate <= model.DateTo) if (order.Status == model.Status)
{ {
result.Add(GetViewModel(order)); result.Add(GetViewModel(order));
} }
} }
return result;
}
foreach (var order in _source.Orders)
{
if (order.Id == model.Id)
{
result.Add(GetViewModel(order));
}
} }
return result; return result;
@ -90,7 +107,7 @@ namespace FurnitureAssemblyListImplement.Implements
return null; return null;
} }
// Метод для записи названия изделия на форме с заказами и исполнителя // Метод для записи названия изделия на форме с заказами
private OrderViewModel GetViewModel(Order order) private OrderViewModel GetViewModel(Order order)
{ {
var viewModel = order.GetViewModel; var viewModel = order.GetViewModel;
@ -124,6 +141,7 @@ namespace FurnitureAssemblyListImplement.Implements
} }
} }
return viewModel; return viewModel;
} }

View File

@ -0,0 +1,143 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.StoragesContracts;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models;
using FurnitureAssemblyListImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FurnitureAssemblyListImplement.Implements
{
// Класс, реализующий интерфейс хранилища магазинов
public class ShopStorage : IShopStorage
{
// Поле для работы со списком магазинов
private readonly DataListSingleton _source;
// Получение в конструкторе объекта DataListSingleton
public ShopStorage()
{
_source = DataListSingleton.GetInstance();
}
// Получение элемента из списка заготовок
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
foreach (var shop in _source.Shops)
{
if ((!string.IsNullOrEmpty(model.ShopName) && shop.ShopName == model.ShopName) || (model.Id.HasValue && shop.Id == model.Id))
{
return shop.GetViewModel;
}
}
return null;
}
// Получение отфильтрованного списка заказов
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
var result = new List<ShopViewModel>();
if (string.IsNullOrEmpty(model.ShopName))
{
return result;
}
foreach (var shop in _source.Shops)
{
if (shop.ShopName.Contains(model.ShopName))
{
result.Add(shop.GetViewModel);
}
}
return result;
}
// Получение полного списка заготовок
public List<ShopViewModel> GetFullList()
{
var result = new List<ShopViewModel>();
foreach (var shop in _source.Shops)
{
result.Add(shop.GetViewModel);
}
return result;
}
// При создании магазина определяем для него новый id: ищем max id и прибавляем к нему 1
public ShopViewModel? Insert(ShopBindingModel model)
{
model.Id = 1;
foreach (var shop in _source.Shops)
{
if (model.Id <= shop.Id)
{
model.Id = shop.Id + 1;
}
}
var newShop = Shop.Create(model);
if (newShop == null)
{
return null;
}
_source.Shops.Add(newShop);
return newShop.GetViewModel;
}
// Обновление магазина
public ShopViewModel? Update(ShopBindingModel model)
{
foreach (var shop in _source.Shops)
{
if (shop.Id == model.Id)
{
shop.Update(model);
return shop.GetViewModel;
}
}
return null;
}
// Удаление магазина
public ShopViewModel? Delete(ShopBindingModel model)
{
for (int i = 0; i < _source.Shops.Count; ++i)
{
if (_source.Shops[i].Id == model.Id)
{
var element = _source.Shops[i];
_source.Shops.RemoveAt(i);
return element.GetViewModel;
}
}
return null;
}
public bool SellFurnitures(IFurnitureModel model, int count)
{
throw new NotImplementedException();
}
}
}

View File

@ -27,6 +27,8 @@ namespace FurnitureAssemblyListImplement
DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>(); DependencyManager.Instance.RegisterType<IFurnitureStorage, FurnitureStorage>();
DependencyManager.Instance.RegisterType<IShopStorage, ShopStorage>();
DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>(); DependencyManager.Instance.RegisterType<IBackUpInfo, BackUpInfo>();
} }
} }

View File

@ -3,7 +3,6 @@ using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyDataModels.Models; using FurnitureAssemblyDataModels.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -18,6 +17,8 @@ namespace FurnitureAssemblyListImplement.Models
public int? ClientId { get; private set; } public int? ClientId { get; private set; }
public bool IsRead { get; private set; }
public string SenderName { get; private set; } = string.Empty; public string SenderName { get; private set; } = string.Empty;
public DateTime DateDelivery { get; private set; } = DateTime.Now; public DateTime DateDelivery { get; private set; } = DateTime.Now;
@ -26,6 +27,8 @@ namespace FurnitureAssemblyListImplement.Models
public string Body { get; private set; } = string.Empty; public string Body { get; private set; } = string.Empty;
public string? Answer { get; private set; } = string.Empty;
// Метод для создания объекта от класса-компонента на основе класса-BindingModel // Метод для создания объекта от класса-компонента на основе класса-BindingModel
public static MessageInfo? Create(MessageInfoBindingModel? model) public static MessageInfo? Create(MessageInfoBindingModel? model)
{ {
@ -41,7 +44,9 @@ namespace FurnitureAssemblyListImplement.Models
SenderName = model.SenderName, SenderName = model.SenderName,
DateDelivery = model.DateDelivery, DateDelivery = model.DateDelivery,
Subject = model.Subject, Subject = model.Subject,
Body = model.Body Body = model.Body,
IsRead = model.IsRead,
Answer = model.Answer
}; };
} }
@ -59,6 +64,9 @@ namespace FurnitureAssemblyListImplement.Models
DateDelivery = model.DateDelivery; DateDelivery = model.DateDelivery;
Subject = model.Subject; Subject = model.Subject;
Body = model.Body; Body = model.Body;
IsRead = model.IsRead;
Answer = model.Answer;
} }
// Метод для создания объекта класса ViewModel на основе данных объекта класса-компонента // Метод для создания объекта класса ViewModel на основе данных объекта класса-компонента
@ -69,7 +77,9 @@ namespace FurnitureAssemblyListImplement.Models
SenderName = SenderName, SenderName = SenderName,
DateDelivery = DateDelivery, DateDelivery = DateDelivery,
Subject = Subject, Subject = Subject,
Body = Body Body = Body,
IsRead = IsRead,
Answer = Answer
}; };
} }
} }

View File

@ -0,0 +1,71 @@
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 Shop : IShopModel
{
// Методы set сделали приватными, чтобы исключить неразрешённые манипуляции
public string ShopName { get; private set; } = string.Empty;
public string Address { get; private set; } = string.Empty;
public DateTime DateOpen { get; private set; }
public int Id { get; private set; }
public int MaxCountFurnitures { get; set; }
public Dictionary<int, (IFurnitureModel, int)> ShopFurnitures { get; private set; } =
new Dictionary<int, (IFurnitureModel, int)>();
// Метод для создания объекта от класса-компонента на основе класса-BindingModel
public static Shop? Create(ShopBindingModel? model)
{
if (model == null)
{
return null;
}
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
DateOpen = model.DateOpen,
ShopFurnitures = model.ShopFurnitures
};
}
// Метод изменения существующего объекта
public void Update(ShopBindingModel? model)
{
if (model == null)
{
return;
}
ShopName = model.ShopName;
Address = model.Address;
DateOpen = model.DateOpen;
ShopFurnitures = model.ShopFurnitures;
}
// Метод для создания объекта класса ViewModel на основе данных объекта класса-компонента
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
DateOpen = DateOpen,
ShopFurnitures = ShopFurnitures
};
}
}

View File

@ -17,6 +17,8 @@ namespace FurnitureAssemblyRestApi.Controllers
private readonly IMessageInfoLogic _mailLogic; private readonly IMessageInfoLogic _mailLogic;
public int pageSize = 3;
public ClientController(IClientLogic logic, ILogger<ClientController> logger, IMessageInfoLogic mailLogic) public ClientController(IClientLogic logic, ILogger<ClientController> logger, IMessageInfoLogic mailLogic)
{ {
_logic = logic; _logic = logic;
@ -74,13 +76,15 @@ namespace FurnitureAssemblyRestApi.Controllers
} }
[HttpGet] [HttpGet]
public List<MessageInfoViewModel>? GetMessages(int clientId) public List<MessageInfoViewModel>? GetMessages(int clientId, int page)
{ {
try try
{ {
return _mailLogic.ReadList(new MessageInfoSearchModel return _mailLogic.ReadList(new MessageInfoSearchModel
{ {
ClientId = clientId ClientId = clientId,
Page = page,
PageSize = pageSize
}); });
} }
catch (Exception ex) catch (Exception ex)

View File

@ -0,0 +1,112 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.BusinessLogicsContracts;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.ViewModels;
using Microsoft.AspNetCore.Mvc;
namespace FurnitureAssemblyRestApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ShopController : Controller
{
private readonly ILogger _logger;
private readonly IShopLogic _shop;
public ShopController(ILogger<ShopController> logger, IShopLogic shopLogic)
{
_logger = logger;
_shop = shopLogic;
}
[HttpGet]
public List<ShopViewModel>? GetShopList()
{
try
{
List<ShopViewModel> shops = _shop.ReadList(null);
for (int i = 0; i < shops.Count; i++)
shops[i].FurnitureCount = shops[i].ShopFurnitures.Values.ToList().Select(x => (x.Item1.FurnitureName, x.Item2).ToTuple()).ToList();
return shops;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка магазинов");
throw;
}
}
[HttpGet]
public ShopViewModel? GetShop(int shopId)
{
try
{
return _shop.ReadElement(new ShopSearchModel
{
Id = shopId
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения магазина по id={Id}", shopId);
throw;
}
}
[HttpPost]
public void CreateShop(ShopBindingModel model)
{
try
{
_shop.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка создания магазина");
throw;
}
}
[HttpPost]
public void UpdateShop(ShopBindingModel model)
{
try
{
_shop.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка обновления магазина");
throw;
}
}
[HttpPost]
public void DeleteShop(ShopBindingModel model)
{
try
{
_shop.Delete(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка удаления магазина");
throw;
}
}
[HttpPost]
public void SupplyFurnituresToShop(Tuple<ShopSearchModel, FurnitureBindingModel, int> shop_furniture)
{
try
{
_shop.AddFurniture(shop_furniture.Item1, shop_furniture.Item2, shop_furniture.Item3);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка пополнения магазина");
throw;
}
}
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>

View File

@ -18,17 +18,19 @@ builder.Logging.AddLog4Net("log4net.config");
builder.Services.AddTransient<IClientStorage, ClientStorage>(); builder.Services.AddTransient<IClientStorage, ClientStorage>();
builder.Services.AddTransient<IOrderStorage, OrderStorage>(); builder.Services.AddTransient<IOrderStorage, OrderStorage>();
builder.Services.AddTransient<IFurnitureStorage, FurnitureStorage>(); builder.Services.AddTransient<IFurnitureStorage, FurnitureStorage>();
builder.Services.AddTransient<IShopStorage, ShopStorage>();
builder.Services.AddTransient<IImplementerStorage, ImplementerStorage>(); builder.Services.AddTransient<IImplementerStorage, ImplementerStorage>();
builder.Services.AddTransient<IMessageInfoStorage, MessageInfoStorage>(); builder.Services.AddTransient<IMessageInfoStorage, MessageInfoStorage>();
builder.Services.AddTransient<IOrderLogic, OrderLogic>(); builder.Services.AddTransient<IOrderLogic, OrderLogic>();
builder.Services.AddTransient<IClientLogic, ClientLogic>(); builder.Services.AddTransient<IClientLogic, ClientLogic>();
builder.Services.AddTransient<IFurnitureLogic, FurnitureLogic>(); builder.Services.AddTransient<IFurnitureLogic, FurnitureLogic>();
builder.Services.AddTransient<IShopLogic, ShopLogic>();
builder.Services.AddTransient<IImplementerLogic, ImplementerLogic>(); builder.Services.AddTransient<IImplementerLogic, ImplementerLogic>();
builder.Services.AddTransient<IMessageInfoLogic, MessageInfoLogic>(); builder.Services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

View File

@ -8,7 +8,7 @@
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
"dotnetRunMessages": true, "dotnetRunMessages": true,
"applicationUrl": "https://localhost:7159;http://localhost:5159" "applicationUrl": "https://localhost:7199;http://localhost:5159"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -24,8 +24,8 @@
"windowsAuthentication": false, "windowsAuthentication": false,
"anonymousAuthentication": true, "anonymousAuthentication": true,
"iisExpress": { "iisExpress": {
"applicationUrl": "http://localhost:25080", "applicationUrl": "http://localhost:46342",
"sslPort": 44382 "sslPort": 44378
} }
} }
} }

View File

@ -0,0 +1,66 @@
using Newtonsoft.Json;
using System.Net.Http.Headers;
using System.Text;
namespace FurnitureAssemblyShopApp
{
public static class APIClient
{
private static readonly HttpClient _client = new();
public static bool isAuth { get; private set; } = false;
public static string ConfigPassword { get; private set; } = string.Empty;
public static bool Login(string password)
{
if (string.IsNullOrEmpty(password))
{
throw new Exception("Enter the password");
}
return isAuth = password.Equals(ConfigPassword);
}
public static void Connect(IConfiguration configuration)
{
ConfigPassword = configuration["Password"];
_client.BaseAddress = new Uri(configuration["IPAddress"]);
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public static T? GetRequest<T>(string requestUrl)
{
var response = _client.GetAsync(requestUrl);
var result = response.Result.Content.ReadAsStringAsync().Result;
if (response.Result.IsSuccessStatusCode)
{
return JsonConvert.DeserializeObject<T>(result);
}
else
{
throw new Exception(result);
}
}
public static void PostRequest<T>(string requestUrl, T model)
{
var json = JsonConvert.SerializeObject(model);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = _client.PostAsync(requestUrl, data);
var result = response.Result.Content.ReadAsStringAsync().Result;
if (!response.Result.IsSuccessStatusCode)
{
throw new Exception(result);
}
}
}
}

View File

@ -0,0 +1,160 @@
using FurnitureAssemblyContracts.BindingModels;
using FurnitureAssemblyContracts.SearchModels;
using FurnitureAssemblyContracts.ViewModels;
using FurnitureAssemblyShopApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace FurnitureAssemblyShopApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
if (!APIClient.isAuth)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<ShopViewModel>>($"api/shop/getshoplist"));
}
public IActionResult Privacy()
{
if (!APIClient.isAuth)
{
return Redirect("~/Home/Enter");
}
return View();
}
[HttpGet]
public IActionResult Enter()
{
return View();
}
[HttpPost]
public void Enter(string password)
{
if (!APIClient.Login(password))
{
throw new Exception("Wrong password");
}
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Create()
{
return View();
}
[HttpPost]
public void Create(string shopname, string address, DateTime DateOpening, int count)
{
if (!APIClient.isAuth)
{
throw new Exception("Как вы сюда попали? Сюда могут входить только избранные");
}
if (count <= 0)
{
throw new Exception("Максимальное количество товаров должно быть больше либо равно 0");
}
APIClient.PostRequest("api/shop/createshop", new ShopBindingModel
{
ShopName = shopname,
MaxCountFurnitures = count,
Address = address,
DateOpen = DateOpening
});
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Delete()
{
ViewBag.Shops = APIClient.GetRequest<List<ShopViewModel>>("api/shop/getshoplist");
return View();
}
[HttpPost]
public void Delete(int shop)
{
if (!APIClient.isAuth)
{
throw new Exception("Как вы сюда попали? Сюда могут входить только авторизованные");
}
APIClient.PostRequest($"api/shop/deleteshop", new ShopBindingModel { Id = shop });
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Update()
{
ViewBag.Shops = APIClient.GetRequest<List<ShopViewModel>>("api/shop/getshoplist");
return View();
}
[HttpPost]
public void Update(int shop, string shopname, string address, DateTime DateOpening, int count)
{
if (!APIClient.isAuth)
{
throw new Exception("Как вы сюда попали? Сюда могут входить только избранные");
}
APIClient.PostRequest($"api/shop/updateshop", new ShopBindingModel
{
Id = shop,
ShopName = shopname,
Address = address,
DateOpen = DateOpening,
MaxCountFurnitures = count
});
Response.Redirect("Index");
}
public IActionResult Supply()
{
ViewBag.Shops = APIClient.GetRequest<List<ShopViewModel>>("api/shop/getshoplist");
ViewBag.Furnitures = APIClient.GetRequest<List<FurnitureViewModel>>("api/main/getfurniturelist");
return View();
}
[HttpPost]
public void Supply(int shopId, int furnitureId, int count)
{
if (!APIClient.isAuth)
{
throw new Exception("Как вы сюда попали? Сюда могут входить только авторизованные");
}
APIClient.PostRequest($"api/shop/supplyfurniturestoshop", (new ShopSearchModel { Id = shopId }, new FurnitureBindingModel { Id = furnitureId }, count));
Response.Redirect("Index");
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FurnitureAssemblyContracts\FurnitureAssemblyContracts.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,9 @@
namespace FurnitureAssemblyShopApp.Models
{
public class ErrorViewModel
{
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}

View File

@ -0,0 +1,31 @@
using FurnitureAssemblyShopApp;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
APIClient.Connect(builder.Configuration);
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();

View File

@ -0,0 +1,28 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:34897",
"sslPort": 44369
}
},
"profiles": {
"FurnitureAssemblyShopApp": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7072;http://localhost:5171",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More