Beispiel #1
0
        /// <summary>
        /// Startup with Creating Dispo Agent for current Item.
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="orderItem"></param>
        public void StartOrder(T_CustomerOrderPart orderItem)
        {
            // create Request Item
            _fArticle = orderItem.ToRequestItem(requester: Agent.Context.Self, currentTime: Agent.CurrentTime);
            // Tell Guardian to create Dispo Agent
            var agentSetup  = AgentSetup.Create(agent: Agent, behaviour: DispoAgent.Behaviour.Factory.Get(simType: Agent.Behaviour.SimulationType));
            var instruction = Guardian.Instruction.CreateChild.Create(setup: agentSetup, target: ((IAgent)Agent).Guardian, source: Agent.Context.Self);

            Agent.Send(instruction: instruction);
            // init end
        }
 internal void RequestArticle(FArticle requestArticle)
 {
     // Save Request Item.
     _fArticle = requestArticle;
     Agent.DebugMessage($"{_fArticle.Article.Name} {_fArticle.Key} is Requested to Produce.");
     // get related Storage Agent
     Agent.Send(instruction: Directory.Instruction
                .RequestAgent
                .Create(discriminator: requestArticle.Article.Name
                        , target: Agent.ActorPaths.StorageDirectory.Ref));
 }
Beispiel #3
0
        private void UpdateOrder(FArticle item)
        {
            var toUpdate = simulationOrders.SingleOrDefault(predicate: x => x.OriginId == item.CustomerOrderId);

            if (toUpdate == null)
            {
                throw new Exception(message: "OrderNotFound during Order update from Contract Collector Agent");
            }

            toUpdate.State         = DB.Enums.State.Finished;
            toUpdate.FinishingTime = (int)item.FinishedAt;
        }
        public static void PublishUpdateArticleProvider(Agent agent, FArticle article)
        {
            var pub = new FUpdateSimulationWorkProvider(fArticleProviderKeys: article.ProviderList
                                                        , requestAgentId: article.OriginRequester.Path.Uid.ToString()
                                                        , requestAgentName: article.OriginRequester.Path.Name
                                                        //, originRequesterId: article.OriginRequester.Path.Uid.ToString()
                                                        //, originRequesterName: article.OriginRequester.Path.Uid.ToString()
                                                        , isHeadDemand: article.IsHeadDemand
                                                        , customerOrderId: article.CustomerOrderId);

            agent.Context.System.EventStream.Publish(@event: pub);
        }
Beispiel #5
0
        /// <summary>
        /// Startup with Creating Dispo Agent for current Item.
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="orderItem"></param>
        public void StartOrder(T_CustomerOrderPart orderItem)
        {
            // create Request Item
            _fArticle = orderItem.ToRequestItem(requester: Agent.Context.Self
                                                , customerDue: orderItem.CustomerOrder.DueTime
                                                , remainingDuration: 0
                                                , currentTime: Agent.CurrentTime);


            Agent.DebugMessage(msg: $"Start Order");
            Agent.Send(DirectoryAgent.Directory.Instruction.Central.ForwardAddOrder.Create(_fArticle,
                                                                                           Agent.ActorPaths.StorageDirectory.Ref));
        }
Beispiel #6
0
        public static int CalculateRequiredQuantity(FArticle fArticle)
        {
            var quantityMaterials = fArticle.Article.ArticleBoms.Count(x =>
                                                                       x.ArticleChild.ArticleType.Name == "Material" || x.ArticleChild.ArticleType.Name == "Consumable");

            var quantityProducts = fArticle.Article.ArticleBoms.Where(x =>
                                                                      x.ArticleChild.ArticleType.Name == "Assembly" || x.ArticleChild.ArticleType.Name == "Product")
                                   .Sum(x => x.Quantity);

            var quantityAll = quantityMaterials + quantityProducts;

            return(Convert.ToInt32(quantityAll));
        }
Beispiel #7
0
        internal FStockReservation MakeReservationFor(FArticle request)
        {
            var inStock  = false;
            var quantity = 0;
            var time     = request.DueTime;

            var withdraw = _stockManager.StockExchanges
                           .Where(predicate: x => x.RequiredOnTime <= request.DueTime &&
                                  x.State != State.Finished &&
                                  x.ExchangeType == ExchangeType.Withdrawal)
                           .Sum(selector: x => x.Quantity);
            // Element is NOT in Stock
            // Create Purchase if Required.
            var purchaseOpen = _stockManager.StockExchanges
                               .Any(predicate: x => x.State != State.Finished && x.ExchangeType == ExchangeType.Insert);
            var required = ((_stockManager.Current - withdraw - request.Quantity));

            if (required < _stockManager.Stock.Min && _stockManager.Article.ToPurchase && !purchaseOpen)
            {
                var timeToDelivery = CreatePurchase(stockElement: _stockManager.Stock);
                time         = Agent.CurrentTime + timeToDelivery;
                purchaseOpen = true;
                Agent.DebugMessage(msg: $"Created purchase for {_stockManager.Article.Name}");
            }

            // Create Reservation Item
            if (required > 0)
            {
                inStock  = true;
                quantity = request.Quantity;
                //TODO Check Correctness
                _stockManager.GetProviderGuidsFor(new Quantity(request.Quantity));
            }
            var stockReservation = new FStockReservation(quantity: quantity, isPurchased: purchaseOpen, isInStock: inStock, dueTime: time, trackingId: request.StockExchangeId);

            //Create Stockexchange for Reservation
            _stockManager.StockExchanges.Add(
                item: new T_StockExchange
            {
                TrackingGuid   = request.StockExchangeId,
                StockId        = _stockManager.Id,
                ExchangeType   = ExchangeType.Withdrawal,
                Quantity       = request.Quantity,
                Time           = (int)(Agent.CurrentTime),
                State          = stockReservation.IsInStock ? State.Finished : State.Created,
                RequiredOnTime = (int)request.DueTime,
            }
                );
            return(stockReservation);
        }
Beispiel #8
0
        private void RequestArticle(FArticle requestItem)
        {
            Agent.DebugMessage(msg: " requests Article " + _stockManager.Name + " from Agent: " + Agent.Sender.Path.Name);

            // try to make Reservation
            var item             = requestItem.UpdateStockExchangeId(i: Guid.NewGuid()).UpdateDispoRequester(r: Agent.Sender);
            var stockReservation = MakeReservationFor(request: item);

            if (!stockReservation.IsInStock || item.Article.ToBuild)
            {
                // add to Request queue if not in Stock
                _requestedArticles.Add(item: item);
            }
            // Create Callback
            Agent.Send(instruction: Dispo.Instruction.ResponseFromStock.Create(message: stockReservation, target: Agent.Sender));
        }
Beispiel #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="fArticle"></param>
        public void TryFinishOrder(FArticleProvider fArticleProvider)
        {
            Agent.DebugMessage(msg: "Ready to Deliver");
            //var localItem = Agent.Get<FRequestItem>(REQUEST_ITEM);
            _fArticle = _fArticle.UpdateFinishedAt(f: Agent.CurrentTime);

            // try to Finish if time has come
            if (Agent.CurrentTime >= _fArticle.DueTime)
            {
                _fArticle = _fArticle.SetProvided;
                Agent.DebugMessage(msg: $"Article delivered in time {_fArticle.DueTime == Agent.CurrentTime} {fArticleProvider.ArticleName} {fArticleProvider.ArticleKey} due: {_fArticle.DueTime} current: {Agent.CurrentTime}! ");
                Agent.Send(instruction: Dispo.Instruction.WithdrawArticleFromStock.Create(message: fArticleProvider.ArticleKey, target: Agent.Sender));
                Agent.Send(instruction: Supervisor.Instruction.OrderProvided.Create(message: _fArticle, target: Agent.ActorPaths.SystemAgent.Ref));
                Agent.VirtualChildren.Remove(item: Agent.Sender);
                Agent.TryToFinish();
            }
        }
Beispiel #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="fArticle"></param>
        public void TryFinishOrder(FCentralProvideOrder order)
        {
            Agent.DebugMessage(msg: "Ready to Deliver");
            //var localItem = Agent.Get<FRequestItem>(REQUEST_ITEM);

            // try to Finish if time has come
            if (Agent.CurrentTime >= _fArticle.DueTime)
            {
                _fArticle = _fArticle.SetProvided
                            .UpdateFinishedAt(Agent.CurrentTime)
                            .UpdateProvidedAt(order.MaterialFinishedAt);
                Agent.DebugMessage(msg: $"Article delivered in time {_fArticle.DueTime == Agent.CurrentTime} {order.MaterialName} {order.MaterialId} due: {_fArticle.DueTime} current: {Agent.CurrentTime}!");
                Agent.Send(instruction: DirectoryAgent.Directory.Instruction.Central.ForwardWithdrawMaterial.Create(new FCentralStockPostings.FCentralStockPosting(order.MaterialId, 1), target: Agent.ActorPaths.StorageDirectory.Ref));
                Agent.Send(instruction: Supervisor.Instruction.OrderProvided.Create(message: _fArticle, target: Agent.ActorPaths.SystemAgent.Ref));
                Agent.VirtualChildren.Remove(item: Agent.Sender);
                Agent.TryToFinish();
            }
        }
Beispiel #11
0
        internal void CreateJobsFromArticle(FArticle fArticle)
        {
            var lastDue = fArticle.DueTime;
            var sumOperationDurations = fArticle.RemainingDuration;
            var numberOfOperations    = fArticle.Article.Operations.Count();
            var operationCounter      = 0;

            foreach (var operation in fArticle.Article.Operations.OrderByDescending(keySelector: x => x.HierarchyNumber))
            {
                operationCounter++;
                var fJob = operation.ToOperationItem(dueTime: lastDue
                                                     , customerDue: fArticle.CustomerDue
                                                     , productionAgent: Agent.Context.Self
                                                     , firstOperation: (operationCounter == numberOfOperations)
                                                     , currentTime: Agent.CurrentTime
                                                     , remainingWork: sumOperationDurations);

                Agent.DebugMessage(
                    msg:
                    $"Origin {fArticle.Article.Name} CustomerDue: {fArticle.CustomerDue} remainingDuration: {fArticle.RemainingDuration} Created operation: {operation.Name} | Prio {fJob.Priority.Invoke(Agent.CurrentTime)} | Remaining Work {sumOperationDurations} " +
                    $"| BackwardStart {fJob.BackwardStart} | BackwardEnd:{fJob.BackwardEnd} Key: {fJob.Key}  ArticleKey: {fArticle.Key}" +
                    $"Precondition test: {operation.Name} | {fJob.StartConditions.PreCondition} ? {operationCounter} == {numberOfOperations} " +
                    $"| Key: {fJob.Key}  ArticleKey: {fArticle.Key}", CustomLogger.SCHEDULING, LogLevel.Warn);
                sumOperationDurations += operation.Duration;
                lastDue = fJob.BackwardStart - operation.AverageTransitionDuration;
                OperationManager.AddOperation(fJob);

                // send update to collector
                var pub = new FCreateSimulationJob(job: fJob
                                                   , jobType: JobType.OPERATION
                                                   , customerOrderId: fArticle.CustomerOrderId.ToString()
                                                   , isHeadDemand: fArticle.IsHeadDemand
                                                   , fArticleKey: fArticle.Key
                                                   , fArticleName: fArticle.Article.Name
                                                   , productionAgent: this.Agent.Name
                                                   , articleType: fArticle.Article.ArticleType.Name
                                                   , start: fJob.Start
                                                   , end: fJob.End);
                Agent.Context.System.EventStream.Publish(@event: pub);
            }

            _articleToProduce = fArticle;
            SetForwardScheduling();
        }
Beispiel #12
0
 public static FArticle ToRequestItem(this M_ArticleBom articleBom, FArticle requestItem, IActorRef requester, long currentTime)
 {
     return(new FArticle(
                key: Guid.NewGuid()
                , dueTime: requestItem.DueTime
                , creationTime: currentTime
                , isProvided: false
                , quantity: Convert.ToInt32(value: articleBom.Quantity)
                , article: articleBom.ArticleChild
                , customerOrderId: requestItem.CustomerOrderId
                , isHeadDemand: false
                , stockExchangeId: Guid.Empty
                , storageAgent: ActorRefs.NoSender
                , originRequester: requester
                , dispoRequester: ActorRefs.Nobody
                , providerList: new List <Guid>()
                , finishedAt: 0
                ));
 }
Beispiel #13
0
        private void ProvideOrder(FArticle finishedArticle)
        {
            if (finishedArticle.DueTime >= finishedArticle.FinishedAt)
            {
                Collector.messageHub.SendToAllClients(msg: $"Oder No: {finishedArticle.OriginRequester} finished {finishedArticle.Article.Name} in time at {Collector.Time}");

                Collector.messageHub.SendToClient(listener: "orderListener", msg: totalOrders.ToString());
                inTime++;
            }
            else
            {
                Collector.messageHub.SendToAllClients(msg: $"Oder No: {finishedArticle.OriginRequester} finished {finishedArticle.Article.Name} too late at {Collector.Time}");
                toLate++;
            }

            UpdateOrder(item: finishedArticle);

            openOrderParts--;
            finishedOrderParts++;
            totalOrders++;
        }
Beispiel #14
0
        internal void CreateJobsFromArticle(FArticle fArticle)
        {
            var lastDue            = fArticle.DueTime;
            var numberOfOperations = fArticle.Article.Operations.Count();
            var operationCounter   = 0;

            foreach (var operation in fArticle.Article.Operations.OrderByDescending(keySelector: x => x.HierarchyNumber))
            {
                operationCounter++;
                var fJob = operation.ToOperationItem(dueTime: lastDue
                                                     , productionAgent: Agent.Context.Self
                                                     , firstOperation: (operationCounter == numberOfOperations)
                                                     , currentTime: Agent.CurrentTime);

                Agent.DebugMessage(
                    msg:
                    $"Created operation: {operation.Name} | BackwardStart {fJob.BackwardStart} | BackwardEnd:{fJob.BackwardEnd} Key: {fJob.Key}  ArticleKey: {fArticle.Key}");
                Agent.DebugMessage(
                    msg:
                    $"Precondition test: {operation.Name} | {fJob.StartConditions.PreCondition} ? {operationCounter} == {numberOfOperations} | Key: {fJob.Key}  ArticleKey: {fArticle.Key}");
                lastDue = fJob.BackwardStart - operation.AverageTransitionDuration;
                OperationManager.AddOperation(fJob);

                // send update to collector
                var pub = new FCreateSimulationWork(operation: fJob
                                                    , customerOrderId: fArticle.CustomerOrderId.ToString()
                                                    , isHeadDemand: fArticle.IsHeadDemand
                                                    , fArticleKey: fArticle.Key
                                                    , fArticleName: fArticle.Article.Name
                                                    , articleType: fArticle.Article.ArticleType.Name);
                Agent.Context.System.EventStream.Publish(@event: pub);
            }

            _articleToProduce = fArticle;
            SetForwardScheduling();
        }
 public static StartProduction Create(FArticle message, IActorRef target)
 {
     return(new StartProduction(message: message, target: target));
 }
Beispiel #16
0
 /// <summary>
 /// Element to calculate the latest returned forward schedule and provides a check to test if all required schedules for this article are returned.
 /// </summary>
 /// <param name="fArticle">required Article Type in ArticleBom.Child !</param>
 public ForwardScheduleTimeCalculator(FArticle fArticle)
 {
     RequiredQuantity = CalculateRequiredQuantity(fArticle: fArticle);
 }
Beispiel #17
0
 /// <summary>
 /// Check if all required schedules returned
 /// </summary>
 /// <param name="fArticle"></param>
 /// <returns></returns>
 internal bool AllRequirementsFullFilled(FArticle fArticle)
 {
     return(ForwardScheduledEndingTimes.Count == RequiredQuantity);
 }
Beispiel #18
0
 public static RequestArticle Create(FArticle message, IActorRef target)
 {
     return(new RequestArticle(message: message, target: target));
 }
 public ArticleProvider(IActorRef provider, FArticle article)
 {
     Provider = provider;
     Article  = article;
 }
Beispiel #20
0
 public static AddOrder Create(FArticle message, IActorRef target)
 {
     return(new AddOrder(message: message, target: target));
 }
Beispiel #21
0
 public static OrderProvided Create(FArticle message, IActorRef target)
 {
     return(new OrderProvided(message: message, target: target));
 }
Beispiel #22
0
 public static ISimulationMessage Create(FArticle requestItem, IActorRef target, bool logThis)
 {
     return(new Finish(message: requestItem, target: target, logThis: logThis));
 }
Beispiel #23
0
        private void ForwardAddOrder(FArticle fArticle)
        {
            var actorRef = StorageManager.GetHubActorRefBy(fArticle.Article.Id.ToString());

            Agent.Send(Storage.Instruction.Central.AddOrder.Create(fArticle, actorRef));
        }
 public void Add(IActorRef dispoRef, FArticle fArticle)
 {
     DispoToArticleRelation.Add(new ArticleProvider(dispoRef, fArticle));
 }
Beispiel #25
0
 private void AddOrder(FArticle fArticle)
 {
     _requestedArticles.Add(fArticle);
 }
Beispiel #26
0
        public static FCreateSimulationJob ToSimulationJob(this FOperation fOperation, string jobType, FArticle fArticle, string productionAgent)
        {
            var simulationJob = new FCreateSimulationJob(
                key: fOperation.Key.ToString()
                , dueTime: fOperation.DueTime
                , articleName: fOperation.Operation.Article.Name
                , operationName: fOperation.Operation.Name
                , operationHierarchyNumber: fOperation.Operation.HierarchyNumber
                , operationDuration: fOperation.Operation.Duration
                , requiredCapabilityName: fOperation.Operation.ResourceCapability.Name
                , jobType: jobType.ToString()
                , customerOrderId: fArticle.CustomerOrderId.ToString()
                , isHeadDemand: fArticle.IsHeadDemand
                , fArticleKey: fArticle.Key
                , fArticleName: fArticle.Article.Name
                , productionAgent: productionAgent
                , articleType: fArticle.Article.ArticleType.Name
                , start: fOperation.Start
                , end: fOperation.End
                );

            return(simulationJob);
        }