Skip to content

课程与课时

API 事实来源:Django 后端自动文档

为什么有 CourseOccurrence

courses 维护课程主记录、导入规则、季节作息和实际课时实例。课程主记录描述“这门课是什么”,CourseOccurrence 描述“某一天某一节实际发生的课”。教室日程、班牌展示、借用冲突和签到都消费后者,避免各模块各自展开课表。

代码入口:

  • backend/apps/courses/models/
  • backend/apps/courses/views.py
  • backend/apps/courses/services/
  • backend/apps/courses/tasks.py

作息与学期配置

季节作息由 SeasonConfigServiceSystemConfig 控制,业务代码不直接硬编码课时时间。导入成功后,semester_start_date 会影响后续课表展开;导入逻辑和系统配置回写要一起看。

导入为什么异步

课程导入解析 Excel、写课程、展开课时,执行时间不适合放在请求线程。导入任务写入 TaskRecord,上传文件需要位于 Celery worker 可访问的共享目录。

当前导入规则包含项目业务筛选:UC 行政班直接导入,其他记录只导入 5 号楼 2/3 层,体育课有特殊处理。这些规则不是通用 Excel 解析逻辑,而是课表业务口径。

改课表会影响哪里

  • 调整 CourseOccurrence 状态或生成逻辑前,检查 classrooms、borrowings、checkins、signage 的调用点。
  • 新增课表来源时,先判断是否应转换为 CourseOccurrence,而不是并行维护另一套占用模型。
  • 修改季节作息后需要清除相关缓存。
  • 改导入模板时同步检查导入 service、前端上传流程和异步任务结果结构。