Beispiel #1
0
        /// <summary>
        /// Gets the time phase data.
        /// </summary>
        /// <param name="assignment">The assignment.</param>
        /// <param name="type">The type.</param>
        /// <returns></returns>
        public static IEnumerable<TimePhasedDataType> GetTimePhaseData(Assignment.Assignment assignment, TimePhasedDataType.TimePhaseType type)
        {
            if(assignment == null)
                throw new ArgumentException("assignment");

            //определяем величину дискретизации для генератора интервалов.
            //Если ее определить слишком маленькую то будет много TimePhases елементов
            //Для плоского распределения трудозатрат использовать ДЕНЬ для нелинейных функций использовать ЧАС
            long groupIntervalValue = assignment.CurrentContour.ContourType == ContourTypes.Flat ? CalendarHelper.MilisPerDay() : CalendarHelper.MilisPerHour();

            long start = type == TimePhasedDataType.TimePhaseType.AssignmentActualWork ? assignment.Start : assignment.Stop;
            long stop = type == TimePhasedDataType.TimePhaseType.AssignmentActualWork ? assignment.Stop : assignment.End;
            Query<Interval> query = new Query<Interval>();
            AssignmentBaseFunctor<double> workFunctor = assignment.GetWorkFunctor();

            GroupingIntervalGenerator groupGen = new GroupingIntervalGenerator(start, stop, groupIntervalValue,
                                                                              workFunctor.CountourGenerator);
            TimePhaseDataGetter timePhaseGetter = new TimePhaseDataGetter(type, TimePhasedDataType.TimePhaseUnit.Day,
                                                                          TimePhasedDataType.TimePhaseUnit.Minute, workFunctor);
            WhereInRangePredicate whereInRange = new WhereInRangePredicate(start, stop);

            query.Select(timePhaseGetter).From(groupGen).Where(whereInRange.Evaluate).Execute();

            return timePhaseGetter.Value;
        }
Beispiel #2
0
        /// <summary>
        /// Incrementals the group.
        /// </summary>
        /// <param name="phase">The phase.</param>
        /// <param name="groupUnit">The group unit.</param>
        /// <returns></returns>
        private TimePhasedDataType[] IncrementalGroup(TimePhasedDataType phase, TimePhasedDataType.TimePhaseUnit groupUnit)
        {
            List <TimePhasedDataType> retVal = new List <TimePhasedDataType>();

            long intervalDuration = phase.Finish - phase.Start;
            long wholePartCount   = intervalDuration / Unit2duration(groupUnit);
            long partialPart      = intervalDuration - wholePartCount * Unit2duration(groupUnit);

            if (wholePartCount > 0)
            {
                for (int i = 0; i < wholePartCount; i++)
                {
                    TimePhasedDataType newPhase = new TimePhasedDataType();
                    long start = phase.Start + i * Unit2duration(groupUnit);
                    newPhase.Start  = start;
                    newPhase.Finish = start + Unit2duration(groupUnit);
                    newPhase.Unit   = groupUnit;
                    newPhase.Value  = (long)((double)Unit2duration(groupUnit) / intervalDuration * phase.Value);
                    retVal.Add(newPhase);
                }
            }

            if (partialPart != 0 && groupUnit != _minGroupUnit)
            {
                TimePhasedDataType newPhase = new TimePhasedDataType();
                newPhase.Start  = phase.Finish - partialPart;
                newPhase.Finish = phase.Finish;
                newPhase.Value  = (long)((double)partialPart / intervalDuration * phase.Value);
                retVal.AddRange(IncrementalGroup(newPhase, DecrementUnit(groupUnit)));
            }

            return(retVal.ToArray());
        }
