Example #1
0
        protected virtual bool Visit <TInstance>(TransitionActivity <TInstance> activity)
            where TInstance : class
        {
            Trace.WriteLine("({0})[{1}] ==> ({2})".FormatWith(activity.State, activity.Event, activity.TargetState));

            return(true);
        }
Example #2
0
        public InitialIfNullStateAccessor(State <TInstance> initialState, StateAccessor <TInstance> stateAccessor)
        {
            _stateAccessor = stateAccessor;

            Activity <TInstance> initialActivity = new TransitionActivity <TInstance>(initialState, _stateAccessor);

            _initialBehavior = new LastBehavior <TInstance>(initialActivity);
        }
        /// <summary>
        ///     Transition a state machine instance to a specific state, producing any events related
        ///     to the transaction such as leaving the previous state and entering the target state
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <param name="composer"></param>
        /// <param name="instance">The state instance</param>
        /// <param name="accessor"></param>
        /// <param name="state">The target state</param>
        public static void TransitionToState <TInstance>(Composer composer, TInstance instance, StateAccessor <TInstance> accessor,
                                                         State <TInstance> state)
            where TInstance : class
        {
            Activity <TInstance> activity = new TransitionActivity <TInstance>(state, accessor);

            activity.Execute(composer, instance);
        }
        /// <summary>
        /// Transition the state machine to the Final state
        /// </summary>
        public static EventActivityBinder <TInstance> Finalize <TInstance>(this EventActivityBinder <TInstance> source)
            where TInstance : class
        {
            var state = source.StateMachine.GetState(source.StateMachine.Final.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            return(source.Add(activity));
        }
Example #5
0
        /// <summary>
        /// Transition the state machine to the specified state
        /// </summary>
        public static EventActivityBinder <TInstance> TransitionTo <TInstance>(this EventActivityBinder <TInstance> source, State toState)
            where TInstance : class
        {
            State <TInstance> state = source.StateMachine.GetState(toState.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            return(source.Add(activity));
        }
Example #6
0
        public void Configure(ActivityBuilder <TWorkflow, TInstance> builder)
        {
            StateMachineState <TInstance> targetState = _getTargetState(builder.Model);

            var activity = new TransitionActivity <TInstance>(builder.Model.CurrentStateAccessor, builder.State, builder.Event,
                                                              targetState);

            builder.AddActivity(activity);
        }
        /// <summary>
        /// Transition the state machine to the Completed state
        /// </summary>
        public static EventActivityBinder <TInstance, TData> Finalize <TInstance, TData>(
            this EventActivityBinder <TInstance, TData> source)
            where TInstance : class
        {
            State <TInstance> state = source.StateMachine.Final.For <TInstance>();

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.InstanceStateAccessor);

            return(source.Add(activity));
        }
        /// <summary>
        /// Transition the state machine to the Final state
        /// </summary>
        public static ExceptionActivityBinder <TInstance, TData, TException> Finalize <TInstance, TData, TException>(
            this ExceptionActivityBinder <TInstance, TData, TException> source)
            where TInstance : class
            where TException : Exception
        {
            State <TInstance> state = source.StateMachine.GetState(source.StateMachine.Final.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            return(source.Add(activity));
        }
        /// <summary>
        /// Transition the state machine to the specified state in response to an exception
        /// </summary>
        /// <typeparam name="TInstance"></typeparam>
        /// <typeparam name="TException"></typeparam>
        /// <param name="source"></param>
        /// <param name="toState"></param>
        /// <returns></returns>
        public static ExceptionActivityBinder <TInstance, TException> TransitionTo <TInstance, TException>(
            this ExceptionActivityBinder <TInstance, TException> source, State toState)
            where TInstance : class where TException : Exception
        {
            State <TInstance> state = source.StateMachine.GetState(toState.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            var compensateActivity = new ExecuteOnFaultedActivity <TInstance>(activity);

            return(source.Add(compensateActivity));
        }
        /// <summary>
        ///     Transition a state machine instance to a specific state, producing any events related
        ///     to the transaction such as leaving the previous state and entering the target state
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <param name="machine">The state machine</param>
        /// <param name="instance">The state instance</param>
        /// <param name="state">The target state</param>
        /// <param name="cancellationToken"></param>
        public static Task TransitionToState <TInstance>(this StateMachine <TInstance> machine, TInstance instance, State state,
                                                         CancellationToken cancellationToken = default)
            where TInstance : class
        {
            var accessor = machine.Accessor;
            var toState  = machine.GetState(state.Name);

            Activity <TInstance> activity = new TransitionActivity <TInstance>(toState, accessor);
            Behavior <TInstance> behavior = new LastBehavior <TInstance>(activity);

            var eventContext = new StateMachineEventContext <TInstance>(machine, instance, toState.Enter, cancellationToken);

            BehaviorContext <TInstance> behaviorContext = new EventBehaviorContext <TInstance>(eventContext);

            return(behavior.Execute(behaviorContext));
        }
//        void InspectExceptionActivity(ExceptionActivity<TInstance> exceptionActivity, Action<Activity> next)
//        {
//            Vertex previousEvent = _currentEvent;
//
//            _currentEvent = GetEventVertex(exceptionActivity.Event);
//
//            _edges.Add(new Edge(previousEvent, _currentEvent, _currentEvent.Title));
//
//            next(exceptionActivity);
//
//            _currentEvent = previousEvent;
//        }

//        void InspectTryActivity(TryActivity<TInstance> exceptionActivity, Action<Activity> next)
//        {
//            Vertex previousEvent = _currentEvent;
//
//            next(exceptionActivity);
//
//            _currentEvent = previousEvent;
//        }

        void InspectTransitionActivity(TransitionActivity <TInstance> transitionActivity)
        {
            Vertex targetState = GetStateVertex(transitionActivity.ToState);

            _edges.Add(new Edge(_currentEvent, targetState, _currentEvent.Title));
        }
Example #12
0
        public bool UpdateTransitions(int ProcessID, List <TransitionDTO> list, string flowSTR)
        {
            try
            {
                //مهم و پیچیده نسبتا؟ اگر از جریان کار استفاده شده باشد امکان تغییر جریان کار بررسی شود
                using (var projectContext = new MyProjectEntities())
                {
                    var dbProcess = projectContext.Process.FirstOrDefault(x => x.ID == ProcessID);
                    dbProcess.TransitionFlowSTR = flowSTR;
                    var existingTransitions = list.Where(x => x.ID != 0).Select(x => x.ID).ToList();
                    var listRemove          = dbProcess.Transition.Where(x => !existingTransitions.Contains(x.ID));
                    foreach (var item in listRemove.ToList())
                    {
                        while (item.TransitionActivity.Any())
                        {
                            projectContext.TransitionActivity.Remove(item.TransitionActivity.First());
                        }

                        while (item.TransitionAction.Any())
                        {
                            while (item.TransitionAction.First().TransitionAction_EntityGroup.Any())
                            {
                                projectContext.TransitionAction_EntityGroup.Remove(item.TransitionAction.First().TransitionAction_EntityGroup.First());
                            }
                            while (item.TransitionAction.First().TransitionAction_Formula.Any())
                            {
                                projectContext.TransitionAction_Formula.Remove(item.TransitionAction.First().TransitionAction_Formula.First());
                            }
                            while (item.TransitionAction.First().TransitionActionTarget.Any())
                            {
                                projectContext.TransitionActionTarget.Remove(item.TransitionAction.First().TransitionActionTarget.First());
                            }
                            projectContext.TransitionAction.Remove(item.TransitionAction.First());
                        }
                        //item.TransitionAction.Clear();
                        //item.TransitionActivity.Clear();

                        projectContext.Transition.Remove(item);
                    }
                    foreach (var message in list)
                    {
                        Transition dbTransition = null;
                        if (message.ID == 0)
                        {
                            dbTransition = new Transition();
                            projectContext.Transition.Add(dbTransition);
                        }
                        else
                        {
                            dbTransition = projectContext.Transition.FirstOrDefault(x => x.ID == message.ID);
                        }

                        dbTransition.CurrentStateID = message.CurrentStateID;

                        dbTransition.ProcessID   = message.ProcessID;
                        dbTransition.NextStateID = message.NextStateID;
                        dbTransition.Name        = message.Name;

                        List <TransitionActivity> removeActivity = new List <TransitionActivity>();
                        foreach (var dbActivity in dbTransition.TransitionActivity)
                        {
                            if (!message.TransitionActivities.Any(x => x.ID == dbActivity.ActivityID))
                            {
                                removeActivity.Add(dbActivity);
                            }
                        }
                        foreach (var citem in removeActivity)
                        {
                            projectContext.TransitionActivity.Remove(citem);
                        }

                        foreach (var msgActivity in message.TransitionActivities)
                        {
                            TransitionActivity dbTransitionActivity = null;
                            if (!dbTransition.TransitionActivity.Any(x => msgActivity.ID != 0 && x.ActivityID == msgActivity.ID))
                            {
                                dbTransitionActivity = new TransitionActivity();
                                dbTransition.TransitionActivity.Add(dbTransitionActivity);
                            }
                            else
                            {
                                dbTransitionActivity = dbTransition.TransitionActivity.FirstOrDefault(x => x.ActivityID == msgActivity.ID);
                            }
                            dbTransitionActivity.ActivityID = msgActivity.ID;
                        }


                        List <TransitionAction> removeAction = new List <TransitionAction>();
                        foreach (var dbAction in dbTransition.TransitionAction)
                        {
                            if (!message.TransitionActions.Any(x => x.ID == dbAction.ID))
                            {
                                removeAction.Add(dbAction);
                            }
                        }
                        foreach (var citem in removeAction)
                        {
                            while (citem.TransitionAction_EntityGroup.Any())
                            {
                                projectContext.TransitionAction_EntityGroup.Remove(citem.TransitionAction_EntityGroup.First());
                            }
                            while (citem.TransitionAction_Formula.Any())
                            {
                                projectContext.TransitionAction_Formula.Remove(citem.TransitionAction_Formula.First());
                            }
                            while (citem.TransitionActionTarget.Any())
                            {
                                projectContext.TransitionActionTarget.Remove(citem.TransitionActionTarget.First());
                            }
                            projectContext.TransitionAction.Remove(citem);
                        }

                        foreach (var msgTransitionAction in message.TransitionActions)
                        {
                            TransitionAction dbTransitionAction = null;
                            if (!dbTransition.TransitionAction.Any(x => msgTransitionAction.ID != 0 && x.ID == msgTransitionAction.ID))
                            {
                                dbTransitionAction = new TransitionAction();
                                dbTransition.TransitionAction.Add(dbTransitionAction);
                            }
                            else
                            {
                                dbTransitionAction = dbTransition.TransitionAction.FirstOrDefault(x => x.ID == msgTransitionAction.ID);
                            }
                            dbTransitionAction.ActionTypeID        = (short)msgTransitionAction.ActionType;
                            dbTransitionAction.MultipleUserEnabled = msgTransitionAction.MultipleUserEnabled;


                            dbTransitionAction.Name = msgTransitionAction.Name;

                            List <TransitionActionTarget> removeTransitionActionTarget = new List <TransitionActionTarget>();
                            foreach (var dbTransitionAction_Target in dbTransitionAction.TransitionActionTarget)
                            {
                                if (!msgTransitionAction.Targets.Any(x => x.ID == dbTransitionAction_Target.ID))
                                {
                                    removeTransitionActionTarget.Add(dbTransitionAction_Target);
                                }
                            }
                            foreach (var citem in removeTransitionActionTarget)
                            {
                                projectContext.TransitionActionTarget.Remove(citem);
                            }

                            foreach (var item in msgTransitionAction.Targets)
                            {
                                TransitionActionTarget dbTransitionActionTarget = dbTransitionAction.TransitionActionTarget.FirstOrDefault(x => item.ID != 0 && x.ID == item.ID);
                                if (dbTransitionActionTarget == null)
                                {
                                    dbTransitionActionTarget = new TransitionActionTarget();
                                    dbTransitionAction.TransitionActionTarget.Add(dbTransitionActionTarget);
                                }
                                dbTransitionActionTarget.TargetType = (Int16)item.TargetType;
                                //    dbTransitionActionTarget.CanSendOtherOrganizations = item.CanSendOtherOrganizations;
                                if (dbTransitionActionTarget.RoleTypeID != 0)
                                {
                                    dbTransitionActionTarget.RoleTypeID = item.RoleTypeID;
                                }
                                else
                                {
                                    dbTransitionActionTarget.RoleTypeID = null;
                                }
                            }

                            List <TransitionAction_Formula> removeTransitionAction_Formula = new List <TransitionAction_Formula>();
                            foreach (var dbTransitionAction_Formula in dbTransitionAction.TransitionAction_Formula)
                            {
                                if (!msgTransitionAction.Formulas.Any(x => x.FormulaID == dbTransitionAction_Formula.FormulaID))
                                {
                                    removeTransitionAction_Formula.Add(dbTransitionAction_Formula);
                                }
                            }
                            foreach (var citem in removeTransitionAction_Formula)
                            {
                                projectContext.TransitionAction_Formula.Remove(citem);
                            }

                            foreach (var item in msgTransitionAction.Formulas)
                            {
                                TransitionAction_Formula dbTransitionAction_Formula = dbTransitionAction.TransitionAction_Formula.FirstOrDefault(x => item.FormulaID != 0 && x.FormulaID == item.FormulaID);
                                if (dbTransitionAction_Formula == null)
                                {
                                    dbTransitionAction_Formula = new TransitionAction_Formula();
                                    dbTransitionAction.TransitionAction_Formula.Add(dbTransitionAction_Formula);
                                }
                                dbTransitionAction_Formula.TrueFalse = item.TrueFalse;
                                dbTransitionAction_Formula.FormulaID = item.FormulaID;
                                dbTransitionAction_Formula.Message   = item.Message;
                            }
                            List <TransitionAction_EntityGroup> removeTransitionAction_EntityGroup = new List <TransitionAction_EntityGroup>();
                            foreach (var dbTransitionAction_EntityGroup in dbTransitionAction.TransitionAction_EntityGroup)
                            {
                                if (!msgTransitionAction.EntityGroups.Any(x => x.ID == dbTransitionAction_EntityGroup.EntityGroupID))
                                {
                                    removeTransitionAction_EntityGroup.Add(dbTransitionAction_EntityGroup);
                                }
                            }
                            foreach (var citem in removeTransitionAction_EntityGroup)
                            {
                                projectContext.TransitionAction_EntityGroup.Remove(citem);
                            }

                            foreach (var item in msgTransitionAction.EntityGroups)
                            {
                                TransitionAction_EntityGroup dbTransitionAction_EntityGroup = dbTransitionAction.TransitionAction_EntityGroup.FirstOrDefault(x => item.ID != 0 && x.EntityGroupID == item.ID);
                                if (dbTransitionAction_EntityGroup == null)
                                {
                                    dbTransitionAction_EntityGroup = new TransitionAction_EntityGroup();
                                    dbTransitionAction.TransitionAction_EntityGroup.Add(dbTransitionAction_EntityGroup);
                                }
                                dbTransitionAction_EntityGroup.EntityGroupID = item.ID;
                            }
                        }
                    }

                    projectContext.SaveChanges();
                    return(true);
                }
            }
            catch (Exception ex)
            {
                return(false);
            }
        }