From ee09b4a89db672de15108a80ec55aaa49ce123fc Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:33:53 +0400 Subject: [PATCH 1/6] view layer --- Pizzeria/Pizzeria/FormMain.Designer.cs | 46 +- Pizzeria/Pizzeria/FormMain.cs | 37 +- .../Pizzeria/FormReportOrders.Designer.cs | 129 +++++ Pizzeria/Pizzeria/FormReportOrders.cs | 90 +++ Pizzeria/Pizzeria/FormReportOrders.resx | 60 ++ .../FormReportPizzaComponents.Designer.cs | 111 ++++ .../Pizzeria/FormReportPizzaComponents.cs | 75 +++ .../Pizzeria/FormReportPizzaComponents.resx | 69 +++ Pizzeria/Pizzeria/Pizzeria.csproj | 4 + Pizzeria/Pizzeria/Program.cs | 9 + Pizzeria/Pizzeria/ReportOrders.rdlc | 529 ++++++++++++++++++ 11 files changed, 1155 insertions(+), 4 deletions(-) create mode 100644 Pizzeria/Pizzeria/FormReportOrders.Designer.cs create mode 100644 Pizzeria/Pizzeria/FormReportOrders.cs create mode 100644 Pizzeria/Pizzeria/FormReportOrders.resx create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.cs create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.resx create mode 100644 Pizzeria/Pizzeria/ReportOrders.rdlc diff --git a/Pizzeria/Pizzeria/FormMain.Designer.cs b/Pizzeria/Pizzeria/FormMain.Designer.cs index 1a753ee..73ed42d 100644 --- a/Pizzeria/Pizzeria/FormMain.Designer.cs +++ b/Pizzeria/Pizzeria/FormMain.Designer.cs @@ -40,6 +40,10 @@ this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.компонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.изделияToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.списокКомпонентовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.компонентовПоПиццамToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.списокЗаказовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); @@ -123,7 +127,8 @@ // this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.справочникиToolStripMenuItem}); + this.справочникиToolStripMenuItem, + this.отчетыToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(1233, 28); @@ -142,17 +147,48 @@ // компонентыToolStripMenuItem // this.компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(182, 26); this.компонентыToolStripMenuItem.Text = "Компоненты"; this.компонентыToolStripMenuItem.Click += new System.EventHandler(this.КомпонентыToolStripMenuItem_Click); // // изделияToolStripMenuItem // this.изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; - this.изделияToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.изделияToolStripMenuItem.Size = new System.Drawing.Size(182, 26); this.изделияToolStripMenuItem.Text = "Пиццы"; this.изделияToolStripMenuItem.Click += new System.EventHandler(this.ПиццыToolStripMenuItem_Click); // + // отчетыToolStripMenuItem + // + this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.списокКомпонентовToolStripMenuItem, + this.компонентовПоПиццамToolStripMenuItem, + this.списокЗаказовToolStripMenuItem}); + this.отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + this.отчетыToolStripMenuItem.Size = new System.Drawing.Size(73, 24); + this.отчетыToolStripMenuItem.Text = "Отчеты"; + // + // списокКомпонентовToolStripMenuItem + // + this.списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem"; + this.списокКомпонентовToolStripMenuItem.Size = new System.Drawing.Size(269, 26); + this.списокКомпонентовToolStripMenuItem.Text = "Список компонентов"; + this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click); + // + // компонентовПоПиццамToolStripMenuItem + // + this.компонентовПоПиццамToolStripMenuItem.Name = "компонентовПоПиццамToolStripMenuItem"; + this.компонентовПоПиццамToolStripMenuItem.Size = new System.Drawing.Size(269, 26); + this.компонентовПоПиццамToolStripMenuItem.Text = "Компонентов по пиццам"; + this.компонентовПоПиццамToolStripMenuItem.Click += new System.EventHandler(this.ComponentPizzasToolStripMenuItem_Click); + // + // списокЗаказовToolStripMenuItem + // + this.списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; + this.списокЗаказовToolStripMenuItem.Size = new System.Drawing.Size(269, 26); + this.списокЗаказовToolStripMenuItem.Text = "Список заказов"; + this.списокЗаказовToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); + // // FormMain // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); @@ -190,5 +226,9 @@ private ToolStripMenuItem справочникиToolStripMenuItem; 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/Pizzeria/Pizzeria/FormMain.cs b/Pizzeria/Pizzeria/FormMain.cs index cf5652d..eed58d0 100644 --- a/Pizzeria/Pizzeria/FormMain.cs +++ b/Pizzeria/Pizzeria/FormMain.cs @@ -9,11 +9,13 @@ namespace Pizzeria { private readonly ILogger _logger; private readonly IOrderLogic _orderLogic; - public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic) + private readonly IReportLogic _reportLogic; + public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; + _reportLogic = reportLogic; } private void FormMain_Load(object sender, EventArgs e) { @@ -151,5 +153,38 @@ namespace Pizzeria LoadData(); } + + private void ComponentsToolStripMenuItem_Click(object sender, EventArgs +e) + { + using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; + if (dialog.ShowDialog() == DialogResult.OK) + { + _reportLogic.SaveComponentsToWordFile(new ReportBindingModel + { + FileName = dialog.FileName + }); + MessageBox.Show("���������", "�����", MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } + private void ComponentPizzasToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = + Program.ServiceProvider?.GetService(typeof(FormReportPizzaComponents)); + if (service is FormReportPizzaComponents form) + { + form.ShowDialog(); + } + } + private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); + if (service is FormReportOrders form) + { + form.ShowDialog(); + } + } + } } \ No newline at end of file diff --git a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs new file mode 100644 index 0000000..72dd438 --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs @@ -0,0 +1,129 @@ +namespace Pizzeria +{ + partial class FormReportOrders + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.dateTimePickerFrom = new System.Windows.Forms.DateTimePicker(); + this.dateTimePickerTo = new System.Windows.Forms.DateTimePicker(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.panel = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // dateTimePickerFrom + // + this.dateTimePickerFrom.Location = new System.Drawing.Point(36, 13); + this.dateTimePickerFrom.Name = "dateTimePickerFrom"; + this.dateTimePickerFrom.Size = new System.Drawing.Size(174, 27); + this.dateTimePickerFrom.TabIndex = 0; + // + // dateTimePickerTo + // + this.dateTimePickerTo.Location = new System.Drawing.Point(249, 13); + this.dateTimePickerTo.Name = "dateTimePickerTo"; + this.dateTimePickerTo.Size = new System.Drawing.Size(174, 27); + this.dateTimePickerTo.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 18); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(18, 20); + this.label1.TabIndex = 3; + this.label1.Text = "C"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(216, 18); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(27, 20); + this.label2.TabIndex = 4; + this.label2.Text = "по"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(463, 11); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(135, 29); + this.button1.TabIndex = 5; + this.button1.Text = "Сформировать"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.ButtonMake_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(675, 11); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(94, 29); + this.button2.TabIndex = 6; + this.button2.Text = "В Pdf"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.ButtonToPdf_Click); + // + // panel + // + this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel.Location = new System.Drawing.Point(0, 46); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(843, 409); + this.panel.TabIndex = 7; + // + // FormReportOrders + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(842, 470); + this.Controls.Add(this.panel); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.dateTimePickerTo); + this.Controls.Add(this.dateTimePickerFrom); + this.Name = "FormReportOrders"; + this.Text = "FormReportOrders"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private DateTimePicker dateTimePickerFrom; + private DateTimePicker dateTimePickerTo; + private Label label1; + private Label label2; + private Button button1; + private Button button2; + private Panel panel; + } +} \ No newline at end of file diff --git a/Pizzeria/Pizzeria/FormReportOrders.cs b/Pizzeria/Pizzeria/FormReportOrders.cs new file mode 100644 index 0000000..412517a --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportOrders.cs @@ -0,0 +1,90 @@ +using PizzeriaContracts.BindingModels; +using PizzeriaContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using Microsoft.Reporting.WinForms; +namespace Pizzeria +{ + public partial class FormReportOrders : Form + { + private readonly ReportViewer reportViewer; + private readonly ILogger _logger; + private readonly IReportLogic _logic; + public FormReportOrders(ILogger<FormReportOrders> logger, IReportLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + reportViewer = new ReportViewer + { + Dock = DockStyle.Fill + }; + reportViewer.LocalReport.LoadReportDefinition(new FileStream("ReportOrders.rdlc", FileMode.Open)); + panel.Controls.Add(reportViewer); + } + private void ButtonMake_Click(object sender, EventArgs e) + { + if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date) + { + MessageBox.Show("Дата начала должна быть меньше даты окончания", + "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + try + { + var dataSource = _logic.GetOrders(new ReportBindingModel + { + DateFrom = DateTime.SpecifyKind(dateTimePickerFrom.Value, DateTimeKind.Utc), + DateTo = DateTime.SpecifyKind(dateTimePickerTo.Value, DateTimeKind.Utc) + }); + var source = new ReportDataSource("DataSetOrders", dataSource); + reportViewer.LocalReport.DataSources.Clear(); + reportViewer.LocalReport.DataSources.Add(source); + var parameters = new[] { new ReportParameter("ReportParameterPeriod", $"c {dateTimePickerFrom.Value.ToShortDateString()} по {dateTimePickerTo.Value.ToShortDateString()}") }; + reportViewer.LocalReport.SetParameters(parameters); + reportViewer.RefreshReport(); + _logger.LogInformation("Загрузка списка заказов на период {From} - {To}", dateTimePickerFrom.Value.ToShortDateString(), dateTimePickerTo.Value.ToShortDateString()); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка заказов на период"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + private void ButtonToPdf_Click(object sender, EventArgs e) + { + if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date) + { + MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + using var dialog = new SaveFileDialog + { + Filter = "pdf|*.pdf" + }; + if (dialog.ShowDialog() == DialogResult.OK) + { + try + { + _logic.SaveOrdersToPdfFile(new ReportBindingModel + { + FileName = dialog.FileName, + DateFrom = DateTime.SpecifyKind(dateTimePickerFrom.Value, DateTimeKind.Utc), + DateTo = DateTime.SpecifyKind(dateTimePickerTo.Value, DateTimeKind.Utc) + }); + _logger.LogInformation("Сохранение списка заказов на период {From} - {To} ", dateTimePickerFrom.Value.ToShortDateString(), + dateTimePickerTo.Value.ToShortDateString()); + + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения списка заказов на период"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + } +} \ No newline at end of file diff --git a/Pizzeria/Pizzeria/FormReportOrders.resx b/Pizzeria/Pizzeria/FormReportOrders.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportOrders.resx @@ -0,0 +1,60 @@ +<root> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs new file mode 100644 index 0000000..447a87f --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs @@ -0,0 +1,111 @@ +namespace Pizzeria +{ + partial class FormReportPizzaComponents + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.dataGridView = new System.Windows.Forms.DataGridView(); + this.Компонент = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Пицца = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Количество = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(159, 30); + this.button1.TabIndex = 0; + this.button1.Text = "Сохранить в Excel"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.ButtonSaveToExcel_Click); + // + // dataGridView + // + this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ControlLightLight; + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Компонент, + this.Пицца, + this.Количество}); + this.dataGridView.Location = new System.Drawing.Point(12, 48); + this.dataGridView.Name = "dataGridView"; + this.dataGridView.RowHeadersWidth = 51; + this.dataGridView.RowTemplate.Height = 29; + this.dataGridView.Size = new System.Drawing.Size(783, 475); + this.dataGridView.TabIndex = 1; + // + // Компонент + // + this.Компонент.HeaderText = "Component"; + this.Компонент.MinimumWidth = 6; + this.Компонент.Name = "Компонент"; + this.Компонент.Width = 125; + // + // Пицца + // + this.Пицца.HeaderText = "Pizza"; + this.Пицца.MinimumWidth = 6; + this.Пицца.Name = "Пицца"; + this.Пицца.Width = 125; + // + // Количество + // + this.Количество.HeaderText = "Count"; + this.Количество.MinimumWidth = 6; + this.Количество.Name = "Количество"; + this.Количество.Width = 125; + // + // FormReportPizzaComponents + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(807, 519); + this.Controls.Add(this.dataGridView); + this.Controls.Add(this.button1); + this.Name = "FormReportPizzaComponents"; + this.Text = "FormReportPizzaComponents"; + this.Load += new System.EventHandler(this.FormReportPizzaComponents_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Button button1; + private DataGridView dataGridView; + private DataGridViewTextBoxColumn Компонент; + private DataGridViewTextBoxColumn Пицца; + private DataGridViewTextBoxColumn Количество; + } +} \ No newline at end of file diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs new file mode 100644 index 0000000..fb5b94f --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs @@ -0,0 +1,75 @@ +using PizzeriaContracts.BindingModels; +using PizzeriaContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +namespace Pizzeria +{ + public partial class FormReportPizzaComponents : Form + { + private readonly ILogger _logger; + private readonly IReportLogic _logic; + public FormReportPizzaComponents(ILogger<FormReportPizzaComponents> logger, IReportLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + private void FormReportPizzaComponents_Load(object sender, EventArgs e) + { + try + { + var dict = _logic.GetPizzaComponent(); + if (dict != null) + { + dataGridView.Rows.Clear(); + foreach (var elem in dict) + { + dataGridView.Rows.Add(new object[] { elem.ComponentName, "", "" }); + foreach (var listElem in elem.Pizzas) + { + dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 }); + } + dataGridView.Rows.Add(new object[] { "Итого", "", elem.TotalCount }); + dataGridView.Rows.Add(Array.Empty<object>()); + } + } + _logger.LogInformation("Загрузка списка изделий по компонентам"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка изделий по компонентам"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + private void ButtonSaveToExcel_Click(object sender, EventArgs e) + { + using var dialog = new SaveFileDialog + { + Filter = "xlsx|*.xlsx" + }; + if (dialog.ShowDialog() == DialogResult.OK) + { + try + { + _logic.SavePizzaComponentToExcelFile(new + ReportBindingModel + { + FileName = dialog.FileName + }); + _logger.LogInformation("Сохранение списка изделий по компонентам"); + + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения списка изделий по компонентам"); + + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + } +} diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.resx b/Pizzeria/Pizzeria/FormReportPizzaComponents.resx new file mode 100644 index 0000000..3804e60 --- /dev/null +++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.resx @@ -0,0 +1,69 @@ +<root> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="Компонент.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> + <metadata name="Пицца.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> + <metadata name="Количество.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> +</root> \ No newline at end of file diff --git a/Pizzeria/Pizzeria/Pizzeria.csproj b/Pizzeria/Pizzeria/Pizzeria.csproj index 50dc696..9b2c453 100644 --- a/Pizzeria/Pizzeria/Pizzeria.csproj +++ b/Pizzeria/Pizzeria/Pizzeria.csproj @@ -16,6 +16,7 @@ <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" /> <PackageReference Include="NLog.Extensions.Logging" Version="5.2.1" /> + <PackageReference Include="ReportViewerCore.WinForms" Version="15.1.17" /> </ItemGroup> <ItemGroup> @@ -29,6 +30,9 @@ <None Update="nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> + <None Update="ReportOrders.rdlc"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> </ItemGroup> </Project> \ No newline at end of file diff --git a/Pizzeria/Pizzeria/Program.cs b/Pizzeria/Pizzeria/Program.cs index c1b9b43..658551c 100644 --- a/Pizzeria/Pizzeria/Program.cs +++ b/Pizzeria/Pizzeria/Program.cs @@ -1,4 +1,6 @@ using PizzeriaBusinessLogic; +using PizzeriaBusinessLogic.OfficePackage; +using PizzeriaBusinessLogic.OfficePackage.Implements; using PizzeriaContracts.BusinessLogicsContracts; using PizzeriaContracts.StoragesContracts; using PizzeriaDatabaseImplement.Implements; @@ -40,6 +42,11 @@ namespace Pizzeria services.AddTransient<IComponentStorage, ComponentStorage>(); services.AddTransient<IPizzaStorage, PizzaStorage>(); services.AddTransient<IOrderStorage, OrderStorage>(); + services.AddTransient<IReportLogic, ReportLogic>(); + + services.AddTransient<AbstractSaveToWord, SaveToWord>(); + services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); + services.AddTransient<AbstractSaveToPdf, SaveToPdf>(); services.AddTransient<FormMain>(); services.AddTransient<FormComponent>(); @@ -48,6 +55,8 @@ namespace Pizzeria services.AddTransient<FormPizza>(); services.AddTransient<FormPizzas>(); services.AddTransient<FormPizzaComponent>(); + services.AddTransient<FormReportOrders>(); + services.AddTransient<FormReportPizzaComponents>(); } } } \ No newline at end of file diff --git a/Pizzeria/Pizzeria/ReportOrders.rdlc b/Pizzeria/Pizzeria/ReportOrders.rdlc new file mode 100644 index 0000000..0eb814a --- /dev/null +++ b/Pizzeria/Pizzeria/ReportOrders.rdlc @@ -0,0 +1,529 @@ +<?xml version="1.0" encoding="utf-8"?> +<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"> + <AutoRefresh>0</AutoRefresh> + <DataSources> + <DataSource Name="PizzeriaContractsViewModels"> + <ConnectionProperties> + <DataProvider>System.Data.DataSet</DataProvider> + <ConnectString>/* Local Connection */</ConnectString> + </ConnectionProperties> + <rd:DataSourceID>10791c83-cee8-4a38-bbd0-245fc17cefb3</rd:DataSourceID> + </DataSource> + </DataSources> + <DataSets> + <DataSet Name="DataSetOrders"> + <Query> + <DataSourceName>PizzeriaContractsViewModels</DataSourceName> + <CommandText>/* Local Query */</CommandText> + </Query> + <Fields> + <Field Name="Id"> + <DataField>Id</DataField> + <rd:TypeName>System.Int32</rd:TypeName> + </Field> + <Field Name="DateCreate"> + <DataField>DateCreate</DataField> + <rd:TypeName>System.DateTime</rd:TypeName> + </Field> + <Field Name="PizzaName"> + <DataField>PizzaName</DataField> + <rd:TypeName>System.String</rd:TypeName> + </Field> + <Field Name="Sum"> + <DataField>Sum</DataField> + <rd:TypeName>System.Decimal</rd:TypeName> + </Field> + </Fields> + <rd:DataSetInfo> + <rd:DataSetName>PizzeriaContracts.ViewModels</rd:DataSetName> + <rd:TableName>ReportOrdersViewModel</rd:TableName> + <rd:ObjectDataSourceType>PizzeriaContracts.ViewModels.ReportOrdersViewModel, PizzeriaContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType> + </rd:DataSetInfo> + </DataSet> + </DataSets> + <ReportSections> + <ReportSection> + <Body> + <ReportItems> + <Textbox Name="ReportParameterPeriod"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Parameters!ReportParameterPeriod.Value</Value> + <Style> + <FontSize>14pt</FontSize> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style> + <TextAlign>Center</TextAlign> + </Style> + </Paragraph> + </Paragraphs> + <rd:DefaultName>ReportParameterPeriod</rd:DefaultName> + <Top>1cm</Top> + <Height>1cm</Height> + <Width>17.4445cm</Width> + <Style> + <Border> + <Style>None</Style> + </Border> + <VerticalAlign>Middle</VerticalAlign> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + <Textbox Name="TextboxTitle"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Заказы</Value> + <Style> + <FontSize>16pt</FontSize> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style> + <TextAlign>Center</TextAlign> + </Style> + </Paragraph> + </Paragraphs> + <Height>1cm</Height> + <Width>17.4445cm</Width> + <ZIndex>1</ZIndex> + <Style> + <Border> + <Style>None</Style> + </Border> + <VerticalAlign>Middle</VerticalAlign> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + <Tablix Name="Tablix1"> + <TablixBody> + <TablixColumns> + <TablixColumn> + <Width>2.5cm</Width> + </TablixColumn> + <TablixColumn> + <Width>3.21438cm</Width> + </TablixColumn> + <TablixColumn> + <Width>8.23317cm</Width> + </TablixColumn> + <TablixColumn> + <Width>2.5cm</Width> + </TablixColumn> + </TablixColumns> + <TablixRows> + <TablixRow> + <Height>0.6cm</Height> + <TablixCells> + <TablixCell> + <CellContents> + <Textbox Name="Textbox5"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Номер</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Textbox5</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="Textbox1"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Дата создания</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Textbox1</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="Textbox3"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Пицца</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Textbox3</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="Textbox7"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Сумма</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Textbox7</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + </TablixCells> + </TablixRow> + <TablixRow> + <Height>0.6cm</Height> + <TablixCells> + <TablixCell> + <CellContents> + <Textbox Name="Id"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Fields!Id.Value</Value> + <Style /> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Id</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="DateCreate"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Fields!DateCreate.Value</Value> + <Style> + <Format>d</Format> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>DateCreate</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="PizzaName"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Fields!PizzaName.Value</Value> + <Style /> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>PizzaName</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="Sum"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Fields!Sum.Value</Value> + <Style /> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Sum</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> + </TablixCells> + </TablixRow> + </TablixRows> + </TablixBody> + <TablixColumnHierarchy> + <TablixMembers> + <TablixMember /> + <TablixMember /> + <TablixMember /> + <TablixMember /> + </TablixMembers> + </TablixColumnHierarchy> + <TablixRowHierarchy> + <TablixMembers> + <TablixMember> + <KeepWithGroup>After</KeepWithGroup> + </TablixMember> + <TablixMember> + <Group Name="Подробности" /> + </TablixMember> + </TablixMembers> + </TablixRowHierarchy> + <DataSetName>DataSetOrders</DataSetName> + <Top>2.48391cm</Top> + <Left>0.55245cm</Left> + <Height>1.2cm</Height> + <Width>16.44755cm</Width> + <ZIndex>2</ZIndex> + <Style> + <Border> + <Style>Double</Style> + </Border> + </Style> + </Tablix> + <Textbox Name="TextboxTotalSum"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Итого:</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style> + <TextAlign>Right</TextAlign> + </Style> + </Paragraph> + </Paragraphs> + <Top>4cm</Top> + <Left>12cm</Left> + <Height>0.6cm</Height> + <Width>2.5cm</Width> + <ZIndex>3</ZIndex> + <Style> + <Border> + <Style>None</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + <Textbox Name="SumTotal"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Sum(Fields!Sum.Value, "DataSetOrders")</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style> + <TextAlign>Right</TextAlign> + </Style> + </Paragraph> + </Paragraphs> + <Top>4cm</Top> + <Left>14.5cm</Left> + <Height>0.6cm</Height> + <Width>2.5cm</Width> + <ZIndex>4</ZIndex> + <Style> + <Border> + <Style>None</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </ReportItems> + <Height>6.27908cm</Height> + <Style /> + </Body> + <Width>17.4445cm</Width> + <Page> + <PageHeight>29.7cm</PageHeight> + <PageWidth>21cm</PageWidth> + <LeftMargin>2cm</LeftMargin> + <RightMargin>2cm</RightMargin> + <TopMargin>2cm</TopMargin> + <BottomMargin>2cm</BottomMargin> + <ColumnSpacing>0.13cm</ColumnSpacing> + <Style /> + </Page> + </ReportSection> + </ReportSections> + <ReportParameters> + <ReportParameter Name="ReportParameterPeriod"> + <DataType>String</DataType> + <Nullable>true</Nullable> + <Prompt>ReportParameter1</Prompt> + </ReportParameter> + </ReportParameters> + <ReportParametersLayout> + <GridLayoutDefinition> + <NumberOfColumns>4</NumberOfColumns> + <NumberOfRows>2</NumberOfRows> + <CellDefinitions> + <CellDefinition> + <ColumnIndex>0</ColumnIndex> + <RowIndex>0</RowIndex> + <ParameterName>ReportParameterPeriod</ParameterName> + </CellDefinition> + </CellDefinitions> + </GridLayoutDefinition> + </ReportParametersLayout> + <rd:ReportUnitType>Cm</rd:ReportUnitType> + <rd:ReportID>2de0031a-4d17-449d-922d-d9fc54572312</rd:ReportID> +</Report> \ No newline at end of file -- 2.25.1 From 49e5b6634d7babf71eb6e8f3c6baaa5ae59ac92f Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:34:19 +0400 Subject: [PATCH 2/6] businessLogic layer --- .../OfficePackage/AbstractSaveToExcel.cs | 96 +++++ .../OfficePackage/AbstractSaveToPdf.cs | 73 ++++ .../OfficePackage/AbstractSaveToWord.cs | 50 +++ .../HelperModels/ExcelCellParameters.cs | 12 + .../OfficePackage/HelperModels/ExcelInfo.cs | 14 + .../HelperModels/ExcelMergeParameters.cs | 9 + .../HelperModels/ExcelStyleInfoType.cs | 9 + .../OfficePackage/HelperModels/PdfInfo.cs | 12 + .../HelperModels/PdfParagraph.cs | 10 + .../HelperModels/PdfParagraphAlignmentType.cs | 9 + .../HelperModels/PdfRowParameters.cs | 10 + .../OfficePackage/HelperModels/WordInfo.cs | 10 + .../HelperModels/WordJustificationType.cs | 8 + .../HelperModels/WordParagraph.cs | 8 + .../HelperModels/WordTextProperties.cs | 10 + .../OfficePackage/Implements/SaveToExcel.cs | 333 ++++++++++++++++++ .../OfficePackage/Implements/SaveToPdf.cs | 98 ++++++ .../OfficePackage/Implements/SaveToWord.cs | 124 +++++++ .../PizzeriaBusinessLogic.csproj | 3 + Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs | 125 +++++++ 20 files changed, 1023 insertions(+) create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs create mode 100644 Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs new file mode 100644 index 0000000..2a3b713 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -0,0 +1,96 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +namespace PizzeriaBusinessLogic.OfficePackage +{ + public abstract class AbstractSaveToExcel + { + /// <summary> + /// Создание отчета + /// </summary> + /// <param name="info"></param> + public void CreateReport(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.PizzaComponents) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = rowIndex, + Text = pc.ComponentName, + StyleInfo = ExcelStyleInfoType.Text + }); + rowIndex++; + foreach (var pizza in pc.Pizzas) + { + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "B", + RowIndex = rowIndex, + Text = pizza.Item1, + StyleInfo = + ExcelStyleInfoType.TextWithBroder + }); + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = pizza.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); + } + /// <summary> + /// Создание excel-файла + /// </summary> + /// <param name="info"></param> + protected abstract void CreateExcel(ExcelInfo info); + /// <summary> + /// Добавляем новую ячейку в лист + /// </summary> + /// <param name="cellParameters"></param> + protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams); + /// <summary> + /// Объединение ячеек + /// </summary> + /// <param name="mergeParameters"></param> + protected abstract void MergeCells(ExcelMergeParameters excelParams); + /// <summary> + /// Сохранение файла + /// </summary> + /// <param name="info"></param> + protected abstract void SaveExcel(ExcelInfo info); + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs new file mode 100644 index 0000000..e131cab --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs @@ -0,0 +1,73 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +namespace PizzeriaBusinessLogic.OfficePackage +{ + public abstract class AbstractSaveToPdf + { + public void CreateDoc(PdfInfo info) + { + CreatePdf(info); + CreateParagraph(new PdfParagraph + { + Text = info.Title, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + CreateParagraph(new PdfParagraph + { + Text = $"с { info.DateFrom.ToShortDateString() } по { info.DateTo.ToShortDateString() }", Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + CreateTable(new List<string> { "2cm", "3cm", "6cm", "3cm" }); + CreateRow(new PdfRowParameters + { + Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Сумма" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + foreach (var order in info.Orders) + { + CreateRow(new PdfRowParameters + { + Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.Sum.ToString() }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + CreateParagraph(new PdfParagraph + { + Text = $"Итого: {info.Orders.Sum(x => x.Sum)}\t", + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Rigth + }); + SavePdf(info); + } + /// <summary> + /// Создание doc-файла + /// </summary> + /// <param name="info"></param> + protected abstract void CreatePdf(PdfInfo info); + /// <summary> + /// Создание параграфа с текстом + /// </summary> + /// <param name="title"></param> + /// <param name="style"></param> + protected abstract void CreateParagraph(PdfParagraph paragraph); + /// <summary> + /// Создание таблицы + /// </summary> + /// <param name="title"></param> + /// <param name="style"></param> + protected abstract void CreateTable(List<string> columns); + /// <summary> + /// Создание и заполнение строки + /// </summary> + /// <param name="rowParameters"></param> + protected abstract void CreateRow(PdfRowParameters rowParameters); + /// <summary> + /// Сохранение файла + /// </summary> + /// <param name="info"></param> + protected abstract void SavePdf(PdfInfo info); + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs new file mode 100644 index 0000000..d38b10b --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -0,0 +1,50 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +namespace PizzeriaBusinessLogic.OfficePackage +{ + public abstract class AbstractSaveToWord + { + public void CreateDoc(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 + } + }); + foreach (var component in info.Components) + { + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (component.ComponentName, new WordTextProperties { Size = "24", }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Both + } + }); + } + SaveWord(info); + } + /// <summary> + /// Создание doc-файла + /// </summary> + /// <param name="info"></param> + protected abstract void CreateWord(WordInfo info); + /// <summary> + /// Создание абзаца с текстом + /// </summary> + /// <param name="paragraph"></param> + /// <returns></returns> + protected abstract void CreateParagraph(WordParagraph paragraph); + /// <summary> + /// Сохранение файла + /// </summary> + /// <param name="info"></param> + protected abstract void SaveWord(WordInfo info); + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs new file mode 100644 index 0000000..0160d8d --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs @@ -0,0 +1,12 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class ExcelCellParameters + { + public string ColumnName { get; set; } = string.Empty; + public uint RowIndex { get; set; } + public string Text { get; set; } = string.Empty; + public string CellReference => $"{ColumnName}{RowIndex}"; + public ExcelStyleInfoType StyleInfo { get; set; } + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs new file mode 100644 index 0000000..f49d0c7 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs @@ -0,0 +1,14 @@ +using PizzeriaContracts.ViewModels; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class ExcelInfo + { + public string FileName { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public List<ReportPizzaComponentViewModel> PizzaComponents + { + get; + set; + } = new(); + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs new file mode 100644 index 0000000..6243249 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs @@ -0,0 +1,9 @@ +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class ExcelMergeParameters + { + public string CellFromName { get; set; } = string.Empty; + public string CellToName { get; set; } = string.Empty; + public string Merge => $"{CellFromName}:{CellToName}"; + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs new file mode 100644 index 0000000..5c15e8a --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs @@ -0,0 +1,9 @@ +namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums +{ + public enum ExcelStyleInfoType + { + Title, + Text, + TextWithBroder + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs new file mode 100644 index 0000000..2eadbfe --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs @@ -0,0 +1,12 @@ +using PizzeriaContracts.ViewModels; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class PdfInfo + { + public string FileName { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public DateTime DateFrom { get; set; } + public DateTime DateTo { get; set; } + public List<ReportOrdersViewModel> Orders { get; set; } = new(); + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs new file mode 100644 index 0000000..c186d93 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs @@ -0,0 +1,10 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class PdfParagraph + { + public string Text { get; set; } = string.Empty; + public string Style { get; set; } = string.Empty; + public PdfParagraphAlignmentType ParagraphAlignment { get; set; } + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs new file mode 100644 index 0000000..ee0eaf2 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs @@ -0,0 +1,9 @@ +namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums +{ + public enum PdfParagraphAlignmentType + { + Center, + Left, + Rigth + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs new file mode 100644 index 0000000..c9c87bc --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs @@ -0,0 +1,10 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class PdfRowParameters + { + public List<string> Texts { get; set; } = new(); + public string Style { get; set; } = string.Empty; + public PdfParagraphAlignmentType ParagraphAlignment { get; set; } + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs new file mode 100644 index 0000000..60f1776 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -0,0 +1,10 @@ +using PizzeriaContracts.ViewModels; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class WordInfo + { + public string FileName { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public List<ComponentViewModel> Components { get; set; } = new(); + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs new file mode 100644 index 0000000..ad0729e --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs @@ -0,0 +1,8 @@ +namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums +{ + public enum WordJustificationType + { + Center, + Both + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs new file mode 100644 index 0000000..001cd14 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs @@ -0,0 +1,8 @@ +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class WordParagraph + { + public List<(string, WordTextProperties)> Texts { get; set; } = new(); + public WordTextProperties? TextProperties { get; set; } + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs new file mode 100644 index 0000000..02824aa --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs @@ -0,0 +1,10 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +namespace PizzeriaBusinessLogic.OfficePackage.HelperModels +{ + public class WordTextProperties + { + public string Size { get; set; } = string.Empty; + public bool Bold { get; set; } + public WordJustificationType JustificationType { get; set; } + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs new file mode 100644 index 0000000..197b9e0 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs @@ -0,0 +1,333 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Office2010.Excel; +using DocumentFormat.OpenXml.Office2013.Excel; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +namespace PizzeriaBusinessLogic.OfficePackage.Implements +{ + public class SaveToExcel : AbstractSaveToExcel + { + private SpreadsheetDocument? _spreadsheetDocument; + private SharedStringTablePart? _shareStringPart; + private Worksheet? _worksheet; + /// <summary> + /// Настройка стилей для файла + /// </summary> + /// <param name="workbookpart"></param> + private static void CreateStyles(WorkbookPart workbookpart) + { + var sp = workbookpart.AddNewPart<WorkbookStylesPart>(); + sp.Stylesheet = new Stylesheet(); + var fonts = new Fonts() { Count = 2U, KnownFonts = true }; + var fontUsual = new Font(); + fontUsual.Append(new FontSize() { Val = 12D }); + fontUsual.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() + { Theme = 1U }); + fontUsual.Append(new FontName() { Val = "Times New Roman" }); + fontUsual.Append(new FontFamilyNumbering() { Val = 2 }); + fontUsual.Append(new FontScheme() { Val = FontSchemeValues.Minor }); + var fontTitle = new Font(); + fontTitle.Append(new Bold()); + fontTitle.Append(new FontSize() { Val = 14D }); + fontTitle.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() + { Theme = 1U }); + fontTitle.Append(new FontName() { Val = "Times New Roman" }); + fontTitle.Append(new FontFamilyNumbering() { Val = 2 }); + fontTitle.Append(new FontScheme() { Val = FontSchemeValues.Minor }); + fonts.Append(fontUsual); + fonts.Append(fontTitle); + var fills = new Fills() { Count = 2U }; + var fill1 = new Fill(); + fill1.Append(new PatternFill() { PatternType = PatternValues.None }); + var fill2 = new Fill(); + fill2.Append(new PatternFill() + { + PatternType = PatternValues.Gray125 + }); + fills.Append(fill1); + fills.Append(fill2); + var borders = new Borders() { Count = 2U }; + var borderNoBorder = new Border(); + borderNoBorder.Append(new LeftBorder()); + borderNoBorder.Append(new RightBorder()); + borderNoBorder.Append(new TopBorder()); + borderNoBorder.Append(new BottomBorder()); + borderNoBorder.Append(new DiagonalBorder()); + var borderThin = new Border(); + var leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }; + leftBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() + { Indexed = 64U }); + var rightBorder = new RightBorder() + { + Style = BorderStyleValues.Thin + }; + rightBorder.Append(new + DocumentFormat.OpenXml.Office2010.Excel.Color() + { Indexed = 64U }); + var topBorder = new TopBorder() { Style = BorderStyleValues.Thin }; + topBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() + { Indexed = 64U }); + var bottomBorder = new BottomBorder() + { + Style = BorderStyleValues.Thin + }; + bottomBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U }); + borderThin.Append(leftBorder); + borderThin.Append(rightBorder); + borderThin.Append(topBorder); + borderThin.Append(bottomBorder); + borderThin.Append(new DiagonalBorder()); + borders.Append(borderNoBorder); + borders.Append(borderThin); + var cellStyleFormats = new CellStyleFormats() { Count = 1U }; + var cellFormatStyle = new CellFormat() + { + NumberFormatId = 0U, + FontId = 0U, + FillId = 0U, + BorderId = 0U + }; + cellStyleFormats.Append(cellFormatStyle); + var cellFormats = new CellFormats() { Count = 3U }; + var cellFormatFont = new CellFormat() + { + NumberFormatId = 0U, + FontId = 0U, + FillId = 0U, + BorderId = 0U, + FormatId = 0U, + ApplyFont = true + }; + var cellFormatFontAndBorder = new CellFormat() + { + NumberFormatId = 0U, + FontId = 0U, + FillId = 0U, + BorderId = 1U, + FormatId = 0U, + ApplyFont = true, + ApplyBorder = true + }; + var cellFormatTitle = new CellFormat() + { + NumberFormatId = 0U, + FontId = 1U, + FillId = 0U, + BorderId = 0U, + FormatId = 0U, + Alignment = new Alignment() + { + Vertical = VerticalAlignmentValues.Center, + WrapText = true, + Horizontal = HorizontalAlignmentValues.Center + }, + ApplyFont = true + }; + cellFormats.Append(cellFormatFont); + cellFormats.Append(cellFormatFontAndBorder); + cellFormats.Append(cellFormatTitle); + var cellStyles = new CellStyles() { Count = 1U }; + cellStyles.Append(new CellStyle() + { + Name = "Normal", + FormatId = 0U, + BuiltinId = 0U + }); + var differentialFormats = new + DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats() + { Count = 0U }; + + var tableStyles = new TableStyles() + { + Count = 0U, + DefaultTableStyle = "TableStyleMedium2", + DefaultPivotStyle = "PivotStyleLight16" + }; + var stylesheetExtensionList = new StylesheetExtensionList(); + var stylesheetExtension1 = new StylesheetExtension() + { + Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" + }; + stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + stylesheetExtension1.Append(new SlicerStyles() + { + DefaultSlicerStyle = "SlicerStyleLight1" + }); + var stylesheetExtension2 = new StylesheetExtension() + { + Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}" + }; + stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"); + stylesheetExtension2.Append(new TimelineStyles() + { + DefaultTimelineStyle = "TimeSlicerStyleLight1" + }); + stylesheetExtensionList.Append(stylesheetExtension1); + stylesheetExtensionList.Append(stylesheetExtension2); + sp.Stylesheet.Append(fonts); + sp.Stylesheet.Append(fills); + sp.Stylesheet.Append(borders); + sp.Stylesheet.Append(cellStyleFormats); + sp.Stylesheet.Append(cellFormats); + sp.Stylesheet.Append(cellStyles); + sp.Stylesheet.Append(differentialFormats); + sp.Stylesheet.Append(tableStyles); + sp.Stylesheet.Append(stylesheetExtensionList); + } + /// <summary> + /// Получение номера стиля из типа + /// </summary> + /// <param name="styleInfo"></param> + /// <returns></returns> + private static uint GetStyleValue(ExcelStyleInfoType styleInfo) + { + return styleInfo switch + { + ExcelStyleInfoType.Title => 2U, + ExcelStyleInfoType.TextWithBroder => 1U, + ExcelStyleInfoType.Text => 0U, + _ => 0U, + }; + } + protected override void CreateExcel(ExcelInfo info) + { + _spreadsheetDocument = SpreadsheetDocument.Create(info.FileName, + SpreadsheetDocumentType.Workbook); + // Создаем книгу (в ней хранятся листы) + var workbookpart = _spreadsheetDocument.AddWorkbookPart(); + workbookpart.Workbook = new Workbook(); + CreateStyles(workbookpart); + // Получаем/создаем хранилище текстов для книги + _shareStringPart = + _spreadsheetDocument.WorkbookPart!.GetPartsOfType<SharedStringTablePart>().Any() + ? + _spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First() + : + _spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>(); + // Создаем SharedStringTable, если его нет + if (_shareStringPart.SharedStringTable == null) + { + _shareStringPart.SharedStringTable = new SharedStringTable(); + } + // Создаем лист в книгу + var worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); + worksheetPart.Worksheet = new Worksheet(new SheetData()); + // Добавляем лист в книгу + var sheets = + _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets()); + var sheet = new Sheet() + { + Id = + _spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), + SheetId = 1, + Name = "Лист" + }; + sheets.Append(sheet); + _worksheet = worksheetPart.Worksheet; + } + protected override void InsertCellInWorksheet(ExcelCellParameters + excelParams) + { + if (_worksheet == null || _shareStringPart == null) + { + return; + } + var sheetData = _worksheet.GetFirstChild<SheetData>(); + if (sheetData == null) + { + return; + } + // Ищем строку, либо добавляем ее + Row row; + if (sheetData.Elements<Row>().Where(r => r.RowIndex! == + excelParams.RowIndex).Any()) + { + row = sheetData.Elements<Row>().Where(r => r.RowIndex! == + excelParams.RowIndex).First(); + } + else + { + row = new Row() { RowIndex = excelParams.RowIndex }; + sheetData.Append(row); + } + // Ищем нужную ячейку + Cell cell; + if (row.Elements<Cell>().Where(c => c.CellReference!.Value == + excelParams.CellReference).Any()) + { + cell = row.Elements<Cell>().Where(c => c.CellReference!.Value == + excelParams.CellReference).First(); + } + else + { + // Все ячейки должны быть последовательно друг за другом расположены + // нужно определить, после какой вставлять + Cell? refCell = null; + foreach (Cell rowCell in row.Elements<Cell>()) + { + if (string.Compare(rowCell.CellReference!.Value, + excelParams.CellReference, true) > 0) + { + refCell = rowCell; + break; + } + } + var newCell = new Cell() + { + CellReference = excelParams.CellReference + }; + row.InsertBefore(newCell, refCell); + cell = newCell; + } + // вставляем новый текст + _shareStringPart.SharedStringTable.AppendChild(new + SharedStringItem(new Text(excelParams.Text))); + _shareStringPart.SharedStringTable.Save(); + cell.CellValue = new CellValue((_shareStringPart.SharedStringTable.Elements<SharedStringItem>().Count() - 1).ToString()); + cell.DataType = new EnumValue<CellValues>(CellValues.SharedString); + cell.StyleIndex = GetStyleValue(excelParams.StyleInfo); + } + protected override void MergeCells(ExcelMergeParameters excelParams) + { + if (_worksheet == null) + { + return; + } + MergeCells mergeCells; + if (_worksheet.Elements<MergeCells>().Any()) + { + mergeCells = _worksheet.Elements<MergeCells>().First(); + } + else + { + mergeCells = new MergeCells(); + if (_worksheet.Elements<CustomSheetView>().Any()) + { + _worksheet.InsertAfter(mergeCells, + _worksheet.Elements<CustomSheetView>().First()); + } + else + { + _worksheet.InsertAfter(mergeCells, + _worksheet.Elements<SheetData>().First()); + } + } + var mergeCell = new MergeCell() + { + Reference = new StringValue(excelParams.Merge) + }; + mergeCells.Append(mergeCell); + } + protected override void SaveExcel(ExcelInfo info) + { + if (_spreadsheetDocument == null) + { + return; + } + _spreadsheetDocument.WorkbookPart!.Workbook.Save(); + _spreadsheetDocument.Close(); + } + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs new file mode 100644 index 0000000..65635eb --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs @@ -0,0 +1,98 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +using MigraDoc.DocumentObjectModel; +using MigraDoc.DocumentObjectModel.Tables; +using MigraDoc.Rendering; +namespace PizzeriaBusinessLogic.OfficePackage.Implements +{ + public class SaveToPdf : AbstractSaveToPdf + { + private Document? _document; + private Section? _section; + private Table? _table; + private static ParagraphAlignment + GetParagraphAlignment(PdfParagraphAlignmentType type) + { + return type switch + { + PdfParagraphAlignmentType.Center => ParagraphAlignment.Center, + PdfParagraphAlignmentType.Left => ParagraphAlignment.Left, + PdfParagraphAlignmentType.Rigth => ParagraphAlignment.Right, + _ => ParagraphAlignment.Justify, + }; + } + /// <summary> + /// Создание стилей для документа + /// </summary> + /// <param name="document"></param> + private static void DefineStyles(Document document) + { + var style = document.Styles["Normal"]; + style.Font.Name = "Times New Roman"; + style.Font.Size = 14; + style = document.Styles.AddStyle("NormalTitle", "Normal"); + style.Font.Bold = true; + } + protected override void CreatePdf(PdfInfo info) + { + _document = new Document(); + DefineStyles(_document); + _section = _document.AddSection(); + } + protected override void CreateParagraph(PdfParagraph pdfParagraph) + { + if (_section == null) + { + return; + } + var paragraph = _section.AddParagraph(pdfParagraph.Text); + paragraph.Format.SpaceAfter = "1cm"; + paragraph.Format.Alignment = GetParagraphAlignment(pdfParagraph.ParagraphAlignment); + paragraph.Style = pdfParagraph.Style; + } + protected override void CreateTable(List<string> columns) + { + if (_document == null) + { + return; + } + _table = _document.LastSection.AddTable(); + foreach (var elem in columns) + { + _table.AddColumn(elem); + } + } + protected override void CreateRow(PdfRowParameters rowParameters) + { + if (_table == null) + { + return; + } + var row = _table.AddRow(); + for (int i = 0; i < rowParameters.Texts.Count; ++i) + { + row.Cells[i].AddParagraph(rowParameters.Texts[i]); + if (!string.IsNullOrEmpty(rowParameters.Style)) + { + row.Cells[i].Style = rowParameters.Style; + } + Unit borderWidth = 0.5; + row.Cells[i].Borders.Left.Width = borderWidth; + row.Cells[i].Borders.Right.Width = borderWidth; + row.Cells[i].Borders.Top.Width = borderWidth; + row.Cells[i].Borders.Bottom.Width = borderWidth; + row.Cells[i].Format.Alignment = GetParagraphAlignment(rowParameters.ParagraphAlignment); + row.Cells[i].VerticalAlignment = VerticalAlignment.Center; + } + } + protected override void SavePdf(PdfInfo info) + { + var renderer = new PdfDocumentRenderer(true) + { + Document = _document + }; + renderer.RenderDocument(); + renderer.PdfDocument.Save(info.FileName); + } + } +} \ No newline at end of file diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs new file mode 100644 index 0000000..c70176e --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs @@ -0,0 +1,124 @@ +using PizzeriaBusinessLogic.OfficePackage.HelperEnums; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Wordprocessing; +namespace PizzeriaBusinessLogic.OfficePackage.Implements +{ + public class SaveToWord : AbstractSaveToWord + { + private WordprocessingDocument? _wordDocument; + private Body? _docBody; + /// <summary> + /// Получение типа выравнивания + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + private static JustificationValues + GetJustificationValues(WordJustificationType type) + { + return type switch + { + WordJustificationType.Both => JustificationValues.Both, + WordJustificationType.Center => JustificationValues.Center, + _ => JustificationValues.Left, + }; + } + /// <summary> + /// Настройки страницы + /// </summary> + /// <returns></returns> + private static SectionProperties CreateSectionProperties() + { + var properties = new SectionProperties(); + var pageSize = new PageSize + { + Orient = PageOrientationValues.Portrait + }; + properties.AppendChild(pageSize); + return properties; + } + /// <summary> + /// Задание форматирования для абзаца + /// </summary> + /// <param name="paragraphProperties"></param> + /// <returns></returns> + private static ParagraphProperties? + CreateParagraphProperties(WordTextProperties? paragraphProperties) + { + if (paragraphProperties == null) + { + return null; + } + var properties = new ParagraphProperties(); + properties.AppendChild(new Justification() + { + Val = + GetJustificationValues(paragraphProperties.JustificationType) + }); + properties.AppendChild(new SpacingBetweenLines + { + LineRule = LineSpacingRuleValues.Auto + }); + properties.AppendChild(new Indentation()); + var paragraphMarkRunProperties = new ParagraphMarkRunProperties(); + if (!string.IsNullOrEmpty(paragraphProperties.Size)) + { + paragraphMarkRunProperties.AppendChild(new FontSize + { + Val = + paragraphProperties.Size + }); + } + properties.AppendChild(paragraphMarkRunProperties); + return properties; + } + protected override void CreateWord(WordInfo info) + { + _wordDocument = WordprocessingDocument.Create(info.FileName, + WordprocessingDocumentType.Document); + MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart(); + mainPart.Document = new Document(); + _docBody = mainPart.Document.AppendChild(new Body()); + } + protected override void CreateParagraph(WordParagraph paragraph) + { + if (_docBody == null || paragraph == null) + { + return; + } + var docParagraph = new Paragraph(); + + docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties)); + foreach (var run in paragraph.Texts) + { + var docRun = new Run(); + var properties = new RunProperties(); + properties.AppendChild(new FontSize { Val = run.Item2.Size }); + if (run.Item2.Bold) + { + properties.AppendChild(new Bold()); + } + docRun.AppendChild(properties); + docRun.AppendChild(new Text + { + Text = run.Item1, + Space = + SpaceProcessingModeValues.Preserve + }); + docParagraph.AppendChild(docRun); + } + _docBody.AppendChild(docParagraph); + } + protected override void SaveWord(WordInfo info) + { + if (_docBody == null || _wordDocument == null) + { + return; + } + _docBody.AppendChild(CreateSectionProperties()); + _wordDocument.MainDocumentPart!.Document.Save(); + _wordDocument.Close(); + } + } +} diff --git a/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj b/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj index 9ba5e7e..61876fd 100644 --- a/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj +++ b/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj @@ -7,7 +7,10 @@ </PropertyGroup> <ItemGroup> + <PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" /> + <PackageReference Include="MigraDoc.DocumentObjectModel.Core" Version="1.0.0" /> + <PackageReference Include="MigraDoc.Rendering.Core" Version="1.0.0" /> </ItemGroup> <ItemGroup> diff --git a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs new file mode 100644 index 0000000..6baed96 --- /dev/null +++ b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs @@ -0,0 +1,125 @@ +using PizzeriaBusinessLogic.OfficePackage; +using PizzeriaBusinessLogic.OfficePackage.HelperModels; +using PizzeriaContracts.BindingModels; +using PizzeriaContracts.BusinessLogicsContracts; +using PizzeriaContracts.SearchModels; +using PizzeriaContracts.StoragesContracts; +using PizzeriaContracts.ViewModels; + +namespace PizzeriaBusinessLogic +{ + public class ReportLogic : IReportLogic + { + private readonly IComponentStorage _componentStorage; + private readonly IPizzaStorage _pizzaStorage; + private readonly IOrderStorage _orderStorage; + private readonly AbstractSaveToExcel _saveToExcel; + private readonly AbstractSaveToWord _saveToWord; + private readonly AbstractSaveToPdf _saveToPdf; + public ReportLogic(IPizzaStorage pizzaStorage, IComponentStorage + componentStorage, IOrderStorage orderStorage, + AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, + AbstractSaveToPdf saveToPdf) + { + _pizzaStorage = pizzaStorage; + _componentStorage = componentStorage; + _orderStorage = orderStorage; + _saveToExcel = saveToExcel; + _saveToWord = saveToWord; + _saveToPdf = saveToPdf; + } + /// <summary> + /// Получение списка компонент с указанием, в каких изделиях используются + /// </summary> + /// <returns></returns> + public List<ReportPizzaComponentViewModel> GetPizzaComponent() + { + var components = _componentStorage.GetFullList(); + var pizzas = _pizzaStorage.GetFullList(); + var list = new List<ReportPizzaComponentViewModel>(); + foreach (var component in components) + { + var record = new ReportPizzaComponentViewModel + { + ComponentName = component.ComponentName, + Pizzas = new List<Tuple<string, int>>(), + TotalCount = 0 + }; + foreach (var pizza in pizzas) + { + if (pizza.PizzaComponents.ContainsKey(component.Id)) + { + record.Pizzas.Add(new Tuple<string, + int>(pizza.PizzaName, pizza.PizzaComponents[component.Id].Item2)); + record.TotalCount += + pizza.PizzaComponents[component.Id].Item2; + } + } + list.Add(record); + } + return list; + } + /// <summary> + /// Получение списка заказов за определенный период + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public List<ReportOrdersViewModel> GetOrders(ReportBindingModel model) + { + return _orderStorage.GetFilteredList(new OrderSearchModel + { + DateFrom = model.DateFrom, + DateTo = model.DateTo + }) + .Select(x => new ReportOrdersViewModel + { + Id = x.Id, + DateCreate = x.DateCreate, + PizzaName = x.PizzaName, + Sum = x.Sum + }) + .ToList(); + } + /// <summary> + /// Сохранение компонент в файл-Word + /// </summary> + /// <param name="model"></param> + public void SaveComponentsToWordFile(ReportBindingModel model) + { + _saveToWord.CreateDoc(new WordInfo + { + FileName = model.FileName, + Title = "Список компонент", + Components = _componentStorage.GetFullList() + }); + } + /// <summary> + /// Сохранение компонент с указаеним продуктов в файл-Excel + /// </summary> + /// <param name="model"></param> + public void SavePizzaComponentToExcelFile(ReportBindingModel model) + { + _saveToExcel.CreateReport(new ExcelInfo + { + FileName = model.FileName, + Title = "Список компонент", + PizzaComponents = GetPizzaComponent() + }); + } + /// <summary> + /// Сохранение заказов в файл-Pdf + /// </summary> + /// <param name="model"></param> + public void SaveOrdersToPdfFile(ReportBindingModel model) + { + _saveToPdf.CreateDoc(new PdfInfo + { + FileName = model.FileName, + Title = "Список заказов", + DateFrom = model.DateFrom!.Value, + DateTo = model.DateTo!.Value, + Orders = GetOrders(model) + }); + } + } +} \ No newline at end of file -- 2.25.1 From b3db89edd4822d9a91a8b5b2011a390007dc8131 Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:34:28 +0400 Subject: [PATCH 3/6] contracts layer --- .../BindingModels/ReportBindingModel.cs | 9 +++++ .../BusinessLogicsContracts/IReportLogic.cs | 35 +++++++++++++++++++ .../SearchModels/OrderSearchModel.cs | 2 ++ .../ViewModels/ReportOrdersViewModel.cs | 10 ++++++ .../ReportPizzaComponentViewModel.cs | 9 +++++ .../PizzeriaContracts/ViewModels/WordInfo.cs | 12 +++++++ 6 files changed, 77 insertions(+) create mode 100644 Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs create mode 100644 Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs diff --git a/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs b/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs new file mode 100644 index 0000000..3a6a68a --- /dev/null +++ b/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs @@ -0,0 +1,9 @@ +namespace PizzeriaContracts.BindingModels +{ + public class ReportBindingModel + { + public string FileName { get; set; } = string.Empty; + public DateTime? DateFrom { get; set; } + public DateTime? DateTo { get; set; } + } +} diff --git a/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs b/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs new file mode 100644 index 0000000..c09d455 --- /dev/null +++ b/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs @@ -0,0 +1,35 @@ +using PizzeriaContracts.BindingModels; +using PizzeriaContracts.ViewModels; +using System.Collections.Generic; +namespace PizzeriaContracts.BusinessLogicsContracts +{ + public interface IReportLogic + { + /// <summary> + /// Получение списка компонент с указанием, в каких изделиях используются + /// </summary> + /// <returns></returns> + List<ReportPizzaComponentViewModel> GetPizzaComponent(); + /// <summary> + /// Получение списка заказов за определенный период + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + List<ReportOrdersViewModel> GetOrders(ReportBindingModel model); + /// <summary> + /// Сохранение компонент в файл-Word + /// </summary> + /// <param name="model"></param> + void SaveComponentsToWordFile(ReportBindingModel model); + /// <summary> + /// Сохранение компонент с указаеним продуктов в файл-Excel + /// </summary> + /// <param name="model"></param> + void SavePizzaComponentToExcelFile(ReportBindingModel model); + /// <summary> + /// Сохранение заказов в файл-Pdf + /// </summary> + /// <param name="model"></param> + void SaveOrdersToPdfFile(ReportBindingModel model); + } +} diff --git a/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs b/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs index 3695879..b2e6ddd 100644 --- a/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs +++ b/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs @@ -9,5 +9,7 @@ namespace PizzeriaContracts.SearchModels public class OrderSearchModel { public int? Id { get; set; } + public DateTime? DateFrom { get; set; } + public DateTime? DateTo { get; set; } } } diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs new file mode 100644 index 0000000..2b1f3c1 --- /dev/null +++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs @@ -0,0 +1,10 @@ +namespace PizzeriaContracts.ViewModels +{ + public class ReportOrdersViewModel + { + public int Id { get; set; } + public DateTime DateCreate { get; set; } + public string PizzaName { get; set; } = string.Empty; + public double Sum { get; set; } + } +} diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs new file mode 100644 index 0000000..e96bf04 --- /dev/null +++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs @@ -0,0 +1,9 @@ +namespace PizzeriaContracts.ViewModels +{ + public class ReportPizzaComponentViewModel + { + public string ComponentName { get; set; } = string.Empty; + public int TotalCount { get; set; } + public List<Tuple<string, int>> Pizzas { get; set; } = new(); + } +} diff --git a/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs b/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs new file mode 100644 index 0000000..76306d2 --- /dev/null +++ b/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PizzeriaContracts.ViewModels +{ + internal class WordInfo + { + } +} -- 2.25.1 From f41a3493b109754bd7de971b06355e9f1fc967f7 Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:34:48 +0400 Subject: [PATCH 4/6] database implements layers --- .../PizzeriaDatabaseImplement/Implements/OrderStorage.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs index d5b4c63..54091c3 100644 --- a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs +++ b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs @@ -22,7 +22,12 @@ namespace PizzeriaDatabaseImplement.Implements { using var context = new PizzeriaDatabase(); return context.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id)) + .Where(x => ( + (!model.Id.HasValue || x.Id == model.Id) && + (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) && + (!model.DateTo.HasValue || x.DateCreate <= model.DateTo) + ) + ) .Select(x => x.GetViewModel) .ToList(); } -- 2.25.1 From f396af1eb906e233f7da9429cc39ed9c3a1f6d9d Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:45:31 +0400 Subject: [PATCH 5/6] fix --- Pizzeria/Pizzeria/FormMain.Designer.cs | 4 +- Pizzeria/Pizzeria/FormMain.cs | 7 +- .../Pizzeria/FormReportOrders.Designer.cs | 4 +- .../Pizzeria/FormReportPizzaComponents.cs | 4 +- Pizzeria/Pizzeria/Pizzeria.csproj | 15 +++ .../Pizzeria/Properties/Resources.Designer.cs | 63 +++++++++ Pizzeria/Pizzeria/Properties/Resources.resx | 120 ++++++++++++++++++ Pizzeria/Pizzeria/ReportOrders.rdlc | 82 +++++++++++- .../OfficePackage/AbstractSaveToExcel.cs | 4 +- .../OfficePackage/AbstractSaveToPdf.cs | 6 +- .../OfficePackage/AbstractSaveToWord.cs | 7 +- .../OfficePackage/HelperModels/WordInfo.cs | 2 +- .../OfficePackage/Implements/SaveToWord.cs | 12 +- Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs | 27 ++-- .../ViewModels/ReportOrdersViewModel.cs | 1 + .../ReportPizzaComponentViewModel.cs | 4 +- .../Implements/OrderStorage.cs | 1 + 17 files changed, 313 insertions(+), 50 deletions(-) create mode 100644 Pizzeria/Pizzeria/Properties/Resources.Designer.cs create mode 100644 Pizzeria/Pizzeria/Properties/Resources.resx diff --git a/Pizzeria/Pizzeria/FormMain.Designer.cs b/Pizzeria/Pizzeria/FormMain.Designer.cs index 73ed42d..4115e88 100644 --- a/Pizzeria/Pizzeria/FormMain.Designer.cs +++ b/Pizzeria/Pizzeria/FormMain.Designer.cs @@ -172,8 +172,8 @@ // this.списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem"; this.списокКомпонентовToolStripMenuItem.Size = new System.Drawing.Size(269, 26); - this.списокКомпонентовToolStripMenuItem.Text = "Список компонентов"; - this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click); + this.списокКомпонентовToolStripMenuItem.Text = "Список пицц"; + this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.PizzasToolStripMenuItem_Click); // // компонентовПоПиццамToolStripMenuItem // diff --git a/Pizzeria/Pizzeria/FormMain.cs b/Pizzeria/Pizzeria/FormMain.cs index eed58d0..3edbbb3 100644 --- a/Pizzeria/Pizzeria/FormMain.cs +++ b/Pizzeria/Pizzeria/FormMain.cs @@ -153,9 +153,7 @@ namespace Pizzeria LoadData(); } - - private void ComponentsToolStripMenuItem_Click(object sender, EventArgs -e) + private void PizzasToolStripMenuItem_Click(object sender, EventArgs e) { using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; if (dialog.ShowDialog() == DialogResult.OK) @@ -164,8 +162,7 @@ e) { FileName = dialog.FileName }); - MessageBox.Show("���������", "�����", MessageBoxButtons.OK, - MessageBoxIcon.Information); + MessageBox.Show("���������", "�����", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void ComponentPizzasToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs index 72dd438..8d5991d 100644 --- a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs +++ b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs @@ -94,14 +94,14 @@ this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.panel.Location = new System.Drawing.Point(0, 46); this.panel.Name = "panel"; - this.panel.Size = new System.Drawing.Size(843, 409); + this.panel.Size = new System.Drawing.Size(937, 409); this.panel.TabIndex = 7; // // FormReportOrders // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(842, 470); + this.ClientSize = new System.Drawing.Size(942, 470); this.Controls.Add(this.panel); this.Controls.Add(this.button2); this.Controls.Add(this.button1); diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs index fb5b94f..5dda768 100644 --- a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs +++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs @@ -23,8 +23,8 @@ namespace Pizzeria dataGridView.Rows.Clear(); foreach (var elem in dict) { - dataGridView.Rows.Add(new object[] { elem.ComponentName, "", "" }); - foreach (var listElem in elem.Pizzas) + dataGridView.Rows.Add(new object[] { elem.PizzaName, "", "" }); + foreach (var listElem in elem.Components) { dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 }); } diff --git a/Pizzeria/Pizzeria/Pizzeria.csproj b/Pizzeria/Pizzeria/Pizzeria.csproj index 9b2c453..6b2550f 100644 --- a/Pizzeria/Pizzeria/Pizzeria.csproj +++ b/Pizzeria/Pizzeria/Pizzeria.csproj @@ -26,6 +26,21 @@ <ProjectReference Include="..\PizzeriaShopFileImplement\PizzeriaFileImplement.csproj" /> </ItemGroup> + <ItemGroup> + <Compile Update="Properties\Resources.Designer.cs"> + <DesignTime>True</DesignTime> + <AutoGen>True</AutoGen> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + </ItemGroup> + + <ItemGroup> + <EmbeddedResource Update="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> <None Update="nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> diff --git a/Pizzeria/Pizzeria/Properties/Resources.Designer.cs b/Pizzeria/Pizzeria/Properties/Resources.Designer.cs new file mode 100644 index 0000000..13c5d43 --- /dev/null +++ b/Pizzeria/Pizzeria/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Pizzeria.Properties { + using System; + + + /// <summary> + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// </summary> + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Pizzeria.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Pizzeria/Pizzeria/Properties/Resources.resx b/Pizzeria/Pizzeria/Properties/Resources.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Pizzeria/Pizzeria/Properties/Resources.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/Pizzeria/Pizzeria/ReportOrders.rdlc b/Pizzeria/Pizzeria/ReportOrders.rdlc index 0eb814a..fdc4a16 100644 --- a/Pizzeria/Pizzeria/ReportOrders.rdlc +++ b/Pizzeria/Pizzeria/ReportOrders.rdlc @@ -29,6 +29,10 @@ <DataField>PizzaName</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> + <Field Name="OrderStatus"> + <DataField>OrderStatus</DataField> + <rd:TypeName>System.String</rd:TypeName> + </Field> <Field Name="Sum"> <DataField>Sum</DataField> <rd:TypeName>System.Decimal</rd:TypeName> @@ -116,16 +120,19 @@ <TablixBody> <TablixColumns> <TablixColumn> - <Width>2.5cm</Width> + <Width>2.0889cm</Width> </TablixColumn> <TablixColumn> - <Width>3.21438cm</Width> + <Width>2.80328cm</Width> </TablixColumn> <TablixColumn> - <Width>8.23317cm</Width> + <Width>7.82207cm</Width> </TablixColumn> <TablixColumn> - <Width>2.5cm</Width> + <Width>2.0889cm</Width> + </TablixColumn> + <TablixColumn> + <Width>2.0889cm</Width> </TablixColumn> </TablixColumns> <TablixRows> @@ -228,6 +235,38 @@ </Textbox> </CellContents> </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="Textbox2"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>Order Status</Value> + <Style> + <FontWeight>Bold</FontWeight> + </Style> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>Textbox2</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> <TablixCell> <CellContents> <Textbox Name="Textbox7"> @@ -357,6 +396,36 @@ </Textbox> </CellContents> </TablixCell> + <TablixCell> + <CellContents> + <Textbox Name="OrderStatus"> + <CanGrow>true</CanGrow> + <KeepTogether>true</KeepTogether> + <Paragraphs> + <Paragraph> + <TextRuns> + <TextRun> + <Value>=Fields!OrderStatus.Value</Value> + <Style /> + </TextRun> + </TextRuns> + <Style /> + </Paragraph> + </Paragraphs> + <rd:DefaultName>OrderStatus</rd:DefaultName> + <Style> + <Border> + <Color>LightGrey</Color> + <Style>Solid</Style> + </Border> + <PaddingLeft>2pt</PaddingLeft> + <PaddingRight>2pt</PaddingRight> + <PaddingTop>2pt</PaddingTop> + <PaddingBottom>2pt</PaddingBottom> + </Style> + </Textbox> + </CellContents> + </TablixCell> <TablixCell> <CellContents> <Textbox Name="Sum"> @@ -397,6 +466,7 @@ <TablixMember /> <TablixMember /> <TablixMember /> + <TablixMember /> </TablixMembers> </TablixColumnHierarchy> <TablixRowHierarchy> @@ -413,7 +483,7 @@ <Top>2.48391cm</Top> <Left>0.55245cm</Left> <Height>1.2cm</Height> - <Width>16.44755cm</Width> + <Width>16.89205cm</Width> <ZIndex>2</ZIndex> <Style> <Border> @@ -491,7 +561,7 @@ <Height>6.27908cm</Height> <Style /> </Body> - <Width>17.4445cm</Width> + <Width>18.27233cm</Width> <Page> <PageHeight>29.7cm</PageHeight> <PageWidth>21cm</PageWidth> diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs index 2a3b713..8d46ed7 100644 --- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -30,11 +30,11 @@ namespace PizzeriaBusinessLogic.OfficePackage { ColumnName = "A", RowIndex = rowIndex, - Text = pc.ComponentName, + Text = pc.PizzaName, StyleInfo = ExcelStyleInfoType.Text }); rowIndex++; - foreach (var pizza in pc.Pizzas) + foreach (var pizza in pc.Components) { InsertCellInWorksheet(new ExcelCellParameters { diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs index e131cab..8b1e082 100644 --- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs @@ -18,10 +18,10 @@ namespace PizzeriaBusinessLogic.OfficePackage Text = $"с { info.DateFrom.ToShortDateString() } по { info.DateTo.ToShortDateString() }", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); - CreateTable(new List<string> { "2cm", "3cm", "6cm", "3cm" }); + CreateTable(new List<string> { "2cm", "3cm", "5cm", "4cm", "3cm" }); CreateRow(new PdfRowParameters { - Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Сумма" }, + Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Статус заказа", "Сумма" }, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center }); @@ -29,7 +29,7 @@ namespace PizzeriaBusinessLogic.OfficePackage { CreateRow(new PdfRowParameters { - Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.Sum.ToString() }, + Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.OrderStatus, order.Sum.ToString() }, Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Left }); diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs index d38b10b..9a0388b 100644 --- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -16,11 +16,14 @@ namespace PizzeriaBusinessLogic.OfficePackage JustificationType = WordJustificationType.Center } }); - foreach (var component in info.Components) + foreach (var component in info.Pizzas) { CreateParagraph(new WordParagraph { - Texts = new List<(string, WordTextProperties)> { (component.ComponentName, new WordTextProperties { Size = "24", }) }, + Texts = new List<(string, WordTextProperties)> { + (component.PizzaName, new WordTextProperties { Size = "24", Bold = true }), + (" " + component.Price.ToString(), new WordTextProperties { Size = "24" }) + }, TextProperties = new WordTextProperties { Size = "24", diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs index 60f1776..ecb9b45 100644 --- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -5,6 +5,6 @@ namespace PizzeriaBusinessLogic.OfficePackage.HelperModels { public string FileName { get; set; } = string.Empty; public string Title { get; set; } = string.Empty; - public List<ComponentViewModel> Components { get; set; } = new(); + public List<PizzaViewModel> Pizzas { get; set; } = new(); } } diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs index c70176e..0ee7436 100644 --- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs +++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs @@ -53,8 +53,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements var properties = new ParagraphProperties(); properties.AppendChild(new Justification() { - Val = - GetJustificationValues(paragraphProperties.JustificationType) + Val = GetJustificationValues(paragraphProperties.JustificationType) }); properties.AppendChild(new SpacingBetweenLines { @@ -66,8 +65,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements { paragraphMarkRunProperties.AppendChild(new FontSize { - Val = - paragraphProperties.Size + Val = paragraphProperties.Size }); } properties.AppendChild(paragraphMarkRunProperties); @@ -75,8 +73,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements } protected override void CreateWord(WordInfo info) { - _wordDocument = WordprocessingDocument.Create(info.FileName, - WordprocessingDocumentType.Document); + _wordDocument = WordprocessingDocument.Create(info.FileName, WordprocessingDocumentType.Document); MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart(); mainPart.Document = new Document(); _docBody = mainPart.Document.AppendChild(new Body()); @@ -103,8 +100,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements docRun.AppendChild(new Text { Text = run.Item1, - Space = - SpaceProcessingModeValues.Preserve + Space = SpaceProcessingModeValues.Preserve }); docParagraph.AppendChild(docRun); } diff --git a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs index 6baed96..0fc63ce 100644 --- a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs +++ b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs @@ -34,29 +34,25 @@ namespace PizzeriaBusinessLogic /// <returns></returns> public List<ReportPizzaComponentViewModel> GetPizzaComponent() { - var components = _componentStorage.GetFullList(); var pizzas = _pizzaStorage.GetFullList(); var list = new List<ReportPizzaComponentViewModel>(); - foreach (var component in components) + foreach(var pizza in pizzas) { var record = new ReportPizzaComponentViewModel { - ComponentName = component.ComponentName, - Pizzas = new List<Tuple<string, int>>(), - TotalCount = 0 + PizzaName = pizza.PizzaName, + TotalCount = 0, + Components = new List<(string componentName, int count)>() }; - foreach (var pizza in pizzas) + + foreach(var component in pizza.PizzaComponents) { - if (pizza.PizzaComponents.ContainsKey(component.Id)) - { - record.Pizzas.Add(new Tuple<string, - int>(pizza.PizzaName, pizza.PizzaComponents[component.Id].Item2)); - record.TotalCount += - pizza.PizzaComponents[component.Id].Item2; - } + record.Components.Add((component.Value.Item1.ComponentName, component.Value.Item2 )); + record.TotalCount += component.Value.Item2; } list.Add(record); } + return list; } /// <summary> @@ -76,6 +72,7 @@ namespace PizzeriaBusinessLogic Id = x.Id, DateCreate = x.DateCreate, PizzaName = x.PizzaName, + OrderStatus = x.Status.ToString(), Sum = x.Sum }) .ToList(); @@ -89,8 +86,8 @@ namespace PizzeriaBusinessLogic _saveToWord.CreateDoc(new WordInfo { FileName = model.FileName, - Title = "Список компонент", - Components = _componentStorage.GetFullList() + Title = "Список пицц", + Pizzas = _pizzaStorage.GetFullList() }); } /// <summary> diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs index 2b1f3c1..7aa2ce6 100644 --- a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs +++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs @@ -5,6 +5,7 @@ public int Id { get; set; } public DateTime DateCreate { get; set; } public string PizzaName { get; set; } = string.Empty; + public string OrderStatus { get; set; } = string.Empty; public double Sum { get; set; } } } diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs index e96bf04..b085794 100644 --- a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs +++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs @@ -2,8 +2,8 @@ { public class ReportPizzaComponentViewModel { - public string ComponentName { get; set; } = string.Empty; + public string PizzaName { get; set; } = string.Empty; public int TotalCount { get; set; } - public List<Tuple<string, int>> Pizzas { get; set; } = new(); + public List<(string componentName, int count)> Components { get; set; } = new(); } } diff --git a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs index 54091c3..208bf06 100644 --- a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs +++ b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs @@ -22,6 +22,7 @@ namespace PizzeriaDatabaseImplement.Implements { using var context = new PizzeriaDatabase(); return context.Orders + .Include(x => x.Pizza) .Where(x => ( (!model.Id.HasValue || x.Id == model.Id) && (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) && -- 2.25.1 From 7630dabb9e72ca766df562441738277d61336080 Mon Sep 17 00:00:00 2001 From: parap <parap123456789@mail.ru> Date: Tue, 2 May 2023 22:29:10 +0400 Subject: [PATCH 6/6] dop logic --- Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs | 6 +++++- .../PizzeriaShopFileImplement/Implements/OrderStorage.cs | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs index 2e033c4..6444065 100644 --- a/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs +++ b/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs @@ -39,7 +39,11 @@ namespace PizzeriaListImplement.Implements foreach (var order in _source.Orders) { - if (model.Id.HasValue && order.Id == model.Id) + if ( + (!model.Id.HasValue || order.Id == model.Id) && + (!model.DateFrom.HasValue || order.DateCreate >= model.DateFrom) && + (!model.DateTo.HasValue || order.DateCreate <= model.DateTo) + ) { OrderViewModel viewModel = order.GetViewModel; viewModel.PizzaName = _pizzaStorage.GetElement(new PizzaSearchModel { Id = order.PizzaId }).PizzaName; diff --git a/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs index 9c695a3..92895f0 100644 --- a/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs +++ b/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs @@ -23,7 +23,10 @@ namespace PizzeriaFileImplement.Implements public List<OrderViewModel> GetFilteredList(OrderSearchModel model) { return source.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id)) + .Where(x => + (!model.Id.HasValue || x.Id == model.Id) && + (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) && + (!model.DateTo.HasValue || x.DateCreate <= model.DateTo)) .Select(x => x.GetViewModel) .ToList(); } -- 2.25.1