Ejemplo n.º 1
0
        public GanttChart(IDirectedGraph <INode> orderOperationGraph)
        {
            Dictionary <Id, List <Interval> > groups = new Dictionary <Id, List <Interval> >();

            foreach (var graphNode in orderOperationGraph.GetNodes())
            {
                IScheduleNode node = graphNode.GetNode().GetEntity();
                if (node.GetType() != typeof(ProductionOrderOperation) && node.GetType() != typeof(PurchaseOrderPart))
                {
                    continue;
                }
                GanttChartBar ganttChartBar = new GanttChartBar();

                ganttChartBar.operation   = node.GetId().ToString();
                ganttChartBar.operationId = node.GetId().ToString();
                ganttChartBar.resource    = DetermineFreeGroup(groups,
                                                               new Interval(node.GetId(), node.GetStartTimeBackward(), node.GetEndTimeBackward())).ToString();

                ;
                ganttChartBar.start = node.GetStartTimeBackward().GetValue().ToString();
                ganttChartBar.end   = node.GetEndTimeBackward().GetValue().ToString();

                ganttChartBar.groupId = ganttChartBar.resource;

                AddGanttChartBar(ganttChartBar);
            }
        }
        public void ScheduleForward()
        {
            Stack <INode> S = new Stack <INode>();

            // d_0 = 0
            foreach (var node in _orderOperationGraph.GetLeafNodes())
            {
                IScheduleNode scheduleNode = node.GetEntity();
                if (scheduleNode.IsReadOnly() == false &&
                    scheduleNode.GetStartTimeBackward().IsSmallerThan(_simulationInterval.GetStart()))
                {
                    // implicitly the due/endTime will also be set accordingly
                    scheduleNode.SetStartTimeBackward(_simulationInterval.GetStart());
                    S.Push(node);
                }
                else // no forward scheduling is needed
                {
                }
            }


            // while S nor empty do
            while (S.Any())
            {
                INode         i = S.Pop();
                IScheduleNode iAsScheduleNode = (IScheduleNode)i.GetEntity();

                INodes predecessors = _orderOperationGraph.GetPredecessorNodes(i);
                if (predecessors != null && predecessors.Any())
                {
                    foreach (var predecessor in predecessors)
                    {
                        IScheduleNode predecessorScheduleNode = predecessor.GetEntity();

                        // if predecessor starts before endTime of current d/p --> change that
                        if (predecessorScheduleNode.IsReadOnly() == false && predecessorScheduleNode
                            .GetStartTimeBackward().IsSmallerThan(iAsScheduleNode.GetEndTimeBackward()))
                        {
                            // COPs are not allowed to change
                            if (predecessorScheduleNode.GetType() != typeof(CustomerOrderPart))
                            {
                                // don't take getDueTime() since in case of a demand,
                                // this will be the startTime, which is to early

                                // This must be the maximum endTime of all childs !!!
                                DueTime maxEndTime = iAsScheduleNode.GetEndTimeBackward();
                                foreach (var successor in _orderOperationGraph.GetSuccessorNodes(
                                             predecessor))
                                {
                                    DueTime successorsEndTime = successor.GetEntity().GetEndTimeBackward();
                                    if (successorsEndTime.IsGreaterThan(maxEndTime))
                                    {
                                        maxEndTime = successorsEndTime;
                                    }
                                }

                                predecessorScheduleNode.SetStartTimeBackward(maxEndTime);
                            }
                        }

                        S.Push(predecessor);
                    }
                }
            }
        }