一个排课软件的设计
女朋友剛剛碩士畢業,費了不少周折進入深圳一家公立學校做教務管理工作,恰好學校交代一個給全校老師排課的任務,排了很久都沒有排好,于是找到我,了解了他們大致需求后,于是我動手用我們公司的快速開發工具搭建了這個排課軟件。
第一步了解需求:每個年級一個學期規定了要上的科目,以及每個科目每周的安排課時數。
于是我設計了下面這個界面來解決教學任務編排:
?
上面任務解決了每個班級需要配哪些課程,每個課程每周的節數
下面就要解決老師的問題,每個老師教哪幾個課程,哪個課程每周安排幾節的問題,于是有了如下教師任務界面:
?
?這樣哪個老師教哪個班哪門課教幾節問題就解決了,有了這些便設計個自動排課界面如下:
?
上面自動排課自動排課算法部分代碼如下,貼出來跟大家分享下:
?| public void BuildKebiaoAuto() ???????{ ???????????StringBuilder strMessage =new StringBuilder(); ???????????stringstrMessage0 = ""; ???????????#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; ???????????decimalPaikedays = 0.0m; ???????????intJieshu = 0; ???????????intTotalJieshu = 0; ???????????intiClass = 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; ???????????????intiTotalJie = 0; ???????????????decimaldaysXiaoshu = Paikedays - (int)Paikedays; ???????????????Paikedays = (int)Paikedays; ???????????????foreach(EntityObject eoTermPaikeClass ineolTermPaikeClass) ???????????????{ ???????????????????intjAnpai = 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); ???????????????intiRenwu = 0; ???????????????foreach(EntityObject eoTeacherRenwu ineolTermPaikeTeacherRenwu) ???????????????{ ???????????????????inttjieshu = (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 生成排課 ???????????stringsqlGet = ""; ???????????Jeez.Core.INativeQuery query = Jeez.Login.RemoteCall.GetNativeQuery(); ???????????Jeez.Core.NativeQueryCommand cmd =new NativeQueryCommand(); ???????????StringBuilder strBuild =new StringBuilder(); ???????????stringTempTableNext1 = "##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(加我為好友請注明排課軟件)
總結
- 上一篇: 用Python发送邮件给室友使其电脑关机
- 下一篇: 办公OA系统的设计与实现 软件工程 St