public List <Schedule> GetTeacherSchedule(Raschasovka load) { using (var db = new ScheduleKSTUContext()) { List <Schedule> scheduleList = db.Schedule .Include(s => s.ScheduleWeeks) .Where(s => s.TeacherId == load.TeacherId && s.SemesterId == GetCurrentSemester().Id).ToList(); List <Schedule> teachersFree = new List <Schedule>(); foreach (var s in scheduleList) { //weeksContains = !load.RaschasovkaWeeks.Where(rw => rw.HoursForWeek != 0).Select(w => new Week { Id = w.WeekId }).Except(s.ScheduleWeeks.Select(sw => new Week //{ // Id = sw.WeekId, //})).Any(); var set = new HashSet <int>(load.RaschasovkaWeeks.Where(rw => rw.HoursForWeek != 0).Select(w => (int)w.WeekId)); var set2 = s.ScheduleWeeks.Select(sw => (int)sw.WeekId); var equals = set.SetEquals(set2); if (equals == false && set.Count() == set2.Count()) { teachersFree.Add(s); } } scheduleList = scheduleList.Except(teachersFree).ToList(); return(scheduleList); } }
public int AddScheduleTimeslot(Raschasovka load, TimeslotsCriteriaWeight timeslot) { using (var db = new ScheduleKSTUContext()) { Schedule schedule; using (var dbContextTransaction = db.Database.BeginTransaction()) { try { schedule = new Schedule { GroupId = load.GroupId, TeacherId = load.TeacherId, SubjectId = load.SubjectId, SubjectTypeId = load.SubjectTypeId, SemesterId = GetCurrentSemester().Id, HourId = timeslot.HourId, DayOfWeekId = timeslot.DayId, AuditoriumId = timeslot.AuditoriumId, }; db.Schedule.Add(schedule); db.SaveChanges(); dbContextTransaction.Commit(); } catch (Exception ex) { dbContextTransaction.Rollback(); throw ex; } } return(schedule.Id); } }
private List <CriteriaRate> LessThenFourSubject(Raschasovka load, List <Timeslots> timeslots) { List <CriteriaRate> rate = new List <CriteriaRate>(); var groupSchedule = services.GetGroupSchedule(load); //<== int rateValue = 0; foreach (var day in services.GetDaysOfWeek()) { if (groupSchedule.Where(gs => gs.DayOfWeekId == day.Id).Count() >= 4) { rateValue = 0; } else { rateValue = 1; } rate.AddRange(timeslots.Where(ts => ts.DayId == day.Id).Select(ts => new CriteriaRate { timeslots = new Timeslots { DayId = ts.DayId, HourId = ts.HourId, AuditoriumId = ts.AuditoriumId } , Rate = rateValue })); } return(rate); }
private List <CriteriaRate> ScheduleShift(Raschasovka load, List <Timeslots> timeslots) { var slots = timeslots.Join(services.GetHours(), t => t.HourId, h => h.Id, (t, h) => new { t.DayId, t.HourId, t.AuditoriumId, h.Number }); List <CriteriaRate> rate = new List <CriteriaRate>(); var groupSchedule = services.GetGroupSchedule(load); //<== groupid int rateValue = 0; int hoursPerDay = services.GetHours().Count() / 2; foreach (var t in slots) { if (GetShift(load.CourseId) == 1) { if (t.Number <= hoursPerDay) { rateValue = 1; } else { rateValue = 0; } } else { if (t.Number > hoursPerDay) { rateValue = 1; } else { rateValue = 0; } } rate.Add(new CriteriaRate { timeslots = new Timeslots { DayId = t.DayId, HourId = t.HourId, AuditoriumId = t.AuditoriumId }, Rate = rateValue }); } return(rate); }
private List <CriteriaRate> CheckGap(Raschasovka load, List <Timeslots> timeslots) { var groupSchedule = services.GetGroupSchedule(load).Join(services.GetHours(), s => s.HourId, h => h.Id, (s, h) => new { s.Id, s.DayOfWeekId, s.HourId, hourNumber = h.Number }); //<== var tslots = timeslots.Join(services.GetHours(), t => t.HourId, h => h.Id, (t, h) => new { t.HourId, t.DayId, t.AuditoriumId, HourNumber = h.Number }); List <CriteriaRate> rate = new List <CriteriaRate>(); foreach (var t in tslots) { int gap = groupSchedule.Where(s => s.DayOfWeekId == t.DayId) .Where(s => s.hourNumber == t.HourNumber + 1 || s.hourNumber == t.HourNumber - 1).Count(); rate.Add(new CriteriaRate { timeslots = new Timeslots { DayId = t.DayId, HourId = t.HourId, AuditoriumId = t.AuditoriumId }, Rate = gap }); } return(rate); }
//public List<Schedule> GetGroupSchedule(long groupId) //{ // return db.Schedule // .Include(s => s.ScheduleWeeks) // .Where(s => s.GroupId == groupId && s.SemesterId == GetCurrentSemester().Id).ToList(); //} public List <Schedule> GetGroupSchedule(Raschasovka load) { using (var db = new ScheduleKSTUContext()) { List <Schedule> scheduleList = db.Schedule.Include(s => s.ScheduleWeeks) .Where(s => s.GroupId == load.GroupId && s.SemesterId == GetCurrentSemester().Id).ToList(); List <Schedule> groupFree = new List <Schedule>(); foreach (var s in scheduleList) { var set = new HashSet <int>(load.RaschasovkaWeeks.Where(rw => rw.HoursForWeek != 0).Select(w => (int)w.WeekId)); var set2 = s.ScheduleWeeks.Select(sw => (int)sw.WeekId); var equals = set.SetEquals(set2); if (equals == false && set.Count() == set2.Count()) { groupFree.Add(s); } } scheduleList = scheduleList.Except(groupFree).ToList(); return(scheduleList); } }
private List <CriteriaRate> MoreThanOneSubject(Raschasovka load, List <Timeslots> timeslots) { List <CriteriaRate> rate = new List <CriteriaRate>(); var groupSchedule = services.GetGroupSchedule(load); //<== foreach (var day in services.GetDaysOfWeek()) { if (groupSchedule.Where(gs => gs.DayOfWeekId == day.Id).Count() <= 1) { rate.AddRange(timeslots.Where(ts => ts.DayId == day.Id).Select(ts => new CriteriaRate { timeslots = new Timeslots { DayId = ts.DayId, HourId = ts.HourId, AuditoriumId = ts.AuditoriumId } , Rate = 1 })); } } return(rate); }
public List <Schedule> GetGroupScheduleWeeks(Raschasovka load) { using (var db = new ScheduleKSTUContext()) { bool weeksContains = false; var scheduleList = db.Schedule.Where(s => s.GroupId == load.GroupId && s.SemesterId == GetCurrentSemester().Id).ToList(); List <Schedule> teachersFree = new List <Schedule>(); foreach (var s in scheduleList) { weeksContains = load.RaschasovkaWeeks.Select(w => new Week { Id = w.WeekId }).Except(s.ScheduleWeeks.Select(sw => new Week { Id = sw.WeekId, })).Any(); if (weeksContains == true) { teachersFree.Add(s); } } scheduleList.Except(teachersFree); return(scheduleList.ToList()); } }
private List <TimeslotsWeight> UseCriteria(Criteria criteria, List <Timeslots> timeslots, Raschasovka load) { List <CriteriaRate> criteriaRate = new List <CriteriaRate>(); switch (criteria.Name) { case "MinGap": criteriaRate = CheckGap(load, timeslots); break; case "MoreThanOne": criteriaRate = MoreThanOneSubject(load, timeslots); break; case "LessThenFour": criteriaRate = LessThenFourSubject(load, timeslots); break; case "Shift": criteriaRate = ScheduleShift(load, timeslots); break; default: break; } if (criteriaRate.Count != 0) { services.InsertGenTimeslots(criteriaRate, load.Id); return(services.GetTimeslotsWeight()); } return(new List <TimeslotsWeight>()); }