新增按学期配置的“自动排课优化”页签,可调教师/行政班同日集中、行政班空档与连堂、首末节、教室容量冗余等权重。

自动排课在所有硬约束满足后,对候选排法应用这些软约束评分;不会改动既有课程或已发布课表。
This commit is contained in:
biss committed 2026-08-17 10:51:10 +08:00
1 parent 8074d59e82
commit 0513e251df
10 files changed
+7588 -2

No files matched your search

@@ -13,6 +13,47 @@ namespace Jiaowu.Api.Tests;
public sealed class ScheduleSettingsControllerTests
{
[Fact]
public async Task Optimization_settings_return_defaults_then_persist_per_term_weights()
{
await using var connection = new SqliteConnection("Data Source=:memory:");
await connection.OpenAsync();
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseSqlite(connection)
.Options;
await using var db = new AppDbContext(options);
await db.Database.EnsureCreatedAsync();
var term = new AcademicTerm
{
Code = "2026-F",
Name = "2026 秋季",
AcademicYear = "2026-2027",
Season = TermSeason.Autumn,
StartDate = new DateOnly(2026, 9, 7),
EndDate = new DateOnly(2027, 1, 17)
};
db.AcademicTerms.Add(term);
await db.SaveChangesAsync();
var controller = new ScheduleSettingsController(db, NoOpAppCache.Instance);
var defaults = Assert.IsType<OkObjectResult>(await controller
.GetOptimizationSettings(term.Id, CancellationToken.None));
Assert.Contains("120", JsonSerializer.Serialize(defaults.Value));
Assert.Empty(await db.ScheduleOptimizationSettings.ToListAsync());
var saved = Assert.IsType<OkObjectResult>(await controller
.SaveOptimizationSettings(
term.Id,
new ScheduleOptimizationSettingsRequest(200, 180, 300, 90, 40, 50, 2),
CancellationToken.None));
Assert.Contains("300", JsonSerializer.Serialize(saved.Value));
db.ChangeTracker.Clear();
var settings = await db.ScheduleOptimizationSettings.SingleAsync();
Assert.Equal(200, settings.TeacherSameDayWeight);
Assert.Equal(300, settings.ClassGapWeight);
Assert.Equal(2, settings.RoomCapacityWasteWeight);
}
[Fact]
public async Task Batch_constraints_assign_same_classroom_scope_to_all_tasks()
{