微搭低代码MBA 培训管理系统实战 22——课程排课
目录第一步数据准备1.1 教室表MBA_Classrooms1.2 课表/排课记录表MBA_Schedules第二步教室管理页面搭建2.1 页面整体布局2.2 数据表格配置2.3 配置查询条件2.4 配置排序字段第三步排课页面布局搭建3.1 页面整体布局3.2 数据表格配置3.3 配置查询条件3.4 配置排序字段第四步排课弹窗实现第五步冲突检测与排课提交最终效果总结在上一讲中我们完成了班级管理与花名册的搭建。学员已经分好班了接下来教务老师面临的最头疼的工作就是排课。本讲将详细介绍如何实现排课功能包括教室管理、课表设计以及核心的资源冲突检测机制。第一步数据准备1.1 教室表MBA_Classrooms创建教室表用于管理物理空间字段名称字段标识类型说明教室名称room_name单行文本如第一阶梯教室、VIP面授室容纳人数capacity数字用于后期校验是否超载状态status枚举启用、停用、维护中创建时间created_at日期时间自动生成更新时间updated_at日期时间自动更新1.2 课表/排课记录表MBA_Schedules创建排课记录表承载具体的上课时间与资源绑定字段名称字段标识类型说明关联班级rel_class_id关联关系关联MBA_Classes表关联教师rel_teacher_id关联关系关联MBA_Teachers表关联教室rel_room_id关联关系关联MBA_Classrooms表上课日期course_date日期如2026-04-15开始时间start_time时间如09:00结束时间end_time时间如11:30课表状态status枚举待上课、已结课、已取消创建时间created_at日期时间自动生成更新时间updated_at日期时间自动更新第二步教室管理页面搭建2.1 页面整体布局点击创建页面的图标输入页面的名称教室管理布局选择管理员布局基础数据管理通常由管理员维护切换到页面布局选择管理员布局添加平级菜单添加教室管理菜单2.2 数据表格配置在管理员布局的内容插槽下添加布局组件修改标题改为教室管理在页面布局中添加数据表格组件数据模型选择教室表2.3 配置查询条件点击筛选器给表格配置查询条件添加具体的查询条件教室名称模糊搜索状态下拉选择2.4 配置排序字段默认按照创建时间的倒序进行排序最新的教室显示在最前面第三步排课页面布局搭建3.1 页面整体布局点击创建页面的图标输入页面的名称排课管理布局选择教务布局因为主要是教务人员使用切换到页面布局选择教务布局添加平级菜单添加排课管理菜单3.2 数据表格配置在教务布局的内容插槽下添加布局组件修改标题改为排课管理在页面布局中添加数据表格组件数据模型选择课表3.3 配置查询条件点击筛选器给表格配置查询条件添加具体的查询条件关联班级关联选择关联教师关联选择关联教室关联选择上课日期范围日期范围3.4 配置排序字段默认按照上课日期的倒序进行排序最新的排课显示在最前面第四步排课弹窗实现在排课管理页面添加弹窗组件用于录入新的排课从组件库中拖拽弹窗组件到页面设置弹窗标题为新增排课在弹窗中添加表单容器组件数据模型选择课表修改表单布局改为双列布局选中弹窗组件关闭显示底部按钮关闭弹窗默认打开状态给新建按钮配置点击事件打开弹窗第五步冲突检测与排课提交创建自定义方法用来检查排课是否冲突并且提交排课记录// 提交排课asyncfunctioncheckScheduleConflict(params){const{teacherId,roomId,classId,courseDate,startTime,endTime}params;// 计算开始和结束的时间戳日期毫秒值 时间毫秒值conststartTimestampcourseDatestartTime;constendTimestampcourseDateendTime;// 构造核心的时间重叠查询条件 (新开始 旧结束) AND (新结束 旧开始)consttimeOverlapFilter{$and:[{course_date:{$eq:courseDate}},// 同一天{start_time:{$lt:endTime}},// 新开始时间 旧结束时间{end_time:{$gt:startTime}},// 新结束时间 旧开始时间{status:{$neq:3}}// 排除已取消的课程]};try{// 1. 检测【教师】冲突constteacherResawait$w.cloud.callDataSource({dataSourceName:MBA_Schedules,methodName:wedaGetRecordsV2,params:{filter:{where:{$and:[{rel_teacher_id:{$eq:teacherId}},timeOverlapFilter]}},getCount:true}});if(teacherRes.total0){return{code:-1,msg:排课失败该教师在此时间段已有排课安排};}// 2. 检测【教室】冲突constroomResawait$w.cloud.callDataSource({dataSourceName:MBA_Schedules,methodName:wedaGetRecordsV2,params:{filter:{where:{$and:[{rel_room_id:{$eq:roomId}},timeOverlapFilter]}},getCount:true}});if(roomRes.total0){return{code:-2,msg:排课失败该教室在此时间段已被占用};}// 3. 检测【班级】自身的冲突防止同一班级同一时间排两节不同的课constclassResawait$w.cloud.callDataSource({dataSourceName:MBA_Schedules,methodName:wedaGetRecordsV2,params:{filter:{where:{$and:[{rel_class_id:{$eq:classId}},timeOverlapFilter]}},getCount:true}});if(classRes.total0){return{code:-3,msg:排课失败该班级在此时间段已排有课程};}// 全部通过无冲突return{code:0,msg:校验通过资源可用};}catch(error){console.error(冲突检测失败:,error);return{code:-99,msg:系统异常请稍后重试};}}exportdefaultasyncfunctionsubmitSchedule({event,data}){// 1. 获取表单数据constformData$w.form1.value;// 2. 校验时间合法性course_date、start_time、end_time都是毫秒值if(formData.start_timeformData.end_time){$w.utils.showToast({title:开始时间必须小于结束时间,icon:error});return;}$w.utils.showLoading({title:正在检测资源冲突...});try{// 3. 调用前端的冲突检测方法constcheckResawaitcheckScheduleConflict({teacherId:formData.rel_teacher_id,roomId:formData.rel_room_id,classId:formData.rel_class_id,courseDate:formData.course_date,startTime:formData.start_time,endTime:formData.end_time});// 4. 根据校验结果决定是否入库if(checkRes.code!0){$w.utils.hideLoading();$w.utils.showModal({title:冲突警告,content:checkRes.msg});return;}// 5. 校验通过正式写入排课表await$w.cloud.callDataSource({dataSourceName:MBA_Schedules,methodName:wedaCreateV2,params:{data:{rel_class_id:{_id:formData.rel_class_id},rel_teacher_id:{_id:formData.rel_teacher_id},rel_room_id:{_id:formData.rel_room_id},course_date:formData.course_date,start_time:formData.start_time,end_time:formData.end_time,status:1,// 待上课}}});$w.utils.hideLoading();$w.utils.showToast({title:排课成功,icon:success});$w.modal1.close({});// 关闭弹窗$w.table1.refresh();// 刷新排课列表}catch(error){$w.utils.hideLoading();$w.utils.showToast({title:系统异常,icon:error});}}选择表单容器修改表单的提交方法改为我们的自定义方法最终效果教务人员打开排课管理页面可以看到所有的排课记录点击新增排课按钮打开排课弹窗当试图把张老师同时排给 A 班和 B 班时系统会立即拦截并弹出排课失败该教师在此时间段已有排课安排的警告。总结本节我们完成了排课系统引擎的完整实现数据模型设计创建了MBA_Classrooms教室表管理物理空间创建了MBA_Schedules课表记录排课信息页面搭建创建排课管理页面使用教务布局配置数据表格显示排课列表配置查询条件和排序规则冲突检测引擎实现教师冲突检测实现教室冲突检测实现班级冲突检测使用(Start A End B) AND (End A Start B)算法排课提交时间戳转换与校验冲突检测调用排课数据写入通过本讲的实现教务人员可以方便地进行排课操作系统会自动检测并拦截冲突的排课安排。下一步我们将继续完善考勤消课机制实现扫码签到与课时扣减功能。