课时API——获取任意日期的课时
Premium当Omniscol之外的系统需要知道什么时间发生什么时,就调用这个接口:
GET /api/schedules/lessons/{datesrange}
它会针对所请求的日期和实体,返回您课表中的带日期的课时—— 每个课时都落在其真实日期上。几乎所有集成(内网、ETL、合作方工具) 都从这里开始。本页介绍使这个接口能满足多种用途的各项参数。
课时与结构
两个接口,两种职责:
GET /api/schedules/lessons/{datesrange}——课时: 每个落在真实日期上的课时,包含其科目、教师、教室、小组和时长。 想知道谁在何时何地,就读取它。GET /api/schedules/——结构:已发布的课表本身 (班级、科目、校区、时间网格)。需要底层模型而非带日期的课时时,读取它。
也可以通过 with_timetables=true(见下文)把结构并入课时请求:
一次请求即可同时返回两者。
选择日期
{datesrange} 使用 YYYYMMDD 格式,写法刻意设计得很灵活:
| 形式 | 含义 |
|---|---|
20261005 |
某一天 |
20261005-20261011 |
闭区间(一周) |
20260901- / -20260630 |
一端开放 |
20261005,20261012,20261019 |
零散日期——指定的三个周一 |
20261005-20261011,20261102-20261108 |
同时指定多个区间 |
`` 或 - |
所有日期 |
零散形式(用逗号分隔)使“这三个周一”这样的问题只需一次调用即可解决。
精确指定所需内容
filter 将请求限制在所需的实体上——其语法与可用时间接口
(高级查询)相同:
- 简单的标识列表——
{"classes":["3a","3b"]}, - 通配符——
{"teachers":"*"}, - 简单的字段匹配——
{"classrooms":[{"site":"nord"}]}, - 或结构化的
$where——{"classrooms":[{"$where":{"capacity":{"$gte":30}}}]}。
结果先按筛选类型分组,再按实体标识分组——例如
schedules.classes.3a.lessons[]、schedules.teachers.j-doe.lessons[]。
另有两个参数用于限定提取范围,还有一个用于设置上限:
timetables_restrict/timetables_exclude——限定或排除某些课表标识 (字符串、CSV或数组)。limit——限制每个筛选条件返回的课时数量上限。
课时的样子
lessons[] 中的每一项都是一个已安排的课时:
{
"position": { "day": "2026-10-05", "period": 0, "start": "8:15", "end": "9:10" },
"duration": 2,
"subject": "maths",
"teachers": ["j-doe"],
"classroom": "nord:B12",
"class": "3a",
"schedid": "3"
}
position.day是课时的日期。position.period是课时在课表时间网格上的序号——安排在网格上的课时才有。 网格外的课时(自带明确的start/end,不在常规时段内) 则带有start/end,没有period。position.start/position.end(时间)始终出现在网格外的课时上; 当您传入with_hours=true(预先计算的时间)时,网格内的课时也会带上。 当目标系统需要的是时钟时间而非网格序号时,请启用该参数。
缺勤、取消和代课
默认情况下,接口会合并缺勤:缺勤的教师会从课时中移除, 没有剩余教师的课时被视为已取消并被排除。以下参数可改变这一行为:
without_absences——完全忽略缺勤;返回原始的计划网格。with_absences——在课时旁附上该时间段的原始缺勤记录。with_cancellessons——保留已取消的课时(所有教师都缺勤),而不是排除它们。with_studentcancellessons——只保留因学生缺勤而取消的课时。with_removedlessons——返回已移除的课时(与with_cancellessons互斥)。without_teacher_consolidation——在每个课时的teachers列表中保留缺勤的教师,而不是移除。without_holidays——不在该范围内插入假期。
默认情况下,当某次缺勤已指定代课教师时,他会直接替换课时 teachers 列表中缺勤的教师——
代课是透明的,没有额外字段。传入 with_cancellessons 或
without_teacher_consolidation 后,课时还会带有一个
substitutes 块(代课教师的标识、缺勤原因以及引发代课的缺勤记录),
让您在同一份数据中看到谁被替换以及原因。
结构与名录
可在同一次调用中附带所需的参考数据:
with_timetables=true——计算课时所用的课表原始结构 (班级、科目、时间网格,按标识组织)。需要解析标识时启用; 想要精简的响应时请保持关闭。with_entities=true——结果中各实体的精简名称/代码(以及人员的姓名字段)。with_teachers/with_all_teachers——课时中用到的教师, 或课表和名录中的所有教师。with_students——学生及其按日期的分配。with_events=true——同一时间范围内网格外的事件(班级评议会、家长会等)。
夜间ETL拉取
获取所有班级一周的课时(含具体时间),并加载到您的信息系统:
curl -G "https://your-school.omniscol.com/api/schedules/lessons/20261005-20261011" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
--data-urlencode 'filter={"classes":"*"}' \
--data-urlencode "with_hours=true"
响应会把课时归入 schedules.classes.<id>.lessons[]。
缺勤已合并:您加载的内容反映的是实时、最新的课表——
如果还想记录变更原因,请加上 with_absences=true。
推送到Omniscol
集成也可以反向进行——让Omniscol与外部权威数据源保持一致。
对于学生信息系统或ERP软件(Aurion、Auriga等),请优先使用专用连接器, 而不是下面的原始接口——参见与外部系统同步。
班级与教师
这些接口仅用于与外部系统同步;Omniscol界面自己从不调用它们:
POST /api/external/classes(os_external_classes_post)—— 根据按班级标识索引的数据,更新已有班级 (名称、校区、年级、教室、人数)。它只更新已知班级,不会创建新班级。 将某个字段设为null即可清除它(班级名称除外——班级必须保留名称)。POST /api/external/teachers(os_external_teachers_post)—— 按标识插入或更新教师,同时作用于课表和名录 (必要时会创建具有教师角色的用户,并自动生成登录名)。DELETE变体用于移除班级或教师。
还有一个特殊接口 os_external_classes_get,只能被覆盖:
Omniscol不提供默认实现,但当合作方或供应商通过
API自定义将其指向自己的服务时,
创建班级的界面会根据这份封闭的班级列表预填,而不再使用手动表单。
没有覆盖时,它什么都不做。
自定义科目
POST /api/admin/subjects/custom(os_admin_subjects-custom_post)
可加载一份自定义科目目录,或只创建一个科目。界面也会使用它。
目录请求体为
{ "subjects": [ … ], "replace": false, "duplicates_reuse": true }:
默认为增量更新,replace: true 表示完全刷新,
duplicates_reuse: true(默认值)表示按外部标识、代码或名称与已有科目匹配。
这是每晚推送科目时使用的接口。