From bbeae41de5330a7e1e4911f2c24fd9c03b0e8434 Mon Sep 17 00:00:00 2001 From: safia Date: Thu, 19 Dec 2024 11:27:27 +0400 Subject: [PATCH 1/2] =?UTF-8?q?70=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BB=D0=B0=D0=B1=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentProgress/Entities/Grades.cs | 35 ++++-- .../StudentProgress/Entities/Group.cs | 6 +- .../StudentProgress/Entities/Lectures.cs | 14 ++- .../StudentProgress/Entities/Professors.cs | 8 +- .../StudentProgress/Entities/Student.cs | 13 ++- .../StudentProgress/Entities/StudentGrades.cs | 1 + .../StudentProgress/Entities/Subjects.cs | 8 +- .../Entities/TempStudentGrades.cs | 18 --- .../StudentProgress/FormStudentProgress.cs | 37 ++++++- .../Forms/FormLecturesCount.cs | 94 +++++++--------- .../StudentProgress/Forms/FormStudent.cs | 104 +++++++++++++----- .../StudentProgress/Forms/FormStudents.cs | 9 +- .../StudentProgress/Reports/ChartReport.cs | 6 +- .../StudentProgress/Reports/ExcelBuilder.cs | 3 - .../StudentProgress/Reports/PdfBuilder.cs | 1 - .../StudentProgress/Reports/TableReport.cs | 6 +- .../StudentProgress/Reports/WordBuilder.cs | 3 - .../Implementations/GradesRepository.cs | 50 ++++++++- .../Implementations/LecturesRepository.cs | 3 +- .../Implementations/QueryBuilder.cs | 33 ++++++ .../Implementations/StudentRepository.cs | 3 +- 21 files changed, 313 insertions(+), 142 deletions(-) delete mode 100644 StudentProgress/StudentProgress/Entities/TempStudentGrades.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/QueryBuilder.cs diff --git a/StudentProgress/StudentProgress/Entities/Grades.cs b/StudentProgress/StudentProgress/Entities/Grades.cs index 7b89070..3938d73 100644 --- a/StudentProgress/StudentProgress/Entities/Grades.cs +++ b/StudentProgress/StudentProgress/Entities/Grades.cs @@ -1,11 +1,32 @@ -namespace StudentProgress.Entities; +using System.ComponentModel; + +namespace StudentProgress.Entities; public class Grades { public int Id { get; private set; } + + [Browsable(false)] public int SubjectsId { get; private set; } + + [Browsable(false)] public int ProfessorsId { get; private set; } + + [DisplayName("Предмет")] + public string SubjectsName { get; private set; } = string.Empty; + + [DisplayName("Преподаватель")] + public string ProfessorsName { get; private set; } = string.Empty; + + [DisplayName("Дата")] public DateTime Date { get; private set; } + + [DisplayName("Оценки")] + public string GradeStudent => StudentGrade != null ? + string.Join(", ", StudentGrade.Select(x => $"{x.StudentName} {x.Grade}")) : + string.Empty; + + [Browsable(false)] public IEnumerable StudentGrade { get; private set; } = []; public static Grades CreateEntity(int id, int subjectsId, int professorsId, DateTime date, IEnumerable studentGrades) { @@ -19,15 +40,11 @@ public class Grades }; } - public static Grades CreateEntity(TempStudentGrades tempStudentGrades, IEnumerable studentGrades) + public void SetStudentGrade(IEnumerable studentGrade) { - return new Grades + if (studentGrade != null && studentGrade.Any()) { - Id = tempStudentGrades.Id, - SubjectsId = tempStudentGrades.SubjectsId, - ProfessorsId = tempStudentGrades.ProfessorsId, - Date = tempStudentGrades.Date, - StudentGrade = studentGrades - }; + StudentGrade = studentGrade; + } } } diff --git a/StudentProgress/StudentProgress/Entities/Group.cs b/StudentProgress/StudentProgress/Entities/Group.cs index 91ef307..ac82255 100644 --- a/StudentProgress/StudentProgress/Entities/Group.cs +++ b/StudentProgress/StudentProgress/Entities/Group.cs @@ -1,8 +1,12 @@ -namespace StudentProgress.Entities; +using System.ComponentModel; + +namespace StudentProgress.Entities; public class Group { public int Id { get; private set; } + + [DisplayName("Название")] public string NameGroup { get; set; } = string.Empty; public static Group CreateEntity(int id, string nameGroup) diff --git a/StudentProgress/StudentProgress/Entities/Lectures.cs b/StudentProgress/StudentProgress/Entities/Lectures.cs index f52bd7f..d8b386c 100644 --- a/StudentProgress/StudentProgress/Entities/Lectures.cs +++ b/StudentProgress/StudentProgress/Entities/Lectures.cs @@ -1,11 +1,23 @@ -namespace StudentProgress.Entities; +using System.ComponentModel; + +namespace StudentProgress.Entities; public class Lectures { public int Id { get; private set; } + + [Browsable(false)] public int ProfessorsId { get; private set; } + + [DisplayName("Преподаватель")] + public string ProfessorsName { get; private set; } = string.Empty; + + [DisplayName("Дата")] public DateTime Date { get; private set; } + + [DisplayName("Аудитория")] public string Auditorium { get; private set; } = string.Empty; + public static Lectures CreateElement(int id, int professorsId, DateTime date, string auditorium) { return new Lectures diff --git a/StudentProgress/StudentProgress/Entities/Professors.cs b/StudentProgress/StudentProgress/Entities/Professors.cs index fb964ba..0a1a9d5 100644 --- a/StudentProgress/StudentProgress/Entities/Professors.cs +++ b/StudentProgress/StudentProgress/Entities/Professors.cs @@ -1,9 +1,15 @@ -namespace StudentProgress.Entities; +using System.ComponentModel; + +namespace StudentProgress.Entities; public class Professors { public int Id { get; set; } + + [DisplayName("Имя")] public string FirstName { get; set; } = string.Empty; + + [DisplayName("Фамилия")] public string Surname { get; set; } = string.Empty; public static Professors CreateEntity(int id, string firstName, string surname) { diff --git a/StudentProgress/StudentProgress/Entities/Student.cs b/StudentProgress/StudentProgress/Entities/Student.cs index 000b6a6..7369a99 100644 --- a/StudentProgress/StudentProgress/Entities/Student.cs +++ b/StudentProgress/StudentProgress/Entities/Student.cs @@ -1,12 +1,23 @@ -namespace StudentProgress.Entities; +using System.ComponentModel; + +namespace StudentProgress.Entities; public class Student { public int Id { get; private set; } + + [DisplayName("Имя")] public string Name { get; set; } = string.Empty; + + [DisplayName("Фамилия")] public string Surname { get; set; } = string.Empty; + + [Browsable(false)] public int GroupId { get; set; } + [DisplayName("Группа")] + public string GroupName { get; set; } = string.Empty; + public static Student CreateEntity(int id, string name, string surname, int groupId) { return new Student diff --git a/StudentProgress/StudentProgress/Entities/StudentGrades.cs b/StudentProgress/StudentProgress/Entities/StudentGrades.cs index fd5c062..e010129 100644 --- a/StudentProgress/StudentProgress/Entities/StudentGrades.cs +++ b/StudentProgress/StudentProgress/Entities/StudentGrades.cs @@ -6,6 +6,7 @@ public class StudentGrades { public int Id { get; private set; } public int StudentID { get; private set; } + public string StudentName { get; private set; } = string.Empty; public Grade Grade { get; private set; } public static StudentGrades CreateEntity(int id, int studentID, Grade grade) { diff --git a/StudentProgress/StudentProgress/Entities/Subjects.cs b/StudentProgress/StudentProgress/Entities/Subjects.cs index 30bb035..7bd431b 100644 --- a/StudentProgress/StudentProgress/Entities/Subjects.cs +++ b/StudentProgress/StudentProgress/Entities/Subjects.cs @@ -1,12 +1,16 @@ -using Microsoft.VisualBasic.Devices; -using StudentProgress.Entities.Enums; +using StudentProgress.Entities.Enums; +using System.ComponentModel; namespace StudentProgress.Entities; public class Subjects { public int Id { get; private set; } + + [DisplayName("Название")] public string NameSubject { get; private set; } = string.Empty; + + [DisplayName("Курсы")] public Course Course { get; private set; } public static Subjects CreateEntity_(int id, string nameSubject, Course course) { diff --git a/StudentProgress/StudentProgress/Entities/TempStudentGrades.cs b/StudentProgress/StudentProgress/Entities/TempStudentGrades.cs deleted file mode 100644 index c6d6b18..0000000 --- a/StudentProgress/StudentProgress/Entities/TempStudentGrades.cs +++ /dev/null @@ -1,18 +0,0 @@ -using StudentProgress.Entities.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace StudentProgress.Entities; - -public class TempStudentGrades -{ - public int Id { get; private set; } - public int SubjectsId { get; private set; } - public int ProfessorsId { get; private set; } - public DateTime Date { get; private set; } - public int StudentID { get; private set; } - public Grade Grade { get; private set; } -} diff --git a/StudentProgress/StudentProgress/FormStudentProgress.cs b/StudentProgress/StudentProgress/FormStudentProgress.cs index 27b7e61..6859e73 100644 --- a/StudentProgress/StudentProgress/FormStudentProgress.cs +++ b/StudentProgress/StudentProgress/FormStudentProgress.cs @@ -97,6 +97,41 @@ namespace StudentProgress MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void toolStripMenuItemDocReport_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void toolStripMenuItemStudentGradeReport_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void toolStripMenuItemGradeDistribution_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } - \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs b/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs index f677e16..5032a86 100644 --- a/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs +++ b/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs @@ -1,21 +1,18 @@ -using StudentProgress.Entities; -using StudentProgress.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; +using StudentProgress.Repositories; using System.Windows.Forms; +using Unity; namespace StudentProgress.Forms { public partial class FormLecturesCount : Form { - private readonly IProfessorsRepository _professorsRepository; + private readonly IUnityContainer _container; private readonly ILecturesRepository _lecturesRepository; - public FormLecturesCount(IProfessorsRepository professorsRepository, ILecturesRepository lecturesRepository) + public FormLecturesCount(IUnityContainer container, ILecturesRepository lecturesRepository) { InitializeComponent(); - _professorsRepository = professorsRepository; + _container = container ?? throw new ArgumentNullException(nameof(container)); _lecturesRepository = lecturesRepository; } @@ -26,71 +23,56 @@ namespace StudentProgress.Forms private void LoadLectures() { - var lectures = _lecturesRepository.ReadLectures(); - var lectureViewModels = new List(); - - foreach (var lecture in lectures) - { - var professor = _professorsRepository.ReadProfessorsNameById(lecture.ProfessorsId); - lectureViewModels.Add(new LectureViewModel - { - LectureId = lecture.LectureId, - ProfessorName = $"{professor.FirstNameProfessor} {professor.SurnameProfessor}", - Auditorium = lecture.Auditorium, - Date = lecture.Date - }); - } - - LecturesDataGridView.DataSource = lectureViewModels; + LecturesDataGridView.DataSource = _lecturesRepository.ReadLectures(); + LecturesDataGridView.Columns["Id"].Visible = false; } private void buttonAdd_Click(object sender, EventArgs e) { - using (var formRecordLecture = new FormRecordLecture(_professorsRepository, _lecturesRepository)) + try { - formRecordLecture.ShowDialog(); - LoadLectures(); // Обновляем данные после закрытия формы + _container.Resolve().ShowDialog(); + LoadLectures(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonDel_Click(object sender, EventArgs e) { - if (LecturesDataGridView.SelectedRows.Count > 0) + if (!TryGetIdentifierFromSelectedRow(out var findId)) { - var selectedRow = LecturesDataGridView.SelectedRows[0]; - var lectureViewModel = selectedRow.DataBoundItem as LectureViewModel; - - if (lectureViewModel != null) - { - // Логика удаления лекции - _lecturesRepository.DeleteLecture(lectureViewModel.LectureId); - - MessageBox.Show("Лекция успешно удалена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); - LoadLectures(); // Обновляем данные после удаления - } + return; } - else + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) { - MessageBox.Show("Выберите лекцию для удаления.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + try + { + _lecturesRepository.DeleteLecture(findId); + LoadLectures(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LecturesDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) + private bool TryGetIdentifierFromSelectedRow(out int id) { + id = 0; + if (LecturesDataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } - } - } - - public class LectureViewModel - { - public int LectureId { get; set; } - public string ProfessorName { get; set; } - public string Auditorium { get; set; } - public DateTime Date { get; set; } - - public LectureViewModel() - { - ProfessorName = string.Empty; // Инициализация свойства ProfessorName - Auditorium = string.Empty; // Инициализация свойства Auditorium + id = Convert.ToInt32(LecturesDataGridView.SelectedRows[0].Cells["Id"].Value); + return true; } } } \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormStudent.cs b/StudentProgress/StudentProgress/Forms/FormStudent.cs index bb96eb9..c40e1fb 100644 --- a/StudentProgress/StudentProgress/Forms/FormStudent.cs +++ b/StudentProgress/StudentProgress/Forms/FormStudent.cs @@ -1,52 +1,102 @@ using System; using System.Windows.Forms; +using Unity; using StudentProgress.Repositories; -using StudentProgress.Entities; namespace StudentProgress.Forms { - public partial class FormStudent : Form + public partial class FormStudents : Form { + private readonly IUnityContainer _container; private readonly IStudentRepository _studentRepository; - private readonly IGroupRepository _groupRepository; - public FormStudent(IStudentRepository studentRepository, IGroupRepository groupRepository) + public FormStudents(IUnityContainer container, IStudentRepository studentRepository) { InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); _studentRepository = studentRepository ?? throw new ArgumentNullException(nameof(studentRepository)); - _groupRepository = groupRepository ?? throw new ArgumentNullException(nameof(groupRepository)); - - LoadGroups(); } - private void LoadGroups() - { - var groups = _groupRepository.ReadGroup(); - comboBoxGroup.DataSource = groups; - comboBoxGroup.DisplayMember = "NameGroup"; - comboBoxGroup.ValueMember = "Id"; - } - - private void buttonSave_Click(object sender, EventArgs e) + private void FormStudents_Load(object sender, EventArgs e) { try { - if (string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxSurname.Text) || comboBoxGroup.SelectedIndex < 0) - { - throw new Exception("Имеются незаполненные поля"); - } - - var student = Student.CreateEntity(0, textBoxName.Text, textBoxSurname.Text, (int)comboBoxGroup.SelectedValue); - _studentRepository.CreateStudent(student); - MessageBox.Show("Студент успешно добавлен", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); - Close(); + LoadList(); } catch (Exception ex) { - MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void buttonCancel_Click(object sender, EventArgs e) => Close(); + private void buttonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonPencil_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _studentRepository.DeleteStudent(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() + { + dataGridView.DataSource = _studentRepository.ReadStudents(); + dataGridView.Columns["Id"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } } } \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormStudents.cs b/StudentProgress/StudentProgress/Forms/FormStudents.cs index 9b1fe2d..c40e1fb 100644 --- a/StudentProgress/StudentProgress/Forms/FormStudents.cs +++ b/StudentProgress/StudentProgress/Forms/FormStudents.cs @@ -51,7 +51,7 @@ namespace StudentProgress.Forms try { var form = _container.Resolve(); - // Здесь нужно добавить логику для загрузки данных в форму редактирования + form.Id = findId; form.ShowDialog(); LoadList(); } @@ -82,8 +82,11 @@ namespace StudentProgress.Forms } } - private void LoadList() => dataGridView.DataSource = _studentRepository.ReadStudents(); - + private void LoadList() + { + dataGridView.DataSource = _studentRepository.ReadStudents(); + dataGridView.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/StudentProgress/StudentProgress/Reports/ChartReport.cs b/StudentProgress/StudentProgress/Reports/ChartReport.cs index f46ec72..247e5c2 100644 --- a/StudentProgress/StudentProgress/Reports/ChartReport.cs +++ b/StudentProgress/StudentProgress/Reports/ChartReport.cs @@ -1,7 +1,6 @@ using Microsoft.Extensions.Logging; using StudentProgress.Repositories; using StudentProgress.Repositories.Implementations; -using System.Reflection.PortableExecutable; namespace StudentProgress.Reports; @@ -24,7 +23,7 @@ internal class ChartReport { new PdfBuilder(filePath) .AddHeader("Диаграмма по оценкам") - .AddPieChart("Распределение оценок по предметам", GetData(dateTime)) + .AddPieChart($"Распределение оценок по предметам на {dateTime:dd.MM.yyyy}", GetData(dateTime)) .Build(); return true; } @@ -44,8 +43,7 @@ internal class ChartReport // Группируем оценки по предметам за конкретный день return _gradesRepository - .ReadGrades() - .Where(g => g.Date.Date == dateTime.Date) // Фильтруем по дате + .ReadGrades(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) .GroupBy(g => g.SubjectsId) // Группировка по ID предмета .Select(g => ( Caption: subjectNames.TryGetValue(g.Key, out var name) ? name : "Неизвестный предмет", diff --git a/StudentProgress/StudentProgress/Reports/ExcelBuilder.cs b/StudentProgress/StudentProgress/Reports/ExcelBuilder.cs index 32cd210..27749b9 100644 --- a/StudentProgress/StudentProgress/Reports/ExcelBuilder.cs +++ b/StudentProgress/StudentProgress/Reports/ExcelBuilder.cs @@ -1,9 +1,6 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; -using Microsoft.Extensions.Primitives; -using Serilog.Parsing; -using static Npgsql.Replication.PgOutput.Messages.RelationMessage; namespace StudentProgress.Reports; diff --git a/StudentProgress/StudentProgress/Reports/PdfBuilder.cs b/StudentProgress/StudentProgress/Reports/PdfBuilder.cs index 48471eb..f732ef7 100644 --- a/StudentProgress/StudentProgress/Reports/PdfBuilder.cs +++ b/StudentProgress/StudentProgress/Reports/PdfBuilder.cs @@ -1,7 +1,6 @@ using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel.Shapes.Charts; using MigraDoc.Rendering; -using System.Reflection.Metadata; using System.Text; namespace StudentProgress.Reports; diff --git a/StudentProgress/StudentProgress/Reports/TableReport.cs b/StudentProgress/StudentProgress/Reports/TableReport.cs index 056395c..9d5e41f 100644 --- a/StudentProgress/StudentProgress/Reports/TableReport.cs +++ b/StudentProgress/StudentProgress/Reports/TableReport.cs @@ -26,7 +26,7 @@ internal class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по оценкам", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"за период {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) .AddTable([10, 15, 15, 15], GetData(studentId, startDate, endDate)) .Build(); return true; @@ -50,9 +50,7 @@ internal class TableReport // Получаем оценки за диапазон дат для указанного студента var gradesData = _gradesRepository - .ReadGrades() - .Where(g => g.Date >= startDate && g.Date <= endDate - && g.StudentGrade.Any(sg => sg.StudentID == studentId)) + .ReadGrades(startDate, endDate, studentId) .Select(g => new { Date = g.Date, diff --git a/StudentProgress/StudentProgress/Reports/WordBuilder.cs b/StudentProgress/StudentProgress/Reports/WordBuilder.cs index 56d97bc..b008b7b 100644 --- a/StudentProgress/StudentProgress/Reports/WordBuilder.cs +++ b/StudentProgress/StudentProgress/Reports/WordBuilder.cs @@ -2,9 +2,6 @@ using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Wordprocessing; using DocumentFormat.OpenXml.Packaging; -using static System.Net.Mime.MediaTypeNames; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab; -using System.Reflection.Metadata; namespace StudentProgress.Reports; diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs index 21958ab..58960a0 100644 --- a/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs +++ b/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs @@ -70,17 +70,57 @@ namespace StudentProgress.Repositories.Implementations } } - public IEnumerable ReadGrades(DateTime? dateFrom = null, DateTime? dateTo = null, int? subjectsId = null, int? professorsId = null) + public IEnumerable ReadGrades(DateTime? dateFrom = null, DateTime? dateTo = null, int? studentId = null) { _logger.LogInformation("Получение оценок"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("g.Date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("g.Date <= @dateTo"); + } + if (studentId.HasValue) + { + builder.AddCondition("sg.StudentId = @studentId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var query = "SELECT * FROM Grades"; + var querySelect = $@"SELECT g.*, CONCAT(pr.FirstName, ' ', pr.Surname) as ProfessorsName, + su.NameSubject as SubjectsName, sg.StudentID, sg.Grade, CONCAT(st.Name, ' ', st.Surname) as StudentName + FROM Grades g + LEFT JOIN Professors pr on pr.Id = g.ProfessorsId + LEFT JOIN Subjects su on su.Id = g.SubjectsId + INNER JOIN StudentGrades sg on sg.GradesId = g.Id + LEFT JOIN Student st on st.Id = sg.StudentID + {builder.Build()}"; - var grades = connection.Query(query); - _logger.LogDebug("Полученные оценки: {json}", JsonConvert.SerializeObject(grades)); - return grades; + var gradesDict = new Dictionary>(); + + var studentGrades = connection.Query(querySelect, + (grade, studentGrade) => + { + if (!gradesDict.TryGetValue(grade.Id, out var ccf)) + { + ccf = []; + gradesDict.Add(grade.Id, ccf); + } + + ccf.Add(studentGrade); + return grade; + }, splitOn: "StudentId", param: new { dateFrom, dateTo, studentId }); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(studentGrades)); + + return gradesDict.Select(x => + { + var cf = studentGrades.First(y => y.Id == x.Key); + cf.SetStudentGrade(x.Value); + return cf; + }).ToArray(); } catch (Exception ex) { diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs index 418a9ae..07aefd9 100644 --- a/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs +++ b/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs @@ -23,7 +23,8 @@ namespace StudentProgress.Repositories.Implementations try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var query = "SELECT * FROM Lectures"; + var query = @"SELECT le.*, CONCAT(pr.FirstName, ' ', pr.Surname) as ProfessorsName FROM Lectures le + LEFT JOIN Professors pr on pr.Id = le.ProfessorsId"; var lectures = connection.Query(query); _logger.LogDebug("Полученные лекции: {json}", JsonConvert.SerializeObject(lectures)); return lectures; diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/QueryBuilder.cs b/StudentProgress/StudentProgress/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..ecc0506 --- /dev/null +++ b/StudentProgress/StudentProgress/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 StudentProgress.Repositories.Implementations; + +internal 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/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs index f5baf2b..c9dfc34 100644 --- a/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs +++ b/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs @@ -89,7 +89,8 @@ WHERE Id=@id"; try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM Student"; + var querySelect = @"SELECT st.*, gr.NameGroup as GroupName FROM Student st + LEFT JOIN ""Group"" gr on gr.Id = st.GroupId"; var student = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(student)); -- 2.25.1 From 5b143a2cb84f8dd2da42e2466053a46608111dc8 Mon Sep 17 00:00:00 2001 From: safia Date: Sat, 21 Dec 2024 14:31:16 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentProgress/Forms/FormSubject.cs | 59 ++++++++++-- .../Forms/FormSubjects.Designer.cs | 37 +++++--- .../StudentProgress/Forms/FormSubjects.cs | 92 +++++++++++++------ .../StudentProgress/Forms/FormSubjects.resx | 4 +- 4 files changed, 143 insertions(+), 49 deletions(-) diff --git a/StudentProgress/StudentProgress/Forms/FormSubject.cs b/StudentProgress/StudentProgress/Forms/FormSubject.cs index bcea12a..0a11279 100644 --- a/StudentProgress/StudentProgress/Forms/FormSubject.cs +++ b/StudentProgress/StudentProgress/Forms/FormSubject.cs @@ -1,18 +1,52 @@ using StudentProgress.Entities; +using StudentProgress.Entities.Enums; using StudentProgress.Repositories; -using System; -using System.Windows.Forms; namespace StudentPerformance.Forms { public partial class FormSubject : Form { private readonly ISubjectsRepository _subjectsRepository; + private int? _subjectId; + public int Id + { + set + { + try + { + var subject = _subjectsRepository.ReadSubjectById(value); + if (subject == null) + { + throw new InvalidDataException(nameof(subject)); + } + + foreach (Course elem in Enum.GetValues(typeof(Course))) + { + if ((elem & subject.Course) != 0) + { + checkedListBoxCourses.SetItemChecked(checkedListBoxCourses.Items.IndexOf(elem), true); + } + } + textBoxName.Text = subject.NameSubject; + _subjectId = subject.Id; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } public FormSubject(ISubjectsRepository subjectsRepository) { InitializeComponent(); _subjectsRepository = subjectsRepository ?? throw new ArgumentNullException(nameof(subjectsRepository)); + + foreach (var elem in Enum.GetValues(typeof(Course))) + { + checkedListBoxCourses.Items.Add(elem); + } } private void buttonSave_Click(object sender, EventArgs e) @@ -23,9 +57,14 @@ namespace StudentPerformance.Forms { throw new Exception("Имя предмета не может быть пустым"); } - - var subject = Subjects.CreateEntity_(0, textBoxName.Text); - _subjectsRepository.CreateSubjects_(subject); + if (_subjectId.HasValue) + { + _subjectsRepository.UpdateSubject(CreateEntity(_subjectId.Value)); + } + else + { + _subjectsRepository.CreateSubjects_(CreateEntity(0)); + } Close(); } catch (Exception ex) @@ -36,9 +75,15 @@ namespace StudentPerformance.Forms private void buttonCancel_Click(object sender, EventArgs e) => Close(); - private void FormSubject_Load(object sender, EventArgs e) + private Subjects CreateEntity(int id) { - // Инициализация формы, если необходимо + Course course = Course.None; + + foreach (var elem in checkedListBoxCourses.CheckedItems) + { + course |= (Course)elem; + } + return Subjects.CreateEntity_(id, textBoxName.Text, course); } } } \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs b/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs index ef5306e..cde700d 100644 --- a/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs @@ -36,29 +36,29 @@ namespace StudentProgress.Forms buttonDel = new Button(); buttonAdd = new Button(); dataGridView = new DataGridView(); + buttonUpd = new Button(); panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); // // panel1 // + panel1.Controls.Add(buttonUpd); panel1.Controls.Add(buttonDel); panel1.Controls.Add(buttonAdd); panel1.Dock = DockStyle.Right; - panel1.Location = new Point(1018, 0); - panel1.Margin = new Padding(6, 6, 6, 6); + panel1.Location = new Point(548, 0); panel1.Name = "panel1"; - panel1.Size = new Size(139, 578); + panel1.Size = new Size(75, 271); panel1.TabIndex = 0; // // buttonDel // buttonDel.BackgroundImage = Properties.Resources.Del; buttonDel.BackgroundImageLayout = ImageLayout.Stretch; - buttonDel.Location = new Point(13, 367); - buttonDel.Margin = new Padding(6, 6, 6, 6); + buttonDel.Location = new Point(7, 172); buttonDel.Name = "buttonDel"; - buttonDel.Size = new Size(104, 113); + buttonDel.Size = new Size(56, 53); buttonDel.TabIndex = 1; buttonDel.UseVisualStyleBackColor = true; buttonDel.Click += buttonDel_Click; @@ -67,10 +67,9 @@ namespace StudentProgress.Forms // buttonAdd.BackgroundImage = Properties.Resources.Add; buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; - buttonAdd.Location = new Point(13, 73); - buttonAdd.Margin = new Padding(6, 6, 6, 6); + buttonAdd.Location = new Point(7, 34); buttonAdd.Name = "buttonAdd"; - buttonAdd.Size = new Size(104, 113); + buttonAdd.Size = new Size(56, 53); buttonAdd.TabIndex = 0; buttonAdd.UseVisualStyleBackColor = true; buttonAdd.Click += buttonAdd_Click; @@ -85,23 +84,32 @@ namespace StudentProgress.Forms dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dataGridView.Dock = DockStyle.Fill; dataGridView.Location = new Point(0, 0); - dataGridView.Margin = new Padding(6, 6, 6, 6); dataGridView.MultiSelect = false; dataGridView.Name = "dataGridView"; dataGridView.ReadOnly = true; dataGridView.RowHeadersVisible = false; dataGridView.RowHeadersWidth = 82; - dataGridView.Size = new Size(1018, 578); + dataGridView.Size = new Size(548, 271); dataGridView.TabIndex = 1; // + // buttonUpd + // + buttonUpd.BackgroundImage = Properties.Resources.Pencil; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(7, 93); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(56, 53); + buttonUpd.TabIndex = 2; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += buttonUpd_Click; + // // FormSubjects // - AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1157, 578); + ClientSize = new Size(623, 271); Controls.Add(dataGridView); Controls.Add(panel1); - Margin = new Padding(6, 6, 6, 6); Name = "FormSubjects"; Text = "Предметы"; Load += FormSubjects_Load; @@ -116,5 +124,6 @@ namespace StudentProgress.Forms private DataGridView dataGridView; private Button buttonDel; private Button buttonAdd; + private Button buttonUpd; } } \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.cs b/StudentProgress/StudentProgress/Forms/FormSubjects.cs index 6c07d9c..9c20306 100644 --- a/StudentProgress/StudentProgress/Forms/FormSubjects.cs +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Windows.Forms; using StudentPerformance.Forms; using StudentProgress.Repositories; @@ -9,50 +10,89 @@ namespace StudentProgress.Forms public partial class FormSubjects : Form { private readonly ISubjectsRepository _subjectsRepository; + private readonly IUnityContainer _container; - public FormSubjects() + public FormSubjects(IUnityContainer container, ISubjectsRepository subjectsRepository) { InitializeComponent(); - var container = Program.CreateContainer(); // Получаем контейнер Unity - _subjectsRepository = container.Resolve(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _subjectsRepository = subjectsRepository ?? throw new ArgumentNullException(nameof(subjectsRepository)); } - private void FormSubjects_Load(object sender, EventArgs e) - { - // Загрузка данных в DataGridView - LoadData(); - } + private void FormSubjects_Load(object sender, EventArgs e) => LoadData(); private void LoadData() { - // Пример загрузки данных из репозитория - var subjects = _subjectsRepository.ReadSubjects(); - dataGridView.DataSource = subjects; + dataGridView.DataSource = _subjectsRepository.ReadSubjects(); + dataGridView.Columns["Id"].Visible = false; } - private void buttonAdd_Click(object sender, EventArgs e) { - // Логика добавления нового предмета - using (var form = new FormSubject(Program.CreateContainer().Resolve())) + try { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + _container.Resolve().ShowDialog(); + LoadData(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonDel_Click(object sender, EventArgs e) { - // Логика удаления выбранного предмета - if (dataGridView.SelectedRows.Count > 0) + if (!TryGetIdentifierFromSelectedRow(out var findId)) { - var selectedSubject = dataGridView.SelectedRows[0].DataBoundItem as Entities.Subjects; - if (selectedSubject != null) - { - _subjectsRepository.DeleteSubjects(selectedSubject.Id); - LoadData(); - } + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _subjectsRepository.DeleteSubjects(findId); + LoadData(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + + } + + private void buttonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadData(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.resx b/StudentProgress/StudentProgress/Forms/FormSubjects.resx index 8b2ff64..af32865 100644 --- a/StudentProgress/StudentProgress/Forms/FormSubjects.resx +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.resx @@ -1,7 +1,7 @@