|
using System; |
|
| using System.Collections.Generic; | |
| using System.Linq; | |
| using System.Web; | |
| using WebDAL; | |
| using WebSupervisor.Models; | |
| using System.Data; | |
| namespace WebSupervisor.Code.Placement | |
| { | |
| public class MakePlacement | |
| { | |
| static List<int> spareclass = new List<int> { 12, 13, 23, 24, 34, 35, 45, 67, 68, 78, 79, 89, 1011, 1112, 1012 };//枚举所有的连续节次 | |
| List<ClassesModel> listclasses = new List<ClassesModel>(); | |
| List<TeachersModel> listsupervisor = new List<TeachersModel>(); | |
| List<CheckClassModel> listcheckcount = new List<CheckClassModel>(); | |
| List<SpareTimeModel> listsparetime = new List<SpareTimeModel>(); | |
| List<ArrageModel> listarrage = new List<ArrageModel>();//安排表 | |
| List<SpareTimeModel> temp = new List<SpareTimeModel>();//用于暂存sparetime的数据,提高查询效率 | |
| List<SpareTimeModel> listchange = new List<SpareTimeModel>();//存储更新过的数据,避免过多的数据更新 | |
| List<ClassesModel> listmodfiyclass = new List<ClassesModel>();//存储更新过的数据,避免过多的数据更新 | |
| private int Week;//周数 | |
| private int Day;//上课天 | |
| private int Index = 0;//数组spareclass的索引 | |
| private ArrageConfigModel config = null; | |
| public MakePlacement(ArrageConfigModel config) | |
| { | |
| this.config = config; | |
| } | |
| /// <summary> | |
| /// 筛选数据 | |
| /// </summary> | |
| /// <param name="college">学院</param> | |
| /// <returns>0代表失败,1代表成功</returns> | |
| private int initdata(string college) | |
| { | |
| try | |
| { | |
| string select_teacher = string.Format("select * from teachers where college='{0}'", college); | |
| listsupervisor = DBHelper.ExecuteList<TeachersModel>(select_teacher, CommandType.Text, null);//督导表 | |
| if (listsupervisor.Count >= 0) | |
| { | |
| foreach (TeachersModel tmodel in listsupervisor) | |
| { | |
| if (tmodel.Indentify==1) | |
| { | |
| string select_sparetime = string.Format("select * from sparetime where tid='{0}'", tmodel.Tid); | |
| string select_checkclass = string.Format("select * from checkclass where tid='{0}'", tmodel.Tid); | |
| List<SpareTimeModel> sptemp = DBHelper.ExecuteList<SpareTimeModel>(select_sparetime, CommandType.Text, null); | |
| List<CheckClassModel> chtemp = DBHelper.ExecuteList<CheckClassModel>(select_checkclass, CommandType.Text, null); | |
| CopyDataToList<SpareTimeModel>(sptemp, listsparetime); | |
| CopyDataToList<CheckClassModel>(chtemp, listcheckcount); | |
| } | |
| string select_class = string.Format("select * from classes where teachername like '%{0}%'", tmodel.TeacherName); | |
| List<ClassesModel> classestemp = DBHelper.ExecuteList<ClassesModel>(select_class, CommandType.Text, null); | |
| CopyDataToList<ClassesModel>(classestemp, listclasses); | |
| } | |
| return 1; | |
| } | |
| else | |
| { | |
| return 0; | |
| } | |
| } | |
| catch (Exception ) | |
| { | |
| return 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 将临时筛选的数据放入全局变量 | |
| /// </summary> | |
| /// <typeparam name="T"></typeparam> | |
| /// <param name="source">临时数据</param> | |
| /// <param name="target">保存变量</param> | |
| private void CopyDataToList<T>(List<T> source,List<T> target) | |
| { | |
| foreach (T t in source) | |
| { | |
| target.Add(t); | |
| } | |
| } | |
| /// <summary> | |
| /// 重新生成听课安排 | |
| /// </summary> | |
| public void ReCreatPlan(string college) | |
| { | |
| if (ResetArrageData()>0) | |
| { | |
| ResetCheckClass(); | |
| ResetClases(); | |
| ResetSpareTime(); | |
| CreatPlan(college); | |
| } | |
| } | |
| /// <summary> | |
| /// 生成听课安排 | |
| /// </summary> | |
| public void CreatPlan(string college) | |
| { | |
| if (config!=null&& initdata(college)>0) | |
| { | |
| for (Week = config.Bweek; Week < config.Eweek; Week++) | |
| { | |
| UpdataWeek(listcheckcount); | |
| if (GetWeekSpareCount(Week)>=config.MinPeople) | |
| { | |
| for (Day=1;Day<6;Day++) | |
| { | |
| if (GetDaySpareCount(Day) >= config.MinPeople && GetWeekArrageCount(Week) <= config.PlanNumber - 1) | |
| { | |
| UpdataDay(listcheckcount); | |
| for (Index = 0; Index < 15; Index++) | |
| { | |
| ClassesModel classmodel = GetClass(Week, Day, spareclass[Index]); | |
| //做非空判断,如果为空就不满足听课条件了(没上课老师),循环继续 | |
| if (classmodel != null) | |
| { | |
| List<SpareTimeModel> sptlist = GetSpareTimeList(spareclass[Index]); | |
| string group = "";//督导小组 | |
| int count = sptlist.Count; | |
| if (count < config.MinPeople) | |
| { | |
| break; | |
| } | |
| else if (count >= config.MinPeople && count <= config.MaxPeople) | |
| { | |
| foreach (SpareTimeModel spt in sptlist) | |
| { | |
| group = group + "," + IdToName(spt.Tid); | |
| } | |
| WritePlacement(sptlist, classmodel, group); | |
| } | |
| else if (count > config.MaxPeople) | |
| { | |
| Random r = new Random(); | |
| int numpeople = r.Next(config.MinPeople,config.MinPeople); | |
| for (int i = 0; i <numpeople; i++) | |
| { | |
| group = group + "," + IdToName(sptlist[i].Tid); | |
| } | |
| WritePlacement(sptlist, classmodel, group); | |
| } | |
| else | |
| { | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| UpdateAll(); | |
| } | |
| } | |
| /// <summary> | |
| /// 所有督导的周听课归零 | |
| /// </summary> | |
| /// <param name="list"></param> | |
| private void UpdataWeek(List<CheckClassModel> list) | |
| { | |
| temp.Clear();//清空临时数据 | |
| foreach (CheckClassModel model in list) | |
| { | |
| model.WeekNumber = 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 所有督导的日听课归零 | |
| /// </summary> | |
| /// <param name="list"></param> | |
| private void UpdataDay(List<CheckClassModel> list) | |
| { | |
| foreach (CheckClassModel model in list) | |
| { | |
| model.DayNumber = 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 更新周听课,日听课,总听课 | |
| /// </summary> | |
| /// <param name="tid"></param> | |
| private void UpdateCheckCount(string tid) | |
| { | |
| foreach (CheckClassModel cmodel in listcheckcount) | |
| { | |
| if (cmodel.Tid.Equals(tid)) | |
| { | |
| cmodel.WeekNumber++; | |
| cmodel.DayNumber++; | |
| cmodel.total++; | |
| } | |
| } | |
| } | |
| /// <summary> | |
| /// 提交所有数据 | |
| /// </summary> | |
| private void UpdateAll() | |
| { | |
| foreach (ClassesModel model in listmodfiyclass) | |
| { | |
| DBHelper.Update<ClassesModel>(model); | |
| } | |
| foreach (SpareTimeModel spt in listchange) | |
| { | |
| string update = string.Format("update sparetime set tid={0},week={1},day={2},classnumber={3},assign={4} where tid={5} and week={6} and day={7} and classnumber={8}", | |
| spt.Tid,spt.Week,spt.Day,spt.ClassNumber,spt.Assign, spt.Tid, spt.Week, spt.Day, spt.ClassNumber); | |
| DBHelper.ExecuteNonQuery(update,CommandType.Text,null); | |
| } | |
| foreach (CheckClassModel cmodel in listcheckcount) | |
| { | |
| DBHelper.Update<CheckClassModel>(cmodel); | |
| } | |
| foreach (ArrageModel arrage in listarrage) | |
| { | |
| DBHelper.Insert<ArrageModel>(arrage); | |
| } | |
| } | |
| /// <summary> | |
| /// 查询当前周次的听课安排 | |
| /// </summary> | |
| /// <param name="week"></param> | |
| /// <returns></returns> | |
| private int GetWeekArrageCount(int week) | |
| { | |
| int count = 0; | |
| foreach (ArrageModel arragemodel in listarrage) | |
| { | |
| foreach (ClassesModel classmodel in listclasses) | |
| { | |
| if (arragemodel.Cid.Equals(classmodel.Cid)&&classmodel.Week.Equals(week)) | |
| { | |
| count++; | |
| } | |
| } | |
| } | |
| return count; | |
| } | |
| /// <summary> | |
| /// 查询指定周次的督导人数 | |
| /// </summary> | |
| /// <param name="Week"></param> | |
| /// <returns></returns> | |
| private int GetWeekSpareCount(int week) | |
| { | |
| int count = 0; | |
| foreach (SpareTimeModel model in listsparetime) | |
| { | |
| if (model.Week.Equals(week)) | |
| { | |
| count++; | |
| temp.Add(model); | |
| } | |
| } | |
| return count; | |
| } | |
| /// <summary> | |
| /// 查询指定天的督导人数 | |
| /// </summary> | |
| /// <param name="day"></param> | |
| /// <returns></returns> | |
| private int GetDaySpareCount(int day) | |
| { | |
| int count = 0; | |
| List<SpareTimeModel> secondtemp = new List<SpareTimeModel>(); | |
| foreach (SpareTimeModel model in temp) | |
| { | |
| if (model.Day.Equals(day)) | |
| { | |
| count++; | |
| secondtemp.Add(model); | |
| } | |
| } | |
| temp.Clear(); | |
| foreach (SpareTimeModel model in secondtemp) | |
| { | |
| temp.Add(model); | |
| } | |
| return count; | |
| } | |
| /// <summary> | |
| /// 获取周天节次对应的空闲信息 | |
| /// </summary> | |
| /// <param name="classnumber"></param> | |
| /// <returns></returns> | |
| private List<SpareTimeModel> GetSpareTimeList(int classnumber) | |
| { | |
| List<SpareTimeModel> list = new List<SpareTimeModel>(); | |
| List<CheckClassModel> truelist = new List<CheckClassModel>(); | |
| listcheckcount=listcheckcount.OrderBy(m => m.total).ToList(); | |
| foreach (CheckClassModel model in listcheckcount) | |
| { | |
| if (model.DayNumber==config.DayListen&&model.WeekNumber<config.WeekListen) | |
| { | |
| truelist.Add(model); | |
| } | |
| } | |
| foreach (CheckClassModel cmodel in truelist) | |
| { | |
| foreach (SpareTimeModel model in temp) | |
| { | |
| if (model.ClassNumber.Equals(classnumber)&&cmodel.Tid.Equals(model.Tid)) | |
| { | |
| list.Add(model); | |
| break; | |
| } | |
| } | |
| } | |
| return list; | |
| } | |
| /// <summary> | |
| /// 选择周天节次对应的课程,升序排列选第一个门 | |
| /// </summary> | |
| /// <param name="week"></param> | |
| /// <param name="day"></param> | |
| /// <param name="classnumber"></param> | |
| /// <returns></returns> | |
| private ClassesModel GetClass(int week,int day ,int classnumber) | |
| { | |
| List<ClassesModel> list = new List<ClassesModel>(); | |
| string classtype = ContorlProportion();//控制理论和实验课的比例 | |
| foreach (ClassesModel model in listclasses) | |
| { | |
| if (model.Week.Equals(week)&&model.Day.Equals(day)&&model.ClassNumber.Equals(classnumber)&&model.ClassType.Equals(classtype)) | |
| { | |
| list.Add(model); | |
| } | |
| } | |
| list = list.OrderBy(m => m.CheckNumber).ToList(); | |
| //做数量判断,如果为0表示没有上课老师,因为上面做了比例控制,可能会没有实验或者理论课 | |
| if (list.Count>0) | |
| { | |
| return list[0]; | |
| } | |
| else | |
| { | |
| return null; | |
| } | |
| } | |
| /// <summary> | |
| /// 控制理论课和实验课的比例 | |
| /// </summary> | |
| /// <returns></returns> | |
| private string ContorlProportion() | |
| { | |
| Random rd = new Random(); | |
| int i = rd.Next(1, 100); | |
| string classtype = ""; | |
| if (i > 0 && i <=config.Apercent) | |
| { | |
| classtype = "理论"; | |
| } | |
| else | |
| { | |
| classtype = "实验"; | |
| } | |
| return classtype; | |
| } | |
| /// <summary> | |
| /// 将教师id转换为名字 | |
| /// </summary> | |
| /// <param name="tid"></param> | |
| /// <returns></returns> | |
| private string IdToName(string tid) | |
| { | |
| foreach (TeachersModel model in listsupervisor) | |
| { | |
| if (tid.Equals(model.Tid)) | |
| { | |
| return model.TeacherName; | |
| } | |
| } | |
| return tid; | |
| } | |
| /// <summary> | |
| /// 生成听课安排 | |
| /// </summary> | |
| /// <param name="sptlist"></param> | |
| /// <param name="model"></param> | |
| /// <param name="group"></param> | |
| private void WritePlacement(List<SpareTimeModel> sptlist,ClassesModel model,string group) | |
| { | |
| ArrageModel arragemodel = new ArrageModel(); | |
| arragemodel.Cid = model.Cid; | |
| arragemodel.SuperVisors = group.Substring(1); | |
| arragemodel.Stauts = 0; | |
| arragemodel.Pid = model.Cid.Trim() + sptlist[0].Week + sptlist[0].Day + sptlist[0].ClassNumber.ToString(); | |
| listarrage.Add(arragemodel); | |
| model.CheckNumber++; | |
| listmodfiyclass.Add(model); | |
| foreach (SpareTimeModel spt in sptlist) | |
| { | |
| UpdateCheckCount(spt.Tid); | |
| spt.Assign = 1; | |
| } | |
| listchange.AddRange(sptlist); | |
| } | |
| /// <summary> | |
| /// 课堂抽查次数归零 | |
| /// </summary> | |
| private void ResetClases() | |
| { | |
| foreach (ClassesModel m in listclasses) | |
| { | |
| m.CheckNumber = 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 空闲时间已安排-->未安排 | |
| /// </summary> | |
| private void ResetSpareTime() | |
| { | |
| foreach (SpareTimeModel m in listsparetime) | |
| { | |
| m.Assign = 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 督导的总听课次数归零 | |
| /// </summary> | |
| private void ResetCheckClass() | |
| { | |
| foreach (CheckClassModel m in listcheckcount) | |
| { | |
| m.DayNumber = 0; | |
| m.WeekNumber = 0; | |
| m.total = 0; | |
| } | |
| } | |
| /// <summary> | |
| /// 删除临时数据 | |
| /// </summary> | |
| /// <returns>大于1-->成功;等于0失败</returns> | |
| private int ResetArrageData() | |
| { | |
| return DBHelper.ExecuteNonQuery(string.Format("delete from arrage where Stauts={0}",0),CommandType.Text,null); | |
| } | |
| public static void Test() | |
| { | |
| TeachersModel model = new TeachersModel(); | |
| model.College = "信息工程学院"; | |
| model.Email = "823894716@qq.com"; | |
| model.Indentify = 1; | |
| model.Islimit = 1; | |
| model.Password = "123456"; | |
| model.Phone = "13650421544"; | |
| model.TeacherName = "刘莉(讲师(高校))"; | |
| model.Tid = "1994"; | |
| model.Title = "教授"; | |
| model.TeacherRoom = "物理教研室"; | |
| DBHelper.Update<TeachersModel>(model); | |
| } | |
| } | |
| } |