ИСЭбд-22. Хусаинов К.С. Четвертая лабораторная работа. #4

Open
s1ntaa wants to merge 1 commits from LabWork_4 into LabWork_3
19 changed files with 209 additions and 59 deletions
Showing only changes of commit 754c59426d - Show all commits

View File

@ -1,11 +1,24 @@
namespace Project.Entities; using System.ComponentModel;
namespace Project.Entities;
public class Decree public class Decree
{ {
public int Id { get; private set; } public int Id { get; private set; }
[Browsable(false)]
public int StudentId { get; private set; } public int StudentId { get; private set; }
[DisplayName("Студент")]
public string StudentName { get; private set; } = string.Empty;
[DisplayName("Название")]
public string Name { get; private set; } = string.Empty; public string Name { get; private set; } = string.Empty;
[DisplayName("Дата")]
public DateTime Date { get; private set; } public DateTime Date { get; private set; }
[DisplayName("Описание")]
public string Info { get; private set; } = string.Empty; public string Info { get; private set; } = string.Empty;
public static Decree CreateOperation(int id, int studentId, string name, DateTime date, string info) public static Decree CreateOperation(int id, int studentId, string name, DateTime date, string info)

View File

@ -1,11 +1,33 @@
namespace Project.Entities; using Project.Entities.Enums;
using System.ComponentModel;
namespace Project.Entities;
public class Statement public class Statement
{ {
public int Id { get; private set; } public int Id { get; private set; }
[Browsable(false)]
public int TeacherId { get; private set; } public int TeacherId { get; private set; }
[Browsable(false)]
public int SubjectId { get; private set; } public int SubjectId { 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 DateTime Date { get; private set; }
[DisplayName("Результаты")]
public string StatementStudent => StatementStudents != null ?
string.Join(", ", StatementStudents.Select(x => $"{x.StudentName}:{(int)x.Mark}")) :
string.Empty;
[Browsable(false)]
public IEnumerable<StatementStudent> StatementStudents { get; private set; } = []; public IEnumerable<StatementStudent> StatementStudents { get; private set; } = [];
public static Statement CreateOperation(int id, int teacherId, int subjectId, DateTime date, IEnumerable<StatementStudent> statementStudents) public static Statement CreateOperation(int id, int teacherId, int subjectId, DateTime date, IEnumerable<StatementStudent> statementStudents)
@ -20,15 +42,11 @@ public class Statement
}; };
} }
public static Statement CreateOperation(TempStatementStudent tempStatementStudent, IEnumerable<StatementStudent> statementStudents) public void SetStatementStudents(IEnumerable<StatementStudent> statementStudents)
{ {
return new Statement if (statementStudents != null && statementStudents.Any())
{ {
Id = tempStatementStudent.Id, StatementStudents = statementStudents;
TeacherId = tempStatementStudent.TeacherId, }
SubjectId = tempStatementStudent.SubjectId,
Date = tempStatementStudent.Date,
StatementStudents = statementStudents
};
} }
} }

View File

