示例#1
0
        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);
        }
示例#2
0
        /// <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;
            }
        }
示例#3
0
		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;
		}
示例#4
0
 public async Task ExecuteCommandAsync(Guid processId, string identityId, string impersonatedIdentityId, WorkflowCommand command)
 {
     await Task.Run(() => this.ExecuteCommand(processId, identityId, impersonatedIdentityId, command));
 }
示例#5
0
 public void ExecuteCommand(Guid processId, string identityId, string impersonatedIdentityId, WorkflowCommand command)
 {
     this.ExecuteCommand(command, identityId, impersonatedIdentityId);
 }
示例#6
0
        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);
                }
            }
        }