@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 } @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 ExamDto Assignment { get; set; } = new ExamDto(); 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 ExamDto ?? new ExamDto(); _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); // }); // } }