课程与课时
API 事实来源:Django 后端自动文档
为什么有 CourseOccurrence
courses 维护课程主记录、导入规则、季节作息和实际课时实例。课程主记录描述“这门课是什么”,CourseOccurrence 描述“某一天某一节实际发生的课”。教室日程、班牌展示、借用冲突和签到都消费后者,避免各模块各自展开课表。
代码入口:
backend/apps/courses/models/backend/apps/courses/views.pybackend/apps/courses/services/backend/apps/courses/tasks.py
作息与学期配置
季节作息由 SeasonConfigService 和 SystemConfig 控制,业务代码不直接硬编码课时时间。导入成功后,semester_start_date 会影响后续课表展开;导入逻辑和系统配置回写要一起看。
导入为什么异步
课程导入解析 Excel、写课程、展开课时,执行时间不适合放在请求线程。导入任务写入 TaskRecord,上传文件需要位于 Celery worker 可访问的共享目录。
当前导入规则包含项目业务筛选:UC 行政班直接导入,其他记录只导入 5 号楼 2/3 层,体育课有特殊处理。这些规则不是通用 Excel 解析逻辑,而是课表业务口径。
改课表会影响哪里
- 调整
CourseOccurrence状态或生成逻辑前,检查 classrooms、borrowings、checkins、signage 的调用点。 - 新增课表来源时,先判断是否应转换为
CourseOccurrence,而不是并行维护另一套占用模型。 - 修改季节作息后需要清除相关缓存。
- 改导入模板时同步检查导入 service、前端上传流程和异步任务结果结构。