public static void DocumentCommandExecute(Guid processId, Guid identityId, Guid impersonatedIdentityId, WorkflowCommand command) { if (!Enabled) return; string subject = string.Format("@ObjectType №@ObjectNumber [@ObjectState] {0}", Localization.LocalizationProvider.Provider.Get("email:changedstate")); var identity = DynamicRepository.GetByEntity("SecurityUser", FilterCriteriaSet.And.Equal(identityId, "Id")).FirstOrDefault(); var comment = command.Parameters.Where(c=> c.ParameterName == "Comment").Select(c=>c.Value).FirstOrDefault(); string wfinfo = GenerateWfInfo(identity == null ? null : (string)identity.Name as string, command.LocalizedName, comment as string); SendNotification(processId, null, string.Format("[{0}] {1}", Settings.ApplicationName, subject), string.Format("<a href='@ObjectUrl'>{0}</a>.", subject), wfinfo, command.Classifier == Workflow.Core.Model.TransitionClassifier.Reverse ? NotificationTypeEnum.NotificationWorkflowMyDocBack : NotificationTypeEnum.NotificationWorkflowMyDocChangeState); }
/// <summary> /// 执行审批流程中的命令WorkflowCommand /// </summary> /// <param name="processId"></param> /// <param name="identityId">执行该命令的用户ID</param> /// <param name="impersonatedIdentityId">针对谁执行的,对方的用户ID,因为审批流程中的活动总是在两个或者多个人之间流转的 /// 如果一个人执行活动,并同时向多个人分发,怎么办,例如 会签的情况 /// </param> /// <param name="command"></param> public void ExecuteCommand(Guid processId, Guid identityId, Guid impersonatedIdentityId, WorkflowCommand command) { //TODO Workflow Temporary //if (!command.Validate()) // throw new CommandNotValidException(); var processInstance = Builder.GetProcessInstance(processId); SetProcessNewStatus(processInstance, ProcessStatus.Running); IEnumerable<TransitionDefinition> transitions; try { //根据当前的流程实例填写系统定义的流程参数及参数值,系统要统一维护该参数值, //以保证状态和流程的运转 PersistenceProvider.FillSystemProcessParameters(processInstance); if (processInstance.CurrentActivityName != command.ValidForActivityName) { throw new CommandNotValidForStateException(); } transitions = processInstance.ProcessScheme.GetCommandTransitionForActivity( processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName), command.CommandName); if (!transitions.Any()) { throw new InvalidOperationException(); } } catch (Exception ex) { SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } //命令需要的参数及参数值 var parametersLocal = new List<ParameterDefinitionWithValue>(); try { foreach (var commandParameter in command.Parameters) { //从processInstance获取命令需要的参数值 var parameterDefinition = processInstance.ProcessScheme.GetParameterDefinition(commandParameter.Name); if (parameterDefinition != null) parametersLocal.Add(ParameterDefinition.Create(parameterDefinition, commandParameter.Value)); } parametersLocal.Add(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentCommand, (object) command.CommandName)); parametersLocal.Add(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityId, identityId)); parametersLocal.Add(ParameterDefinition.Create(DefaultDefinitions.ParameterImpersonatedIdentityId, impersonatedIdentityId)); parametersLocal.Add(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId)); parametersLocal.ForEach(processInstance.AddParameter); //保存运行前的状态 PersistenceProvider.SavePersistenceParameters(processInstance); PersistenceProvider.FillPersistedProcessParameters(processInstance); } catch (Exception) { SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } var newExecutionParameters = new List<ExecutionRequestParameters>(); newExecutionParameters.AddRange( transitions.Select( at => ExecutionRequestParameters.Create(processInstance.ProcessId, processInstance.ProcessParameters, at))); try { Bus.QueueExecution(newExecutionParameters); } catch (Exception ex) { Logger.Log.Error(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), ex); SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } }
public static WorkflowCommand Create(Guid processId, TransitionDefinition transitionDefinition, ProcessDefinition processDefinition) { if (transitionDefinition.Trigger.Type != TriggerType.Command || transitionDefinition.Trigger.Command == null) { throw new InvalidOperationException(); } List<CommandParameter> commandParameters = new List<CommandParameter>(transitionDefinition.Trigger.Command.InputParameters.Count); commandParameters.AddRange( from p in transitionDefinition.Trigger.Command.InputParameters select new CommandParameter() { ParameterName = p.Name, TypeName = p.Parameter.Type.AssemblyQualifiedName, LocalizedName = processDefinition.GetLocalizedParameterName(p.Name, CultureInfo.CurrentCulture), Value = null }); WorkflowCommand workflowCommand = new WorkflowCommand() { CommandName = transitionDefinition.Trigger.Command.Name, LocalizedName = processDefinition.GetLocalizedCommandName(transitionDefinition.Trigger.Command.Name, CultureInfo.CurrentCulture), Parameters = commandParameters, ProcessId = processId, ValidForActivityName = transitionDefinition.From.Name, ValidForStateName = transitionDefinition.From.State, Classifier = transitionDefinition.Classifier }; return workflowCommand; }
public async Task ExecuteCommandAsync(Guid processId, string identityId, string impersonatedIdentityId, WorkflowCommand command) { await Task.Run(() => this.ExecuteCommand(processId, identityId, impersonatedIdentityId, command)); }
public void ExecuteCommand(Guid processId, string identityId, string impersonatedIdentityId, WorkflowCommand command) { this.ExecuteCommand(command, identityId, impersonatedIdentityId); }
public void ExecuteCommand(WorkflowCommand command, string identityId, string impersonatedIdentityId) { IEnumerable<TransitionDefinition> list; ProcessInstance processInstance = this.Builder.GetProcessInstance(command.ProcessId); this.SetProcessNewStatus(processInstance, ProcessStatus.Running); try { this.PersistenceProvider.FillSystemProcessParameters(processInstance); if (processInstance.CurrentActivityName != command.ValidForActivityName) { throw new InvalidOperationException(string.Format("Impossible to execute command {0} valid for activity {1}. Current activity {2}.", command.CommandName, command.ValidForActivityName, processInstance.CurrentActivityName)); } list = processInstance.ProcessScheme.GetCommandTransitionForActivity(processInstance.CurrentActivity, command.CommandName, ForkTransitionSearchType.Both).ToList<TransitionDefinition>(); if (!list.Any<TransitionDefinition>()) { throw new InvalidOperationException(); } } catch (Exception exception) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } try { foreach (CommandParameter parameter in command.Parameters) { ParameterDefinition parameterDefinition = processInstance.ProcessScheme.FindParameterDefinition(parameter.ParameterName); if (parameterDefinition == null) { continue; } processInstance.AddParameter(ParameterDefinition.Create(parameterDefinition, parameter.Value)); } processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentCommand, command.CommandName)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityId, identityId)); processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterImpersonatedIdentityId, impersonatedIdentityId)); this.PersistenceProvider.SavePersistenceParameters(processInstance); this.PersistenceProvider.FillPersistedProcessParameters(processInstance); } catch (Exception exception1) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw; } List<TransitionDefinition> transitionDefinitions = ( from t in list where t.IsFork select t).ToList<TransitionDefinition>(); List<TransitionDefinition> list1 = ( from t in list where !t.IsFork select t).ToList<TransitionDefinition>(); if (transitionDefinitions.Any<TransitionDefinition>()) { ActivityExecutor activityExecutor = new ActivityExecutor(this, false); try { List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>(); executionRequestParameters.AddRange( from at in transitionDefinitions select ExecutionRequestParameters.Create(processInstance, at)); executionRequestParameters.ForEach((ExecutionRequestParameters p) => p.Methods = new ActionDefinitionReference[0]); ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters); if (!this.PreExecuteProcessResponse(executionResponseParameter)) { TransitionDefinition transitionDefinition = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName); this.CreateSubprocesses(processInstance, new List<TransitionDefinition>() { transitionDefinition }, null); } if (!list1.Any<TransitionDefinition>()) { this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); } } catch (Exception exception3) { Exception exception2 = exception3; this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception2); } } if (list1.Any<TransitionDefinition>()) { try { processInstance.SetStartTransitionalProcessActivity(); List<ExecutionRequestParameters> executionRequestParameters1 = new List<ExecutionRequestParameters>(); executionRequestParameters1.AddRange( from at in list1 select ExecutionRequestParameters.Create(processInstance, at)); this.Bus.QueueExecution(executionRequestParameters1); } catch (Exception exception5) { Exception exception4 = exception5; this.SetProcessNewStatus(processInstance, ProcessStatus.Idled); throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception4); } } }