/** * This is only for initial scheduling within mrp1 */ public OperationBackwardsSchedule ScheduleBackwards( OperationBackwardsSchedule lastOperationBackwardsSchedule, DueTime dueTimeOfProductionOrder) { OperationBackwardsSchedule newOperationBackwardsSchedule; // case: first run if (lastOperationBackwardsSchedule == null) { newOperationBackwardsSchedule = new OperationBackwardsSchedule( dueTimeOfProductionOrder, _productionOrderOperation.GetDuration(), _productionOrderOperation.GetHierarchyNumber()); } // case: equal hierarchyNumber --> PrOO runs in parallel else if (_productionOrderOperation.GetHierarchyNumber() .Equals(lastOperationBackwardsSchedule.GetHierarchyNumber())) { newOperationBackwardsSchedule = new OperationBackwardsSchedule( lastOperationBackwardsSchedule.GetEndOfOperation(), _productionOrderOperation.GetDuration(), _productionOrderOperation.GetHierarchyNumber()); } // case: greaterHierarchyNumber --> PrOO runs after the last PrOO else { if (lastOperationBackwardsSchedule.GetHierarchyNumber() .IsSmallerThan(_productionOrderOperation.GetHierarchyNumber())) { throw new MrpRunException( "This is not allowed: hierarchyNumber of lastBackwardsSchedule " + "is smaller than hierarchyNumber of current PrOO (wasn't sorted ?')."); } newOperationBackwardsSchedule = new OperationBackwardsSchedule( lastOperationBackwardsSchedule.GetStartOfOperation(), _productionOrderOperation.GetDuration(), _productionOrderOperation.GetHierarchyNumber()); } // apply schedule on operation _productionOrderOperation.EndBackward = newOperationBackwardsSchedule.GetEndBackwards().GetValue(); _productionOrderOperation.StartBackward = newOperationBackwardsSchedule.GetStartBackwards().GetValue(); return(newOperationBackwardsSchedule); }
/// <summary> /// /// </summary> /// <param name="article"></param> /// <param name="dbTransactionData"></param> /// <param name="dbMasterDataCache"></param> /// <param name="parentProductionOrder"></param> /// <param name="quantity">of production article to produce /// --> is used for childs as: articleBom.Quantity * quantity</param> /// <returns></returns> public static Demands CreateProductionOrderBoms(M_Article article, Provider parentProductionOrder, Quantity quantity) { IDbTransactionData dbTransactionData = ZppConfiguration.CacheManager.GetDbTransactionData(); M_Article readArticle = dbTransactionData.M_ArticleGetById(article.GetId()); if (readArticle.ArticleBoms != null && readArticle.ArticleBoms.Any()) { List <Demand> newDemands = new List <Demand>(); IProductionOrderBomCreator productionOrderBomCreator = new ProductionOrderBomCreator(); foreach (M_ArticleBom articleBom in readArticle.ArticleBoms) { newDemands.AddRange( productionOrderBomCreator.CreateProductionOrderBomsForArticleBom(articleBom, quantity, (ProductionOrder)parentProductionOrder)); } // backwards scheduling OperationBackwardsSchedule lastOperationBackwardsSchedule = null; IEnumerable <ProductionOrderOperation> sortedProductionOrderOperations = newDemands .Select(x => ((ProductionOrderBom)x).GetProductionOrderOperation()) .OrderByDescending(x => x.GetValue().HierarchyNumber); foreach (var productionOrderOperation in sortedProductionOrderOperations) { lastOperationBackwardsSchedule = productionOrderOperation.ScheduleBackwards( lastOperationBackwardsSchedule, parentProductionOrder.GetStartTimeBackward()); } return(new ProductionOrderBoms(newDemands)); } return(null); }