一个排课软件的设计

女朋友刚刚硕士毕业,费了不少周折进入深圳一家公立学校做教务管理工作,恰好学校交代一个给全校老师排课的任务,排了很久都没有排好,于是找到我,了解了他们大致需求后,于是我动手用我们公司的快速开发工具搭建了这个排课软件。

第一步了解需求:每个年级一个学期规定了要上的科目,以及每个科目每周的安排课时数。

于是我设计了下面这个界面来解决教学任务编排:

 

上面任务解决了每个班级需要配哪些课程,每个课程每周的节数

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

 

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

 

上面自动排课自动排课算法部分代码如下,贴出来跟大家分享下:

 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();
        }

 排完课程后还有些课程可以对调,调整下位置。这样每个老师每天上哪个班级的课程就一目了然呢。

 后面慢慢增加了排公共课的一些更人性化的设计,比如自习课,一些体育班级合上的课也可以了,基本完成,如果有兴趣的朋友可以通过下面的联系方式联系我,欢迎共同交流。

 

极致平台开发十大特点:

1. 一个数据库下可以同时进行N套业务系统开发,开发出来的产品可以根据您客户的需要按模块界面组发布,客户想要啥模块就可以给啥模块。而且一个数据库下开发所有功能,当客户需要从你的人力资源增加客户关系管理模块的时候,你只要做个升级包就可以了。解决企业多个业务系统信息孤岛问题。
2. 智能升级功能,当客户从A模块增加B模块的时候,您只需要做一个升级包即可,给客户升级后,客户原来录入的数据不会有影响,而且所有客户端都是智能感应智能升级,大大节省您的部署成本。
3. 工作流套打报表均可以运行时候自定义,比如费用报销单,您100家客户就有一百种费用报销的流程,套打的格式,用我们平台您只需要设计好这个费用报销单,至于哪个客户走什么流程,完全可以让客户自己去定义,而不需要像传统开发那样,提前在开发中设置好,100个客户就维护100套代码。套打也是如此。
4. 支持数据授权,当您开发多组织架构的系统的时候,我们只要业务单据引用组织机构即可,然后组织机构支持数据授权,这样就可以不需要编写任何一行代码就可以做到,组织与组织之间数据彼此隔离,我想给哪个用户看哪个组织的数据只要给这个用户这个组织的数据权限即可。
5. 支持字段授权,对于一些表的核心字段对用户进行屏蔽直接利用我们平台的字段授权功能即可,比如职员薪酬字段进行字段授权,让有的用户在看职员信息的时候,自动隐藏薪酬的数据。这也是无需编写任何一行代码。
6. 单据界面自动生成,我们开发的时候只要设计好实体,也就是传统开发所说的表结构即可,还可以设置哪些字段是必录,可见,不允许重复,在界面生成的时候,会自动生成一个界面,而且这个界面的增删改查是无需写一行代码的,您只要对您特有业务逻辑编码即可,相对传统开发,你代码量可以节省2/3,开发周期缩短2/3
7.一次开发同时具有单机局域互联网三个版本,客户想要单机就给单机想要互联网版就给互联网版。 

8.强大的公式引擎,让您可以灵活设计计算类的项目,比如工资,预算。

9.包含强大的各种控件,比如文本控件支持F8调用,编码名称自动带出。Grid控件支持表头过滤,单元格融合,固定列,表格列,表格行各种公式汇总,复合表头,表格宽度可以自己随意调整,而且关闭后会自动记录之前的宽度。还支持表格列随意调整顺序。

10.平台内置很多基础功能,比如权限管理,用户角色管理,还有实施的一些导入导出工具都能帮助客户大大提高一个项目验收进度。

 

官网:www.jeez.com.cn
平台介绍:www.jeez.com.cn/jbf  
平台下载地址:http://www.jeez.com.cn/upfiles/jbfsetuppro.rar

(下载即可有3个月免费试用)
联系电话:13826519021 18988763421 QQ:180315586  420977542 (加我注明极致软件即可)

平台销售经理:李先生 

将互联网时代的管理软件做到极致!
==================================================================

 

 

 

转载于:https://www.cnblogs.com/Jeez_JBF/archive/2013/03/17/Stone04191.html

排课表系统可行性研究报告 一、 引言 1.1编写目的 编本可行性报告目的是为了以后排课工作节省时间、提高教学效率、便于课程设计的管理。 1.2 项目背景 a. 软件的名称是排课表系统。 b. 项目的委托单位:中州大学信息工程学院。 c. 本项目是08信管2班张钦钦、张杰、李水莲、王珂、曹建超五个人参与软件过程开发。 2可行性研究前提 2.1 要求 a 功能完善。 b 便于操作。 c 结构严紧。 d 便于管理。 e 使用方便、快捷。 f 易于在数据库上实现。 2.2 目标 a 本排课表系统目标是每学期都可使用. b 机器代替手工工作。 c 便于课程教学的管理,减少人工排课的工作量。 d 可以进行精确查询。 e 与数据库连接,研究所处理数据的最优算法,提高计算机的处理速度。 f不断改善软件开发前各项决策系统的研发。 二、可行性分析 1、对现有系统的分析: 1.1现有系统是人工操作的。 1.2费时费力。 1.3工作效率低。 1.4容易出错。 1.5人力投入费用高。 2、系统的可行性从四个方面考虑 2.1、技术可行性 a.通过研究及查资料了解到当前的技术可以实现这个课程表管理系统。 b.五个人为一组,所学专业为计算机信息管理能满足此系统的开发。 c. 有充足的时间完成本系统。 2.2经济可行性 a.经过调查了解各个学校也有这个经济实力使用我们开发的课程表管理系统。 b.使用本系统不受时间限制。 c.排课一般为每学期一次,系统工作量不大。 d.本系统是学生自己开发的小型软件,设备和软件配置变化对支出和效益的影响比较小。 2.3、操作可行性 操作系统:我们开发的课程表管理系统适应于各个操作系统,比如windows xp ,vista,unix,linux等。 支持环境:IIS5.0数据库:Microsoft SQL Server 2000 2.4、法律可行性 我们开发的课程表管理系统没有任何抄袭,不会引起任何侵权问题。 3、系统的简要描述 这个系统要与数据库连接,并依赖于数据库,可以方便的查询课程和上课时间,上课地点,任课老师,可自动编排课程表。 4、与现有系统比较的优越性 这个系统比原系统更可靠,快速,且减少了出错的几率,减少了人力的投入,降低了成本,提高了工作效率,减少了编排课程表人员的工作量和劳动强度。 5、结论意见 通过分析可着手开发 三.需求分析 1.开发排课系统的必要性 现在课程表的编排使用的是人工,人来完成课程编排增加了人的劳动量,而且人工容易出错,人力投入资金多,效率不高,使用的范围有限,鉴于以上这些情况很有必要开发课程表排课系统。 2.此软件能实现的功能 只需操作人员输入校名,级别,班级,专业名及授课教师名,这样本软件就可以自动完成一周内各年级各专业的每个班级所上课程,上课时段,上课地点及任课老师的编排工作,操作人员不必过多参与。 3.动态数据 a.输入学校名。 b.输入院系名。 c.输入班级名。 d.输入专业课名及对应的授课教师名。 e.选择规定课程的时段。 4.其他非功能需求 本软件应具有可维护性,可扩展性,可测试性,兼容性. 5.使用范围 此系统不设密码,任何学校都可以使用。 6.功能模块 模块一:输入学校名,院系名,班级名,专业课名及授课教师名。 模块二:显示结果,支持手工修改,打印,并可以导出到word文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值