自动排课:保留手工安排,按教师、行政班、周次、节次、容量和场地约束补排。

课程约束:可限定校区、教学楼、指定教室、允许上课日、最早/最晚节次。
无教室课程:教室可为空,但仍校验教师和班级冲突。
作息维护:按学期维护节次、上下课时间和启用状态。
发布保护:发布前重新检查全部约束,并阻止学时未排满的课表发布。
工作台升级:增加“排课规则与作息”“自动排课”入口,自动生成后仍支持手工微调。
同时兼容 SQLite 和 MySQL,已生成正式迁移。
This commit is contained in:
2026-07-24 19:19:18 +08:00 Unverified
parent d7cf3f9e76
commit 6538b6080a
19 changed files with 4344 additions and 37 deletions
+19
View File
@@ -337,6 +337,21 @@ button { cursor: pointer; }
.schedule-card small, .schedule-card i { overflow: hidden; color: #c6cfe6; font-size: 8px; font-style: normal; white-space: nowrap; text-overflow: ellipsis; }
.schedule-card > button { position: absolute; right: 4px; top: 3px; border: none; color: #b9c4df; background: transparent; font-size: 14px; }
.schedule-card > button:hover { color: white; }
.schedule-settings-drawer .el-drawer__body { padding-top: 0; }
.settings-lead { margin: 4px 0 16px; padding: 14px 16px; display: flex; align-items: center; justify-content: space-between; gap: 18px; border-left: 3px solid var(--teal); background: #f4faf9; }
.settings-lead > div:first-child { display: grid; gap: 4px; }
.settings-lead b { color: #223052; font-family: "STZhongsong", "Songti SC", serif; font-size: 17px; }
.settings-lead span { color: var(--muted); font-size: 10px; line-height: 1.6; }
.settings-lead > div:last-child { display: flex; flex-shrink: 0; gap: 8px; }
.settings-table .el-input-number { width: 76px; }
.constraint-list { display: grid; gap: 8px; }
.constraint-list article { min-width: 0; padding: 13px 15px; display: grid; grid-template-columns: minmax(230px, 1fr) minmax(170px, auto) auto; align-items: center; gap: 14px; border: 1px solid var(--line); background: #fff; }
.constraint-list article > div:first-child { min-width: 0; display: grid; gap: 4px; }
.constraint-list article span { color: var(--teal); font: 700 9px/1.2 Consolas, monospace; }
.constraint-list article b { overflow: hidden; color: #263453; font-size: 12px; white-space: nowrap; text-overflow: ellipsis; }
.constraint-list article small { color: var(--muted); font-size: 9px; }
.constraint-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px; }
.constraint-title { margin-bottom: 16px; padding: 12px 14px; color: #eef4ff; background: linear-gradient(120deg, #243d7a, #182b5d); font-size: 13px; font-weight: 650; }
.selection-page { min-width: 0; }
.selection-round-strip {
@@ -950,6 +965,10 @@ button { cursor: pointer; }
.schedule-search { flex-wrap: wrap; }
.schedule-search .el-input { width: 100%; }
.schedule-search > span { width: 100%; margin-left: 0; }
.settings-lead { align-items: stretch; flex-direction: column; }
.settings-lead > div:last-child { flex-wrap: wrap; }
.constraint-list article { grid-template-columns: 1fr; }
.constraint-badges { justify-content: flex-start; }
.selection-window { grid-template-columns: 82px 1fr; }
.credit-meter, .round-actions {
grid-column: 1 / -1; width: auto; border-top: 1px solid rgba(255,255,255,.13);