女朋友刚刚硕士毕业,费了不少周折进入深圳一家公立学校做教务管理工作,恰好学校交代一个给全校老师排课的任务,排了很久都没有排好,于是找到我,了解了他们大致需求后,于是我动手用我们公司的快速开发工具搭建了这个排课软件。
第一步了解需求:每个年级一个学期规定了要上的科目,以及每个科目每周的安排课时数。
于是我设计了下面这个界面来解决教学任务编排:

上面任务解决了每个班级需要配哪些课程,每个课程每周的节数
下面就要解决老师的问题,每个老师教哪几个课程,哪个课程每周安排几节的问题,于是有了如下教师任务界面:

这样哪个老师教哪个班哪门课教几节问题就解决了,有了这些便设计个自动排课界面如下:

上面自动排课自动排课算法部分代码如下,贴出来跟大家分享下:
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();
}
|
排完课程后还有些课程可以对调,调整下位置。这样每个老师每天上哪个班级的课程就一目了然呢。
后面慢慢增加了排公共课的一些更人性化的设计,比如自习课,一些体育班级合上的课也可以了,基本完成,如果有兴趣的朋友可以通过下面的联系方式联系我,欢迎共同交流。
开发这个软件的开发工具介绍:
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(加我为好友请注明排课软件)

本文讲述了作者为女朋友所在学校的教务管理工作设计排课软件的过程。通过使用快速开发工具,实现了教学任务分配、教师任务编排和自动排课等功能,解决了排课难题。并分享了部分自动排课算法的代码,还提供了开发工具和ERP试用的下载链接,以及联系人信息。


被折叠的 条评论
为什么被折叠?