Beispiel #3
0
        /// <summary>
        /// Groups the by work create interval breaking not work interval.
        /// </summary>
        /// <param name="groupPhase">The group phase.</param>
        /// <returns></returns>
        private TimePhasedDataType[] GroupByWork(TimePhasedDataType[] groupPhase)
        {
            List <TimePhasedDataType> retVal    = new List <TimePhasedDataType>();
            TimePhasedDataType        group     = null;
            TimePhasedDataType        prevPhase = null;

            foreach (TimePhasedDataType phase in groupPhase)
            {
                if (group == null || (phase.Value == 0 && prevPhase.Value != 0) ||
                    (phase.Value != 0 && prevPhase.Value == 0))
                {
                    group        = new TimePhasedDataType();
                    group.Start  = phase.Start;
                    group.Finish = phase.Finish;
                    group.Value  = phase.Value;
                    retVal.Add(group);
                    prevPhase = phase;
                    continue;
                }

                group.Finish = phase.Finish;
                group.Value += phase.Value;

                prevPhase = phase;
            }

            return(retVal.ToArray());
        }
Beispiel #4
0
        /// <summary>
        /// Executes the specified param.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <returns></returns>
        public override object Execute(Interval param)
        {
            double workPerInterval = _functor.Value;

            //Call aggregated work functor
            _functor.Execute(param);
            workPerInterval = _functor.Value - workPerInterval;

            //first call or breake interval
            _groupingPhase        = new TimePhasedDataType();
            _groupingPhase.Start  = param.Start;
            _groupingPhase.Finish = param.End;
            _groupingPhase.Value  = (long)workPerInterval;
            _value.Add(_groupingPhase);

            return(this);
        }
Beispiel #5
0
 /// <summary>
 /// Gets the contour.
 /// </summary>
 /// <param name="timePhases">The time phases.</param>
 /// <returns></returns>
 public static AbstractContour GetContour(TimePhasedDataType[] timePhases)
 {
     ContourFactory factory = new ContourFactory();
     return factory.Create<PersonalContour>(timePhases);
 }
Beispiel #6
0
        private List<TimePhasedDataType> LoadTimePhase(string file, int assignmentId)
        {
            List<TimePhasedDataType> timePhasedList = new List<TimePhasedDataType>();
            XmlDocument srcDoc = new XmlDocument();
            //srcDoc.Load(@"C:\Projects\MsProjectSynchronization\MsProject\50unitFrontLoad10.xml");
            srcDoc.Load(file);

            XmlNamespaceManager nsXmlMmngr =
                         new XmlNamespaceManager(srcDoc.NameTable);
            nsXmlMmngr.AddNamespace("ns", @"http://schemas.microsoft.com/project");
            string assignXPath = string.Format("ns:Assignments/ns:Assignment[ns:UID = '{0}']", assignmentId);
            XmlNode assignNode =
                             srcDoc.DocumentElement.SelectSingleNode(assignXPath, nsXmlMmngr);

            string timePhaseXPath = "ns:TimephasedData";
            XmlNodeList timePhaseNodes =
                            assignNode.SelectNodes(timePhaseXPath, nsXmlMmngr);

            foreach (XmlNode timePhaseNode in timePhaseNodes)
            {
                TimePhasedDataType newTimePhase = new TimePhasedDataType();
                newTimePhase.UID = (Int32)GetXmlValue(timePhaseNode["UID"], typeof(Int32),
                                            true, -1);
                newTimePhase.Unit = (TimePhasedDataType.TimePhaseUnit)GetXmlValue(timePhaseNode["Unit"], typeof(Int32),
                                            true, 2);

                newTimePhase.Type = (Int32)GetXmlValue(timePhaseNode["Type"], typeof(Int32),
                                                true, -1);
                newTimePhase.Start = CalendarHelper.Tick2Milis(((DateTime)GetXmlValue(timePhaseNode["Start"], typeof(DateTime),
                                                            true, DateTime.MinValue)).Ticks);
                newTimePhase.Finish = CalendarHelper.Tick2Milis(((DateTime)GetXmlValue(timePhaseNode["Finish"], typeof(DateTime),
                                                            true, DateTime.MinValue)).Ticks);
                newTimePhase.Value = CalendarHelper.Tick2Milis(((TimeSpan)GetXmlValue(timePhaseNode["Value"], typeof(TimeSpan),
                                                            true, TimeSpan.Zero)).Ticks);
                timePhasedList.Add(newTimePhase);
            }

            return timePhasedList;
        }