public List <SortedScheduleConstrains> GetSortedStationConstrains(int wsid) { List <SortedScheduleConstrains> list = new List <SortedScheduleConstrains>(); var stations = GetStations(StationStatus.Active); var res = Invoker.GetSortedStationConstrains(wsid); foreach (var s in stations) { for (int i = 0; i < 7; i++) { for (int j = 0; j < 3; j++) { var constrain = res.Find(x => x.StationId == s.Id && x.Day == i && x.ShiftTime == j); if (constrain == null) { constrain = new SortedScheduleConstrains() { Day = i, ShiftTime = j, Priority = s.Priority, StationId = s.Id, Status = s.Status, NumberOfWorkers = s.NumberOfWorkers }; } list.Add(constrain); } } } list = list.FindAll(x => x.Status == StationStatus.Active); return(list); }
public static void GenerateWorkSchedule() { Init(); ///TODO: take holidays in consideration int scCount = sortedStationsConstrains.Count; for (int i = 0; i < scCount; i++) { int nextSc = GetNextStationsConstrainsIndex(); SortedScheduleConstrains currentSc = sortedStationsConstrains[nextSc]; sortedStationsConstrains.RemoveAt(nextSc); int sid = currentSc.StationId; int day = currentSc.Day; int shift = currentSc.ShiftTime; if (currentSc.Status == StationStatus.Active && workSchedule.Schedule.Shifts[Shift.GetShiftIndex((DayOfWeek)day, (PartOfDay)shift)].IsActive) { int maxWorkers = currentSc.NumberOfWorkers; var fitsWorkers = CalculateWorkersGrade(sid, day, shift, maxWorkers); AddWorkersToSchedule(sid, day, shift, fitsWorkers); } } workSchedule.Capacity = (double)SubmittedWorkers / MaxSubmittedWorkers; }
private static double CalculateProbabilityOfShiftToBeSet(SortedScheduleConstrains current) { var stationConstrains = sortedStationsConstrains.FindAll(x => x.StationId == current.StationId); int needeWorkers = stationConstrains.Sum(x => x.NumberOfWorkers); int possibleOptions = 0; foreach (var w in workers) { if (WorkersStations.Any(x => x.Item1 == current.StationId && x.Item2.TrimStart('0') == w.IdNumber.TrimStart('0'))) { var wcs = workersConstrains.Find(x => x.WorkerID == w.IdNumber); if (wcs != null) { foreach (var sc in stationConstrains) { if (!wcs.Constrains[sc.Day][sc.ShiftTime]) { bool workerAlreadyAssigned = false; var assignedShift = workSchedule.Schedule.Shifts[Shift.GetShiftIndex((DayOfWeek)sc.Day, (PartOfDay)sc.ShiftTime)]; if (assignedShift != null && assignedShift.Stations != null) { foreach (var st in assignedShift.Stations) { if (st.Workers.Find(x => x.IdNumber == w.IdNumber) != null) { workerAlreadyAssigned = true; break; } } } if (!workerAlreadyAssigned) { possibleOptions += sc.NumberOfWorkers; } } } } } } return((double)possibleOptions / needeWorkers); }
public static List <SortedScheduleConstrains> GetSortedStationConstrains(int wsid) { List <SortedScheduleConstrains> list = new List <SortedScheduleConstrains>(); try { List <Tuple <string, object> > args = new List <Tuple <string, object> >(); args.Add(new Tuple <string, object>("WSID", wsid)); var ds = GetDataSet("sp_GetSortedStationConstrains", args); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { var row = ds.Tables[0].Rows[i]; int day = (int)row["Day"]; int shift = (int)row["ShiftTime"]; int id = (int)row["StationId"]; int priority = (int)row["Priority"]; int numberOfWorkers = (int)row["NumberOfWorkers"]; StationStatus status = (StationStatus)row["Status"]; var ssc = new SortedScheduleConstrains(); ssc.StationId = id; ssc.Status = status; ssc.Day = day; ssc.NumberOfWorkers = numberOfWorkers; ssc.Priority = priority; ssc.ShiftTime = shift; list.Add(ssc); } } catch { } return(list); }