/// <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; }
/// <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()); }
/// <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()); }
/// <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); }
/// <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); }
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; }