diff --git a/StudentProgressRecord/Forms/FormStatementDistributionReport.Designer.cs b/StudentProgressRecord/Forms/FormStatementDistributionReport.Designer.cs
new file mode 100644
index 0000000..a43573f
--- /dev/null
+++ b/StudentProgressRecord/Forms/FormStatementDistributionReport.Designer.cs
@@ -0,0 +1,130 @@
+namespace StudentProgressRecord.Forms
+{
+ partial class FormStatementDistributionReport
+ {
+ ///
+ /// 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()
+ {
+ buttonFile = new Button();
+ labelFile = new Label();
+ dateTimePickerStart = new DateTimePicker();
+ labelDateFrom = new Label();
+ buttonApply = new Button();
+ labelDateTo = new Label();
+ dateTimePickerEnd = new DateTimePicker();
+ SuspendLayout();
+ //
+ // buttonFile
+ //
+ buttonFile.Location = new Point(133, 12);
+ buttonFile.Name = "buttonFile";
+ buttonFile.Size = new Size(94, 29);
+ buttonFile.TabIndex = 0;
+ buttonFile.Text = "Выбрать";
+ buttonFile.UseVisualStyleBackColor = true;
+ buttonFile.Click += buttonFile_Click;
+ //
+ // labelFile
+ //
+ labelFile.AutoSize = true;
+ labelFile.Location = new Point(12, 18);
+ labelFile.Name = "labelFile";
+ labelFile.Size = new Size(45, 20);
+ labelFile.TabIndex = 1;
+ labelFile.Text = "Файл";
+ //
+ // dateTimePickerStart
+ //
+ dateTimePickerStart.Location = new Point(78, 57);
+ dateTimePickerStart.Name = "dateTimePickerStart";
+ dateTimePickerStart.Size = new Size(161, 27);
+ dateTimePickerStart.TabIndex = 2;
+ //
+ // labelDateFrom
+ //
+ labelDateFrom.AutoSize = true;
+ labelDateFrom.Location = new Point(12, 62);
+ labelDateFrom.Name = "labelDateFrom";
+ labelDateFrom.Size = new Size(60, 20);
+ labelDateFrom.TabIndex = 3;
+ labelDateFrom.Text = "Дата от";
+ //
+ // buttonApply
+ //
+ buttonApply.Location = new Point(12, 165);
+ buttonApply.Name = "buttonApply";
+ buttonApply.Size = new Size(215, 29);
+ buttonApply.TabIndex = 4;
+ buttonApply.Text = "Сформировать";
+ buttonApply.UseVisualStyleBackColor = true;
+ buttonApply.Click += buttonApply_Click;
+ //
+ // labelDateTo
+ //
+ labelDateTo.AutoSize = true;
+ labelDateTo.Location = new Point(12, 95);
+ labelDateTo.Name = "labelDateTo";
+ labelDateTo.Size = new Size(62, 20);
+ labelDateTo.TabIndex = 6;
+ labelDateTo.Text = "Дата до";
+ //
+ // dateTimePickerEnd
+ //
+ dateTimePickerEnd.Location = new Point(78, 90);
+ dateTimePickerEnd.Name = "dateTimePickerEnd";
+ dateTimePickerEnd.Size = new Size(161, 27);
+ dateTimePickerEnd.TabIndex = 5;
+ //
+ // FormStatementDistributionReport
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(294, 206);
+ Controls.Add(labelDateTo);
+ Controls.Add(dateTimePickerEnd);
+ Controls.Add(buttonApply);
+ Controls.Add(labelDateFrom);
+ Controls.Add(dateTimePickerStart);
+ Controls.Add(labelFile);
+ Controls.Add(buttonFile);
+ Name = "FormStatementDistributionReport";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "FormStatementDistributionReport";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Button buttonFile;
+ private Label labelFile;
+ private DateTimePicker dateTimePickerStart;
+ private Label labelDateFrom;
+ private Button buttonApply;
+ private Label labelDateTo;
+ private DateTimePicker dateTimePickerEnd;
+ }
+}
\ No newline at end of file
diff --git a/StudentProgressRecord/Forms/FormStatementDistributionReport.cs b/StudentProgressRecord/Forms/FormStatementDistributionReport.cs
new file mode 100644
index 0000000..1bb663a
--- /dev/null
+++ b/StudentProgressRecord/Forms/FormStatementDistributionReport.cs
@@ -0,0 +1,74 @@
+using StudentProgressRecord.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 StudentProgressRecord.Forms
+{
+ public partial class FormStatementDistributionReport : Form
+ {
+ private string _fileName = string.Empty;
+ private readonly IUnityContainer _container;
+ public FormStatementDistributionReport(IUnityContainer container)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ }
+
+ private void buttonFile_Click(object sender, EventArgs e)
+ {
+ var sfd = new SaveFileDialog()
+ {
+ Filter = "Pdf Files | *.pdf"
+ };
+ if (sfd.ShowDialog() == DialogResult.OK)
+ {
+ _fileName = sfd.FileName;
+ labelFile.Text = Path.GetFileName(_fileName);
+ }
+ }
+
+ private void buttonApply_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(_fileName))
+ {
+ throw new Exception("Отсутствует имя файла для отчета");
+ }
+ if (dateTimePickerEnd.Value <=
+ dateTimePickerStart.Value)
+ {
+ throw new Exception("Дата начала должна быть раньше даты окончания");
+ }
+ if
+ (_container.Resolve().CreateChart(_fileName, 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);
+ }
+ }
+ }
+}
diff --git a/StudentProgressRecord/Forms/FormStatementDistributionReport.resx b/StudentProgressRecord/Forms/FormStatementDistributionReport.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/StudentProgressRecord/Forms/FormStatementDistributionReport.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/StudentProgressRecord/Forms/FormsEntity/FormUniversity.Designer.cs b/StudentProgressRecord/Forms/FormsEntity/FormUniversity.Designer.cs
index 9301ab4..49aa6ad 100644
--- a/StudentProgressRecord/Forms/FormsEntity/FormUniversity.Designer.cs
+++ b/StudentProgressRecord/Forms/FormsEntity/FormUniversity.Designer.cs
@@ -40,6 +40,7 @@
ReportToolStripMenuItem = new ToolStripMenuItem();
ToolStripMenuItemDirectory = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
+ анализToolStripMenuItem = new ToolStripMenuItem();
menuStrip1.SuspendLayout();
SuspendLayout();
//
@@ -104,7 +105,7 @@
//
// ReportToolStripMenuItem
//
- ReportToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ToolStripMenuItemDirectory, операцииToolStripMenuItem });
+ ReportToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ToolStripMenuItemDirectory, операцииToolStripMenuItem, анализToolStripMenuItem });
ReportToolStripMenuItem.Name = "ReportToolStripMenuItem";
ReportToolStripMenuItem.Size = new Size(73, 24);
ReportToolStripMenuItem.Text = "Отчеты";
@@ -112,17 +113,27 @@
// ToolStripMenuItemDirectory
//
ToolStripMenuItemDirectory.Name = "ToolStripMenuItemDirectory";
- ToolStripMenuItemDirectory.Size = new Size(224, 26);
+ ToolStripMenuItemDirectory.ShortcutKeys = Keys.Control | Keys.W;
+ ToolStripMenuItemDirectory.Size = new Size(233, 26);
ToolStripMenuItemDirectory.Text = "Справочник";
ToolStripMenuItemDirectory.Click += ToolStripMenuItemDirectory_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
- операцииToolStripMenuItem.Size = new Size(224, 26);
+ операцииToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.E;
+ операцииToolStripMenuItem.Size = new Size(233, 26);
операцииToolStripMenuItem.Text = "Операции";
операцииToolStripMenuItem.Click += операцииToolStripMenuItem_Click;
//
+ // анализToolStripMenuItem
+ //
+ анализToolStripMenuItem.Name = "анализToolStripMenuItem";
+ анализToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.P;
+ анализToolStripMenuItem.Size = new Size(233, 26);
+ анализToolStripMenuItem.Text = "Анализ";
+ анализToolStripMenuItem.Click += анализToolStripMenuItem_Click;
+ //
// FormUniversity
//
AutoScaleDimensions = new SizeF(8F, 20F);
@@ -152,5 +163,6 @@
private ToolStripMenuItem StatementToolStripMenuItem;
private ToolStripMenuItem ToolStripMenuItemDirectory;
private ToolStripMenuItem операцииToolStripMenuItem;
+ private ToolStripMenuItem анализToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/StudentProgressRecord/Forms/FormsEntity/FormUniversity.cs b/StudentProgressRecord/Forms/FormsEntity/FormUniversity.cs
index e6aef75..2285e00 100644
--- a/StudentProgressRecord/Forms/FormsEntity/FormUniversity.cs
+++ b/StudentProgressRecord/Forms/FormsEntity/FormUniversity.cs
@@ -113,5 +113,18 @@ namespace StudentProgressRecord
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
+
+ private void анализToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
}
}
diff --git a/StudentProgressRecord/Program.cs b/StudentProgressRecord/Program.cs
index c530bb9..05ab2e7 100644
--- a/StudentProgressRecord/Program.cs
+++ b/StudentProgressRecord/Program.cs
@@ -47,8 +47,6 @@ namespace StudentProgressRecord
container.RegisterType
(new TransientLifetimeManager());
- container.RegisterType();
-
return container;
}
diff --git a/StudentProgressRecord/Reports/ChartReport.cs b/StudentProgressRecord/Reports/ChartReport.cs
new file mode 100644
index 0000000..1ea7cca
--- /dev/null
+++ b/StudentProgressRecord/Reports/ChartReport.cs
@@ -0,0 +1,54 @@
+using Microsoft.Extensions.Logging;
+using StudentProgressRecord.Repositories;
+using StudentProgressRecord.RepositoryImp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StudentProgressRecord.Reports
+{
+ internal class ChartReport
+ {
+ private readonly IStatementRepository _statementRepository;
+ private readonly ILogger _logger;
+ public ChartReport(IStatementRepository statementRepository,
+ ILogger logger)
+ {
+ _statementRepository = statementRepository ?? throw new ArgumentNullException(nameof(statementRepository));
+ _logger = logger ??
+ throw new ArgumentNullException(nameof(logger));
+ }
+ public bool CreateChart(string filePath, DateTime dateTimeStart, DateTime dateTimeEnd)
+ {
+ try
+ {
+ new PdfBuilder(filePath)
+ .AddHeader("Оценки студентов")
+ .AddPieChart("Оценки", GetData(dateTimeStart, dateTimeEnd))
+ .Build();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при формировании документа");
+ return false;
+ }
+ }
+ private List<(string Caption, double Value)> GetData(DateTime dateTimeStart, DateTime dateTimeEnd)
+ {
+
+ return _statementRepository
+ .ReadStatements()
+ .Where(x => x.Date >= dateTimeStart && x.Date <= dateTimeEnd)
+ .SelectMany(x => x.Marks)
+ .GroupBy(x => x.Mark, (key, group) => new {
+ Id = key,
+ Count = group.Count()
+ })
+ .Select(x => (x.Id.ToString(), (double)x.Count))
+ .ToList();
+ }
+ }
+}
diff --git a/StudentProgressRecord/Reports/PdfBuilder.cs b/StudentProgressRecord/Reports/PdfBuilder.cs
index 4a948a4..18ddad4 100644
--- a/StudentProgressRecord/Reports/PdfBuilder.cs
+++ b/StudentProgressRecord/Reports/PdfBuilder.cs
@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace StudentProgressRecord.Reports
{
- internal class PdfBuilder
+ public class PdfBuilder
{
private readonly string _filePath;
private readonly Document _document;
diff --git a/StudentProgressRecord/Temp.txt b/StudentProgressRecord/Temp.txt
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/StudentProgressRecord/Temp.txt
@@ -0,0 +1 @@
+
\ No newline at end of file