This commit is contained in:
Ь Ъ 2025-03-04 02:23:35 +04:00
parent e03b4f94d3
commit 4e0d93ee84

View File

@ -17,10 +17,10 @@ public class TableReport
private readonly ISubjectRepository _subjectRepository;
private readonly ITeacherRepository _teacherRepository;
private readonly ILogger<TableReport> _logger;
internal static readonly string[] item = ["Преподаватель", "Дата", "Предмет", "Оценка"];
internal static readonly string[] item = { "Преподаватель", "Дата", "Предмет", "Оценка" };
public TableReport(IStatementRepository statementRepository,IOrderRepository orderRepository,
ISubjectRepository subjectRepository,ILogger<TableReport> logger, ITeacherRepository teacherRepository)
public TableReport(IStatementRepository statementRepository, IOrderRepository orderRepository,
ISubjectRepository subjectRepository, ILogger<TableReport> logger, ITeacherRepository teacherRepository)
{
_teacherRepository = teacherRepository ?? throw new ArgumentNullException(nameof(teacherRepository));
_statementRepository = statementRepository ?? throw new ArgumentNullException(nameof(statementRepository));
@ -34,9 +34,9 @@ public class TableReport
try
{
new ExcelBuilder(filePath)
.AddHeader("Сводка по успеваемости ", 0,4)
.AddHeader("Сводка по успеваемости ", 0, 4)
.AddParagraph("за период", 0)
.AddTable([15,15,15,15], GetData(studentId,startDate, endDate))
.AddTable(new[] { 24, 20, 20, 20 }, GetData(studentId, startDate, endDate))
.Build();
return true;
}
@ -49,42 +49,41 @@ public class TableReport
private List<string[]> GetData(int studentId, DateTime startDate, DateTime endDate)
{
var subjects = _subjectRepository
.ReadSubject()
.ToDictionary(s => s.Id, s => s.Name);
var teacher = _teacherRepository
.ReadTeachers()
.ToDictionary(p => p.Id, p => $"{p.Name}");
// Получаем оценки за диапазон дат для указанного студента
var markss= _statementRepository
.ReadStatement()
.Where(g => g.Date >= startDate && g.Date <= endDate
&& g.Mark.Any(sg => sg.StudentId == studentId))
.Select(g => new
{Date = g.Date, Subject = subjects.TryGetValue(g.SubjectId, out var subject) ? subject : "Неизвестный предмет",
var subjects = _subjectRepository.ReadSubject().ToDictionary(s => s.Id, s => s.Name);
var teachers = _teacherRepository.ReadTeachers().ToDictionary(p => p.Id, p => p.Name);
Value = long.TryParse(g.Mark.First(sg => sg.StudentId == studentId).Value, out var gradeValue) ? gradeValue : 0,
Teacher = teacher.TryGetValue(g.TeacherId, out var prof) ? prof : "Неизвестный преподаватель"
})
var marks = _statementRepository.ReadStatement()
.Where(g => g.Date >= startDate && g.Date <= endDate)
.SelectMany(g => g.Mark.Where(m => m.StudentId == studentId).Select(m => new
{
Date = g.Date,
Subject = subjects.TryGetValue(g.SubjectId, out var subject) ? subject : "Неизвестный предмет",
Value = long.TryParse(m.Value, out var gradeValue) ? gradeValue : 0,
Teacher = teachers.TryGetValue(g.TeacherId, out var teacherName) ? teacherName : "Неизвестный преподаватель"
}))
.ToList();
var averageGrade = markss.Any() ? markss.Average(g => g.Value) : 0;
// Формируем заголовки и строки для таблицы
return new List<string[]> { item }
.Union(markss.Select(g => new string[]
if (!marks.Any())
{
g.Date.ToString("dd.MM.yyyy"),
g.Subject,
g.Value.ToString(),
g.Teacher
}))
_logger.LogWarning("Нет оценок за указанный период для студента с ID: {StudentId}", studentId);
return new List<string[]> { item }; // Возвращение только заголовков в случае отсутствия оценок
}
var averageGrade = marks.Average(g => g.Value);
var data = marks.Select(g => new string[]
{
g.Teacher, // Преподаватель
g.Date.ToString("dd.MM.yyyy"), // Дата
g.Subject, // Предмет
g.Value.ToString() // Оценка
}).ToList();
// Объединяем заголовок и данные
return new List<string[]> { item }
.Union(data)
.Union(new[]
{
new string[]
{
"Средний балл", averageGrade.ToString("0.00"), ""
}
new string[] { "Средний балл", averageGrade.ToString("0.00"), "", "" }
})
.ToList();
}