public void TestBackwardSchedulingTransitionTimeForeachOperationIsCorrect( string testConfigurationFileName) { InitThisTest(testConfigurationFileName); IDbTransactionData dbTransactionData = ZppConfiguration.CacheManager.ReloadTransactionData(); foreach (var productionOrderBomAsDemand in dbTransactionData.ProductionOrderBomGetAll()) { ProductionOrderBom productionOrderBom = (ProductionOrderBom)productionOrderBomAsDemand; int expectedStartBackward = productionOrderBom.GetStartTimeBackward().GetValue() + TransitionTimer.GetTransitionTimeFactor() * productionOrderBom.GetDurationOfOperation().GetValue(); int actualStartBackward = productionOrderBom.GetStartTimeOfOperation().GetValue(); Assert.True(expectedStartBackward.Equals(actualStartBackward), $"The transition time before operationStart is not correct: " + $"expectedStartBackward: {expectedStartBackward}, actualStartBackward {actualStartBackward}"); int expectedEndBackward = productionOrderBom.GetStartTimeOfOperation().GetValue() + productionOrderBom.GetDurationOfOperation().GetValue(); int actualEndBackward = productionOrderBom.GetEndTimeBackward().GetValue(); Assert.True(expectedEndBackward.Equals(actualEndBackward), $"EndBackward is not correct: " + $"expectedEndBackward: {expectedEndBackward}, actualEndBackward {actualEndBackward}"); } }
/** * Bottom-Up-Traversal */ private void ValidatePredecessorOperationsTransitionTimeIsCorrect( IStackSet <ProductionOrderOperation> predecessorOperations, ProductionOrderOperation lastOperation, IDirectedGraph <INode> operationGraph, IStackSet <INode> traversedOperations) { if (predecessorOperations == null) { return; } foreach (var currentPredecessor in predecessorOperations) { if (currentPredecessor.GetType() == typeof(ProductionOrderOperation)) { ProductionOrderOperation currentOperation = currentPredecessor; traversedOperations.Push(new Node(currentPredecessor)); // transition time MUST be before the start of Operation int expectedStartBackwardLowerLimit = lastOperation.GetValue().EndBackward.GetValueOrDefault() + TransitionTimer.GetTransitionTimeFactor() * currentOperation.GetValue().Duration; int actualStartBackward = currentOperation.GetValue().StartBackward .GetValueOrDefault(); Assert.True(actualStartBackward >= expectedStartBackwardLowerLimit, $"The transition time between the operations is not correct: " + $"expectedStartBackward: {expectedStartBackwardLowerLimit}, actualStartBackward {actualStartBackward}"); INodes predecessorNodesRecursive = operationGraph.GetPredecessorNodesRecursive(new Node(currentPredecessor)); if (predecessorNodesRecursive != null) { IStackSet <ProductionOrderOperation> newPredecessorNodes = new StackSet <ProductionOrderOperation>( predecessorNodesRecursive.Select(x => (ProductionOrderOperation)x.GetEntity())); ValidatePredecessorOperationsTransitionTimeIsCorrect(newPredecessorNodes, currentOperation, operationGraph, traversedOperations); } } else { throw new MrpRunException( "ProductionOrderToOperationGraph should only contain productionOrders/operations."); } } }