一个排课软件的设计

news/2024/9/23 2:17:28/

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

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

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

 

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

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

 

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

 

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

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

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

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

开发这个软件的开发工具介绍:

开发工具下载地址:下载地址icon-default.png?t=L892http://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试用客户端icon-default.png?t=L892http://r068s0l6h.hn-bkt.clouddn.com/ERP%E8%AF%95%E7%94%A8%E8%AF%B4%E6%98%8E.rar

联系人:李先生

电话:0755-28181927

手机:13826519021 微信同号

QQ:420977542(加我为好友请注明排课软件)


http://www.ppmy.cn/news/871333.html

相关文章

一款免费开源的排课教务管理软件(附源码)

介绍&#xff1a; 这是一套支持私有化部署的教培行业教务管理系统&#xff0c;专为教培行业提供云化管理解决方案&#xff0c;是一套纯springbootmysql微服务项目。系统在功能上注重教务管理&#xff0c;具有灵活的排课、消课等核心业务功能&#xff1b;系统采用稳定的微服务架…

架构训练营:3-3设计备选方案与架构细化

3架构中期 什么是备选架构&#xff1f; 备选架构定义了系统可行的架构模式和技术选型 备选方案筛选过程 头脑风暴 &#xff1a;对可选技术进行排列组合&#xff0c;得到可能的方案 红线筛选&#xff1a;根据系统明确的约束和限定&#xff0c;一票否决某些方案&#xff08;主要…

Web 前端 Day 6

函数 <script>// parseInt(200px)// getSum(20, 30) ​ ​function sayHi() {console.log(hello,function!)} ​// 函数必须进行调用&#xff0c;才会执行sayHi()let age 21 ​// 函数要有返回值&#xff0c;一定要添加return关键字&#xff0c;否则返回值为undefinedfu…

Android7.0背光调节

涉及类&#xff1a; 一.简述 Android屏幕背光属于Android系统中display模块&#xff0c;display是从Power中分出来的&#xff0c;所以和Power有着密不可分的关系。背光调节中&#xff0c;又可以分为手动调节和自动调节两个功能&#xff0c;Android定义背光值0-255。 日常调试…

ANDROID 背光调节

Android的屏幕亮度好像在2.1+的时候提供了自动调节的功能,所以,如果当开启自动调节功能的时候, 我们进行调节好像是没有一点作用的,这点让我很是无语,结果只有进行判断,看是否开启了屏幕亮度的自动调节功能。 /** * 判断是否开启了自动亮度调节 * * @par…

LCD 背光

LCD的背光由驱动产生文件/sys/class/leds/lcdbacklight/brightness 对LCD的背光亮度调整&#xff0c; 原理是改变PWM信号的占空比来设置亮度 占空比是在连续的脉冲信号频率或周期不变的前提下定义的&#xff0c;用来衡量开关管导通或截至状况&#xff0c;在这个前提下&#…

Backlight 背光

转自&#xff1a;http://blog.csdn.net/jiajie961/article/details/6030405 1,总论 背光模块属于HAL层开发&#xff0c;HAL层开发&#xff0c;用一句话来概括就是定义一个hardware.h中定义的名称为宏HAL_MODULE_INFO_SYM的hw_module_t结构体&#xff0c; 然后实现结构体的相关…

Android 修改屏幕背光方案

极力推荐Android 开发大总结文章&#xff1a;欢迎收藏Android 开发技术文章大总结 本篇文章主要介绍 Android 开发中的部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容: 一、获取系统Settings 中的亮度 系统屏幕亮度值在&#xff08;0~255&#xff09;之间…