优化了教师评教结果接口

This commit is contained in:
2026-08-11 12:02:01 +08:00 Unverified
parent 0bc59bd64e
commit 5ab980c623
@@ -391,81 +391,90 @@ public sealed class EvaluationsController(
if (taskIds.Count == 0) if (taskIds.Count == 0)
return Ok(new { Tasks = Array.Empty<object>() }); return Ok(new { Tasks = Array.Empty<object>() });
var setups = await db.EvaluationSetups.AsNoTracking() var taskSummaries = await db.EvaluationRecords.AsNoTracking()
.Where(x => x.Status == EvaluationSetupStatus.Closed) .WhereIn(taskIds, record => record.TeachingTaskId)
.Include(x => x.Dimensions.OrderBy(d => d.SortOrder)) .Where(record => record.EvaluationSetup!.Status == EvaluationSetupStatus.Closed)
.OrderByDescending(x => x.AcademicTerm!.StartDate) .GroupBy(record => new
.ToListAsync(cancellationToken);
var result = new List<object>();
foreach (var setup in setups)
{ {
var setupTaskIds = await db.EvaluationRecords.AsNoTracking() record.EvaluationSetupId,
.Where(r => r.EvaluationSetupId == setup.Id) SetupName = record.EvaluationSetup!.Name,
.WhereIn(taskIds, r => r.TeachingTaskId) SetupStartDate = record.EvaluationSetup.AcademicTerm!.StartDate,
.Select(r => r.TeachingTaskId) record.TeachingTaskId,
.Distinct() TaskNumber = record.TeachingTask!.TaskNumber,
.ToListAsync(cancellationToken); TaskName = record.TeachingTask.Name,
record.TeachingTask.AcademicTermId,
foreach (var taskId in setupTaskIds) CourseCode = record.TeachingTask.Course!.Code,
{ CourseName = record.TeachingTask.Course.Name
var task = await db.TeachingTasks.AsNoTracking()
.Where(x => x.Id == taskId)
.Select(x => new
{
x.Id,
x.TaskNumber,
x.Name,
x.AcademicTermId,
CourseCode = x.Course!.Code,
CourseName = x.Course.Name
}) })
.FirstOrDefaultAsync(cancellationToken); .Select(group => new
if (task is null) continue; {
group.Key,
var records = await db.EvaluationRecords.AsNoTracking() StudentCount = group.Count(),
.Where(r => r.EvaluationSetupId == setup.Id && AverageTotal = group.Average(record =>
r.TeachingTaskId == taskId) record.Scores.Sum(score => score.Score))
.Include(r => r.Scores) })
.OrderByDescending(x => x.Key.SetupStartDate)
.ThenBy(x => x.Key.CourseCode)
.ThenBy(x => x.Key.TaskNumber)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
if (records.Count == 0) continue; var dimensionSummaries = await (
from score in db.EvaluationScores.AsNoTracking()
var dimensionResults = setup.Dimensions.Select(dim => join record in db.EvaluationRecords.AsNoTracking()
on score.EvaluationRecordId equals record.Id
join dimension in db.EvaluationDimensions.AsNoTracking()
on score.EvaluationDimensionId equals dimension.Id
where taskIds.Contains(record.TeachingTaskId) &&
record.EvaluationSetup!.Status == EvaluationSetupStatus.Closed
group score by new
{ {
var scores = records record.EvaluationSetupId,
.SelectMany(r => r.Scores) record.TeachingTaskId,
.Where(s => s.EvaluationDimensionId == dim.Id) dimension.Id,
.Select(s => (double)s.Score) dimension.Name,
.ToList(); dimension.MaxScore,
return new dimension.SortOrder
{
DimensionId = dim.Id,
DimensionName = dim.Name,
MaxScore = dim.MaxScore,
AverageScore = scores.Count > 0
? Math.Round(scores.Average(), 1) : 0,
TotalScore = scores.Sum(),
Count = scores.Count
};
}).ToList();
var totalAvg = records
.Select(r => (double)r.Scores.Sum(s => s.Score))
.ToList();
result.Add(new
{
SetupId = setup.Id,
setup.Name,
Task = task,
StudentCount = records.Count,
AverageTotal = totalAvg.Count > 0
? Math.Round(totalAvg.Average(), 1) : 0,
Dimensions = dimensionResults
});
}
} }
into scoreGroup
select new
{
scoreGroup.Key,
AverageScore = scoreGroup.Average(score => score.Score),
TotalScore = scoreGroup.Sum(score => score.Score),
Count = scoreGroup.Count()
})
.ToListAsync(cancellationToken);
var dimensionsByTask = dimensionSummaries
.GroupBy(item => (item.Key.EvaluationSetupId, item.Key.TeachingTaskId))
.ToDictionary(
group => group.Key,
group => (IReadOnlyCollection<TeacherEvaluationDimensionResult>)group
.OrderBy(item => item.Key.SortOrder)
.Select(item => new TeacherEvaluationDimensionResult(
item.Key.Id,
item.Key.Name,
item.Key.MaxScore,
Math.Round((double)item.AverageScore, 1),
item.TotalScore,
item.Count))
.ToArray());
var result = taskSummaries.Select(item => new TeacherEvaluationTaskResult(
item.Key.EvaluationSetupId,
item.Key.SetupName,
new TeacherEvaluationTask(
item.Key.TeachingTaskId,
item.Key.TaskNumber,
item.Key.TaskName,
item.Key.AcademicTermId,
item.Key.CourseCode,
item.Key.CourseName),
item.StudentCount,
Math.Round((double)item.AverageTotal, 1),
dimensionsByTask.GetValueOrDefault(
(item.Key.EvaluationSetupId, item.Key.TeachingTaskId),
Array.Empty<TeacherEvaluationDimensionResult>())))
.ToArray();
return Ok(new { Tasks = result }); return Ok(new { Tasks = result });
} }
@@ -594,3 +603,27 @@ public sealed record SubmitEvaluationRequest(
public sealed record EvaluationScoreRequest( public sealed record EvaluationScoreRequest(
Guid DimensionId, Guid DimensionId,
int Score); int Score);
public sealed record TeacherEvaluationTaskResult(
Guid SetupId,
string Name,
TeacherEvaluationTask Task,
int StudentCount,
double AverageTotal,
IReadOnlyCollection<TeacherEvaluationDimensionResult> Dimensions);
public sealed record TeacherEvaluationTask(
Guid Id,
string TaskNumber,
string Name,
Guid AcademicTermId,
string CourseCode,
string CourseName);
public sealed record TeacherEvaluationDimensionResult(
Guid DimensionId,
string DimensionName,
int MaxScore,
double AverageScore,
decimal TotalScore,
int Count);