From 31de9adbeaffdb2aab8d30ec2aa6c4c099cf0f22 Mon Sep 17 00:00:00 2001 From: antoc0der <1@DESKTOP-K1L8ND3> Date: Thu, 4 Apr 2024 11:38:58 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=8C=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OfficePackage/AbstractSaveToExcel.cs | 66 ++++++++++++++++ .../OfficePackage/AbstractSaveToPdf.cs | 34 ++++++++ .../OfficePackage/AbstractSaveToWord.cs | 29 +++++++ .../OfficePackage/HelperModels/ExcelInfo.cs | 1 + .../OfficePackage/HelperModels/PdfInfo.cs | 1 + .../OfficePackage/HelperModels/WordInfo.cs | 1 + .../OfficePackage/HelperModels/WordTable.cs | 15 ++++ .../OfficePackage/Implements/SaveToWord.cs | 77 +++++++++++++++++++ FlowerShopBusinessLogic/ReportLogic.cs | 66 +++++++++++++++- .../BusinessLogicsContracts/IReportLogic.cs | 5 ++ .../ViewModels/ReportDateOrdersViewModel.cs | 15 ++++ .../ViewModels/ReportShopFlowerViewModel.cs | 15 ++++ ProjectFlowerShop/MainForm.Designer.cs | 29 ++++++- ProjectFlowerShop/MainForm.cs | 32 ++++++++ 14 files changed, 384 insertions(+), 2 deletions(-) create mode 100644 FlowerShopBusinessLogic/OfficePackage/HelperModels/WordTable.cs create mode 100644 FlowerShopContracts/ViewModels/ReportDateOrdersViewModel.cs create mode 100644 FlowerShopContracts/ViewModels/ReportShopFlowerViewModel.cs diff --git a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs index 1f6abe9..7d3d6c7 100644 --- a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs +++ b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -78,6 +78,72 @@ namespace FlowerShopBusinessLogic.OfficePackage } 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 pc in info.ShopFlowers) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = rowIndex, + Text = pc.ShopName, + StyleInfo = ExcelStyleInfoType.Text + }); + rowIndex++; + foreach (var flower in pc.Flowers) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "B", + RowIndex = rowIndex, + Text = flower.Item1, + StyleInfo = + ExcelStyleInfoType.TextWithBroder + }); + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = flower.Item2.ToString(), + StyleInfo = + ExcelStyleInfoType.TextWithBroder + }); + rowIndex++; + } + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = rowIndex, + Text = "Итого", + StyleInfo = ExcelStyleInfoType.Text + }); + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = pc.TotalCount.ToString(), + StyleInfo = ExcelStyleInfoType.Text + }); + rowIndex++; + } + SaveExcel(info); + } + /// /// Создание excel-файла /// diff --git a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToPdf.cs index abb41fd..9b0e8a4 100644 --- a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToPdf.cs +++ b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToPdf.cs @@ -48,6 +48,40 @@ namespace FlowerShopBusinessLogic.OfficePackage }); SavePdf(info); } + + public void CreateReportDateDoc(PdfInfo info) + { + CreatePdf(info); + CreateParagraph(new PdfParagraph + { + Text = info.Title, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + CreateTable(new List { "3cm", "3cm", "7cm" }); + CreateRow(new PdfRowParameters + { + Texts = new List { "Дата", "Количество", "Сумма" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + foreach (var order in info.DateOrders) + { + CreateRow(new PdfRowParameters + { + Texts = new List { order.DateOfOrders.ToShortDateString(), order.Count.ToString(), order.Sum.ToString() }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + CreateParagraph(new PdfParagraph + { + Text = $"Итого: {info.DateOrders.Sum(x => x.Sum)}\t", + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + SavePdf(info); + } /// /// Создание doc-файла /// diff --git a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs index 619115a..54c7522 100644 --- a/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs +++ b/FlowerShopBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -1,5 +1,6 @@ using FlowerShopBusinessLogic.OfficePackage.HelperEnums; using FlowerShopBusinessLogic.OfficePackage.HelperModels; +using DocumentFormat.OpenXml.Office2010.ExcelAc; using System; using System.Collections.Generic; using System.Linq; @@ -53,5 +54,33 @@ namespace FlowerShopBusinessLogic.OfficePackage /// /// protected abstract void SaveWord(WordInfo info); + protected abstract void CreateTable(WordTable table); + + public void CreateTableDoc(WordInfo info) + { + CreateWord(info); + List> list = new List>(); + foreach (var shop in info.Shops) + { + var ls = new List + { + shop.ShopName, + shop.Address, + shop.DateOpen.ToShortDateString() + }; + list.Add(ls); + } + var wordTable = new WordTable + { + Headers = new List { + "Название", + "Адрес", + "Дата открытия"}, + Columns = 3, + RowText = list + }; + CreateTable(wordTable); + SaveWord(info); + } } } diff --git a/FlowerShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/FlowerShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs index 378f150..40089b2 100644 --- a/FlowerShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs +++ b/FlowerShopBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs @@ -12,5 +12,6 @@ namespace FlowerShopBusinessLogic.OfficePackage.HelperModels public string FileName { get; set; } = string.Empty; public string Title { get; set; } = string.Empty; public List FlowerComponents { get; set; } = new(); + public List ShopFlowers { get; set; } = new(); } } diff --git a/FlowerShopBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/FlowerShopBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs index bd8b32f..b7840d1 100644 --- a/FlowerShopBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs +++ b/FlowerShopBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs @@ -14,5 +14,6 @@ namespace FlowerShopBusinessLogic.OfficePackage.HelperModels public DateTime DateFrom { get; set; } public DateTime DateTo { get; set; } public List Orders { get; set; } = new(); + public List DateOrders { get; set; } = new(); } } diff --git a/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs index 6d8fc83..022f7f1 100644 --- a/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs +++ b/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -12,5 +12,6 @@ namespace FlowerShopBusinessLogic.OfficePackage.HelperModels public string FileName { get; set; } = string.Empty; public string Title { get; set; } = string.Empty; public List Flowers { get; set; } = new(); + public List Shops { get; set; } = new(); } } diff --git a/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordTable.cs b/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordTable.cs new file mode 100644 index 0000000..5b99380 --- /dev/null +++ b/FlowerShopBusinessLogic/OfficePackage/HelperModels/WordTable.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlowerShopBusinessLogic.OfficePackage.HelperModels +{ + public class WordTable + { + public List Headers { get; set; } = new(); + public List> RowText { get; set; } = new(); + public int Columns { get; set; } + } +} diff --git a/FlowerShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/FlowerShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs index df65399..d01fc7b 100644 --- a/FlowerShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs +++ b/FlowerShopBusinessLogic/OfficePackage/Implements/SaveToWord.cs @@ -117,5 +117,82 @@ namespace FlowerShopBusinessLogic.OfficePackage.Implements _wordDocument.Dispose(); } + protected override void CreateTable(WordTable table) + { + if (_docBody == null || table == null) + { + return; + } + Table docTable = new Table(); + TableProperties tableProps = new TableProperties( + new TopBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }, + new BottomBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }, + new LeftBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }, + new RightBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }, + new InsideHorizontalBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }, + new InsideVerticalBorder + { + Val = new EnumValue(BorderValues.Single), + Size = 12 + }); + docTable.AppendChild(tableProps); + TableGrid tableGrid = new TableGrid(); + for (int i = 0; i < table.Columns; i++) + { + tableGrid.AppendChild(new GridColumn()); + } + docTable.AppendChild(tableGrid); + TableRow tableRow = new TableRow(); + foreach (var text in table.Headers) + { + tableRow.AppendChild(CreateTableCell(text)); + } + int height = table.RowText.Count; + int width = table.Columns; + for (int i = 0; i < height; i++) + { + tableRow = new TableRow(); + for (int j = 0; j < width; j++) + { + var element = table.RowText[i][j]; + tableRow.AppendChild(CreateTableCell(element)); + } + docTable.AppendChild(tableRow); + } + + _docBody.AppendChild(docTable); + } + + private TableCell CreateTableCell(string element) + { + var tableParagraph = new Paragraph(); + var run = new Run(); + run.AppendChild(new Text { Text = element }); + tableParagraph.AppendChild(run); + var tableCell = new TableCell(); + tableCell.AppendChild(tableParagraph); + return tableCell; + } + } } diff --git a/FlowerShopBusinessLogic/ReportLogic.cs b/FlowerShopBusinessLogic/ReportLogic.cs index 68be034..6a02b57 100644 --- a/FlowerShopBusinessLogic/ReportLogic.cs +++ b/FlowerShopBusinessLogic/ReportLogic.cs @@ -18,17 +18,21 @@ namespace FlowerShopBusinessLogic private readonly IComponentStorage _componentStorage; private readonly IFlowerStorage _flowerStorage; private readonly IOrderStorage _orderStorage; + private readonly IShopStorage _shopStorage; + private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToPdf _saveToPdf; public ReportLogic(IFlowerStorage flowerStorage, IComponentStorage - componentStorage, IOrderStorage orderStorage, + componentStorage, IOrderStorage orderStorage, IShopStorage shopStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf) { _flowerStorage = flowerStorage; _componentStorage = componentStorage; _orderStorage = orderStorage; + _shopStorage = shopStorage; + _saveToExcel = saveToExcel; _saveToWord = saveToWord; _saveToPdf = saveToPdf; @@ -124,5 +128,65 @@ namespace FlowerShopBusinessLogic Orders = GetOrders(model) }); } + + public List GetShopsFlowers() + { + var shops = _shopStorage.GetFullList(); + var list = new List(); + foreach (var shop in shops) + { + var record = new ReportShopFlowerViewModel + { + ShopName = shop.ShopName, + Flowers = new List>(), + TotalCount = 0 + }; + foreach (var flower in shop.ShopFlowers) + { + record.Flowers.Add(new Tuple(flower.Value.Item1.FlowerName, flower.Value.Item2)); + record.TotalCount += + flower.Value.Item2; + } + list.Add(record); + } + return list; + } + public List GetDatesOrders() + { + return _orderStorage.GetFullList().GroupBy(x => x.DateCreate.Date).Select(x => new ReportDateOrdersViewModel + { + DateOfOrders = x.Key, + Count = x.Count(), + Sum = x.Sum(y => y.Sum) + }).ToList(); + } + public void SaveDatesOrdersToPdfFile(ReportBindingModel model) + { + _saveToPdf.CreateReportDateDoc(new PdfInfo + { + FileName = model.FileName, + Title = "Заказы по датам", + DateOrders = GetDatesOrders() + }); + } + public void SaveShopsToWordFile(ReportBindingModel model) + { + var tmp = _shopStorage.GetFullList(); + _saveToWord.CreateTableDoc(new WordInfo + { + FileName = model.FileName, + Title = "Список магазинов", + Shops = _shopStorage.GetFullList() + }); + } + public void SaveShopsFlowersToExcelFile(ReportBindingModel model) + { + _saveToExcel.CreateShopReport(new ExcelInfo + { + FileName = model.FileName, + Title = "Загруженность магазинов", + ShopFlowers = GetShopsFlowers() + }); + } } } diff --git a/FlowerShopContracts/BusinessLogicsContracts/IReportLogic.cs b/FlowerShopContracts/BusinessLogicsContracts/IReportLogic.cs index 0b68630..4e8720e 100644 --- a/FlowerShopContracts/BusinessLogicsContracts/IReportLogic.cs +++ b/FlowerShopContracts/BusinessLogicsContracts/IReportLogic.cs @@ -36,5 +36,10 @@ namespace FlowerShopContracts.BusinessLogicsContracts /// /// void SaveOrdersToPdfFile(ReportBindingModel model); + List GetDatesOrders(); + List GetShopsFlowers(); + void SaveShopsToWordFile(ReportBindingModel model); + void SaveShopsFlowersToExcelFile(ReportBindingModel model); + void SaveDatesOrdersToPdfFile(ReportBindingModel model); } } diff --git a/FlowerShopContracts/ViewModels/ReportDateOrdersViewModel.cs b/FlowerShopContracts/ViewModels/ReportDateOrdersViewModel.cs new file mode 100644 index 0000000..7edb39d --- /dev/null +++ b/FlowerShopContracts/ViewModels/ReportDateOrdersViewModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlowerShopContracts.ViewModels +{ + public class ReportDateOrdersViewModel + { + public DateTime DateOfOrders { get; set; } + public int Count { get; set; } + public double Sum { get; set; } + } +} diff --git a/FlowerShopContracts/ViewModels/ReportShopFlowerViewModel.cs b/FlowerShopContracts/ViewModels/ReportShopFlowerViewModel.cs new file mode 100644 index 0000000..5afbe20 --- /dev/null +++ b/FlowerShopContracts/ViewModels/ReportShopFlowerViewModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlowerShopContracts.ViewModels +{ + public class ReportShopFlowerViewModel + { + public string ShopName { get; set; } = string.Empty; + public int TotalCount { get; set; } + public List> Flowers { get; set; } = new(); + } +} diff --git a/ProjectFlowerShop/MainForm.Designer.cs b/ProjectFlowerShop/MainForm.Designer.cs index 519615d..23cfa6b 100644 --- a/ProjectFlowerShop/MainForm.Designer.cs +++ b/ProjectFlowerShop/MainForm.Designer.cs @@ -45,6 +45,9 @@ ReadyButton = new Button(); IssuedButton = new Button(); RefreshButton = new Button(); + списокМагазиновToolStripMenuItem = new ToolStripMenuItem(); + цветыПоМагазинамToolStripMenuItem = new ToolStripMenuItem(); + заказыПоДатамToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); SuspendLayout(); @@ -103,7 +106,7 @@ // // отчетыToolStripMenuItem // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокКомпонентовToolStripMenuItem, компонентыToolStripMenuItem, списокЗаказовToolStripMenuItem }); + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокКомпонентовToolStripMenuItem, компонентыToolStripMenuItem, списокЗаказовToolStripMenuItem, списокМагазиновToolStripMenuItem, цветыПоМагазинамToolStripMenuItem, заказыПоДатамToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; отчетыToolStripMenuItem.Size = new Size(73, 24); отчетыToolStripMenuItem.Text = "Отчеты"; @@ -188,6 +191,27 @@ RefreshButton.UseVisualStyleBackColor = true; RefreshButton.Click += RefreshButton_Click; // + // списокМагазиновToolStripMenuItem + // + списокМагазиновToolStripMenuItem.Name = "списокМагазиновToolStripMenuItem"; + списокМагазиновToolStripMenuItem.Size = new Size(280, 26); + списокМагазиновToolStripMenuItem.Text = "Список магазинов"; + списокМагазиновToolStripMenuItem.Click += списокМагазиновToolStripMenuItem_Click; + // + // цветыПоМагазинамToolStripMenuItem + // + цветыПоМагазинамToolStripMenuItem.Name = "цветыПоМагазинамToolStripMenuItem"; + цветыПоМагазинамToolStripMenuItem.Size = new Size(280, 26); + цветыПоМагазинамToolStripMenuItem.Text = "Цветы по магазинам"; + цветыПоМагазинамToolStripMenuItem.Click += цветыПоМагазинамToolStripMenuItem_Click; + // + // заказыПоДатамToolStripMenuItem + // + заказыПоДатамToolStripMenuItem.Name = "заказыПоДатамToolStripMenuItem"; + заказыПоДатамToolStripMenuItem.Size = new Size(280, 26); + заказыПоДатамToolStripMenuItem.Text = "Заказы по датам"; + заказыПоДатамToolStripMenuItem.Click += заказыПоДатамToolStripMenuItem_Click; + // // MainForm // AutoScaleDimensions = new SizeF(8F, 20F); @@ -230,5 +254,8 @@ private ToolStripMenuItem списокКомпонентовToolStripMenuItem; private ToolStripMenuItem компонентыToolStripMenuItem; private ToolStripMenuItem списокЗаказовToolStripMenuItem; + private ToolStripMenuItem списокМагазиновToolStripMenuItem; + private ToolStripMenuItem цветыПоМагазинамToolStripMenuItem; + private ToolStripMenuItem заказыПоДатамToolStripMenuItem; } } \ No newline at end of file diff --git a/ProjectFlowerShop/MainForm.cs b/ProjectFlowerShop/MainForm.cs index 2b48504..cea38b6 100644 --- a/ProjectFlowerShop/MainForm.cs +++ b/ProjectFlowerShop/MainForm.cs @@ -240,5 +240,37 @@ namespace ProjectFlowerShop form.ShowDialog(); } } + + private void списокМагазиновToolStripMenuItem_Click(object sender, EventArgs e) + { + using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; + if (dialog.ShowDialog() == DialogResult.OK) + { + _reportLogic.SaveShopsToWordFile(new ReportBindingModel + { + FileName = dialog.FileName + }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } + + private void цветыПоМагазинамToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReportShopsFlowers)); + if (service is FormReportShopsFlowers form) + { + form.ShowDialog(); + } + } + + private void заказыПоДатамToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReportDateOrders)); + if (service is FormReportDateOrders form) + { + form.ShowDialog(); + } + } } }