using Elsa.Common.Entities; using Elsa.Workflows.Runtime.Contracts; using Elsa.Workflows.Runtime.Filters; using Elsa.Workflows.Runtime.Models; using Elsa.Workflows.Runtime.OrderDefinitions; namespace Elsa.Workflows.Runtime.Services; /// public class ActivityExecutionService : IActivityExecutionService { private readonly IActivityExecutionStore _store; /// /// Initializes a new instance of the class. /// public ActivityExecutionService(IActivityExecutionStore store) { _store = store; } /// public async Task> GetStatsAsync(string workflowInstanceId, IEnumerable activityIds, CancellationToken cancellationToken = default) { var filter = new ActivityExecutionRecordFilter { WorkflowInstanceId = workflowInstanceId, ActivityIds = activityIds.ToList() }; var order = new ActivityExecutionRecordOrder(x => x.StartedAt, OrderDirection.Ascending); var records = (await _store.FindManyAsync(filter, order, cancellationToken)).ToList(); var groupedRecords = records.GroupBy(x => x.ActivityId).ToList(); var stats = groupedRecords.Select(grouping => new ActivityExecutionStats { ActivityId = grouping.Key, StartedCount = grouping.Count(), CompletedCount = grouping.Count(x => x.CompletedAt != null), UncompletedCount = grouping.Count(x => x.CompletedAt == null), IsBlocked = grouping.Any(x => x.HasBookmarks) }).ToList(); return stats; } /// public async Task GetStatsAsync(string workflowInstanceId, string activityId, CancellationToken cancellationToken = default) { var stats = (await GetStatsAsync(workflowInstanceId, new[] { activityId }, cancellationToken)).FirstOrDefault(); return stats ?? new ActivityExecutionStats { ActivityId = activityId }; } }