修复实验成绩管理:

管理列表改为服务端分页,支持 10/20/50 条切换。
增加学期、成绩状态、开课学院以及项目/课程/教学班/教师关键词筛选。
数据范围分级:校级管理员可查看全校,院级管理员仅限本学院,教师仅限本人任课项目。
修复任课教师提交审核时报“无权限”:工作流查询现在会加载任课教师关系。
增加权限、学院隔离、分页和筛选回归测试。
This commit is contained in:
2026-08-09 21:48:19 +08:00 Unverified
parent cd073885b5
commit c26e082a77
8 changed files with 7162 additions and 10 deletions
@@ -38,8 +38,15 @@ public sealed class ExperimentGradesController(
public async Task<ActionResult> GetManagement(
Guid? academicTermId,
ExperimentGradeSheetStatus? status,
CancellationToken cancellationToken)
Guid? collegeId = null,
string? keyword = null,
int page = 1,
int pageSize = 20,
CancellationToken cancellationToken = default)
{
page = Math.Max(1, page);
pageSize = Math.Clamp(pageSize, 10, 50);
keyword = Normalize(keyword);
var source = ScopedProjects().AsNoTracking()
.Where(x =>
x.Status == ExperimentProjectStatus.Published ||
@@ -51,11 +58,28 @@ public sealed class ExperimentGradesController(
source = source.Where(x =>
x.GradeSheet != null &&
x.GradeSheet.Status == status.Value);
if (collegeId.HasValue)
source = source.Where(x =>
x.TeachingTask!.Course!.CollegeId == collegeId.Value);
if (keyword is not null)
source = source.Where(x =>
x.Code.Contains(keyword) ||
x.Name.Contains(keyword) ||
x.TeachingTask!.TaskNumber.Contains(keyword) ||
x.TeachingTask.Name.Contains(keyword) ||
x.TeachingTask.Course!.Code.Contains(keyword) ||
x.TeachingTask.Course.Name.Contains(keyword) ||
x.TeachingTask.Teachers.Any(item =>
item.Teacher!.TeacherNumber.Contains(keyword) ||
item.Teacher.Name.Contains(keyword)));
return Ok(await source
var total = await source.CountAsync(cancellationToken);
var items = await source
.OrderByDescending(x => x.TeachingTask!.AcademicTerm!.StartDate)
.ThenBy(x => x.TeachingTask!.TaskNumber)
.ThenBy(x => x.Code)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.Select(x => new
{
x.Id,
@@ -96,7 +120,14 @@ public sealed class ExperimentGradesController(
x.GradeSheet.PublishedAt
}
})
.ToListAsync(cancellationToken));
.ToListAsync(cancellationToken);
return Ok(new
{
Items = items,
Total = total,
Page = page,
PageSize = pageSize
});
}
[HttpGet("mine")]
@@ -747,6 +778,10 @@ public sealed class ExperimentGradesController(
.Include(x => x.ExperimentProject)
.ThenInclude(x => x!.TeachingTask)
.ThenInclude(x => x!.Course)
.Include(x => x.ExperimentProject)
.ThenInclude(x => x!.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
}