private CPMresult CPM(IEnumerable <dtoCPMactivity> activities, DateTime?startdate = null, FlagDayOfWeek workweek = FlagDayOfWeek.WorkWeek, IEnumerable <DateTime> exceptions = null, Int32 dailyworkhours = 8, IEnumerable <dtoCPMlink> links = null)
        {
            CPMresult result = new CPMresult();

            Dictionary <Int64, dtoCPMactivity> dict = new Dictionary <long, dtoCPMactivity>();

            foreach (var act in activities)
            {
                dict.Add(act.Id, act);
            }

            result.Activities = activities.ToList();

            if (!result.Activities.Where(x => x.Id == -1).Any())
            {
                dtoCPMactivity vActivity = new dtoCPMactivity(-1, "end")
                {
                    Duration = 0, IsVirtual = true
                };
                result.Activities.Add(vActivity);
                dict.Add(-1, vActivity);

                CPMExtensions.ParseActivityLinks(-1, "*", dict);
            }

            result.Activities.CriticalPathMethod();

            result.ProjectLength = activities.CriticalPathLength();

            if (startdate != null && startdate.HasValue)
            {
                result.AvailableDates = startdate.Value.GenerateAvailableDates(result.ProjectLength, workweek, exceptions).ToList();
                result.Activities.CalculateDate(result.AvailableDates, dailyworkhours);
                result.ProjectStartDate    = startdate;
                result.ProjectEndDate      = result.Activities.CriticalPathEnd();
                result.isDeadlined         = result.Activities.isDeadlined();
                result.DeadlinedActivities = result.Activities.DeadlinedActivities().ToList();
            }

            result.Critical   = activities.CriticalPath().ToList();
            result.Activities = result.Activities.Where(x => x.Id > 0).ToList();

            foreach (var item in result.Activities)
            {
                //todo check if it's correct

                item.Successors = item.Successors.Where(x => x.isVirtual == false).ToList();
            }

            //todo remove virtual links and activities

            return(result);
        }
        public IList <dtoCPMactivity> PreprocessSummaryMilestones(IList <dtoCPMactivity> activities)
        {
            //Start Preparation

            var summaries = activities.Where(x => x.IsSummary).OrderByDescending(x => x.Id).ToList();

            //var summaries = activities.Where(x => x.IsSummary).ToList();


            foreach (var summary in summaries)
            {
                dtoCPMactivity startMilestone = new dtoCPMactivity()
                {
                    Name         = String.Format("{0}-{1}", summary.Id, "start"),
                    Duration     = 0,
                    IsVirtual    = true,
                    Id           = activities.Max(x => x.Id) + 1,
                    DisplayOrder = activities.Max(x => x.Id) + 1
                };

                dtoCPMactivity endMilestone = new dtoCPMactivity()
                {
                    Name         = String.Format("{0}-{1}", summary.Id, "end"),
                    Duration     = 0,
                    IsVirtual    = true,
                    Id           = activities.Max(x => x.Id) + 2,
                    DisplayOrder = activities.Max(x => x.Id) + 2
                };

                startMilestone.Parent   = summary;
                startMilestone.IdParent = summary.Id;
                endMilestone.Parent     = summary;
                endMilestone.IdParent   = summary.Id;

                summary.Children.Add(startMilestone);
                summary.Children.Add(endMilestone);

                activities.Add(startMilestone);
                activities.Add(endMilestone);

                if (summary.Parent != null)
                {
                    dtoCPMlink parentlink = new dtoCPMlink()
                    {
                        IdSource  = startMilestone.Id,
                        Source    = startMilestone,
                        Target    = summary.Parent,
                        IdTarget  = summary.IdParent,
                        isVirtual = true
                    };

                    startMilestone.Predecessors.Add(parentlink);

                    summary.Parent.Successors.Add(parentlink);
                }

                foreach (var children in summary.Children.Where(x => x.IsVirtual == false && x.IsSummary == false))
                {
                    dtoCPMlink startlink = new dtoCPMlink()
                    {
                        IdSource  = children.Id,
                        Source    = children,
                        Target    = startMilestone,
                        IdTarget  = startMilestone.Id,
                        isVirtual = true
                    };

                    startMilestone.Successors.Add(startlink);
                    children.Predecessors.Add(startlink);

                    dtoCPMlink endlink = new dtoCPMlink()
                    {
                        IdSource  = endMilestone.Id,
                        Source    = endMilestone,
                        Target    = children,
                        IdTarget  = children.Id,
                        isVirtual = true
                    };

                    children.Successors.Add(endlink);
                    endMilestone.Predecessors.Add(endlink);
                }

                //foreach (var children in summary.Children.Where(x => x.IsVirtual == false))
                //{



                //}

                foreach (var predec in summary.Predecessors.ToList())
                {
                    predec.Source   = startMilestone;
                    predec.IdSource = startMilestone.Id;



                    //switch (predec.Type)
                    //{
                    //    case PmActivityLinkType.FinishStart:



                    //        //dtoCPMlink prefs = new dtoCPMlink() { IdTarget = vs.Id, Target = vs, Source = predec.Target, IdSource = predec.IdTarget, isVirtual = true };

                    //        //vs.Predecessors.Add(prefs);

                    //        //predec.Target.Successors.Add(prefs);

                    //        break;

                    //    case PmActivityLinkType.StartStart:

                    //        //dtoCPMlink presss = new dtoCPMlink() { IdTarget = vs.Id, Target = vs, Source = predec.Target, IdSource = predec.IdTarget, isVirtual = true, Type = PmActivityLinkType.StartStart };

                    //        //vs.Predecessors.Add(presss);

                    //        //predec.Target.Successors.Add(presss);

                    //        break;

                    //    default:
                    //        break;
                    //}
                }


                foreach (var succ in summary.Successors.ToList())
                {
                    succ.Target   = endMilestone;
                    succ.IdTarget = endMilestone.Id;

                    //succ.Source = ve;
                    //succ.IdSource = ve.Id;

                    //switch (succ.Type)
                    //{
                    //    case PmActivityLinkType.FinishStart:

                    //        //dtoCPMlink prefs = new dtoCPMlink() { IdTarget = ve.Id, Target = ve, Source = succ.Source, IdSource = succ.IdSource, isVirtual = true };

                    //        //ve.Predecessors.Add(prefs);

                    //        //succ.Target.Successors.Add(prefs);

                    //        break;

                    //    case PmActivityLinkType.StartStart:

                    //        //dtoCPMlink presss = new dtoCPMlink() { IdTarget = ve.Id, Target = ve, Source = succ.Source, IdSource = succ.IdSource, isVirtual = true, Type = PmActivityLinkType.StartStart };

                    //        //ve.Predecessors.Add(presss);

                    //        //succ.Target.Successors.Add(presss);

                    //        break;

                    //    default:
                    //        break;
                    //}
                }

                //summary.Successors.Clear();
                //summary.Predecessors.Clear();
            }

            //End Preparation

            return(activities);
        }
示例#3
0
        //public static dtoCPMactivityLink CreateLink(dtoCPMactivity source, dtoCPMactivity target, Int32 leadlag = 0, PmActivityLinkType type = PmActivityLinkType.FinishStart)
        //{
        //    dtoCPMactivityLink link = new dtoCPMactivityLink() { Source = source, Target = target, LeadLag = leadlag, Type = type };

        //    return link;
        //}
        public static IEnumerable <dtoCPMactivity> Predecessors(this dtoCPMactivity activity)
        {
            return((from item in activity.Predecessors select item.Target).ToList());
        }