新增 PublishedScheduleOccurrences:发布时将周期规则按实际周次展开为只读课次明细。

明细保留课表版本、学期、来源排课条目、教学任务、场地、周次、星期和节次,并建立面向教学任务/周次、课表/场地/周次的索引。
明细在“发布课表”的同一事务内生成;发布失败不会留下半成品。
This commit is contained in:
2026-08-09 16:00:09 +08:00 Unverified
parent fb4e5ac4d5
commit 26a918a52a
8 changed files with 6981 additions and 0 deletions
@@ -0,0 +1,37 @@
using Jiaowu.Api.Domain.Academic;
using Jiaowu.Api.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
namespace Jiaowu.Api.Infrastructure.Timetables;
public sealed class PublishedTimetableProjectionService(AppDbContext db)
{
public async Task RebuildAsync(SchedulePlan plan, CancellationToken cancellationToken)
{
var previous = db.PublishedScheduleOccurrences.Where(x => x.SchedulePlanId == plan.Id);
db.PublishedScheduleOccurrences.RemoveRange(previous);
var rows = new List<PublishedScheduleOccurrence>();
foreach (var entry in plan.Entries)
for (var week = entry.StartWeek; week <= entry.EndWeek; week++)
{
if (entry.WeekPattern == WeekPattern.Odd && week % 2 == 0 ||
entry.WeekPattern == WeekPattern.Even && week % 2 != 0) continue;
rows.Add(new PublishedScheduleOccurrence
{
SchedulePlanId = plan.Id,
AcademicTermId = plan.AcademicTermId,
ScheduleEntryId = entry.Id,
TeachingTaskId = entry.TeachingTaskId,
ClassroomId = entry.ClassroomId,
Week = week,
DayOfWeek = entry.DayOfWeek,
StartPeriod = entry.StartPeriod,
PeriodCount = entry.PeriodCount,
Kind = entry.Kind
});
}
db.PublishedScheduleOccurrences.AddRange(rows);
await db.SaveChangesAsync(cancellationToken);
}
}