コード例 #1
0
        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);
コード例 #2
0
        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()
            });
        }