SimulationHistory GetSimHistory() { var history = new SimulationHistory { Duration = CurrentTime, WaitingTime = SimProcedures.Sum(x => x.WaitingTime), TotalCost = SimResources.Sum(x => x.Resource.Price), Complexity = Complexity, Step = Step, DateTime = DateTime.Now, Resources = SimResources.Select(x => new ResourceHistory { ResourceName = x.Resource.ResourceName, ResourceId = x.Resource.ResourceId, Cost = x.Resource.Price, UseTime = x.ActiveTime.Sum(t => t.Item2 - t.Item1), Downtime = CurrentTime - x.ActiveTime.Sum(t => t.Item2 - t.Item1), UseHistory = x.ActiveTime.Select(t => new ResourceUseHistory { StartTime = t.Item1, EndTime = t.Item2 }).ToList(), }).ToList(), Procedures = SimProcedures.Select(x => new ProcedureHistory { ProcedureName = x.Procedure.Name, ProcedureAlias = x.Procedure.Alias, StartTime = x.StartTime, EndTime = x.EndTime, WaitingTime = x.WaitingTime, RandomEvents = x.SimRandomEvents.Where(e => e.IsHappened).Select(e => new RandomEventHistory { EventName = e.Event.EventName, EventAlias = e.Event.EventAlias, StartTime = e.TimeStart, EndTime = e.TimeEnd }).ToList() }).ToList() }; return(history); }
public void UpdateState(int currentTime, int step) { switch (Status) { case ProcedureStatus.NotStarted: { if (SimResources.All(x => x.Status == ResourceStatus.Free)) { Status = ProcedureStatus.Started; StartTime = currentTime; SetResourcesStatus(ResourceStatus.Busy, currentTime); InitRandomEvents(); } else { WaitingTime += step; } break; } case ProcedureStatus.Started: { var completionLevel = GetProgressFunctionValue(currentTime - StartTime); if (Double.IsNaN(completionLevel)) { throw new SimulationException($"Не хватает значений параметров процедуры {Procedure.Alias}"); } if (completionLevel >= 1) { if (!IsAllRandomEventsCompleted) { IsAllRandomEventsCompleted = CheckRandomEventsStatus(); } if (!IsAllRandomEventsCompleted) { UpdateEventsState(currentTime); IsAllRandomEventsCompleted = CheckRandomEventsStatus(); } if (IsAllRandomEventsCompleted) { Status = ProcedureStatus.Finished; EndTime = currentTime; SetResourcesStatus(ResourceStatus.Free, currentTime); foreach (var procedure in NextProcedures) { procedure.UpdateState(currentTime, step); } } } break; } case ProcedureStatus.Finished: { foreach (var procedure in NextProcedures) { procedure.UpdateState(currentTime, step); } break; } } }