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 MosaicMessage ToMosaicMessage(IConverterStream converterStream) { StockInputMessage message = new StockInputMessage(converterStream); message.ID = this.Id; message.Source = this.Source; message.Destination = this.Destination; message.IsNewDelivery = TypeConverter.ConvertBool(this.IsNewDelivery); if (this.Article.Count > 0) { foreach (var article in this.Article) { var a = new Interfaces.Types.Articles.RobotArticle(); a.DosageForm = TextConverter.UnescapeInvalidXmlChars(article.DosageForm); a.Code = TextConverter.UnescapeInvalidXmlChars(article.Id); a.Name = TextConverter.UnescapeInvalidXmlChars(article.Name); a.PackagingUnit = TextConverter.UnescapeInvalidXmlChars(article.PackagingUnit); a.MaxSubItemQuantity = TypeConverter.ConvertInt(article.MaxSubItemQuantity); message.Articles.Add(a); foreach (var pack in article.Pack) { var p = new RobotPack { ID = (long)TypeConverter.ConvertULong(pack.Id), DeliveryNumber = TextConverter.UnescapeInvalidXmlChars(pack.DeliveryNumber), BatchNumber = TextConverter.UnescapeInvalidXmlChars(pack.BatchNumber), ExternalID = TextConverter.UnescapeInvalidXmlChars(pack.ExternalId), ExpiryDate = TypeConverter.ConvertDate(pack.ExpiryDate), StockInDate = TypeConverter.ConvertDate(pack.StockInDate), ScanCode = TextConverter.UnescapeInvalidXmlChars(pack.ScanCode), Depth = TypeConverter.ConvertInt(pack.Depth), Width = TypeConverter.ConvertInt(pack.Width), Height = TypeConverter.ConvertInt(pack.Height), Shape = TypeConverter.ConvertEnum <PackShape>(pack.Shape, PackShape.Cuboid), IsBlocked = (TypeConverter.ConvertEnum <PackState>(pack.State, PackState.Available) != PackState.Available), SubItemQuantity = TypeConverter.ConvertInt(pack.SubItemQuantity), StockLocationID = string.IsNullOrEmpty(pack.StockLocationId) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(pack.StockLocationId), MachineLocation = string.IsNullOrEmpty(pack.MachineLocation) ? string.Empty : TextConverter.UnescapeInvalidXmlChars(pack.MachineLocation), IsInFridge = TypeConverter.ConvertBool(pack.IsInFridge) }; message.Packs.Add(p); message.Handlings.Add(p, pack.Handling.Input); } } } return(message); }
public void LoadInput(string articleCode, string articleName, string articleDosageForm, string articlePackagingUnit, int articleMaxSubItemQuantity, string batchNumber, string externalID, DateTime expiryDate, int subItemQuantity, string machineLocation, string tenantID, string stockLocationInfoID, bool updateUI = true) { // 1 add Item to the stock. StockProduct currentStockProduct = this.GetStockProduct(articleCode); RobotPack pack = new RobotPack(); pack.RobotArticleCode = articleCode; pack.ID = this.GetNextPackID(); pack.Depth = 60; pack.Height = 60; pack.Width = 60; pack.Shape = PackShape.Cuboid; pack.BatchNumber = batchNumber; pack.ExternalID = externalID; pack.ExpiryDate = expiryDate; pack.SubItemQuantity = subItemQuantity; pack.MachineLocation = machineLocation; pack.StockLocationID = stockLocationInfoID; pack.TenantID = tenantID; currentStockProduct.AddItem(pack); // 2 update Article Information StorageSystemArticleInformation currentArticleInformation = this.articleInformationList.GetArticleInformation(articleCode, true); currentArticleInformation.Name = articleName; currentArticleInformation.DosageForm = articleDosageForm; currentArticleInformation.PackagingUnit = articlePackagingUnit; currentArticleInformation.MaxSubItemQuantity = articleMaxSubItemQuantity; // 3 forward stock update Event. if (updateUI) { this.DoStockUpdated(); } }
private StockOutputOrderItemPack GetOrderItemPackFromStock( StockOutputOrder outputOrder, StorageSystemArticleInformation articleInformation, RobotPack packInStock) { StockOutputOrderItemPack result = new StockOutputOrderItemPack(); if (articleInformation != null) { result.RobotArticleCode = articleInformation.Code; result.RobotArticleName = articleInformation.Name; result.RobotArticleDosageForm = articleInformation.DosageForm; result.RobotArticlePackagingUnit = articleInformation.PackagingUnit; result.RobotArticleMaxSubItemQuantity = articleInformation.MaxSubItemQuantity; } else { result.RobotArticleCode = packInStock.RobotArticleCode; } result.BoxNumber = outputOrder.BoxNumber; result.BatchNumber = packInStock.BatchNumber; result.Depth = packInStock.Depth; result.Height = packInStock.Height; result.Width = packInStock.Width; result.ExpiryDate = packInStock.ExpiryDate; result.ExternalID = packInStock.ExternalID; result.ID = packInStock.ID; result.LabelState = StockOutputOrderItemPackLabelState.Labelled; result.OutputNumber = outputOrder.OutputNumber; result.OutputPoint = outputOrder.OutputPoint; result.Shape = packInStock.Shape; result.SubItemQuantity = packInStock.SubItemQuantity; result.MachineLocation = packInStock.MachineLocation; result.StockLocationID = packInStock.StockLocationID; result.StockLocationDescription = this.simulatorStockLocation.GetDescription(result.StockLocationID); result.TenantID = packInStock.TenantID; result.TenantDescription = this.simulatorTenant.GetDescription(result.TenantID); return(result); }
private void dataGridViewPackStock_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex == -1) { return; } RobotPack selectedPack = (dataGridViewPackStock.Rows[e.RowIndex].DataBoundItem as RobotPack); if (e.ColumnIndex == this.ColumnStockOutputPack.Index) { this.simulatorCore.OutputCore.DirectOutput(selectedPack); } if (e.ColumnIndex == this.ColumnStockDeletePack.Index) { StockProduct stockProduct = this.simulatorCore.Stock.GetStockProduct(selectedPack.RobotArticleCode); stockProduct.RemoveItem(selectedPack); List <RobotPack> productPackList = stockProduct.GetPackList(""); this.UpdateDataGridView(dataGridViewPackStock, productPackList); dataGridViewProductStock.CurrentRow.Cells["dataGridViewTextBoxColumnStockListPackCount"].Value = productPackList.Count; } }
/// <summary> /// Gets a list of packs which fit to the specified filter criteria list. /// </summary> /// <param name="criteriaList">The criteria list to use.</param> /// <returns>List of packs that match the filter.</returns> public List <RobotPack> GetPacks(List <StockInfoCriteria> criteriaList) { List <RobotPack> resultList = new List <RobotPack>(); StringBuilder cmdBuilder = new StringBuilder(); cmdBuilder.Append("SELECT * FROM RobotPacks "); cmdBuilder.Append(" WHERE TenantID = @TenantID"); cmdBuilder.Append(criteriaList.Count > 0 ? " AND (" : string.Empty); for (int i = 0; i < criteriaList.Count; ++i) { StringBuilder conditionBuilder = new StringBuilder(); if (string.IsNullOrEmpty(criteriaList[i].RobotArticleCode) == false) { conditionBuilder.Append(string.Format("RobotArticleCode=@RobotArticleCode{0}", i)); } if (string.IsNullOrEmpty(criteriaList[i].PISArticleCode) == false) { // recursive with to get all PIS article matching the PISArticleCode and all child articles. (safety limit to 100 recursive select. cmdBuilder.Insert(0, string.Format(@"with RECURSIVE PISArticlesTree(ParentPisArticleID, ID, code, RobotArticleCode, level) as (Select null, ID, code, RobotArticleCode, 0 from PISArticles where code = @PISArticleCode{0} UNION ALL Select pisArticleChild.ParentPisArticleID, pisArticleChild.ID, pisArticleChild.code, pisArticleChild.RobotArticleCode, level + 1 from PISArticles pisArticleChild inner join PISArticlesTree as pisArticleParent on pisArticleChild.ParentPisArticleID = pisArticleParent.id and level < 100) ", i)); // get stock matching the RobotArticleCode of the PIS articles related to the PISArticleCode conditionBuilder.Append("RobotArticleCode in (Select RobotArticleCode from PISArticlesTree where RobotArticleCode is not null)"); } if (string.IsNullOrEmpty(criteriaList[i].BatchNumber) == false) { conditionBuilder.Append(conditionBuilder.Length > 0 ? " AND " : string.Empty); conditionBuilder.Append(string.Format("BatchNumber=@BatchNumber{0}", i)); } if (string.IsNullOrEmpty(criteriaList[i].ExternalID) == false) { conditionBuilder.Append(conditionBuilder.Length > 0 ? " AND " : string.Empty); conditionBuilder.Append(string.Format("ExternalID=@ExternalID{0}", i)); } if (string.IsNullOrEmpty(criteriaList[i].StockLocationID) == false) { conditionBuilder.Append(conditionBuilder.Length > 0 ? " AND " : string.Empty); conditionBuilder.Append(string.Format("StockLocationID=@StockLocationID{0}", i)); } if (string.IsNullOrEmpty(criteriaList[i].MachineLocation) == false) { conditionBuilder.Append(conditionBuilder.Length > 0 ? " AND " : string.Empty); conditionBuilder.Append(string.Format("MachineLocation=@MachineLocation{0}", i)); } if (conditionBuilder.Length == 0) { continue; } cmdBuilder.Append("("); cmdBuilder.Append(conditionBuilder); conditionBuilder.Clear(); cmdBuilder.Append(")"); if (i < criteriaList.Count - 1) { cmdBuilder.Append(" OR "); } } cmdBuilder.Append(criteriaList.Count > 0 ? ")" : string.Empty); cmdBuilder.Append(";"); using (SQLiteCommand cmd = new SQLiteCommand(cmdBuilder.ToString())) { cmd.Parameters.Add(new SQLiteParameter("@TenantID", _tenantId)); for (int i = 0; i < criteriaList.Count; ++i) { if (string.IsNullOrEmpty(criteriaList[i].RobotArticleCode) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@RobotArticleCode{0}", i), criteriaList[i].RobotArticleCode)); } if (string.IsNullOrEmpty(criteriaList[i].PISArticleCode) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@PISArticleCode{0}", i), criteriaList[i].PISArticleCode)); } if (string.IsNullOrEmpty(criteriaList[i].BatchNumber) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@BatchNumber{0}", i), criteriaList[i].BatchNumber)); } if (string.IsNullOrEmpty(criteriaList[i].ExternalID) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@ExternalID{0}", i), criteriaList[i].ExternalID)); } if (string.IsNullOrEmpty(criteriaList[i].StockLocationID) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@StockLocationID{0}", i), criteriaList[i].StockLocationID)); } if (string.IsNullOrEmpty(criteriaList[i].MachineLocation) == false) { cmd.Parameters.Add(new SQLiteParameter(string.Format("@MachineLocation{0}", i), criteriaList[i].MachineLocation)); } } using (DataTable tblResult = _database.Execute(cmd)) { if (tblResult == null) { return(resultList); } foreach (DataRow row in tblResult.Rows) { RobotPack pack = new RobotPack(); pack.Load(row, _database); resultList.Add(pack); } } } cmdBuilder.Clear(); return(resultList); }
public void RemoveItem(RobotPack packInfo) { this.stockPackList.Remove(packInfo); }
public void AddItem(RobotPack packInfo) { this.stockPackList.Add(packInfo); }