From 2bec90ed3dd53e36c5868e081b2e539539c9f431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9?= Date: Wed, 17 May 2023 22:19:18 +0400 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=B2=D0=BE=D1=80=D0=B4=D0=B5=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BA=D1=80=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE,=20=D0=BD=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Worker/WorkerReportLogic.cs | 77 +++++--- .../OfficePackage/AbstractSaveToExcel.cs | 89 ++++++++- .../OfficePackage/AbstractSaveToWord.cs | 79 +++++++- .../OfficePackage/HelperModels/ExcelInfo.cs | 4 +- .../OfficePackage/HelperModels/WordInfo.cs | 4 +- .../OfficePackage/Implements/SaveToWord.cs | 2 +- .../BindingModels/PurchaseBindingModel.cs | 6 + .../IWorkerReportLogic.cs | 14 +- .../Implements/Worker/PurchaseStorage.cs | 2 + HardwareShop/HardwareShopRestApi/$q.doc | Bin 1501 -> 0 bytes .../Controllers/ReportController.cs | 28 ++- .../Controllers/HomeController.cs | 49 ++++- .../Views/Home/listComponents.cshtml | 187 ++++++++++++------ 13 files changed, 436 insertions(+), 105 deletions(-) delete mode 100644 HardwareShop/HardwareShopRestApi/$q.doc diff --git a/HardwareShop/HardwareShopBusinessLogic/BusinessLogics/Worker/WorkerReportLogic.cs b/HardwareShop/HardwareShopBusinessLogic/BusinessLogics/Worker/WorkerReportLogic.cs index f4931b7..bf245c2 100644 --- a/HardwareShop/HardwareShopBusinessLogic/BusinessLogics/Worker/WorkerReportLogic.cs +++ b/HardwareShop/HardwareShopBusinessLogic/BusinessLogics/Worker/WorkerReportLogic.cs @@ -1,21 +1,30 @@  +using HardwareShopBusinessLogic.OfficePackage; +using HardwareShopBusinessLogic.OfficePackage.HelperModels; +using HardwareShopBusinessLogic.OfficePackage.Implements; using HardwareShopContracts.BindingModels; using HardwareShopContracts.SearchModels; using HardwareShopContracts.StoragesContracts; using HardwareShopContracts.ViewModels; +using HardwareShopDatabaseImplement.Models.Worker; namespace HardwareShopContracts.BusinessLogicsContracts { public class WorkerReportLogic : IWorkerReportLogic { - private readonly IPurchaseStorage _purchaseStorage; + private readonly IPurchaseStorage _purchaseStorage; - public WorkerReportLogic(IPurchaseStorage purchaseStorage) + private readonly AbstractSaveToExcel _saveToExcel; + + private readonly AbstractSaveToWord _saveToWord; + + public WorkerReportLogic(IPurchaseStorage purchaseStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord) { - _purchaseStorage = purchaseStorage; - } + _saveToExcel = saveToExcel; + _saveToWord = saveToWord; + } /// /// Получение списка компонент с указанием, в каких покупках используются @@ -25,9 +34,11 @@ namespace HardwareShopContracts.BusinessLogicsContracts { var list = new List(); - foreach (var purchase in purchaseList) + foreach (var p in purchaseList) { - var record = new ReportPurchaseComponentViewModel + var purchase = _purchaseStorage.GetElement(new() { Id = p.Id })!; + + var record = new ReportPurchaseComponentViewModel { Id = purchase.Id, Builds = new List<(string Build, int count, List<(string Component, int count)>)>(), @@ -62,9 +73,10 @@ namespace HardwareShopContracts.BusinessLogicsContracts var list = new List(); var purchases = _purchaseStorage.GetFilteredList(new PurchaseSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo, UserId = userModel.Id }); - foreach (var purchase in purchases) + foreach (var p in purchases) { - var record = new ReportPurchaseViewModel + var purchase = _purchaseStorage.GetElement(new() { Id = p.Id })!; + var record = new ReportPurchaseViewModel { Id = purchase.Id, Builds = new List<(string Build, int count, List, List<(string Component, int count)>)>(), @@ -89,23 +101,40 @@ namespace HardwareShopContracts.BusinessLogicsContracts } - /// - /// Сохранение компонент с указаеним покупок в файл-Word - /// - /// - public void SaveComponentsToWordFile(ReportBindingModel model) + /// + /// Сохранение компонент с указаеним покупок в файл-Word + /// + /// + public byte[] SavePurchasesToWordFile(ReportBindingModel model, List purchases) { - throw new NotImplementedException(); - } + _saveToWord.CreateBuildPurchaseReport(new WordInfo + { + FileName = model.FileName, + Title = "Список Компонентов", + PurchaseComponent = GetPurchaseComponent(purchases) + }); - /// - /// Сохранение компонент с указаеним покупок в файл-Excel - /// - /// - public void SaveDishComponentToExcelFile(ReportBindingModel model) - { - throw new NotImplementedException(); - } + byte[] file = File.ReadAllBytes(model.FileName); + //File.Delete(model.FileName); + return file; + } + + /// + /// Сохранение компонент с указаеним покупок в файл-Excel + /// + /// + public byte[] SavePurchasesToExcelFile(ReportBindingModel model, List purchases) + { + _saveToExcel.CreatePurchaseComponentReport(new ExcelInfo + { + FileName = model.FileName, + Title = "Список Компонентов", + PurchaseComponent = GetPurchaseComponent(purchases) + }); + byte[] file = File.ReadAllBytes(model.FileName); + File.Delete(model.FileName); + return file; + } /// /// Сохранение отчёта по покупкам в файл-Pdf @@ -115,5 +144,5 @@ namespace HardwareShopContracts.BusinessLogicsContracts { throw new NotImplementedException(); } - } + } } \ No newline at end of file diff --git a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs index 038a23d..fecb287 100644 --- a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs +++ b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -58,11 +58,90 @@ namespace HardwareShopBusinessLogic.OfficePackage SaveExcel(info); } - /// - /// Создание excel-файла - /// - /// - protected abstract void CreateExcel(ExcelInfo info); + /// + /// Создание отчета по сборкам в выбранных товарах + /// + /// + public void CreatePurchaseComponentReport(ExcelInfo info) + { + CreateExcel(info); + + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = 1, + Text = info.Title, + StyleInfo = ExcelStyleInfoType.Title + }); + + MergeCells(new ExcelMergeParameters + { + CellFromName = "A1", + CellToName = "E1" + }); + + uint rowIndex = 2; + foreach (var bg in info.PurchaseComponent) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = rowIndex, + Text = bg.Id.ToString(), + StyleInfo = ExcelStyleInfoType.Text + }); + rowIndex++; + + foreach (var build in bg.Builds) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "B", + RowIndex = rowIndex, + Text = build.Build, + StyleInfo = ExcelStyleInfoType.TextWithBroder + }); + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = build.count.ToString(), + StyleInfo = ExcelStyleInfoType.TextWithBroder + }); + + rowIndex++; + foreach (var component in build.Item3) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "D", + RowIndex = rowIndex, + Text = component.Component, + StyleInfo = ExcelStyleInfoType.TextWithBroder + }); + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "E", + RowIndex = rowIndex, + Text = component.count.ToString(), + StyleInfo = ExcelStyleInfoType.TextWithBroder + }); + + rowIndex++; + } + } + + rowIndex++; + } + + SaveExcel(info); + } + + /// + /// Создание excel-файла + /// + /// + protected abstract void CreateExcel(ExcelInfo info); /// /// Добавляем новую ячейку в лист diff --git a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs index b7b704a..362d0ba 100644 --- a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs +++ b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -57,11 +57,86 @@ namespace HardwareShopBusinessLogic.OfficePackage SaveWord(info); } - /// + public void CreateBuildPurchaseReport(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 rows = new List(); + rows.Add(new WordRow + { + Rows = new List<(string, WordTextProperties)> { + ("Покупки", new WordTextProperties { Size = "24", Bold = true }), + ("Сборки", new WordTextProperties { Size = "24", Bold = true }), + ("Количество", new WordTextProperties { Size = "24", Bold = true }), + ("Компоненты", new WordTextProperties { Size = "24", Bold = true }), + ("Количество", new WordTextProperties { Size = "24", Bold = true }) + } + }); + + var reportRecords = info.PurchaseComponent; + foreach (var reportRecord in reportRecords) + { + rows.Add(new WordRow + { + Rows = new List<(string, WordTextProperties)> + { + (reportRecord.Id.ToString(), new WordTextProperties { }), + ("", new WordTextProperties { }), + ("", new WordTextProperties { }), + ("", new WordTextProperties { }), + ("", new WordTextProperties { }) + } + }); + for (int i = 0; i < reportRecord.Builds.Count; i++) + { + rows.Add(new WordRow + { + Rows = new List<(string, WordTextProperties)> + { + ("", new WordTextProperties { }), + (reportRecord.Builds[i].Build, new WordTextProperties { }), + (reportRecord.Builds[i].count.ToString(), new WordTextProperties { }), + ("", new WordTextProperties { }), + ("", new WordTextProperties { }) + } + }); + for(int j = 0; j < reportRecord.Builds[i].Item3.Count; j++) + { + rows.Add(new WordRow + { + Rows = new List<(string, WordTextProperties)> + { + ("", new WordTextProperties { }), + ("", new WordTextProperties { }), + ("", new WordTextProperties { }), + (reportRecord.Builds[i].Item3[j].Component, new WordTextProperties { }), + (reportRecord.Builds[i].Item3[j].count.ToString(), new WordTextProperties { }) + } + }); + } + } + } + + CreateTable(rows); + + SaveWord(info); + } + + /// /// Создание doc-файла /// /// - protected abstract void CreateWord(WordInfo info); + protected abstract void CreateWord(WordInfo info); /// /// Создание таблицы diff --git a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs index b85af0c..9c7156d 100644 --- a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs +++ b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs @@ -9,5 +9,7 @@ namespace HardwareShopBusinessLogic.OfficePackage.HelperModels public string Title { get; set; } = string.Empty; public List BuildGood { get; set; } = new(); - } + + public List PurchaseComponent { get; set; } = new(); + } } \ No newline at end of file diff --git a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs index 2640fa6..fc62c87 100644 --- a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs +++ b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -9,5 +9,7 @@ namespace HardwareShopBusinessLogic.OfficePackage.HelperModels public string Title { get; set; } = string.Empty; public List BuildGood { get; set; } = new(); - } + + public List PurchaseComponent { get; set; } = new(); + } } \ No newline at end of file diff --git a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs index b3a6874..921eeb0 100644 --- a/HardwareShop/HardwareShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs +++ b/HardwareShop/HardwareShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs @@ -111,7 +111,7 @@ namespace HardwareShopBusinessLogic.OfficePackage.Implements TableGrid tableGrid = new TableGrid(); for (int j = 0; j < data[0].Rows.Count; ++j) { - tableGrid.AppendChild(new GridColumn() { Width = "3200" }); + tableGrid.AppendChild(new GridColumn() { Width = "1600" }); } table.AppendChild(tableGrid); for (int i = 0; i < data.Count; ++i) diff --git a/HardwareShop/HardwareShopContracts/BindingModels/PurchaseBindingModel.cs b/HardwareShop/HardwareShopContracts/BindingModels/PurchaseBindingModel.cs index ad97e96..d359473 100644 --- a/HardwareShop/HardwareShopContracts/BindingModels/PurchaseBindingModel.cs +++ b/HardwareShop/HardwareShopContracts/BindingModels/PurchaseBindingModel.cs @@ -31,5 +31,11 @@ namespace HardwareShopContracts.BindingModels get; set; } = new(); + + public List Purchases + { + get; + set; + } = new(); } } diff --git a/HardwareShop/HardwareShopContracts/BusinessLogicsContracts/IWorkerReportLogic.cs b/HardwareShop/HardwareShopContracts/BusinessLogicsContracts/IWorkerReportLogic.cs index 40d4205..9eee930 100644 --- a/HardwareShop/HardwareShopContracts/BusinessLogicsContracts/IWorkerReportLogic.cs +++ b/HardwareShop/HardwareShopContracts/BusinessLogicsContracts/IWorkerReportLogic.cs @@ -23,18 +23,18 @@ namespace HardwareShopContracts.BusinessLogicsContracts /// Сохранение компонент с указаеним покупок в файл-Word /// /// - void SaveComponentsToWordFile(ReportBindingModel model); + byte[] SavePurchasesToWordFile(ReportBindingModel model, List purchases); /// /// Сохранение компонент с указаеним покупок в файл-Excel /// /// - void SaveDishComponentToExcelFile(ReportBindingModel model); + byte[] SavePurchasesToExcelFile(ReportBindingModel model, List purchases); - /// - /// Сохранение отчёта по покупкам в файл-Pdf - /// - /// - void SaveOrdersToPdfFile(ReportBindingModel model); + /// + /// Сохранение отчёта по покупкам в файл-Pdf + /// + /// + void SaveOrdersToPdfFile(ReportBindingModel model); } } \ No newline at end of file diff --git a/HardwareShop/HardwareShopDatabaseImplement/Implements/Worker/PurchaseStorage.cs b/HardwareShop/HardwareShopDatabaseImplement/Implements/Worker/PurchaseStorage.cs index 1d7aa8e..1c79500 100644 --- a/HardwareShop/HardwareShopDatabaseImplement/Implements/Worker/PurchaseStorage.cs +++ b/HardwareShop/HardwareShopDatabaseImplement/Implements/Worker/PurchaseStorage.cs @@ -82,6 +82,8 @@ namespace HardwareShopDatabaseImplement.Implements.Worker .ThenInclude(x => x.Good) .Include(x => x.Builds) .ThenInclude(x => x.Build) + .ThenInclude(x => x.Components) + .ThenInclude(x => x.Component) .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) ?.GetViewModel; } diff --git a/HardwareShop/HardwareShopRestApi/$q.doc b/HardwareShop/HardwareShopRestApi/$q.doc deleted file mode 100644 index d0726ba386d07651986c19072deca4cfa36ae15f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1501 zcmWIWW@Zs#VBp|jm^E`_n1%b7{4CVPnDf%h-$)&lec_n%kxjApc zPG{XQ5cw;*uy*mu=AbhbPQo6$HI^<}8hd)vvBe7BZj+ABTyrb$v*=rKmB`i!K6Q@& z7RUWGG`TWUQ^ae*-5*}x6#<^b6sG}9t*)4+MKFgg_4fXDRxyil9 zUNSszRpiX#rveYA_O6mRKSx{1NoV%QIk$9U3s|?VG_x$-U@EzCizoMD$?amdo=$qx z<96QDul3Nv)J2zFJ6u0kq&rz8uIPFea%={pq`Abz3ENmxFEC{VY1GAd$t6cw-JRO% zb-Oil_l?c_PM?coR*daj({aYi;>@?tE48xL-SuHS()w`PY|G=5o$KGPf308lGGCy@ zd;c1HbLkWM6Zfw=|5r6d@6X)*&0lp_?RWZlD&FMeZHEU@v&y!#X-$lMu|oJ~n_kJw z1h?%P4fR@nmAB4vUS$rDycfUuvTOb11v{QdZ2P8j?C(~U`MbVyC~vyS=CNq*<)2kO z0bxu2e0|?ww~l#Y{JI$@{IylX#1!~ht5aR1rb!-g)@9_cyUY5$^vL1LPY>2)&)%s1 zFrawJ)XfDgQEDzd_8oJgzf22%5%D~P^=z8H6(q{eA6@kJtN8i#PpDU%TUC^UZJf%i_$h1&gKbIqCb>eO>0cnc3B%H-9@U>19Y< zFx%{0z{9FzavZ0>sY{Ffz2A6}KLDCu7#L;))64mul{>W<85lsA8<<|=i&Arn_4PpH z``!C(?13ppp)9qiI5R)bR>@G$KuIArFF8LYGcVm%sk9_b*FwqO&L$`|C$R*mqBtY7 zpjZK@C9l|4DWjyMz)D}gI5{IVH?deRzaTXaD3g|7l$%%ru&}6B9FIB?Wyu8+{ZX+o1;OeQBofC}41curM%4qn-2fN`Sd99^{MS zSWqS;K4`&u$PChCh`qWcAbWv9>XMq4SejF!;93E64kSi_Zc$Qzx(^b_i3J5YnaSX& z&@anNL5nwCNch1E6i}!Y6y+zU78e7PL~f2ATqZX$Gfx|AJTSbl*bGWxq*)D3E}*oD zNGWhD^uZwoj0#335eD4lAuv9W07j%Ev}4a62)zctLKZ2rpld`=1PG1I%vh5|fHx}} PND(s-?gY|&tRNl$lW95O diff --git a/HardwareShop/HardwareShopRestApi/Controllers/ReportController.cs b/HardwareShop/HardwareShopRestApi/Controllers/ReportController.cs index d00a628..4083037 100644 --- a/HardwareShop/HardwareShopRestApi/Controllers/ReportController.cs +++ b/HardwareShop/HardwareShopRestApi/Controllers/ReportController.cs @@ -42,5 +42,31 @@ namespace HardwareShopRestApi.Controllers throw; } } - } + + + [HttpPost] + public void BuildPurchaseReport(PurchaseBindingModel model, string format, string filename) + { + try + { + switch (format) + { + case "doc": + _reportWorkerLogic.SavePurchasesToWordFile(new ReportBindingModel { FileName = filename }, model.Purchases); + break; + case "excel": + _reportWorkerLogic.SavePurchasesToExcelFile(new ReportBindingModel { FileName = filename }, model.Purchases); + break; + default: + throw new FormatException("Неправильный формат файла"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения списка сборок по выбранным товарам"); + throw; + } + } + } + } diff --git a/HardwareShop/HardwareShopWorkerApp/Controllers/HomeController.cs b/HardwareShop/HardwareShopWorkerApp/Controllers/HomeController.cs index 877c9b4..db2efef 100644 --- a/HardwareShop/HardwareShopWorkerApp/Controllers/HomeController.cs +++ b/HardwareShop/HardwareShopWorkerApp/Controllers/HomeController.cs @@ -289,11 +289,6 @@ namespace HardwareShopWorkerApp.Controllers Response.Redirect("Comments"); } - public IActionResult listComponents() - { - return View(); - } - [HttpGet] public IActionResult Purchases() { @@ -325,6 +320,50 @@ namespace HardwareShopWorkerApp.Controllers return result; } + [HttpGet] + public IActionResult ListComponents() + { + if (APIClient.User == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.Purchases = APIClient.GetRequest>($"api/purchase/getpurchases?userId={APIClient.User.Id}"); + return View(); + } + + [HttpPost] + public void ListComponents([FromBody] PurchaseBindingModel goodModel, [FromQuery] string format, [FromQuery] string filename) + { + if (APIClient.User == null) + { + throw new Exception("Вы как сюда попали? Сюда вход только авторизованным"); + } + if (string.IsNullOrEmpty(format)) + { + throw new FormatException($"Неправильный формат файла: {format}"); + } + if (string.IsNullOrEmpty(filename)) + { + throw new FormatException($"Неправильное название файла: {filename}"); + } + APIClient.PostRequest($"api/report/buildpurchasereport?format={format}&filename=${filename}", goodModel); + } + + [HttpGet] + public GoodViewModel? GetPurchase(int Id) + { + if (APIClient.User == null) + { + throw new Exception("Вы как сюда попали? Сюда вход только авторизованным"); + } + var result = APIClient.GetRequest($"api/purchase/getpurchase?purchaseId={Id}"); + if (result == null) + { + return default; + } + return result; + } + [HttpGet] public IActionResult CreatePurchase() { diff --git a/HardwareShop/HardwareShopWorkerApp/Views/Home/listComponents.cshtml b/HardwareShop/HardwareShopWorkerApp/Views/Home/listComponents.cshtml index 34055ca..edad62f 100644 --- a/HardwareShop/HardwareShopWorkerApp/Views/Home/listComponents.cshtml +++ b/HardwareShop/HardwareShopWorkerApp/Views/Home/listComponents.cshtml @@ -1,65 +1,136 @@ -@{ - ViewData["Title"] = "ListComponents"; +@using HardwareShopContracts.ViewModels +@{ + ViewData["Title"] = "Получение списка"; Layout = "~/Views/Shared/_LayoutWorker.cshtml"; } -
-
-
-

Покупки

-
-
- - - - - - - - - - - -
- Номер - - Дата оплаты - - Сумма - - Статус -
-
-
-
- - - - - -
+
+

Получение списка покупок

+
-