DEVELOPER DOCS
路線圖(2026-09-17 更新)
原始檔
docs/roadmap.md · 在 GitHub 上檢視本文件是接手者(人或模型)的邊界:已完成什麼、下一步做什麼、刻意不做什麼。 每一項的「現況」都在 2026-09-17 回頭查過程式碼,不是照抄舊 Backlog。
上一版路線圖(v1.1 範圍,2026-07-13 定案)已全部出貨,原文見 git 歷史。
收錄標準不變:真實學校在一個學期內會實際踩到,或開源後會傷到採用信任。 新增的判斷依據:已有學校實際上線使用(國中,每週都有研習調課),他們的回饋優先於推測性的需求。
已出貨
| 版本 | 日期 | 重點 |
|---|---|---|
| v1.0.0 | 2026-07-12 | 首次公開發行:基礎資料、配課、手動/自動排課、發布、調代課、匯出、備份 |
| v1.1.0–v1.1.2 | 2026-07-14 | 背景任務拆兩條佇列、部分排課三合一、學期複製補全、小型加固批次、首次登入改密雙送修正 |
| v1.2.0 | 2026-08-02 | 一鍵示範資料、超鐘點上限、校名可在系統內設定 |
| v1.2.1 | 2026-09-17 | 調課操作畫面(使用學校回饋:只能代課、找不到調課):可對調節次清單、範圍 1–4 週、連堂單節對調、補課日上看板 |
| v1.2.2 | 2026-09-17 | 教師/班級調課通知單列印(照使用學校紙本格式) |
| v1.2.3 | 2026-09-17 | 系統版本顯示與新版本提醒;調課單斜線列印修正 |
| v1.2.4 | 2026-09-17 | 調代課處理寫出處置方式(代課/調課、哪天補課);手冊補調課通知單截圖 |
| v1.2.5 | 2026-09-26 | 教師/班級代課通知單列印(照使用學校紙本格式);代課可選計費方式 |
各版細節見 CHANGELOG.md。
v1.3 範圍(依實作順序)
排序原則:學校裝得快、用得順的先做,純工程衛生的後做。全部不改資料表結構。
開工時機:先讓使用學校實際用 v1.2.5 幾天,沒有新的問題回報再動工。
1. api 映像拆掉 ortools —— M
- 現況:
ortools在pyproject.toml主依賴,api 映像 674MB;排課求解只在 worker 跑,api 容器用不到。 - 影響誰:第一次安裝與每次升級的學校。校內網路或 NAS 拉映像慢,是「升級很麻煩」的主因之一。
- 做法:移到
[solver]之類的 extra 由 worker 安裝;確認 api 端沒有任何路徑匯入ortools(pre-flight 檢查若有用到要拆開)。預期 api 映像約 200MB。 - 驗證:api 容器內
python -c "import ortools"應失敗、全部 API 與 e2e 照常;worker 自動排課照常。
2. 前端改按需匯入 Naive UI —— M
- 現況:
main.ts以app.use(naive)全量註冊,主程式 1.4MB。校內網冷載約 1 秒,可接受但偏大。 - 做法:移除全量註冊,改各頁自行匯入(多數頁面已經是具名匯入);檢查是否有模板直接用未匯入的元件。
- 驗證:建置後主程式大小、冷載時間(
perf-page-load.spec.ts);e2e 全跑——漏匯入的元件只會在執行時才壞。
3. 科目匯入支援「主科」欄 —— S
- 現況:表單可勾「主科」(
is_major,影響自動排課把主科排在上午),但 Excel 匯入沒有這一欄, 匯入後要一科科手動勾。 - 做法:匯入範本加「主科」欄(是/否),匯入時寫入;舊範本沒有這欄照樣可匯入。
4. 配課 API 直接擋群組節數不一致 —— S
- 現況:跑班群組成員節數不一致時,要等到自動排課前的 pre-flight 才擋(
group_shape_mismatch)。 - 做法:建立/修改配課當下就回 409 並說明是哪幾門課不一致,錯誤提早出現在組長正在填的地方。
5. 還原上傳改串流落地 —— S
- 現況:
restore-upload以await file.read()整包讀進記憶體;Caddy 200MB 上限與「超大資料庫走 volume 複製」 文件已緩解,但 4GB 主機上仍有風險。 - 做法:分塊寫入暫存檔再驗魔數、交給 worker 還原。
6. CORS 設定文件化與格式驗證 —— S
- 現況:
cors_origins本來就能用環境變數(JSON 格式)覆寫,但沒有文件、格式錯了也不會提示。 同源部署(預設)下無實害。 - 做法:部署文件補一段;設定格式錯誤時啟動即明確報錯。
7. 工程衛生 —— S
tests/solver/test_purity.py目前只掃絕對匯入(level == 0),補相對匯入。slots_overlap、course_key補邊界單元測試。
等使用學校回饋再決定
- 教師端「我的課表」顯示調課:調課成立後,教師自己的課表不會反映這次變動(看板、通知、調課單都有)。 使用學校目前以紙本調課單通知,沒有提出需求。
- 調代課處理頁的清單很長時:研習多的週,一張假單可能十幾節。目前逐節處理;若回饋操作太多, 再考慮「整張假單一次調課」。
v1.3 之後(明確延後,不是忘記)
- 完整清單分頁(UI + offset):調代課紀錄、請假清單目前取最新 1000 筆並明講被截斷;整年資料變慢時再做。
- 還原溯源
restore.log+ stale 警告持久徽章:presafe 檔名時戳暫可佐證。 - 求解前 hard-only 探測 + warm start;部分排課獨立短時限:解品質/速度優化,獨立可做。
v2(需要外部條件)
- LINE 通知 adapter:走 LINE OA Messaging API,各校自申請 channel token + 綁定碼流程。 等有試用學校提出需求再做——沒有真實 OA 可測之前,寫了也驗不了。
- 軟約束權重 UI:
GET/PUT /api/solver/config已在,滑桿是給進階使用者的;等有學校真的想調權重再開工。
刻意不做(除非出現真實個案)
- 「一門課逐節換教室」:現行一門課整學期一間教室,符合台灣中學實務;改成逐節換教室是為了不存在的需求付模型複雜度。
teacher_time_rule牆鐘化(加節次表維度):v1 已定案「以該配課班級的節次表解讀」,單節次表學校(絕大多數)無此問題。- 沒有請假的教師互調:使用學校的調課幾乎都由研習引起,研習登記為公假/進修後走既有調課流程即可(2026-09-17 確認)。
- 自動升級:新版本提醒只提醒;升級必須由學校先備份、自己決定。
工作流程(每項照做)
實作 → 全品質門檻(ruff/mypy/pytest;eslint/vue-tsc/build/vitest)→ Docker 重建 → E2E(CI 也會擋)→ 真 PostgreSQL 實測、畫面截圖目視 → 開 PR(CI 全綠)→ 維護者合併 → 依 CONTRIBUTING.md 發布。
本頁由
排課與調代課系統 · MIT 授權 · GitHub
docs/roadmap.md 自動產生(scripts/build_docs.py)。
要修改內容請改 Markdown 原始檔,不要直接編輯這份 HTML。排課與調代課系統 · MIT 授權 · GitHub