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); } }
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); }
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); }
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(); } }
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(); } }