/// <summary> /// 新验证 /// </summary> public Dictionary <string, bool> NewRangeValidate(Guid agent, DateRange dateRange) { InitializeTimeBox(agent, dateRange); InitializeSwapingForDateRange(dateRange); if (CurrentTerms.Count == 0) { HasIdleGap = true; return(SetValidate()); } var terms = TempTerms.OrderBy(o => o.Start).ToList(); var count = terms.Count; if (terms[0].Start > dateRange.Start || terms[count - 1].End < dateRange.End) { HasIdleGap = true; } for (var i = 0; i < count - 1; i++) { if (terms[i].End != terms[i + 1].Start) { HasIdleGap = true; break; } } return(SetValidate()); }
/// <summary> /// 时段代换班(scheduleDate用于取TimeBox班表,如果计算工时则需要获取整个排班期班表,如果换班则需要取两人交换范围的班表,dateRange是交换时间段) /// </summary> public void InitializeSwapingForDateRange(DateRange dateRange) { var tempassignment = TimeBox.CollideTerms(dateRange).SpecificTerm <AssignmentBase>().OrderBy(o => o.Start).ToList(); if (tempassignment.Count == 0) { return; } CurrentTerms = TimeBox.CenterTerms(new DateRange(tempassignment[0].Start, tempassignment[tempassignment.Count - 1].End)).ToList(); //初始化班 TempTerms = CurrentTerms.SpecificTerm <AssignmentBase>().ToList(); HasAbsentEvent = CurrentTerms.CollideTerms(dateRange).SpecificTerm <AbsentEvent>().Any(); AbsentEvents = CurrentTerms.SpecificTerm <AbsentEvent>().ToList(); HasLockedSubEvent = CurrentTerms.Any(o => o.Level > 0 && o.Locked); HasTimeOff = CurrentTerms.CollideTerms(dateRange).SpecificTerm <TimeOff>().Any(); HasShrink = CurrentTerms.CollideTerms(dateRange).SpecificTerm <Shrink>().Any(); HasLockedAssignment = TempTerms.Any(o => o.Locked); }
public void DealWithTerms(List <Term> terms, bool isDay) { if (!isDay) { return; } foreach (var term in terms) { if (term is Assignment) { var a = TempTerms.First(o => o.Start <= term.Start && o.End >= term.End); if (term.InDate(a)) { (term as Assignment).BelongToPrv = true; } } } }
public void DealWithDateRange(BoxSwapModel opp, DateRange dateRange) { List <Term> inside, outside; Term.SliceTerm(CurrentTerms, dateRange.Start, dateRange.End, out outside, out inside); var day = TempTerms.HasDayTerms(); //不符合的不创建了。 var gaporun = inside.ConvertToCell(dateRange, 5, t => t.IsNot <UnlaboredSubEvent>()).Contains(true); if (gaporun) { DealWithTerms(inside, day); inside.ForEach(opp.TimeBoxCreateTerm); } //自己创建之外的班 DealWithTerms(outside, day); outside.ForEach(TimeBoxCreateTerm); }
public void DealWithDateRange(BoxSwapModel opp, Pair <DateRange> dateRange) { List <Term> frontTerms, insideTerms, backTerms; Term.SliceTerm(CurrentTerms, dateRange.Applier.Start, dateRange.Applier.End, out insideTerms, out frontTerms, out backTerms); var day = TempTerms.HasDayTerms(); DealWithTerms(insideTerms, day); insideTerms.ForEach(opp.TimeBoxCreateTerm); //获取切割时间 var cutDateRange = DateRange.Cut(dateRange.Applier, dateRange.Replier); var replierRegion = cutDateRange.Where(t => t.Item2 == RegionType.Replier).Select(o => o.Item1); List <Term> outside = null; List <Term> outside2 = null; if (replierRegion.Count() == 1) { var range = replierRegion.FirstOrDefault(); List <Term> inside; //右边 if (range.Start >= dateRange.Applier.End) { Term.SliceTerm(backTerms, range.Start, range.End, out outside, out inside); DealWithTerms(frontTerms, day); frontTerms.ForEach(TimeBoxCreateTerm); } //左边 if (range.End <= dateRange.Applier.Start) { Term.SliceTerm(frontTerms, range.Start, range.End, out outside, out inside); DealWithTerms(backTerms, day); backTerms.ForEach(TimeBoxCreateTerm); } } if (replierRegion.Count() > 1) { foreach (var range in replierRegion) { List <Term> inside; //右边 if (range.Start >= dateRange.Applier.End) { Term.SliceTerm(backTerms, range.Start, range.End, out outside, out inside); } //左边 if (range.End <= dateRange.Applier.Start) { Term.SliceTerm(frontTerms, range.Start, range.End, out outside2, out inside); } } } if (outside2 != null) { DealWithTerms(outside2, day); outside2.ForEach(TimeBoxCreateTerm); } if (outside != null) { DealWithTerms(outside, day); outside.ForEach(TimeBoxCreateTerm); } else { DealWithTerms(frontTerms, day); DealWithTerms(backTerms, day); frontTerms.ForEach(TimeBoxCreateTerm); backTerms.ForEach(TimeBoxCreateTerm); } }