新增 PublishedScheduleOccurrences:发布时将周期规则按实际周次展开为只读课次明细。
明细保留课表版本、学期、来源排课条目、教学任务、场地、周次、星期和节次,并建立面向教学任务/周次、课表/场地/周次的索引。 明细在“发布课表”的同一事务内生成;发布失败不会留下半成品。
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user