private void FillParameters(ProcessInstance instance, ExecutionResponseParametersComplete newParameters) { foreach (var parameter in newParameters.ParameterContainer) { var parameterDefinition = instance.ProcessScheme.GetNullableParameterDefinition(parameter.Name); if (parameterDefinition != null) { var parameterDefinitionWithValue = ParameterDefinition.Create(parameterDefinition, parameter.Value); instance.AddParameter(parameterDefinitionWithValue); } } }
private List<ExecutionRequestParameters> FillExecutionRequestParameters(Guid processId, ProcessInstance processInstance, List<TransitionDefinition> transitions, WorkflowRuntime.PreExecutionContext preExecutionContext, List<TransitionDefinition> transitionsForAdditional = null) { List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>(); if (transitions == null || transitions.Count == 0) { return executionRequestParameters; } List<string> strs = new List<string>(); List<string> strs1 = new List<string>(); foreach (TransitionDefinition transition in transitions) { bool flag = false; ExecutionRequestParameters executionRequestParameter = ExecutionRequestParameters.Create(processInstance, transition, true); if (transition.Trigger.Type != TriggerType.Auto || transition.Restrictions.Any<RestrictionDefinition>()) { preExecutionContext.TransitionForActors = transition; flag = true; } if (transition.To.HavePreExecutionImplementation && preExecutionContext.HaveTransitionForActors) { IEnumerable<string> actors = this.GetActors(processInstance, preExecutionContext.TransitionForActors); strs.AddRange(actors); if (flag) { strs1.AddRange(actors); } } if (transition.Trigger.Type == TriggerType.Command) { processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentCommand, transition.Trigger.Command.Name)); } executionRequestParameters.Add(executionRequestParameter); } if (transitionsForAdditional != null) { foreach (TransitionDefinition transitionDefinition in transitionsForAdditional) { if (!transitionDefinition.Restrictions.Any<RestrictionDefinition>()) { continue; } strs1.AddRange(this.GetActors(processInstance, transitionDefinition)); } } processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityIds, strs)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityIdsForCurrentActivity, strs1)); return executionRequestParameters; }
/// <summary> /// 执行流程起始节点出的初始化活动 /// </summary> /// <param name="processInstance"></param> private void ExecuteRootActivity(ProcessInstance processInstance) { PersistenceProvider.FillProcessParameters(processInstance); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId)); //TODO Убрать после обработки команд try { Bus.QueueExecution(ExecutionRequestParameters.Create(processInstance.ProcessId, processInstance.ProcessParameters, processInstance.ProcessScheme.InitialActivity, ConditionDefinition.Always)); } catch (Exception ex) { Logger.Log.Error(string.Format("Error Execute Root Workflow Id={0}", processInstance.ProcessId),ex); SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } }
private void PreExecute(Guid processId, string fromActivityName, bool ignoreCurrentStateCheck, ProcessInstance processInstance) { this.PersistenceProvider.FillPersistedProcessParameters(processInstance); ActivityDefinition activityDefinition = processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName); ActivityDefinition to = processInstance.ProcessScheme.FindActivity(fromActivityName); if (!ignoreCurrentStateCheck && activityDefinition.State != to.State) { return; } ActivityExecutor activityExecutor = new ActivityExecutor(this, true); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterProcessId, processId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIsPreExecution, true)); WorkflowRuntime.PreExecutionContext preExecutionContext = new WorkflowRuntime.PreExecutionContext(); do { if (!string.IsNullOrEmpty(to.State)) { processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentState, to.State)); } IEnumerable<TransitionDefinition> transitionDefinitions = processInstance.ProcessScheme.GetPossibleTransitionsForActivity(to, ForkTransitionSearchType.NotFork).Where<TransitionDefinition>((TransitionDefinition t) => { if (t.Classifier != TransitionClassifier.Direct) { return false; } return t.Trigger.Type != TriggerType.Timer; }); to = null; List<TransitionDefinition> list = ( from t in transitionDefinitions where t.Trigger.Type == TriggerType.Auto select t).ToList<TransitionDefinition>(); List<TransitionDefinition> list1 = ( from t in transitionDefinitions where t.Trigger.Type == TriggerType.Command select t).ToList<TransitionDefinition>(); List<ExecutionRequestParameters> executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list, preExecutionContext, list1); if (executionRequestParameters.Count > 0) { ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters); if (!this.PreExecuteProcessResponse(executionResponseParameter)) { to = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName).To; } } if (to != null) { continue; } if (list1.Count<TransitionDefinition>((TransitionDefinition t) => { if (!t.IsAlwaysTransition) { return false; } return !t.Conditions.First<ConditionDefinition>().ResultOnPreExecution.HasValue; }) >= 2) { continue; } executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list1, preExecutionContext, null); if (executionRequestParameters.Count <= 0) { continue; } ExecutionResponseParameters executionResponseParameter1 = activityExecutor.Execute(executionRequestParameters); if (this.PreExecuteProcessResponse(executionResponseParameter1)) { continue; } to = processInstance.ProcessScheme.FindTransition(executionResponseParameter1.ExecutedTransitionName).To; } while (to != null && !to.IsFinal); }