女朋友刚刚硕士毕业,费了不少周折进入深圳一家公立学校做教务管理工作,恰好学校交代一个给全校老师排课的任务,排了很久都没有排好,于是找到我,了解了他们大致需求后,于是我动手用我们公司的快速开发工具搭建了这个排课软件。
第一步了解需求:每个年级一个学期规定了要上的科目,以及每个科目每周的安排课时数。
于是我设计了下面这个界面来解决教学任务编排:
上面任务解决了每个班级需要配哪些课程,每个课程每周的节数
下面就要解决老师的问题,每个老师教哪几个课程,哪个课程每周安排几节的问题,于是有了如下教师任务界面:
这样哪个老师教哪个班哪门课教几节问题就解决了,有了这些便设计个自动排课界面如下:
上面自动排课自动排课算法部分代码如下,贴出来跟大家分享下:
public void BuildKebiaoAuto() { StringBuilder strMessage = new StringBuilder(); string strMessage0 = "" ; #region 排课前准备工作 EntityObjectFactory eofClassKebiao = EntityObjectFactory.GetInstance( this .objContext, EntityIDEnum.ClassKebiao); EntityObjectFactory eofTermPaikePlan = EntityObjectFactory.GetInstance( this .objContext, EntityIDEnum.TermPaikePlan); EntityObject eoTermPaikePlan = eofTermPaikePlan.FindFirst( "ID={0}" ,PlanID); EntityObjectList eolTermPaikeClass; EntityObjectList eolTermPaikeTeacherRenwu; decimal Paikedays = 0.0m; int Jieshu = 0; int TotalJieshu = 0; int iClass = 0; if (eoTermPaikePlan != null ) { Paikedays = ( decimal )eoTermPaikePlan.GetProperty( "PaikeDays" ); Jieshu = ( int )eoTermPaikePlan.GetProperty( "Jieshu" ); TotalJieshu = ( int )eoTermPaikePlan.GetProperty( "TotalJieshu" ); #region 初始化要排课的结果集合 //获取要排课的班级 eolTermPaikeClass = eoTermPaikePlan.GetChildEntityObjects(EntityIDEnum.PaikeClass); //iClass = eolTermPaikeClass.Count; int iTotalJie = 0; decimal daysXiaoshu = Paikedays - ( int )Paikedays; Paikedays = ( int )Paikedays; foreach (EntityObject eoTermPaikeClass in eolTermPaikeClass) { int jAnpai = 1; for ( int js = 1; js < Jieshu + 1; js++) { for ( int id = 1; id <= Paikedays + 1; id++) { if (( decimal )js/( decimal )Jieshu >daysXiaoshu && id==Paikedays+1) { break ; } else { tagClassResult t = new tagClassResult(); t.YearNum = ( int )eoTermPaikePlan.GetProperty( "YearNum" ); t.TermID = ( int )eoTermPaikePlan.GetProperty( "TermID" ); t.ClassID = ( int )eoTermPaikeClass.GetProperty( "ClassID" ); t.Week = id; t.JieSHu = js; EntityObject eoKebiao = eofClassKebiao.FindFirst( "TermID={0} and Week={1} and Year={2} and Jieshu={3} and ClassID={4} " , eoTermPaikePlan.GetProperty( "TermID" ), id, eoTermPaikePlan.GetProperty( "YearNum" ), js, eoTermPaikeClass.GetProperty( "ClassID" )); //对于固定课的,比如班会,劳动,大扫除,体育这样的统一课先处理 if (eoKebiao == null ) { t.TeacherID = 0; t.SubjectID = 0; } else { t.TeacherID = ( int )eoKebiao.GetProperty( "TeacherID" ); t.SubjectID = ( int )eoKebiao.GetProperty( "SubjectID" ); } ResultArray.Add(iTotalJie, t); jAnpai++; iTotalJie++; } } } } #endregion iResultXiabiao = iTotalJie; #region 初始化要排课的任务集合 eolTermPaikeTeacherRenwu = EntityObjectFactory.GetInstance(objContext, EntityIDEnum.TeacherRenwu).Find( "TermPaikePlanID={0}" ,PlanID); // (EntityIDEnum.TeacherRenwu); //eolTermPaikeTeacherRenwu.Sort("ClassID", SortDirection.Descending); int iRenwu = 0; foreach (EntityObject eoTeacherRenwu in eolTermPaikeTeacherRenwu) { int tjieshu = ( int )eoTeacherRenwu.GetProperty( "Jieshu" ); for ( int ijs = 0; ijs < tjieshu; ijs++) { tagClassInfo t = new tagClassInfo(); t.YearNum = ( int )eoTermPaikePlan.GetProperty( "YearNum" ); t.TermID = ( int )eoTermPaikePlan.GetProperty( "TermID" ); t.ClassID = ( int )eoTeacherRenwu.GetProperty( "ClassID" ); t.TeacherID = ( int )eoTeacherRenwu.GetProperty( "TeacherID" ); t.SubjectID = ( int )eoTeacherRenwu.GetProperty( "SubjectID" ); InfoArraySuiji.Add(iRenwu, t); InfoArray.Add(iRenwu, t); iRenwu++; } } #endregion #region 下面这段代码对InfoArray随机打乱,但排除的效果不理想,所以取消 #endregion //将InfoArray填充到ResultArray CalcResult(); } #endregion #region 生成排课 string sqlGet = "" ; Jeez.Core.INativeQuery query = Jeez.Login.RemoteCall.GetNativeQuery(); Jeez.Core.NativeQueryCommand cmd = new NativeQueryCommand(); StringBuilder strBuild = new StringBuilder(); string TempTableNext1 = "##1jz" + System.Guid.NewGuid().ToString().Replace( "-" , "" ); for ( int iresul = 0; iresul < ResultArray.Count; iresul++) { if (ResultArray.Contains(iresul)) { tagClassResult a = (tagClassResult)ResultArray[iresul]; EntityObject eoClassResult = eofClassKebiao.FindFirst( "TermID={0} and Week={1} and Year={2} and Jieshu={3} and ClassID={4} and SubjectID={5} and TeacherID={6} " , a.TermID, a.Week, a.YearNum, a.JieSHu, a.ClassID, a.SubjectID, a.TeacherID); if (eoClassResult == null ) { eoClassResult = eofClassKebiao.CreateObject(); eoClassResult.SetProperty( "Year" , a.YearNum); eoClassResult.SetProperty( "TermID" , a.TermID); eoClassResult.SetProperty( "Week" , a.Week); eoClassResult.SetProperty( "JieSHu" , a.JieSHu); eoClassResult.SetProperty( "TeacherID" , a.TeacherID); eoClassResult.SetProperty( "SubjectID" , a.SubjectID); eoClassResult.SetProperty( "ClassID" , a.ClassID); } else { eoClassResult.SetProperty( "SubjectID" , a.SubjectID); eoClassResult.SetProperty( "TeacherID" , a.TeacherID); } } } this .objContext.SaveChanges(); #endregion Jeez.Common.UI.MsgBox.Show( "生成完成" ); ResultArray.Clear(); InfoArray.Clear(); } |
排完课程后还有些课程可以对调,调整下位置。这样每个老师每天上哪个班级的课程就一目了然呢。
后面慢慢增加了排公共课的一些更人性化的设计,比如自习课,一些体育班级合上的课也可以了,基本完成,如果有兴趣的朋友可以通过下面的联系方式联系我,欢迎共同交流。
开发这个软件的开发工具介绍:
开发工具下载地址:下载地址http://r068s0l6h.hn-bkt.clouddn.com/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6.rar
ERP试用地址:ERP试用客户端http://r068s0l6h.hn-bkt.clouddn.com/ERP%E8%AF%95%E7%94%A8%E8%AF%B4%E6%98%8E.rar
联系人:李先生
电话:0755-28181927
手机:13826519021 微信同号
QQ:420977542(加我为好友请注明排课软件)