From 720ff6ef1dc9f9b0bdf87b4644226d35c3b12716 Mon Sep 17 00:00:00 2001 From: biss Date: Mon, 10 Aug 2026 16:41:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E7=BB=A9=E5=86=8C=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3-=E6=80=BB=E5=88=86=E5=88=97=E5=90=8E?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/GradesController.cs | 12 +++++------ .../Jiaowu.Api.Tests/GradesPaginationTests.cs | 21 +++++++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Jiaowu.Api/Controllers/GradesController.cs b/src/Jiaowu.Api/Controllers/GradesController.cs index 3b499e3..d4aa2dc 100644 --- a/src/Jiaowu.Api/Controllers/GradesController.cs +++ b/src/Jiaowu.Api/Controllers/GradesController.cs @@ -706,7 +706,7 @@ public sealed class GradesController( var itemNames = sheet.Items.Select(i => i.Name).ToList(); var headers = new List { "学号", "姓名", "班级", "平时成绩" }; headers.AddRange(itemNames); - headers.AddRange(["总分(自动计算)", "期末成绩", "考试状态", "备注"]); + headers.AddRange(["期末成绩", "总分(自动计算)", "考试状态", "备注"]); var rows = sheet.Records.Select(record => { @@ -723,8 +723,8 @@ public sealed class GradesController( .FirstOrDefault(s => s.GradeItemId == item.Id)?.Score; values.Add(score); } - values.Add(null); values.Add(record.FinalScore); + values.Add(null); values.Add(record.ExamStatus == GradeExamStatus.Normal ? "正常" : record.ExamStatus == GradeExamStatus.Absent ? "缺考" : record.ExamStatus == GradeExamStatus.Deferred ? "缓考" : @@ -745,9 +745,9 @@ public sealed class GradesController( var regularColumn = 4; var itemColumns = Enumerable.Range(5, sheet.Items.Count).ToArray(); - var totalColumn = regularColumn + itemColumns.Length + 1; - var finalColumn = totalColumn + 1; - var statusColumn = finalColumn + 1; + var finalColumn = regularColumn + itemColumns.Length + 1; + var totalColumn = finalColumn + 1; + var statusColumn = totalColumn + 1; var weightedColumns = new List<(int Column, decimal Weight)> { (regularColumn, sheet.RegularWeight) }; weightedColumns.AddRange(sheet.Items.Select((item, index) => (itemColumns[index], item.Weight))); @@ -819,7 +819,7 @@ public sealed class GradesController( var itemNames = sheet.Items.Select(i => i.Name).ToList(); var headers = new List { "学号", "姓名", "班级", "平时成绩" }; headers.AddRange(itemNames); - headers.AddRange(["总分(自动计算)", "期末成绩", "考试状态", "备注"]); + headers.AddRange(["期末成绩", "总分(自动计算)", "考试状态", "备注"]); IReadOnlyList rows; try diff --git a/tests/Jiaowu.Api.Tests/GradesPaginationTests.cs b/tests/Jiaowu.Api.Tests/GradesPaginationTests.cs index 545b0cf..162f697 100644 --- a/tests/Jiaowu.Api.Tests/GradesPaginationTests.cs +++ b/tests/Jiaowu.Api.Tests/GradesPaginationTests.cs @@ -1,3 +1,4 @@ +using ClosedXML.Excel; using Jiaowu.Api.Contracts; using Jiaowu.Api.Controllers; using Jiaowu.Api.Domain.Academic; @@ -83,8 +84,12 @@ public sealed class GradesPaginationTests var sheet = new GradeSheet { TeachingTaskId = tasks[0].Id, - RegularWeight = 30, - FinalWeight = 70, + RegularWeight = 20, + FinalWeight = 60, + Items = + [ + new GradeItem { Name = "实验", Weight = 20, SortOrder = 0 } + ], Records = students.Select(student => new GradeRecord { StudentId = student.Id @@ -129,6 +134,18 @@ public sealed class GradesPaginationTests var secondSheet = secondDetail.Value!.GetType().GetProperty("Sheet")! .GetValue(secondDetail.Value)!; Assert.Single(ReadItems(secondSheet, "Records")); + + var templateResult = Assert.IsType( + await controller.DownloadTemplate(sheet.Id, CancellationToken.None)); + using var stream = new MemoryStream(templateResult.FileContents); + using var workbook = new XLWorkbook(stream); + var worksheet = workbook.Worksheet("成绩导入"); + Assert.Equal( + ["学号", "姓名", "班级", "平时成绩", "实验", "期末成绩", "总分(自动计算)", "考试状态", "备注"], + worksheet.Row(1).CellsUsed().Select(cell => cell.GetString())); + Assert.Contains("D2*20/100", worksheet.Cell("G2").FormulaA1); + Assert.Contains("E2*20/100", worksheet.Cell("G2").FormulaA1); + Assert.Contains("F2*60/100", worksheet.Cell("G2").FormulaA1); } private static int ReadInt(object value, string property) =>