修复实验成绩管理:
管理列表改为服务端分页,支持 10/20/50 条切换。 增加学期、成绩状态、开课学院以及项目/课程/教学班/教师关键词筛选。 数据范围分级:校级管理员可查看全校,院级管理员仅限本学院,教师仅限本人任课项目。 修复任课教师提交审核时报“无权限”:工作流查询现在会加载任课教师关系。 增加权限、学院隔离、分页和筛选回归测试。
This commit is contained in:
1 parent
cd073885b5
commit
c26e082a77
8 files changed
+7162
-10
No files matched your search
@@ -38,8 +38,15 @@ public sealed class ExperimentGradesController(
|
|||||||
public async Task<ActionResult> GetManagement(
|
public async Task<ActionResult> GetManagement(
|
||||||
Guid? academicTermId,
|
Guid? academicTermId,
|
||||||
ExperimentGradeSheetStatus? status,
|
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()
|
var source = ScopedProjects().AsNoTracking()
|
||||||
.Where(x =>
|
.Where(x =>
|
||||||
x.Status == ExperimentProjectStatus.Published ||
|
x.Status == ExperimentProjectStatus.Published ||
|
||||||
@@ -51,11 +58,28 @@ public sealed class ExperimentGradesController(
|
|||||||
source = source.Where(x =>
|
source = source.Where(x =>
|
||||||
x.GradeSheet != null &&
|
x.GradeSheet != null &&
|
||||||
x.GradeSheet.Status == status.Value);
|
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)
|
.OrderByDescending(x => x.TeachingTask!.AcademicTerm!.StartDate)
|
||||||
.ThenBy(x => x.TeachingTask!.TaskNumber)
|
.ThenBy(x => x.TeachingTask!.TaskNumber)
|
||||||
.ThenBy(x => x.Code)
|
.ThenBy(x => x.Code)
|
||||||
|
.Skip((page - 1) * pageSize)
|
||||||
|
.Take(pageSize)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
{
|
{
|
||||||
x.Id,
|
x.Id,
|
||||||
@@ -96,7 +120,14 @@ public sealed class ExperimentGradesController(
|
|||||||
x.GradeSheet.PublishedAt
|
x.GradeSheet.PublishedAt
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.ToListAsync(cancellationToken));
|
.ToListAsync(cancellationToken);
|
||||||
|
return Ok(new
|
||||||
|
{
|
||||||
|
Items = items,
|
||||||
|
Total = total,
|
||||||
|
Page = page,
|
||||||
|
PageSize = pageSize
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("mine")]
|
[HttpGet("mine")]
|
||||||
@@ -747,6 +778,10 @@ public sealed class ExperimentGradesController(
|
|||||||
.Include(x => x.ExperimentProject)
|
.Include(x => x.ExperimentProject)
|
||||||
.ThenInclude(x => x!.TeachingTask)
|
.ThenInclude(x => x!.TeachingTask)
|
||||||
.ThenInclude(x => x!.Course)
|
.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);
|
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
@@ -1953,6 +1953,9 @@ namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
|||||||
b.Property<Guid>("PlanId")
|
b.Property<Guid>("PlanId")
|
||||||
.HasColumnType("char(36)");
|
.HasColumnType("char(36)");
|
||||||
|
|
||||||
|
b.Property<string>("ProjectIdsJson")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<Guid?>("RequestedByUserId")
|
b.Property<Guid?>("RequestedByUserId")
|
||||||
.HasColumnType("char(36)");
|
.HasColumnType("char(36)");
|
||||||
|
|
||||||
|
|||||||
+6873
File diff suppressed because it is too large.
Load diff
Loaded 3 of 8 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user