diff --git a/Academic_Performance/Academic_Performance/Entities/Mark.cs b/Academic_Performance/Academic_Performance/Entities/Mark.cs index f899c1d..3017338 100644 --- a/Academic_Performance/Academic_Performance/Entities/Mark.cs +++ b/Academic_Performance/Academic_Performance/Entities/Mark.cs @@ -11,21 +11,16 @@ namespace Academic_Performance.Entities { public int Id { get; private set; } public int StudentId { get; private set; } - /// public int TeachersId { get; private set; } - /// - ///public int SubjectId { get; private set; } - /// + public string Value { get; private set; } = string.Empty; public static Mark CreateElement(int id, - int studentId,///int teacherId, int subjectId, + int studentId, string value) { return new Mark { Id = id, StudentId = studentId, - /// TeachersId = teacherId, - /// SubjectId = subjectId, Value = value }; } diff --git a/Academic_Performance/Academic_Performance/Entities/Order.cs b/Academic_Performance/Academic_Performance/Entities/Order.cs index bfd27f4..ab4177c 100644 --- a/Academic_Performance/Academic_Performance/Entities/Order.cs +++ b/Academic_Performance/Academic_Performance/Entities/Order.cs @@ -1,6 +1,7 @@ using Academic_Performance.Entities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,9 +11,21 @@ namespace Academic_Performance.Entities public class Order { public int Id { get; private set; } + + + + [Browsable(false)] public int StudentId { get; private set; } + [DisplayName("Фио Студента")] + public string StudentName { get; private set; } = string.Empty; + + [DisplayName("Информация")] public string Information { get; private set; } = string.Empty; + + [DisplayName("Баллы")] public TypeS? TypeS { get; private set; } + + [DisplayName("Дата")] public DateTime Date { get; private set; } public static Order CreateEntity(int id, int studentId, string information,TypeS types) { diff --git a/Academic_Performance/Academic_Performance/Entities/Statement.cs b/Academic_Performance/Academic_Performance/Entities/Statement.cs index c0312ce..37aca39 100644 --- a/Academic_Performance/Academic_Performance/Entities/Statement.cs +++ b/Academic_Performance/Academic_Performance/Entities/Statement.cs @@ -1,6 +1,8 @@ using Academic_Performance.Entities.Enums; +using DocumentFormat.OpenXml.Bibliography; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Configuration; using System.Linq; using System.Text; @@ -9,13 +11,29 @@ using System.Threading.Tasks; namespace Academic_Performance.Entities { public class Statement - { public int Id { get; private set; } + { + public int Id { get; private set; } + + [Browsable(false)] public int SubjectId { get; private set; } + + [Browsable(false)] public int TeacherId{ get; private set; } + [DisplayName("Фио Преподавателя")] + public string TeacherName { get; private set; } = string.Empty; + + [DisplayName("Предмет")] + public string SubjectName{ get; private set; } = string.Empty; + + [DisplayName("Дата")] public DateTime Date { get; private set; } - public IEnumerable Mark{ get; private set; } = []; - public static Statement CreateOperation(int id, int subjectId, int teacherId, IEnumerable mark) + [DisplayName("Оценка")] + public string Mark => Marks != null ? string.Join(", ", Marks.Select(x => $"{x.Value}")) : string.Empty; + + [Browsable(false)] + public IEnumerable Marks{ get; private set; } = []; + public static Statement CreateOperation(int id, int subjectId, int teacherId, IEnumerable marks) { return new Statement { @@ -23,23 +41,25 @@ namespace Academic_Performance.Entities SubjectId = subjectId, TeacherId = teacherId, Date = DateTime.Now, - Mark = mark + Marks = marks }; - } - - public static Statement CreateOperation(TempMarks tempmarks, IEnumerable mark) + + } + public void SetMarks(IEnumerable marks) { - return new Statement + if (marks != null && marks.Any()) { - Id = tempmarks.Id, - SubjectId = tempmarks.SubjectId, - TeacherId = tempmarks.TeacherId, - Date = tempmarks.Date, - Mark = mark - }; + Marks = marks; + } } + - - } +} + + + + + + } diff --git a/Academic_Performance/Academic_Performance/Entities/Student.cs b/Academic_Performance/Academic_Performance/Entities/Student.cs index ee23084..1fe8f13 100644 --- a/Academic_Performance/Academic_Performance/Entities/Student.cs +++ b/Academic_Performance/Academic_Performance/Entities/Student.cs @@ -1,6 +1,7 @@ using Academic_Performance.Entities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,9 +11,14 @@ namespace Academic_Performance.Entities public class Student { public int Id{ get; private set; } + [DisplayName("Группа")] public Groupp Groupp { get; private set; } + [DisplayName("Фио")] public string Name { get; private set; } = string.Empty; + [DisplayName("Поток")] public string Flow { get; private set; } = string.Empty; + [DisplayName("Общая Справка")] + public string Name_Student => $"{Name} {Groupp}"; public static Student CreateEntity(int id, string name,string flow, Groupp groupp) { return new Student diff --git a/Academic_Performance/Academic_Performance/Entities/Subject.cs b/Academic_Performance/Academic_Performance/Entities/Subject.cs index 746d312..0bcfeef 100644 --- a/Academic_Performance/Academic_Performance/Entities/Subject.cs +++ b/Academic_Performance/Academic_Performance/Entities/Subject.cs @@ -1,6 +1,7 @@ using Microsoft.VisualBasic.Devices; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,6 +10,7 @@ namespace Academic_Performance.Entities; public class Subject { public int Id { get; private set; } + [DisplayName("Предмет")] public string Name { get; private set; } = string.Empty; public static Subject CreateEntity(int id, string name) { diff --git a/Academic_Performance/Academic_Performance/Entities/Teacher.cs b/Academic_Performance/Academic_Performance/Entities/Teacher.cs index 22cc227..5e2a8cc 100644 --- a/Academic_Performance/Academic_Performance/Entities/Teacher.cs +++ b/Academic_Performance/Academic_Performance/Entities/Teacher.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,6 +9,7 @@ namespace Academic_Performance.Entities; public class Teacher { public int Id { get; private set; } + [DisplayName("ФИО Преподаватель")] public string Name{ get; private set; } = string.Empty; public static Teacher CreateEntity(int id, string name) { diff --git a/Academic_Performance/Academic_Performance/Entities/TempMarks.cs b/Academic_Performance/Academic_Performance/Entities/TempMarks.cs deleted file mode 100644 index 0eaac0b..0000000 --- a/Academic_Performance/Academic_Performance/Entities/TempMarks.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Academic_Performance.Entities; - -public class TempMarks -{ - public int Id { get; private set; } - public int StudentId { get; private set; } - public int TeacherId { get; private set; } - public int SubjectId { get; private set; } - public DateTime Date { get; private set; } - public string Value { get; private set; } = string.Empty; -} diff --git a/Academic_Performance/Academic_Performance/Forms/FormMarks.cs b/Academic_Performance/Academic_Performance/Forms/FormMarks.cs index c7a4ecd..bb78a7c 100644 --- a/Academic_Performance/Academic_Performance/Forms/FormMarks.cs +++ b/Academic_Performance/Academic_Performance/Forms/FormMarks.cs @@ -72,8 +72,12 @@ namespace Academic_Performance.Forms MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => - dataGridView.DataSource = _statementRepository.ReadStatement(); + private void LoadList() + { + dataGridView.DataSource = _statementRepository.ReadStatement(); + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["Date"].DefaultCellStyle.Format = "dd.MM.yyyy"; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/Academic_Performance/Academic_Performance/Forms/FormOrders.cs b/Academic_Performance/Academic_Performance/Forms/FormOrders.cs index ed44e6c..17c7cb9 100644 --- a/Academic_Performance/Academic_Performance/Forms/FormOrders.cs +++ b/Academic_Performance/Academic_Performance/Forms/FormOrders.cs @@ -92,7 +92,11 @@ namespace Academic_Performance.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView.DataSource = _orderRepository.ReadOrder(); + private void LoadList() + { + dataGridView.DataSource = _orderRepository.ReadOrder(); + dataGridView.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/Academic_Performance/Academic_Performance/Forms/FormStudents.cs b/Academic_Performance/Academic_Performance/Forms/FormStudents.cs index ec97936..35512a7 100644 --- a/Academic_Performance/Academic_Performance/Forms/FormStudents.cs +++ b/Academic_Performance/Academic_Performance/Forms/FormStudents.cs @@ -36,7 +36,11 @@ namespace Academic_Performance.Forms MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView1.DataSource = _studentRepository.ReadStudent(); + private void LoadList() + { + dataGridView1.DataSource = _studentRepository.ReadStudent(); + dataGridView1.Columns["Id"].Visible = false; + } private void button2_Click(object sender, EventArgs e) { diff --git a/Academic_Performance/Academic_Performance/Forms/FormSubjects.cs b/Academic_Performance/Academic_Performance/Forms/FormSubjects.cs index 7ee30fa..4a62038 100644 --- a/Academic_Performance/Academic_Performance/Forms/FormSubjects.cs +++ b/Academic_Performance/Academic_Performance/Forms/FormSubjects.cs @@ -106,7 +106,11 @@ namespace Academic_Performance.Forms } - private void LoadList() => dataGridView1.DataSource = _subjectRepository.ReadSubject(); + private void LoadList() + { + dataGridView1.DataSource = _subjectRepository.ReadSubject(); + dataGridView1.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/Academic_Performance/Academic_Performance/Forms/FormTeachers.cs b/Academic_Performance/Academic_Performance/Forms/FormTeachers.cs index 86f1185..c826aae 100644 --- a/Academic_Performance/Academic_Performance/Forms/FormTeachers.cs +++ b/Academic_Performance/Academic_Performance/Forms/FormTeachers.cs @@ -51,7 +51,11 @@ namespace Academic_Performance.Forms MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView1.DataSource = _teacherRepository.ReadTeachers(); + private void LoadList() + { + dataGridView1.DataSource = _teacherRepository.ReadTeachers(); + dataGridView1.Columns["Id"].Visible = false; + } private void button2_Click(object sender, EventArgs e) { if (!TryGetIdentifierFromSelectedRow(out var findId)) diff --git a/Academic_Performance/Academic_Performance/Reports/TableReport.cs b/Academic_Performance/Academic_Performance/Reports/TableReport.cs index d6a590b..3cae188 100644 --- a/Academic_Performance/Academic_Performance/Reports/TableReport.cs +++ b/Academic_Performance/Academic_Performance/Reports/TableReport.cs @@ -54,7 +54,7 @@ public class TableReport var marks = _statementRepository.ReadStatement() .Where(g => g.Date >= startDate && g.Date <= endDate) - .SelectMany(g => g.Mark.Where(m => m.StudentId == studentId).Select(m => new + .SelectMany(g => g.Marks.Where(m => m.StudentId == studentId).Select(m => new { Date = g.Date, Subject = subjects.TryGetValue(g.SubjectId, out var subject) ? subject : "Неизвестный предмет", diff --git a/Academic_Performance/Academic_Performance/Repositories/IOrderRepository.cs b/Academic_Performance/Academic_Performance/Repositories/IOrderRepository.cs index 05432bc..9ef3f97 100644 --- a/Academic_Performance/Academic_Performance/Repositories/IOrderRepository.cs +++ b/Academic_Performance/Academic_Performance/Repositories/IOrderRepository.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace Academic_Performance.Repositories { public interface IOrderRepository - { IEnumerable ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null); + { IEnumerable ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? studentId = null); Order GetOrderById(int id); void AddOrder(Order order); void UpdateOrder(Order order); diff --git a/Academic_Performance/Academic_Performance/Repositories/IStatementRepository.cs b/Academic_Performance/Academic_Performance/Repositories/IStatementRepository.cs index e098756..420bed4 100644 --- a/Academic_Performance/Academic_Performance/Repositories/IStatementRepository.cs +++ b/Academic_Performance/Academic_Performance/Repositories/IStatementRepository.cs @@ -9,7 +9,7 @@ namespace Academic_Performance.Repositories { public interface IStatementRepository { - IEnumerable ReadStatement(DateTime? dateFrom = null, DateTime? dateTo = null); + IEnumerable ReadStatement(DateTime? dateFrom = null, DateTime? dateTo = null, int? teacherId = null, int? subjectId = null); void CreateStatement(Statement statement); void DeleteStatement(int id); } diff --git a/Academic_Performance/Academic_Performance/Repositories/Implementations/OrderRepository.cs b/Academic_Performance/Academic_Performance/Repositories/Implementations/OrderRepository.cs index 7d09d2e..c2a8cdf 100644 --- a/Academic_Performance/Academic_Performance/Repositories/Implementations/OrderRepository.cs +++ b/Academic_Performance/Academic_Performance/Repositories/Implementations/OrderRepository.cs @@ -104,23 +104,42 @@ namespace Academic_Performance.Repositories.Implementations throw; } } - IEnumerable IOrderRepository.ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null) + IEnumerable IOrderRepository.ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? studentId = null) { + _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateForm.HasValue) + { + builder.AddCondition("rt.Date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("rt.Date <= @dateTo"); + } + if (studentId.HasValue) + { + builder.AddCondition("rt.StudentId = @studentId"); + } + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM Orderrr"; - var order = connection.Query(querySelect); + var querySelect = @"SELECT rt.*, tr.Name as StudentName + FROM Orderrr rt + INNER JOIN Studentt tr ON rt.studentId = tr.id"; + var routes = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", - JsonConvert.SerializeObject(order)); - return order; + JsonConvert.SerializeObject(routes)); + return routes; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } + + } } } diff --git a/Academic_Performance/Academic_Performance/Repositories/Implementations/QueryBuilder.cs b/Academic_Performance/Academic_Performance/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..6f978c7 --- /dev/null +++ b/Academic_Performance/Academic_Performance/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Academic_Performance.Repositories.Implementations; + +public class QueryBuilder +{ + private readonly StringBuilder _builder; + public QueryBuilder() + { + _builder = new(); + } + public QueryBuilder AddCondition(string condition) + { + if (_builder.Length > 0) + { + _builder.Append(" AND "); + } + _builder.Append(condition); + return this; + } + public string Build() + { + if (_builder.Length == 0) + { + return string.Empty; + } + return $"WHERE {_builder}"; + } +} diff --git a/Academic_Performance/Academic_Performance/Repositories/Implementations/StatementRepository.cs b/Academic_Performance/Academic_Performance/Repositories/Implementations/StatementRepository.cs index ab43410..74036eb 100644 --- a/Academic_Performance/Academic_Performance/Repositories/Implementations/StatementRepository.cs +++ b/Academic_Performance/Academic_Performance/Repositories/Implementations/StatementRepository.cs @@ -36,7 +36,7 @@ namespace Academic_Performance.Repositories.Implementations var statementId = connection.QueryFirst(queryInsert, statement, transaction); var querySubInsert = @"INSERT INTO Markkk(Value,StudentId) VALUES (@Value,@StudentId)"; - foreach (var elem in statement.Mark) + foreach (var elem in statement.Marks) { connection.Execute(querySubInsert, new { @@ -92,20 +92,62 @@ namespace Academic_Performance.Repositories.Implementations } } - public IEnumerable ReadStatement(DateTime? dateFrom = null, DateTime? dateTo = null) + public IEnumerable ReadStatement(DateTime? dateFrom = null, DateTime? dateTo = null, int? teacherId = null, int? subjectId = null) { - _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("con.Date >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("con.Date <= @dateTo"); + } + if (teacherId.HasValue) + { + builder.AddCondition("con.TeacherId = @teacherId"); + } + if (subjectId.HasValue) + { + builder.AddCondition("con.SubjectId = @subjectId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT inv.*, ipr.StudentId, ipr.Value FROM Statement11 inv - INNER JOIN Markkk ipr ON ipr.Id = inv.Id"; - var statement = connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(statement)); - return statement.GroupBy(x => x.Id, y => y, - (key, value) => Statement.CreateOperation(value.First(), - value.Select(z => Mark.CreateElement(0, z.StudentId, z.Value)))).ToList(); + + var querySelect = @$"SELECT con.*, cl.Name as TeacherName, s.Name as SubjectName, + ct.StudentId, ct.Value + FROM Statement11 con + INNER JOIN Markkk ct ON ct.Id = con.Id + INNER JOIN Teacher cl ON con.teacherId = cl.Id + INNER JOIN Subject s ON con.SubjectId = s.Id + + {builder.Build()}"; + + var contractDict = new Dictionary>(); + + var contracts = connection.Query(querySelect, + (statement, mark) => + { + if (!contractDict.TryGetValue(statement.Id, out var tr)) + { + tr = []; + contractDict.Add(statement.Id, tr); + } + + + tr.Add(mark); + return statement; + }, splitOn: "StudentId", param: new { dateFrom, dateTo, teacherId,subjectId }); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); + + return contractDict.Select(x => + { + var tr = contracts.First(y => y.Id == x.Key); + tr.SetMarks(x.Value); + return tr; + }).ToArray(); } catch (Exception ex) { @@ -114,20 +156,9 @@ namespace Academic_Performance.Repositories.Implementations } - /// _logger.LogInformation("Получение всех объектов"); - /// try - /// { - /// using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - //// var statements = connection.Query(querySelect); - //// _logger.LogDebug("Полученные объекты: {json}", - /// JsonConvert.SerializeObject(statements)); - /// return statements; - /// } - /// catch (Exception ex) - /// { - /// _logger.LogError(ex, "Ошибка при чтении объектов"); - /// throw; - /// } + + + } } } \ No newline at end of file