From 989814f107c28e283254f490d49dfd636826d93d Mon Sep 17 00:00:00 2001 From: Aleksandr4350 Date: Fri, 20 Dec 2024 01:07:20 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=B1=D0=B5=D0=B4=D0=B0=D0=B0?= =?UTF-8?q?=D0=B0=D0=B0=D0=B0=D0=B0=D0=B0=D0=B0=D0=B0=D0=B0=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectLibrary/Entites/Book_Orders.cs | 6 +- ProjectLibrary/Entites/Orders.cs | 16 +- ProjectLibrary/Entites/TempBookOrders.cs | 19 +++ ProjectLibrary/FormLibrary.Designer.cs | 20 ++- ProjectLibrary/FormLibrary.cs | 26 +++- ProjectLibrary/Forms/FBookReport.Designer.cs | 142 ++++++++++++++++++ ProjectLibrary/Forms/FBookReport.cs | 66 ++++++++ .../{FormDocReport.resx => FBookReport.resx} | 0 ...ort.Designer.cs => FDocReport.Designer.cs} | 2 +- .../Forms/{FormDocReport.cs => FDocReport.cs} | 4 +- ProjectLibrary/Forms/FDocReport.resx | 120 +++++++++++++++ ProjectLibrary/Forms/FOrder.Designer.cs | 49 +++--- ProjectLibrary/Forms/FOrder.cs | 2 +- ProjectLibrary/Forms/FOrder.resx | 3 + .../FOrderDistributionReport.Designer.cs | 109 ++++++++++++++ .../Forms/FOrderDistributionReport.cs | 65 ++++++++ .../Forms/FOrderDistributionReport.resx | 120 +++++++++++++++ ProjectLibrary/ProjectLibrary.csproj | 1 + ProjectLibrary/Reports/ChartReport.cs | 46 ++++++ ProjectLibrary/Reports/PdfBuilder.cs | 88 +++++++++++ ProjectLibrary/Reports/TableReport.cs | 66 ++++++++ .../Implementations/OrderRepository.cs | 19 ++- 22 files changed, 953 insertions(+), 36 deletions(-) create mode 100644 ProjectLibrary/Entites/TempBookOrders.cs create mode 100644 ProjectLibrary/Forms/FBookReport.Designer.cs create mode 100644 ProjectLibrary/Forms/FBookReport.cs rename ProjectLibrary/Forms/{FormDocReport.resx => FBookReport.resx} (100%) rename ProjectLibrary/Forms/{FormDocReport.Designer.cs => FDocReport.Designer.cs} (99%) rename ProjectLibrary/Forms/{FormDocReport.cs => FDocReport.cs} (95%) create mode 100644 ProjectLibrary/Forms/FDocReport.resx create mode 100644 ProjectLibrary/Forms/FOrderDistributionReport.Designer.cs create mode 100644 ProjectLibrary/Forms/FOrderDistributionReport.cs create mode 100644 ProjectLibrary/Forms/FOrderDistributionReport.resx create mode 100644 ProjectLibrary/Reports/ChartReport.cs create mode 100644 ProjectLibrary/Reports/PdfBuilder.cs create mode 100644 ProjectLibrary/Reports/TableReport.cs diff --git a/ProjectLibrary/Entites/Book_Orders.cs b/ProjectLibrary/Entites/Book_Orders.cs index 6f7c6e2..9b6f030 100644 --- a/ProjectLibrary/Entites/Book_Orders.cs +++ b/ProjectLibrary/Entites/Book_Orders.cs @@ -10,13 +10,15 @@ namespace ProjectLibrary.Entites { public int BookID { get; private set; } public int OrderID { get; private set; } + public int Count { get; private set; } - public static Book_Orders CreateEntity(int orderID,int bookID ) + public static Book_Orders CreateEntity(int orderID,int bookID, int count ) { return new Book_Orders { BookID = bookID, - OrderID = orderID + OrderID = orderID, + Count = count }; } } diff --git a/ProjectLibrary/Entites/Orders.cs b/ProjectLibrary/Entites/Orders.cs index f395901..03f05db 100644 --- a/ProjectLibrary/Entites/Orders.cs +++ b/ProjectLibrary/Entites/Orders.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualBasic; +using DocumentFormat.OpenXml.Office2010.Excel; +using Microsoft.VisualBasic; +using ProjectLibrary.Entities; using System; using System.Collections.Generic; using System.Linq; @@ -31,5 +33,17 @@ namespace ProjectLibrary.Entites BookOrders = bookOrders }; } + + public static Orders CreateEntity(TempBookOrders tempBookOrders, IEnumerable bookOrders) + { + return new Orders + { + Id = tempBookOrders.Id, + OrderDate = tempBookOrders.OrderDate, + ReturnDate = tempBookOrders.ReturnDate, + ReaderID = tempBookOrders.ReaderID, + BookOrders = bookOrders + }; + } } } diff --git a/ProjectLibrary/Entites/TempBookOrders.cs b/ProjectLibrary/Entites/TempBookOrders.cs new file mode 100644 index 0000000..3597cd2 --- /dev/null +++ b/ProjectLibrary/Entites/TempBookOrders.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLibrary.Entites; + +public class TempBookOrders +{ + public int Id { get; set; } + public DateTime OrderDate { get; set; } + public DateTime ReturnDate { get; set; } + public int ReaderID { get; set; } + public int BookID { get; set; } + public int Count { get; set; } + + +} diff --git a/ProjectLibrary/FormLibrary.Designer.cs b/ProjectLibrary/FormLibrary.Designer.cs index 90b50fb..9ea1a21 100644 --- a/ProjectLibrary/FormLibrary.Designer.cs +++ b/ProjectLibrary/FormLibrary.Designer.cs @@ -38,6 +38,8 @@ заказатьКнигиToolStripMenuItem = new ToolStripMenuItem(); отчетыToolStripMenuItem = new ToolStripMenuItem(); DocReportToolStripMenuItem = new ToolStripMenuItem(); + bookReportToolStripMenuItem = new ToolStripMenuItem(); + OrderDistributionToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -104,7 +106,7 @@ // // отчетыToolStripMenuItem // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DocReportToolStripMenuItem }); + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DocReportToolStripMenuItem, bookReportToolStripMenuItem, OrderDistributionToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; отчетыToolStripMenuItem.Size = new Size(73, 24); отчетыToolStripMenuItem.Text = "Отчеты"; @@ -116,6 +118,20 @@ DocReportToolStripMenuItem.Text = "Документ со справочниками"; DocReportToolStripMenuItem.Click += DocReportToolStripMenuItem_Click; // + // bookReportToolStripMenuItem + // + bookReportToolStripMenuItem.Name = "bookReportToolStripMenuItem"; + bookReportToolStripMenuItem.Size = new Size(294, 26); + bookReportToolStripMenuItem.Text = "Движение книг"; + bookReportToolStripMenuItem.Click += BookReportToolStripMenuItem_Click; + // + // OrderDistributionToolStripMenuItem + // + OrderDistributionToolStripMenuItem.Name = "OrderDistributionToolStripMenuItem"; + OrderDistributionToolStripMenuItem.Size = new Size(294, 26); + OrderDistributionToolStripMenuItem.Text = "Кол-во книг в библиотеках"; + OrderDistributionToolStripMenuItem.Click += OrderDistributionToolStripMenuItem_Click; + // // FormLibrary // AutoScaleDimensions = new SizeF(8F, 20F); @@ -146,5 +162,7 @@ private ToolStripMenuItem библиотекиToolStripMenuItem; private ToolStripMenuItem заказатьКнигиToolStripMenuItem; private ToolStripMenuItem DocReportToolStripMenuItem; + private ToolStripMenuItem bookReportToolStripMenuItem; + private ToolStripMenuItem OrderDistributionToolStripMenuItem; } } diff --git a/ProjectLibrary/FormLibrary.cs b/ProjectLibrary/FormLibrary.cs index 10df93c..7210948 100644 --- a/ProjectLibrary/FormLibrary.cs +++ b/ProjectLibrary/FormLibrary.cs @@ -76,7 +76,31 @@ namespace ProjectLibrary { try { - _container.Resolve().ShowDialog(); + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void BookReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void OrderDistributionToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); } catch (Exception ex) { diff --git a/ProjectLibrary/Forms/FBookReport.Designer.cs b/ProjectLibrary/Forms/FBookReport.Designer.cs new file mode 100644 index 0000000..2311b0a --- /dev/null +++ b/ProjectLibrary/Forms/FBookReport.Designer.cs @@ -0,0 +1,142 @@ +namespace ProjectLibrary.Forms +{ + partial class FBookReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new Label(); + label3 = new Label(); + label4 = new Label(); + textBoxFilePath = new TextBox(); + dateTimePickerStartDate = new DateTimePicker(); + dateTimePickerEndDate = new DateTimePicker(); + buttonSelectFilePath = new Button(); + buttonMakeReport = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(22, 20); + label1.Name = "label1"; + label1.Size = new Size(112, 20); + label1.TabIndex = 0; + label1.Text = "Путь до файла:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(22, 84); + label3.Name = "label3"; + label3.Size = new Size(97, 20); + label3.TabIndex = 2; + label3.Text = "Дата начала:"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(22, 135); + label4.Name = "label4"; + label4.Size = new Size(90, 20); + label4.TabIndex = 3; + label4.Text = "Дата конца:"; + // + // textBoxFilePath + // + textBoxFilePath.Location = new Point(188, 20); + textBoxFilePath.Name = "textBoxFilePath"; + textBoxFilePath.ReadOnly = true; + textBoxFilePath.Size = new Size(147, 27); + textBoxFilePath.TabIndex = 4; + // + // dateTimePickerStartDate + // + dateTimePickerStartDate.Location = new Point(188, 84); + dateTimePickerStartDate.Name = "dateTimePickerStartDate"; + dateTimePickerStartDate.Size = new Size(181, 27); + dateTimePickerStartDate.TabIndex = 5; + // + // dateTimePickerEndDate + // + dateTimePickerEndDate.Location = new Point(188, 130); + dateTimePickerEndDate.Name = "dateTimePickerEndDate"; + dateTimePickerEndDate.Size = new Size(181, 27); + dateTimePickerEndDate.TabIndex = 6; + // + // buttonSelectFilePath + // + buttonSelectFilePath.BackColor = SystemColors.Control; + buttonSelectFilePath.Location = new Point(341, 20); + buttonSelectFilePath.Name = "buttonSelectFilePath"; + buttonSelectFilePath.Size = new Size(28, 29); + buttonSelectFilePath.TabIndex = 7; + buttonSelectFilePath.Text = ".."; + buttonSelectFilePath.UseVisualStyleBackColor = false; + buttonSelectFilePath.Click += ButtonSelectFilePath_Click; + // + // buttonMakeReport + // + buttonMakeReport.BackColor = SystemColors.Control; + buttonMakeReport.Location = new Point(22, 191); + buttonMakeReport.Name = "buttonMakeReport"; + buttonMakeReport.Size = new Size(347, 29); + buttonMakeReport.TabIndex = 9; + buttonMakeReport.Text = "Сформировать"; + buttonMakeReport.UseVisualStyleBackColor = false; + buttonMakeReport.Click += ButtonMakeReport_Click; + // + // FBookReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(409, 262); + Controls.Add(buttonMakeReport); + Controls.Add(buttonSelectFilePath); + Controls.Add(dateTimePickerEndDate); + Controls.Add(dateTimePickerStartDate); + Controls.Add(textBoxFilePath); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(label1); + Name = "FBookReport"; + Text = "Движение книг"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label3; + private Label label4; + private TextBox textBoxFilePath; + private DateTimePicker dateTimePickerStartDate; + private DateTimePicker dateTimePickerEndDate; + private Button buttonSelectFilePath; + private Button buttonMakeReport; + } +} \ No newline at end of file diff --git a/ProjectLibrary/Forms/FBookReport.cs b/ProjectLibrary/Forms/FBookReport.cs new file mode 100644 index 0000000..f937679 --- /dev/null +++ b/ProjectLibrary/Forms/FBookReport.cs @@ -0,0 +1,66 @@ +using ProjectLibrary.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectLibrary.Forms +{ + public partial class FBookReport : Form + { + IUnityContainer _container; + public FBookReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void ButtonSelectFilePath_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Excel Files | *.xlsx" + }; + if (sfd.ShowDialog() != DialogResult.OK) + { + return; + } + textBoxFilePath.Text = sfd.FileName; + } + + private void ButtonMakeReport_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFilePath.Text)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if (dateTimePickerEndDate.Value <= dateTimePickerStartDate.Value) + { + throw new Exception("Дата начала должна быть раньше даты окончания"); + } + if (_container.Resolve().CreateTable(textBoxFilePath.Text, + dateTimePickerStartDate.Value, dateTimePickerEndDate.Value)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/ProjectLibrary/Forms/FormDocReport.resx b/ProjectLibrary/Forms/FBookReport.resx similarity index 100% rename from ProjectLibrary/Forms/FormDocReport.resx rename to ProjectLibrary/Forms/FBookReport.resx diff --git a/ProjectLibrary/Forms/FormDocReport.Designer.cs b/ProjectLibrary/Forms/FDocReport.Designer.cs similarity index 99% rename from ProjectLibrary/Forms/FormDocReport.Designer.cs rename to ProjectLibrary/Forms/FDocReport.Designer.cs index 506e9e9..5684d0d 100644 --- a/ProjectLibrary/Forms/FormDocReport.Designer.cs +++ b/ProjectLibrary/Forms/FDocReport.Designer.cs @@ -1,6 +1,6 @@ namespace ProjectLibrary.Forms { - partial class FormDocReport + partial class FDocReport { /// /// Required designer variable. diff --git a/ProjectLibrary/Forms/FormDocReport.cs b/ProjectLibrary/Forms/FDocReport.cs similarity index 95% rename from ProjectLibrary/Forms/FormDocReport.cs rename to ProjectLibrary/Forms/FDocReport.cs index d23715c..da03998 100644 --- a/ProjectLibrary/Forms/FormDocReport.cs +++ b/ProjectLibrary/Forms/FDocReport.cs @@ -12,11 +12,11 @@ using Unity; namespace ProjectLibrary.Forms; -public partial class FormDocReport : Form +public partial class FDocReport : Form { private readonly IUnityContainer _container; - public FormDocReport(IUnityContainer container) + public FDocReport(IUnityContainer container) { InitializeComponent(); _container = container ?? throw new ArgumentNullException(nameof(container)); diff --git a/ProjectLibrary/Forms/FDocReport.resx b/ProjectLibrary/Forms/FDocReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectLibrary/Forms/FDocReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectLibrary/Forms/FOrder.Designer.cs b/ProjectLibrary/Forms/FOrder.Designer.cs index 19b91c3..330305d 100644 --- a/ProjectLibrary/Forms/FOrder.Designer.cs +++ b/ProjectLibrary/Forms/FOrder.Designer.cs @@ -28,9 +28,10 @@ buttonCancel_Click = new Button(); comboBox = new ComboBox(); dataGridViewBook = new DataGridView(); - Book = new DataGridViewComboBoxColumn(); dtpOrderDate = new DateTimePicker(); dtptxtReturnDate = new DateTimePicker(); + Book = new DataGridViewComboBoxColumn(); + ColumnCount = new DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize)dataGridViewBook).BeginInit(); SuspendLayout(); // @@ -81,7 +82,7 @@ // // buttonCancel_Click // - buttonCancel_Click.Location = new Point(232, 238); + buttonCancel_Click.Location = new Point(327, 238); buttonCancel_Click.Name = "buttonCancel_Click"; buttonCancel_Click.Size = new Size(100, 30); buttonCancel_Click.TabIndex = 11; @@ -92,19 +93,34 @@ // comboBox.Location = new Point(129, 108); comboBox.Name = "comboBox"; - comboBox.Size = new Size(203, 28); + comboBox.Size = new Size(298, 28); comboBox.TabIndex = 0; // // dataGridViewBook // dataGridViewBook.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridViewBook.Columns.AddRange(new DataGridViewColumn[] { Book }); + dataGridViewBook.Columns.AddRange(new DataGridViewColumn[] { Book, ColumnCount }); dataGridViewBook.Location = new Point(129, 151); dataGridViewBook.Name = "dataGridViewBook"; dataGridViewBook.RowHeadersWidth = 51; - dataGridViewBook.Size = new Size(200, 81); + dataGridViewBook.Size = new Size(298, 81); dataGridViewBook.TabIndex = 12; // + // dtpOrderDate + // + dtpOrderDate.Enabled = false; + dtpOrderDate.Location = new Point(129, 20); + dtpOrderDate.Name = "dtpOrderDate"; + dtpOrderDate.Size = new Size(298, 27); + dtpOrderDate.TabIndex = 13; + // + // dtptxtReturnDate + // + dtptxtReturnDate.Location = new Point(129, 60); + dtptxtReturnDate.Name = "dtptxtReturnDate"; + dtptxtReturnDate.Size = new Size(298, 27); + dtptxtReturnDate.TabIndex = 14; + // // Book // Book.HeaderText = "Book"; @@ -112,24 +128,16 @@ Book.Name = "Book"; Book.Width = 125; // - // dtpOrderDate + // ColumnCount // - dtpOrderDate.Enabled = false; - dtpOrderDate.Location = new Point(129, 20); - dtpOrderDate.Name = "dtpOrderDate"; - dtpOrderDate.Size = new Size(203, 27); - dtpOrderDate.TabIndex = 13; - // - // dtptxtReturnDate - // - dtptxtReturnDate.Location = new Point(129, 60); - dtptxtReturnDate.Name = "dtptxtReturnDate"; - dtptxtReturnDate.Size = new Size(203, 27); - dtptxtReturnDate.TabIndex = 14; + ColumnCount.HeaderText = "Count"; + ColumnCount.MinimumWidth = 6; + ColumnCount.Name = "ColumnCount"; + ColumnCount.Width = 125; // // FOrder // - ClientSize = new Size(372, 332); + ClientSize = new Size(455, 294); Controls.Add(dtptxtReturnDate); Controls.Add(dtpOrderDate); Controls.Add(dataGridViewBook); @@ -150,8 +158,9 @@ private Button buttonCancel_Click; private ComboBox comboBox; private DataGridView dataGridViewBook; - private DataGridViewComboBoxColumn Book; private DateTimePicker dtpOrderDate; private DateTimePicker dtptxtReturnDate; + private DataGridViewComboBoxColumn Book; + private DataGridViewTextBoxColumn ColumnCount; } } diff --git a/ProjectLibrary/Forms/FOrder.cs b/ProjectLibrary/Forms/FOrder.cs index 99c9a78..7da78a2 100644 --- a/ProjectLibrary/Forms/FOrder.cs +++ b/ProjectLibrary/Forms/FOrder.cs @@ -34,7 +34,7 @@ namespace ProjectLibrary.Forms { continue; } - list.Add(Book_Orders.CreateEntity(0, Convert.ToInt32(row.Cells["Book"].Value))); + list.Add(Book_Orders.CreateEntity(0, Convert.ToInt32(row.Cells["Book"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value))); } return list; } diff --git a/ProjectLibrary/Forms/FOrder.resx b/ProjectLibrary/Forms/FOrder.resx index 9770c5a..7a1d51b 100644 --- a/ProjectLibrary/Forms/FOrder.resx +++ b/ProjectLibrary/Forms/FOrder.resx @@ -120,4 +120,7 @@ True + + True + \ No newline at end of file diff --git a/ProjectLibrary/Forms/FOrderDistributionReport.Designer.cs b/ProjectLibrary/Forms/FOrderDistributionReport.Designer.cs new file mode 100644 index 0000000..623add1 --- /dev/null +++ b/ProjectLibrary/Forms/FOrderDistributionReport.Designer.cs @@ -0,0 +1,109 @@ +namespace ProjectLibrary.Forms +{ + partial class FOrderDistributionReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonSelectFileName = new Button(); + labelFileName = new Label(); + label1 = new Label(); + dateTimePicker = new DateTimePicker(); + buttonCreate = new Button(); + SuspendLayout(); + // + // buttonSelectFileName + // + buttonSelectFileName.BackColor = SystemColors.Control; + buttonSelectFileName.Location = new Point(12, 23); + buttonSelectFileName.Name = "buttonSelectFileName"; + buttonSelectFileName.Size = new Size(129, 29); + buttonSelectFileName.TabIndex = 0; + buttonSelectFileName.Text = "Выбрать"; + buttonSelectFileName.UseVisualStyleBackColor = false; + buttonSelectFileName.Click += ButtonSelectFileName_Click; + // + // labelFileName + // + labelFileName.AutoSize = true; + labelFileName.Location = new Point(179, 27); + labelFileName.Name = "labelFileName"; + labelFileName.Size = new Size(45, 20); + labelFileName.TabIndex = 1; + labelFileName.Text = "Файл"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 81); + label1.Name = "label1"; + label1.Size = new Size(44, 20); + label1.TabIndex = 2; + label1.Text = "Дата:"; + // + // dateTimePicker + // + dateTimePicker.Location = new Point(179, 76); + dateTimePicker.Name = "dateTimePicker"; + dateTimePicker.Size = new Size(183, 27); + dateTimePicker.TabIndex = 3; + // + // buttonCreate + // + buttonCreate.BackColor = SystemColors.Control; + buttonCreate.Location = new Point(12, 146); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(350, 29); + buttonCreate.TabIndex = 4; + buttonCreate.Text = "Сформировать"; + buttonCreate.UseVisualStyleBackColor = false; + buttonCreate.Click += ButtonCreate_Click; + // + // FormOrderDistributionReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(395, 227); + Controls.Add(buttonCreate); + Controls.Add(dateTimePicker); + Controls.Add(label1); + Controls.Add(labelFileName); + Controls.Add(buttonSelectFileName); + Name = "FormOrderDistributionReport"; + Text = "FormInvoiceDistributionReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonSelectFileName; + private Label labelFileName; + private Label label1; + private DateTimePicker dateTimePicker; + private Button buttonCreate; + } +} \ No newline at end of file diff --git a/ProjectLibrary/Forms/FOrderDistributionReport.cs b/ProjectLibrary/Forms/FOrderDistributionReport.cs new file mode 100644 index 0000000..1040d39 --- /dev/null +++ b/ProjectLibrary/Forms/FOrderDistributionReport.cs @@ -0,0 +1,65 @@ +using ProjectLibrary.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectLibrary.Forms; + +public partial class FOrderDistributionReport : Form +{ + private string _fileName = string.Empty; + + private readonly IUnityContainer _container; + + public FOrderDistributionReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void ButtonSelectFileName_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Pdf Files | *.pdf" + }; + if (sfd.ShowDialog() == DialogResult.OK) + { + _fileName = sfd.FileName; + labelFileName.Text = Path.GetFileName(_fileName); + } + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(_fileName)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if + (_container.Resolve().CreateChart(_fileName, dateTimePicker.Value)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", + "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} diff --git a/ProjectLibrary/Forms/FOrderDistributionReport.resx b/ProjectLibrary/Forms/FOrderDistributionReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectLibrary/Forms/FOrderDistributionReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectLibrary/ProjectLibrary.csproj b/ProjectLibrary/ProjectLibrary.csproj index 9c16bea..3cd7071 100644 --- a/ProjectLibrary/ProjectLibrary.csproj +++ b/ProjectLibrary/ProjectLibrary.csproj @@ -16,6 +16,7 @@ + diff --git a/ProjectLibrary/Reports/ChartReport.cs b/ProjectLibrary/Reports/ChartReport.cs new file mode 100644 index 0000000..1e0e893 --- /dev/null +++ b/ProjectLibrary/Reports/ChartReport.cs @@ -0,0 +1,46 @@ +using Microsoft.Extensions.Logging; +using ProjectLibrary.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLibrary.Reports; + +public class ChartReport +{ + private readonly IOrderRepository _orderRepository; + private readonly ILogger _logger; + public ChartReport(IOrderRepository orderRepository, ILogger logger) + { + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + public bool CreateChart(string filePath, DateTime dateTime) + { + try + { + new PdfBuilder(filePath) + .AddHeader("Количество книг в библиотеках") + .AddPieChart("Библиотеки", GetData(dateTime)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + private List<(string Caption, double Value)> GetData(DateTime dateTime) + { + return _orderRepository + .ReadOrders() + .Where(x => x.OrderDate.Date == dateTime.Date) + .GroupBy(x => x.BookOrders.First(y => y.OrderID == x.Id).BookID , (key, group) => new { ID = key, Count = group.Sum(y => y.BookOrders.First(z => z.OrderID == y.Id).Count) }) + .Select(x => (x.ID.ToString(), (double)x.Count)) + .ToList(); + } +} diff --git a/ProjectLibrary/Reports/PdfBuilder.cs b/ProjectLibrary/Reports/PdfBuilder.cs new file mode 100644 index 0000000..4f10d81 --- /dev/null +++ b/ProjectLibrary/Reports/PdfBuilder.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.PortableExecutable; +using System.Text; +using System.Threading.Tasks; +using MigraDoc.DocumentObjectModel; +using MigraDoc.DocumentObjectModel.Shapes.Charts; +using MigraDoc.Rendering; + +namespace ProjectLibrary.Reports; + +public class PdfBuilder +{ + private readonly string _filePath; + private readonly Document _document; + public PdfBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _document = new Document(); + DefineStyles(); + } + public PdfBuilder AddHeader(string header) + { + _document.AddSection().AddParagraph(header, "NormalBold"); + return this; + } + + public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data) + { + if (data == null || data.Count == 0) + { + return this; + } + var chart = new Chart(ChartType.Pie2D); + var series = chart.SeriesCollection.AddSeries(); + series.Add(data.Select(x => x.Value).ToArray()); + + var xseries = chart.XValues.AddXSeries(); + xseries.Add(data.Select(x => x.Caption).ToArray()); + + chart.DataLabel.Type = DataLabelType.Percent; + chart.DataLabel.Position = DataLabelPosition.OutsideEnd; + + chart.Width = Unit.FromCentimeter(16); + chart.Height = Unit.FromCentimeter(12); + + chart.TopArea.AddParagraph(title); + + chart.XAxis.MajorTickMark = TickMarkType.Outside; + + chart.YAxis.MajorTickMark = TickMarkType.Outside; + chart.YAxis.HasMajorGridlines = true; + + chart.PlotArea.LineFormat.Width = 1; + chart.PlotArea.LineFormat.Visible = true; + + chart.TopArea.AddLegend(); + + _document.LastSection.Add(chart); + return this; + } + + public void Build() + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var renderer = new PdfDocumentRenderer(true) + { + Document = _document + }; + renderer.RenderDocument(); + renderer.PdfDocument.Save(_filePath); + } + private void DefineStyles() + { + var headerStyle = _document.AddStyle("NormalBold", "Normal"); + headerStyle.Font.Bold = true; + headerStyle.Font.Size = 14; + } +} diff --git a/ProjectLibrary/Reports/TableReport.cs b/ProjectLibrary/Reports/TableReport.cs new file mode 100644 index 0000000..63410f7 --- /dev/null +++ b/ProjectLibrary/Reports/TableReport.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.Logging; +using ProjectLibrary.Entities; +using ProjectLibrary.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLibrary.Reports; + +public class TableReport +{ + private readonly IOrderRepository _orderRepository; + private readonly ILogger _logger; + internal static readonly string[] item = ["Id заказа", "Книга", "Дата заказа", "Дата возврата", "Количество"]; + + + public TableReport(IOrderRepository orderRepository, ILogger logger) + { + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateTable(string filePath, DateTime startDate, DateTime endDate) + { + try + { + new ExcelBuilder(filePath) + .AddHeader("Сводка по движению книг", 0, 5) + .AddParagraph("за период", 0) + .AddTable([10, 10, 10, 15, 15], GetData(startDate, endDate)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + private List GetData(DateTime startDate, DateTime endDate) + { + var data = _orderRepository + .ReadOrders() + .Where(x => x.OrderDate >= startDate && x.OrderDate <= endDate && x.BookOrders.Any(y => y.OrderID == x.Id)) + .Select(x => new + { + x.Id, + DateOrder = x.OrderDate, + DateReturn = x.ReturnDate, + Book = (int?)x.BookOrders.First(y => y.OrderID == x.Id).BookID, + Count = (int?)x.BookOrders.First(y => y.OrderID == x.Id).Count + }) + .OrderBy(x => x.DateOrder); + return + new List() { item } + .Union( + data + .Select(x => new string[] { x.Id.ToString(), x.DateOrder.ToString(), x.DateReturn.ToString(), + x.Book?.ToString() ?? string.Empty, x.Count?.ToString() ?? string.Empty})) + .Union([["Всего", "", "", "", data.Sum(x => x.Count ?? 0).ToString()]]) + .ToList(); + } +} diff --git a/ProjectLibrary/Repositores/Implementations/OrderRepository.cs b/ProjectLibrary/Repositores/Implementations/OrderRepository.cs index 5499f20..b839c99 100644 --- a/ProjectLibrary/Repositores/Implementations/OrderRepository.cs +++ b/ProjectLibrary/Repositores/Implementations/OrderRepository.cs @@ -9,6 +9,7 @@ using System.Transactions; using System.Data.Common; using ProjectLibrary.Entites; using ProjectLibrary.Repositores; +using Unity; namespace ProjectLibrary.Repositories.Implementations { @@ -45,9 +46,9 @@ namespace ProjectLibrary.Repositories.Implementations foreach (var bookId in order.BookOrders) // Предполагается, что Order.BookOrders содержит список ID книг { var queryInsertBookOrder = @" - INSERT INTO Book_Orders (BookID, OrderID) - VALUES (@BookID, @OrderID)"; - connection.Execute(queryInsertBookOrder, new { bookId.BookID, orderId }, transaction); + INSERT INTO Book_Orders (BookID, OrderID, Count) + VALUES (@BookID, @OrderID, @Count)"; + connection.Execute(queryInsertBookOrder, new { bookId.BookID, orderId, bookId.Count }, transaction); } transaction.Commit(); _logger.LogInformation("Заказ успешно добавлен с ID={OrderId}", orderId); @@ -113,10 +114,14 @@ namespace ProjectLibrary.Repositories.Implementations try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT * FROM Orders"; - var order = connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(order)); - return order; + var querySelect = @"SELECT ord.*, bo.BookId, bo.Count + FROM Orders ord + INNER JOIN Book_Orders bo ON bo.orderId = ord.Id"; + var order = connection.Query(querySelect); + _logger.LogDebug("Получ енные объекты: {json}", JsonConvert.SerializeObject(order)); + return order.GroupBy(x => x.Id, y => y, + (key, value) => Orders.CreateEntity(value.First(), + value.Select(z => Book_Orders.CreateEntity(z.Id, z.BookID, z.Count)))).ToList(); } catch (Exception ex) {