@ -6,6 +6,7 @@ public class StatementStudent
{ {
public int Id { get; private set; } public int Id { get; private set; }
public int StudentId { get; private set; } public int StudentId { get; private set; }
public string StudentName { get; private set; } = string.Empty;
public Mark Mark { get; private set; } public Mark Mark { get; private set; }
public static StatementStudent CreateOperation(int id, int studentId, Mark mark) public static StatementStudent CreateOperation(int id, int studentId, Mark mark)

View File

@ -1,11 +1,21 @@
namespace Project.Entities; using System.ComponentModel;
namespace Project.Entities;
public class Student public class Student
{ {
public int Id { get; private set; } public int Id { get; private set; }
[DisplayName("Имя")]
public string FirstName { get; private set; } = string.Empty; public string FirstName { get; private set; } = string.Empty;
[DisplayName("Фамилия")]
public string LastName { get; private set; } = string.Empty; public string LastName { get; private set; } = string.Empty;
[DisplayName("Средний балл")]
public float Score { get; private set; } public float Score { get; private set; }
[Browsable(false)]
public string DisplayName => $"{FirstName} {LastName}"; public string DisplayName => $"{FirstName} {LastName}";
public static Student CreateOperation(int id, string firstName, string lastName, float score) public static Student CreateOperation(int id, string firstName, string lastName, float score)

View File

@ -1,11 +1,16 @@
using Project.Entities.Enums; using Project.Entities.Enums;
using System.ComponentModel;
namespace Project.Entities; namespace Project.Entities;
public class Subject public class Subject
{ {
public int Id { get; private set; } public int Id { get; private set; }
[DisplayName("Название")]
public string Name { get; private set; } = string.Empty; public string Name { get; private set; } = string.Empty;
[DisplayName("Курсы")]
public Course Courses { get; private set; } public Course Courses { get; private set; }
public static Subject CreateOperation(int id, string name, Course courses) public static Subject CreateOperation(int id, string name, Course courses)

View File

@ -1,10 +1,18 @@
namespace Project.Entities; using System.ComponentModel;
namespace Project.Entities;
public class Teacher public class Teacher
{ {
public int Id { get; private set; } public int Id { get; private set; }
[DisplayName("Имя")]
public string FirstName { get; private set; } = string.Empty; public string FirstName { get; private set; } = string.Empty;
[DisplayName("Фамилия")]
public string LastName { get; private set; } = string.Empty; public string LastName { get; private set; } = string.Empty;
[Browsable(false)]
public string DisplayName => $"{LastName} {FirstName}"; public string DisplayName => $"{LastName} {FirstName}";
public static Teacher CreateOperation(int id, string firstName, string lastName) public static Teacher CreateOperation(int id, string firstName, string lastName)

View File

@ -1,18 +0,0 @@
using Project.Entities.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project.Entities;
public class TempStatementStudent
{
public int Id { get; private set; }
public int TeacherId { get; private set; }
public int SubjectId { get; private set; }
public DateTime Date { get; private set; }
public int StudentId { get; private set; }
public Mark Mark { get; private set; }
}

View File

@ -42,5 +42,9 @@ public partial class DecreesForm : Form
} }
} }
private void LoadList() => dataGridView.DataSource = _decreeRepository.GetAllDecrees(); private void LoadList()
{
dataGridView.DataSource = _decreeRepository.GetAllDecrees();
dataGridView.Columns["Id"].Visible = false;
}
} }

View File

@ -1,4 +1,5 @@
using Project.Repositories; using Project.Repositories;
using System.Windows.Forms;
using Unity; using Unity;
namespace Project.Forms; namespace Project.Forms;
@ -28,8 +29,11 @@ public partial class StatementListForm : Form
} }
} }
private void LoadList() => dataGridViewData.DataSource = _statementRepository.GetAllStatements(); private void LoadList()
{
dataGridViewData.DataSource = _statementRepository.GetAllStatements();
dataGridViewData.Columns["Id"].Visible = false;
}
private void StatementListForm_Load(object sender, EventArgs e) private void StatementListForm_Load(object sender, EventArgs e)
{ {
try try

View File

@ -83,8 +83,12 @@ public partial class StudentsListForm : Form
} }
} }
private void LoadList() => dataGridViewStudents.DataSource = _studentRepository.GetAllStudents(); private void LoadList()
{
dataGridViewStudents.DataSource = _studentRepository.GetAllStudents();
dataGridViewStudents.Columns["Id"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id) private bool TryGetIdentifierFromSelectedRow(out int id)
{ {
id = 0; id = 0;

View File

@ -70,8 +70,11 @@ public partial class SubjectsForm : Form
} }
} }
private void LoadList() => dataGridView.DataSource = _subjectRepository.GetAllSubjects(); private void LoadList()
{
dataGridView.DataSource = _subjectRepository.GetAllSubjects();
dataGridView.Columns["Id"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id) private bool TryGetIdentifierFromSelectedRow(out int id)
{ {
id = 0; id = 0;

View File

@ -1,4 +1,5 @@
using Project.Repositories; using Project.Repositories;
using System.Windows.Forms;
using Unity; using Unity;
namespace Project.Forms; namespace Project.Forms;
@ -81,8 +82,11 @@ public partial class TeachersListForm : Form
} }
} }
private void LoadList() => dataGridViewTeachers.DataSource = _teacherRepository.GetAllTeachers(); private void LoadList()
{
dataGridViewTeachers.DataSource = _teacherRepository.GetAllTeachers();
dataGridViewTeachers.Columns["Id"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id) private bool TryGetIdentifierFromSelectedRow(out int id)
{ {
id = 0; id = 0;

View File

@ -39,16 +39,13 @@ internal class ChartReport
private List<(string Caption, double Value)> GetData(DateTime dateTime) private List<(string Caption, double Value)> GetData(DateTime dateTime)
{ {
// Получаем все предметы
var subjects = _subjectRepository var subjects = _subjectRepository
.GetAllSubjects() .GetAllSubjects()
.ToDictionary(s => s.Id, s => s.Name); .ToDictionary(s => s.Id, s => s.Name);
// Группируем оценки по предметам
var groupedData = _statementRepository var groupedData = _statementRepository
.GetAllStatements() .GetAllStatements(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1))
.Where(s => s.Date.Date == dateTime.Date) // Фильтруем по дате .GroupBy(s => s.SubjectId)
.GroupBy(s => s.SubjectId) // Группируем по ID предмета
.Select(g => .Select(g =>
( (
Caption: subjects.ContainsKey(g.Key) ? subjects[g.Key] : "Неизвестный предмет", Caption: subjects.ContainsKey(g.Key) ? subjects[g.Key] : "Неизвестный предмет",

View File

@ -34,7 +34,7 @@ internal class TableReport
{ {
new ExcelBuilder(filePath) new ExcelBuilder(filePath)
.AddHeader("Сводка по студенту", 0, 3) .AddHeader("Сводка по студенту", 0, 3)
.AddParagraph("за период", 0) .AddParagraph($"за период {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0)
.AddTable([10, 15, 15], GetData(studentId, startDate, endDate)) .AddTable([10, 15, 15], GetData(studentId, startDate, endDate))
.Build(); .Build();
return true; return true;
@ -51,8 +51,7 @@ internal class TableReport
var result = new List<string[]>() { item }; var result = new List<string[]>() { item };
// Получаем оценки студента за период // Получаем оценки студента за период
var statements = _statementRepository.GetAllStatements() var statements = _statementRepository.GetAllStatements(startDate, endDate, studentId);
.Where(s => s.StatementStudents.Any(ss => ss.StudentId == studentId) && s.Date >= startDate && s.Date <= endDate);
foreach (var statement in statements) foreach (var statement in statements)
{ {
@ -71,8 +70,7 @@ internal class TableReport
} }
// Получаем приказы студента за период // Получаем приказы студента за период
var decrees = _decreeRepository.GetAllDecrees() var decrees = _decreeRepository.GetAllDecrees(startDate, endDate, studentId);
.Where(d => d.StudentId == studentId && d.Date >= startDate && d.Date <= endDate);
foreach (var decree in decrees) foreach (var decree in decrees)
{ {

View File

@ -4,6 +4,7 @@ namespace Project.Repositories;
public interface IDecreeRepository public interface IDecreeRepository
{ {
IEnumerable<Decree> GetAllDecrees(); IEnumerable<Decree> GetAllDecrees(DateTime? dateFrom = null, DateTime? dateTo = null,
int? studentId = null);
void AddDecree(Decree decree); void AddDecree(Decree decree);
} }

View File

@ -5,5 +5,6 @@ namespace Project.Repositories;
public interface IStatementRepository public interface IStatementRepository
{ {
void CreateStatement(Statement statement); void CreateStatement(Statement statement);
IEnumerable<Statement> GetAllStatements(); IEnumerable<Statement> GetAllStatements(DateTime? dateFrom = null, DateTime? dateTo = null,
int? studentId = null);
} }

View File

@ -37,14 +37,33 @@ public class DecreeRepository : IDecreeRepository
} }
} }
public IEnumerable<Decree> GetAllDecrees() public IEnumerable<Decree> GetAllDecrees(DateTime? dateFrom = null, DateTime? dateTo = null,
int? studentId = null)
{ {
_logger.LogInformation("Получение всех объектов"); _logger.LogInformation("Получение всех объектов");
try try
{ {
var builder = new QueryBuilder();
if (dateFrom.HasValue)
{
builder.AddCondition("de.Date >= @dateFrom");
}
if (dateTo.HasValue)
{
builder.AddCondition("de.Date <= @dateTo");
}
if (studentId.HasValue)
{
builder.AddCondition("de.StudentId = @studentId");
}
using var connection = new NpgsqlConnection(_connectionString.ConnectionString); using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Decree"; var querySelect = $@"SELECT
var decrees = connection.Query<Decree>(querySelect); de.*,
CONCAT(st.FirstName, ' ', st.LastName) as StudentName
FROM Decree de
LEFT JOIN Student st on st.Id = de.StudentId
{builder.Build()}";
var decrees = connection.Query<Decree>(querySelect, new { dateFrom, dateTo, studentId });
_logger.LogDebug("Полученные объекты: {json}", _logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(decrees)); JsonConvert.SerializeObject(decrees));
return decrees; return decrees;

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project.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}";
}
}

View File

@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using Npgsql; using Npgsql;
using Project.Entities; using Project.Entities;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Project.Repositories.Implementations; namespace Project.Repositories.Implementations;
@ -55,18 +56,62 @@ public class StatementRepository : IStatementRepository
} }
} }
public IEnumerable<Statement> GetAllStatements() public IEnumerable<Statement> GetAllStatements(DateTime? dateFrom = null, DateTime? dateTo = null,
int? studentId = null)
{ {
_logger.LogInformation("Получение всех объектов"); _logger.LogInformation("Получение всех объектов");
try try
{ {
var builder = new QueryBuilder();
if (dateFrom.HasValue)
{
builder.AddCondition("st.Date >= @dateFrom");
}
if (dateTo.HasValue)
{
builder.AddCondition("st.Date <= @dateTo");
}
if (studentId.HasValue)
{
builder.AddCondition("stt.StudentId = @studentId");
}
using var connection = new NpgsqlConnection(_connectionString.ConnectionString); using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"SELECT st.*, stt.StudentId, stt.Mark FROM Statement st var querySelect = $@"SELECT
INNER JOIN StatementStudent stt on stt.StatementId = st.Id"; st.*,
var statements = connection.Query<TempStatementStudent>(querySelect); CONCAT(te.FirstName, ' ', te.LastName) as TeacherName,
sb.Name as SubjectName,
stt.StudentId,
stt.Mark,
CONCAT(stu.FirstName, ' ', stu.LastName) as StudentName
FROM Statement st
LEFT JOIN Teacher te on te.Id = st.TeacherId
LEFT JOIN Subject sb on sb.Id = st.SubjectId
INNER JOIN StatementStudent stt on stt.StatementId = st.Id
LEFT JOIN Student stu on stu.Id = stt.StudentId
{builder.Build()}";
var statementsDict = new Dictionary<int, List<StatementStudent>>();
var statementStudents = connection.Query<Statement, StatementStudent, Statement>(querySelect,
(statement, statementStudent) =>
{
if (!statementsDict.TryGetValue(statement.Id, out var stt))
{
stt = [];
statementsDict.Add(statement.Id, stt);
}
stt.Add(statementStudent);
return statement;
}, splitOn: "StudentId", param: new { dateFrom, dateTo, studentId });
_logger.LogDebug("Полученные объекты: {json}", _logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(statements)); JsonConvert.SerializeObject(statementStudents));
return statements.GroupBy(x => x.Id, y => y, (key, value) => Statement.CreateOperation(value.First(), value.Select(z => StatementStudent.CreateOperation(0, z.StudentId, z.Mark)))).ToList();
return statementsDict.Select(x =>
{
var st = statementStudents.First(y => y.Id == x.Key);
st.SetStatementStudents(x.Value);
return st;
}).ToArray();
} }
catch (Exception ex) catch (Exception ex)
{ {