public static CaseFlow GetCaseFlow(CaseEntity @case) { var averages = new Dictionary <Lite <IWorkflowNodeEntity>, double?>(); averages.AddRange(@case.Workflow.WorkflowActivities().Select(a => KeyValuePair.Create((Lite <IWorkflowNodeEntity>)a.ToLite(), a.AverageDuration()))); averages.AddRange(@case.Workflow.WorkflowEvents().Where(e => e.Type == WorkflowEventType.IntermediateTimer).Select(e => KeyValuePair.Create((Lite <IWorkflowNodeEntity>)e.ToLite(), e.AverageDuration()))); var caseActivities = @case.CaseActivities().Select(ca => new CaseActivityStats { CaseActivity = ca.ToLite(), PreviousActivity = ca.Previous, WorkflowActivity = ca.WorkflowActivity.ToLite(), WorkflowActivityType = (WorkflowActivityType?)(ca.WorkflowActivity as WorkflowActivityEntity) !.Type, WorkflowEventType = (WorkflowEventType?)(ca.WorkflowActivity as WorkflowEventEntity) !.Type, SubWorkflow = (ca.WorkflowActivity as WorkflowActivityEntity).Try(wa => wa.SubWorkflow).Try(sw => sw.Workflow.ToLite()), BpmnElementId = ca.WorkflowActivity.BpmnElementId, Notifications = ca.Notifications().Count(), StartDate = ca.StartDate, DoneDate = ca.DoneDate, DoneType = ca.DoneType, DoneBy = ca.DoneBy, Duration = ca.Duration, AverageDuration = averages.TryGetS(ca.WorkflowActivity.ToLite()), EstimatedDuration = ca.WorkflowActivity is WorkflowActivityEntity ? ((WorkflowActivityEntity)ca.WorkflowActivity).EstimatedDuration : ((WorkflowEventEntity)ca.WorkflowActivity).Timer !.Duration == null ? (double?)null : ((WorkflowEventEntity)ca.WorkflowActivity).Timer !.Duration !.ToTimeSpan().TotalMinutes, }).ToDictionary(a => a.CaseActivity);
public static CaseFlow GetCaseFlow(CaseEntity @case) { var averages = @case.Workflow.WorkflowActivities().Select(w => KVP.Create(w.ToLite(), w.CaseActivities().Average(a => a.Duration))).ToDictionary(); var caseActivities = @case.CaseActivities().Select(ca => new CaseActivityStats { CaseActivity = ca.ToLite(), PreviousActivity = ca.Previous, WorkflowActivity = ca.WorkflowActivity.ToLite(), WorkflowActivityType = ca.WorkflowActivity.Type, SubWorkflow = ca.WorkflowActivity.SubWorkflow.Workflow.ToLite(), BpmnElementId = ca.WorkflowActivity.BpmnElementId, Notifications = ca.Notifications().Count(), StartDate = ca.StartDate, DoneDate = ca.DoneDate, DoneType = ca.DoneType, DoneBy = ca.DoneBy, Duration = ca.Duration, AverageDuration = averages.TryGetS(ca.WorkflowActivity.ToLite()), EstimatedDuration = ca.WorkflowActivity.EstimatedDuration, }).ToDictionary(a => a.CaseActivity); var gr = WorkflowLogic.GetWorkflowNodeGraph(@case.Workflow.ToLite()); var connections = caseActivities.Values .Where(cs => cs.PreviousActivity != null && caseActivities.ContainsKey(cs.PreviousActivity)) .SelectMany(cs => { var prev = caseActivities.GetOrThrow(cs.PreviousActivity); var from = gr.Activities.GetOrThrow(prev.WorkflowActivity); var to = gr.Activities.GetOrThrow(cs.WorkflowActivity); if (IsNormal(prev.DoneType.Value)) { var conns = GetAllConnections(gr, from, to); if (conns.Any()) { return(conns.Select(c => new CaseConnectionStats { BpmnElementId = c.BpmnElementId, Connection = c.ToLite(), FromBpmnElementId = c.From.BpmnElementId, ToBpmnElementId = c.To.BpmnElementId, DoneBy = prev.DoneBy, DoneDate = prev.DoneDate.Value, DoneType = prev.DoneType.Value })); } } return(new[] { new CaseConnectionStats { FromBpmnElementId = from.BpmnElementId, ToBpmnElementId = to.BpmnElementId, DoneBy = prev.DoneBy, DoneDate = prev.DoneDate.Value, DoneType = prev.DoneType.Value } }); }).ToList(); var firsts = caseActivities.Values.Where(a => (a.PreviousActivity == null || !caseActivities.ContainsKey(a.PreviousActivity))); foreach (var f in firsts) { WorkflowEventEntity start = GetStartEvent(@case, f.CaseActivity, gr); connections.AddRange(GetAllConnections(gr, start, gr.Activities.GetOrThrow(f.WorkflowActivity)).Select(c => new CaseConnectionStats { BpmnElementId = c.BpmnElementId, Connection = c.ToLite(), FromBpmnElementId = c.From.BpmnElementId, ToBpmnElementId = c.To.BpmnElementId, DoneBy = f.DoneBy, DoneDate = f.StartDate, })); } if (@case.FinishDate != null) { var lasts = caseActivities.Values.Where(last => !caseActivities.Values.Any(a => a.PreviousActivity.Is(last.CaseActivity))).ToList(); var ends = gr.Events.Values.Where(a => a.Type == WorkflowEventType.Finish); foreach (var last in lasts) { foreach (var end in ends) { connections.AddRange(GetAllConnections(gr, gr.Activities.GetOrThrow(last.WorkflowActivity), end).Select(c => new CaseConnectionStats { BpmnElementId = c.BpmnElementId, Connection = c.ToLite(), FromBpmnElementId = c.From.BpmnElementId, ToBpmnElementId = c.To.BpmnElementId, DoneBy = last.DoneBy, DoneDate = last.DoneDate.Value, })); } } } return(new CaseFlow { Activities = caseActivities.Values.GroupToDictionary(a => a.BpmnElementId), Connections = connections.Where(a => a.BpmnElementId != null).GroupToDictionary(a => a.BpmnElementId), Jumps = connections.Where(a => a.BpmnElementId == null).ToList(), AllNodes = connections.Select(a => a.FromBpmnElementId).Union(connections.Select(a => a.ToBpmnElementId)).ToList() }); }