public void ProcessStockOutputRequest(StockOutputRequest stockOutputRequest)
        {
            StockOutputResponse stockOutputResponse = new StockOutputResponse(stockOutputRequest.ConverterStream);

            stockOutputResponse.AdoptHeader(stockOutputRequest);
            stockOutputResponse.Order = stockOutputRequest.Order.Clone();

            if ((this.generateBoxId) &&
                (String.IsNullOrEmpty(stockOutputRequest.Order.BoxNumber)))
            {
                stockOutputRequest.Order.BoxNumber = nextBoxId.ToString();
                nextBoxId++;
            }

            // create SimulatorOutputOrder to handle output result.
            SimulatorOutputOrder outputOrder = new SimulatorOutputOrder(
                this.stock,
                this.simulatorTenant,
                this.simulatorStockLocation,
                stockOutputRequest,
                this.outputResult,
                this.enableAutoReply,
                this.converterStreamList);

            outputOrder.OutputOrderUpdated += this.OutputOrder_OutputOrderUpdated;
            this.orderList.Add(outputOrder);

            stockOutputResponse.ConverterStream.Write(stockOutputResponse);

            this.DoOutputOrderListUpdated();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="OutputRequestSmallSet"/> class.
        /// </summary>
        /// <param name="message">The message to use for initialization.</param>
        public OutputRequestSmallSet(MosaicMessage message)
        {
            StockOutputRequest request = (StockOutputRequest)message;

            this.Id          = request.ID;
            this.Source      = request.Source;
            this.Destination = request.Destination;

            this.Details                   = new Details();
            this.Details.Priority          = TypeConverter.ConvertOutputPriority(request.Order.Priority);
            this.Details.OutputDestination = request.Order.OutputNumber.ToString();

            if (request.Order.Items.Count > 0)
            {
                this.Criteria = new Criteria[request.Order.Items.Count];

                for (int i = 0; i < this.Criteria.Length; ++i)
                {
                    var item = request.Order.Items[i];
                    this.Criteria[i] = new Criteria()
                    {
                        ArticleId         = string.IsNullOrEmpty(item.RobotArticleCode) ? null : TextConverter.EscapeInvalidXmlChars(item.RobotArticleCode),
                        Quantity          = item.RequestedQuantity,
                        BatchNumber       = string.IsNullOrEmpty(item.BatchNumber) ? null : TextConverter.EscapeInvalidXmlChars(item.BatchNumber),
                        ExternalId        = string.IsNullOrEmpty(item.ExternalID) ? null : TextConverter.EscapeInvalidXmlChars(item.ExternalID),
                        PackId            = (item.PackID == 0) ? null : ((ulong)item.PackID).ToString(),
                        MinimumExpiryDate = TypeConverter.ConvertDateNull(item.ExpiryDate)
                    };
                }
            }
        }
        public void DirectOutput(RobotPack pack)
        {
            // send a output response to every PMR conencted and matching tenant.
            foreach (IConverterStream stream in this.converterStreamList)
            {
                if (pack.TenantID != stream.TenantID)
                {
                    continue;
                }

                StockOutputRequest stockOutputRequest = new StockOutputRequest(stream);
                stockOutputRequest.ID       = "1"; // is always 1
                stockOutputRequest.TenantID = pack.TenantID;

                int machineLocation;
                if (int.TryParse(pack.MachineLocation, out machineLocation))
                {
                    stockOutputRequest.Source = machineLocation;
                }
                stockOutputRequest.Destination = 100;

                stockOutputRequest.Order = new StockOutputOrder();
                stockOutputRequest.Order.OutputNumber = 1;

                StockOutputOrderItem orderItem = new StockOutputOrderItem();
                orderItem.RobotArticleCode = pack.RobotArticleCode;
                orderItem.PackID           = pack.ID;
                if (pack.SubItemQuantity == 0)
                {
                    orderItem.RequestedQuantity = 1;
                }
                else
                {
                    orderItem.RequestedSubItemQuantity = pack.SubItemQuantity;
                }

                stockOutputRequest.Order.Items.Add(orderItem);

                // create SimulatorOutputOrder to handle output result.
                SimulatorOutputOrder outputOrder = new SimulatorOutputOrder(
                    this.stock,
                    this.simulatorTenant,
                    this.simulatorStockLocation,
                    stockOutputRequest,
                    OutputResult.Normal,
                    this.enableAutoReply,
                    this.converterStreamList);
                outputOrder.OutputOrderUpdated += this.OutputOrder_OutputOrderUpdated;
                this.orderList.Add(outputOrder);

                this.DoOutputOrderListUpdated();
            }
        }
        /// <summary>
        /// Translates this object instance into a Mosaic message.
        /// </summary>
        /// <param name="converterStream">The converter stream instance which request the message conversion.</param>
        /// <returns>
        /// The Mosaic message representation of this object.
        /// </returns>
        public override MosaicMessage ToMosaicMessage(IConverterStream converterStream)
        {
            StockOutputRequest request = (StockOutputRequest)base.ToMosaicMessage(converterStream);

            if (request == null)
            {
                return(null);
            }

            request.Order.BoxNumber   = this.BoxNumber != null ? this.BoxNumber : string.Empty;
            request.Order.OutputPoint = TypeConverter.ConvertInt(this.Details.OutputPoint);

            if (this.Criteria != null)
            {
                for (int i = 0; i < this.Criteria.Length; ++i)
                {
                    request.Order.Items[i].PackID = (long)TypeConverter.ConvertULong(this.Criteria[i].PackId);
                    request.Order.Items[i].RequestedSubItemQuantity = TypeConverter.ConvertInt(this.Criteria[i].SubItemQuantity);
                    request.Order.Items[i].SingleBatchNumber        = TypeConverter.ConvertBool(this.Criteria[i].SingleBatchNumber);
                    request.Order.Items[i].StockLocationID          = string.IsNullOrEmpty(this.Criteria[i].StockLocationId) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(this.Criteria[i].StockLocationId);
                    request.Order.Items[i].MachineLocation          = string.IsNullOrEmpty(this.Criteria[i].MachineLocation) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(this.Criteria[i].MachineLocation);

                    if (request.Order.Items[i].RequestedSubItemQuantity > 0)
                    {
                        request.Order.Items[i].RequestedQuantity = 0;
                    }

                    if (this.Criteria[i].Label != null)
                    {
                        foreach (var label in this.Criteria[i].Label)
                        {
                            request.Order.Items[i].Labels.Add(new StockOutputOrderItemLabel()
                            {
                                TemplateID = label.TemplateId,
                                Content    = label.RawContent
                            });
                        }
                    }
                }
            }

            return(request);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="OutputRequest"/> class.
        /// </summary>
        /// <param name="message">The message to use for initialization.</param>
        public OutputRequest(MosaicMessage message)
            : base(message)
        {
            StockOutputRequest request = (StockOutputRequest)message;

            this.BoxNumber           = request.Order.BoxNumber;
            this.Details.OutputPoint = request.Order.OutputPoint != 0 ? request.Order.OutputPoint.ToString() : null;

            if (request.Order.Items.Count > 0)
            {
                for (int i = 0; i < this.Criteria.Length; ++i)
                {
                    if (request.Order.Items[i].PackID != 0)
                    {
                        this.Criteria[i].PackId = ((ulong)request.Order.Items[i].PackID).ToString();
                    }

                    if (request.Order.Items[i].RequestedSubItemQuantity > 0)
                    {
                        this.Criteria[i].Quantity        = 0;
                        this.Criteria[i].SubItemQuantity = request.Order.Items[i].RequestedSubItemQuantity.ToString();
                    }

                    foreach (var label in request.Order.Items[i].Labels)
                    {
                        if (this.Criteria[i].Label == null)
                        {
                            this.Criteria[i].Label = new List <Label>();
                        }

                        this.Criteria[i].Label.Add(new Label()
                        {
                            TemplateId = label.TemplateID, RawContent = label.Content
                        });
                    }

                    this.Criteria[i].SingleBatchNumber = request.Order.Items[i].SingleBatchNumber.ToString();
                    this.Criteria[i].StockLocationId   = string.IsNullOrEmpty(request.Order.Items[i].StockLocationID) ? null : TextConverter.EscapeInvalidXmlChars(request.Order.Items[i].StockLocationID);
                    this.Criteria[i].MachineLocation   = string.IsNullOrEmpty(request.Order.Items[i].MachineLocation) ? null : TextConverter.EscapeInvalidXmlChars(request.Order.Items[i].MachineLocation);
                }
            }
        }
        /// <summary>
        /// Translates this object instance into a Mosaic message.
        /// </summary>
        /// <param name="converterStream">The converter stream instance which request the message conversion.</param>
        /// <returns>
        /// The Mosaic message representation of this object.
        /// </returns>
        public virtual MosaicMessage ToMosaicMessage(IConverterStream converterStream)
        {
            StockOutputRequest request = new StockOutputRequest(converterStream);

            request.ID          = this.Id;
            request.Source      = this.Source;
            request.Destination = this.Destination;
            request.Order       = new StockOutputOrder();

            if (this.Details == null)
            {
                return(null);
            }

            request.Order.SourceID     = request.Source;
            request.Order.Priority     = TypeConverter.ConvertOutputPriority(this.Details.Priority);
            request.Order.OutputNumber = TypeConverter.ConvertInt(this.Details.OutputDestination);
            request.Order.OrderNumber  = request.ID.ToString();

            if (this.Criteria != null)
            {
                for (int i = 0; i < this.Criteria.Length; ++i)
                {
                    var criteria = this.Criteria[i];
                    request.Order.Items.Add(new StockOutputOrderItem()
                    {
                        PISArticleCode    = (criteria.ArticleId == null) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(criteria.ArticleId),
                        RequestedQuantity = criteria.Quantity,
                        BatchNumber       = (criteria.BatchNumber == null) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(criteria.BatchNumber),
                        ExternalID        = (criteria.ExternalId == null) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(criteria.ExternalId),
                        PackID            = (long)TypeConverter.ConvertULong(criteria.PackId),
                        ExpiryDate        = TypeConverter.ConvertDate(criteria.MinimumExpiryDate)
                    });
                }
            }

            return(request);
        }
        public SimulatorOutputOrder(
            StorageSystemStock stock,
            SimulatorTenant simulatorTenant,
            SimulatorStockLocation simulatorStockLocation,
            StockOutputRequest outputRequest,
            OutputResult outputResult,
            bool enableAutoReply,
            List <IConverterStream> converterStreamList)
        {
            this.stock                  = stock;
            this.simulatorTenant        = simulatorTenant;
            this.simulatorStockLocation = simulatorStockLocation;
            this.outputRequest          = outputRequest;
            this.outputResult           = outputResult;
            this.stockOutputMessage     = null;
            this.enableAutoReply        = enableAutoReply;
            this.cancelled              = false;
            this.converterStreamList    = converterStreamList;

            this.toCompleteTimer = new System.Threading.Timer(
                this.OutputCompletedTimer,
                null,
                5000, 5000);
        }