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