跳转到内容

点名与课消

课时台账那篇讲的是钱怎么进来,这篇讲课时怎么被扣掉。答案是同一句话:课消只能由点名产生——台账里没有第二个写口能插一条课消行,想扣课时,唯一的路就是把这节课点了名。

左侧图标栏 点名/attendance),需要 attendance.record 权限。

进来是一个点名工作台:顶部是日期选择(默认今天)和校区过滤,下面是当天的课节列表,每一行标着时间、班级、学科、老师、教室,右侧是「未点名」或「已点名 n/m」的状态徽标。点开某一节课,展开的花名册面板才是真正点名的地方。

哪些课能点名

章节:哪些课能点名

一节课能不能点名,看两个条件:

  • 任教范围——持 schedule.edit(教务及以上)能点任何课节;只持 attendance.record 的老师账号,只能点自己出现在 lesson_teachers 里、且这一行处于有效状态的课节,不管是主讲、助教还是代课。老师账号点不了别的老师的课,工作台的课节列表也只会给他看得见的那些——「点得了」和「见得到」是同一个判据,不会出现列表里有课、点开却报错没权限的情况。
  • 课节状态——已停课(cancelled)的课节直接灰显,点不开;还有一种「待处理冲突」(conflict_pending)的占位课次(复制课表撞车留下的、与另一节真课指向同一节课)同样点不了,要先在课表里把冲突处理掉(保留或删除),才能回来点名。

老师账号能带着账号任教的课打开花名册面板,管理员和教务能看到全部课节的入口。

展开一节课的花名册面板,看到的是一张表:姓名、状态、扣课时、当前余额、备注,每个学生一行。姓名列如果是试听生会标一个「试听」标签。

状态是三个按钮,点一下选中:

  • 出勤present
  • 缺勤absent
  • 请假leave

默认都是未选中状态,工具栏有一个「全到」按钮,一次把当前在花名册上的学生全部标成出勤(已经不在花名册上、只是因为历史记录才留在表里的学生不会被这个按钮改动,要改还是得单独点那一行)。

扣课时那一列服务端会按状态和点名设置预填一个数字,也可以手动改。改完点「保存点名」,这一次点名才会真正生效。

点名的同时发生了什么

章节:点名的同时发生了什么

点「保存点名」触发的是一个事务,同一次提交里按顺序做完六件事:

  1. 校验这节课存在、没有停课、也不是待处理冲突,即课节可点名;
  2. 校验点名的人任教范围合规(前面「哪些课能点名」那两条判据);
  3. 校验每个被点名的学生都在这节课的花名册里(或者这节课上此前已经有他的点名记录——这是留给「点名之后又被退班」的学生的修改口);
  4. 逐个学生写点名记录(attendance_records);
  5. 按点名结果增改删课消行(下面单独说);
  6. 把这节课的状态改成 attended

六步同生共死:任何一步出错,这次点名整体回滚,不会出现「点名记录写进去了、课消却没扣」或者反过来的半截状态。

课消只能由点名产生——台账(hour_ledger)里 kind='attendance' 的行全仓只有点名保存这一条写口能插;kindenrollment/opening/ adjustment 那三种入账用的另一个接口(报读、期初、调整的写口)在收到 kind==='attendance' 时会直接拒绝,报错说得很直白:「课消行只能由点名保存流程写入,不能通过这个入口手工插入」。这不是漏掉了一个入口没做,是刻意的:课消要跟一节具体的课、一次具体的点名绑在一起,允许别的地方手工插课消行,等于允许一笔课时凭空被扣掉、却查不到是哪节课扣的。数据库层面还有一条部分唯一索引兜底(同一节课、同一个学生,最多一条课消行),双保险。

每一条课消行都有一个 deduct_hours(本行实际扣的课时),0 表示这一行不扣——不该扣的时候,系统不会写一条金额为 0 的课消行占位,而是干脆不写这一行;同理,状态从「该扣」改成「不该扣」,对应的课消行会被删掉,不是把金额改成 0 留着。

改点名会怎样

章节:改点名会怎样

点名点错了,回到同一个花名册面板重新选状态、改扣课时,再点一次「保存点名」就行——改点名会同步改课消,不用手工去台账那边补一笔调整。具体是三种情况之一:

  • 这个学生原来该扣、现在还该扣,只是扣的课时数变了 → 原地把课消行的数值改掉;
  • 这个学生原来不该扣(比如缺勤且机构设置缺勤不扣课时)、这次改成该扣了 → 新插一条课消行;
  • 这个学生原来该扣、这次改成不该扣了(比如把状态从出勤改成了请假,而请假不扣课时)→ 把原来那条课消行删掉。

有一点值得说清楚:只有这次提交里出现的学生会被这样重新核对,没有出现在本次提交里的学生(比如他后来被退了班)的旧课消行原样留着不动——把一整节课的课消全部清空,是「清空点名」这个专门的动作管的,不是保存点名的副作用。另外,改点名不会把一条已经存在的课消行从「通用课时」桶挪进某个学科桶,也不会把它的校区改掉——桶和校区只在这条课消行第一次生成的那一刻定下来,之后的修改只碰这一行到底扣了多少课时。

缺勤和请假扣不扣课时

章节:缺勤和请假扣不扣课时

出勤present)恒定扣课时。缺勤absent)和请假leave)扣不扣,由「点名设置」里的两个开关决定:缺勤默认扣课时,请假默认不扣——这两个开关是机构级的,改了之后新点的名按新设置执行,已经点过的历史记录不会被追溯着改。

点名之后课节状态变成什么? 点过名的课节会转成「已点名」(attended)状态,工作台列表上的徽标会显示「已点名 n/m」(n 是已经点过名的学生数,m 是这节课花名册总人数)。即使这次提交里一个学生都没选状态,只要按下了「保存点名」,课节同样会转成已点名——所以点名工作台的保存按钮在没有任何学生被选中状态时会先拦一句提示,不让人误点。

同一个学生同一节课能点两次名吗? 不能,也不需要——花名册面板本身就是「改点名」的入口,同一节课同一个学生只会有一条点名记录、至多一条课消行,再点开这节课改状态、改扣课时,走的还是这同一条记录。

老师能看到别的老师的课节吗? 工作台的课节列表只显示这个账号点得了名的课节;一个只持 attendance.record、没有绑定老师档案的账号,看到的会是「这个账号还没有绑定老师档案,看不到任何可点名的课节」,而不是一个空的课节列表——这两种情况在界面上是分开说的。

能不能直接去台账里手工改一条课消记录? 不能。台账里没有针对课消行的增删改入口,唯一的修正路径是回到点名工作台,重新给对应的课节、对应的学生点名——见前面「点名的同时发生了什么」和「改点名会怎样」两节。

以王岚老师带的初一数学A班为例:09/05/2026 09:00–10:30 这节课在 101教室,点名之前,学生张梓涵在数学桶的余额是 20.00;点开这节课的花名册,把张梓涵标成出勤并保存点名之后,张梓涵那一行的余额从 20.00 变成了 19.00,课节右上角的状态也从「未点名」变成了「已点名 1/15」。

点名页的花名册网格:左侧课节列表(09/05/2026 09:00–10:30 初一数学A班,王岚,101教室),右侧逐个学生勾出勤/缺勤/请假,尚未保存

同一节课点名保存后,张梓涵那一行的余额从 20.00 变成 19.00,课节状态变为已点名 1/15

关于详细的报读、期初导入、课时调整的写法,见报读与课时台账