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="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); }
public VirtualMidNight GetMidNight(DateTime date, int time, bool enter, bool applyMidNightTelorance) { if (time < 0) { time += DayMinutes; } List <VirtualMidNight> vmnList; VirtualMidNight tmpVmn = new VirtualMidNight(date, time); if (applyMidNightTelorance) { vmnList = _vmnList .Where(x => (x.FirstMid.StartDateTime.AddMinutes(-1 * x.BeforeTelorance) <= tmpVmn.DateTime && x.FirstMid.EndDateTime >= tmpVmn.DateTime) || (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime && x.SecondMid.EndDateTime /*.AddMinutes(x.AfterTelorance)*/ >= tmpVmn.DateTime) ).ToList(); } else { vmnList = _vmnList .Where(x => (x.FirstMid.StartDateTime <= tmpVmn.DateTime && x.FirstMid.EndDateTime >= tmpVmn.DateTime) || (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime && x.SecondMid.EndDateTime >= tmpVmn.DateTime) ).ToList(); } if (!EndOfDayIsForce) { //تکرار با اعمال تلورانس //falat 00086011 1388/2/11 عامل ایجاد این کار بود if (vmnList.Count == 0) { int telorance = HourTelorance; if (enter) { vmnList = _vmnList .Where(x => (x.FirstMid.StartDateTime.AddHours(telorance) <= tmpVmn.DateTime && x.FirstMid.EndDateTime >= tmpVmn.DateTime) || (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime && x.SecondMid.EndDateTime >= tmpVmn.DateTime) ).ToList(); } else { vmnList = _vmnList .Where(x => (x.FirstMid.StartDateTime <= tmpVmn.DateTime && x.FirstMid.EndDateTime >= tmpVmn.DateTime) || (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime && x.SecondMid.EndDateTime.AddHours(telorance) >= tmpVmn.DateTime) ).ToList(); } } } vmnList = vmnList.OrderBy(x => x.FirstMid.StartDateTime).ToList(); if (vmnList.Count > 0) { if (vmnList.Count == 0 && !enter) { vmnList.Add(tmpVmn); } if (enter) { return(vmnList.Last()); } else { return(vmnList.First()); } } int midNightTime = this.GetMidNightTime(date).Start; return(new VirtualMidNight(date, midNightTime, 0, 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; } }