From 47c5208fb294943f03af79fdff5ab8639213baf5 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Sun, 15 Dec 2024 22:21:36 +0400 Subject: [PATCH 01/15] wordbuilder --- .../ProjectRepairCompany.csproj | 1 + .../Reports/WordBuilder.cs | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj index b94bfad..9c16bea 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj +++ b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj @@ -10,6 +10,7 @@ + diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs new file mode 100644 index 0000000..5b8a47e --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs @@ -0,0 +1,101 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Wordprocessing; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Reports; + +internal class WordBuilder +{ + private readonly string _filePath; + private readonly Document _document; + private readonly Body _body; + + public WordBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentNullException(nameof(filePath)); + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + _filePath = filePath; + _document = new Document(); + _body = _document.AppendChild(new Body()); + } + + public WordBuilder AddHeader(string header) + { + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + var runProperties = new RunProperties(); + + runProperties.AppendChild(new Bold()); + run.PrependChild(runProperties); + run.AppendChild(new Text(header)); + + return this; + } + public WordBuilder AddParagraph(string text) + { + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + run.AppendChild(new Text(text)); + + return this; + } + public WordBuilder AddTable(int[] widths, List data) + { + if (widths == null) + { + throw new ArgumentNullException(nameof(widths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != widths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + var table = new Table(); + table.AppendChild(new TableProperties( + new TableBorders( + new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 12}, + new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 12}, + new LeftBorder() { Val = new EnumValue(BorderValues.Single), Size = 12}, + new RightBorder() { Val = new EnumValue(BorderValues.Single), Size = 12}, + new InsideHorizontalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12}, + new InsideVerticalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12} + ) + )); + + //header + var tr = new TableRow(); + for (var j = 0; j < widths.Length; ++j) + { + tr.Append(new TableCell( + new TableCellProperties(new TableCellWidth() { Width = widths[j].ToString() }), + new Paragraph(new Run(new RunProperties(new Bold()), new Text(data.First()[j]))))); + } + table.Append(tr); + + //data + table.Append(data.Skip(1).Select(x => + new TableRow(x.Select(y => new TableCell(new Paragraph(new Run(new Text(y)))))))); + _body.Append(table); + + return this; + } + public void Build() + { + using var wordDocument = WordprocessingDocument.Create(_filePath, WordprocessingDocumentType.Document); + var mainPart = wordDocument.AddMainDocumentPart(); + mainPart.Document = _document; + } + +} -- 2.25.1 From ad2cd595372916f9653acd538980b1fecb3c5548 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 00:58:01 +0400 Subject: [PATCH 02/15] =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B8=20=D1=81=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormRepairCompany.Designer.cs | 10 ++ .../ProjectRepairCompany/FormRepairCompany.cs | 12 ++ .../Forms/FormDirectoryReport.Designer.cs | 100 +++++++++++++++ .../Forms/FormDirectoryReport.cs | 62 +++++++++ .../Forms/FormDirectoryReport.resx | 120 ++++++++++++++++++ .../ProjectRepairCompany/Reports/DocReport.cs | 72 +++++++++++ 6 files changed, 376 insertions(+) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.resx create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs index 5a2c8e5..6bf6a71 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs @@ -37,6 +37,7 @@ OrderToolStripMenuItem = new ToolStripMenuItem(); StorageDetailToolStripMenuItem = new ToolStripMenuItem(); отчетыToolStripMenuItem = new ToolStripMenuItem(); + DirectoryReportToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -100,10 +101,18 @@ // // отчетыToolStripMenuItem // + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; отчетыToolStripMenuItem.Size = new Size(63, 21); отчетыToolStripMenuItem.Text = "Отчеты"; // + // DirectoryReportToolStripMenuItem + // + DirectoryReportToolStripMenuItem.Name = "DirectoryReportToolStripMenuItem"; + DirectoryReportToolStripMenuItem.Size = new Size(248, 22); + DirectoryReportToolStripMenuItem.Text = "Документ со справочниками"; + DirectoryReportToolStripMenuItem.Click += DirectoryReportToolStripMenuItem_Click; + // // FormRepairCompany // AutoScaleDimensions = new SizeF(7F, 17F); @@ -134,5 +143,6 @@ private ToolStripMenuItem отчетыToolStripMenuItem; private ToolStripMenuItem StorageDetailToolStripMenuItem; private ToolStripMenuItem OrderToolStripMenuItem; + private ToolStripMenuItem DirectoryReportToolStripMenuItem; } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs index 10177e6..85ae560 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs @@ -72,5 +72,17 @@ namespace ProjectRepairCompany MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void DirectoryReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs new file mode 100644 index 0000000..aa14418 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs @@ -0,0 +1,100 @@ +namespace ProjectRepairCompany.Forms +{ + partial class FormDirectoryReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + checkBoxMasters = new CheckBox(); + checkBoxDetails = new CheckBox(); + checkBoxStorages = new CheckBox(); + ButtonBuild = new Button(); + SuspendLayout(); + // + // checkBoxMasters + // + checkBoxMasters.AutoSize = true; + checkBoxMasters.Location = new Point(34, 28); + checkBoxMasters.Name = "checkBoxMasters"; + checkBoxMasters.Size = new Size(89, 21); + checkBoxMasters.TabIndex = 0; + checkBoxMasters.Text = "Работники"; + checkBoxMasters.UseVisualStyleBackColor = true; + // + // checkBoxDetails + // + checkBoxDetails.AutoSize = true; + checkBoxDetails.Location = new Point(34, 83); + checkBoxDetails.Name = "checkBoxDetails"; + checkBoxDetails.Size = new Size(69, 21); + checkBoxDetails.TabIndex = 1; + checkBoxDetails.Text = "Детали"; + checkBoxDetails.UseVisualStyleBackColor = true; + // + // checkBoxStorages + // + checkBoxStorages.AutoSize = true; + checkBoxStorages.Location = new Point(34, 135); + checkBoxStorages.Name = "checkBoxStorages"; + checkBoxStorages.Size = new Size(71, 21); + checkBoxStorages.TabIndex = 2; + checkBoxStorages.Text = "Склады"; + checkBoxStorages.UseVisualStyleBackColor = true; + // + // ButtonBuild + // + ButtonBuild.Location = new Point(155, 28); + ButtonBuild.Name = "ButtonBuild"; + ButtonBuild.Size = new Size(139, 128); + ButtonBuild.TabIndex = 3; + ButtonBuild.Text = "Формировать отчет"; + ButtonBuild.UseVisualStyleBackColor = true; + ButtonBuild.Click += ButtonBuild_Click; + // + // FormDirectoryReport + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(398, 249); + Controls.Add(ButtonBuild); + Controls.Add(checkBoxStorages); + Controls.Add(checkBoxDetails); + Controls.Add(checkBoxMasters); + Name = "FormDirectoryReport"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormDirectoryReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private CheckBox checkBoxMasters; + private CheckBox checkBoxDetails; + private CheckBox checkBoxStorages; + private Button ButtonBuild; + } +} \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs new file mode 100644 index 0000000..af2bea3 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs @@ -0,0 +1,62 @@ +using ProjectRepairCompany.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectRepairCompany.Forms +{ + public partial class FormDirectoryReport : Form + { + private readonly IUnityContainer _container; + public FormDirectoryReport(UnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void ButtonBuild_Click(object sender, EventArgs e) + { + try + { + if (!checkBoxMasters.Checked && !checkBoxDetails.Checked && !checkBoxStorages.Checked) + { + throw new Exception("Не выбран ни один справочник для выгрузки"); + } + var sfd = new SaveFileDialog() + { + Filter = "Docx Files | *.docx" + }; + if (sfd.ShowDialog() != DialogResult.OK) + { + throw new Exception("Не выбран файла для отчета"); + } + if (_container.Resolve().CreateDoc(sfd.FileName, checkBoxMasters.Checked, checkBoxDetails.Checked, checkBoxStorages.Checked)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах","Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + + } + + } + +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.resx b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs new file mode 100644 index 0000000..2e0ff7d --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs @@ -0,0 +1,72 @@ +using Microsoft.Extensions.Logging; +using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Reports; + +internal class DocReport +{ + private readonly IStorageRepository _storageRepository; + private readonly IMasterRepository _masterRepository; + private readonly IDetailRepository _detailRepository; + + private readonly ILogger _logger; + public DocReport(IMasterRepository masterRepository, IDetailRepository detailRepository, IStorageRepository storageRepository, ILogger logger) + { + _masterRepository = masterRepository + ?? throw new ArgumentNullException(nameof(masterRepository)); + _detailRepository = detailRepository + ?? throw new ArgumentNullException(nameof(detailRepository)); + _storageRepository = storageRepository + ?? throw new ArgumentNullException(nameof(storageRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateDoc(string filePath, bool includeMasters, bool includeDetails, bool includeStorages) + { + try + { + var builder = new WordBuilder(filePath).AddHeader("Документ со справочниками"); + if (includeMasters) + { + builder.AddParagraph("Мастера").AddTable([2400, 2400, 2400], GetMasters()); + } + if (includeDetails) + { + builder.AddParagraph("Детали").AddTable([2400, 2400, 2400, 2400], GetDetails()); + } + if (includeStorages) + { + builder.AddParagraph("Склады").AddTable([2400, 2400], GetStorages()); + } + builder.Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка формирования"); + return false; + } + } + + private List GetMasters() + { + return [["Работник", "Должность", "Дата начала работы"], + .. _masterRepository.ReadMasters().Select(x => new string[] { x.MasterName, x.MasterPost.ToString(), x.StartDate.ToString("dd.MM.yyyy") }),]; + } + private List GetDetails() + { + return [["Название детали", "Цена", "Число", "Свойства"], + .. _detailRepository.ReadDetails().Select(x => new string[] { x.NameDetail, x.PriceDetail.ToString("N2"), x.NumberDetail.ToString(), x.DetailProperties.ToString() }),]; + } + private List GetStorages() + { + return [["Адрес", "Вместимость"], + .. _storageRepository.ReadStorages().Select(x => new string[] { x.StorageAddress, x.Capacity.ToString() }),]; + } +} -- 2.25.1 From d49587845b6474ca4cedcc7e6c9d389351211782 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 01:56:23 +0400 Subject: [PATCH 03/15] =?UTF-8?q?=D0=AD=D0=BA=D1=81=D0=B5=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Forms/FormDirectoryReport.cs | 6 +- .../ProjectRepairCompany.csproj | 8 +- .../ProjectRepairCompany/Reports/DocReport.cs | 9 +- .../Reports/ExcelBuilder.cs | 330 ++++++++++++++++++ .../Reports/WordBuilder.cs | 12 +- 5 files changed, 348 insertions(+), 17 deletions(-) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs index af2bea3..89b58be 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs @@ -40,13 +40,11 @@ namespace ProjectRepairCompany.Forms } if (_container.Resolve().CreateDoc(sfd.FileName, checkBoxMasters.Checked, checkBoxDetails.Checked, checkBoxStorages.Checked)) { - MessageBox.Show("Документ сформирован", "Формирование документа", - MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { - MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах","Формирование документа", - MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах","Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) diff --git a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj index 9c16bea..cd77ad5 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj +++ b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj @@ -15,10 +15,10 @@ - - - - + + + + diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs index 2e0ff7d..2711f63 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs @@ -57,16 +57,19 @@ internal class DocReport private List GetMasters() { return [["Работник", "Должность", "Дата начала работы"], - .. _masterRepository.ReadMasters().Select(x => new string[] { x.MasterName, x.MasterPost.ToString(), x.StartDate.ToString("dd.MM.yyyy") }),]; + .. _masterRepository.ReadMasters().Select(x => new string[] { x.MasterName, x.MasterPost.ToString(), x.StartDate.ToString("dd.MM.yyyy") }), + ]; } private List GetDetails() { return [["Название детали", "Цена", "Число", "Свойства"], - .. _detailRepository.ReadDetails().Select(x => new string[] { x.NameDetail, x.PriceDetail.ToString("N2"), x.NumberDetail.ToString(), x.DetailProperties.ToString() }),]; + .. _detailRepository.ReadDetails().Select(x => new string[] { x.NameDetail, x.PriceDetail.ToString("N2"), x.NumberDetail.ToString(), x.DetailProperties.ToString() }), + ]; } private List GetStorages() { return [["Адрес", "Вместимость"], - .. _storageRepository.ReadStorages().Select(x => new string[] { x.StorageAddress, x.Capacity.ToString() }),]; + .. _storageRepository.ReadStorages().Select(x => new string[] { x.StorageAddress, x.Capacity.ToString() }), + ]; } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs new file mode 100644 index 0000000..1871afb --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs @@ -0,0 +1,330 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Reports; + +internal class ExcelBuilder +{ + private readonly string _filePath; + private readonly SheetData _sheetData; + private readonly MergeCells _mergeCells; + private readonly Columns _columns; + private uint _rowIndex = 0; + public ExcelBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _sheetData = new SheetData(); + _mergeCells = new MergeCells(); + _columns = new Columns(); + _rowIndex = 1; + } + public ExcelBuilder AddHeader(string header, int startIndex, int count) + { + CreateCell(startIndex, _rowIndex, header, + StyleIndex.SimpleTextWithoutBorder); + for (int i = startIndex + 1; i < startIndex + count; ++i) + { + CreateCell(i, _rowIndex, "", + StyleIndex.SimpleTextWithoutBorder); + } + _mergeCells.Append(new MergeCell() + { + Reference = + new + StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}") + }); + _rowIndex++; + return this; + } + public ExcelBuilder AddParagraph(string text, int columnIndex) + { + CreateCell(columnIndex, _rowIndex++, text, + StyleIndex.SimpleTextWithoutBorder); + return this; + } + public ExcelBuilder AddTable(int[] columnsWidths, List data) + { + if (columnsWidths == null || columnsWidths.Length == 0) + { + throw new ArgumentNullException(nameof(columnsWidths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != columnsWidths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + uint counter = 1; + int coef = 2; + _columns.Append(columnsWidths.Select(x => new Column + { + Min = counter, + Max = counter++, + Width = x * coef, + CustomWidth = true + })); + for (var j = 0; j < data.First().Length; ++j) + { + CreateCell(j, _rowIndex, data.First()[j], + StyleIndex.SimpleTextWithoutBorder); + } + _rowIndex++; + for (var i = 1; i < data.Count - 1; ++i) + { + for (var j = 0; j < data[i].Length; ++j) + { + CreateCell(j, _rowIndex, data[i][j], + StyleIndex.SimpleTextWithoutBorder); + } + _rowIndex++; + } + for (var j = 0; j < data.Last().Length; ++j) + { + CreateCell(j, _rowIndex, data.Last()[j], + StyleIndex.SimpleTextWithoutBorder); + } + _rowIndex++; + return this; + } + public void Build() + { + using var spreadsheetDocument = SpreadsheetDocument.Create(_filePath, + SpreadsheetDocumentType.Workbook); + var workbookpart = spreadsheetDocument.AddWorkbookPart(); + GenerateStyle(workbookpart); + workbookpart.Workbook = new Workbook(); + var worksheetPart = workbookpart.AddNewPart(); + worksheetPart.Worksheet = new Worksheet(); + if (_columns.HasChildren) + { + worksheetPart.Worksheet.Append(_columns); + } + worksheetPart.Worksheet.Append(_sheetData); + var sheets = + spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets()); + var sheet = new Sheet() + { + Id = + spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), + SheetId = 1, + Name = "Лист 1" + }; + sheets.Append(sheet); + if (_mergeCells.HasChildren) + { + worksheetPart.Worksheet.InsertAfter(_mergeCells, + worksheetPart.Worksheet.Elements().First()); + } + } + private static void GenerateStyle(WorkbookPart workbookPart) + { + var workbookStylesPart = workbookPart.AddNewPart(); + workbookStylesPart.Stylesheet = new Stylesheet(); + var fonts = new Fonts() + { + Count = 2, + KnownFonts = BooleanValue.FromBoolean(true) + }; + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + } + }); + // TODO добавить шрифт с жирным + // Шрифт с жирным текстом + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + Bold = new Bold(), // Жирный текст + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + } + }); + workbookStylesPart.Stylesheet.Append(fonts); + // Default Fill + var fills = new Fills() { Count = 1 }; + fills.Append(new Fill + { + PatternFill = new PatternFill() + { + PatternType = new EnumValue(PatternValues.None) + } + }); + workbookStylesPart.Stylesheet.Append(fills); + // Default Border + + var borders = new Borders() { Count = 2 }; + borders.Append(new Border + { + LeftBorder = new LeftBorder(), + RightBorder = new RightBorder(), + TopBorder = new TopBorder(), + BottomBorder = new BottomBorder(), + DiagonalBorder = new DiagonalBorder() + }); + // TODO добавить настройку с границами + borders.Append(new Border + { + LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }, + RightBorder = new RightBorder() { Style = BorderStyleValues.Thin }, + TopBorder = new TopBorder() { Style = BorderStyleValues.Thin }, + BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin }, + DiagonalBorder = new DiagonalBorder() + }); + + workbookStylesPart.Stylesheet.Append(borders); + // Default cell format and a date cell format + var cellFormats = new CellFormats() { Count = 4 }; + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 0, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + // TODO дополнить форматы + // Жирный текст без границ + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 1, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + + // Обычный текст с границами + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 0, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + // Жирный текст с границами + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 1, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Center, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + workbookStylesPart.Stylesheet.Append(cellFormats); + } + private enum StyleIndex + { + SimpleTextWithoutBorder = 0, + // TODO дополнить стили + BoldTextWithoutBorder = 1, + SimpleTextWithBorder = 2, + BoldTextWithBorder = 3 + } + private void CreateCell(int columnIndex, uint rowIndex, string text, StyleIndex styleIndex) + { + var columnName = GetExcelColumnName(columnIndex); + var cellReference = columnName + rowIndex; + var row = _sheetData.Elements().FirstOrDefault(r => r.RowIndex! + == rowIndex); + if (row == null) + { + row = new Row() { RowIndex = rowIndex }; + _sheetData.Append(row); + } + var newCell = row.Elements() + .FirstOrDefault(c => c.CellReference != null && + c.CellReference.Value == columnName + rowIndex); + if (newCell == null) + { + Cell? refCell = null; + foreach (Cell cell in row.Elements()) + { + if (cell.CellReference?.Value != null && + cell.CellReference.Value.Length == cellReference.Length) + { + if (string.Compare(cell.CellReference.Value, + cellReference, true) > 0) + { + refCell = cell; + break; + } + } + } + newCell = new Cell() { CellReference = cellReference }; + row.InsertBefore(newCell, refCell); + } + newCell.CellValue = new CellValue(text); + newCell.DataType = CellValues.String; + newCell.StyleIndex = (uint)styleIndex; + } + private static string GetExcelColumnName(int columnNumber) + { + columnNumber += 1; + int dividend = columnNumber; + string columnName = string.Empty; + int modulo; + while (dividend > 0) + { + modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo).ToString() + + columnName; + dividend = (dividend - modulo) / 26; + } + return columnName; + } +} + + + + + diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs index 5b8a47e..aa01944 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/WordBuilder.cs @@ -17,7 +17,10 @@ internal class WordBuilder public WordBuilder(string filePath) { - if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentNullException(nameof(filePath)); + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } if (File.Exists(filePath)) { File.Delete(filePath); @@ -32,10 +35,7 @@ internal class WordBuilder { var paragraph = _body.AppendChild(new Paragraph()); var run = paragraph.AppendChild(new Run()); - var runProperties = new RunProperties(); - - runProperties.AppendChild(new Bold()); - run.PrependChild(runProperties); + var runProperties = run.AppendChild(new RunProperties()); run.AppendChild(new Text(header)); return this; @@ -50,7 +50,7 @@ internal class WordBuilder } public WordBuilder AddTable(int[] widths, List data) { - if (widths == null) + if (widths == null || widths.Length == 0) { throw new ArgumentNullException(nameof(widths)); } -- 2.25.1 From a6bc108099c3aa268cca2c4ac89c8d0b64592ecc Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 03:47:22 +0400 Subject: [PATCH 04/15] =?UTF-8?q?=D0=BB=D0=BE=D0=BC=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reports/TableReport.cs | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs new file mode 100644 index 0000000..69a60ca --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs @@ -0,0 +1,112 @@ +using Microsoft.Extensions.Logging; +using ProjectRepairCompany.Entities; +using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.Linq; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; + +namespace ProjectRepairCompany.Reports; + +internal class TableReport +{ + private readonly IStorageDetailRepository _storageDetailRepository; + private readonly IOrderRepository _orderRepository; + private readonly ILogger _logger; + + internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; + + public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) + { + _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) + { + try + { + new ExcelBuilder(filePath) + .AddHeader("Сводка по движению деталей", 1, 4) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) + .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + private List GetData(int detailId, DateTime startDate, DateTime endDate) + { + // Получаем данные о пополнении склада + var storageData = _storageDetailRepository + .ReadStorageDetails() + .Where(x => x.SupplyDate >= startDate && x.SupplyDate <= endDate && x.DetailId == detailId) + .Select(x => new + { + x.DetailId, + Date = x.SupplyDate, // Дата поступления + CountIn = x.DetailCount, // Количество пришло + CountOut = (int?)null // Нет исходящих + }) + .OrderBy(x => x.Date); // Сортировка по дате поступления + + // Получаем данные о заказах + var orderData = _orderRepository + .ReadOrders() + .Where(x => x.DateIssue >= startDate && x.DateIssue <= endDate) + .SelectMany(x => x.OrderDetails) // Извлекаем все детали из заказов + .Where(orderDetail => orderDetail.DetailId == detailId) + .Select(orderDetail => new + { + DetailId = orderDetail.DetailId, + Date = orderDetail.Order.DateIssue, // Дата заказа + CountIn = (int?)null, // Нет поступлений + CountOut = orderDetail.DetailCount // Количество ушло + }) + .OrderBy(x => x.Date); // Сортировка по дате заказа + + // Объединяем данные из двух источников + var combinedData = storageData + .Union(orderData) + .OrderBy(x => x.Date) // Сортируем все данные по дате + .ToList(); + + // Формируем итоговую таблицу + var result = new List { item } + .Union(combinedData.Select(x => new string[] + { + x.DetailId.ToString(), // Деталь + x.Date.ToString("dd.MM.yyyy"), // Дата + x.CountIn?.ToString() ?? string.Empty, // Количество пришло + x.CountOut?.ToString() ?? string.Empty // Количество ушло + })) + .Union(new[] + { + new string[] + { + "Всего", + "", + combinedData.Sum(x => x.CountIn ?? 0).ToString(), // Суммируем все поступления + combinedData.Sum(x => x.CountOut ?? 0).ToString() // Суммируем все исходящие + } + }) + .ToList(); + + return result; + } + + + + + + + + +} -- 2.25.1 From 9fdef630384a2ffd1acc2685d0058b986af7785e Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 15:36:42 +0400 Subject: [PATCH 05/15] =?UTF-8?q?=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Forms/FormOrders.Designer.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs index 94ad1ae..23dcdb5 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs @@ -29,7 +29,6 @@ private void InitializeComponent() { panel1 = new Panel(); - ButtonUp = new Button(); ButtonDel = new Button(); ButtonAdd = new Button(); dataGridView = new DataGridView(); @@ -39,7 +38,6 @@ // // panel1 // - panel1.Controls.Add(ButtonUp); panel1.Controls.Add(ButtonDel); panel1.Controls.Add(ButtonAdd); panel1.Dock = DockStyle.Right; @@ -106,7 +104,6 @@ #endregion private Panel panel1; - private Button ButtonUp; private Button ButtonDel; private Button ButtonAdd; private DataGridView dataGridView; -- 2.25.1 From 885c3a103a0189c7b1b2f8ffb06131a0a03caf8c Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 16:17:59 +0400 Subject: [PATCH 06/15] =?UTF-8?q?=D1=82=D0=BE=D1=82=20=D0=B6=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Forms/FormOrders.Designer.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs index 94ad1ae..23dcdb5 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs @@ -29,7 +29,6 @@ private void InitializeComponent() { panel1 = new Panel(); - ButtonUp = new Button(); ButtonDel = new Button(); ButtonAdd = new Button(); dataGridView = new DataGridView(); @@ -39,7 +38,6 @@ // // panel1 // - panel1.Controls.Add(ButtonUp); panel1.Controls.Add(ButtonDel); panel1.Controls.Add(ButtonAdd); panel1.Dock = DockStyle.Right; @@ -106,7 +104,6 @@ #endregion private Panel panel1; - private Button ButtonUp; private Button ButtonDel; private Button ButtonAdd; private DataGridView dataGridView; -- 2.25.1 From 8343749aedc0371da3e3e2bf0b4cd56746deaedd Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 16 Dec 2024 16:57:47 +0400 Subject: [PATCH 07/15] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=B0=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2,=20=D0=AD=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=D1=83=20=D1=81=D0=BB=D0=B0=D0=B2=D0=B0=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=82=20<3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Forms/FormDirectoryReport.cs | 2 +- .../ProjectRepairCompany/Reports/DocReport.cs | 4 +- .../Reports/TableReport.cs | 188 +++++++++--------- 3 files changed, 97 insertions(+), 97 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs index 89b58be..4486487 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs @@ -15,7 +15,7 @@ namespace ProjectRepairCompany.Forms public partial class FormDirectoryReport : Form { private readonly IUnityContainer _container; - public FormDirectoryReport(UnityContainer container) + public FormDirectoryReport(IUnityContainer container) { InitializeComponent(); _container = container ?? diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs index 2711f63..628f991 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/DocReport.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace ProjectRepairCompany.Reports; -internal class DocReport +public class DocReport { private readonly IStorageRepository _storageRepository; private readonly IMasterRepository _masterRepository; @@ -18,7 +18,7 @@ internal class DocReport private readonly ILogger _logger; public DocReport(IMasterRepository masterRepository, IDetailRepository detailRepository, IStorageRepository storageRepository, ILogger logger) { - _masterRepository = masterRepository + _masterRepository = masterRepository ?? throw new ArgumentNullException(nameof(masterRepository)); _detailRepository = detailRepository ?? throw new ArgumentNullException(nameof(detailRepository)); diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs index 69a60ca..9ab859b 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs @@ -1,106 +1,106 @@ -using Microsoft.Extensions.Logging; -using ProjectRepairCompany.Entities; -using ProjectRepairCompany.Repositories; -using ProjectRepairCompany.Repositories.Implementations; -using System; -using System.Collections.Generic; -using System.Linq; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; +//using Microsoft.Extensions.Logging; +//using ProjectRepairCompany.Entities; +//using ProjectRepairCompany.Repositories; +//using ProjectRepairCompany.Repositories.Implementations; +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; -namespace ProjectRepairCompany.Reports; +//namespace ProjectRepairCompany.Reports; -internal class TableReport -{ - private readonly IStorageDetailRepository _storageDetailRepository; - private readonly IOrderRepository _orderRepository; - private readonly ILogger _logger; +//internal class TableReport +//{ +// private readonly IStorageDetailRepository _storageDetailRepository; +// private readonly IOrderRepository _orderRepository; +// private readonly ILogger _logger; - internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; +// internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; - public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) - { - _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); - _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } +// public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) +// { +// _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); +// _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); +// _logger = logger ?? throw new ArgumentNullException(nameof(logger)); +// } - public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) - { - try - { - new ExcelBuilder(filePath) - .AddHeader("Сводка по движению деталей", 1, 4) - .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) - .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) - .Build(); - return true; - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка при формировании документа"); - return false; - } - } +// public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) +// { +// try +// { +// new ExcelBuilder(filePath) +// .AddHeader("Сводка по движению деталей", 1, 4) +// .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) +// .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) +// .Build(); +// return true; +// } +// catch (Exception ex) +// { +// _logger.LogError(ex, "Ошибка при формировании документа"); +// return false; +// } +// } - private List GetData(int detailId, DateTime startDate, DateTime endDate) - { - // Получаем данные о пополнении склада - var storageData = _storageDetailRepository - .ReadStorageDetails() - .Where(x => x.SupplyDate >= startDate && x.SupplyDate <= endDate && x.DetailId == detailId) - .Select(x => new - { - x.DetailId, - Date = x.SupplyDate, // Дата поступления - CountIn = x.DetailCount, // Количество пришло - CountOut = (int?)null // Нет исходящих - }) - .OrderBy(x => x.Date); // Сортировка по дате поступления +// private List GetData(int detailId, DateTime startDate, DateTime endDate) +// { +// // Получаем данные о пополнении склада +// var storageData = _storageDetailRepository +// .ReadStorageDetails() +// .Where(x => x.SupplyDate >= startDate && x.SupplyDate <= endDate && x.DetailId == detailId) +// .Select(x => new +// { +// x.DetailId, +// Date = x.SupplyDate, // Дата поступления +// CountIn = x.DetailCount, // Количество пришло +// CountOut = (int?)null // Нет исходящих +// }) +// .OrderBy(x => x.Date); // Сортировка по дате поступления - // Получаем данные о заказах - var orderData = _orderRepository - .ReadOrders() - .Where(x => x.DateIssue >= startDate && x.DateIssue <= endDate) - .SelectMany(x => x.OrderDetails) // Извлекаем все детали из заказов - .Where(orderDetail => orderDetail.DetailId == detailId) - .Select(orderDetail => new - { - DetailId = orderDetail.DetailId, - Date = orderDetail.Order.DateIssue, // Дата заказа - CountIn = (int?)null, // Нет поступлений - CountOut = orderDetail.DetailCount // Количество ушло - }) - .OrderBy(x => x.Date); // Сортировка по дате заказа +// // Получаем данные о заказах +// var orderData = _orderRepository +// .ReadOrders() +// .Where(x => x.DateIssue >= startDate && x.DateIssue <= endDate) +// .SelectMany(x => x.OrderDetails) // Извлекаем все детали из заказов +// .Where(orderDetail => orderDetail.DetailId == detailId) +// .Select(orderDetail => new +// { +// DetailId = orderDetail.DetailId, +// Date = orderDetail.Order.DateIssue, // Дата заказа +// CountIn = (int?)null, // Нет поступлений +// CountOut = orderDetail.DetailCount // Количество ушло +// }) +// .OrderBy(x => x.Date); // Сортировка по дате заказа - // Объединяем данные из двух источников - var combinedData = storageData - .Union(orderData) - .OrderBy(x => x.Date) // Сортируем все данные по дате - .ToList(); +// // Объединяем данные из двух источников +// var combinedData = storageData +// .Union(orderData) +// .OrderBy(x => x.Date) // Сортируем все данные по дате +// .ToList(); - // Формируем итоговую таблицу - var result = new List { item } - .Union(combinedData.Select(x => new string[] - { - x.DetailId.ToString(), // Деталь - x.Date.ToString("dd.MM.yyyy"), // Дата - x.CountIn?.ToString() ?? string.Empty, // Количество пришло - x.CountOut?.ToString() ?? string.Empty // Количество ушло - })) - .Union(new[] - { - new string[] - { - "Всего", - "", - combinedData.Sum(x => x.CountIn ?? 0).ToString(), // Суммируем все поступления - combinedData.Sum(x => x.CountOut ?? 0).ToString() // Суммируем все исходящие - } - }) - .ToList(); +// // Формируем итоговую таблицу +// var result = new List { item } +// .Union(combinedData.Select(x => new string[] +// { +// x.DetailId.ToString(), // Деталь +// x.Date.ToString("dd.MM.yyyy"), // Дата +// x.CountIn?.ToString() ?? string.Empty, // Количество пришло +// x.CountOut?.ToString() ?? string.Empty // Количество ушло +// })) +// .Union(new[] +// { +// new string[] +// { +// "Всего", +// "", +// combinedData.Sum(x => x.CountIn ?? 0).ToString(), // Суммируем все поступления +// combinedData.Sum(x => x.CountOut ?? 0).ToString() // Суммируем все исходящие +// } +// }) +// .ToList(); - return result; - } +// return result; +// } @@ -109,4 +109,4 @@ internal class TableReport -} +//} -- 2.25.1 From 014eab4a080f060bb819e0144cfa29e32380ec4b Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Thu, 19 Dec 2024 17:13:52 +0400 Subject: [PATCH 08/15] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=BE=D1=80=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs | 2 +- .../ProjectRepairCompany/Forms/FormOrders.Designer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs index aa14418..6ad3ed1 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.Designer.cs @@ -85,7 +85,7 @@ Controls.Add(checkBoxMasters); Name = "FormDirectoryReport"; StartPosition = FormStartPosition.CenterParent; - Text = "FormDirectoryReport"; + Text = "Отчет по справочникам"; ResumeLayout(false); PerformLayout(); } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs index 23dcdb5..51d0fda 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormOrders.Designer.cs @@ -94,7 +94,7 @@ Controls.Add(dataGridView); Controls.Add(panel1); Name = "FormOrders"; - Text = "FormOrders"; + Text = "Заказы"; Load += FormOrders_Load; panel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); -- 2.25.1 From a6f82f8bd238185515ef1677385a49d9066b1070 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Sun, 22 Dec 2024 18:43:09 +0400 Subject: [PATCH 09/15] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reports/TableReport.cs | 152 +++++++----------- .../Repositories/IOrderRepository.cs | 2 +- .../Implementations/OrderRepository.cs | 2 +- 3 files changed, 57 insertions(+), 99 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs index 9ab859b..573a9f0 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs @@ -1,106 +1,64 @@ -//using Microsoft.Extensions.Logging; -//using ProjectRepairCompany.Entities; -//using ProjectRepairCompany.Repositories; -//using ProjectRepairCompany.Repositories.Implementations; -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; +using Microsoft.Extensions.Logging; +using ProjectRepairCompany.Entities; +using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.Linq; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView; -//namespace ProjectRepairCompany.Reports; +namespace ProjectRepairCompany.Reports; -//internal class TableReport -//{ -// private readonly IStorageDetailRepository _storageDetailRepository; -// private readonly IOrderRepository _orderRepository; -// private readonly ILogger _logger; +internal class TableReport +{ + private readonly IStorageDetailRepository _storageDetailRepository; + private readonly IOrderRepository _orderRepository; + private readonly ILogger _logger; -// internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; + internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; -// public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) -// { -// _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); -// _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); -// _logger = logger ?? throw new ArgumentNullException(nameof(logger)); -// } + public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) + { + _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } -// public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) -// { -// try -// { -// new ExcelBuilder(filePath) -// .AddHeader("Сводка по движению деталей", 1, 4) -// .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) -// .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) -// .Build(); -// return true; -// } -// catch (Exception ex) -// { -// _logger.LogError(ex, "Ошибка при формировании документа"); -// return false; -// } -// } + public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) + { + try + { + new ExcelBuilder(filePath) + .AddHeader("Сводка по движению деталей", 1, 4) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) + .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } -// private List GetData(int detailId, DateTime startDate, DateTime endDate) -// { -// // Получаем данные о пополнении склада -// var storageData = _storageDetailRepository -// .ReadStorageDetails() -// .Where(x => x.SupplyDate >= startDate && x.SupplyDate <= endDate && x.DetailId == detailId) -// .Select(x => new -// { -// x.DetailId, -// Date = x.SupplyDate, // Дата поступления -// CountIn = x.DetailCount, // Количество пришло -// CountOut = (int?)null // Нет исходящих -// }) -// .OrderBy(x => x.Date); // Сортировка по дате поступления + private List GetData(int detailId, DateTime startDate, DateTime endDate) + { + // Получаем данные о пополнении склада + var data = _orderRepository + .ReadOrders() + .Where(x => x.OrderDate >= startDate && x.OrderDate <= endDate && x.OrderDetails.Any(y => y.DetailId == detailId)) + .Select(x => new + { + x.OrderDetail, + Date = x.SupplyDate, // Дата поступления + CountIn = x.DetailCount, // Количество пришло + CountOut = (int?)null // Нет исходящих + }) + .OrderBy(x => x.Date); // Сортировка по дате поступления -// // Получаем данные о заказах -// var orderData = _orderRepository -// .ReadOrders() -// .Where(x => x.DateIssue >= startDate && x.DateIssue <= endDate) -// .SelectMany(x => x.OrderDetails) // Извлекаем все детали из заказов -// .Where(orderDetail => orderDetail.DetailId == detailId) -// .Select(orderDetail => new -// { -// DetailId = orderDetail.DetailId, -// Date = orderDetail.Order.DateIssue, // Дата заказа -// CountIn = (int?)null, // Нет поступлений -// CountOut = orderDetail.DetailCount // Количество ушло -// }) -// .OrderBy(x => x.Date); // Сортировка по дате заказа - -// // Объединяем данные из двух источников -// var combinedData = storageData -// .Union(orderData) -// .OrderBy(x => x.Date) // Сортируем все данные по дате -// .ToList(); - -// // Формируем итоговую таблицу -// var result = new List { item } -// .Union(combinedData.Select(x => new string[] -// { -// x.DetailId.ToString(), // Деталь -// x.Date.ToString("dd.MM.yyyy"), // Дата -// x.CountIn?.ToString() ?? string.Empty, // Количество пришло -// x.CountOut?.ToString() ?? string.Empty // Количество ушло -// })) -// .Union(new[] -// { -// new string[] -// { -// "Всего", -// "", -// combinedData.Sum(x => x.CountIn ?? 0).ToString(), // Суммируем все поступления -// combinedData.Sum(x => x.CountOut ?? 0).ToString() // Суммируем все исходящие -// } -// }) -// .ToList(); - -// return result; -// } + + } @@ -109,4 +67,4 @@ -//} +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/IOrderRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/IOrderRepository.cs index 0a7e741..d19c8a4 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/IOrderRepository.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/IOrderRepository.cs @@ -9,7 +9,7 @@ namespace ProjectRepairCompany.Repositories; public interface IOrderRepository { - IEnumerable ReadOrders(); + IEnumerable ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, int? masterId = null); Order ReadOrderById(int id); void CreateOrder(Order order); void DeleteOrder(int id); diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs index 56d039b..65ec8ee 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs @@ -98,7 +98,7 @@ public class OrderRepository : IOrderRepository - public IEnumerable ReadOrders() + public IEnumerable ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, int? masterId = null) { _logger.LogInformation("Получение всех объектов"); try -- 2.25.1 From d18793daaf35f7a39e0f91ecf0434de3235e3306 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Sun, 22 Dec 2024 18:56:48 +0400 Subject: [PATCH 10/15] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=203=20=D0=BB=D0=B0=D0=B1=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/DetailMovement.cs | 21 +++++ .../IDetailMovementRepository .cs | 22 +++++ .../DetailMovementRepository.cs | 80 +++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs new file mode 100644 index 0000000..1bfee14 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Entities; + +public class DetailMovement +{ + public int Id { get; set; } + public int OrderId { get; set; } + public int DetailId { get; set; } + public int StorageId { get; set; } + public int Quantity { get; set; } + + + public Order Order { get; set; } + public Detail Detail { get; set; } + public Storage Storage { get; set; } +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs new file mode 100644 index 0000000..6df0815 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs @@ -0,0 +1,22 @@ +using ProjectRepairCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Repositories; + +public interface IDetailMovementRepository +{ + IEnumerable ReadOrderDetailMovements( + DateTime? dateFrom = null, + DateTime? dateTo = null, + int? storageId = null, + int? detailId = null, + int? orderId = null); + + void CreateOrderDetailMovement(DetailMovement DetailMovement); + + void DeleteOrderDetailMovement(int id); +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs new file mode 100644 index 0000000..3a409d6 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs @@ -0,0 +1,80 @@ +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectRepairCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Repositories.Implementations; + +public class DetailMovementRepository : IDetailMovementRepository +{ + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public DetailMovementRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + + public void CreateOrderDetailMovement(DetailMovement DetailMovement) + { + _logger.LogInformation("Добавление записи о движении детали."); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(DetailMovement)); + try + { + + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO OrderDetailMovement (OrderId, DetailId, StorageId, Quantity, MovementDate) + VALUES (@OrderId, @DetailId, @StorageId, @Quantity, @MovementDate) + "; + connection.Execute(queryInsert, DetailMovement); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка добавления записи о движении детали."); + throw; + } + } + + public void DeleteOrderDetailMovement(int id) + { + _logger.LogInformation("Удаление записи о движении детали."); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = "DELETE FROM OrderDetailMovement WHERE Id = @Id"; + connection.Execute(queryDelete, new { Id = id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении записи о движении детали."); + throw; + } + } + + public IEnumerable ReadOrderDetailMovements(DateTime? dateFrom = null, DateTime? dateTo = null, int? storageId = null, int? detailId = null, int? orderId = null) + { + _logger.LogInformation("Получение всех записей о движении деталей."); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM OrderDetailMovement"; + + var orderDetailMovements = connection.Query(querySelect).ToList(); + _logger.LogDebug("Полученные записи: {json}", JsonConvert.SerializeObject(orderDetailMovements)); + return orderDetailMovements; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении записей о движении деталей."); + throw; + } + } +} -- 2.25.1 From 5cf61026d515d0a25a05f9e4f26e740eaab05b4c Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 23 Dec 2024 00:30:21 +0400 Subject: [PATCH 11/15] =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B4=D1=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/DetailMovement.cs | 21 --- .../ProjectRepairCompany/Entities/Order.cs | 16 +- .../Entities/TempOrderDetail.cs | 20 +++ .../FormRepairCompany.Designer.cs | 35 ++-- .../ProjectRepairCompany/FormRepairCompany.cs | 12 ++ .../Forms/FormMasterReport.Designer.cs | 164 ++++++++++++++++++ .../Forms/FormMasterReport.cs | 84 +++++++++ .../Forms/FormMasterReport.resx | 120 +++++++++++++ .../Reports/ExcelBuilder.cs | 8 +- .../Reports/TableReport.cs | 72 +++++--- .../IDetailMovementRepository .cs | 22 --- .../DetailMovementRepository.cs | 80 --------- .../Implementations/OrderRepository.cs | 27 ++- 13 files changed, 513 insertions(+), 168 deletions(-) delete mode 100644 ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Entities/TempOrderDetail.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.Designer.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.resx delete mode 100644 ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs delete mode 100644 ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs deleted file mode 100644 index 1bfee14..0000000 --- a/ProjectRepairCompany/ProjectRepairCompany/Entities/DetailMovement.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectRepairCompany.Entities; - -public class DetailMovement -{ - public int Id { get; set; } - public int OrderId { get; set; } - public int DetailId { get; set; } - public int StorageId { get; set; } - public int Quantity { get; set; } - - - public Order Order { get; set; } - public Detail Detail { get; set; } - public Storage Storage { get; set; } -} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs index 221a475..f98e896 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Entities/Order.cs @@ -19,8 +19,6 @@ public class Order public static Order CreateOperation(int id, int fullPrice, int masterId, DateTime dateCompletion, DateTime dateIssue, IEnumerable orderDetails) { - - return new Order { Id = id, @@ -32,4 +30,18 @@ public class Order OrderDetails = orderDetails }; } + public static Order CreateOperation(TempOrderDetail tempOrderDetail, IEnumerable orderDetails) + { + return new Order + { + Id = tempOrderDetail.Id, + OrderDate = tempOrderDetail.OrderDate, + DateCompletion = tempOrderDetail.DateCompletion, + DateIssue = tempOrderDetail.DateIssue, + FullPrice = tempOrderDetail.FullPrice, + MasterId = tempOrderDetail.MasterId, + OrderDetails = orderDetails + }; + } + } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Entities/TempOrderDetail.cs b/ProjectRepairCompany/ProjectRepairCompany/Entities/TempOrderDetail.cs new file mode 100644 index 0000000..9854f9e --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Entities/TempOrderDetail.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Entities; + +public class TempOrderDetail +{ + public int Id { get; private set; } + public DateTime OrderDate { get; private set; } + public DateTime DateCompletion { get; private set; } + public DateTime DateIssue { get; private set; } + public int FullPrice { get; private set; } + public int MasterId { get; private set; } + public int DetailId { get; private set; } + public int DetailCount { get; private set; } + +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs index 6bf6a71..daf5419 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs @@ -38,6 +38,7 @@ StorageDetailToolStripMenuItem = new ToolStripMenuItem(); отчетыToolStripMenuItem = new ToolStripMenuItem(); DirectoryReportToolStripMenuItem = new ToolStripMenuItem(); + MasterReportToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -46,7 +47,7 @@ menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); menuStrip1.Location = new Point(0, 0); menuStrip1.Name = "menuStrip1"; - menuStrip1.Size = new Size(834, 25); + menuStrip1.Size = new Size(834, 24); menuStrip1.TabIndex = 0; menuStrip1.Text = "menuStrip"; // @@ -54,27 +55,27 @@ // справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { MasterToolStripMenuItem, DetailToolStripMenuItem, StorageToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(99, 21); + справочникиToolStripMenuItem.Size = new Size(94, 20); справочникиToolStripMenuItem.Text = "Справочники"; // // MasterToolStripMenuItem // MasterToolStripMenuItem.Name = "MasterToolStripMenuItem"; - MasterToolStripMenuItem.Size = new Size(138, 22); + MasterToolStripMenuItem.Size = new Size(133, 22); MasterToolStripMenuItem.Text = "Работники"; MasterToolStripMenuItem.Click += MasterToolStripMenuItem_Click; // // DetailToolStripMenuItem // DetailToolStripMenuItem.Name = "DetailToolStripMenuItem"; - DetailToolStripMenuItem.Size = new Size(138, 22); + DetailToolStripMenuItem.Size = new Size(133, 22); DetailToolStripMenuItem.Text = "Детали"; DetailToolStripMenuItem.Click += DetailToolStripMenuItem_Click; // // StorageToolStripMenuItem // StorageToolStripMenuItem.Name = "StorageToolStripMenuItem"; - StorageToolStripMenuItem.Size = new Size(138, 22); + StorageToolStripMenuItem.Size = new Size(133, 22); StorageToolStripMenuItem.Text = "Склады"; StorageToolStripMenuItem.Click += StorageToolStripMenuItem_Click; // @@ -82,44 +83,51 @@ // операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { OrderToolStripMenuItem, StorageDetailToolStripMenuItem }); операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; - операцииToolStripMenuItem.Size = new Size(80, 21); + операцииToolStripMenuItem.Size = new Size(75, 20); операцииToolStripMenuItem.Text = "Операции"; // // OrderToolStripMenuItem // OrderToolStripMenuItem.Name = "OrderToolStripMenuItem"; - OrderToolStripMenuItem.Size = new Size(194, 22); + OrderToolStripMenuItem.Size = new Size(184, 22); OrderToolStripMenuItem.Text = "Заказы"; OrderToolStripMenuItem.Click += OrderToolStripMenuItem_Click; // // StorageDetailToolStripMenuItem // StorageDetailToolStripMenuItem.Name = "StorageDetailToolStripMenuItem"; - StorageDetailToolStripMenuItem.Size = new Size(194, 22); + StorageDetailToolStripMenuItem.Size = new Size(184, 22); StorageDetailToolStripMenuItem.Text = "Пополнение склада"; StorageDetailToolStripMenuItem.Click += StorageDetailToolStripMenuItem_Click; // // отчетыToolStripMenuItem // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem }); + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, MasterReportToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(63, 21); + отчетыToolStripMenuItem.Size = new Size(60, 20); отчетыToolStripMenuItem.Text = "Отчеты"; // // DirectoryReportToolStripMenuItem // DirectoryReportToolStripMenuItem.Name = "DirectoryReportToolStripMenuItem"; - DirectoryReportToolStripMenuItem.Size = new Size(248, 22); + DirectoryReportToolStripMenuItem.Size = new Size(235, 22); DirectoryReportToolStripMenuItem.Text = "Документ со справочниками"; DirectoryReportToolStripMenuItem.Click += DirectoryReportToolStripMenuItem_Click; // + // MasterReportToolStripMenuItem + // + MasterReportToolStripMenuItem.Name = "MasterReportToolStripMenuItem"; + MasterReportToolStripMenuItem.Size = new Size(235, 22); + MasterReportToolStripMenuItem.Text = "Отчет по мастерам"; + MasterReportToolStripMenuItem.Click += MasterReportToolStripMenuItem_Click; + // // FormRepairCompany // - AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackgroundImage = Properties.Resources.Снимок_экрана_2024_09_02_200407; BackgroundImageLayout = ImageLayout.Stretch; - ClientSize = new Size(834, 461); + ClientSize = new Size(834, 407); Controls.Add(menuStrip1); DoubleBuffered = true; MainMenuStrip = menuStrip1; @@ -144,5 +152,6 @@ private ToolStripMenuItem StorageDetailToolStripMenuItem; private ToolStripMenuItem OrderToolStripMenuItem; private ToolStripMenuItem DirectoryReportToolStripMenuItem; + private ToolStripMenuItem MasterReportToolStripMenuItem; } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs index 85ae560..8597a14 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs @@ -84,5 +84,17 @@ namespace ProjectRepairCompany MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void MasterReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.Designer.cs new file mode 100644 index 0000000..729496d --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.Designer.cs @@ -0,0 +1,164 @@ +namespace ProjectRepairCompany.Forms +{ + partial class FormMasterReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + ButtonMakeReport = new Button(); + comboBoxMaster = new ComboBox(); + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); + dateTimePickerStart = new DateTimePicker(); + dateTimePickerEnd = new DateTimePicker(); + textBoxFilePath = new TextBox(); + label4 = new Label(); + ButtonFilePath = new Button(); + SuspendLayout(); + // + // ButtonMakeReport + // + ButtonMakeReport.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 204); + ButtonMakeReport.Location = new Point(95, 209); + ButtonMakeReport.Name = "ButtonMakeReport"; + ButtonMakeReport.Size = new Size(174, 42); + ButtonMakeReport.TabIndex = 0; + ButtonMakeReport.Text = "Сформировать"; + ButtonMakeReport.UseVisualStyleBackColor = true; + ButtonMakeReport.Click += ButtonMakeReport_Click; + // + // comboBoxMaster + // + comboBoxMaster.FormattingEnabled = true; + comboBoxMaster.Location = new Point(113, 80); + comboBoxMaster.Name = "comboBoxMaster"; + comboBoxMaster.Size = new Size(174, 23); + comboBoxMaster.TabIndex = 1; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 130); + label1.Name = "label1"; + label1.Size = new Size(77, 15); + label1.TabIndex = 2; + label1.Text = "Дата начала:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(12, 162); + label2.Name = "label2"; + label2.Size = new Size(71, 15); + label2.TabIndex = 3; + label2.Text = "Дата конца:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(12, 83); + label3.Name = "label3"; + label3.Size = new Size(95, 15); + label3.TabIndex = 4; + label3.Text = "Выбор мастера:"; + // + // dateTimePickerStart + // + dateTimePickerStart.Location = new Point(95, 124); + dateTimePickerStart.Name = "dateTimePickerStart"; + dateTimePickerStart.Size = new Size(174, 23); + dateTimePickerStart.TabIndex = 5; + // + // dateTimePickerEnd + // + dateTimePickerEnd.Location = new Point(95, 156); + dateTimePickerEnd.Name = "dateTimePickerEnd"; + dateTimePickerEnd.Size = new Size(174, 23); + dateTimePickerEnd.TabIndex = 6; + // + // textBoxFilePath + // + textBoxFilePath.Location = new Point(113, 21); + textBoxFilePath.Name = "textBoxFilePath"; + textBoxFilePath.Size = new Size(232, 23); + textBoxFilePath.TabIndex = 7; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(12, 29); + label4.Name = "label4"; + label4.Size = new Size(83, 15); + label4.TabIndex = 8; + label4.Text = "Путь к файлу:"; + // + // ButtonFilePath + // + ButtonFilePath.Location = new Point(351, 19); + ButtonFilePath.Name = "ButtonFilePath"; + ButtonFilePath.Size = new Size(31, 24); + ButtonFilePath.TabIndex = 9; + ButtonFilePath.Text = "..."; + ButtonFilePath.UseVisualStyleBackColor = true; + ButtonFilePath.Click += ButtonFilePath_Click; + // + // FormMasterReport + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(389, 328); + Controls.Add(ButtonFilePath); + Controls.Add(label4); + Controls.Add(textBoxFilePath); + Controls.Add(dateTimePickerEnd); + Controls.Add(dateTimePickerStart); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(comboBoxMaster); + Controls.Add(ButtonMakeReport); + Name = "FormMasterReport"; + StartPosition = FormStartPosition.CenterParent; + Text = "Отчет по мастерам"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button ButtonMakeReport; + private ComboBox comboBoxMaster; + private Label label1; + private Label label2; + private Label label3; + private DateTimePicker dateTimePickerStart; + private DateTimePicker dateTimePickerEnd; + private TextBox textBoxFilePath; + private Label label4; + private Button ButtonFilePath; + } +} \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.cs new file mode 100644 index 0000000..fed0461 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.cs @@ -0,0 +1,84 @@ +using ProjectRepairCompany.Reports; +using ProjectRepairCompany.Repositories; +using ProjectRepairCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectRepairCompany.Forms +{ + public partial class FormMasterReport : Form + { + private readonly IUnityContainer _container; + private readonly IMasterRepository _masterRepository; + public FormMasterReport(IUnityContainer container, IOrderRepository orderRepository, IMasterRepository masterRepository) + { + InitializeComponent(); + _container = container + ?? throw new ArgumentNullException(nameof(container)); + _masterRepository = masterRepository ?? + throw new ArgumentNullException(nameof(masterRepository)); + comboBoxMaster.DataSource = masterRepository.ReadMasters(); + comboBoxMaster.DisplayMember = "MasterName"; + comboBoxMaster.ValueMember = "Id"; + } + + private void ButtonMakeReport_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFilePath.Text)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if (comboBoxMaster.SelectedIndex < 0) + { + throw new Exception("Не выбран корм"); + } + if (dateTimePickerEnd.Value <= dateTimePickerStart.Value) + { + throw new Exception("Дата начала должна быть раньше даты окончания"); + } + var tableReport = _container.Resolve(); + var masterId = (int)comboBoxMaster.SelectedValue!; + var masterName = ((dynamic)comboBoxMaster.SelectedItem).MasterName; + + if (tableReport.CreateTable(textBoxFilePath.Text, masterId, masterName, dateTimePickerStart.Value, dateTimePickerEnd.Value)) + { + MessageBox.Show("Документ успешно сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonFilePath_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Excel Files | *.xlsx" + }; + if (sfd.ShowDialog() != DialogResult.OK) + { + return; + } + textBoxFilePath.Text = sfd.FileName; + + } + } +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.resx b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs index 1871afb..6209df3 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs @@ -35,7 +35,7 @@ internal class ExcelBuilder public ExcelBuilder AddHeader(string header, int startIndex, int count) { CreateCell(startIndex, _rowIndex, header, - StyleIndex.SimpleTextWithoutBorder); + StyleIndex.BoldTextWithoutBorder); for (int i = startIndex + 1; i < startIndex + count; ++i) { CreateCell(i, _rowIndex, "", @@ -82,7 +82,7 @@ internal class ExcelBuilder for (var j = 0; j < data.First().Length; ++j) { CreateCell(j, _rowIndex, data.First()[j], - StyleIndex.SimpleTextWithoutBorder); + StyleIndex.BoldTextWithBorder); } _rowIndex++; for (var i = 1; i < data.Count - 1; ++i) @@ -90,14 +90,14 @@ internal class ExcelBuilder for (var j = 0; j < data[i].Length; ++j) { CreateCell(j, _rowIndex, data[i][j], - StyleIndex.SimpleTextWithoutBorder); + StyleIndex.SimpleTextWithBorder); } _rowIndex++; } for (var j = 0; j < data.Last().Length; ++j) { CreateCell(j, _rowIndex, data.Last()[j], - StyleIndex.SimpleTextWithoutBorder); + StyleIndex.SimpleTextWithBorder); } _rowIndex++; return this; diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs index 573a9f0..2160452 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs @@ -11,28 +11,28 @@ namespace ProjectRepairCompany.Reports; internal class TableReport { - private readonly IStorageDetailRepository _storageDetailRepository; private readonly IOrderRepository _orderRepository; private readonly ILogger _logger; - internal static readonly string[] item = { "Деталь", "Дата", "Количество пришло", "Количество ушло" }; + internal static readonly string[] Headers = { "Мастер", "Номер заказа", "Дата вручения заказа", "Деталь", "Количество" }; - public TableReport(IStorageDetailRepository storageDetailRepository, IOrderRepository orderRepository, ILogger logger) + public TableReport(IOrderRepository orderRepository, ILogger logger) { - _storageDetailRepository = storageDetailRepository ?? throw new ArgumentNullException(nameof(storageDetailRepository)); _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - public bool CreateTable(string filePath, int detailId, DateTime startDate, DateTime endDate) + + public bool CreateTable(string filePath, int masterId, string masterName, DateTime startDate, DateTime endDate) { try { new ExcelBuilder(filePath) - .AddHeader("Сводка по движению деталей", 1, 4) - .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 1) - .AddTable(new[] { 20, 15, 15, 15 }, GetData(detailId, startDate, endDate)) + .AddHeader($"Сводка по заказам мастера {masterName}", 1, 5) + .AddParagraph($"за период: {startDate:dd.MM.yyyy} - {endDate:dd.MM.yyyy}", 0) + .AddTable(new[] { 20, 15, 15, 20, 15 }, GetData(masterId, masterName, startDate, endDate)) .Build(); + return true; } catch (Exception ex) @@ -42,22 +42,50 @@ internal class TableReport } } - private List GetData(int detailId, DateTime startDate, DateTime endDate) + private List GetData(int masterId, string masterName, DateTime startDate, DateTime endDate) { - // Получаем данные о пополнении склада - var data = _orderRepository - .ReadOrders() - .Where(x => x.OrderDate >= startDate && x.OrderDate <= endDate && x.OrderDetails.Any(y => y.DetailId == detailId)) - .Select(x => new - { - x.OrderDetail, - Date = x.SupplyDate, // Дата поступления - CountIn = x.DetailCount, // Количество пришло - CountOut = (int?)null // Нет исходящих - }) - .OrderBy(x => x.Date); // Сортировка по дате поступления + var orders = _orderRepository + .ReadOrders() + .Where(order => order.MasterId == masterId && order.DateIssue >= startDate && order.DateIssue <= endDate) + .ToList(); + + if (!orders.Any()) + return new List { Headers }; + var detailsData = orders + .SelectMany(order => order.OrderDetails, (order, detail) => new + { + MasterName = masterName, + OrderId = order.Id, + OrderDate = order.DateIssue, + DetailId = detail.DetailId, + CountDetail = detail.DetailCount + }) + .OrderBy(detail => detail.OrderDate) + .ToList(); + + var result = new List { Headers }; + + result.AddRange(detailsData.Select(detail => new string[] + { + detail.MasterName, + detail.OrderId.ToString(), + detail.OrderDate.ToString("dd.MM.yyyy"), + detail.DetailId.ToString(), + detail.CountDetail.ToString() + })); + + + result.Add(new string[] + { + "Итого", + "", + "", + "", + detailsData.Sum(d => d.CountDetail).ToString() + }); + + return result; - } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs deleted file mode 100644 index 6df0815..0000000 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/IDetailMovementRepository .cs +++ /dev/null @@ -1,22 +0,0 @@ -using ProjectRepairCompany.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectRepairCompany.Repositories; - -public interface IDetailMovementRepository -{ - IEnumerable ReadOrderDetailMovements( - DateTime? dateFrom = null, - DateTime? dateTo = null, - int? storageId = null, - int? detailId = null, - int? orderId = null); - - void CreateOrderDetailMovement(DetailMovement DetailMovement); - - void DeleteOrderDetailMovement(int id); -} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs deleted file mode 100644 index 3a409d6..0000000 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/DetailMovementRepository.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Dapper; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using Npgsql; -using ProjectRepairCompany.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectRepairCompany.Repositories.Implementations; - -public class DetailMovementRepository : IDetailMovementRepository -{ - private readonly IConnectionString _connectionString; - private readonly ILogger _logger; - - public DetailMovementRepository(IConnectionString connectionString, ILogger logger) - { - _connectionString = connectionString; - _logger = logger; - } - - public void CreateOrderDetailMovement(DetailMovement DetailMovement) - { - _logger.LogInformation("Добавление записи о движении детали."); - _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(DetailMovement)); - try - { - - using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var queryInsert = @" - INSERT INTO OrderDetailMovement (OrderId, DetailId, StorageId, Quantity, MovementDate) - VALUES (@OrderId, @DetailId, @StorageId, @Quantity, @MovementDate) - "; - connection.Execute(queryInsert, DetailMovement); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка добавления записи о движении детали."); - throw; - } - } - - public void DeleteOrderDetailMovement(int id) - { - _logger.LogInformation("Удаление записи о движении детали."); - try - { - using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var queryDelete = "DELETE FROM OrderDetailMovement WHERE Id = @Id"; - connection.Execute(queryDelete, new { Id = id }); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка при удалении записи о движении детали."); - throw; - } - } - - public IEnumerable ReadOrderDetailMovements(DateTime? dateFrom = null, DateTime? dateTo = null, int? storageId = null, int? detailId = null, int? orderId = null) - { - _logger.LogInformation("Получение всех записей о движении деталей."); - try - { - using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM OrderDetailMovement"; - - var orderDetailMovements = connection.Query(querySelect).ToList(); - _logger.LogDebug("Полученные записи: {json}", JsonConvert.SerializeObject(orderDetailMovements)); - return orderDetailMovements; - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка при чтении записей о движении деталей."); - throw; - } - } -} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs index 65ec8ee..fbe0cdd 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Repositories/Implementations/OrderRepository.cs @@ -93,7 +93,22 @@ public class OrderRepository : IOrderRepository public Order ReadOrderById(int id) { - return Order.CreateOperation(0, 0, 0, DateTime.MinValue, DateTime.MinValue, Enumerable.Empty()); + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + + var querySelect = @"SELECT * FROM ""Order"" WHERE Id = @id"; + var orders = connection.QueryFirst(querySelect, new {id}); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(orders)); + return orders; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении"); + throw; + } } @@ -106,10 +121,14 @@ public class OrderRepository : IOrderRepository using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); - var querySelect = @"SELECT * FROM ""Order"""; - var orders = connection.Query(querySelect); + var querySelect = @" +SELECT o.*, od.DetailId, od.DetailCount From ""Order"" o +LEFT JOIN OrderDetail od ON o.Id = od.OrderId"; + var orders = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(orders)); - return orders; + return orders.GroupBy(x => x.Id, y => y, + (key,value) => Order.CreateOperation(value.First(), + value.Select(z => OrderDetail.CreateOperation(0, z.DetailId, z.DetailCount)))).ToList(); } catch (Exception ex) { -- 2.25.1 From 4b27c70d85cbaf3d033be333e82c80dc8e3e3f8b Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 23 Dec 2024 01:22:50 +0400 Subject: [PATCH 12/15] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Reports/TableReport.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs index 2160452..39cc9cf 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/TableReport.cs @@ -14,7 +14,7 @@ internal class TableReport private readonly IOrderRepository _orderRepository; private readonly ILogger _logger; - internal static readonly string[] Headers = { "Мастер", "Номер заказа", "Дата вручения заказа", "Деталь", "Количество" }; + internal static readonly string[] Headers = { "Мастер", "Номер заказа", "Дата вручения заказа", "Детали и кол-во", "Итоговая стоимость" }; public TableReport(IOrderRepository orderRepository, ILogger logger) { @@ -52,13 +52,14 @@ internal class TableReport if (!orders.Any()) return new List { Headers }; var detailsData = orders - .SelectMany(order => order.OrderDetails, (order, detail) => new + .Select(order => new { MasterName = masterName, OrderId = order.Id, OrderDate = order.DateIssue, - DetailId = detail.DetailId, - CountDetail = detail.DetailCount + Details = string.Join(", ", order.OrderDetails.Select(d => $"ID: {d.DetailId} Кол-во: {d.DetailCount}")), + FullPrice = order.FullPrice + }) .OrderBy(detail => detail.OrderDate) .ToList(); @@ -70,8 +71,8 @@ internal class TableReport detail.MasterName, detail.OrderId.ToString(), detail.OrderDate.ToString("dd.MM.yyyy"), - detail.DetailId.ToString(), - detail.CountDetail.ToString() + detail.Details.ToString(), + detail.FullPrice.ToString() })); @@ -81,7 +82,7 @@ internal class TableReport "", "", "", - detailsData.Sum(d => d.CountDetail).ToString() + detailsData.Sum(d => d.FullPrice).ToString() }); return result; -- 2.25.1 From ac4f2bb913c67a29ec84e49e1b15a5409a2e15d2 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 23 Dec 2024 21:12:37 +0400 Subject: [PATCH 13/15] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=BA=20=D1=81=D0=B4=D0=B0=D1=87=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormRepairCompany.Designer.cs | 11 +- .../ProjectRepairCompany/FormRepairCompany.cs | 12 ++ .../FormMasterDistributionReport.Designer.cs | 111 ++++++++++++++++ .../Forms/FormMasterDistributionReport.cs | 66 ++++++++++ .../Forms/FormMasterDistributionReport.resx | 120 ++++++++++++++++++ .../ProjectRepairCompany.csproj | 2 + .../Reports/ChartReport.cs | 54 ++++++++ .../Reports/PdfBuilder.cs | 80 ++++++++++++ 8 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.Designer.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.resx create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/ChartReport.cs create mode 100644 ProjectRepairCompany/ProjectRepairCompany/Reports/PdfBuilder.cs diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs index daf5419..f90984e 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.Designer.cs @@ -39,6 +39,7 @@ отчетыToolStripMenuItem = new ToolStripMenuItem(); DirectoryReportToolStripMenuItem = new ToolStripMenuItem(); MasterReportToolStripMenuItem = new ToolStripMenuItem(); + MasterDistributionToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -102,7 +103,7 @@ // // отчетыToolStripMenuItem // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, MasterReportToolStripMenuItem }); + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, MasterReportToolStripMenuItem, MasterDistributionToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; отчетыToolStripMenuItem.Size = new Size(60, 20); отчетыToolStripMenuItem.Text = "Отчеты"; @@ -121,6 +122,13 @@ MasterReportToolStripMenuItem.Text = "Отчет по мастерам"; MasterReportToolStripMenuItem.Click += MasterReportToolStripMenuItem_Click; // + // MasterDistributionToolStripMenuItem + // + MasterDistributionToolStripMenuItem.Name = "MasterDistributionToolStripMenuItem"; + MasterDistributionToolStripMenuItem.Size = new Size(235, 22); + MasterDistributionToolStripMenuItem.Text = "Заказы мастера"; + MasterDistributionToolStripMenuItem.Click += MasterDistributionToolStripMenuItem_Click; + // // FormRepairCompany // AutoScaleDimensions = new SizeF(7F, 15F); @@ -153,5 +161,6 @@ private ToolStripMenuItem OrderToolStripMenuItem; private ToolStripMenuItem DirectoryReportToolStripMenuItem; private ToolStripMenuItem MasterReportToolStripMenuItem; + private ToolStripMenuItem MasterDistributionToolStripMenuItem; } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs index 8597a14..2f23ce4 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/FormRepairCompany.cs @@ -96,5 +96,17 @@ namespace ProjectRepairCompany MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void MasterDistributionToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.Designer.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.Designer.cs new file mode 100644 index 0000000..6344751 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.Designer.cs @@ -0,0 +1,111 @@ +namespace ProjectRepairCompany.Forms +{ + partial class FormMasterDistributionReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dateTimePickerDate = new DateTimePicker(); + label1 = new Label(); + ButtonFilePath = new Button(); + LabelFileName = new Label(); + ButtonCreate = new Button(); + SuspendLayout(); + // + // dateTimePickerDate + // + dateTimePickerDate.Location = new Point(89, 78); + dateTimePickerDate.Name = "dateTimePickerDate"; + dateTimePickerDate.Size = new Size(210, 23); + dateTimePickerDate.TabIndex = 0; + // + // label1 + // + label1.AutoSize = true; + label1.Font = new Font("Segoe UI", 9.75F, FontStyle.Regular, GraphicsUnit.Point, 204); + label1.Location = new Point(29, 82); + label1.Name = "label1"; + label1.Size = new Size(39, 17); + label1.TabIndex = 1; + label1.Text = "Дата:"; + // + // ButtonFilePath + // + ButtonFilePath.Location = new Point(43, 25); + ButtonFilePath.Name = "ButtonFilePath"; + ButtonFilePath.Size = new Size(78, 35); + ButtonFilePath.TabIndex = 2; + ButtonFilePath.Text = "Выбрать"; + ButtonFilePath.UseVisualStyleBackColor = true; + ButtonFilePath.Click += ButtonFilePath_Click; + // + // LabelFileName + // + LabelFileName.AutoSize = true; + LabelFileName.Font = new Font("Segoe UI", 14.25F, FontStyle.Regular, GraphicsUnit.Point, 204); + LabelFileName.Location = new Point(151, 27); + LabelFileName.Name = "LabelFileName"; + LabelFileName.Size = new Size(57, 25); + LabelFileName.TabIndex = 3; + LabelFileName.Text = "Файл"; + // + // ButtonCreate + // + ButtonCreate.Font = new Font("Segoe UI", 9.75F, FontStyle.Italic, GraphicsUnit.Point, 204); + ButtonCreate.Location = new Point(29, 117); + ButtonCreate.Name = "ButtonCreate"; + ButtonCreate.Size = new Size(275, 35); + ButtonCreate.TabIndex = 4; + ButtonCreate.Text = "Сформировать"; + ButtonCreate.UseVisualStyleBackColor = true; + ButtonCreate.Click += ButtonCreate_Click; + // + // FormMasterDistributionReport + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(541, 175); + Controls.Add(ButtonCreate); + Controls.Add(LabelFileName); + Controls.Add(ButtonFilePath); + Controls.Add(label1); + Controls.Add(dateTimePickerDate); + Name = "FormMasterDistributionReport"; + StartPosition = FormStartPosition.CenterParent; + Text = "Отчет заказов мастера"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DateTimePicker dateTimePickerDate; + private Label label1; + private Button ButtonFilePath; + private Label LabelFileName; + private Button ButtonCreate; + } +} \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.cs new file mode 100644 index 0000000..f4d75d8 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.cs @@ -0,0 +1,66 @@ +using ProjectRepairCompany.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectRepairCompany.Forms; + +public partial class FormMasterDistributionReport : Form +{ + private string _fileName = string.Empty; + private readonly IUnityContainer _container; + public FormMasterDistributionReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + + } + + private void ButtonFilePath_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Pdf Files | *.pdf" + }; + if (sfd.ShowDialog() == DialogResult.OK) + { + _fileName = sfd.FileName; + LabelFileName.Text = Path.GetFileName(_fileName); + } + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(_fileName)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if + (_container.Resolve().CreateChart(_fileName, dateTimePickerDate.Value)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.resx b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormMasterDistributionReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj index cd77ad5..a5d3b58 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj +++ b/ProjectRepairCompany/ProjectRepairCompany/ProjectRepairCompany.csproj @@ -16,6 +16,8 @@ + + diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/ChartReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/ChartReport.cs new file mode 100644 index 0000000..93c713d --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/ChartReport.cs @@ -0,0 +1,54 @@ +using Microsoft.Extensions.Logging; +using ProjectRepairCompany.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Reports; + +public class ChartReport +{ + private readonly IOrderRepository _orderRepository; + private readonly ILogger _logger; + public ChartReport(IOrderRepository orderRepository, + ILogger logger) + { + _orderRepository = orderRepository ?? + throw new + ArgumentNullException(nameof(orderRepository)); + _logger = logger ?? + throw new ArgumentNullException(nameof(logger)); + } + public bool CreateChart(string filePath, DateTime dateTime) + { + try + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + new PdfBuilder(filePath) + .AddHeader("Заказы мастера") + .AddPieChart("Выполненные заказы", GetData(dateTime)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + private List<(string Caption, double Value)> GetData(DateTime dateTime) + { + return _orderRepository + .ReadOrders() + .Where(x => x.DateIssue.Date == dateTime.Date) + .GroupBy(x => x.MasterId, (key, group) => new { + Id = key, + Count = group.Count() + }) + .Select(x => (x.Id.ToString(), (double)x.Count)) + .ToList(); + } + +} diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/PdfBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/PdfBuilder.cs new file mode 100644 index 0000000..df4a6ab --- /dev/null +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/PdfBuilder.cs @@ -0,0 +1,80 @@ +using MigraDoc.DocumentObjectModel; +using MigraDoc.DocumentObjectModel.Shapes.Charts; +using MigraDoc.Rendering; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectRepairCompany.Reports; + +public class PdfBuilder +{ + private readonly string _filePath; + private readonly Document _document; + public PdfBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _document = new Document(); + DefineStyles(); + } + public PdfBuilder AddHeader(string header) + { + _document.AddSection().AddParagraph(header, "NormalBold"); + return this; + } + public PdfBuilder AddPieChart(string title, List<(string Caption, double +Value)> data) + { + if (data == null || data.Count == 0) + { + return this; + } + var chart = new Chart(ChartType.Pie2D); + var series = chart.SeriesCollection.AddSeries(); + series.Add(data.Select(x => x.Value).ToArray()); + var xseries = chart.XValues.AddXSeries(); + xseries.Add(data.Select(x => x.Caption).ToArray()); + chart.DataLabel.Type = DataLabelType.Percent; + chart.DataLabel.Position = DataLabelPosition.OutsideEnd; + chart.Width = Unit.FromCentimeter(16); + chart.Height = Unit.FromCentimeter(12); + chart.TopArea.AddParagraph(title); + chart.XAxis.MajorTickMark = TickMarkType.Outside; + chart.YAxis.MajorTickMark = TickMarkType.Outside; + chart.YAxis.HasMajorGridlines = true; + chart.PlotArea.LineFormat.Width = 1; + chart.PlotArea.LineFormat.Visible = true; + chart.TopArea.AddLegend(); + _document.LastSection.Add(chart); + return this; + } + public void Build() + { + var renderer = new PdfDocumentRenderer(true) + { + Document = _document + }; + renderer.RenderDocument(); + renderer.PdfDocument.Save(_filePath); + } + private void DefineStyles() + { + var normalStyle = _document.Styles["Normal"]; + var headerStyle = _document.Styles.AddStyle("NormalBold", "Normal"); + headerStyle.Font.Bold = true; + headerStyle.Font.Size = 14; + headerStyle.ParagraphFormat.Alignment = ParagraphAlignment.Center; + } + + +} -- 2.25.1 From 587229b4acbbe6ea95178c0f8f10016f54a8bdc4 Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Mon, 23 Dec 2024 22:09:22 +0400 Subject: [PATCH 14/15] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=BA=20=D1=81=D0=B4=D0=B0=D1=87=D0=B5=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Forms/FormDirectoryReport.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs index 4486487..0e5d14d 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Forms/FormDirectoryReport.cs @@ -51,8 +51,6 @@ namespace ProjectRepairCompany.Forms { MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error); } - - } } -- 2.25.1 From 50f4f80a33d62757143748344d7a19c960a93b5f Mon Sep 17 00:00:00 2001 From: MorozovDanil Date: Tue, 24 Dec 2024 09:06:02 +0400 Subject: [PATCH 15/15] =?UTF-8?q?=D0=B6=D0=B8=D1=80=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRepairCompany/Reports/ExcelBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs index 6209df3..969f8eb 100644 --- a/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs +++ b/ProjectRepairCompany/ProjectRepairCompany/Reports/ExcelBuilder.cs @@ -97,7 +97,7 @@ internal class ExcelBuilder for (var j = 0; j < data.Last().Length; ++j) { CreateCell(j, _rowIndex, data.Last()[j], - StyleIndex.SimpleTextWithBorder); + StyleIndex.BoldTextWithBorder); } _rowIndex++; return this; -- 2.25.1