导读(3行收益):培训机构最常见的账务纠纷:学员课时剩多少说不清、扣课靠手工记、过期了还在上课、续费全靠催。本文给一套课时包管理做法:课时包表、扣课流水、防重复扣课、有效期与续费提醒,附关键 SQL。看完课时不再糊涂。
一、课时管理为什么会乱
三个高发问题:
- 剩余课时说不清:学员问还剩几节,前台算半天;
- 扣课靠手工记:一节课被扣两次、漏扣的都有;
- 过期还在上课:课时包过期了照样消课。
根源是课时包没有结构化管理,扣课不记流水。
二、课时包表怎么设计
CREATE TABLE `course_package` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`student_id` BIGINT,
`total_lessons` INT,
`used_lessons` INT DEFAULT 0,
`expire_at` DATETIME,
`status` TINYINT DEFAULT 1
) COMMENT='课时包';
关键点:total 与 used 分开存,剩余 = total - used;有效期单独字段。避坑:只存剩余——不知道买了多少;不存有效期——过期没法判断。
三、扣课流水怎么记
CREATE TABLE `lesson_deduct` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`package_id` BIGINT,
`lesson_id` BIGINT,
`lessons` INT,
`created_at` DATETIME,
UNIQUE KEY `uk_lesson` (`lesson_id`)
) COMMENT='扣课流水';
关键点:每节课一条扣课记录;lesson_id 加唯一约束防重复扣。避坑:扣课只改 used 不记流水——查不到扣了哪些课;不防重复——同一节课扣两次。
四、防重复扣课
UPDATE course_package
SET used_lessons = used_lessons + 1
WHERE id = ? AND used_lessons + 1 <= total_lessons
AND expire_at > NOW();
-- 影响行数为 0:课时不足、已过期或重复
关键点:条件更新一步完成校验+扣减;唯一约束兜底。避坑:先查剩余再扣——并发下超扣;不校验有效期——过期还在消课。
五、有效期与续费提醒
- 到期前 30 天提醒学员与教务;
- 剩余课时 ≤ 3 节时提醒续费;
- 过期课时包停用,不可继续扣课。
避坑:过期不提醒——学员蒙在鼓里;过期还能扣——账务对不上。
六、踩坑清单
- [ ] 只存剩余课时不存总量;
- [ ] 扣课不记流水;
- [ ] 同一节课扣两次;
- [ ] 先查再扣不防并发;
- [ ] 不校验有效期;
- [ ] 没有续费提醒;
- [ ] 过期还能扣课。
七、工程落地建议
课时管理建议按「课时包表+扣课流水+唯一约束防重+有效期校验+续费提醒」落地。若团队用成型教育平台(如乔拓云教育系统)起步,重点核对课时包、扣课流水与到期提醒是否可用。
八、复盘清单(可直接抄走)
- [ ] 是否存课时总量与已用分开;
- [ ] 是否每节课一条扣课流水;
- [ ] 是否防重复扣课;
- [ ] 是否校验有效期;
- [ ] 是否提前提醒续费;
- [ ] 过期是否停用。
结语
课时不是一张"剩几节"的纸,而是总量要存、扣课要记流水、重复要防、过期要拦、续费要提醒。这几步做对,课时不再糊涂。本文仅作技术分享,具体功能以各平台官方实时信息为准。