コード例 #1
0
ファイル: TimeProviderTests.cs プロジェクト: dmytrokulak/Epok
        public void CanAddAdjusted_Workdays_Success()
        {
            var ts = TimeSpan.FromHours(10);
            var dt = new DateTimeOffset(2020, 01, 02, 10, 0, 0, TimeSpan.Zero);

            var result   = _timeProvider.Add(dt, ts);
            var expected = new DateTimeOffset(2020, 01, 03, 11, 0, 0, TimeSpan.Zero);

            Assert.That(result, Is.EqualTo(expected));
        }
コード例 #2
0
        private async Task <DateTimeOffset> CalculateTimeToCompletion(InventoryItem item, DateTimeOffset eta)
        {
            if (item.Article.ProductionShopCategory == null)
            {
                return(eta);
            }

            var amountInStock = await _inventoryRepo.FindSpareInventoryAsync(item.Article);

            if (amountInStock == item.Amount)
            {
                return(eta);
            }

            var subItem      = new InventoryItem(item.Article, item.Amount - amountInStock);
            var componentEta = _timeProvider.Add(subItem.EarliestProductionStartTime, item.TimeToProduce);

            //ToDo:3 check if CalculateTimeToCompletionAsync returns the max level as sum of all iterations
            //or only takes into account the longest timespan at second step
            return(item.Article.PrimaryBillOfMaterial.Input
                   .Select(async i => await CalculateTimeToCompletion(i, componentEta))
                   .Max(t => t.Result));
        }
コード例 #3
0
        /// <inheritdoc />
        public async void SetStep(int step)
        {
            // don't set step if finalizing
            if (m_Finalizing)
            {
                return;
            }

            // buffer the previous step numbers
            int m_LastStep     = m_CurrentStep;
            int m_LastDataStep = m_CurrentDataStep;

            // pause the time until we are done switching steps
            bool pauseState = m_TimeProvider.paused;

            m_TimeProvider.paused = true;

            // now advance/move back to the new step
            Action functor = null;
            int    diff    = 0;


            if (step > m_LastStep)
            {
                functor = AdvanceStep;
                diff    = step - m_LastStep;
            }
            else if (step < m_LastStep)
            {
                functor = RetreatStep;
                diff    = m_LastStep - step;
            }
            else
            {
                //restore state before attempt
                m_TimeProvider.paused = pauseState;
                return;
            }

            for (int i = 0; i < diff; ++i)
            {
                functor.Invoke();
            }

            // record time for previous step
            float stepTime = (float)m_TimeProvider.elapsed.TotalSeconds;

            m_TimeTrackingRepo.currentTime.durationsPerStep[m_LastStep] = stepTime;

            m_Finalizing = true;

            // invoke step event
            m_EventBroker?.Invoke(new WorkflowStepEndedArgs()
            {
                lastStep              = m_LastStep
                , lastDataStep        = m_LastDataStep
                , newStep             = m_CurrentStep
                , newDataStep         = m_CurrentDataStep
                , executedRepetitions = m_CurrentRepetition
            });

            try
            {
                await WaitForFinalizers(m_FinalizerTokenSource.Token);
            }
            catch (TaskCanceledException)
            {
                // Cancellation means we ended the workflow(quit), don't finalize
                m_Finalizing = false;
                return;
            }

            m_Finalizing = false;

            // stop workflow if we reached the end
            if (m_CurrentStep >= currentWorkflowData.numTotalSteps)
            {
                if (m_LastDataStep != -1)
                {
                    m_DisposalService.Dispose(m_CurrentWorkflowData.steps[m_LastDataStep].id);
                }
                StopWork();
                return;
            }

            // restore time for current step
            m_TimeProvider.Reset(false);
            float currentTime = m_TimeTrackingRepo.currentTime.durationsPerStep[m_CurrentStep];

            m_TimeProvider.paused = false;
            m_TimeProvider.Add(TimeSpan.FromSeconds(currentTime));

            LogStepTimings();
            AciLog.Log("WorkflowManager", $"Workflow Step, {m_CurrentStep}");
            AciLog.Log("WorkflowManager", $"Data Step: {m_CurrentDataStep}");

            if (m_LastDataStep != -1)
            {
                m_DisposalService.Dispose(m_CurrentWorkflowData.steps[m_LastDataStep].id);
            }

            m_StepTriggerFactory.Create(m_CurrentWorkflowData.steps[currentDataStep]);

            // invoke step event
            m_EventBroker?.Invoke(new WorkflowStepFinalizedArgs()
            {
                lastStep              = m_LastStep
                , lastDataStep        = m_LastDataStep
                , newStep             = m_CurrentStep
                , newDataStep         = m_CurrentDataStep
                , executedRepetitions = m_CurrentRepetition
            });
        }