From 7db082639c995cf91888997f468d59e1e7169474 Mon Sep 17 00:00:00 2001 From: biss Date: Tue, 18 Aug 2026 09:54:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=99=E5=B8=88=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E7=AE=A1=E7=90=86=E9=A1=B5=E7=9A=84=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ExperimentsController.cs | 7 ++-- .../ExperimentsControllerTests.cs | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Jiaowu.Api/Controllers/ExperimentsController.cs b/src/Jiaowu.Api/Controllers/ExperimentsController.cs index 56ea887..01bf2a4 100644 --- a/src/Jiaowu.Api/Controllers/ExperimentsController.cs +++ b/src/Jiaowu.Api/Controllers/ExperimentsController.cs @@ -196,12 +196,11 @@ public sealed class ExperimentsController( int page = 1, int pageSize = 20) { + // 项目列表按任课教学任务授权。场次的名单、取消和代选仍由 + // CanManageSession 限制到已绑定的指导教师,不能以此反向过滤项目: + // 草稿尚未安排场次,集中安排项目也没有独立的场次指导教师绑定。 var source = ScopedProjects().AsNoTracking(); var scope = currentUserDataScope.Current; - if (scope.Scope == DataScope.Self && scope.IsInRole(SystemRoles.Teacher)) - source = source.Where(x => x.Sessions.Any(session => - session.Instructors.Any(instructor => - instructor.Teacher!.UserId == scope.UserId))); if (academicTermId.HasValue) source = source.Where(x => x.TeachingTask!.AcademicTermId == academicTermId); diff --git a/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs b/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs index f63e382..7285fe8 100644 --- a/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs +++ b/tests/Jiaowu.Api.Tests/ExperimentsControllerTests.cs @@ -7,11 +7,45 @@ using Jiaowu.Api.Infrastructure.Timetables; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using System.Text.Json; namespace Jiaowu.Api.Tests; public sealed class ExperimentsControllerTests { + [Fact] + public async Task TeacherManagement_ListsOwnDraftAndPublishedProjectsWithoutSessionInstructorBinding() + { + await using var fixture = await ExperimentFixture.CreateAsync(); + var teacherScope = new FixedScope(new CurrentUserScope( + fixture.ManagerScope.Current.UserId, + fixture.ManagerScope.Current.DisplayName, + fixture.ManagerScope.Current.CollegeId, + DataScope.Self, + new HashSet([SystemRoles.Teacher]))); + var controller = fixture.Controller(teacherScope); + + Assert.IsType(await controller.CreateProject( + fixture.ProjectRequest(ExperimentArrangementMode.SelfScheduled), + CancellationToken.None)); + Assert.IsType(await controller.CreateProject( + fixture.ProjectRequest(ExperimentArrangementMode.Centralized), + CancellationToken.None)); + var centralized = await fixture.Db.ExperimentProjects.SingleAsync(x => + x.ArrangementMode == ExperimentArrangementMode.Centralized); + Assert.IsType(await controller.PublishProject( + centralized.Id, CancellationToken.None)); + + var result = Assert.IsType( + await controller.GetManagementProjects( + null, null, null, null, null, null, null, null, + CancellationToken.None)); + using var response = JsonDocument.Parse(JsonSerializer.Serialize(result.Value)); + + Assert.Equal(1, response.RootElement.GetProperty("Total").GetInt32()); + Assert.Equal(2, response.RootElement.GetProperty("Items").GetArrayLength()); + } + [Fact] public async Task BatchProjects_CreateSameDefinitionForSameCourseTasks() {