自选项目实验优化

This commit is contained in:
biss committed 2026-08-11 09:29:44 +08:00
1 parent 9b32ee916c
commit e69ab6f580
11 files changed
+7578 -67

No files matched your search

@@ -419,6 +419,14 @@ public sealed class ExperimentGradesController(
var recordsSource = db.ExperimentGradeRecords.AsNoTracking()
.Where(x => x.ExperimentGradeSheetId == id);
var scope = currentUserDataScope.Current;
var isBoundInstructor = scope.Scope == DataScope.Self &&
scope.IsInRole(SystemRoles.Teacher) &&
sheet.ArrangementMode == ExperimentArrangementMode.SelfScheduled;
if (isBoundInstructor)
recordsSource = recordsSource.Where(x =>
x.ExperimentSession != null && x.ExperimentSession.Instructors.Any(
instructor => instructor.Teacher!.UserId == scope.UserId));
if (studentKeyword is not null)
recordsSource = recordsSource.Where(x =>
x.Student!.StudentNumber.Contains(studentKeyword) ||
@@ -512,7 +520,7 @@ public sealed class ExperimentGradesController(
sheet.CreatedAt,
sheet.UpdatedAt
},
CanEdit = CanEdit(task) &&
CanEdit = (CanEdit(task) || isBoundInstructor) &&
sheet.Status is
ExperimentGradeSheetStatus.Draft or
ExperimentGradeSheetStatus.Returned,
@@ -584,13 +592,18 @@ public sealed class ExperimentGradesController(
.Include(x => x.Items)
.Include(x => x.Records)
.ThenInclude(x => x.ItemScores)
.Include(x => x.Records)
.ThenInclude(x => x.ExperimentSession)
.ThenInclude(x => x!.Instructors)
.ThenInclude(x => x.Teacher)
.Include(x => x.ExperimentProject)
.ThenInclude(x => x!.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
if (sheet is null) return NotFound();
if (!CanEdit(sheet.ExperimentProject!.TeachingTask!)) return Forbid();
if (!CanEdit(sheet.ExperimentProject!.TeachingTask!) &&
!CanEditBoundSessionRecords(sheet, request.Records)) return Forbid();
if (sheet.Status is not (
ExperimentGradeSheetStatus.Draft or
ExperimentGradeSheetStatus.Returned))
@@ -1138,6 +1151,15 @@ public sealed class ExperimentGradesController(
private IQueryable<ExperimentProject> ScopedProjects()
{
var scope = currentUserDataScope.Current;
if (scope.Scope == DataScope.Self && scope.IsInRole(SystemRoles.Teacher))
return db.ExperimentProjects.Where(x =>
(x.ArrangementMode == ExperimentArrangementMode.Centralized &&
x.TeachingTask!.Teachers.Any(item =>
item.Teacher!.UserId == scope.UserId)) ||
(x.ArrangementMode == ExperimentArrangementMode.SelfScheduled &&
x.Sessions.Any(session => session.Instructors.Any(instructor =>
instructor.Teacher!.UserId == scope.UserId))));
var taskIds = AccessibleTeachingTasks().Select(x => x.Id);
return db.ExperimentProjects.Where(x =>
taskIds.Contains(x.TeachingTaskId));
@@ -1160,6 +1182,22 @@ public sealed class ExperimentGradesController(
currentUserDataScope.Current.IsInRole(SystemRoles.SuperAdmin) ||
IsAssignedTeacher(task);
private bool CanEditBoundSessionRecords(
ExperimentGradeSheet sheet,
IReadOnlyCollection<ExperimentGradeRecordRequest> requestedRecords)
{
var scope = currentUserDataScope.Current;
if (sheet.ExperimentProject!.ArrangementMode != ExperimentArrangementMode.SelfScheduled ||
scope.Scope != DataScope.Self || !scope.IsInRole(SystemRoles.Teacher) ||
requestedRecords.Count == 0)
return false;
var requestedIds = requestedRecords.Select(x => x.Id).ToHashSet();
return requestedIds.All(recordId => sheet.Records.Any(record =>
record.Id == recordId &&
record.ExperimentSession?.Instructors.Any(instructor =>
instructor.Teacher?.UserId == scope.UserId) == true));
}
private bool IsAssignedTeacher(TeachingTask task) =>
task.Teachers.Any(x =>
x.Teacher?.UserId == currentUserDataScope.Current.UserId);