Exemple #1
0
        /// <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());
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
 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;
             }
         }
     }
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
            }
        }