实验成绩 Excel 流程

This commit is contained in:
2026-08-10 16:52:03 +08:00 Unverified
parent 720ff6ef1d
commit 031459ac80
3 changed files with 357 additions and 0 deletions
@@ -4,6 +4,8 @@ using Jiaowu.Api.Domain.Identity;
using Jiaowu.Api.Infrastructure.Auth;
using Jiaowu.Api.Infrastructure.Grades;
using Jiaowu.Api.Infrastructure.Persistence;
using ClosedXML.Excel;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
@@ -72,6 +74,56 @@ public sealed class ExperimentGradesControllerTests
CancellationToken.None));
}
[Fact]
public async Task Teacher_CanDownloadAndImportExperimentGradeTemplate()
{
await using var fixture = await ExperimentGradeFixture.CreateAsync();
var project = new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
Code = "LAB-EXCEL",
Name = "Excel 实验成绩",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published,
PublishedAt = DateTime.UtcNow
};
fixture.Db.ExperimentProjects.Add(project);
await fixture.Db.SaveChangesAsync();
var admin = fixture.ExperimentGrades(fixture.AdminScope);
await admin.CreateSheet(new ExperimentGradeSheetRequest(
project.Id, 1, 60,
[new ExperimentGradeItemRequest("操作", ExperimentGradeItemKind.Operation, 100)]),
CancellationToken.None);
var sheet = await fixture.Db.ExperimentGradeSheets.SingleAsync();
fixture.Db.ChangeTracker.Clear();
var teacher = fixture.ExperimentGrades(fixture.TeacherScope);
var template = Assert.IsType<FileContentResult>(await teacher.DownloadTemplate(
sheet.Id, CancellationToken.None));
Assert.Equal("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
template.ContentType);
await using var templateStream = new MemoryStream(template.FileContents);
await using var stream = new MemoryStream();
using (var workbook = new XLWorkbook(templateStream))
{
var worksheet = workbook.Worksheet("实验成绩导入");
worksheet.Cell("D2").Value = "已完成";
worksheet.Cell("E2").Value = 85;
workbook.SaveAs(stream);
}
stream.Position = 0;
var file = new FormFile(stream, 0, stream.Length, "file", "实验成绩导入模板.xlsx");
Assert.IsType<OkObjectResult>(await teacher.ImportRecords(
sheet.Id, file, CancellationToken.None));
fixture.Db.ChangeTracker.Clear();
Assert.Equal(85m, await fixture.Db.ExperimentGradeRecords
.Select(record => record.TotalScore)
.SingleAsync());
}
[Fact]
public async Task ManagementList_IsPagedFilteredAndCollegeScoped()
{