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();
+ }
+ }
}
}