已改成“普通排课与实验学时分离”:
普通课表学时 = 总学时 − 实践学时。 自动排课、手工排课、课表发布都会阻止把实践学时重复排入。 全部为实践学时的课程应设为“非排时课程”,再由实验管理安排。 教学任务和排课页面会显示“常规 / 实践学时”。 已有教学任务即使仍保存旧周学时,排课时也会按拆分后的课程学时计算。 无需数据库迁移。
This commit is contained in:
@@ -7,15 +7,75 @@ public static class TeachingTaskHours
|
||||
public static int Calculate(int startWeek, int endWeek, int weeklyHours) =>
|
||||
endWeek < startWeek ? 0 : (endWeek - startWeek + 1) * weeklyHours;
|
||||
|
||||
public static int RegularScheduleHours(Course course) =>
|
||||
RegularScheduleHours(course.TotalHours, course.PracticeHours);
|
||||
|
||||
public static int RegularScheduleHours(int totalHours, int practiceHours) =>
|
||||
Math.Max(0, totalHours - practiceHours);
|
||||
|
||||
public static int TargetHours(
|
||||
Course course,
|
||||
TeachingTaskSchedulingMode schedulingMode) =>
|
||||
schedulingMode == TeachingTaskSchedulingMode.Flexible
|
||||
? course.TotalHours
|
||||
: RegularScheduleHours(course);
|
||||
|
||||
public static bool TryResolveRegularWeeklyHours(
|
||||
Course course,
|
||||
int startWeek,
|
||||
int endWeek,
|
||||
out int weeklyHours) =>
|
||||
TryResolveRegularWeeklyHours(
|
||||
course.TotalHours,
|
||||
course.PracticeHours,
|
||||
startWeek,
|
||||
endWeek,
|
||||
out weeklyHours);
|
||||
|
||||
public static bool TryResolveRegularWeeklyHours(
|
||||
int totalHours,
|
||||
int practiceHours,
|
||||
int startWeek,
|
||||
int endWeek,
|
||||
out int weeklyHours)
|
||||
{
|
||||
weeklyHours = 0;
|
||||
var weekCount = endWeek - startWeek + 1;
|
||||
var regularHours = RegularScheduleHours(totalHours, practiceHours);
|
||||
if (weekCount <= 0 || regularHours % weekCount != 0) return false;
|
||||
|
||||
weeklyHours = regularHours / weekCount;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static string? Validate(
|
||||
Course course,
|
||||
int startWeek,
|
||||
int endWeek,
|
||||
int weeklyHours)
|
||||
int weeklyHours,
|
||||
TeachingTaskSchedulingMode schedulingMode =
|
||||
TeachingTaskSchedulingMode.Standard)
|
||||
{
|
||||
var plannedHours = Calculate(startWeek, endWeek, weeklyHours);
|
||||
return plannedHours == course.TotalHours
|
||||
? null
|
||||
: $"课程“{course.Name}”总学时为 {course.TotalHours};当前第 {startWeek}—{endWeek} 周、每周 {weeklyHours} 学时,共 {plannedHours} 学时。请调整授课周次或周学时。";
|
||||
var targetHours = TargetHours(course, schedulingMode);
|
||||
if (plannedHours == targetHours) return null;
|
||||
|
||||
if (schedulingMode == TeachingTaskSchedulingMode.Standard)
|
||||
{
|
||||
if (targetHours == 0)
|
||||
{
|
||||
return $"课程“{course.Name}”的 {course.TotalHours} 学时均为实践学时," +
|
||||
"无需进入普通课表;请将授课方式设为“非排时课程”,并在实验管理中安排。";
|
||||
}
|
||||
|
||||
return $"课程“{course.Name}”总学时为 {course.TotalHours},其中实践学时 " +
|
||||
$"{course.PracticeHours},普通课表应安排 {targetHours} 学时;当前第 " +
|
||||
$"{startWeek}—{endWeek} 周、每周 {weeklyHours} 学时,共 " +
|
||||
$"{plannedHours} 学时。请调整授课周次或周学时。";
|
||||
}
|
||||
|
||||
return $"课程“{course.Name}”总学时为 {course.TotalHours};当前第 " +
|
||||
$"{startWeek}—{endWeek} 周、每周 {weeklyHours} 学时,共 " +
|
||||
$"{plannedHours} 学时。请调整授课周次或周学时。";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user