示例#1
0
        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);
        }
示例#2
0
        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;
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }