public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var paramIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);

            var identityId = paramIdentityId == null ? string.Empty : (string)paramIdentityId.Value;
            var impIdentityId = paramImpIdentityId == null ? identityId : (string)paramImpIdentityId.Value;

            using (MySqlConnection connection = new MySqlConnection(ConnectionString))
            {
                WorkflowProcessInstance inst = WorkflowProcessInstance.SelectByKey(connection, processInstance.ProcessId);
                
                if (inst != null)
                {
                    if (!string.IsNullOrEmpty(transition.To.State))
                        inst.StateName = transition.To.State;

                    inst.ActivityName = transition.To.Name;
                    inst.PreviousActivity = transition.From.Name;

                    if (!string.IsNullOrEmpty(transition.From.State))
                        inst.PreviousState = transition.From.State;

                    if (transition.Classifier == TransitionClassifier.Direct)
                    {
                        inst.PreviousActivityForDirect = transition.From.Name;

                        if (!string.IsNullOrEmpty(transition.From.State))
                            inst.PreviousStateForDirect = transition.From.State;
                    }
                    else if (transition.Classifier == TransitionClassifier.Reverse)
                    {
                        inst.PreviousActivityForReverse = transition.From.Name;
                        if (!string.IsNullOrEmpty(transition.From.State))
                            inst.PreviousStateForReverse = transition.From.State;
                    }

                    inst.Update(connection);
                }

                var history = new WorkflowProcessTransitionHistory()
                {
                    ActorIdentityId = impIdentityId,
                    ExecutorIdentityId = identityId,
                    Id = Guid.NewGuid(),
                    IsFinalised = false,
                    ProcessId = processInstance.ProcessId,
                    FromActivityName = transition.From.Name,
                    FromStateName = transition.From.State,
                    ToActivityName = transition.To.Name,
                    ToStateName = transition.To.State,
                    TransitionClassifier =
                        transition.Classifier.ToString(),
                    TransitionTime = _runtime.RuntimeDateTimeNow,
                    TriggerName = string.IsNullOrEmpty(processInstance.ExecutedTimer) ? processInstance.CurrentCommand : processInstance.ExecutedTimer
                };
                history.Insert(connection);
            }
        }
示例#2
0
        private DateTime?GetNextExecutionDateTime(TimerDefinition timerDefinition, ProcessInstance processInstance = null)
        {
            var timerValueParameterName = GetTimerValueParameterName(timerDefinition);

            if (timerDefinition.Value.Equals(ImmediateTimerValue) || timerDefinition.Value.Equals(InfinityTimerValue))
            {
                if (processInstance == null)
                {
                    return(null);
                }

                if (!processInstance.IsParameterExisting(timerValueParameterName))
                {
                    return(null);
                }

                return(processInstance.GetParameter <DateTime?>(timerValueParameterName));
            }

            if (processInstance != null && processInstance.IsParameterExisting(timerValueParameterName))
            {
                var value = processInstance.GetParameter <DateTime?>(timerValueParameterName);
                if (value != null)
                {
                    return(value);
                }
            }

            switch (timerDefinition.Type)
            {
            case TimerType.Date:
                var date1 = DateTime.Parse(timerDefinition.Value, _runtime.SchemeParsingCulture);
                return(date1.Date);

            case TimerType.DateAndTime:
                var date2 = DateTime.Parse(timerDefinition.Value, _runtime.SchemeParsingCulture);
                return(date2);

            case TimerType.Interval:
                var interval = GetInterval(timerDefinition.Value);
                if (interval <= 0)
                {
                    return(null);
                }
                return(_runtime.RuntimeDateTimeNow.AddMilliseconds(interval));

            case TimerType.Time:
                var now   = _runtime.RuntimeDateTimeNow;
                var date3 = DateTime.Parse(timerDefinition.Value, _runtime.SchemeParsingCulture);
                date3 = now.Date + date3.TimeOfDay;
                if (date3.TimeOfDay < now.TimeOfDay)
                {
                    date3 = date3.AddDays(1);
                }
                return(date3);
            }

            return(_runtime.RuntimeDateTimeNow);
        }
        //
        // Conditions
        //
        private bool ShouldExecuteActivity(ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter)
        {
            if (string.IsNullOrWhiteSpace(actionParameter))
            {
                return(true);
            }
            if (!processInstance.IsParameterExisting("ShouldExecute"))
            {
                return(true);
            }

            var parameter = processInstance.GetParameter <string>("ShouldExecute");

            if (string.IsNullOrWhiteSpace(parameter))
            {
                return(true);
            }

            var shouldExecuteMap = JsonConvert.DeserializeObject <Dictionary <string, object> >(parameter);

            if (shouldExecuteMap != null &&
                shouldExecuteMap.ContainsKey(actionParameter) &&
                shouldExecuteMap[actionParameter] is bool shouldExecute)
            {
                return(shouldExecute);
            }

            return(true);
        }
        /// <summary>
        /// Updates system parameters of the process in the store
        /// </summary>
        /// <param name="processInstance">Instance of the process</param>
        /// <param name="transition">Last executed transition</param>
        public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var db  = _connector.GetDatabase();
            var key = GetKeyForProcessInstance(processInstance.ProcessId);
            var processInstanceValue = db.StringGet(key);

            if (!processInstanceValue.HasValue)
            {
                throw new ProcessNotFoundException(processInstance.ProcessId);
            }

            var inst = JsonConvert.DeserializeObject <WorkflowProcessInstance>(processInstanceValue);

            var paramIdentityId    = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);
            var identityId         = paramIdentityId == null ? string.Empty : (string)paramIdentityId.Value;
            var impIdentityId      = paramImpIdentityId == null ? identityId : (string)paramImpIdentityId.Value;

            if (!string.IsNullOrEmpty(transition.To.State))
            {
                inst.StateName = transition.To.State;
            }

            inst.ActivityName     = transition.To.Name;
            inst.PreviousActivity = transition.From.Name;

            if (!string.IsNullOrEmpty(transition.From.State))
            {
                inst.PreviousState = transition.From.State;
            }

            if (transition.Classifier == TransitionClassifier.Direct)
            {
                inst.PreviousActivityForDirect = transition.From.Name;

                if (!string.IsNullOrEmpty(transition.From.State))
                {
                    inst.PreviousStateForDirect = transition.From.State;
                }
            }
            else if (transition.Classifier == TransitionClassifier.Reverse)
            {
                inst.PreviousActivityForReverse = transition.From.Name;

                if (!string.IsNullOrEmpty(transition.From.State))
                {
                    inst.PreviousStateForReverse = transition.From.State;
                }
            }

            inst.ParentProcessId = processInstance.ParentProcessId;
            inst.RootProcessId   = processInstance.RootProcessId;

            var history = new WorkflowProcessTransitionHistory()
            {
                ActorIdentityId      = impIdentityId,
                ExecutorIdentityId   = identityId,
                IsFinalised          = false,
                FromActivityName     = transition.From.Name,
                FromStateName        = transition.From.State,
                ToActivityName       = transition.To.Name,
                ToStateName          = transition.To.State,
                TransitionClassifier =
                    transition.Classifier.ToString(),
                TransitionTime = _runtime.RuntimeDateTimeNow,
                TriggerName    = string.IsNullOrEmpty(processInstance.ExecutedTimer) ? processInstance.CurrentCommand : processInstance.ExecutedTimer
            };

            var batch = db.CreateBatch();

            batch.StringSetAsync(key, JsonConvert.SerializeObject(inst));
            batch.ListRightPushAsync(GetKeyForProcessHistory(processInstance.ProcessId), JsonConvert.SerializeObject(history));
            batch.Execute();
        }
        public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var paramIdentityId    = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId =
                processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);

            var identityId    = paramIdentityId == null ? string.Empty : (string)paramIdentityId.Value;
            var impIdentityId = paramImpIdentityId == null ? identityId : (string)paramImpIdentityId.Value;

            var cache =
                Store.GetOrCreateCache <Guid, WorkflowProcessInstance>(IgniteConstants.WorkflowProcessInstanceCacheName);
            var inst = cache.Get(processInstance.ProcessId);

            if (inst != null)
            {
                if (!string.IsNullOrEmpty(transition.To.State))
                {
                    inst.StateName = transition.To.State;
                }

                inst.ActivityName     = transition.To.Name;
                inst.PreviousActivity = transition.From.Name;

                if (!string.IsNullOrEmpty(transition.From.State))
                {
                    inst.PreviousState = transition.From.State;
                }

                if (transition.Classifier == TransitionClassifier.Direct)
                {
                    inst.PreviousActivityForDirect = transition.From.Name;

                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousStateForDirect = transition.From.State;
                    }
                }
                else if (transition.Classifier == TransitionClassifier.Reverse)
                {
                    inst.PreviousActivityForReverse = transition.From.Name;
                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousStateForReverse = transition.From.State;
                    }
                }

                inst.ParentProcessId = processInstance.ParentProcessId;
                inst.RootProcessId   = processInstance.RootProcessId;

                cache.Put(inst.Id, inst);
            }

            var history = new WorkflowProcessTransitionHistory
            {
                ActorIdentityId    = impIdentityId,
                ExecutorIdentityId = identityId,
                Id                   = Guid.NewGuid(),
                IsFinalised          = false,
                ProcessId            = processInstance.ProcessId,
                FromActivityName     = transition.From.Name,
                FromStateName        = transition.From.State,
                ToActivityName       = transition.To.Name,
                ToStateName          = transition.To.State,
                TransitionClassifier =
                    transition.Classifier.ToString(),
                TransitionTime = _runtime.RuntimeDateTimeNow,
                TriggerName    =
                    string.IsNullOrEmpty(processInstance.ExecutedTimer)
                        ? processInstance.CurrentCommand
                        : processInstance.ExecutedTimer
            };

            var cacheTransition =
                Store.GetOrCreateCache <Guid, WorkflowProcessTransitionHistory>(
                    IgniteConstants.WorkflowProcessTransitionHistoryCacheName);

            cacheTransition.Put(history.Id, history);
        }
示例#6
0
        public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var paramIdentityId    = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);

            var identityId    = paramIdentityId == null ? string.Empty : (string)paramIdentityId.Value;
            var impIdentityId = paramImpIdentityId == null ? identityId : (string)paramImpIdentityId.Value;

            var dbcoll = Store.GetCollection <WorkflowProcessInstance>(MongoDBConstants.WorkflowProcessInstanceCollectionName);
            var inst   = dbcoll.Find(x => x.Id == processInstance.ProcessId).FirstOrDefault();

            if (inst != null)
            {
                if (!string.IsNullOrEmpty(transition.To.State))
                {
                    inst.StateName = transition.To.State;
                }

                inst.ActivityName     = transition.To.Name;
                inst.PreviousActivity = transition.From.Name;

                if (!string.IsNullOrEmpty(transition.From.State))
                {
                    inst.PreviousState = transition.From.State;
                }

                if (transition.Classifier == TransitionClassifier.Direct)
                {
                    inst.PreviousActivityForDirect = transition.From.Name;

                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousStateForDirect = transition.From.State;
                    }
                }
                else if (transition.Classifier == TransitionClassifier.Reverse)
                {
                    inst.PreviousActivityForReverse = transition.From.Name;
                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousStateForReverse = transition.From.State;
                    }
                }

                inst.ParentProcessId = processInstance.ParentProcessId;
                inst.RootProcessId   = processInstance.RootProcessId;

                Save(dbcoll, inst, doc => doc.Id == inst.Id);
            }

            var history = new WorkflowProcessTransitionHistory
            {
                ActorIdentityId    = impIdentityId,
                ExecutorIdentityId = identityId,
                Id                   = Guid.NewGuid(),
                IsFinalised          = transition.To.IsFinal,
                ProcessId            = processInstance.ProcessId,
                FromActivityName     = transition.From.Name,
                FromStateName        = transition.From.State,
                ToActivityName       = transition.To.Name,
                ToStateName          = transition.To.State,
                TransitionClassifier =
                    transition.Classifier.ToString(),
                TransitionTime = _runtime.RuntimeDateTimeNow,
                TriggerName    = string.IsNullOrEmpty(processInstance.ExecutedTimer) ? processInstance.CurrentCommand : processInstance.ExecutedTimer
            };

            var dbcollTransition = Store.GetCollection <WorkflowProcessTransitionHistory>(MongoDBConstants.WorkflowProcessTransitionHistoryCollectionName);

            dbcollTransition.InsertOne(history);
        }
示例#7
0
        public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var paramIdentityId    = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);

            string identityId    = paramIdentityId == null ? string.Empty : (string)paramIdentityId.Value;
            string impIdentityId = paramImpIdentityId == null ? identityId : (string)paramImpIdentityId.Value;

            using (var session = Store.OpenSession())
            {
                WorkflowProcessInstance inst = session.Load <WorkflowProcessInstance>(processInstance.ProcessId);
                if (inst != null)
                {
                    if (!string.IsNullOrEmpty(transition.To.State))
                    {
                        inst.StateName = transition.To.State;
                    }

                    inst.ActivityName     = transition.To.Name;
                    inst.PreviousActivity = transition.From.Name;

                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousState = transition.From.State;
                    }

                    if (transition.Classifier == TransitionClassifier.Direct)
                    {
                        inst.PreviousActivityForDirect = transition.From.Name;

                        if (!string.IsNullOrEmpty(transition.From.State))
                        {
                            inst.PreviousStateForDirect = transition.From.State;
                        }
                    }
                    else if (transition.Classifier == TransitionClassifier.Reverse)
                    {
                        inst.PreviousActivityForReverse = transition.From.Name;
                        if (!string.IsNullOrEmpty(transition.From.State))
                        {
                            inst.PreviousStateForReverse = transition.From.State;
                        }
                    }
                }

                var history = new WorkflowProcessTransitionHistory()
                {
                    ActorIdentityId    = impIdentityId,
                    ExecutorIdentityId = identityId,
                    Id                   = Guid.NewGuid(),
                    IsFinalised          = false,
                    ProcessId            = processInstance.ProcessId,
                    FromActivityName     = transition.From.Name,
                    FromStateName        = transition.From.State,
                    ToActivityName       = transition.To.Name,
                    ToStateName          = transition.To.State,
                    TransitionClassifier =
                        transition.Classifier.ToString(),
                    TransitionTime = _runtime.RuntimeDateTimeNow,
                    TriggerName    = string.IsNullOrEmpty(processInstance.ExecutedTimer) ? processInstance.CurrentCommand : processInstance.ExecutedTimer
                };

                session.Store(history);
                session.SaveChanges();
            }
        }
示例#8
0
        public void UpdatePersistenceState(ProcessInstance processInstance, TransitionDefinition transition)
        {
            var paramIdentityId    = processInstance.GetParameter(DefaultDefinitions.ParameterIdentityId.Name);
            var paramImpIdentityId = processInstance.GetParameter(DefaultDefinitions.ParameterImpersonatedIdentityId.Name);

            string identityId = paramIdentityId == null || paramIdentityId.Value == null
                ? string.Empty
                : paramIdentityId.Value.ToString();
            string impIdentityId = paramImpIdentityId == null || paramImpIdentityId.Value == null
                ? identityId
                : paramImpIdentityId.Value.ToString();

            using (var context = CreateContext())
            {
                WorkflowProcessInstance inst = context.WorkflowProcessInstances.FirstOrDefault(c => c.Id == processInstance.ProcessId);
                if (inst != null)
                {
                    if (!string.IsNullOrEmpty(transition.To.State))
                    {
                        inst.StateName = transition.To.State;
                    }

                    inst.ActivityName     = transition.To.Name;
                    inst.PreviousActivity = transition.From.Name;

                    if (!string.IsNullOrEmpty(transition.From.State))
                    {
                        inst.PreviousState = transition.From.State;
                    }

                    if (transition.Classifier == TransitionClassifier.Direct)
                    {
                        inst.PreviousActivityForDirect = transition.From.Name;

                        if (!string.IsNullOrEmpty(transition.From.State))
                        {
                            inst.PreviousStateForDirect = transition.From.State;
                        }
                    }
                    else if (transition.Classifier == TransitionClassifier.Reverse)
                    {
                        inst.PreviousActivityForReverse = transition.From.Name;
                        if (!string.IsNullOrEmpty(transition.From.State))
                        {
                            inst.PreviousStateForReverse = transition.From.State;
                        }
                    }

                    inst.ParentProcessId = processInstance.ParentProcessId;
                    inst.RootProcessId   = processInstance.RootProcessId;
                }

                var history = new WorkflowProcessTransitionHistory()
                {
                    ActorIdentityId    = impIdentityId,
                    ExecutorIdentityId = identityId,
                    Id          = Guid.NewGuid(),
                    IsFinalised = false,
                    //TODO Зачем на м финализед тут????
                    ProcessId            = processInstance.ProcessId,
                    FromActivityName     = transition.From.Name,
                    FromStateName        = transition.From.State,
                    ToActivityName       = transition.To.Name,
                    ToStateName          = transition.To.State,
                    TransitionClassifier =
                        transition.Classifier.ToString(),
                    TransitionTime = _runtime.RuntimeDateTimeNow,
                    TriggerName    = string.IsNullOrEmpty(processInstance.ExecutedTimer) ? processInstance.CurrentCommand : processInstance.ExecutedTimer
                };


                context.WorkflowProcessTransitionHistories.InsertOnSubmit(history);

                context.SubmitChanges();
            }
        }