diff --git a/ProjectWorkshop/ProjectWorkshop/Entities/AssemblerShift.cs b/ProjectWorkshop/ProjectWorkshop/Entities/AssemblerShift.cs index 6b4dcd3..917889c 100644 --- a/ProjectWorkshop/ProjectWorkshop/Entities/AssemblerShift.cs +++ b/ProjectWorkshop/ProjectWorkshop/Entities/AssemblerShift.cs @@ -12,7 +12,7 @@ public class AssemblerShift public DateTime AssemblerShiftDate { get; private set; } - public static AssemblerShift CreateOperation(int id, int workHours, int assemblerID, int shiftID_Shift) + public static AssemblerShift CreateOperation(int id, int workHours, int assemblerID, int shiftID_Shift, DateTime? shiftDate = null) { return new AssemblerShift { @@ -20,7 +20,7 @@ public class AssemblerShift WorkHours = workHours, AssemblerID_Assembler = assemblerID, ShiftID_Shift = shiftID_Shift, - AssemblerShiftDate = DateTime.Now + AssemblerShiftDate = shiftDate ?? DateTime.Now }; } } diff --git a/ProjectWorkshop/ProjectWorkshop/Entities/Assembly.cs b/ProjectWorkshop/ProjectWorkshop/Entities/Assembly.cs index cb66179..f634168 100644 --- a/ProjectWorkshop/ProjectWorkshop/Entities/Assembly.cs +++ b/ProjectWorkshop/ProjectWorkshop/Entities/Assembly.cs @@ -19,7 +19,7 @@ public class Assembly return new Assembly { ID = id, - Count = count, + Count = count, AssemblerID_Assembler = assemblerID, ProductAssembly = productAssembly, AssemblyDate = assemblyDate ?? DateTime.Now diff --git a/ProjectWorkshop/ProjectWorkshop/Entities/TempProductAssembly.cs b/ProjectWorkshop/ProjectWorkshop/Entities/TempProductAssembly.cs index 62b9990..50303a4 100644 --- a/ProjectWorkshop/ProjectWorkshop/Entities/TempProductAssembly.cs +++ b/ProjectWorkshop/ProjectWorkshop/Entities/TempProductAssembly.cs @@ -18,3 +18,4 @@ public class TempProductAssembly public DateTime AssemblyDate { get; private set; } } + \ No newline at end of file diff --git a/ProjectWorkshop/ProjectWorkshop/FormWorkshop.Designer.cs b/ProjectWorkshop/ProjectWorkshop/FormWorkshop.Designer.cs index 8bbf9da..8bf422a 100644 --- a/ProjectWorkshop/ProjectWorkshop/FormWorkshop.Designer.cs +++ b/ProjectWorkshop/ProjectWorkshop/FormWorkshop.Designer.cs @@ -39,6 +39,7 @@ отчетыToolStripMenuItem = new ToolStripMenuItem(); DirectoryReportToolStripMenuItem = new ToolStripMenuItem(); AssembliesReportToolStripMenuItem = new ToolStripMenuItem(); + AssemblyDestributionToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); SuspendLayout(); // @@ -48,7 +49,8 @@ menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(1354, 42); + menuStrip.Padding = new Padding(3, 1, 0, 1); + menuStrip.Size = new Size(729, 24); menuStrip.TabIndex = 0; menuStrip.Text = "menuStrip1"; // @@ -56,27 +58,27 @@ // справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { AssemblersToolStripMenuItem, ShiftsToolStripMenuItem, ProductsToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(184, 38); + справочникиToolStripMenuItem.Size = new Size(94, 22); справочникиToolStripMenuItem.Text = "Справочники"; // // AssemblersToolStripMenuItem // AssemblersToolStripMenuItem.Name = "AssemblersToolStripMenuItem"; - AssemblersToolStripMenuItem.Size = new Size(264, 44); + AssemblersToolStripMenuItem.Size = new Size(134, 22); AssemblersToolStripMenuItem.Text = "Сборщики"; AssemblersToolStripMenuItem.Click += AssemblersToolStripMenuItem_Click; // // ShiftsToolStripMenuItem // ShiftsToolStripMenuItem.Name = "ShiftsToolStripMenuItem"; - ShiftsToolStripMenuItem.Size = new Size(264, 44); + ShiftsToolStripMenuItem.Size = new Size(134, 22); ShiftsToolStripMenuItem.Text = "Смены"; ShiftsToolStripMenuItem.Click += ShiftsToolStripMenuItem_Click; // // ProductsToolStripMenuItem // ProductsToolStripMenuItem.Name = "ProductsToolStripMenuItem"; - ProductsToolStripMenuItem.Size = new Size(264, 44); + ProductsToolStripMenuItem.Size = new Size(134, 22); ProductsToolStripMenuItem.Text = "Изделия"; ProductsToolStripMenuItem.Click += ProductsToolStripMenuItem_Click_1; // @@ -84,35 +86,35 @@ // операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { AssemblyToolStripMenuItem, AssemblerShiftToolStripMenuItem }); операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; - операцииToolStripMenuItem.Size = new Size(147, 38); + операцииToolStripMenuItem.Size = new Size(75, 22); операцииToolStripMenuItem.Text = "Операции"; // // AssemblyToolStripMenuItem // AssemblyToolStripMenuItem.Name = "AssemblyToolStripMenuItem"; - AssemblyToolStripMenuItem.Size = new Size(330, 44); + AssemblyToolStripMenuItem.Size = new Size(165, 22); AssemblyToolStripMenuItem.Text = "Сборка"; AssemblyToolStripMenuItem.Click += AssemblyToolStripMenuItem_Click; // // AssemblerShiftToolStripMenuItem // AssemblerShiftToolStripMenuItem.Name = "AssemblerShiftToolStripMenuItem"; - AssemblerShiftToolStripMenuItem.Size = new Size(330, 44); + AssemblerShiftToolStripMenuItem.Size = new Size(165, 22); AssemblerShiftToolStripMenuItem.Text = "Выйти на смену "; AssemblerShiftToolStripMenuItem.Click += AssemblerShiftToolStripMenuItem_Click; // // отчетыToolStripMenuItem // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, AssembliesReportToolStripMenuItem }); + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { DirectoryReportToolStripMenuItem, AssembliesReportToolStripMenuItem, AssemblyDestributionToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(116, 38); + отчетыToolStripMenuItem.Size = new Size(60, 22); отчетыToolStripMenuItem.Text = "Отчеты"; // // DirectoryReportToolStripMenuItem // DirectoryReportToolStripMenuItem.Name = "DirectoryReportToolStripMenuItem"; DirectoryReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.W; - DirectoryReportToolStripMenuItem.Size = new Size(559, 44); + DirectoryReportToolStripMenuItem.Size = new Size(280, 22); DirectoryReportToolStripMenuItem.Text = "Документ со справочниками"; DirectoryReportToolStripMenuItem.Click += DirectoryReportToolStripMenuItem_Click; // @@ -120,19 +122,28 @@ // AssembliesReportToolStripMenuItem.Name = "AssembliesReportToolStripMenuItem"; AssembliesReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.E; - AssembliesReportToolStripMenuItem.Size = new Size(559, 44); + AssembliesReportToolStripMenuItem.Size = new Size(280, 22); AssembliesReportToolStripMenuItem.Text = "Отчет по сборкам"; AssembliesReportToolStripMenuItem.Click += AssembliesReportToolStripMenuItem_Click; // + // AssemblyDestributionToolStripMenuItem + // + AssemblyDestributionToolStripMenuItem.Name = "AssemblyDestributionToolStripMenuItem"; + AssemblyDestributionToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.P; + AssemblyDestributionToolStripMenuItem.Size = new Size(280, 22); + AssemblyDestributionToolStripMenuItem.Text = "Распределение сборок"; + AssemblyDestributionToolStripMenuItem.Click += AssemblyDestributionToolStripMenuItem_Click; + // // FormWorkshop // - AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackgroundImage = Properties.Resources.цех; BackgroundImageLayout = ImageLayout.Stretch; - ClientSize = new Size(1354, 785); + ClientSize = new Size(729, 368); Controls.Add(menuStrip); MainMenuStrip = menuStrip; + Margin = new Padding(2, 1, 2, 1); Name = "FormWorkshop"; StartPosition = FormStartPosition.CenterScreen; Text = "Цех"; @@ -155,5 +166,6 @@ private ToolStripMenuItem ProductsToolStripMenuItem; private ToolStripMenuItem DirectoryReportToolStripMenuItem; private ToolStripMenuItem AssembliesReportToolStripMenuItem; + private ToolStripMenuItem AssemblyDestributionToolStripMenuItem; } } diff --git a/ProjectWorkshop/ProjectWorkshop/FormWorkshop.cs b/ProjectWorkshop/ProjectWorkshop/FormWorkshop.cs index 7cf1233..c9c9f4f 100644 --- a/ProjectWorkshop/ProjectWorkshop/FormWorkshop.cs +++ b/ProjectWorkshop/ProjectWorkshop/FormWorkshop.cs @@ -90,7 +90,7 @@ namespace ProjectWorkshop { try { - _container.Resolve<FormAssembliesReport>().ShowDialog(); + _container.Resolve<FormAssemblersReport>().ShowDialog(); } catch (Exception ex) { @@ -98,5 +98,17 @@ namespace ProjectWorkshop } } + + private void AssemblyDestributionToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve<FormAssemblyDistributionReport>().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblerShift.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblerShift.cs index 02c30d3..10943c1 100644 --- a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblerShift.cs +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblerShift.cs @@ -43,10 +43,14 @@ namespace ProjectWorkshop.Forms throw new Exception("Имеются незаполненные поля"); } + var selectedShift = (dynamic)comboBoxShiftDate.SelectedItem; + DateTime shiftDate = selectedShift.ShiftDate; + var assemblerShift = AssemblerShift.CreateOperation(0, (int)numericUpDownWorkHours.Value, (int)comboBoxAssembler.SelectedValue!, - (int)comboBoxShiftDate.SelectedValue!); + (int)comboBoxShiftDate.SelectedValue!, + shiftDate); _assemblerShiftRepository.CreateAssemblerShift(assemblerShift); @@ -58,6 +62,7 @@ namespace ProjectWorkshop.Forms } } + private void ButtonCancel_Click(object sender, EventArgs e) { Close(); diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.Designer.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.Designer.cs similarity index 59% rename from ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.Designer.cs rename to ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.Designer.cs index f0b6bf4..8fd7381 100644 --- a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.Designer.cs +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.Designer.cs @@ -1,6 +1,6 @@ namespace ProjectWorkshop.Forms { - partial class FormAssembliesReport + partial class FormAssemblersReport { /// <summary> /// Required designer variable. @@ -36,56 +36,62 @@ buttonBuild = new Button(); dateTimePickerEnd = new DateTimePicker(); labelDateTo = new Label(); - labelAssembly = new Label(); - comboBoxAssembly = new ComboBox(); + labelAssembler = new Label(); + comboBoxAssembler = new ComboBox(); SuspendLayout(); // // labelFilePath // labelFilePath.AutoSize = true; - labelFilePath.Location = new Point(51, 48); + labelFilePath.Location = new Point(27, 22); + labelFilePath.Margin = new Padding(2, 0, 2, 0); labelFilePath.Name = "labelFilePath"; - labelFilePath.Size = new Size(178, 32); + labelFilePath.Size = new Size(90, 15); labelFilePath.TabIndex = 0; labelFilePath.Text = "Путь до файла:"; // // labelDateFrom // labelDateFrom.AutoSize = true; - labelDateFrom.Location = new Point(51, 200); + labelDateFrom.Location = new Point(27, 94); + labelDateFrom.Margin = new Padding(2, 0, 2, 0); labelDateFrom.Name = "labelDateFrom"; - labelDateFrom.Size = new Size(154, 32); + labelDateFrom.Size = new Size(77, 15); labelDateFrom.TabIndex = 1; labelDateFrom.Text = "Дата начала:"; // // dateTimePickerStart // - dateTimePickerStart.Location = new Point(255, 195); + dateTimePickerStart.Location = new Point(137, 91); + dateTimePickerStart.Margin = new Padding(2, 1, 2, 1); dateTimePickerStart.Name = "dateTimePickerStart"; - dateTimePickerStart.Size = new Size(400, 39); + dateTimePickerStart.Size = new Size(217, 23); dateTimePickerStart.TabIndex = 2; // // textBoxFilePath // - textBoxFilePath.Location = new Point(255, 48); + textBoxFilePath.Location = new Point(137, 22); + textBoxFilePath.Margin = new Padding(2, 1, 2, 1); textBoxFilePath.Name = "textBoxFilePath"; - textBoxFilePath.Size = new Size(400, 39); + textBoxFilePath.Size = new Size(217, 23); textBoxFilePath.TabIndex = 3; // // buttonSelectFilePath // - buttonSelectFilePath.Location = new Point(661, 48); + buttonSelectFilePath.Location = new Point(356, 22); + buttonSelectFilePath.Margin = new Padding(2, 1, 2, 1); buttonSelectFilePath.Name = "buttonSelectFilePath"; - buttonSelectFilePath.Size = new Size(43, 39); + buttonSelectFilePath.Size = new Size(23, 18); buttonSelectFilePath.TabIndex = 4; buttonSelectFilePath.UseVisualStyleBackColor = true; buttonSelectFilePath.Click += ButtonSelectFilePath_Click; // // buttonBuild // - buttonBuild.Location = new Point(255, 373); + buttonBuild.Location = new Point(137, 175); + buttonBuild.Margin = new Padding(2, 1, 2, 1); buttonBuild.Name = "buttonBuild"; - buttonBuild.Size = new Size(192, 54); + buttonBuild.Size = new Size(103, 25); buttonBuild.TabIndex = 5; buttonBuild.Text = "Сформировать"; buttonBuild.UseVisualStyleBackColor = true; @@ -93,44 +99,48 @@ // // dateTimePickerEnd // - dateTimePickerEnd.Location = new Point(255, 277); + dateTimePickerEnd.Location = new Point(137, 130); + dateTimePickerEnd.Margin = new Padding(2, 1, 2, 1); dateTimePickerEnd.Name = "dateTimePickerEnd"; - dateTimePickerEnd.Size = new Size(400, 39); + dateTimePickerEnd.Size = new Size(217, 23); dateTimePickerEnd.TabIndex = 7; // // labelDateTo // labelDateTo.AutoSize = true; - labelDateTo.Location = new Point(51, 282); + labelDateTo.Location = new Point(27, 132); + labelDateTo.Margin = new Padding(2, 0, 2, 0); labelDateTo.Name = "labelDateTo"; - labelDateTo.Size = new Size(143, 32); + labelDateTo.Size = new Size(71, 15); labelDateTo.TabIndex = 6; labelDateTo.Text = "Дата конца:"; // - // labelAssembly + // labelAssembler // - labelAssembly.AutoSize = true; - labelAssembly.Location = new Point(78, 129); - labelAssembly.Name = "labelAssembly"; - labelAssembly.Size = new Size(100, 32); - labelAssembly.TabIndex = 8; - labelAssembly.Text = "Сборка:"; + labelAssembler.AutoSize = true; + labelAssembler.Location = new Point(42, 60); + labelAssembler.Margin = new Padding(2, 0, 2, 0); + labelAssembler.Name = "labelAssembler"; + labelAssembler.Size = new Size(63, 15); + labelAssembler.TabIndex = 8; + labelAssembler.Text = "Сборщик:"; // - // comboBoxAssembly + // comboBoxAssembler // - comboBoxAssembly.FormattingEnabled = true; - comboBoxAssembly.Location = new Point(255, 126); - comboBoxAssembly.Name = "comboBoxAssembly"; - comboBoxAssembly.Size = new Size(400, 40); - comboBoxAssembly.TabIndex = 9; + comboBoxAssembler.FormattingEnabled = true; + comboBoxAssembler.Location = new Point(137, 59); + comboBoxAssembler.Margin = new Padding(2, 1, 2, 1); + comboBoxAssembler.Name = "comboBoxAssembler"; + comboBoxAssembler.Size = new Size(217, 23); + comboBoxAssembler.TabIndex = 9; // - // FormAssembliesReport + // FormAssemblersReport // - AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); - Controls.Add(comboBoxAssembly); - Controls.Add(labelAssembly); + ClientSize = new Size(431, 211); + Controls.Add(comboBoxAssembler); + Controls.Add(labelAssembler); Controls.Add(dateTimePickerEnd); Controls.Add(labelDateTo); Controls.Add(buttonBuild); @@ -139,8 +149,9 @@ Controls.Add(dateTimePickerStart); Controls.Add(labelDateFrom); Controls.Add(labelFilePath); - Name = "FormAssembliesReport"; - Text = "Отчет по сборкам"; + Margin = new Padding(2, 1, 2, 1); + Name = "FormAssemblersReport"; + Text = "Отчет по сборщикам"; ResumeLayout(false); PerformLayout(); } @@ -155,7 +166,7 @@ private Button buttonBuild; private DateTimePicker dateTimePickerEnd; private Label labelDateTo; - private Label labelAssembly; - private ComboBox comboBoxAssembly; + private Label labelAssembler; + private ComboBox comboBoxAssembler; } } \ No newline at end of file diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.cs similarity index 82% rename from ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.cs rename to ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.cs index 284f7db..ae893d0 100644 --- a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.cs +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.cs @@ -13,17 +13,17 @@ using Unity; namespace ProjectWorkshop.Forms { - public partial class FormAssembliesReport : Form + public partial class FormAssemblersReport : Form { private readonly IUnityContainer _container; - public FormAssembliesReport(IUnityContainer container, IAssemblyRepository assemblyRepository) + public FormAssemblersReport(IUnityContainer container, IAssemblerRepository assemblerRepository) { InitializeComponent(); _container = container ?? throw new ArgumentNullException(nameof(container)); - comboBoxAssembly.DataSource = assemblyRepository.ReadAssemblies(); - comboBoxAssembly.DisplayMember = "Name"; - comboBoxAssembly.ValueMember = "ID"; + comboBoxAssembler.DataSource = assemblerRepository.ReadAssemblers(); + comboBoxAssembler.DisplayMember = "Name"; + comboBoxAssembler.ValueMember = "ID"; } private void ButtonSelectFilePath_Click(object sender, EventArgs e) { @@ -52,12 +52,12 @@ namespace ProjectWorkshop.Forms { throw new Exception("Дата начала должна быть раньше даты окончания"); } - if (comboBoxAssembly.SelectedIndex < 0) + if (comboBoxAssembler.SelectedIndex < 0) { - throw new Exception("Не выбрана сборка"); + throw new Exception("Не выбран сборщик"); } - if (_container.Resolve<TableReport>().CreateTable(textBoxFilePath.Text, (int)comboBoxAssembly.SelectedValue!, + if (_container.Resolve<TableReport>().CreateTable(textBoxFilePath.Text, (int)comboBoxAssembler.SelectedValue!, dateTimePickerStart.Value, dateTimePickerEnd.Value)) { MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.resx b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.resx similarity index 100% rename from ProjectWorkshop/ProjectWorkshop/Forms/FormAssembliesReport.resx rename to ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblersReport.resx diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembly.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembly.cs index 2c8da3e..d0aecf4 100644 --- a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembly.cs +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssembly.cs @@ -51,7 +51,7 @@ namespace ProjectWorkshop.Forms } var totalCount = productAssemblies.Sum(pa => pa.Count); - var assemblyDate = dateTimePickerAssemblyDate.Value; // Получение выбранной даты + var assemblyDate = dateTimePickerAssemblyDate.Value; _assemblyRepository.CreateAssembly(Assembly.CreateOperation( id: 0, @@ -94,17 +94,7 @@ namespace ProjectWorkshop.Forms } - return list - .GroupBy( - x => x.ProductID_Product, - x => x.Count, - (id, counts) => ProductAssembly.CreateElement( - id: 0, - productID: id, - assemblyID: 0, - count: counts.Sum() - )) - .ToList(); + return list; } } } diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.Designer.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.Designer.cs new file mode 100644 index 0000000..d6a74bf --- /dev/null +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.Designer.cs @@ -0,0 +1,107 @@ +namespace ProjectWorkshop.Forms +{ + partial class FormAssemblyDistributionReport + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + buttonSelectFileName = new Button(); + labelFileName = new Label(); + labelDate = new Label(); + dateTimePickerDate = new DateTimePicker(); + buttonCreate = new Button(); + SuspendLayout(); + // + // buttonSelectFileName + // + buttonSelectFileName.Location = new Point(37, 29); + buttonSelectFileName.Name = "buttonSelectFileName"; + buttonSelectFileName.Size = new Size(75, 23); + buttonSelectFileName.TabIndex = 0; + buttonSelectFileName.Text = "Выбрать"; + buttonSelectFileName.UseVisualStyleBackColor = true; + buttonSelectFileName.Click += ButtonSelectFileName_Click; + // + // labelFileName + // + labelFileName.AutoSize = true; + labelFileName.Location = new Point(132, 33); + labelFileName.Name = "labelFileName"; + labelFileName.Size = new Size(36, 15); + labelFileName.TabIndex = 1; + labelFileName.Text = "Файл"; + // + // labelDate + // + labelDate.AutoSize = true; + labelDate.Location = new Point(37, 83); + labelDate.Name = "labelDate"; + labelDate.Size = new Size(35, 15); + labelDate.TabIndex = 2; + labelDate.Text = "Дата:"; + // + // dateTimePickerDate + // + dateTimePickerDate.Location = new Point(89, 77); + dateTimePickerDate.Name = "dateTimePickerDate"; + dateTimePickerDate.Size = new Size(200, 23); + dateTimePickerDate.TabIndex = 3; + // + // buttonCreate + // + buttonCreate.Location = new Point(105, 141); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(110, 23); + buttonCreate.TabIndex = 4; + buttonCreate.Text = "Сформировать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += ButtonCreate_Click; + // + // FormAssemblyDistributionReport + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(333, 193); + Controls.Add(buttonCreate); + Controls.Add(dateTimePickerDate); + Controls.Add(labelDate); + Controls.Add(labelFileName); + Controls.Add(buttonSelectFileName); + Name = "FormAssemblyDistributionReport"; + Text = "Распределение сборок"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonSelectFileName; + private Label labelFileName; + private Label labelDate; + private DateTimePicker dateTimePickerDate; + private Button buttonCreate; + } +} \ No newline at end of file diff --git a/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.cs b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.cs new file mode 100644 index 0000000..0882477 --- /dev/null +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.cs @@ -0,0 +1,71 @@ +using ProjectWorkshop.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 ProjectWorkshop.Forms +{ + public partial class FormAssemblyDistributionReport : Form + { + + private string _fileName = string.Empty; + private readonly IUnityContainer _container; + + public FormAssemblyDistributionReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void ButtonSelectFileName_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Pdf Files | *.pdf" + }; + if (sfd.ShowDialog() == DialogResult.OK) + { + _fileName = sfd.FileName; + labelFileName.Text = Path.GetFileName(_fileName); + } + } + + private void ButtonCreate_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(_fileName)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if + (_container.Resolve<ChartReport>().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/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.resx b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectWorkshop/ProjectWorkshop/Forms/FormAssemblyDistributionReport.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/ProjectWorkshop/ProjectWorkshop/ProjectWorkshop.csproj b/ProjectWorkshop/ProjectWorkshop/ProjectWorkshop.csproj index 6b717ad..d018469 100644 --- a/ProjectWorkshop/ProjectWorkshop/ProjectWorkshop.csproj +++ b/ProjectWorkshop/ProjectWorkshop/ProjectWorkshop.csproj @@ -16,6 +16,7 @@ <PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Npgsql" Version="9.0.2" /> + <PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" /> <PackageReference Include="Serilog" Version="4.2.0" /> <PackageReference Include="Serilog.Extensions.Logging" Version="9.0.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" /> diff --git a/ProjectWorkshop/ProjectWorkshop/Reports/ChartReport.cs b/ProjectWorkshop/ProjectWorkshop/Reports/ChartReport.cs new file mode 100644 index 0000000..fc1e7ca --- /dev/null +++ b/ProjectWorkshop/ProjectWorkshop/Reports/ChartReport.cs @@ -0,0 +1,68 @@ +using Microsoft.Extensions.Logging; +using ProjectWorkshop.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ProjectWorkshop.Reports +{ + internal class ChartReport + { + private readonly IAssemblyRepository _assemblyRepository; + private readonly IAssemblerRepository _assemblerRepository; + private readonly ILogger<ChartReport> _logger; + + public ChartReport(IAssemblyRepository assemblyRepository, IAssemblerRepository assemblerRepository, ILogger<ChartReport> logger) + { + _assemblyRepository = assemblyRepository ?? + throw new ArgumentNullException(nameof(assemblyRepository)); + _assemblerRepository = assemblerRepository ?? + throw new ArgumentNullException(nameof(assemblerRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateChart(string filePath, DateTime dateTime) + { + try + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + var data = GetData(dateTime); + + new PdfBuilder(filePath) + .AddHeader("Сборки изделий") + .AddPieChart("Количество сборок по сборщикам", data) + .Build(); + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + private List<(string Caption, double Value)> GetData(DateTime dateTime) + { + var assemblies = _assemblyRepository + .ReadAssemblies() + .Where(x => x.AssemblyDate.Date == dateTime.Date) + .GroupBy(x => x.AssemblerID_Assembler) + .Select(group => new + { + AssemblerId = group.Key, + AssemblyCount = group.Count() + }) + .ToList(); + + var assemblerNames = _assemblerRepository.ReadAssemblers() + .ToDictionary(a => a.ID, a => a.FullName); + + return assemblies + .Select(x => (assemblerNames.ContainsKey(x.AssemblerId) ? assemblerNames[x.AssemblerId] : $"Сборщик {x.AssemblerId}", (double)x.AssemblyCount)) + .ToList(); + } + } +} diff --git a/ProjectWorkshop/ProjectWorkshop/Reports/DocReport.cs b/ProjectWorkshop/ProjectWorkshop/Reports/DocReport.cs index 209192a..16c3659 100644 --- a/ProjectWorkshop/ProjectWorkshop/Reports/DocReport.cs +++ b/ProjectWorkshop/ProjectWorkshop/Reports/DocReport.cs @@ -15,7 +15,7 @@ internal class DocReport private readonly IShiftRepository _shiftRepository; private readonly ILogger<DocReport> _logger; - public DocReport(IAssemblerRepository assemblerRepository, IProductRepository productRepository,IShiftRepository shiftRepository ,ILogger<DocReport> logger) + public DocReport(IAssemblerRepository assemblerRepository, IProductRepository productRepository, IShiftRepository shiftRepository, ILogger<DocReport> logger) { _assemblerRepository = assemblerRepository ?? throw new ArgumentNullException(nameof(assemblerRepository)); _productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository)); @@ -55,12 +55,13 @@ internal class DocReport { return [ ["Название изделия", "Стоимость", "Дата сборки"], - .. _productRepository - .ReadProducts() - .Select(x => new string[] { x.ProductName, x.Price.ToString()}), - ]; + .. _productRepository + .ReadProducts() + .Select(x => new string[] { x.ProductName, x.Price.ToString(), x.ProductType.ToString()}), // Добавьте пустую строку для "Дата сборки" или заполните реальным значением + ]; } + private List<string[]> GetAssemblers() { return [ diff --git a/ProjectWorkshop/ProjectWorkshop/Reports/ExcelBuilder.cs b/ProjectWorkshop/ProjectWorkshop/Reports/ExcelBuilder.cs index 3c05ab2..61b2ead 100644 --- a/ProjectWorkshop/ProjectWorkshop/Reports/ExcelBuilder.cs +++ b/ProjectWorkshop/ProjectWorkshop/Reports/ExcelBuilder.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectWorkshop.Reports; +namespace ProjectLibrary.Reports; internal class ExcelBuilder { diff --git a/ProjectWorkshop/ProjectWorkshop/Reports/PdfBuilder.cs b/ProjectWorkshop/ProjectWorkshop/Reports/PdfBuilder.cs new file mode 100644 index 0000000..2fc920f --- /dev/null +++ b/ProjectWorkshop/ProjectWorkshop/Reports/PdfBuilder.cs @@ -0,0 +1,71 @@ +using MigraDoc.DocumentObjectModel; +using MigraDoc.DocumentObjectModel.Shapes.Charts; +using MigraDoc.Rendering; + +namespace ProjectWorkshop.Reports; + +internal 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 headerStyle = _document.Styles.AddStyle("NormalBold", "Normal"); + headerStyle.Font.Bold = true; + headerStyle.Font.Size = 14; + } +} diff --git a/ProjectWorkshop/ProjectWorkshop/Reports/TableReport.cs b/ProjectWorkshop/ProjectWorkshop/Reports/TableReport.cs index f62f7e0..a745a4a 100644 --- a/ProjectWorkshop/ProjectWorkshop/Reports/TableReport.cs +++ b/ProjectWorkshop/ProjectWorkshop/Reports/TableReport.cs @@ -1,99 +1,123 @@ using Microsoft.Extensions.Logging; +using ProjectLibrary.Reports; using ProjectWorkshop.Repositories; +using ProjectWorkshop.Repositories.Implementations; using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace ProjectWorkshop.Reports; - -internal class TableReport +namespace ProjectWorkshop.Reports { - private readonly IAssemblyRepository _assemblyRepository; - private readonly IAssemblerShiftRepository _assemblerShiftRepository; - private readonly ILogger<TableReport> _logger; - - internal static readonly string[] Headers = { "Дата", "Описание", "Количество сборок", "Количество часов смен" }; - - public TableReport(IAssemblyRepository assemblyRepository, - IAssemblerShiftRepository assemblerShiftRepository, - ILogger<TableReport> logger) + internal class TableReport { - _assemblyRepository = assemblyRepository ?? throw new ArgumentNullException(nameof(assemblyRepository)); - _assemblerShiftRepository = assemblerShiftRepository ?? throw new ArgumentNullException(nameof(assemblerShiftRepository)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } + private readonly IAssemblerRepository _assemblerRepository; + private readonly IAssemblerShiftRepository _assemblerShiftRepository; + private readonly IAssemblyRepository _assemblyRepository; + private readonly ILogger<TableReport> _logger; - public bool CreateTable(string filePath, int assemblerId, DateTime startDate, DateTime endDate) - { - try + internal static readonly string[] Headers = { "Сборщик", "Стаж", "Разряд", "Кол-во сборок", "Собрано изделий", "Смены" }; + + public TableReport(IAssemblerRepository assemblerRepository, + IAssemblerShiftRepository assemblerShiftRepository, + ILogger<TableReport> logger, + IAssemblyRepository assemblyRepository) { - var data = GetData(assemblerId, startDate, endDate); - - new ExcelBuilder(filePath) - .AddHeader("Сводка по сборкам", 0, Headers.Length) - .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) - .AddTable(new[] { 15, 40, 20, 20 }, data) - .Build(); - - return true; + _assemblerRepository = assemblerRepository ?? throw new ArgumentNullException(nameof(assemblerRepository)); + _assemblerShiftRepository = assemblerShiftRepository ?? throw new ArgumentNullException(nameof(assemblerShiftRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _assemblyRepository = assemblyRepository ?? throw new ArgumentNullException(nameof(assemblyRepository)); } - catch (Exception ex) + + public bool CreateTable(string filePath, int assemblerID, DateTime startDate, DateTime endDate) { - _logger.LogError(ex, "Ошибка при формировании документа"); - return false; + try + { + var data = GetData(assemblerID, startDate, endDate); + + new ExcelBuilder(filePath) + .AddHeader("Сводка по сборкам", 0, Headers.Length) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) + .AddTable(new[] { 25, 15, 15, 20, 20, 20 }, data) + .Build(); + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } } - } - private List<string[]> GetData(int assemblerId, DateTime startDate, DateTime endDate) + private List<string[]> GetData(int assemblerID, DateTime startDate, DateTime endDate) + { + var assembler = _assemblerRepository.ReadAssemblers().FirstOrDefault(a => a.ID == assemblerID); + if (assembler == null) + throw new Exception($"Сборщик с ID {assemblerID} не найден."); + + var shiftData = _assemblerShiftRepository + .ReadAssemblerShifts() + .Where(x => x.AssemblerShiftDate >= startDate && x.AssemblerShiftDate <= endDate && x.AssemblerID_Assembler == assemblerID) + .OrderBy(x => x.AssemblerShiftDate) + .ToList(); + + var result = new List<string[]> { - // Данные о сборках - var assemblyData = _assemblyRepository - .ReadAssemblies() - .Where(x => x.AssemblyDate >= startDate && x.AssemblyDate <= endDate && x.AssemblerID_Assembler == assemblerId) - .Select(x => new + Headers + }; + + int totalAssemblies = 0; + int totalProducts = 0; + + foreach (var shift in shiftData) { - Date = x.AssemblyDate, - Description = $"Сборка ID {x.ID}", - CountAssemblies = x.Count.ToString("N0"), - WorkHours = "-" - }); + var assemblyDataForDay = _assemblyRepository + .ReadAssemblies() + .Where(x => x.AssemblyDate.Date == shift.AssemblerShiftDate.Date && x.AssemblerID_Assembler == assemblerID) + .ToList(); - // Данные о сменах - var shiftData = _assemblerShiftRepository - .ReadAssemblerShifts() - .Where(x => x.AssemblerShiftDate >= startDate && x.AssemblerShiftDate <= endDate && x.AssemblerID_Assembler == assemblerId) - .Select(x => new + int totalAssembliesForDay = assemblyDataForDay.Count(); + int totalProductsForDay = assemblyDataForDay.Sum(x => x.Count); + + result.Add(new[] + { + assembler.FullName, + assembler.WorkExperience.ToString("F"), + assembler.AssemblerRank.ToString("G"), + totalAssembliesForDay.ToString("N0"), + totalProductsForDay.ToString("N0"), + shift.AssemblerShiftDate.ToString("dd.MM.yyyy") + }); + + totalAssemblies += totalAssembliesForDay; + totalProducts += totalProductsForDay; + } + + if (!shiftData.Any()) { - Date = x.AssemblerShiftDate, - Description = $"Смена ID {x.ShiftID_Shift}", - CountAssemblies = "-", - WorkHours = x.WorkHours.ToString("N0") - }); + result.Add(new[] + { + assembler.FullName, + assembler.WorkExperience.ToString("F"), + assembler.AssemblerRank.ToString("G"), + "0", + "0", + "Нет смен" + }); + } - // Объединение и сортировка - var combinedData = assemblyData - .Union(shiftData) - .OrderBy(x => x.Date); - - // Итоговые данные - var totalAssemblies = assemblyData.Sum(x => int.TryParse(x.CountAssemblies, out var count) ? count : 0); - var totalWorkHours = shiftData.Sum(x => int.TryParse(x.WorkHours, out var hours) ? hours : 0); - - // Формирование таблицы - return new List<string[]> { Headers } - .Union(combinedData.Select(x => new[] + result.Add(new[] { - x.Date.ToString("dd.MM.yyyy"), - x.Description, - x.CountAssemblies, - x.WorkHours - })) - .Union(new List<string[]> { new[] { "Всего", "", totalAssemblies.ToString("N0"), totalWorkHours.ToString("N0") } }) - .ToList(); + "ИТОГО", + "", + "", + totalAssemblies.ToString("N0"), + totalProducts.ToString("N0"), + "" + }); + + return result; + } + } } - - - diff --git a/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblerShiftRepository.cs b/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblerShiftRepository.cs index c53bab3..78667ea 100644 --- a/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblerShiftRepository.cs +++ b/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblerShiftRepository.cs @@ -28,8 +28,8 @@ public class AssemblerShiftRepository : IAssemblerShiftRepository { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var queryInsert = @" - INSERT INTO AssemblerShift (WorkHours, AssemblerID_Assembler, ShiftID_Shift) - VALUES (@WorkHours, @AssemblerID_Assembler, @ShiftID_Shift)"; + INSERT INTO AssemblerShift (WorkHours, AssemblerID_Assembler, ShiftID_Shift, AssemblerShiftDate) + VALUES (@WorkHours, @AssemblerID_Assembler, @ShiftID_Shift, @AssemblerShiftDate)"; connection.Execute(queryInsert, assemblerShift); } catch (Exception ex) diff --git a/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblyRepository.cs b/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblyRepository.cs index 5c751bd..4e1a799 100644 --- a/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblyRepository.cs +++ b/ProjectWorkshop/ProjectWorkshop/Repositories/Implementations/AssemblyRepository.cs @@ -32,7 +32,6 @@ public class AssemblyRepository : IAssemblyRepository connection.Open(); using var transaction = connection.BeginTransaction(); - // Добавляем дату сборки в запрос var queryInsert = @" INSERT INTO Assembly (Count, AssemblerID_Assembler, AssemblyDate) VALUES (@Count, @AssemblerID_Assembler, @AssemblyDate) @@ -41,7 +40,7 @@ public class AssemblyRepository : IAssemblyRepository { assembly.Count, assembly.AssemblerID_Assembler, - assembly.AssemblyDate // Передаём дату сборки + assembly.AssemblyDate }, transaction); var querySubInsert = @" @@ -93,16 +92,10 @@ public class AssemblyRepository : IAssemblyRepository try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" -SELECT fr.*, ffr.AssemblyID_Assembly, ffr.Count, a.AssemblyDate -FROM ProductAssembly fr -INNER JOIN ProductAssembly ffr ON ffr.AssemblyID_Assembly = fr.Id -INNER JOIN Assembly a ON fr.AssemblyID_Assembly = a.ID"; - var assemblies = connection.Query<TempProductAssembly>(querySelect); - _logger.LogDebug("Полученные объекты: {json}", - JsonConvert.SerializeObject(assemblies)); - return assemblies.GroupBy(x => x.ID, y => y, (key, value) => Assembly.CreateOperation(value.First(), value.Select( - z => ProductAssembly.CreateElement(0, z.ProductID_Product, z.AssemblyID_Assembly, z.Count)))).ToList(); + var selectQuery = @"SELECT * FROM Assembly"; + var assemblies = connection.Query<Assembly>(selectQuery); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(assemblies)); + return assemblies; } catch (Exception ex) { @@ -110,4 +103,5 @@ INNER JOIN Assembly a ON fr.AssemblyID_Assembly = a.ID"; throw; } } + }