Exemple #1
0
        private VirtualMidNight GetMidNightOFShift(AssignedWGDShift shift, MidNightTimeSt midNight)
        {
            try
            {
                VirtualMidNight result    = new VirtualMidNight();
                ShiftPair       firstPair = shift.Pairs.OrderBy(x => x.From).First();

                ShiftPair lastPair = shift.Pairs.OrderBy(x => x.From).Last();

                int      time = 0;
                DateTime date = new DateTime();

                //فرض شده است که شیفت بهم چسبیده نداریم
                //برای شیفتی که انتهای آن فردا است
                if (lastPair.To > DayMinutes &&
                    lastPair.To > midNight.Start && !EndOfDayIsForce)
                {
                    date   = shift.Date;
                    time   = lastPair.To;//+ (int)lAfterTelorance1;
                    result = new VirtualMidNight(date, time, firstPair.BeforeTolerance, lastPair.AfterTolerance);
                }

                result = new VirtualMidNight(shift.Date, midNight.Start, midNight.BeforeTelorance, midNight.AfterTelorance);
                return(result);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 /// <summary>
 /// آیا تردد ورودی در بازه زمانی شیفت ورودی میگنجد
 /// </summary>
 /// <param name="shift">شیفت مقایسه</param>
 /// <param name="basicTraffic">تردد مقایسه</param>
 /// <returns></returns>
 public bool IsTrafficInShift(AssignedWGDShift shift, BasicTraffic basicTraffic)
 {
     foreach (ShiftPair sp in shift.Pairs)
     {
         if (basicTraffic.Time <= sp.To && basicTraffic.Time >= sp.From)
         {
             return(true);
         }
     }
     return(false);
 }
 /// <summary>
 /// آیا آیتم جاری در بازه زمانی شیفت ورودی میگنجد
 /// </summary>
 /// <param name="shift">شیفت مقایسه</param>
 public bool IsTrafficInShift(AssignedWGDShift shift)
 {
     foreach (ShiftPair sp in shift.Pairs)
     {
         if (trafficProxyList[curentIndex].Time <= sp.To && trafficProxyList[curentIndex].Time >= sp.From)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #4
0
        private bool HasIntersect(AssignedWGDShift shift, GTS.Clock.Business.TrafficMapping.VirtualMidNight.VirtualDayRegion region)
        {
            if (shift.Date != region.Date)
            {
                return(false);
            }
            int fromTime = region.StartDateTime.Hour * 60 + region.StartDateTime.Minute;
            int toTime   = region.EndDateTime.Hour * 60 + region.EndDateTime.Minute;

            if (shift != null && shift.PairCount > 0)
            {
                foreach (ShiftPair pair in shift.Pairs)
                {
                    IList <IPair> tmp1 = new List <IPair>();

                    if (pair.To <= DayMinutes)
                    {
                        tmp1.Add(pair);
                    }
                    else
                    {
                        tmp1.Add(new ShiftPair()
                        {
                            From = pair.From, To = DayMinutes - 1
                        });
                    }


                    IList <IPair> tmp2 = new List <IPair>();
                    tmp2.Add(new ShiftPair()
                    {
                        From = fromTime, To = toTime
                    });

                    var pairsResult = (from BB in
                                       (from A in tmp1
                                        from B in tmp2
                                        select new PairableScndCnpValuePair(Math.Max(A.From, B.From), Math.Min(A.To, B.To)))
                                       where BB.From < BB.To
                                       select BB);
                    return(pairsResult.OfType <IPair>().ToList <IPair>().Count > 0);
                }
            }
            return(false);
        }
Exemple #5
0
        /// <summary>
        /// مشخص سازی قسمت اصلی بازه با توجه به شیفت
        /// </summary>
        /// <param name="vmn"></param>
        /// <param name="_person"></param>
        public FirstOrSecond GetMainDayRegion(VirtualMidNight vmn, Person _person)
        {
            if (vmn.SecondMid.Length == 0)
            {
                return(FirstOrSecond.First);
            }
            if (vmn.FirstMid.Length == 0)
            {
                return(FirstOrSecond.Second);
            }


            DateTime firstRegDate  = vmn.FirstMid.Date;
            DateTime secondRegDate = vmn.SecondMid.Date;

            AssignedWGDShift shift1 = (AssignedWGDShift)_person.GetShiftByDate(firstRegDate);
            AssignedWGDShift shift2 = (AssignedWGDShift)_person.GetShiftByDate(secondRegDate);

            if (shift1.PairCount > 0 && shift2.PairCount > 0)
            {
                if (HasIntersect(shift1, vmn.FirstMid))
                {
                    return(FirstOrSecond.First);
                }
                else if (HasIntersect(shift2, vmn.SecondMid))
                {
                    return(FirstOrSecond.Second);
                }
            }
            else if (shift2.PairCount == 0)
            {
                return(FirstOrSecond.First);
            }
            else if (shift1.PairCount == 0)
            {
                return(FirstOrSecond.Second);
            }

            return(FirstOrSecond.First);
        }
Exemple #6
0
        /// <summary>
        /// دو شیفت را دریافت کرده و بررسی مسکند که آیا این دو بهم چسبیده اند یا خیر
        /// </summary>
        /// <param name="telorance">مقدار تلورانسی که اگر این دو شیفت با هم فاصله داشته باشند
        /// هم بهم چسبیده بحساب می آیند</param>
        private bool AreShiftsConnected(AssignedWGDShift shift1, AssignedWGDShift shift2, int telorance)
        {
            try
            {
                ShiftPair fSpwd1            = shift1.Pairs.OrderBy(x => x.From).FirstOrDefault();
                decimal   fBeforeTelorance1 = fSpwd1.BeforeTolerance;
                decimal   fAfterTelorance1  = fSpwd1.AfterTolerance;
                ShiftPair lSpwd1            = shift1.Pairs.OrderBy(x => x.From).LastOrDefault();
                decimal   lBeforeTelorance1 = lSpwd1.BeforeTolerance;
                decimal   lAfterTelorance1  = lSpwd1.AfterTolerance;

                ShiftPair fSpwd2            = shift2.Pairs.OrderBy(x => x.From).FirstOrDefault();
                decimal   fBeforeTelorance2 = fSpwd2.BeforeTolerance;
                decimal   fAfterTelorance2  = fSpwd2.AfterTolerance;
                ShiftPair lSpwd2            = shift2.Pairs.OrderBy(x => x.From).LastOrDefault();
                decimal   lBeforeTelorance2 = lSpwd2.BeforeTolerance;
                decimal   lAfterTelorance2  = lSpwd2.AfterTolerance;


                if (shift1.Date == shift2.Date)
                {
                    if (lSpwd1.To + lAfterTelorance1 + telorance >= fSpwd2.From - fAfterTelorance2)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                //اگر تاریخ ها باهم تفاوت داشت باید بررسی کنیم که آیا
                //شیفت در فردا ادامه دارد و اگر دارد تا شیفت بعدی ادامه دارد یا خیر
                else if (shift2.Date > shift1.Date && lSpwd1.To + lAfterTelorance1 > DayMinutes)
                {
                    int      days    = Convert.ToInt32((lSpwd1.To + lAfterTelorance1) / DayMinutes);
                    DateTime endDate = shift1.Date.AddDays(days);

                    int remainTime = lSpwd1.To + (int)lAfterTelorance1 - days * DayMinutes;
                    if (endDate >= shift2.Date && remainTime + telorance >= fSpwd2.From - fBeforeTelorance2)
                    {
                        return(true);
                    }
                }
                else if (shift1.Date > shift2.Date && lSpwd2.To + lAfterTelorance2 > DayMinutes)
                {
                    int      days    = Convert.ToInt32((lSpwd2.To + lAfterTelorance2) / DayMinutes);
                    DateTime endDate = shift2.Date.AddDays(days);

                    int remainTime = lSpwd2.To + (int)lAfterTelorance2 - days * DayMinutes;
                    if (endDate >= shift1.Date && remainTime + telorance >= fSpwd1.From - fBeforeTelorance1)
                    {
                        return(true);
                    }
                }
                return(false);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Exemple #7
0
        public VirtualMidNightList(Person _person, bool endOfDayIsForce, DateTime calcFromDate, DateTime calcToDate, IList <AssignedRuleParameter> ruleParameterList)
        {
            try
            {
                RuleParameterList = ruleParameterList;

                this.CalcFromDate = calcFromDate;
                this.CalcToDate   = calcToDate;
                this.person       = _person;
                EndOfDayIsForce   = endOfDayIsForce;
                //{
                //    AssignedWGDShift assignWGD = (AssignedWGDShift)_person.GetShiftByDate(_person.CalcDateZone.FromDate);
                //    if (assignWGD.Pairs.Count > 0)
                //    {
                //        ShiftPair fSpwd = assignWGD.Pairs.OrderBy(x => x.From).First();
                //        ShiftPair lSpwd = assignWGD.Pairs.OrderBy(x => x.From).Last();
                //        decimal lAfterTelorance = 0;// lSpwd.AfterTolerance;
                //        int to = lSpwd.To + (int)lAfterTelorance;
                //        if (to > DayMinutes)
                //        {
                //            to -= DayMinutes;
                //        }
                //        VirtualMidNight vmn = new VirtualMidNight(assignWGD.Date, to, fSpwd.BeforeTolerance, lSpwd.AfterTolerance);
                //        _vmnList.Add(vmn);
                //    }
                //}
                MidNightTimeSt midNightTime   = this.GetMidNightTime(_person.CalcDateZone.FromDate);
                MidNightTimeSt beforeMidNight = new MidNightTimeSt()
                {
                    Start = -1
                };
                MidNightTimeSt lastMidNight = null;
                foreach (DateTime CalcDate in _person.CalcDateZone)
                {
                    try
                    {
                        beforeMidNight = midNightTime;
                        midNightTime   = this.GetMidNightTime(CalcDate);
                        AssignedWGDShift tomorrowShift = (AssignedWGDShift)_person.GetShiftByDate(CalcDate.AddDays(1));
                        AssignedWGDShift todayShift    = (AssignedWGDShift)_person.GetShiftByDate(CalcDate);


                        if (todayShift.Pairs.Count > 0)
                        {
                            lastMidNight = (MidNightTimeSt)midNightTime.Clone();
                            //جلوگیری از تداخل نیمه شبهای مجازی شیفتهای متوالی
                            //در حالت اول شبانه روز اول محدود میشود و در حالت دوم شبانه روز دوم را محدود میکنیم
                            //مثال حالت اول مانند وقتی که روز اول دارای شیفت 23:50 تا +7:00 با پایان شبانه روز 20:00 باشد و روز دوم دارای شیفت 7:00 تا 17:00 با پایان شبانه روز 6:00 باشد
                            //مثال حالت دوم مانند وقتی که روز اول دارای شیفت 7:00 تا +7:00 با پایان شبانه روز 7:00 باشد و روز دوم دارای شیفت 7:00 تا 17:00 با پایان شبانه روز 6:00 باشد
                            // فرض بر این است که حالت دوم تنها در هنگام شیفت 24 ساعته بروز میکند و باید "تا" پایان شبانه روز شیفت مقدار بگیرد  - در مثال بالا +7:00 میباشد
                            if (beforeMidNight.Start > midNightTime.Start && (beforeMidNight.End - DayMinutes) < midNightTime.Start)
                            {
                                VirtualMidNight lastVmn = _vmnList.Last();
                                lastVmn.SecondMidLimit = midNightTime.Start - 1;
                            }
                            else if (beforeMidNight.Start > midNightTime.Start)
                            {
                                int end = beforeMidNight.End;
                                if (end > DayMinutes)
                                {
                                    end -= DayMinutes;
                                }
                                midNightTime.Start = end + 1;
                            }

                            VirtualMidNight vmn = GetMidNightOFShift(todayShift, midNightTime);
                            _vmnList.Add(vmn);
                        }
                        else
                        {
                            //این بلاک بجای قسمت مربوط به درج نیمه شب در تعطیلات اضافه گردید
                            VirtualMidNight vmn = new VirtualMidNight();
                            if (lastMidNight != null)//استفاده از روزهای قبل که شیفت داشته است و عدم استفاده از قانون پایان شبانه روز
                            {
                                vmn = new VirtualMidNight(CalcDate, lastMidNight.Start, lastMidNight.BeforeTelorance, lastMidNight.AfterTelorance);
                            }
                            else
                            {
                                vmn = new VirtualMidNight(CalcDate, midNightTime.Start, midNightTime.BeforeTelorance, midNightTime.AfterTelorance);
                            }
                            _vmnList.Add(vmn);
                            //فقط وقتی بکار میآید که در روزهای متوالی شیفت داشته باشیم
                            if (beforeMidNight.Start > 0)
                            {
                                midNightTime = (MidNightTimeSt)beforeMidNight.Clone();
                            }
                            beforeMidNight.Start = -1;
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

                //افزودن نیمه شب مجازی برای روزهایی که شیفت نداشته است
                //از 10 روز قبل شروع میکنیم تا برای اولین ترددها مشکلی ایجاد نشود
                #region without shift days
                if (_vmnList.Count > 0)
                {
                    VirtualMidNight lastVmn = new VirtualMidNight();
                    _vmnList = _vmnList.OrderBy(x => x.DateTime).ToList();

                    DateTime startDate = _vmnList.First().Date.AddDays(-10);
                    DateTime endDate   = _vmnList.OrderBy(x => x.Date).Last().Date;


                    for (DateTime dateCounter = startDate; dateCounter < endDate; dateCounter = dateCounter.AddDays(1))
                    {
                        try
                        {
                            if (!_vmnList.Any(x => x.Date == dateCounter.Date))
                            {
                                // VirtualMidNight vmn = new VirtualMidNight(dateCounter, midNightTime);
                                //اگر روزی شیفت نداشت ما باید نیمه شب مجازی اضافه کنیم که همان روز را پوشش دهد(نیمه دوم )در
                                //مورد مکان های مشترک اگر شخص در حال ورود بود باید نیمه شب مجازی دوم و اگر در حال خروج بود
                                //باید نیمه شب مجازی اول به ان تعلق گیرد

                                VirtualMidNight vmn = new VirtualMidNight();
                                if (_vmnList.Any(x => x.Date == dateCounter.Date.AddDays(1)) &&
                                    _vmnList.Any(x => x.Date == dateCounter.Date.AddDays(-1)) &&
                                    _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(1)).First().Time
                                    == _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(-1)).First().Time)
                                {
                                    lastVmn = lastVmn = _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(1)).First();
                                    vmn     = new VirtualMidNight(dateCounter, lastVmn.Time, lastVmn.BeforeTelorance, lastVmn.AfterTelorance);
                                }
                                if (_vmnList.Any(x => x.Date == dateCounter.Date.AddDays(-1)))
                                {
                                    lastVmn = _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(-1)).First();
                                    vmn     = new VirtualMidNight(dateCounter, lastVmn.Time, lastVmn.BeforeTelorance, lastVmn.AfterTelorance);
                                }
                                else
                                {
                                    vmn     = new VirtualMidNight(dateCounter, midNightTime.Start, midNightTime.BeforeTelorance, midNightTime.AfterTelorance);
                                    lastVmn = vmn;
                                }
                                _vmnList.Add(vmn);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                    _vmnList = _vmnList.OrderBy(x => x.DateTime).ToList();
                }
                #endregion

                foreach (VirtualMidNight vmn in _vmnList)
                {
                    vmn.DayPart = GetMainDayRegion(vmn, _person);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }