示例#1
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);
        }
示例#2
0
        internal void ResponseFromStock(FStockReservation reservation)
        {
            _fArticle = _fArticle.UpdateStockExchangeId(i: reservation.TrackingId);

            _quantityToProduce = _fArticle.Quantity - reservation.Quantity;

            Agent.DebugMessage(msg: reservation.Quantity + " "
                               + _fArticle.Article.Name + " are reserved and "
                               + _quantityToProduce + " " + _fArticle.Article.Name + " need to be produced!", CustomLogger.STOCK, LogLevel.Warn);

            if (reservation.IsInStock && !_fArticle.Article.ToBuild)
            {
                Agent.DebugMessage(msg: $"Start forward scheduling for article: {_fArticle.Article.Name} {_fArticle.Key} at: {Agent.CurrentTime}", CustomLogger.SCHEDULING, LogLevel.Warn);
                PushForwardTimeToParent(earliestStartForForwardScheduling: Agent.CurrentTime);
            }


            if (reservation.IsInStock && IsNot(_fArticle.IsHeadDemand))
            {
                ProvideRequest(new FArticleProvider(articleKey: _fArticle.Key
                                                    , articleName: _fArticle.Article.Name
                                                    , stockExchangeId: reservation.TrackingId
                                                    , articleFinishedAt: Agent.CurrentTime
                                                    , customerDue: _fArticle.CustomerDue
                                                    , provider: new List <FStockProvider>(new[] { new FStockProvider(reservation.TrackingId, "In Stock") })));
            }

            // else create Production Agents if ToBuild
            if (_fArticle.Article.ToBuild)
            {
                Agent.Send(instruction: RequestArticleBom.Create(message: _fArticle.Article.Id, target: Agent.ActorPaths.SystemAgent.Ref));

                // and request the Article from  stock at Due Time
                if (_fArticle.IsHeadDemand)
                {
                    var nextRequestAt = _fArticle.DueTime - Agent.CurrentTime;
                    Agent.DebugMessage(msg: $"Ask storage for Article {_fArticle.Key} in + {nextRequestAt}", CustomLogger.STOCK, LogLevel.Warn);

                    Agent.Send(instruction: ProvideArticleAtDue.Create(message: _fArticle.Key, target: _fArticle.StorageAgent)
                               , waitFor: nextRequestAt);
                }
            }
            // Not in Stock and Not ToBuild Agent has to Wait for stock to provide materials
        }
示例#3
0
 public static ResponseFromStock Create(FStockReservation message, IActorRef target)
 {
     return(new ResponseFromStock(message: message, target: target));
 }