Ejemplo n.º 1
0
        public static string Cooperation(WorkflowContext context, ExecutingContext executeContext)
        {
            string           resultTo        = String.Empty;
            Node             current         = context.Current;
            AbstractWorkflow workflowService = WorkflowGlobalServiceProvider.Resolve <AbstractWorkflow>();

            IWorkflowCooperationService workflowCooperationService = workflowService.NodeService.WorkflowCooperationService;
            IStrategyService            strategyService            = (IStrategyService)Utils.CreateInstance(current.Assistant);
            string instanceID = context.Instance.InstanceID;

            workflowService.NodeService.WorkflowCooperationService.Persistent(new WorkflowCooperation
            {
                NodeID       = current.NID,
                InstanceID   = context.Instance.InstanceID,
                TransitionID = context.TransitionID,
                CreateTime   = DateTime.Now
            });

            IList <WorkflowCooperation> records = workflowCooperationService.Query(instanceID).Where(e => e.NodeID == current.NID).ToList();

            executeContext.Result = strategyService.Check(records);
            if (executeContext.Result)
            {
                IWorkflowCooperationDecision workflowCooperationDecision = (IWorkflowCooperationDecision)Utils.CreateInstance(current.Cooperation);
                resultTo = workflowCooperationDecision.Execute(records);
                workflowService.NodeService.WorkflowCooperationService.Delete(instanceID, current.NID);
            }
            else
            {
                workflowService.Actions.ForEach(pluin => pluin.ActionExecute(executeContext));
            }
            return(resultTo);
        }
Ejemplo n.º 2
0
        internal static IDbConnection CreateWorkflowConnection()
        {
            SmartflowConfiguration config =
                WorkflowGlobalServiceProvider.Resolve <ISmartflowConfigurationService>().GetConfiguration();

            return(DbFactory.CreateConnection(config.ProviderName, config.ConnectionString));
        }
Ejemplo n.º 3
0
        public void ActionExecute(ExecutingContext executingContext)
        {
            var current = executingContext.To;

            if (current.NodeType != WorkflowNodeCategory.Decision)
            {
                IWorkflowNodeService workflowNodeService = WorkflowGlobalServiceProvider.Resolve <IWorkflowNodeService>();
                workflowNodeService.Execute(current);
            }
        }
Ejemplo n.º 4
0
        public void Jump(WorkflowContext context)
        {
            string       instanceID        = context.Instance.InstanceID;
            Node         current           = context.Current;
            Transition   currentTransition = WorkflowGlobalServiceProvider.Resolve <IWorkflowTransitionService>().GetTransition(context.TransitionID);
            IList <Node> nodes             = workflowService.NodeService.Query(instanceID);
            Node         to = nodes.FirstOrDefault(e => e.ID == currentTransition.Destination);

            this.Invoke(to, currentTransition, new ExecutingContext
            {
                From      = current,
                To        = to,
                Direction = WorkflowOpertaion.Go,
                Instance  = context.Instance,
                Data      = context.Data,
                Message   = context.Message,
                Result    = context.Result
            }, context);
        }
Ejemplo n.º 5
0
        private void Invoke(Node to, Transition selectTransition, ExecutingContext executeContext, WorkflowContext context)
        {
            string instanceID = context.Instance.InstanceID;
            string actorID    = context.ActorID;

            workflowService.InstanceService.Jump(selectTransition.Origin, selectTransition.Destination, instanceID, new WorkflowProcess()
            {
                RelationshipID = executeContext.From.NID,
                ActorID        = actorID,
                Origin         = executeContext.From.ID,
                Destination    = executeContext.To.ID,
                TransitionID   = selectTransition.NID,
                InstanceID     = executeContext.Instance.InstanceID,
                NodeType       = executeContext.From.NodeType,
                Direction      = WorkflowOpertaion.Go
            }, workflowService.ProcessService);

            workflowService.Actions.ForEach(pluin => pluin.ActionExecute(executeContext));
            if (to.NodeType == WorkflowNodeCategory.End)
            {
                workflowService.InstanceService.Transfer(WorkflowInstanceState.End, instanceID);
            }
            else if (to.NodeType == WorkflowNodeCategory.Decision)
            {
                Transition transition = workflowService.NodeService.GetTransition(to);
                if (transition == null)
                {
                    return;
                }
                Node nc = workflowService.NodeService.Query(instanceID).Where(e => e.ID == transition.Origin).FirstOrDefault();
                Jump(new WorkflowContext()
                {
                    Instance     = WorkflowInstance.GetInstance(instanceID),
                    TransitionID = transition.NID,
                    Data         = context.Data,
                    Message      = "系统流转",
                    ActorID      = context.ActorID,
                    Current      = nc
                });
            }
            else if (to.NodeType == WorkflowNodeCategory.Fork)
            {
                foreach (Transition transition in to.Transitions)
                {
                    Jump(new WorkflowContext()
                    {
                        Instance     = WorkflowInstance.GetInstance(instanceID),
                        TransitionID = transition.NID,
                        Data         = context.Data,
                        Message      = "系统流转",
                        ActorID      = context.ActorID,
                        Current      = executeContext.To
                    });
                }
            }
            else if (to.NodeType == WorkflowNodeCategory.Merge)
            {
                IList <Transition> transitions =
                    WorkflowGlobalServiceProvider.Resolve <IWorkflowTransitionService>().Query(instanceID);
                int transitonCount = transitions.Count(e => e.Destination == to.ID);
                var newInstance    = WorkflowInstance.GetInstance(instanceID);
                int mergeCount     = WorkflowGlobalServiceProvider.Resolve <IWorkflowLinkService>().GetLink(to.ID, instanceID);

                if (transitonCount == mergeCount)
                {
                    foreach (Transition transition in to.Transitions)
                    {
                        Jump(new WorkflowContext()
                        {
                            Instance     = WorkflowInstance.GetInstance(instanceID),
                            TransitionID = transition.NID,
                            Data         = context.Data,
                            Message      = "系统流转",
                            ActorID      = context.ActorID,
                            Current      = executeContext.To
                        });
                    }
                }
            }
        }