@using Entities.DTO
@using TechHelper.Client.Exam
@using TechHelper.Client.Services
@page "/exam/check/{ExamID}"
试卷批改预览: @Assignment.Title
@if (_isLoading)
{
正在加载试卷和学生数据...
}
else if (_questionsForTable.Any() && _students.Any())
{
序号
分值
@foreach (var student in _students)
{
@student.DisplayName
ToggleStudentAllAnswers(student.Id)" />
}
@context.QuestionItem.Sequence
@context.QuestionItem.Score
@foreach (var student in _students)
{
@if (context.StudentAnswers.ContainsKey(student.Id))
{
}
else
{
N/A
}
}
学生总分预览:
@foreach (var student in _students)
{
@student.DisplayName: @GetStudentTotalScore(student.Id)
}
提交批改结果 (模拟)
}
else
{
无法加载试卷或题目信息。
返回试卷列表
}
@code {
[Parameter]
public string ExamId { get; set; }
[Inject]
public IExamService ExamService { get; set; }
[Inject]
private ISnackbar Snackbar { get; set; }
[Inject]
private NavigationManager Navigation { get; set; }
private MudTable _table = new();
private AssignmentDto Assignment { get; set; } = new AssignmentDto();
private AssignmentCheckData _examStruct = new AssignmentCheckData();
private List _students = new List();
private List _questionsForTable = new List();
private bool _isLoading = true;
[Inject]
public IClassServices ClassServices { get; set; }
protected override async Task OnInitializedAsync()
{
_isLoading = true;
await LoadExamData();
var result = await ClassServices.GetClassStudents();
if (!result.Status) Snackbar.Add($"获取学生失败, {result.Message}", Severity.Error);
_students = result.Result as List ?? new List();
BuildTable();
_isLoading = false;
}
private void BuildTable()
{
_questionsForTable = _examStruct.Questions.Select(q =>
{
var rowData = new QuestionRowData
{
QuestionItem = q,
StudentAnswers = new Dictionary()
};
foreach (var student in _students)
{
rowData.StudentAnswers[student.Id] = false;
}
return rowData;
}).ToList();
}
private async Task LoadExamData()
{
if (Guid.TryParse(ExamId, out Guid parsedExamId))
{
try
{
var result = await ExamService.GetExam(parsedExamId);
if (result.Status)
{
Assignment = result.Result as AssignmentDto ?? new AssignmentDto();
_examStruct = Assignment.GetStruct();
}
else
{
Snackbar?.Add($"获取试卷失败: {result.Message}", Severity.Error);
Navigation.NavigateTo("/exam/manager");
}
}
catch (Exception ex)
{
Console.Error.WriteLine($"获取试卷时发生错误: {ex.Message}");
Snackbar?.Add($"获取试卷失败: {ex.Message}", Severity.Error);
Navigation.NavigateTo("/exam/manager");
}
}
else
{
Console.Error.WriteLine($"错误:路由参数 ExamId '{ExamId}' 不是一个有效的 GUID 格式。");
Snackbar?.Add("无效的试卷ID,无法加载。", Severity.Error);
Navigation.NavigateTo("/exam/manager");
}
}
private float GetStudentTotalScore(Guid studentId)
{
float totalScore = 0;
foreach (var row in _questionsForTable)
{
if (row.StudentAnswers.TryGetValue(studentId, out bool isCorrect) && isCorrect)
{
totalScore += row.QuestionItem.Score;
}
}
return totalScore;
}
private void ToggleStudentAllAnswers(Guid studentId)
{
bool allCorrect = _questionsForTable.All(row => row.StudentAnswers.ContainsKey(studentId) && row.StudentAnswers[studentId]);
foreach (var row in _questionsForTable)
{
if (row.StudentAnswers.ContainsKey(studentId))
{
row.StudentAnswers[studentId] = !allCorrect;
}
}
StateHasChanged();
}
private void SubmitGrading()
{
List submissionDto = new List();
foreach (var student in _students)
{
var newSubmission = new SubmissionDto();
newSubmission.StudentId = student.Id;
newSubmission.AssignmentId = Assignment.Id;
newSubmission.SubmissionTime = DateTime.Now;
newSubmission.Status = Entities.Contracts.SubmissionStatus.Graded;
foreach (var row in _questionsForTable)
{
if (row.QuestionItem.AssignmentQuestionDto.StructType == Entities.Contracts.AssignmentStructType.Struct) continue;
if (row.StudentAnswers.TryGetValue(student.Id, out bool isCorrect))
{
newSubmission.SubmissionDetails.Add(new SubmissionDetailDto
{
IsCorrect = isCorrect,
StudentId = student.Id,
AssignmentQuestionId = row.QuestionItem.AssignmentQuestionDto.Id,
PointsAwarded = isCorrect ? row.QuestionItem.AssignmentQuestionDto.Score : 0
});
newSubmission.OverallGrade += isCorrect ? row.QuestionItem.AssignmentQuestionDto.Score : 0;
}
}
submissionDto.Add(newSubmission);
}
submissionDto.ForEach(async s =>
{
Snackbar?.Add($"正在提交: {_students.FirstOrDefault(std => std.Id == s.StudentId)?.DisplayName} 的试卷", Severity.Info);
var submidResult = await ExamService.SubmissionAssignment(s);
if (submidResult.Status)
Snackbar?.Add($"批改结果已提交 {_students.FirstOrDefault(st => st.Id == s.StudentId)?.DisplayName}", Severity.Success);
else
Snackbar?.Add("批改结果提交失败", Severity.Error);
});
}
}